From 57cb9e5bdb552e42d27a6aacb5a1283c74cc3265 Mon Sep 17 00:00:00 2001 From: dom Date: Sun, 20 Jul 2025 13:23:38 -0400 Subject: [PATCH 1/4] Add VPC endpoint support to BedrockModel class - Add optional endpoint_url parameter to BedrockModel constructor - Pass endpoint_url to boto3 client for VPC endpoint connectivity - Maintains backward compatibility with existing code Resolves: Issue #496 --- src/strands/models/bedrock.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/strands/models/bedrock.py b/src/strands/models/bedrock.py index 0fe332a47..b04e0faa6 100644 --- a/src/strands/models/bedrock.py +++ b/src/strands/models/bedrock.py @@ -75,6 +75,7 @@ class BedrockConfig(TypedDict, total=False): streaming: Flag to enable/disable streaming. Defaults to True. temperature: Controls randomness in generation (higher = more random) top_p: Controls diversity via nucleus sampling (alternative to temperature) + endpoint_url: Custom endpoint URL for VPC endpoints (PrivateLink) """ additional_args: Optional[dict[str, Any]] @@ -96,6 +97,7 @@ class BedrockConfig(TypedDict, total=False): streaming: Optional[bool] temperature: Optional[float] top_p: Optional[float] + endpoint_url: Optional[str] #Adding Endpoint URL def __init__( self, @@ -113,6 +115,7 @@ def __init__( region_name: AWS region to use for the Bedrock service. Defaults to the AWS_REGION environment variable if set, or "us-west-2" if not set. **model_config: Configuration options for the Bedrock model. + Use endpoint_url for VPC endpoint connectivity. """ if region_name and boto_session: raise ValueError("Cannot specify both `region_name` and `boto_session`.") @@ -143,6 +146,7 @@ def __init__( self.client = session.client( service_name="bedrock-runtime", config=client_config, + endpoint_url=self.config.get("endpoint_url"), region_name=resolved_region, ) From ce9d15ddad8ade6ea0a1c9943371438610577793 Mon Sep 17 00:00:00 2001 From: Dean Schmigelski Date: Thu, 28 Aug 2025 12:54:12 -0400 Subject: [PATCH 2/4] feat(models): expose endpoint_url on BedrockModel constructor --- src/strands/models/bedrock.py | 6 +++--- tests/strands/models/test_bedrock.py | 23 +++++++++++++++-------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/strands/models/bedrock.py b/src/strands/models/bedrock.py index b04e0faa6..7346feeca 100644 --- a/src/strands/models/bedrock.py +++ b/src/strands/models/bedrock.py @@ -75,7 +75,6 @@ class BedrockConfig(TypedDict, total=False): streaming: Flag to enable/disable streaming. Defaults to True. temperature: Controls randomness in generation (higher = more random) top_p: Controls diversity via nucleus sampling (alternative to temperature) - endpoint_url: Custom endpoint URL for VPC endpoints (PrivateLink) """ additional_args: Optional[dict[str, Any]] @@ -97,7 +96,6 @@ class BedrockConfig(TypedDict, total=False): streaming: Optional[bool] temperature: Optional[float] top_p: Optional[float] - endpoint_url: Optional[str] #Adding Endpoint URL def __init__( self, @@ -105,6 +103,7 @@ def __init__( boto_session: Optional[boto3.Session] = None, boto_client_config: Optional[BotocoreConfig] = None, region_name: Optional[str] = None, + endpoint_url: Optional[str] = None, **model_config: Unpack[BedrockConfig], ): """Initialize provider instance. @@ -114,6 +113,7 @@ def __init__( boto_client_config: Configuration to use when creating the Bedrock-Runtime Boto Client. region_name: AWS region to use for the Bedrock service. Defaults to the AWS_REGION environment variable if set, or "us-west-2" if not set. + endpoint_url: Custom endpoint URL for VPC endpoints (PrivateLink) **model_config: Configuration options for the Bedrock model. Use endpoint_url for VPC endpoint connectivity. """ @@ -146,7 +146,7 @@ def __init__( self.client = session.client( service_name="bedrock-runtime", config=client_config, - endpoint_url=self.config.get("endpoint_url"), + endpoint_url=endpoint_url, region_name=resolved_region, ) diff --git a/tests/strands/models/test_bedrock.py b/tests/strands/models/test_bedrock.py index 09e508845..5fa639a7a 100644 --- a/tests/strands/models/test_bedrock.py +++ b/tests/strands/models/test_bedrock.py @@ -129,7 +129,7 @@ def test__init__with_default_region(session_cls, mock_client_method): with unittest.mock.patch.object(os, "environ", {}): BedrockModel() session_cls.return_value.client.assert_called_with( - region_name=DEFAULT_BEDROCK_REGION, config=ANY, service_name=ANY + region_name=DEFAULT_BEDROCK_REGION, config=ANY, service_name=ANY, endpoint_url=None ) @@ -139,14 +139,14 @@ def test__init__with_session_region(session_cls, mock_client_method): BedrockModel() - mock_client_method.assert_called_with(region_name="eu-blah-1", config=ANY, service_name=ANY) + mock_client_method.assert_called_with(region_name="eu-blah-1", config=ANY, service_name=ANY, endpoint_url=None) def test__init__with_custom_region(mock_client_method): """Test that BedrockModel uses the provided region.""" custom_region = "us-east-1" BedrockModel(region_name=custom_region) - mock_client_method.assert_called_with(region_name=custom_region, config=ANY, service_name=ANY) + mock_client_method.assert_called_with(region_name=custom_region, config=ANY, service_name=ANY, endpoint_url=None) def test__init__with_default_environment_variable_region(mock_client_method): @@ -154,7 +154,7 @@ def test__init__with_default_environment_variable_region(mock_client_method): with unittest.mock.patch.object(os, "environ", {"AWS_REGION": "eu-west-2"}): BedrockModel() - mock_client_method.assert_called_with(region_name="eu-west-2", config=ANY, service_name=ANY) + mock_client_method.assert_called_with(region_name="eu-west-2", config=ANY, service_name=ANY, endpoint_url=None) def test__init__region_precedence(mock_client_method, session_cls): @@ -164,21 +164,28 @@ def test__init__region_precedence(mock_client_method, session_cls): # specifying a region always wins out BedrockModel(region_name="us-specified-1") - mock_client_method.assert_called_with(region_name="us-specified-1", config=ANY, service_name=ANY) + mock_client_method.assert_called_with(region_name="us-specified-1", config=ANY, service_name=ANY, endpoint_url=None) # other-wise uses the session's BedrockModel() - mock_client_method.assert_called_with(region_name="us-session-1", config=ANY, service_name=ANY) + mock_client_method.assert_called_with(region_name="us-session-1", config=ANY, service_name=ANY, endpoint_url=None) # environment variable next session_cls.return_value.region_name = None BedrockModel() - mock_client_method.assert_called_with(region_name="us-environment-1", config=ANY, service_name=ANY) + mock_client_method.assert_called_with(region_name="us-environment-1", config=ANY, service_name=ANY, endpoint_url=None) mock_os_environ.pop("AWS_REGION") session_cls.return_value.region_name = None # No session region BedrockModel() - mock_client_method.assert_called_with(region_name=DEFAULT_BEDROCK_REGION, config=ANY, service_name=ANY) + mock_client_method.assert_called_with(region_name=DEFAULT_BEDROCK_REGION, config=ANY, service_name=ANY, endpoint_url=None) + + +def test__init__with_endpoint_url(mock_client_method): + """Test that BedrockModel uses the provided endpoint_url for VPC endpoints.""" + custom_endpoint = "https://vpce-12345-abcde.bedrock-runtime.us-west-2.vpce.amazonaws.com" + BedrockModel(endpoint_url=custom_endpoint) + mock_client_method.assert_called_with(region_name=DEFAULT_BEDROCK_REGION, config=ANY, service_name=ANY, endpoint_url=custom_endpoint) def test__init__with_region_and_session_raises_value_error(): From 4376f93316f25287e47ad3574e50f58d14e03d13 Mon Sep 17 00:00:00 2001 From: Dean Schmigelski Date: Thu, 28 Aug 2025 13:25:01 -0400 Subject: [PATCH 3/4] fix: remove added comment --- src/strands/models/bedrock.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/strands/models/bedrock.py b/src/strands/models/bedrock.py index 7346feeca..c44717041 100644 --- a/src/strands/models/bedrock.py +++ b/src/strands/models/bedrock.py @@ -115,7 +115,6 @@ def __init__( Defaults to the AWS_REGION environment variable if set, or "us-west-2" if not set. endpoint_url: Custom endpoint URL for VPC endpoints (PrivateLink) **model_config: Configuration options for the Bedrock model. - Use endpoint_url for VPC endpoint connectivity. """ if region_name and boto_session: raise ValueError("Cannot specify both `region_name` and `boto_session`.") From 5a17c4a13e6de0c5fecb07718256a9c17dc2ced5 Mon Sep 17 00:00:00 2001 From: Dean Schmigelski Date: Thu, 28 Aug 2025 13:27:29 -0400 Subject: [PATCH 4/4] fix: linting --- tests/strands/models/test_bedrock.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/tests/strands/models/test_bedrock.py b/tests/strands/models/test_bedrock.py index 5fa639a7a..f1a2250e4 100644 --- a/tests/strands/models/test_bedrock.py +++ b/tests/strands/models/test_bedrock.py @@ -164,28 +164,38 @@ def test__init__region_precedence(mock_client_method, session_cls): # specifying a region always wins out BedrockModel(region_name="us-specified-1") - mock_client_method.assert_called_with(region_name="us-specified-1", config=ANY, service_name=ANY, endpoint_url=None) + mock_client_method.assert_called_with( + region_name="us-specified-1", config=ANY, service_name=ANY, endpoint_url=None + ) # other-wise uses the session's BedrockModel() - mock_client_method.assert_called_with(region_name="us-session-1", config=ANY, service_name=ANY, endpoint_url=None) + mock_client_method.assert_called_with( + region_name="us-session-1", config=ANY, service_name=ANY, endpoint_url=None + ) # environment variable next session_cls.return_value.region_name = None BedrockModel() - mock_client_method.assert_called_with(region_name="us-environment-1", config=ANY, service_name=ANY, endpoint_url=None) + mock_client_method.assert_called_with( + region_name="us-environment-1", config=ANY, service_name=ANY, endpoint_url=None + ) mock_os_environ.pop("AWS_REGION") session_cls.return_value.region_name = None # No session region BedrockModel() - mock_client_method.assert_called_with(region_name=DEFAULT_BEDROCK_REGION, config=ANY, service_name=ANY, endpoint_url=None) + mock_client_method.assert_called_with( + region_name=DEFAULT_BEDROCK_REGION, config=ANY, service_name=ANY, endpoint_url=None + ) def test__init__with_endpoint_url(mock_client_method): """Test that BedrockModel uses the provided endpoint_url for VPC endpoints.""" custom_endpoint = "https://vpce-12345-abcde.bedrock-runtime.us-west-2.vpce.amazonaws.com" BedrockModel(endpoint_url=custom_endpoint) - mock_client_method.assert_called_with(region_name=DEFAULT_BEDROCK_REGION, config=ANY, service_name=ANY, endpoint_url=custom_endpoint) + mock_client_method.assert_called_with( + region_name=DEFAULT_BEDROCK_REGION, config=ANY, service_name=ANY, endpoint_url=custom_endpoint + ) def test__init__with_region_and_session_raises_value_error():