From e0efc466d5a850997a44e44683de5e9672935270 Mon Sep 17 00:00:00 2001 From: jariy17 Date: Tue, 22 Sep 2026 20:16:07 +0000 Subject: [PATCH 1/2] fix(clients): expose WaitConfig and accept region_name aliases --- .../examples/agent_runtime_client_examples.md | 19 ++++++++++ src/bedrock_agentcore/evaluation/__init__.py | 2 + .../runner/batch/batch_evaluation_runner.py | 5 ++- src/bedrock_agentcore/gateway/__init__.py | 4 +- .../knowledge_base/__init__.py | 4 +- src/bedrock_agentcore/policy/__init__.py | 4 +- src/bedrock_agentcore/runtime/__init__.py | 3 ++ .../runtime/agent_core_runtime_client.py | 6 ++- .../batch/test_batch_evaluation_runner.py | 31 ++++++++++++++++ .../test_wait_config_exports.py | 17 +++++++++ .../runtime/test_agent_core_runtime_client.py | 37 +++++++++++++++++++ 11 files changed, 126 insertions(+), 6 deletions(-) create mode 100644 tests/bedrock_agentcore/test_wait_config_exports.py diff --git a/docs/examples/agent_runtime_client_examples.md b/docs/examples/agent_runtime_client_examples.md index 6ab3ed77..ff3a29ba 100644 --- a/docs/examples/agent_runtime_client_examples.md +++ b/docs/examples/agent_runtime_client_examples.md @@ -4,6 +4,25 @@ This document provides practical examples for using the `AgentCoreRuntimeClient` ## Basic Usage +`AgentCoreRuntimeClient` accepts either `region` or `region_name`. If both are +provided, `region` takes precedence. You can also import `WaitConfig` alongside +the client to configure polling: + +```python +from bedrock_agentcore.runtime import AgentCoreRuntimeClient, WaitConfig + +client = AgentCoreRuntimeClient(region_name="us-west-2") +wait_config = WaitConfig(max_wait=900, poll_interval=10) +``` + +Pass `wait_config=wait_config` to `create_agent_runtime_and_wait` or +`update_agent_runtime_and_wait` alongside the runtime's configuration. + +`WaitConfig` is also available from `bedrock_agentcore.evaluation`, +`bedrock_agentcore.gateway`, `bedrock_agentcore.knowledge_base`, and +`bedrock_agentcore.policy`. `BatchEvaluationRunner` likewise accepts +`region_name`, with the same precedence as the runtime client. + ### Backend Service (SigV4 Headers) ```python diff --git a/src/bedrock_agentcore/evaluation/__init__.py b/src/bedrock_agentcore/evaluation/__init__.py index fece1a1a..d1575044 100644 --- a/src/bedrock_agentcore/evaluation/__init__.py +++ b/src/bedrock_agentcore/evaluation/__init__.py @@ -1,5 +1,6 @@ """AgentCore Evaluation: EvaluationClient, OnDemandEvaluationDatasetRunner, and Strands integration.""" +from bedrock_agentcore._utils.config import WaitConfig from bedrock_agentcore.evaluation.client import EvaluationClient, ReferenceInputs from bedrock_agentcore.evaluation.custom_code_based_evaluators import ( EvaluatorInput, @@ -65,6 +66,7 @@ ) __all__ = [ + "WaitConfig", "ActorProfile", "AgentInvokerFn", "BatchEvaluationRunner", diff --git a/src/bedrock_agentcore/evaluation/runner/batch/batch_evaluation_runner.py b/src/bedrock_agentcore/evaluation/runner/batch/batch_evaluation_runner.py index 0f5d8e1f..5008b08a 100644 --- a/src/bedrock_agentcore/evaluation/runner/batch/batch_evaluation_runner.py +++ b/src/bedrock_agentcore/evaluation/runner/batch/batch_evaluation_runner.py @@ -63,14 +63,15 @@ class BatchEvaluationRunner: SimulatedScenario: SimulatedScenarioExecutor, } - def __init__(self, region: Optional[str] = None): + def __init__(self, region: Optional[str] = None, region_name: Optional[str] = None): """Initialize the batch evaluation runner. Args: region: AWS region. Defaults to boto3 session region or DEFAULT_REGION. + region_name: Alias for region. If both are provided, region takes precedence. """ session = boto3.Session() - self.region = region or session.region_name or DEFAULT_REGION + self.region = region or region_name or session.region_name or DEFAULT_REGION self.data_plane_client = session.client( "bedrock-agentcore", region_name=self.region, diff --git a/src/bedrock_agentcore/gateway/__init__.py b/src/bedrock_agentcore/gateway/__init__.py index 82fe9706..0f5e9609 100644 --- a/src/bedrock_agentcore/gateway/__init__.py +++ b/src/bedrock_agentcore/gateway/__init__.py @@ -1,5 +1,7 @@ """Bedrock AgentCore Gateway client.""" +from bedrock_agentcore._utils.config import WaitConfig + from .client import GatewayClient -__all__ = ["GatewayClient"] +__all__ = ["WaitConfig", "GatewayClient"] diff --git a/src/bedrock_agentcore/knowledge_base/__init__.py b/src/bedrock_agentcore/knowledge_base/__init__.py index c75c48c7..7f0d8d16 100644 --- a/src/bedrock_agentcore/knowledge_base/__init__.py +++ b/src/bedrock_agentcore/knowledge_base/__init__.py @@ -1,5 +1,7 @@ """Bedrock AgentCore Knowledge Base client.""" +from bedrock_agentcore._utils.config import WaitConfig + from .client import KnowledgeBaseClient -__all__ = ["KnowledgeBaseClient"] +__all__ = ["WaitConfig", "KnowledgeBaseClient"] diff --git a/src/bedrock_agentcore/policy/__init__.py b/src/bedrock_agentcore/policy/__init__.py index 2cc24518..f28c463c 100644 --- a/src/bedrock_agentcore/policy/__init__.py +++ b/src/bedrock_agentcore/policy/__init__.py @@ -1,5 +1,7 @@ """Bedrock AgentCore Policy Engine client.""" +from bedrock_agentcore._utils.config import WaitConfig + from .client import PolicyEngineClient -__all__ = ["PolicyEngineClient"] +__all__ = ["WaitConfig", "PolicyEngineClient"] diff --git a/src/bedrock_agentcore/runtime/__init__.py b/src/bedrock_agentcore/runtime/__init__.py index 2e4da51f..a40d6d1a 100644 --- a/src/bedrock_agentcore/runtime/__init__.py +++ b/src/bedrock_agentcore/runtime/__init__.py @@ -6,6 +6,8 @@ - BedrockAgentCoreContext: Agent identity context """ +from bedrock_agentcore._utils.config import WaitConfig + from .agent_core_runtime_client import AgentCoreRuntimeClient from .app import BedrockAgentCoreApp from .context import BedrockAgentCoreContext, RequestContext @@ -22,6 +24,7 @@ ) __all__ = [ + "WaitConfig", "AgentCoreRuntimeClient", "AGUIApp", "AuthMode", diff --git a/src/bedrock_agentcore/runtime/agent_core_runtime_client.py b/src/bedrock_agentcore/runtime/agent_core_runtime_client.py index 63a00051..c58e7027 100644 --- a/src/bedrock_agentcore/runtime/agent_core_runtime_client.py +++ b/src/bedrock_agentcore/runtime/agent_core_runtime_client.py @@ -74,6 +74,7 @@ def __init__( region: Optional[str] = None, session: Optional[boto3.Session] = None, integration_source: Optional[str] = None, + region_name: Optional[str] = None, ) -> None: """Initialize an AgentCoreRuntime client for the specified AWS region. @@ -84,8 +85,11 @@ def __init__( default session is created. integration_source: Optional integration source for user-agent telemetry. + region_name: Alias for region. If both are provided, region takes precedence. """ - self.region = validate_region(region or (session.region_name if session else None) or "us-west-2") + self.region = validate_region( + region or region_name or (session.region_name if session else None) or "us-west-2" + ) self.session = session if session else boto3.Session(region_name=self.region) self.integration_source = integration_source self.logger = logging.getLogger(__name__) diff --git a/tests/bedrock_agentcore/evaluation/runner/batch/test_batch_evaluation_runner.py b/tests/bedrock_agentcore/evaluation/runner/batch/test_batch_evaluation_runner.py index 63f16c49..28680e74 100644 --- a/tests/bedrock_agentcore/evaluation/runner/batch/test_batch_evaluation_runner.py +++ b/tests/bedrock_agentcore/evaluation/runner/batch/test_batch_evaluation_runner.py @@ -29,6 +29,37 @@ # Fixtures # --------------------------------------------------------------------------- + +class TestRegionName: + @pytest.mark.parametrize( + "kwargs,session_region,expected", + [ + ({"region_name": "eu-west-1"}, "us-east-1", "eu-west-1"), + ({"region": "us-west-2"}, "us-east-1", "us-west-2"), + ({"region": "us-west-2", "region_name": "eu-west-1"}, "us-east-1", "us-west-2"), + ({"region": "", "region_name": "eu-west-1"}, "us-east-1", "eu-west-1"), + ({}, "us-east-1", "us-east-1"), + ({}, None, "us-west-2"), + ], + ) + def test_region_precedence(self, kwargs, session_region, expected): + with patch( + "bedrock_agentcore.evaluation.runner.batch.batch_evaluation_runner.boto3.Session" + ) as session_factory: + session = session_factory.return_value + session.region_name = session_region + runner = BatchEvaluationRunner(**kwargs) + assert runner.region == expected + assert len(session.client.call_args_list) == 2 + for call in session.client.call_args_list: + assert call.kwargs["region_name"] == expected + + def test_existing_positional_region(self): + with patch("bedrock_agentcore.evaluation.runner.batch.batch_evaluation_runner.boto3.Session"): + runner = BatchEvaluationRunner("eu-west-1") + assert runner.region == "eu-west-1" + + _T0 = datetime(2024, 1, 1, 0, 0, 0, tzinfo=timezone.utc) _T1 = datetime(2024, 1, 1, 0, 1, 0, tzinfo=timezone.utc) diff --git a/tests/bedrock_agentcore/test_wait_config_exports.py b/tests/bedrock_agentcore/test_wait_config_exports.py new file mode 100644 index 00000000..b74fd6d7 --- /dev/null +++ b/tests/bedrock_agentcore/test_wait_config_exports.py @@ -0,0 +1,17 @@ +"""Public imports for the configuration accepted by polling clients.""" + +from importlib import import_module + +import pytest + +from bedrock_agentcore._utils.config import WaitConfig + + +@pytest.mark.parametrize("package", ["runtime", "evaluation", "gateway", "knowledge_base", "policy"]) +def test_wait_config_public_export(package): + module = import_module(f"bedrock_agentcore.{package}") + assert "WaitConfig" in module.__all__ + assert module.WaitConfig is WaitConfig + config = module.WaitConfig(max_wait=900, poll_interval=5) + assert config.max_wait == 900 + assert config.poll_interval == 5 diff --git a/tests/unit/runtime/test_agent_core_runtime_client.py b/tests/unit/runtime/test_agent_core_runtime_client.py index 59d4b37b..1e96df70 100644 --- a/tests/unit/runtime/test_agent_core_runtime_client.py +++ b/tests/unit/runtime/test_agent_core_runtime_client.py @@ -11,6 +11,43 @@ class TestAgentCoreRuntimeClientInit: """Tests for AgentCoreRuntimeClient initialization.""" + @pytest.mark.parametrize( + "kwargs,session_region,expected", + [ + ({"region_name": "eu-west-1"}, "us-east-1", "eu-west-1"), + ({"region": "us-west-2"}, "us-east-1", "us-west-2"), + ({"region": "us-west-2", "region_name": "eu-west-1"}, "us-east-1", "us-west-2"), + ({"region": "", "region_name": "eu-west-1"}, "us-east-1", "eu-west-1"), + ({}, "us-east-1", "us-east-1"), + ({}, None, "us-west-2"), + ], + ) + def test_region_precedence(self, kwargs, session_region, expected): + session = Mock(region_name=session_region) + client = AgentCoreRuntimeClient(session=session, **kwargs) + assert client.region == expected + assert client.session is session + assert len(session.client.call_args_list) == 2 + for call in session.client.call_args_list: + assert call.kwargs["region_name"] == expected + + @patch("bedrock_agentcore.runtime.agent_core_runtime_client.boto3.Session") + def test_region_name_without_session(self, session_factory): + client = AgentCoreRuntimeClient(region_name="eu-west-1") + assert client.region == "eu-west-1" + session_factory.assert_called_once_with(region_name="eu-west-1") + + def test_existing_positional_arguments(self): + session = Mock(region_name="us-east-1") + client = AgentCoreRuntimeClient("eu-west-1", session, "test-integration") + assert client.region == "eu-west-1" + assert client.session is session + assert client.integration_source == "test-integration" + + def test_region_name_is_validated(self): + with pytest.raises(ValueError): + AgentCoreRuntimeClient(region_name="not-a-region", session=Mock()) + def test_init_stores_region(self): """Test that initialization stores the region.""" client = AgentCoreRuntimeClient(region="us-west-2") From 52b699864022eaaea3f4a47f3f4635ee1ef616fb Mon Sep 17 00:00:00 2001 From: jariy17 Date: Tue, 22 Sep 2026 20:27:05 +0000 Subject: [PATCH 2/2] test: remove WaitConfig export and runtime alias tests --- .../test_wait_config_exports.py | 17 --------- .../runtime/test_agent_core_runtime_client.py | 37 ------------------- 2 files changed, 54 deletions(-) delete mode 100644 tests/bedrock_agentcore/test_wait_config_exports.py diff --git a/tests/bedrock_agentcore/test_wait_config_exports.py b/tests/bedrock_agentcore/test_wait_config_exports.py deleted file mode 100644 index b74fd6d7..00000000 --- a/tests/bedrock_agentcore/test_wait_config_exports.py +++ /dev/null @@ -1,17 +0,0 @@ -"""Public imports for the configuration accepted by polling clients.""" - -from importlib import import_module - -import pytest - -from bedrock_agentcore._utils.config import WaitConfig - - -@pytest.mark.parametrize("package", ["runtime", "evaluation", "gateway", "knowledge_base", "policy"]) -def test_wait_config_public_export(package): - module = import_module(f"bedrock_agentcore.{package}") - assert "WaitConfig" in module.__all__ - assert module.WaitConfig is WaitConfig - config = module.WaitConfig(max_wait=900, poll_interval=5) - assert config.max_wait == 900 - assert config.poll_interval == 5 diff --git a/tests/unit/runtime/test_agent_core_runtime_client.py b/tests/unit/runtime/test_agent_core_runtime_client.py index 1e96df70..59d4b37b 100644 --- a/tests/unit/runtime/test_agent_core_runtime_client.py +++ b/tests/unit/runtime/test_agent_core_runtime_client.py @@ -11,43 +11,6 @@ class TestAgentCoreRuntimeClientInit: """Tests for AgentCoreRuntimeClient initialization.""" - @pytest.mark.parametrize( - "kwargs,session_region,expected", - [ - ({"region_name": "eu-west-1"}, "us-east-1", "eu-west-1"), - ({"region": "us-west-2"}, "us-east-1", "us-west-2"), - ({"region": "us-west-2", "region_name": "eu-west-1"}, "us-east-1", "us-west-2"), - ({"region": "", "region_name": "eu-west-1"}, "us-east-1", "eu-west-1"), - ({}, "us-east-1", "us-east-1"), - ({}, None, "us-west-2"), - ], - ) - def test_region_precedence(self, kwargs, session_region, expected): - session = Mock(region_name=session_region) - client = AgentCoreRuntimeClient(session=session, **kwargs) - assert client.region == expected - assert client.session is session - assert len(session.client.call_args_list) == 2 - for call in session.client.call_args_list: - assert call.kwargs["region_name"] == expected - - @patch("bedrock_agentcore.runtime.agent_core_runtime_client.boto3.Session") - def test_region_name_without_session(self, session_factory): - client = AgentCoreRuntimeClient(region_name="eu-west-1") - assert client.region == "eu-west-1" - session_factory.assert_called_once_with(region_name="eu-west-1") - - def test_existing_positional_arguments(self): - session = Mock(region_name="us-east-1") - client = AgentCoreRuntimeClient("eu-west-1", session, "test-integration") - assert client.region == "eu-west-1" - assert client.session is session - assert client.integration_source == "test-integration" - - def test_region_name_is_validated(self): - with pytest.raises(ValueError): - AgentCoreRuntimeClient(region_name="not-a-region", session=Mock()) - def test_init_stores_region(self): """Test that initialization stores the region.""" client = AgentCoreRuntimeClient(region="us-west-2")