diff --git a/ddtrace/contrib/internal/botocore/services/bedrock.py b/ddtrace/contrib/internal/botocore/services/bedrock.py index fca33630f57..df547e8f095 100644 --- a/ddtrace/contrib/internal/botocore/services/bedrock.py +++ b/ddtrace/contrib/internal/botocore/services/bedrock.py @@ -318,7 +318,11 @@ def handle_bedrock_response( def patched_bedrock_api_call(original_func, instance, args, kwargs, function_vars): params = function_vars.get("params") pin = function_vars.get("pin") - model_provider, model_name = params.get("modelId").split(".") + model_meta = params.get("modelId").split(".") + if len(model_meta) == 2: + model_provider, model_name = model_meta + else: + _, model_provider, model_name = model_meta # cross-region inference integration = function_vars.get("integration") submit_to_llmobs = integration.llmobs_enabled and "embed" not in model_name with core.context_with_data( diff --git a/releasenotes/notes/botocore-bedrock-cross-region-inference-model-fix-179b7f1ddd6e8e02.yaml b/releasenotes/notes/botocore-bedrock-cross-region-inference-model-fix-179b7f1ddd6e8e02.yaml new file mode 100644 index 00000000000..be6f6d0dc27 --- /dev/null +++ b/releasenotes/notes/botocore-bedrock-cross-region-inference-model-fix-179b7f1ddd6e8e02.yaml @@ -0,0 +1,4 @@ +--- +fixes: + - | + botocore: fixes bedrock model and model provider interpretation from ``modelId`` when using cross-region inference. diff --git a/tests/contrib/botocore/bedrock_cassettes/anthropic_message_invoke.yaml b/tests/contrib/botocore/bedrock_cassettes/anthropic_message_invoke.yaml index a4abf1ac291..dfc0235d6cf 100644 --- a/tests/contrib/botocore/bedrock_cassettes/anthropic_message_invoke.yaml +++ b/tests/contrib/botocore/bedrock_cassettes/anthropic_message_invoke.yaml @@ -21,7 +21,7 @@ interactions: - !!binary | YXR0ZW1wdD0x method: POST - uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-3-sonnet-20240229-v1%3A0/invoke + uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/us.anthropic.claude-3-sonnet-20240229-v1%3A0/invoke response: body: string: '{"id":"msg_01E6sPP1ksqicYCaBrkvzna8","type":"message","role":"assistant","content":[{"type":"text","text":"Hobbits diff --git a/tests/contrib/botocore/test_bedrock.py b/tests/contrib/botocore/test_bedrock.py index 90c7669cba5..3c91b147a97 100644 --- a/tests/contrib/botocore/test_bedrock.py +++ b/tests/contrib/botocore/test_bedrock.py @@ -173,6 +173,7 @@ def test_anthropic_invoke(bedrock_client, request_vcr): @pytest.mark.snapshot def test_anthropic_message_invoke(bedrock_client, request_vcr): body, model = json.dumps(_REQUEST_BODIES["anthropic_message"]), _MODELS["anthropic_message"] + model = "us." + model with request_vcr.use_cassette("anthropic_message_invoke.yaml"): response = bedrock_client.invoke_model(body=body, modelId=model) json.loads(response.get("body").read()) diff --git a/tests/contrib/botocore/test_bedrock_llmobs.py b/tests/contrib/botocore/test_bedrock_llmobs.py index ae2fb7894c6..b7e80651f35 100644 --- a/tests/contrib/botocore/test_bedrock_llmobs.py +++ b/tests/contrib/botocore/test_bedrock_llmobs.py @@ -128,6 +128,10 @@ def _test_llmobs_invoke(cls, provider, bedrock_client, mock_llmobs_span_writer, } with get_request_vcr().use_cassette(cassette_name): body, model = json.dumps(body), _MODELS[provider] + if provider == "anthropic_message": + # we do this to re-use a cassette which tests + # cross-region inference + model = "us." + model response = bedrock_client.invoke_model(body=body, modelId=model) json.loads(response.get("body").read()) span = mock_tracer.pop_traces()[0][0]