Skip to content

Commit 2dd463d

Browse files
Region aware/ Claude 3+ bedrock support (#1561)
* Modify extractor logic. * Add support for Claude Sonnet 3+ and region aware models. * Update claude content extraction logic. * Add support for Claude Sonnet 3+ and region aware models. * Update claude content extraction logic. * Add testing for aiobotocore. * Restore newline. --------- Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
1 parent 3ed4a12 commit 2dd463d

File tree

6 files changed

+374
-4
lines changed

6 files changed

+374
-4
lines changed

newrelic/hooks/external_botocore.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,7 @@ def extract_bedrock_claude_model_request(request_body, bedrock_attrs):
394394
]
395395
else:
396396
input_message_list = [{"role": "user", "content": request_body.get("prompt")}]
397-
bedrock_attrs["request.max_tokens"] = request_body.get("max_tokens_to_sample")
397+
bedrock_attrs["request.max_tokens"] = request_body.get("max_tokens_to_sample") or request_body.get("max_tokens")
398398
bedrock_attrs["request.temperature"] = request_body.get("temperature")
399399
bedrock_attrs["input_message_list"] = input_message_list
400400

@@ -406,7 +406,13 @@ def extract_bedrock_claude_model_response(response_body, bedrock_attrs):
406406
response_body = json.loads(response_body)
407407
role = response_body.get("role", "assistant")
408408
content = response_body.get("content") or response_body.get("completion")
409-
output_message_list = [{"role": role, "content": content}]
409+
410+
# For Claude Sonnet 3+ models, the content key holds a list with the type and text of the output
411+
if isinstance(content, list):
412+
output_message_list = [{"role": "assistant", "content": result.get("text")} for result in content]
413+
else:
414+
output_message_list = [{"role": role, "content": content}]
415+
410416
bedrock_attrs["response.choices.finish_reason"] = response_body.get("stop_reason")
411417
bedrock_attrs["output_message_list"] = output_message_list
412418

@@ -420,6 +426,7 @@ def extract_bedrock_claude_model_streaming_response(response_body, bedrock_attrs
420426
bedrock_attrs["output_message_list"] = [{"role": "assistant", "content": ""}]
421427
bedrock_attrs["output_message_list"][0]["content"] += content
422428
bedrock_attrs["response.choices.finish_reason"] = response_body.get("stop_reason")
429+
423430
return bedrock_attrs
424431

425432

@@ -639,7 +646,7 @@ def _wrap_bedrock_runtime_invoke_model(wrapped, instance, args, kwargs):
639646

640647
# Determine extractor by model type
641648
for extractor_name, request_extractor, response_extractor, stream_extractor in MODEL_EXTRACTORS: # noqa: B007
642-
if model.startswith(extractor_name):
649+
if extractor_name in model:
643650
break
644651
else:
645652
# Model was not found in extractor list
@@ -1057,6 +1064,13 @@ def handle_chat_completion_event(transaction, bedrock_attrs):
10571064

10581065
input_message_list = bedrock_attrs.get("input_message_list", [])
10591066
output_message_list = bedrock_attrs.get("output_message_list", [])
1067+
1068+
no_output_content = len(output_message_list) == 1 and not output_message_list[0].get("content", "")
1069+
1070+
# This checks handles Sonnet 3+ models which report an additional empty input and empty output in streaming cases after the main content has been generated
1071+
if not input_message_list and no_output_content:
1072+
return
1073+
10601074
number_of_messages = (
10611075
len(input_message_list) + len(output_message_list)
10621076
) or None # If 0, attribute will be set to None and removed

tests/external_aiobotocore/test_bedrock_chat_completion_invoke_model.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ def request_streaming(request):
7373
"amazon.titan-text-express-v1",
7474
"ai21.j2-mid-v1",
7575
"anthropic.claude-instant-v1",
76+
"anthropic.claude-3-sonnet-20240229-v1:0",
7677
"meta.llama2-13b-chat-v1",
7778
"mistral.mistral-7b-instruct-v0:2",
7879
],

0 commit comments

Comments
 (0)