Skip to content

Commit

Permalink
fix(botocore): bedrock cross-region inference model name does not thr…
Browse files Browse the repository at this point in the history
…ow (#10949)

## What does this PR do?
Fixes #10772 

Model IDs with cross-region inference would throw because we assumed
`modelID` would only have the `provider` and `model_name`, when it could
have the region as well. This would result in:

```
File /python3.11/site-packages/ddtrace/contrib/internal/botocore/services/bedrock.py:321, in patched_bedrock_api_call(original_func, instance, args, kwargs, function_vars)
    319 params = function_vars.get("params")
    320 pin = function_vars.get("pin")
--> 321 model_provider, model_name = params.get("modelId").split(".")
    322 integration = function_vars.get("integration")
    323 submit_to_llmobs = integration.llmobs_enabled and "embed" not in model_name

ValueError: too many values to unpack (expected 2)
```

We are not tagging that cross-region inference in this PR, just
resolving the error.

### Testing
To test this change, a singular `anthropic_message` test case and
corresponding cassette was modified. This had an unfortunate side effect
of affecting an LLMObs test as well. I can add a different test instead,
but I believe that would require an additional 60+ line cassette which
isn't totally needed, so I opted for this instead.

## Checklist
- [x] PR author has checked that all the criteria below are met
- The PR description includes an overview of the change
- The PR description articulates the motivation for the change
- The change includes tests OR the PR description describes a testing
strategy
- The PR description notes risks associated with the change, if any
- Newly-added code is easy to change
- The change follows the [library release note
guidelines](https://ddtrace.readthedocs.io/en/stable/releasenotes.html)
- The change includes or references documentation updates if necessary
- Backport labels are set (if
[applicable](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting))

## Reviewer Checklist
- [x] Reviewer has checked that all the criteria below are met 
- Title is accurate
- All changes are related to the pull request's stated goal
- Avoids breaking
[API](https://ddtrace.readthedocs.io/en/stable/versioning.html#interfaces)
changes
- Testing strategy adequately addresses listed risks
- Newly-added code is easy to change
- Release note makes sense to a user of the library
- If necessary, author has acknowledged and discussed the performance
implications of this PR as reported in the benchmarks PR comment
- Backport labels are set in a manner that is consistent with the
[release branch maintenance
policy](https://ddtrace.readthedocs.io/en/latest/contributing.html#backporting)
  • Loading branch information
sabrenner authored Oct 7, 2024
1 parent b380f21 commit 80a3ee8
Show file tree
Hide file tree
Showing 5 changed files with 15 additions and 2 deletions.
6 changes: 5 additions & 1 deletion ddtrace/contrib/internal/botocore/services/bedrock.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
fixes:
- |
botocore: fixes bedrock model and model provider interpretation from ``modelId`` when using cross-region inference.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions tests/contrib/botocore/test_bedrock.py
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down
4 changes: 4 additions & 0 deletions tests/contrib/botocore/test_bedrock_llmobs.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down

0 comments on commit 80a3ee8

Please sign in to comment.