diff --git a/CHANGELOG.md b/CHANGELOG.md index 933998dad0..101cafd361 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `opentelemetry-instrumentation-botocore` Add support for GenAI user events and lazy initialize tracer ([#3258](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3258)) +- `opentelemetry-instrumentation-botocore` Add support for GenAI system events + ([#3266](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3266)) ### Fixed diff --git a/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/extensions/bedrock.py b/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/extensions/bedrock.py index 346e72772a..5a05df4c5e 100644 --- a/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/extensions/bedrock.py +++ b/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/extensions/bedrock.py @@ -209,10 +209,23 @@ def _set_if_not_none(attributes, key, value): attributes[key] = value def _get_request_messages(self): + """Extracts and normalize system and user / assistant messages""" input_text = None + if system := self._call_context.params.get("system", []): + system_messages = [{"role": "system", "content": system}] + else: + system_messages = [] + if not (messages := self._call_context.params.get("messages", [])): if body := self._call_context.params.get("body"): decoded_body = json.loads(body) + if system := decoded_body.get("system"): + if isinstance(system, str): + content = [{"text": system}] + else: + content = system + system_messages = [{"role": "system", "content": content}] + messages = decoded_body.get("messages", []) if not messages: # transform old school amazon titan invokeModel api to messages @@ -221,7 +234,7 @@ def _get_request_messages(self): {"role": "user", "content": [{"text": input_text}]} ] - return messages + return system_messages + messages def before_service_call( self, span: Span, instrumentor_context: _BotocoreInstrumentorContext diff --git a/instrumentation/opentelemetry-instrumentation-botocore/tests/bedrock_utils.py b/instrumentation/opentelemetry-instrumentation-botocore/tests/bedrock_utils.py index b46f679ddd..b645571d35 100644 --- a/instrumentation/opentelemetry-instrumentation-botocore/tests/bedrock_utils.py +++ b/instrumentation/opentelemetry-instrumentation-botocore/tests/bedrock_utils.py @@ -161,7 +161,9 @@ def assert_stream_completion_attributes( def assert_equal_or_not_present(value, attribute_name, span): if value is not None: - assert value == span.attributes[attribute_name] + assert value == span.attributes[attribute_name], span.attributes[ + attribute_name + ] else: assert attribute_name not in span.attributes, attribute_name diff --git a/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_converse_no_content_different_events.yaml b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_converse_no_content_different_events.yaml new file mode 100644 index 0000000000..dc67293e6f --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_converse_no_content_different_events.yaml @@ -0,0 +1,96 @@ +interactions: +- request: + body: |- + { + "system": [ + { + "text": "You are a friendly app" + } + ], + "messages": [ + { + "role": "user", + "content": [ + { + "text": "Say this is a test" + } + ] + }, + { + "role": "assistant", + "content": [ + { + "text": "This is a test" + } + ] + }, + { + "role": "user", + "content": [ + { + "text": "Say again this is a test" + } + ] + } + ] + } + headers: + Content-Length: + - '258' + Content-Type: + - application/json + User-Agent: + - Boto3/1.35.56 md/Botocore#1.35.56 ua/2.0 os/linux#6.1.0-1034-oem md/arch#x86_64 + lang/python#3.10.12 md/pyimpl#CPython cfg/retry-mode#legacy Botocore/1.35.56 + X-Amz-Date: + - 20250213T113027Z + X-Amz-Security-Token: + - test_aws_security_token + X-Amzn-Trace-Id: + - Root=1-d9112d64-56325c43023ba04895b18fc1;Parent=d56bf41aee9dd9b2;Sampled=1 + amz-sdk-invocation-id: + - 4e1fd77b-1b21-4b3a-9b96-d74fb74ede7c + amz-sdk-request: + - attempt=1 + authorization: + - Bearer test_aws_authorization + method: POST + uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-v2/converse + response: + body: + string: |- + { + "metrics": { + "latencyMs": 489 + }, + "output": { + "message": { + "content": [ + { + "text": "This is a test" + } + ], + "role": "assistant" + } + }, + "stopReason": "end_turn", + "usage": { + "inputTokens": 37, + "outputTokens": 8, + "totalTokens": 45 + } + } + headers: + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Thu, 13 Feb 2025 11:30:28 GMT + Set-Cookie: test_set_cookie + x-amzn-RequestId: + - 67f0b4ef-e481-4c12-853b-d8e992395129 + status: + code: 200 + message: OK +version: 1 diff --git a/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_converse_stream_no_content_different_events.yaml b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_converse_stream_no_content_different_events.yaml new file mode 100644 index 0000000000..0924fa56f6 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_converse_stream_no_content_different_events.yaml @@ -0,0 +1,102 @@ +interactions: +- request: + body: |- + { + "system": [ + { + "text": "You are a friendly app" + } + ], + "messages": [ + { + "role": "user", + "content": [ + { + "text": "Say this is a test" + } + ] + }, + { + "role": "assistant", + "content": [ + { + "text": "This is a test" + } + ] + }, + { + "role": "user", + "content": [ + { + "text": "Say again this is a test" + } + ] + } + ] + } + headers: + Content-Length: + - '258' + Content-Type: + - application/json + User-Agent: + - Boto3/1.35.56 md/Botocore#1.35.56 ua/2.0 os/linux#6.1.0-1034-oem md/arch#x86_64 + lang/python#3.10.12 md/pyimpl#CPython cfg/retry-mode#legacy Botocore/1.35.56 + X-Amz-Date: + - 20250213T134717Z + X-Amz-Security-Token: + - test_aws_security_token + X-Amzn-Trace-Id: + - Root=1-014325aa-ed2dea786b6b5b895661a1fd;Parent=540790d110580421;Sampled=1 + amz-sdk-invocation-id: + - 22820432-2412-4351-98af-8c70c71c84a9 + amz-sdk-request: + - attempt=1 + authorization: + - Bearer test_aws_authorization + method: POST + uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-v2/converse-stream + response: + body: + string: !!binary | + AAAAkwAAAFJ24bJxCzpldmVudC10eXBlBwAMbWVzc2FnZVN0YXJ0DTpjb250ZW50LXR5cGUHABBh + cHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsicCI6ImFiY2RlZmdoaWprbG1u + b3BxcnN0dXYiLCJyb2xlIjoiYXNzaXN0YW50In2AaQZuAAAAzQAAAFeBqDdUCzpldmVudC10eXBl + BwARY29udGVudEJsb2NrRGVsdGENOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0aW9uL2pzb24NOm1l + c3NhZ2UtdHlwZQcABWV2ZW50eyJjb250ZW50QmxvY2tJbmRleCI6MCwiZGVsdGEiOnsidGV4dCI6 + IlRoaXMifSwicCI6ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFS + U1RVViJ9qHD4cgAAALQAAABXdWq16gs6ZXZlbnQtdHlwZQcAEWNvbnRlbnRCbG9ja0RlbHRhDTpj + b250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiY29u + dGVudEJsb2NrSW5kZXgiOjAsImRlbHRhIjp7InRleHQiOiIgaXMifSwicCI6ImFiY2RlZmdoaWpr + bG1ub3BxcnN0dXZ3eCJ9dhKCRAAAALAAAABXgOoTKgs6ZXZlbnQtdHlwZQcAEWNvbnRlbnRCbG9j + a0RlbHRhDTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVl + dmVudHsiY29udGVudEJsb2NrSW5kZXgiOjAsImRlbHRhIjp7InRleHQiOiIgYSJ9LCJwIjoiYWJj + ZGVmZ2hpamtsbW5vcHFyc3R1In0IN1EQAAAAtQAAAFdICpxaCzpldmVudC10eXBlBwARY29udGVu + dEJsb2NrRGVsdGENOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlw + ZQcABWV2ZW50eyJjb250ZW50QmxvY2tJbmRleCI6MCwiZGVsdGEiOnsidGV4dCI6IiB0ZXN0In0s + InAiOiJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2dyJ9V81m8wAAAIkAAABWW9z5Sws6ZXZlbnQtdHlw + ZQcAEGNvbnRlbnRCbG9ja1N0b3ANOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0aW9uL2pzb24NOm1l + c3NhZ2UtdHlwZQcABWV2ZW50eyJjb250ZW50QmxvY2tJbmRleCI6MCwicCI6ImFiY2RlIn3nHPCv + AAAAoAAAAFEJaSGdCzpldmVudC10eXBlBwALbWVzc2FnZVN0b3ANOmNvbnRlbnQtdHlwZQcAEGFw + cGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJwIjoiYWJjZGVmZ2hpamtsbW5v + cHFyc3R1dnd4eXpBQkNERSIsInN0b3BSZWFzb24iOiJlbmRfdHVybiJ9p5BdEgAAAMsAAABOaoNq + NAs6ZXZlbnQtdHlwZQcACG1ldGFkYXRhDTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29u + DTptZXNzYWdlLXR5cGUHAAVldmVudHsibWV0cmljcyI6eyJsYXRlbmN5TXMiOjM2MX0sInAiOiJh + YmNkZWZnaGlqa2wiLCJ1c2FnZSI6eyJpbnB1dFRva2VucyI6MzcsIm91dHB1dFRva2VucyI6OCwi + dG90YWxUb2tlbnMiOjQ1fX1Nq2WY + headers: + Connection: + - keep-alive + Content-Type: + - application/vnd.amazon.eventstream + Date: + - Thu, 13 Feb 2025 13:47:17 GMT + Set-Cookie: test_set_cookie + Transfer-Encoding: + - chunked + x-amzn-RequestId: + - e443d332-cba6-4076-a4f6-86d6321eada3 + status: + code: 200 + message: OK +version: 1 diff --git a/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_converse_stream_with_content_different_events.yaml b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_converse_stream_with_content_different_events.yaml new file mode 100644 index 0000000000..93dba5bb6a --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_converse_stream_with_content_different_events.yaml @@ -0,0 +1,105 @@ +interactions: +- request: + body: |- + { + "system": [ + { + "text": "You are a friendly app" + } + ], + "messages": [ + { + "role": "user", + "content": [ + { + "text": "Say this is a test" + } + ] + }, + { + "role": "assistant", + "content": [ + { + "text": "This is a test" + } + ] + }, + { + "role": "user", + "content": [ + { + "text": "Say again this is a test" + } + ] + } + ] + } + headers: + Content-Length: + - '258' + Content-Type: + - application/json + User-Agent: + - Boto3/1.35.56 md/Botocore#1.35.56 ua/2.0 os/linux#6.1.0-1034-oem md/arch#x86_64 + lang/python#3.10.12 md/pyimpl#CPython cfg/retry-mode#legacy Botocore/1.35.56 + X-Amz-Date: + - 20250213T134611Z + X-Amz-Security-Token: + - test_aws_security_token + X-Amzn-Trace-Id: + - Root=1-deb34c78-8ab87e14665141b9e132396b;Parent=8e997adc8051f5a6;Sampled=1 + amz-sdk-invocation-id: + - 81e436d8-7c5d-4025-a9e5-de505ccb9b51 + amz-sdk-request: + - attempt=1 + authorization: + - Bearer test_aws_authorization + method: POST + uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-v2/converse-stream + response: + body: + string: !!binary | + AAAArAAAAFJVkJ0mCzpldmVudC10eXBlBwAMbWVzc2FnZVN0YXJ0DTpjb250ZW50LXR5cGUHABBh + cHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsicCI6ImFiY2RlZmdoaWprbG1u + b3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVIiwicm9sZSI6ImFzc2lzdGFudCJ9mBqg + YwAAANQAAABX7FjCpws6ZXZlbnQtdHlwZQcAEWNvbnRlbnRCbG9ja0RlbHRhDTpjb250ZW50LXR5 + cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiY29udGVudEJsb2Nr + SW5kZXgiOjAsImRlbHRhIjp7InRleHQiOiJUaGlzIn0sInAiOiJhYmNkZWZnaGlqa2xtbm9wcXJz + dHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyIn2n2T4pAAAArQAAAFcYmkAZCzpl + dmVudC10eXBlBwARY29udGVudEJsb2NrRGVsdGENOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0aW9u + L2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJjb250ZW50QmxvY2tJbmRleCI6MCwiZGVsdGEi + OnsidGV4dCI6IiBpcyJ9LCJwIjoiYWJjZGVmZ2hpamtsbW5vcHEifYkheRMAAADQAAAAVxnYZGcL + OmV2ZW50LXR5cGUHABFjb250ZW50QmxvY2tEZWx0YQ06Y29udGVudC10eXBlBwAQYXBwbGljYXRp + b24vanNvbg06bWVzc2FnZS10eXBlBwAFZXZlbnR7ImNvbnRlbnRCbG9ja0luZGV4IjowLCJkZWx0 + YSI6eyJ0ZXh0IjoiIGEifSwicCI6ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJ + SktMTU5PUFFSU1RVVldYWVowIn3K4xpaAAAA0wAAAFdeeB63CzpldmVudC10eXBlBwARY29udGVu + dEJsb2NrRGVsdGENOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlw + ZQcABWV2ZW50eyJjb250ZW50QmxvY2tJbmRleCI6MCwiZGVsdGEiOnsidGV4dCI6IiB0ZXN0In0s + InAiOiJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFla + MCJ916eYywAAALkAAABW+v1BzQs6ZXZlbnQtdHlwZQcAEGNvbnRlbnRCbG9ja1N0b3ANOmNvbnRl + bnQtdHlwZQcAEGFwcGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJjb250ZW50 + QmxvY2tJbmRleCI6MCwicCI6ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktM + TU5PUFFSU1RVVldYWVowIn2IAETUAAAAhgAAAFFH6Ps5CzpldmVudC10eXBlBwALbWVzc2FnZVN0 + b3ANOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50 + eyJwIjoiYWJjZGUiLCJzdG9wUmVhc29uIjoiZW5kX3R1cm4ifSknYaEAAAD3AAAATg5SP7MLOmV2 + ZW50LXR5cGUHAAhtZXRhZGF0YQ06Y29udGVudC10eXBlBwAQYXBwbGljYXRpb24vanNvbg06bWVz + c2FnZS10eXBlBwAFZXZlbnR7Im1ldHJpY3MiOnsibGF0ZW5jeU1zIjo1MDh9LCJwIjoiYWJjZGVm + Z2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjMiLCJ1c2Fn + ZSI6eyJpbnB1dFRva2VucyI6MzcsIm91dHB1dFRva2VucyI6OCwidG90YWxUb2tlbnMiOjQ1fX0o + MQhc + headers: + Connection: + - keep-alive + Content-Type: + - application/vnd.amazon.eventstream + Date: + - Thu, 13 Feb 2025 13:46:12 GMT + Set-Cookie: test_set_cookie + Transfer-Encoding: + - chunked + x-amzn-RequestId: + - 829dbcea-d3df-4781-be84-c1c2d5c420bd + status: + code: 200 + message: OK +version: 1 diff --git a/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_converse_with_content_different_events.yaml b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_converse_with_content_different_events.yaml new file mode 100644 index 0000000000..d370bd659e --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_converse_with_content_different_events.yaml @@ -0,0 +1,96 @@ +interactions: +- request: + body: |- + { + "system": [ + { + "text": "You are a friendly app" + } + ], + "messages": [ + { + "role": "user", + "content": [ + { + "text": "Say this is a test" + } + ] + }, + { + "role": "assistant", + "content": [ + { + "text": "This is a test" + } + ] + }, + { + "role": "user", + "content": [ + { + "text": "Say again this is a test" + } + ] + } + ] + } + headers: + Content-Length: + - '258' + Content-Type: + - application/json + User-Agent: + - Boto3/1.35.56 md/Botocore#1.35.56 ua/2.0 os/linux#6.1.0-1034-oem md/arch#x86_64 + lang/python#3.10.12 md/pyimpl#CPython cfg/retry-mode#legacy Botocore/1.35.56 + X-Amz-Date: + - 20250213T113026Z + X-Amz-Security-Token: + - test_aws_security_token + X-Amzn-Trace-Id: + - Root=1-188a1ced-da75f3769b7d8ee0334fa4bf;Parent=f8c672d0277ff6e1;Sampled=1 + amz-sdk-invocation-id: + - fae72016-6b0e-4b6f-b15a-100aa7f19e48 + amz-sdk-request: + - attempt=1 + authorization: + - Bearer test_aws_authorization + method: POST + uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-v2/converse + response: + body: + string: |- + { + "metrics": { + "latencyMs": 408 + }, + "output": { + "message": { + "content": [ + { + "text": "This is a test" + } + ], + "role": "assistant" + } + }, + "stopReason": "end_turn", + "usage": { + "inputTokens": 37, + "outputTokens": 8, + "totalTokens": 45 + } + } + headers: + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Thu, 13 Feb 2025 11:30:27 GMT + Set-Cookie: test_set_cookie + x-amzn-RequestId: + - 5273de67-e76c-45ad-be0a-558957af8046 + status: + code: 200 + message: OK +version: 1 diff --git a/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_no_content_different_events[amazon.nova].yaml b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_no_content_different_events[amazon.nova].yaml new file mode 100644 index 0000000000..ec6b54ab81 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_no_content_different_events[amazon.nova].yaml @@ -0,0 +1,107 @@ +interactions: +- request: + body: |- + { + "messages": [ + { + "role": "user", + "content": [ + { + "text": "Say this is a test" + } + ] + }, + { + "role": "assistant", + "content": [ + { + "text": "This is a test" + } + ] + }, + { + "role": "user", + "content": [ + { + "text": "Say again this is a test" + } + ] + } + ], + "inferenceConfig": { + "max_new_tokens": 10 + }, + "schemaVersion": "messages-v1", + "system": [ + { + "text": "You are friendly model" + } + ] + } + headers: + Content-Length: + - '333' + User-Agent: + - Boto3/1.35.56 md/Botocore#1.35.56 ua/2.0 os/linux#6.1.0-1034-oem md/arch#x86_64 + lang/python#3.10.12 md/pyimpl#CPython cfg/retry-mode#legacy Botocore/1.35.56 + X-Amz-Date: + - 20250213T113030Z + X-Amz-Security-Token: + - test_aws_security_token + X-Amzn-Trace-Id: + - Root=1-ba0c8a29-b443cf8553f07da7a91a8206;Parent=976f285f1d94e9d5;Sampled=1 + amz-sdk-invocation-id: + - 01a2bce5-51df-4e24-bbc4-ec0fb28b35ae + amz-sdk-request: + - attempt=1 + authorization: + - Bearer test_aws_authorization + method: POST + uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/amazon.nova-micro-v1%3A0/invoke + response: + body: + string: |- + { + "output": { + "message": { + "content": [ + { + "text": "Again, this is a test. If you need" + } + ], + "role": "assistant" + } + }, + "stopReason": "max_tokens", + "usage": { + "inputTokens": 24, + "outputTokens": 10, + "totalTokens": 34, + "cacheReadInputTokenCount": 0, + "cacheWriteInputTokenCount": 0 + } + } + headers: + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Thu, 13 Feb 2025 11:30:30 GMT + Set-Cookie: test_set_cookie + X-Amzn-Bedrock-Cache-Read-Input-Token-Count: + - '0' + X-Amzn-Bedrock-Cache-Write-Input-Token-Count: + - '0' + X-Amzn-Bedrock-Input-Token-Count: + - '24' + X-Amzn-Bedrock-Invocation-Latency: + - '182' + X-Amzn-Bedrock-Output-Token-Count: + - '10' + x-amzn-RequestId: + - 88719d47-9d62-4ae6-8623-07af41fb0044 + status: + code: 200 + message: OK +version: 1 diff --git a/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_no_content_different_events[anthropic.claude].yaml b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_no_content_different_events[anthropic.claude].yaml new file mode 100644 index 0000000000..bb9f262f1d --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_no_content_different_events[anthropic.claude].yaml @@ -0,0 +1,98 @@ +interactions: +- request: + body: |- + { + "messages": [ + { + "role": "user", + "content": [ + { + "text": "Say this is a test", + "type": "text" + } + ] + }, + { + "role": "assistant", + "content": [ + { + "text": "This is a test", + "type": "text" + } + ] + }, + { + "role": "user", + "content": [ + { + "text": "Say again this is a test", + "type": "text" + } + ] + } + ], + "anthropic_version": "bedrock-2023-05-31", + "system": "You are a friendly model", + "max_tokens": 10 + } + headers: + Content-Length: + - '357' + User-Agent: + - Boto3/1.35.56 md/Botocore#1.35.56 ua/2.0 os/linux#6.1.0-1034-oem md/arch#x86_64 + lang/python#3.10.12 md/pyimpl#CPython cfg/retry-mode#legacy Botocore/1.35.56 + X-Amz-Date: + - 20250213T113030Z + X-Amz-Security-Token: + - test_aws_security_token + X-Amzn-Trace-Id: + - Root=1-ca8c487d-14ab6e6ef139ee445552032f;Parent=76161c83e32d8750;Sampled=1 + amz-sdk-invocation-id: + - 65d2a14a-3292-44c0-852d-687472c3e477 + amz-sdk-request: + - attempt=1 + authorization: + - Bearer test_aws_authorization + method: POST + uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-v2/invoke + response: + body: + string: |- + { + "id": "msg_bdrk_01CmG6WWSyyBzYoApTJb79vd", + "type": "message", + "role": "assistant", + "model": "claude-2.0", + "content": [ + { + "type": "text", + "text": "This is a test" + } + ], + "stop_reason": "end_turn", + "stop_sequence": null, + "usage": { + "input_tokens": 37, + "output_tokens": 8 + } + } + headers: + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Thu, 13 Feb 2025 11:30:32 GMT + Set-Cookie: test_set_cookie + X-Amzn-Bedrock-Input-Token-Count: + - '37' + X-Amzn-Bedrock-Invocation-Latency: + - '1165' + X-Amzn-Bedrock-Output-Token-Count: + - '8' + x-amzn-RequestId: + - 39cf77df-c934-4701-926b-ae773dcc4a5a + status: + code: 200 + message: OK +version: 1 diff --git a/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_content_different_events[amazon.nova].yaml b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_content_different_events[amazon.nova].yaml new file mode 100644 index 0000000000..19989110a4 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_content_different_events[amazon.nova].yaml @@ -0,0 +1,107 @@ +interactions: +- request: + body: |- + { + "messages": [ + { + "role": "user", + "content": [ + { + "text": "Say this is a test" + } + ] + }, + { + "role": "assistant", + "content": [ + { + "text": "This is a test" + } + ] + }, + { + "role": "user", + "content": [ + { + "text": "Say again this is a test" + } + ] + } + ], + "inferenceConfig": { + "max_new_tokens": 10 + }, + "schemaVersion": "messages-v1", + "system": [ + { + "text": "You are a friendly model" + } + ] + } + headers: + Content-Length: + - '335' + User-Agent: + - Boto3/1.35.56 md/Botocore#1.35.56 ua/2.0 os/linux#6.1.0-1034-oem md/arch#x86_64 + lang/python#3.10.12 md/pyimpl#CPython cfg/retry-mode#legacy Botocore/1.35.56 + X-Amz-Date: + - 20250213T113028Z + X-Amz-Security-Token: + - test_aws_security_token + X-Amzn-Trace-Id: + - Root=1-ebcc2db9-853da8761a55ed21fab8f371;Parent=39df94de2ed40f10;Sampled=1 + amz-sdk-invocation-id: + - 6928a695-340b-4f03-b1dd-ec4a42a32f49 + amz-sdk-request: + - attempt=1 + authorization: + - Bearer test_aws_authorization + method: POST + uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/amazon.nova-micro-v1%3A0/invoke + response: + body: + string: |- + { + "output": { + "message": { + "content": [ + { + "text": "Again, this is a test. If you need" + } + ], + "role": "assistant" + } + }, + "stopReason": "max_tokens", + "usage": { + "inputTokens": 25, + "outputTokens": 10, + "totalTokens": 35, + "cacheReadInputTokenCount": 0, + "cacheWriteInputTokenCount": 0 + } + } + headers: + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Thu, 13 Feb 2025 11:30:29 GMT + Set-Cookie: test_set_cookie + X-Amzn-Bedrock-Cache-Read-Input-Token-Count: + - '0' + X-Amzn-Bedrock-Cache-Write-Input-Token-Count: + - '0' + X-Amzn-Bedrock-Input-Token-Count: + - '25' + X-Amzn-Bedrock-Invocation-Latency: + - '212' + X-Amzn-Bedrock-Output-Token-Count: + - '10' + x-amzn-RequestId: + - 2d2b151c-a618-4f59-a6d6-e3caf0591a5e + status: + code: 200 + message: OK +version: 1 diff --git a/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_content_different_events[anthropic.claude].yaml b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_content_different_events[anthropic.claude].yaml new file mode 100644 index 0000000000..77e31689e6 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_content_different_events[anthropic.claude].yaml @@ -0,0 +1,98 @@ +interactions: +- request: + body: |- + { + "messages": [ + { + "role": "user", + "content": [ + { + "text": "Say this is a test", + "type": "text" + } + ] + }, + { + "role": "assistant", + "content": [ + { + "text": "This is a test", + "type": "text" + } + ] + }, + { + "role": "user", + "content": [ + { + "text": "Say again this is a test", + "type": "text" + } + ] + } + ], + "anthropic_version": "bedrock-2023-05-31", + "system": "You are a friendly model", + "max_tokens": 10 + } + headers: + Content-Length: + - '357' + User-Agent: + - Boto3/1.35.56 md/Botocore#1.35.56 ua/2.0 os/linux#6.1.0-1034-oem md/arch#x86_64 + lang/python#3.10.12 md/pyimpl#CPython cfg/retry-mode#legacy Botocore/1.35.56 + X-Amz-Date: + - 20250213T113029Z + X-Amz-Security-Token: + - test_aws_security_token + X-Amzn-Trace-Id: + - Root=1-ebb1f004-773abbf27202dcf183809217;Parent=e7ecc8b27ef7ce36;Sampled=1 + amz-sdk-invocation-id: + - 656f63a7-9bca-490b-953e-1d4a126a79da + amz-sdk-request: + - attempt=1 + authorization: + - Bearer test_aws_authorization + method: POST + uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-v2/invoke + response: + body: + string: |- + { + "id": "msg_bdrk_01UnsouyLmsvQU98E9WzpGCp", + "type": "message", + "role": "assistant", + "model": "claude-2.0", + "content": [ + { + "type": "text", + "text": "This is a test" + } + ], + "stop_reason": "end_turn", + "stop_sequence": null, + "usage": { + "input_tokens": 37, + "output_tokens": 8 + } + } + headers: + Connection: + - keep-alive + Content-Type: + - application/json + Date: + - Thu, 13 Feb 2025 11:30:30 GMT + Set-Cookie: test_set_cookie + X-Amzn-Bedrock-Input-Token-Count: + - '37' + X-Amzn-Bedrock-Invocation-Latency: + - '335' + X-Amzn-Bedrock-Output-Token-Count: + - '8' + x-amzn-RequestId: + - 3daf61e4-4dbc-4c62-af7b-a8b395e4156c + status: + code: 200 + message: OK +version: 1 diff --git a/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_response_stream_no_content[amazon.nova].yaml b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_response_stream_no_content[amazon.nova].yaml new file mode 100644 index 0000000000..89e9cf3d65 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_response_stream_no_content[amazon.nova].yaml @@ -0,0 +1,158 @@ +interactions: +- request: + body: |- + { + "messages": [ + { + "role": "user", + "content": [ + { + "text": "Say this is a test" + } + ] + } + ], + "inferenceConfig": { + "max_new_tokens": 10, + "temperature": 0.8, + "topP": 1, + "stopSequences": [ + "|" + ] + }, + "schemaVersion": "messages-v1" + } + headers: + Content-Length: + - '207' + User-Agent: + - Boto3/1.35.56 md/Botocore#1.35.56 ua/2.0 os/linux#6.1.0-1034-oem md/arch#x86_64 + lang/python#3.10.12 md/pyimpl#CPython cfg/retry-mode#legacy Botocore/1.35.56 + X-Amz-Date: + - 20250213T140942Z + X-Amz-Security-Token: + - test_aws_security_token + X-Amzn-Trace-Id: + - Root=1-5ecd0236-4569edae20e05defebab7b00;Parent=0fa1f1768c7b8b5d;Sampled=1 + amz-sdk-invocation-id: + - 691b201f-920e-4147-8957-efb32f6b9509 + amz-sdk-request: + - attempt=1 + authorization: + - Bearer test_aws_authorization + method: POST + uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/amazon.nova-micro-v1%3A0/invoke-with-response-stream + response: + body: + string: !!binary | + AAAApwAAAEtGKwT3CzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0 + aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SnRaWE56WVdkbFUzUmhj + blFpT25zaWNtOXNaU0k2SW1GemMybHpkR0Z1ZENKOWZRPT0iLCJwIjoiYWJjZGUifZ0S/N0AAADo + AAAAS5yIy28LOmV2ZW50LXR5cGUHAAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGljYXRpb24v + anNvbg06bWVzc2FnZS10eXBlBwAFZXZlbnR7ImJ5dGVzIjoiZXlKamIyNTBaVzUwUW14dlkydEVa + V3gwWVNJNmV5SmtaV3gwWVNJNmV5SjBaWGgwSWpvaVUzVnlaU0o5TENKamIyNTBaVzUwUW14dlky + dEpibVJsZUNJNk1IMTkiLCJwIjoiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNEIn24dKPn + AAAAvwAAAEsWu9i0CzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0 + aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SmpiMjUwWlc1MFFteHZZ + MnRUZEc5d0lqcDdJbU52Ym5SbGJuUkNiRzlqYTBsdVpHVjRJam93ZlgwPSIsInAiOiJhYmNkZWZn + aGlqa2xtbm9wcXJzdHUifXkwdd4AAADbAAAAS3oJCTkLOmV2ZW50LXR5cGUHAAVjaHVuaw06Y29u + dGVudC10eXBlBwAQYXBwbGljYXRpb24vanNvbg06bWVzc2FnZS10eXBlBwAFZXZlbnR7ImJ5dGVz + IjoiZXlKamIyNTBaVzUwUW14dlkydEVaV3gwWVNJNmV5SmtaV3gwWVNJNmV5SjBaWGgwSWpvaUlT + SjlMQ0pqYjI1MFpXNTBRbXh2WTJ0SmJtUmxlQ0k2TVgxOSIsInAiOiJhYmNkZWZnaGlqa2xtbm9w + cXJzdHUifZgCKpgAAADYAAAASz2pc+kLOmV2ZW50LXR5cGUHAAVjaHVuaw06Y29udGVudC10eXBl + BwAQYXBwbGljYXRpb24vanNvbg06bWVzc2FnZS10eXBlBwAFZXZlbnR7ImJ5dGVzIjoiZXlKamIy + NTBaVzUwUW14dlkydFRkRzl3SWpwN0ltTnZiblJsYm5SQ2JHOWphMGx1WkdWNElqb3hmWDA9Iiwi + cCI6ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1Qifd1gMGIA + AAD+AAAAS3MoqU0LOmV2ZW50LXR5cGUHAAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGljYXRp + b24vanNvbg06bWVzc2FnZS10eXBlBwAFZXZlbnR7ImJ5dGVzIjoiZXlKamIyNTBaVzUwUW14dlky + dEVaV3gwWVNJNmV5SmtaV3gwWVNJNmV5SjBaWGgwSWpvaUlFbDBJbjBzSW1OdmJuUmxiblJDYkc5 + amEwbHVaR1Y0SWpveWZYMD0iLCJwIjoiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZH + SElKS0xNTk9QUVJTVFVWV1hZWiJ9v77h3gAAALIAAABL7iscBQs6ZXZlbnQtdHlwZQcABWNodW5r + DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsi + Ynl0ZXMiOiJleUpqYjI1MFpXNTBRbXh2WTJ0VGRHOXdJanA3SW1OdmJuUmxiblJDYkc5amEwbHVa + R1Y0SWpveWZYMD0iLCJwIjoiYWJjZGVmZ2gifWca+VsAAAD8AAAASwno+i0LOmV2ZW50LXR5cGUH + AAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGljYXRpb24vanNvbg06bWVzc2FnZS10eXBlBwAF + ZXZlbnR7ImJ5dGVzIjoiZXlKamIyNTBaVzUwUW14dlkydEVaV3gwWVNJNmV5SmtaV3gwWVNJNmV5 + SjBaWGgwSWpvaUlITnZkVzVrY3lKOUxDSmpiMjUwWlc1MFFteHZZMnRKYm1SbGVDSTZNMzE5Iiwi + cCI6ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1QifRDZk9oA + AACtAAAASwybHFYLOmV2ZW50LXR5cGUHAAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGljYXRp + b24vanNvbg06bWVzc2FnZS10eXBlBwAFZXZlbnR7ImJ5dGVzIjoiZXlKamIyNTBaVzUwUW14dlky + dFRkRzl3SWpwN0ltTnZiblJsYm5SQ2JHOWphMGx1WkdWNElqb3pmWDA9IiwicCI6ImFiYyJ9bx6Z + qQAAAQMAAABLCNDuBAs6ZXZlbnQtdHlwZQcABWNodW5rDTpjb250ZW50LXR5cGUHABBhcHBsaWNh + dGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiYnl0ZXMiOiJleUpqYjI1MFpXNTBRbXh2 + WTJ0RVpXeDBZU0k2ZXlKa1pXeDBZU0k2ZXlKMFpYaDBJam9pSUd4cGEyVWlmU3dpWTI5dWRHVnVk + RUpzYjJOclNXNWtaWGdpT2pSOWZRPT0iLCJwIjoiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpB + QkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAifUf8WIAAAAC2AAAASxurusULOmV2ZW50LXR5cGUH + AAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGljYXRpb24vanNvbg06bWVzc2FnZS10eXBlBwAF + ZXZlbnR7ImJ5dGVzIjoiZXlKamIyNTBaVzUwUW14dlkydFRkRzl3SWpwN0ltTnZiblJsYm5SQ2JH + OWphMGx1WkdWNElqbzBmWDA9IiwicCI6ImFiY2RlZmdoaWprbCJ96cj/hgAAANkAAABLAMlaWQs6 + ZXZlbnQtdHlwZQcABWNodW5rDTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNz + YWdlLXR5cGUHAAVldmVudHsiYnl0ZXMiOiJleUpqYjI1MFpXNTBRbXh2WTJ0RVpXeDBZU0k2ZXlK + a1pXeDBZU0k2ZXlKMFpYaDBJam9pSUhsdmRTSjlMQ0pqYjI1MFpXNTBRbXh2WTJ0SmJtUmxlQ0k2 + TlgxOSIsInAiOiJhYmNkZWZnaGlqa2xtbm8ifTc/0x4AAADMAAAAS6jJQqsLOmV2ZW50LXR5cGUH + AAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGljYXRpb24vanNvbg06bWVzc2FnZS10eXBlBwAF + ZXZlbnR7ImJ5dGVzIjoiZXlKamIyNTBaVzUwUW14dlkydFRkRzl3SWpwN0ltTnZiblJsYm5SQ2JH + OWphMGx1WkdWNElqbzFmWDA9IiwicCI6ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVG + R0giffYpOMUAAAEFAAAAS4eQG6QLOmV2ZW50LXR5cGUHAAVjaHVuaw06Y29udGVudC10eXBlBwAQ + YXBwbGljYXRpb24vanNvbg06bWVzc2FnZS10eXBlBwAFZXZlbnR7ImJ5dGVzIjoiZXlKamIyNTBa + VzUwUW14dlkydEVaV3gwWVNJNmV5SmtaV3gwWVNJNmV5SjBaWGgwSWpvaUlIZGhiblFpZlN3aVky + OXVkR1Z1ZEVKc2IyTnJTVzVrWlhnaU9qWjlmUT09IiwicCI6ImFiY2RlZmdoaWprbG1ub3BxcnN0 + dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIifYXvT9UAAADaAAAAS0dpIIkLOmV2 + ZW50LXR5cGUHAAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGljYXRpb24vanNvbg06bWVzc2Fn + ZS10eXBlBwAFZXZlbnR7ImJ5dGVzIjoiZXlKamIyNTBaVzUwUW14dlkydFRkRzl3SWpwN0ltTnZi + blJsYm5SQ2JHOWphMGx1WkdWNElqbzJmWDA9IiwicCI6ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3 + eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVViJ9lECpMgAAANgAAABLPalz6Qs6ZXZlbnQtdHlwZQcA + BWNodW5rDTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVl + dmVudHsiYnl0ZXMiOiJleUpqYjI1MFpXNTBRbXh2WTJ0RVpXeDBZU0k2ZXlKa1pXeDBZU0k2ZXlK + MFpYaDBJam9pSUhSdkluMHNJbU52Ym5SbGJuUkNiRzlqYTBsdVpHVjRJam8zZlgwPSIsInAiOiJh + YmNkZWZnaGlqa2xtbiJ9X2Y6nAAAAMQAAABLmLkJags6ZXZlbnQtdHlwZQcABWNodW5rDTpjb250 + ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiYnl0ZXMi + OiJleUpqYjI1MFpXNTBRbXh2WTJ0VGRHOXdJanA3SW1OdmJuUmxiblJDYkc5amEwbHVaR1Y0SWpv + M2ZYMD0iLCJwIjoiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoifRQObxwAAADoAAAAS5yIy28L + OmV2ZW50LXR5cGUHAAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGljYXRpb24vanNvbg06bWVz + c2FnZS10eXBlBwAFZXZlbnR7ImJ5dGVzIjoiZXlKamIyNTBaVzUwUW14dlkydEVaV3gwWVNJNmV5 + SmtaV3gwWVNJNmV5SjBaWGgwSWpvaUlHTnZiVzExYm1sallYUmxJbjBzSW1OdmJuUmxiblJDYkc5 + amEwbHVaR1Y0SWpvNGZYMD0iLCJwIjoiYWJjZGVmZ2hpamtsbW5vcHFyIn2XNLLFAAAA5wAAAEse + 2Fy+CzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0aW9uL2pzb24N + Om1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SmpiMjUwWlc1MFFteHZZMnRUZEc5d0lq + cDdJbU52Ym5SbGJuUkNiRzlqYTBsdVpHVjRJam80ZlgwPSIsInAiOiJhYmNkZWZnaGlqa2xtbm9w + cXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4In0vrSKrAAAA/AAA + AEsJ6PotCzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0aW9uL2pz + b24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SmpiMjUwWlc1MFFteHZZMnRFWld4 + MFlTSTZleUprWld4MFlTSTZleUowWlhoMElqb2lJR0VpZlN3aVkyOXVkR1Z1ZEVKc2IyTnJTVzVr + WlhnaU9qbDlmUT09IiwicCI6ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktM + TU5PUFFSU1RVVldYIn39jPY4AAAAwgAAAEsX+fzKCzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRl + bnQtdHlwZQcAEGFwcGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6 + ImV5SmpiMjUwWlc1MFFteHZZMnRUZEc5d0lqcDdJbU52Ym5SbGJuUkNiRzlqYTBsdVpHVjRJam81 + ZlgwPSIsInAiOiJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3giff4k+OEAAAC0AAAAS2Fr6aULOmV2 + ZW50LXR5cGUHAAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGljYXRpb24vanNvbg06bWVzc2Fn + ZS10eXBlBwAFZXZlbnR7ImJ5dGVzIjoiZXlKdFpYTnpZV2RsVTNSdmNDSTZleUp6ZEc5d1VtVmhj + Mjl1SWpvaWJXRjRYM1J2YTJWdWN5SjlmUT09IiwicCI6ImFiY2RlZmdoaWoifXfIDi4AAAIkAAAA + S/2lb74LOmV2ZW50LXR5cGUHAAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGljYXRpb24vanNv + bg06bWVzc2FnZS10eXBlBwAFZXZlbnR7ImJ5dGVzIjoiZXlKdFpYUmhaR0YwWVNJNmV5SjFjMkZu + WlNJNmV5SnBibkIxZEZSdmEyVnVjeUk2TlN3aWIzVjBjSFYwVkc5clpXNXpJam94TUN3aVkyRmph + R1ZTWldGa1NXNXdkWFJVYjJ0bGJrTnZkVzUwSWpvd0xDSmpZV05vWlZkeWFYUmxTVzV3ZFhSVWIy + dGxia052ZFc1MElqb3dmU3dpYldWMGNtbGpjeUk2ZTMwc0luUnlZV05sSWpwN2ZYMHNJbUZ0WVhw + dmJpMWlaV1J5YjJOckxXbHVkbTlqWVhScGIyNU5aWFJ5YVdOeklqcDdJbWx1Y0hWMFZHOXJaVzVE + YjNWdWRDSTZOU3dpYjNWMGNIVjBWRzlyWlc1RGIzVnVkQ0k2TVRBc0ltbHVkbTlqWVhScGIyNU1Z + WFJsYm1ONUlqb3lNRGNzSW1acGNuTjBRbmwwWlV4aGRHVnVZM2tpT2pnMkxDSmpZV05vWlZKbFlX + UkpibkIxZEZSdmEyVnVRMjkxYm5RaU9qQXNJbU5oWTJobFYzSnBkR1ZKYm5CMWRGUnZhMlZ1UTI5 + MWJuUWlPakI5ZlE9PSIsInAiOiJhYiJ9rO4iMQ== + headers: + Connection: + - keep-alive + Content-Type: + - application/vnd.amazon.eventstream + Date: + - Thu, 13 Feb 2025 14:09:43 GMT + Set-Cookie: test_set_cookie + Transfer-Encoding: + - chunked + X-Amzn-Bedrock-Content-Type: + - application/json + x-amzn-RequestId: + - d788a25f-4107-4d7e-9b70-be683e911d01 + status: + code: 200 + message: OK +version: 1 diff --git a/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_response_stream_no_content[amazon.titan].yaml b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_response_stream_no_content[amazon.titan].yaml new file mode 100644 index 0000000000..aa0c1d1d91 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_response_stream_no_content[amazon.titan].yaml @@ -0,0 +1,64 @@ +interactions: +- request: + body: |- + { + "inputText": "Say this is a test", + "textGenerationConfig": { + "maxTokenCount": 10, + "temperature": 0.8, + "topP": 1, + "stopSequences": [ + "|" + ] + } + } + headers: + Content-Length: + - '137' + User-Agent: + - Boto3/1.35.56 md/Botocore#1.35.56 ua/2.0 os/linux#6.1.0-1034-oem md/arch#x86_64 + lang/python#3.10.12 md/pyimpl#CPython cfg/retry-mode#legacy Botocore/1.35.56 + X-Amz-Date: + - 20250213T140943Z + X-Amz-Security-Token: + - test_aws_security_token + X-Amzn-Trace-Id: + - Root=1-b8667c76-484fbe275a69822274a3b153;Parent=1c655aa74d5b9056;Sampled=1 + amz-sdk-invocation-id: + - 16bd4347-4f6d-4098-8f71-18fa3e3db97c + amz-sdk-request: + - attempt=1 + authorization: + - Bearer test_aws_authorization + method: POST + uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/amazon.titan-text-lite-v1/invoke-with-response-stream + response: + body: + string: !!binary | + AAAB/AAAAEvCtCmICzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0 + aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SnZkWFJ3ZFhSVVpYaDBJ + am9pSUdOdmJXMWxiblJjYmtobGJHeHZJU0JKSUdGdElHRnVJRUZKSUcxdlpHVnNJR1JsZG1Wc2Iz + QmxaQ0lzSW1sdVpHVjRJam93TENKMGIzUmhiRTkxZEhCMWRGUmxlSFJVYjJ0bGJrTnZkVzUwSWpv + eE1Dd2lZMjl0Y0d4bGRHbHZibEpsWVhOdmJpSTZJa3hGVGtkVVNDSXNJbWx1Y0hWMFZHVjRkRlJ2 + YTJWdVEyOTFiblFpT2pVc0ltRnRZWHB2YmkxaVpXUnliMk5yTFdsdWRtOWpZWFJwYjI1TlpYUnlh + V056SWpwN0ltbHVjSFYwVkc5clpXNURiM1Z1ZENJNk5Td2liM1YwY0hWMFZHOXJaVzVEYjNWdWRD + STZNVEFzSW1sdWRtOWpZWFJwYjI1TVlYUmxibU41SWpvMk1EWXNJbVpwY25OMFFubDBaVXhoZEdW + dVkza2lPall3TlgxOSIsInAiOiJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiJ9ImKI2Q== + headers: + Connection: + - keep-alive + Content-Type: + - application/vnd.amazon.eventstream + Date: + - Thu, 13 Feb 2025 14:09:43 GMT + Set-Cookie: test_set_cookie + Transfer-Encoding: + - chunked + X-Amzn-Bedrock-Content-Type: + - application/json + x-amzn-RequestId: + - d1510378-4044-4e21-b8bc-793dc917cc4f + status: + code: 200 + message: OK +version: 1 diff --git a/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_response_stream_no_content[anthropic.claude].yaml b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_response_stream_no_content[anthropic.claude].yaml new file mode 100644 index 0000000000..0012ecbf6b --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_response_stream_no_content[anthropic.claude].yaml @@ -0,0 +1,138 @@ +interactions: +- request: + body: |- + { + "messages": [ + { + "role": "user", + "content": [ + { + "text": "Say this is a test", + "type": "text" + } + ] + } + ], + "anthropic_version": "bedrock-2023-05-31", + "max_tokens": 10, + "temperature": 0.8, + "top_p": 1, + "stop_sequences": [ + "|" + ] + } + headers: + Content-Length: + - '211' + User-Agent: + - Boto3/1.35.56 md/Botocore#1.35.56 ua/2.0 os/linux#6.1.0-1034-oem md/arch#x86_64 + lang/python#3.10.12 md/pyimpl#CPython cfg/retry-mode#legacy Botocore/1.35.56 + X-Amz-Date: + - 20250213T140944Z + X-Amz-Security-Token: + - test_aws_security_token + X-Amzn-Trace-Id: + - Root=1-d0737c0b-da5fdc0d56ffe1dba045b41c;Parent=7ec85426a39c4738;Sampled=1 + amz-sdk-invocation-id: + - bae563fd-a529-493e-a4fd-b149d9ce8ca1 + amz-sdk-request: + - attempt=1 + authorization: + - Bearer test_aws_authorization + method: POST + uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-v2/invoke-with-response-stream + response: + body: + string: !!binary | + AAAB2QAAAEvLlYn8CzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0 + aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SjBlWEJsSWpvaWJXVnpj + MkZuWlY5emRHRnlkQ0lzSW0xbGMzTmhaMlVpT25zaWFXUWlPaUp0YzJkZlltUnlhMTh3TVV4clUw + bzBTelY0V1RoclVHOTRPVGN6U21wSFNtOGlMQ0owZVhCbElqb2liV1Z6YzJGblpTSXNJbkp2YkdV + aU9pSmhjM05wYzNSaGJuUWlMQ0p0YjJSbGJDSTZJbU5zWVhWa1pTMHlMakFpTENKamIyNTBaVzUw + SWpwYlhTd2ljM1J2Y0Y5eVpXRnpiMjRpT201MWJHd3NJbk4wYjNCZmMyVnhkV1Z1WTJVaU9tNTFi + R3dzSW5WellXZGxJanA3SW1sdWNIVjBYM1J2YTJWdWN5STZNVFFzSW05MWRIQjFkRjkwYjJ0bGJu + TWlPakY5ZlgwPSIsInAiOiJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1O + T1BRUlNUVVZXWFkifWttUokAAAEXAAAAS52w30YLOmV2ZW50LXR5cGUHAAVjaHVuaw06Y29udGVu + dC10eXBlBwAQYXBwbGljYXRpb24vanNvbg06bWVzc2FnZS10eXBlBwAFZXZlbnR7ImJ5dGVzIjoi + ZXlKMGVYQmxJam9pWTI5dWRHVnVkRjlpYkc5amExOXpkR0Z5ZENJc0ltbHVaR1Y0SWpvd0xDSmpi + MjUwWlc1MFgySnNiMk5ySWpwN0luUjVjR1VpT2lKMFpYaDBJaXdpZEdWNGRDSTZJaUo5ZlE9PSIs + InAiOiJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFla + MDEyMzQifZCt+WAAAAEVAAAAS+dwjCYLOmV2ZW50LXR5cGUHAAVjaHVuaw06Y29udGVudC10eXBl + BwAQYXBwbGljYXRpb24vanNvbg06bWVzc2FnZS10eXBlBwAFZXZlbnR7ImJ5dGVzIjoiZXlKMGVY + QmxJam9pWTI5dWRHVnVkRjlpYkc5amExOWtaV3gwWVNJc0ltbHVaR1Y0SWpvd0xDSmtaV3gwWVNJ + NmV5SjBlWEJsSWpvaWRHVjRkRjlrWld4MFlTSXNJblJsZUhRaU9pSlBhMkY1SW4xOSIsInAiOiJh + YmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyIn0F + qOnTAAAA+wAAAEu7yCY9CzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFwcGxp + Y2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SjBlWEJsSWpvaVky + OXVkR1Z1ZEY5aWJHOWphMTlrWld4MFlTSXNJbWx1WkdWNElqb3dMQ0prWld4MFlTSTZleUowZVhC + bElqb2lkR1Y0ZEY5a1pXeDBZU0lzSW5SbGVIUWlPaUlzSW4xOSIsInAiOiJhYmNkZWZnaGlqa2xt + bm9wcXJzdHV2d3h5ekFCQ0RFRkcifZiFzkcAAAEUAAAAS9oQpZYLOmV2ZW50LXR5cGUHAAVjaHVu + aw06Y29udGVudC10eXBlBwAQYXBwbGljYXRpb24vanNvbg06bWVzc2FnZS10eXBlBwAFZXZlbnR7 + ImJ5dGVzIjoiZXlKMGVYQmxJam9pWTI5dWRHVnVkRjlpYkc5amExOWtaV3gwWVNJc0ltbHVaR1Y0 + SWpvd0xDSmtaV3gwWVNJNmV5SjBlWEJsSWpvaWRHVjRkRjlrWld4MFlTSXNJblJsZUhRaU9pSWdT + U0o5ZlE9PSIsInAiOiJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BR + UlNUVVZXWFlaMDEifYFpUVoAAADnAAAASx7YXL4LOmV2ZW50LXR5cGUHAAVjaHVuaw06Y29udGVu + dC10eXBlBwAQYXBwbGljYXRpb24vanNvbg06bWVzc2FnZS10eXBlBwAFZXZlbnR7ImJ5dGVzIjoi + ZXlKMGVYQmxJam9pWTI5dWRHVnVkRjlpYkc5amExOWtaV3gwWVNJc0ltbHVaR1Y0SWpvd0xDSmta + V3gwWVNJNmV5SjBlWEJsSWpvaWRHVjRkRjlrWld4MFlTSXNJblJsZUhRaU9pSWdhR1ZoY2lKOWZR + PT0iLCJwIjoiYWJjZGUifZTUHdgAAADpAAAAS6Ho4t8LOmV2ZW50LXR5cGUHAAVjaHVuaw06Y29u + dGVudC10eXBlBwAQYXBwbGljYXRpb24vanNvbg06bWVzc2FnZS10eXBlBwAFZXZlbnR7ImJ5dGVz + IjoiZXlKMGVYQmxJam9pWTI5dWRHVnVkRjlpYkc5amExOWtaV3gwWVNJc0ltbHVaR1Y0SWpvd0xD + SmtaV3gwWVNJNmV5SjBlWEJsSWpvaWRHVjRkRjlrWld4MFlTSXNJblJsZUhRaU9pSmtJSGx2ZFNK + OWZRPT0iLCJwIjoiYWJjZGVmZyJ9L4wO0QAAAPMAAABLi7ht/As6ZXZlbnQtdHlwZQcABWNodW5r + DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsi + Ynl0ZXMiOiJleUowZVhCbElqb2lZMjl1ZEdWdWRGOWliRzlqYTE5a1pXeDBZU0lzSW1sdVpHVjRJ + am93TENKa1pXeDBZU0k2ZXlKMGVYQmxJam9pZEdWNGRGOWtaV3gwWVNJc0luUmxlSFFpT2lJZ2My + RjVJbjE5IiwicCI6ImFiY2RlZmdoaWprbG1ub3BxcnN0dSJ9GxmkFQAAARUAAABL53CMJgs6ZXZl + bnQtdHlwZQcABWNodW5rDTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdl + LXR5cGUHAAVldmVudHsiYnl0ZXMiOiJleUowZVhCbElqb2lZMjl1ZEdWdWRGOWliRzlqYTE5a1pX + eDBZU0lzSW1sdVpHVjRJam93TENKa1pXeDBZU0k2ZXlKMGVYQmxJam9pZEdWNGRGOWtaV3gwWVNJ + c0luUmxlSFFpT2lJZ1hDSWlmWDA9IiwicCI6ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJD + REVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIifSUJEFgAAAEMAAAAS4qAedULOmV2ZW50LXR5cGUH + AAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGljYXRpb24vanNvbg06bWVzc2FnZS10eXBlBwAF + ZXZlbnR7ImJ5dGVzIjoiZXlKMGVYQmxJam9pWTI5dWRHVnVkRjlpYkc5amExOWtaV3gwWVNJc0lt + bHVaR1Y0SWpvd0xDSmtaV3gwWVNJNmV5SjBlWEJsSWpvaWRHVjRkRjlrWld4MFlTSXNJblJsZUhR + aU9pSlRZWGtpZlgwPSIsInAiOiJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpL + TE1OT1BRUlNUIn2++vJiAAABDgAAAEvwQCq1CzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQt + dHlwZQcAEGFwcGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5 + SjBlWEJsSWpvaVkyOXVkR1Z1ZEY5aWJHOWphMTlrWld4MFlTSXNJbWx1WkdWNElqb3dMQ0prWld4 + MFlTSTZleUowZVhCbElqb2lkR1Y0ZEY5a1pXeDBZU0lzSW5SbGVIUWlPaUlnZEdocGN5SjlmUT09 + IiwicCI6ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSIn2bOfJx + AAABDQAAAEu34FBlCzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0 + aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SjBlWEJsSWpvaVkyOXVk + R1Z1ZEY5aWJHOWphMTlrWld4MFlTSXNJbWx1WkdWNElqb3dMQ0prWld4MFlTSTZleUowZVhCbElq + b2lkR1Y0ZEY5a1pXeDBZU0lzSW5SbGVIUWlPaUlnYVhNaWZYMD0iLCJwIjoiYWJjZGVmZ2hpamts + bW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFUifWuVUmsAAADFAAAAS6XZINoLOmV2 + ZW50LXR5cGUHAAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGljYXRpb24vanNvbg06bWVzc2Fn + ZS10eXBlBwAFZXZlbnR7ImJ5dGVzIjoiZXlKMGVYQmxJam9pWTI5dWRHVnVkRjlpYkc5amExOXpk + Rzl3SWl3aWFXNWtaWGdpT2pCOSIsInAiOiJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RF + RkdISSJ9pG6vOAAAATgAAABL3iFnkws6ZXZlbnQtdHlwZQcABWNodW5rDTpjb250ZW50LXR5cGUH + ABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiYnl0ZXMiOiJleUowZVhC + bElqb2liV1Z6YzJGblpWOWtaV3gwWVNJc0ltUmxiSFJoSWpwN0luTjBiM0JmY21WaGMyOXVJam9p + YldGNFgzUnZhMlZ1Y3lJc0luTjBiM0JmYzJWeGRXVnVZMlVpT201MWJHeDlMQ0oxYzJGblpTSTZl + eUp2ZFhSd2RYUmZkRzlyWlc1eklqb3hNSDE5IiwicCI6ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3 + eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMSJ98M107QAAAUgAAABLJ/OHXAs6ZXZlbnQt + dHlwZQcABWNodW5rDTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5 + cGUHAAVldmVudHsiYnl0ZXMiOiJleUowZVhCbElqb2liV1Z6YzJGblpWOXpkRzl3SWl3aVlXMWhl + bTl1TFdKbFpISnZZMnN0YVc1MmIyTmhkR2x2YmsxbGRISnBZM01pT25zaWFXNXdkWFJVYjJ0bGJr + TnZkVzUwSWpveE5Dd2liM1YwY0hWMFZHOXJaVzVEYjNWdWRDSTZNVEFzSW1sdWRtOWpZWFJwYjI1 + TVlYUmxibU41SWpvMU9EWXNJbVpwY25OMFFubDBaVXhoZEdWdVkza2lPakk0TTMxOSIsInAiOiJh + YmNkZWZnaGlqa2xtbm9wcXIifU0wj/U= + headers: + Connection: + - keep-alive + Content-Type: + - application/vnd.amazon.eventstream + Date: + - Thu, 13 Feb 2025 14:09:44 GMT + Set-Cookie: test_set_cookie + Transfer-Encoding: + - chunked + X-Amzn-Bedrock-Content-Type: + - application/json + x-amzn-RequestId: + - fef4e97e-8d2b-4faf-a561-e27f49ec42e0 + status: + code: 200 + message: OK +version: 1 diff --git a/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_response_stream_no_content_different_events[amazon.nova].yaml b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_response_stream_no_content_different_events[amazon.nova].yaml new file mode 100644 index 0000000000..5527ccb38c --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_response_stream_no_content_different_events[amazon.nova].yaml @@ -0,0 +1,175 @@ +interactions: +- request: + body: |- + { + "messages": [ + { + "role": "user", + "content": [ + { + "text": "Say this is a test" + } + ] + }, + { + "role": "assistant", + "content": [ + { + "text": "This is a test" + } + ] + }, + { + "role": "user", + "content": [ + { + "text": "Say again this is a test" + } + ] + } + ], + "inferenceConfig": { + "max_new_tokens": 10 + }, + "schemaVersion": "messages-v1", + "system": [ + { + "text": "You are a friendly model" + } + ] + } + headers: + Content-Length: + - '335' + User-Agent: + - Boto3/1.35.56 md/Botocore#1.35.56 ua/2.0 os/linux#6.1.0-1034-oem md/arch#x86_64 + lang/python#3.10.12 md/pyimpl#CPython cfg/retry-mode#legacy Botocore/1.35.56 + X-Amz-Date: + - 20250213T141144Z + X-Amz-Security-Token: + - test_aws_security_token + X-Amzn-Trace-Id: + - Root=1-a09ce52d-52219138a15355c5765b2b52;Parent=63b5a9a600291fc0;Sampled=1 + amz-sdk-invocation-id: + - 9e4a9f20-c0f9-4be7-abfe-2872259d1d32 + amz-sdk-request: + - attempt=1 + authorization: + - Bearer test_aws_authorization + method: POST + uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/amazon.nova-micro-v1%3A0/invoke-with-response-stream + response: + body: + string: !!binary | + AAAAtwAAAEsmy5N1CzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0 + aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SnRaWE56WVdkbFUzUmhj + blFpT25zaWNtOXNaU0k2SW1GemMybHpkR0Z1ZENKOWZRPT0iLCJwIjoiYWJjZGVmZ2hpamtsbW5v + cHFyc3R1In2smnzGAAAA0wAAAEtKeUL4CzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlw + ZQcAEGFwcGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5Smpi + MjUwWlc1MFFteHZZMnRFWld4MFlTSTZleUprWld4MFlTSTZleUowWlhoMElqb2lRV2RoYVc0aWZT + d2lZMjl1ZEdWdWRFSnNiMk5yU1c1a1pYZ2lPakI5ZlE9PSIsInAiOiJhYmNkZSJ9ZkQqpwAAAOEA + AABLkZipHgs6ZXZlbnQtdHlwZQcABWNodW5rDTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9q + c29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiYnl0ZXMiOiJleUpqYjI1MFpXNTBRbXh2WTJ0VGRH + OXdJanA3SW1OdmJuUmxiblJDYkc5amEwbHVaR1Y0SWpvd2ZYMD0iLCJwIjoiYWJjZGVmZ2hpamts + bW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMiJ9D8dFwAAAAM4AAABL + 0gkRyws6ZXZlbnQtdHlwZQcABWNodW5rDTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29u + DTptZXNzYWdlLXR5cGUHAAVldmVudHsiYnl0ZXMiOiJleUpqYjI1MFpXNTBRbXh2WTJ0RVpXeDBZ + U0k2ZXlKa1pXeDBZU0k2ZXlKMFpYaDBJam9pTENKOUxDSmpiMjUwWlc1MFFteHZZMnRKYm1SbGVD + STZNWDE5IiwicCI6ImFiY2RlZmdoIn0LqUUiAAAA4gAAAEvWONPOCzpldmVudC10eXBlBwAFY2h1 + bmsNOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50 + eyJieXRlcyI6ImV5SmpiMjUwWlc1MFFteHZZMnRUZEc5d0lqcDdJbU52Ym5SbGJuUkNiRzlqYTBs + dVpHVjRJam94ZlgwPSIsInAiOiJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpL + TE1OT1BRUlNUVVZXWFlaMDEyMyJ9g9JI0AAAAOcAAABLHthcvgs6ZXZlbnQtdHlwZQcABWNodW5r + DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsi + Ynl0ZXMiOiJleUpqYjI1MFpXNTBRbXh2WTJ0RVpXeDBZU0k2ZXlKa1pXeDBZU0k2ZXlKMFpYaDBJ + am9pSUhSb2FYTWlmU3dpWTI5dWRHVnVkRUpzYjJOclNXNWtaWGdpT2pKOWZRPT0iLCJwIjoiYWJj + ZGVmZ2hpamtsbW5vcHFyc3R1dnd4eSJ9Y/VCfwAAANcAAABLv/nkOAs6ZXZlbnQtdHlwZQcABWNo + dW5rDTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVu + dHsiYnl0ZXMiOiJleUpqYjI1MFpXNTBRbXh2WTJ0VGRHOXdJanA3SW1OdmJuUmxiblJDYkc5amEw + bHVaR1Y0SWpveWZYMD0iLCJwIjoiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElK + S0xNTk9QUVJTIn109CNrAAAA4QAAAEuRmKkeCzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQt + dHlwZQcAEGFwcGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5 + SmpiMjUwWlc1MFFteHZZMnRFWld4MFlTSTZleUprWld4MFlTSTZleUowWlhoMElqb2lJR2x6SW4w + c0ltTnZiblJsYm5SQ2JHOWphMGx1WkdWNElqb3pmWDA9IiwicCI6ImFiY2RlZmdoaWprbG1ub3Bx + cnN0dXZ3In077I9kAAAA2wAAAEt6CQk5CzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlw + ZQcAEGFwcGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5Smpi + MjUwWlc1MFFteHZZMnRUZEc5d0lqcDdJbU52Ym5SbGJuUkNiRzlqYTBsdVpHVjRJam96ZlgwPSIs + InAiOiJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXIn2Y + cRd9AAAA9AAAAEs5mLHsCzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFwcGxp + Y2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SmpiMjUwWlc1MFFt + eHZZMnRFWld4MFlTSTZleUprWld4MFlTSTZleUowWlhoMElqb2lJR0VpZlN3aVkyOXVkR1Z1ZEVK + c2IyTnJTVzVrWlhnaU9qUjlmUT09IiwicCI6ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJD + REVGR0hJSktMTU5PUCJ964agtwAAAMgAAABLXUnkaws6ZXZlbnQtdHlwZQcABWNodW5rDTpjb250 + ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiYnl0ZXMi + OiJleUpqYjI1MFpXNTBRbXh2WTJ0VGRHOXdJanA3SW1OdmJuUmxiblJDYkc5amEwbHVaR1Y0SWpv + MGZYMD0iLCJwIjoiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNEIn0/JaMoAAAA1AAAAEv4 + WZ7oCzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0aW9uL2pzb24N + Om1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SmpiMjUwWlc1MFFteHZZMnRFWld4MFlT + STZleUprWld4MFlTSTZleUowWlhoMElqb2lJSFJsYzNRaWZTd2lZMjl1ZEdWdWRFSnNiMk5yU1c1 + a1pYZ2lPalY5ZlE9PSIsInAiOiJhYmNkZWYifTR53DAAAAC9AAAAS2x7i9QLOmV2ZW50LXR5cGUH + AAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGljYXRpb24vanNvbg06bWVzc2FnZS10eXBlBwAF + ZXZlbnR7ImJ5dGVzIjoiZXlKamIyNTBaVzUwUW14dlkydFRkRzl3SWpwN0ltTnZiblJsYm5SQ2JH + OWphMGx1WkdWNElqbzFmWDA9IiwicCI6ImFiY2RlZmdoaWprbG1ub3BxcnMifWGJ/tEAAADrAAAA + S9sosb8LOmV2ZW50LXR5cGUHAAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGljYXRpb24vanNv + bg06bWVzc2FnZS10eXBlBwAFZXZlbnR7ImJ5dGVzIjoiZXlKamIyNTBaVzUwUW14dlkydEVaV3gw + WVNJNmV5SmtaV3gwWVNJNmV5SjBaWGgwSWpvaUxpSjlMQ0pqYjI1MFpXNTBRbXh2WTJ0SmJtUmxl + Q0k2Tm4xOSIsInAiOiJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLIn1bj3f5 + AAAA4AAAAEus+ICuCzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0 + aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SmpiMjUwWlc1MFFteHZZ + MnRUZEc5d0lqcDdJbU52Ym5SbGJuUkNiRzlqYTBsdVpHVjRJam8yZlgwPSIsInAiOiJhYmNkZWZn + aGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEifUip/SkAAAEH + AAAAS/1QSMQLOmV2ZW50LXR5cGUHAAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGljYXRpb24v + anNvbg06bWVzc2FnZS10eXBlBwAFZXZlbnR7ImJ5dGVzIjoiZXlKamIyNTBaVzUwUW14dlkydEVa + V3gwWVNJNmV5SmtaV3gwWVNJNmV5SjBaWGgwSWpvaUlFbG1JbjBzSW1OdmJuUmxiblJDYkc5amEw + bHVaR1Y0SWpvM2ZYMD0iLCJwIjoiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElK + S0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3OCJ9u1LWzQAAALkAAABLmfstFAs6ZXZlbnQtdHlwZQcA + BWNodW5rDTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVl + dmVudHsiYnl0ZXMiOiJleUpqYjI1MFpXNTBRbXh2WTJ0VGRHOXdJanA3SW1OdmJuUmxiblJDYkc5 + amEwbHVaR1Y0SWpvM2ZYMD0iLCJwIjoiYWJjZGVmZ2hpamtsbW5vIn0THZEoAAAA4QAAAEuRmKke + CzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0aW9uL2pzb24NOm1l + c3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SmpiMjUwWlc1MFFteHZZMnRFWld4MFlTSTZl + eUprWld4MFlTSTZleUowWlhoMElqb2lJSGx2ZFNKOUxDSmpiMjUwWlc1MFFteHZZMnRKYm1SbGVD + STZPSDE5IiwicCI6ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3In1pnW0qAAAA3wAAAEuPia/5Czpl + dmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0aW9uL2pzb24NOm1lc3Nh + Z2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SmpiMjUwWlc1MFFteHZZMnRUZEc5d0lqcDdJbU52 + Ym5SbGJuUkNiRzlqYTBsdVpHVjRJam80ZlgwPSIsInAiOiJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2 + d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMCJ9zCnPkAAAAOMAAABL61j6fgs6ZXZlbnQt + dHlwZQcABWNodW5rDTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5 + cGUHAAVldmVudHsiYnl0ZXMiOiJleUpqYjI1MFpXNTBRbXh2WTJ0RVpXeDBZU0k2ZXlKa1pXeDBZ + U0k2ZXlKMFpYaDBJam9pSUc1bFpXUWlmU3dpWTI5dWRHVnVkRUpzYjJOclNXNWtaWGdpT2psOWZR + PT0iLCJwIjoiYWJjZGVmZ2hpamtsbW5vcHFyc3R1In1tUIvDAAAAxgAAAEvieVoKCzpldmVudC10 + eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlw + ZQcABWV2ZW50eyJieXRlcyI6ImV5SmpiMjUwWlc1MFFteHZZMnRUZEc5d0lqcDdJbU52Ym5SbGJu + UkNiRzlqYTBsdVpHVjRJam81ZlgwPSIsInAiOiJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFC + In36jRI9AAAA4wAAAEvrWPp+CzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFw + cGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SnRaWE56WVdk + bFUzUnZjQ0k2ZXlKemRHOXdVbVZoYzI5dUlqb2liV0Y0WDNSdmEyVnVjeUo5ZlE9PSIsInAiOiJh + YmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQi + fT6v9b4AAAIuAAAAS7cVdx8LOmV2ZW50LXR5cGUHAAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBw + bGljYXRpb24vanNvbg06bWVzc2FnZS10eXBlBwAFZXZlbnR7ImJ5dGVzIjoiZXlKdFpYUmhaR0Yw + WVNJNmV5SjFjMkZuWlNJNmV5SnBibkIxZEZSdmEyVnVjeUk2TWpVc0ltOTFkSEIxZEZSdmEyVnVj + eUk2TVRBc0ltTmhZMmhsVW1WaFpFbHVjSFYwVkc5clpXNURiM1Z1ZENJNk1Dd2lZMkZqYUdWWGNt + bDBaVWx1Y0hWMFZHOXJaVzVEYjNWdWRDSTZNSDBzSW0xbGRISnBZM01pT250OUxDSjBjbUZqWlNJ + NmUzMTlMQ0poYldGNmIyNHRZbVZrY205amF5MXBiblp2WTJGMGFXOXVUV1YwY21samN5STZleUpw + Ym5CMWRGUnZhMlZ1UTI5MWJuUWlPakkxTENKdmRYUndkWFJVYjJ0bGJrTnZkVzUwSWpveE1Dd2lh + VzUyYjJOaGRHbHZia3hoZEdWdVkza2lPakUzT1N3aVptbHljM1JDZVhSbFRHRjBaVzVqZVNJNk5q + QXNJbU5oWTJobFVtVmhaRWx1Y0hWMFZHOXJaVzVEYjNWdWRDSTZNQ3dpWTJGamFHVlhjbWwwWlVs + dWNIVjBWRzlyWlc1RGIzVnVkQ0k2TUgxOSIsInAiOiJhYmNkZWZnaGlqa2wifelhO1Y= + headers: + Connection: + - keep-alive + Content-Type: + - application/vnd.amazon.eventstream + Date: + - Thu, 13 Feb 2025 14:11:45 GMT + Set-Cookie: test_set_cookie + Transfer-Encoding: + - chunked + X-Amzn-Bedrock-Content-Type: + - application/json + x-amzn-RequestId: + - 5a860b54-1dc8-429c-9855-bbdb14bd8746 + status: + code: 200 + message: OK +version: 1 diff --git a/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_response_stream_no_content_different_events[anthropic.claude].yaml b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_response_stream_no_content_different_events[anthropic.claude].yaml new file mode 100644 index 0000000000..d4c06a6078 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_response_stream_no_content_different_events[anthropic.claude].yaml @@ -0,0 +1,123 @@ +interactions: +- request: + body: |- + { + "messages": [ + { + "role": "user", + "content": [ + { + "text": "Say this is a test", + "type": "text" + } + ] + }, + { + "role": "assistant", + "content": [ + { + "text": "This is a test", + "type": "text" + } + ] + }, + { + "role": "user", + "content": [ + { + "text": "Say again this is a test", + "type": "text" + } + ] + } + ], + "anthropic_version": "bedrock-2023-05-31", + "system": "You are a friendly model", + "max_tokens": 10 + } + headers: + Content-Length: + - '357' + User-Agent: + - Boto3/1.35.56 md/Botocore#1.35.56 ua/2.0 os/linux#6.1.0-1034-oem md/arch#x86_64 + lang/python#3.10.12 md/pyimpl#CPython cfg/retry-mode#legacy Botocore/1.35.56 + X-Amz-Date: + - 20250213T141145Z + X-Amz-Security-Token: + - test_aws_security_token + X-Amzn-Trace-Id: + - Root=1-3b467cd3-1c0670b2a26cec8cb737e192;Parent=eeae78711a53442d;Sampled=1 + amz-sdk-invocation-id: + - e429adb3-764e-4929-9f5c-c30f2972174c + amz-sdk-request: + - attempt=1 + authorization: + - Bearer test_aws_authorization + method: POST + uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-v2/invoke-with-response-stream + response: + body: + string: !!binary | + AAAB3QAAAEs+FS88CzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0 + aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SjBlWEJsSWpvaWJXVnpj + MkZuWlY5emRHRnlkQ0lzSW0xbGMzTmhaMlVpT25zaWFXUWlPaUp0YzJkZlltUnlhMTh3TVZCSVdF + UjJkbmR3VFVSaVFWSlpjM0poYTJOSE9Ua2lMQ0owZVhCbElqb2liV1Z6YzJGblpTSXNJbkp2YkdV + aU9pSmhjM05wYzNSaGJuUWlMQ0p0YjJSbGJDSTZJbU5zWVhWa1pTMHlMakFpTENKamIyNTBaVzUw + SWpwYlhTd2ljM1J2Y0Y5eVpXRnpiMjRpT201MWJHd3NJbk4wYjNCZmMyVnhkV1Z1WTJVaU9tNTFi + R3dzSW5WellXZGxJanA3SW1sdWNIVjBYM1J2YTJWdWN5STZNemNzSW05MWRIQjFkRjkwYjJ0bGJu + TWlPakY5ZlgwPSIsInAiOiJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1O + T1BRUlNUVVZXWFlaMDEyIn03XqsQAAAA9AAAAEs5mLHsCzpldmVudC10eXBlBwAFY2h1bmsNOmNv + bnRlbnQtdHlwZQcAEGFwcGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRl + cyI6ImV5SjBlWEJsSWpvaVkyOXVkR1Z1ZEY5aWJHOWphMTl6ZEdGeWRDSXNJbWx1WkdWNElqb3dM + Q0pqYjI1MFpXNTBYMkpzYjJOcklqcDdJblI1Y0dVaU9pSjBaWGgwSWl3aWRHVjRkQ0k2SWlKOWZR + PT0iLCJwIjoiYWJjZGVmZ2hpamtsbW5vcHFyc3R1diJ9n5F/3AAAAQEAAABLchC9ZAs6ZXZlbnQt + dHlwZQcABWNodW5rDTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5 + cGUHAAVldmVudHsiYnl0ZXMiOiJleUowZVhCbElqb2lZMjl1ZEdWdWRGOWliRzlqYTE5a1pXeDBZ + U0lzSW1sdVpHVjRJam93TENKa1pXeDBZU0k2ZXlKMGVYQmxJam9pZEdWNGRGOWtaV3gwWVNJc0lu + UmxlSFFpT2lKVWFHbHpJbjE5IiwicCI6ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVG + R0hJIn2TE0apAAAA5wAAAEse2Fy+CzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcA + EGFwcGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SjBlWEJs + SWpvaVkyOXVkR1Z1ZEY5aWJHOWphMTlrWld4MFlTSXNJbWx1WkdWNElqb3dMQ0prWld4MFlTSTZl + eUowZVhCbElqb2lkR1Y0ZEY5a1pXeDBZU0lzSW5SbGVIUWlPaUlnYVhNaWZYMD0iLCJwIjoiYWJj + ZGVmZ2hpIn2t9aV4AAAA+AAAAEv8aFztCzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlw + ZQcAEGFwcGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SjBl + WEJsSWpvaVkyOXVkR1Z1ZEY5aWJHOWphMTlrWld4MFlTSXNJbWx1WkdWNElqb3dMQ0prWld4MFlT + STZleUowZVhCbElqb2lkR1Y0ZEY5a1pXeDBZU0lzSW5SbGVIUWlPaUlnWVNKOWZRPT0iLCJwIjoi + YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoifRz/PMwAAADkAAAAS1l4Jm4LOmV2ZW50LXR5cGUH + AAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGljYXRpb24vanNvbg06bWVzc2FnZS10eXBlBwAF + ZXZlbnR7ImJ5dGVzIjoiZXlKMGVYQmxJam9pWTI5dWRHVnVkRjlpYkc5amExOWtaV3gwWVNJc0lt + bHVaR1Y0SWpvd0xDSmtaV3gwWVNJNmV5SjBlWEJsSWpvaWRHVjRkRjlrWld4MFlTSXNJblJsZUhR + aU9pSWdkR1Z6ZENKOWZRPT0iLCJwIjoiYWIifVjsMQIAAADVAAAAS8U5t1gLOmV2ZW50LXR5cGUH + AAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGljYXRpb24vanNvbg06bWVzc2FnZS10eXBlBwAF + ZXZlbnR7ImJ5dGVzIjoiZXlKMGVYQmxJam9pWTI5dWRHVnVkRjlpYkc5amExOXpkRzl3SWl3aWFX + NWtaWGdpT2pCOSIsInAiOiJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1O + T1BRUlNUVVZXWFkifbyhSHYAAAE2AAAAS2ER2fILOmV2ZW50LXR5cGUHAAVjaHVuaw06Y29udGVu + dC10eXBlBwAQYXBwbGljYXRpb24vanNvbg06bWVzc2FnZS10eXBlBwAFZXZlbnR7ImJ5dGVzIjoi + ZXlKMGVYQmxJam9pYldWemMyRm5aVjlrWld4MFlTSXNJbVJsYkhSaElqcDdJbk4wYjNCZmNtVmhj + Mjl1SWpvaVpXNWtYM1IxY200aUxDSnpkRzl3WDNObGNYVmxibU5sSWpwdWRXeHNmU3dpZFhOaFoy + VWlPbnNpYjNWMGNIVjBYM1J2YTJWdWN5STZPSDE5IiwicCI6ImFiY2RlZmdoaWprbG1ub3BxcnN0 + dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzIn1GPfIoAAABVgAAAEv4I66/Czpl + dmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0aW9uL2pzb24NOm1lc3Nh + Z2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SjBlWEJsSWpvaWJXVnpjMkZuWlY5emRHOXdJaXdp + WVcxaGVtOXVMV0psWkhKdlkyc3RhVzUyYjJOaGRHbHZiazFsZEhKcFkzTWlPbnNpYVc1d2RYUlVi + MnRsYmtOdmRXNTBJam96Tnl3aWIzVjBjSFYwVkc5clpXNURiM1Z1ZENJNk9Dd2lhVzUyYjJOaGRH + bHZia3hoZEdWdVkza2lPalEyTUN3aVptbHljM1JDZVhSbFRHRjBaVzVqZVNJNk16ZzFmWDA9Iiwi + cCI6ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGIn2cl+ym + headers: + Connection: + - keep-alive + Content-Type: + - application/vnd.amazon.eventstream + Date: + - Thu, 13 Feb 2025 14:11:45 GMT + Set-Cookie: test_set_cookie + Transfer-Encoding: + - chunked + X-Amzn-Bedrock-Content-Type: + - application/json + x-amzn-RequestId: + - f2e57698-369e-455f-ba0c-ee76c7cc9b0e + status: + code: 200 + message: OK +version: 1 diff --git a/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_response_stream_with_content_different_events[amazon.nova].yaml b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_response_stream_with_content_different_events[amazon.nova].yaml new file mode 100644 index 0000000000..4c7bf0c5a0 --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_response_stream_with_content_different_events[amazon.nova].yaml @@ -0,0 +1,173 @@ +interactions: +- request: + body: |- + { + "messages": [ + { + "role": "user", + "content": [ + { + "text": "Say this is a test" + } + ] + }, + { + "role": "assistant", + "content": [ + { + "text": "This is a test" + } + ] + }, + { + "role": "user", + "content": [ + { + "text": "Say again this is a test" + } + ] + } + ], + "inferenceConfig": { + "max_new_tokens": 10 + }, + "schemaVersion": "messages-v1", + "system": [ + { + "text": "You are a friendly model" + } + ] + } + headers: + Content-Length: + - '335' + User-Agent: + - Boto3/1.35.56 md/Botocore#1.35.56 ua/2.0 os/linux#6.1.0-1034-oem md/arch#x86_64 + lang/python#3.10.12 md/pyimpl#CPython cfg/retry-mode#legacy Botocore/1.35.56 + X-Amz-Date: + - 20250213T141142Z + X-Amz-Security-Token: + - test_aws_security_token + X-Amzn-Trace-Id: + - Root=1-28ed5f06-78a0ef90426228c4d5ebde31;Parent=4113da3ba221a595;Sampled=1 + amz-sdk-invocation-id: + - e1dd3bf8-0b4f-47e7-84f9-6bef53b8b7d8 + amz-sdk-request: + - attempt=1 + authorization: + - Bearer test_aws_authorization + method: POST + uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/amazon.nova-micro-v1%3A0/invoke-with-response-stream + response: + body: + string: !!binary | + AAAAuAAAAEukmwSkCzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0 + aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SnRaWE56WVdkbFUzUmhj + blFpT25zaWNtOXNaU0k2SW1GemMybHpkR0Z1ZENKOWZRPT0iLCJwIjoiYWJjZGVmZ2hpamtsbW5v + cHFyc3R1diJ9TyaZ3wAAANQAAABL+Fme6As6ZXZlbnQtdHlwZQcABWNodW5rDTpjb250ZW50LXR5 + cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiYnl0ZXMiOiJleUpq + YjI1MFpXNTBRbXh2WTJ0RVpXeDBZU0k2ZXlKa1pXeDBZU0k2ZXlKMFpYaDBJam9pVkdocGN5SjlM + Q0pqYjI1MFpXNTBRbXh2WTJ0SmJtUmxlQ0k2TUgxOSIsInAiOiJhYmNkZWZnaGlqIn2IqYJIAAAA + wgAAAEsX+fzKCzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0aW9u + L2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SmpiMjUwWlc1MFFteHZZMnRU + ZEc5d0lqcDdJbU52Ym5SbGJuUkNiRzlqYTBsdVpHVjRJam93ZlgwPSIsInAiOiJhYmNkZWZnaGlq + a2xtbm9wcXJzdHV2d3gifYUcwhMAAADjAAAAS+tY+n4LOmV2ZW50LXR5cGUHAAVjaHVuaw06Y29u + dGVudC10eXBlBwAQYXBwbGljYXRpb24vanNvbg06bWVzc2FnZS10eXBlBwAFZXZlbnR7ImJ5dGVz + IjoiZXlKamIyNTBaVzUwUW14dlkydEVaV3gwWVNJNmV5SmtaV3gwWVNJNmV5SjBaWGgwSWpvaUlH + bHpJbjBzSW1OdmJuUmxiblJDYkc5amEwbHVaR1Y0SWpveGZYMD0iLCJwIjoiYWJjZGVmZ2hpamts + bW5vcHFyc3R1dnd4eSJ9J0L/9wAAAMkAAABLYCnN2ws6ZXZlbnQtdHlwZQcABWNodW5rDTpjb250 + ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiYnl0ZXMi + OiJleUpqYjI1MFpXNTBRbXh2WTJ0VGRHOXdJanA3SW1OdmJuUmxiblJDYkc5amEwbHVaR1Y0SWpv + eGZYMD0iLCJwIjoiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERSJ9jdOkZgAAAPAAAABL + zBgXLAs6ZXZlbnQtdHlwZQcABWNodW5rDTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29u + DTptZXNzYWdlLXR5cGUHAAVldmVudHsiYnl0ZXMiOiJleUpqYjI1MFpXNTBRbXh2WTJ0RVpXeDBZ + U0k2ZXlKa1pXeDBZU0k2ZXlKMFpYaDBJam9pSUdFaWZTd2lZMjl1ZEdWdWRFSnNiMk5yU1c1a1pY + Z2lPako5ZlE9PSIsInAiOiJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTCJ9 + ruuoXwAAALYAAABLG6u6xQs6ZXZlbnQtdHlwZQcABWNodW5rDTpjb250ZW50LXR5cGUHABBhcHBs + aWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiYnl0ZXMiOiJleUpqYjI1MFpXNTBR + bXh2WTJ0VGRHOXdJanA3SW1OdmJuUmxiblJDYkc5amEwbHVaR1Y0SWpveWZYMD0iLCJwIjoiYWJj + ZGVmZ2hpamtsIn2fJhOOAAAA5wAAAEse2Fy+CzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQt + dHlwZQcAEGFwcGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5 + SmpiMjUwWlc1MFFteHZZMnRFWld4MFlTSTZleUprWld4MFlTSTZleUowWlhoMElqb2lJSFJsYzNR + aWZTd2lZMjl1ZEdWdWRFSnNiMk5yU1c1a1pYZ2lPak45ZlE9PSIsInAiOiJhYmNkZWZnaGlqa2xt + bm9wcXJzdHV2d3h5In3/2HgbAAAA1AAAAEv4WZ7oCzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRl + bnQtdHlwZQcAEGFwcGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6 + ImV5SmpiMjUwWlc1MFFteHZZMnRUZEc5d0lqcDdJbU52Ym5SbGJuUkNiRzlqYTBsdVpHVjRJam96 + ZlgwPSIsInAiOiJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1AifcsN + PjAAAADwAAAAS8wYFywLOmV2ZW50LXR5cGUHAAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGlj + YXRpb24vanNvbg06bWVzc2FnZS10eXBlBwAFZXZlbnR7ImJ5dGVzIjoiZXlKamIyNTBaVzUwUW14 + dlkydEVaV3gwWVNJNmV5SmtaV3gwWVNJNmV5SjBaWGgwSWpvaUlHRm5ZV2x1SW4wc0ltTnZiblJs + Ym5SQ2JHOWphMGx1WkdWNElqbzBmWDA9IiwicCI6ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6 + QUJDREVGR0gifaIdtT0AAADcAAAAS8gp1SkLOmV2ZW50LXR5cGUHAAVjaHVuaw06Y29udGVudC10 + eXBlBwAQYXBwbGljYXRpb24vanNvbg06bWVzc2FnZS10eXBlBwAFZXZlbnR7ImJ5dGVzIjoiZXlK + amIyNTBaVzUwUW14dlkydFRkRzl3SWpwN0ltTnZiblJsYm5SQ2JHOWphMGx1WkdWNElqbzBmWDA9 + IiwicCI6ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldY + In3Z8oGWAAAA1gAAAEuCmc2ICzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFw + cGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SmpiMjUwWlc1 + MFFteHZZMnRFWld4MFlTSTZleUprWld4MFlTSTZleUowWlhoMElqb2lMaUo5TENKamIyNTBaVzUw + UW14dlkydEpibVJsZUNJNk5YMTkiLCJwIjoiYWJjZGVmZ2hpamtsbW5vcCJ9ex1DVwAAAMIAAABL + F/n8ygs6ZXZlbnQtdHlwZQcABWNodW5rDTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29u + DTptZXNzYWdlLXR5cGUHAAVldmVudHsiYnl0ZXMiOiJleUpqYjI1MFpXNTBRbXh2WTJ0VGRHOXdJ + anA3SW1OdmJuUmxiblJDYkc5amEwbHVaR1Y0SWpvMWZYMD0iLCJwIjoiYWJjZGVmZ2hpamtsbW5v + cHFyc3R1dnd4In2llAWqAAAA3QAAAEv1SfyZCzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQt + dHlwZQcAEGFwcGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5 + SmpiMjUwWlc1MFFteHZZMnRFWld4MFlTSTZleUprWld4MFlTSTZleUowWlhoMElqb2lJRWxtSW4w + c0ltTnZiblJsYm5SQ2JHOWphMGx1WkdWNElqbzJmWDA9IiwicCI6ImFiY2RlZmdoaWprbG1ub3Bx + cnMifT/cYeQAAADjAAAAS+tY+n4LOmV2ZW50LXR5cGUHAAVjaHVuaw06Y29udGVudC10eXBlBwAQ + YXBwbGljYXRpb24vanNvbg06bWVzc2FnZS10eXBlBwAFZXZlbnR7ImJ5dGVzIjoiZXlKamIyNTBa + VzUwUW14dlkydFRkRzl3SWpwN0ltTnZiblJsYm5SQ2JHOWphMGx1WkdWNElqbzJmWDA9IiwicCI6 + ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIz + NCJ9ttyqAgAAANoAAABLR2kgiQs6ZXZlbnQtdHlwZQcABWNodW5rDTpjb250ZW50LXR5cGUHABBh + cHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiYnl0ZXMiOiJleUpqYjI1MFpX + NTBRbXh2WTJ0RVpXeDBZU0k2ZXlKa1pXeDBZU0k2ZXlKMFpYaDBJam9pSUhsdmRTSjlMQ0pqYjI1 + MFpXNTBRbXh2WTJ0SmJtUmxlQ0k2TjMxOSIsInAiOiJhYmNkZWZnaGlqa2xtbm9wIn3JnmorAAAA + ygAAAEsnibcLCzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0aW9u + L2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SmpiMjUwWlc1MFFteHZZMnRU + ZEc5d0lqcDdJbU52Ym5SbGJuUkNiRzlqYTBsdVpHVjRJam8zZlgwPSIsInAiOiJhYmNkZWZnaGlq + a2xtbm9wcXJzdHV2d3h5ekFCQ0RFRiJ9jsN0TAAAAP4AAABLcyipTQs6ZXZlbnQtdHlwZQcABWNo + dW5rDTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVu + dHsiYnl0ZXMiOiJleUpqYjI1MFpXNTBRbXh2WTJ0RVpXeDBZU0k2ZXlKa1pXeDBZU0k2ZXlKMFpY + aDBJam9pSUc1bFpXUWlmU3dpWTI5dWRHVnVkRUpzYjJOclNXNWtaWGdpT2poOWZRPT0iLCJwIjoi + YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWIn0GwPyfAAAA + xwAAAEvfGXO6CzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0aW9u + L2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SmpiMjUwWlc1MFFteHZZMnRU + ZEc5d0lqcDdJbU52Ym5SbGJuUkNiRzlqYTBsdVpHVjRJam80ZlgwPSIsInAiOiJhYmNkZWZnaGlq + a2xtbm9wcXJzdHV2d3h5ekFCQyJ9PFvNGQAAANQAAABL+Fme6As6ZXZlbnQtdHlwZQcABWNodW5r + DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsi + Ynl0ZXMiOiJleUpqYjI1MFpXNTBRbXh2WTJ0RVpXeDBZU0k2ZXlKa1pXeDBZU0k2ZXlKMFpYaDBJ + am9pSUdGdWVTSjlMQ0pqYjI1MFpXNTBRbXh2WTJ0SmJtUmxlQ0k2T1gxOSIsInAiOiJhYmNkZWZn + aGlqIn1/oYekAAAA1AAAAEv4WZ7oCzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcA + EGFwcGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SmpiMjUw + Wlc1MFFteHZZMnRUZEc5d0lqcDdJbU52Ym5SbGJuUkNiRzlqYTBsdVpHVjRJam81ZlgwPSIsInAi + OiJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1AifX/ON2kAAACtAAAA + SwybHFYLOmV2ZW50LXR5cGUHAAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGljYXRpb24vanNv + bg06bWVzc2FnZS10eXBlBwAFZXZlbnR7ImJ5dGVzIjoiZXlKdFpYTnpZV2RsVTNSdmNDSTZleUp6 + ZEc5d1VtVmhjMjl1SWpvaWJXRjRYM1J2YTJWdWN5SjlmUT09IiwicCI6ImFiYyJ9Hvkn7gAAAjYA + AABL54WrXAs6ZXZlbnQtdHlwZQcABWNodW5rDTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9q + c29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiYnl0ZXMiOiJleUp0WlhSaFpHRjBZU0k2ZXlKMWMy + Rm5aU0k2ZXlKcGJuQjFkRlJ2YTJWdWN5STZNalVzSW05MWRIQjFkRlJ2YTJWdWN5STZNVEFzSW1O + aFkyaGxVbVZoWkVsdWNIVjBWRzlyWlc1RGIzVnVkQ0k2TUN3aVkyRmphR1ZYY21sMFpVbHVjSFYw + Vkc5clpXNURiM1Z1ZENJNk1IMHNJbTFsZEhKcFkzTWlPbnQ5TENKMGNtRmpaU0k2ZTMxOUxDSmhi + V0Y2YjI0dFltVmtjbTlqYXkxcGJuWnZZMkYwYVc5dVRXVjBjbWxqY3lJNmV5SnBibkIxZEZSdmEy + VnVRMjkxYm5RaU9qSTFMQ0p2ZFhSd2RYUlViMnRsYmtOdmRXNTBJam94TUN3aWFXNTJiMk5oZEds + dmJreGhkR1Z1WTNraU9qRTVOeXdpWm1seWMzUkNlWFJsVEdGMFpXNWplU0k2TnpJc0ltTmhZMmhs + VW1WaFpFbHVjSFYwVkc5clpXNURiM1Z1ZENJNk1Dd2lZMkZqYUdWWGNtbDBaVWx1Y0hWMFZHOXJa + VzVEYjNWdWRDSTZNSDE5IiwicCI6ImFiY2RlZmdoaWprbG1ub3BxcnN0In2+XMjJ + headers: + Connection: + - keep-alive + Content-Type: + - application/vnd.amazon.eventstream + Date: + - Thu, 13 Feb 2025 14:11:43 GMT + Set-Cookie: test_set_cookie + Transfer-Encoding: + - chunked + X-Amzn-Bedrock-Content-Type: + - application/json + x-amzn-RequestId: + - 406cb91b-9ad8-4309-baf1-769a289b7df1 + status: + code: 200 + message: OK +version: 1 diff --git a/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_response_stream_with_content_different_events[anthropic.claude].yaml b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_response_stream_with_content_different_events[anthropic.claude].yaml new file mode 100644 index 0000000000..25949e553d --- /dev/null +++ b/instrumentation/opentelemetry-instrumentation-botocore/tests/cassettes/test_invoke_model_with_response_stream_with_content_different_events[anthropic.claude].yaml @@ -0,0 +1,124 @@ +interactions: +- request: + body: |- + { + "messages": [ + { + "role": "user", + "content": [ + { + "text": "Say this is a test", + "type": "text" + } + ] + }, + { + "role": "assistant", + "content": [ + { + "text": "This is a test", + "type": "text" + } + ] + }, + { + "role": "user", + "content": [ + { + "text": "Say again this is a test", + "type": "text" + } + ] + } + ], + "anthropic_version": "bedrock-2023-05-31", + "system": "You are a friendly model", + "max_tokens": 10 + } + headers: + Content-Length: + - '357' + User-Agent: + - Boto3/1.35.56 md/Botocore#1.35.56 ua/2.0 os/linux#6.1.0-1034-oem md/arch#x86_64 + lang/python#3.10.12 md/pyimpl#CPython cfg/retry-mode#legacy Botocore/1.35.56 + X-Amz-Date: + - 20250213T141143Z + X-Amz-Security-Token: + - test_aws_security_token + X-Amzn-Trace-Id: + - Root=1-a7421915-90c1cf280ff1d9482f772c88;Parent=9b34e4bcd8b69db4;Sampled=1 + amz-sdk-invocation-id: + - f8aca0ab-34a1-4185-9551-b5d28c4e0be9 + amz-sdk-request: + - attempt=1 + authorization: + - Bearer test_aws_authorization + method: POST + uri: https://bedrock-runtime.us-east-1.amazonaws.com/model/anthropic.claude-v2/invoke-with-response-stream + response: + body: + string: !!binary | + AAABtwAAAEvtl0DQCzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0 + aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SjBlWEJsSWpvaWJXVnpj + MkZuWlY5emRHRnlkQ0lzSW0xbGMzTmhaMlVpT25zaWFXUWlPaUp0YzJkZlltUnlhMTh3TVUweWFr + TjNWbE5tZDFkaldFRnlaME5UZVRodE1XWWlMQ0owZVhCbElqb2liV1Z6YzJGblpTSXNJbkp2YkdV + aU9pSmhjM05wYzNSaGJuUWlMQ0p0YjJSbGJDSTZJbU5zWVhWa1pTMHlMakFpTENKamIyNTBaVzUw + SWpwYlhTd2ljM1J2Y0Y5eVpXRnpiMjRpT201MWJHd3NJbk4wYjNCZmMyVnhkV1Z1WTJVaU9tNTFi + R3dzSW5WellXZGxJanA3SW1sdWNIVjBYM1J2YTJWdWN5STZNemNzSW05MWRIQjFkRjkwYjJ0bGJu + TWlPakY5ZlgwPSIsInAiOiJhYmNkZWZnaGlqa2xtbm9wcSJ9c5WqNgAAAPcAAABLfjjLPAs6ZXZl + bnQtdHlwZQcABWNodW5rDTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdl + LXR5cGUHAAVldmVudHsiYnl0ZXMiOiJleUowZVhCbElqb2lZMjl1ZEdWdWRGOWliRzlqYTE5emRH + RnlkQ0lzSW1sdVpHVjRJam93TENKamIyNTBaVzUwWDJKc2IyTnJJanA3SW5SNWNHVWlPaUowWlho + MElpd2lkR1Y0ZENJNklpSjlmUT09IiwicCI6ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHkifXQG + 3pQAAAEFAAAAS4eQG6QLOmV2ZW50LXR5cGUHAAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGlj + YXRpb24vanNvbg06bWVzc2FnZS10eXBlBwAFZXZlbnR7ImJ5dGVzIjoiZXlKMGVYQmxJam9pWTI5 + dWRHVnVkRjlpYkc5amExOWtaV3gwWVNJc0ltbHVaR1Y0SWpvd0xDSmtaV3gwWVNJNmV5SjBlWEJs + SWpvaWRHVjRkRjlrWld4MFlTSXNJblJsZUhRaU9pSlVhR2x6SW4xOSIsInAiOiJhYmNkZWZnaGlq + a2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE0iffHQpi0AAAEaAAAAS2UgG/cLOmV2ZW50LXR5 + cGUHAAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGljYXRpb24vanNvbg06bWVzc2FnZS10eXBl + BwAFZXZlbnR7ImJ5dGVzIjoiZXlKMGVYQmxJam9pWTI5dWRHVnVkRjlpYkc5amExOWtaV3gwWVNJ + c0ltbHVaR1Y0SWpvd0xDSmtaV3gwWVNJNmV5SjBlWEJsSWpvaWRHVjRkRjlrWld4MFlTSXNJblJs + ZUhRaU9pSWdhWE1pZlgwPSIsInAiOiJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdI + SUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1NjcifYA9TRcAAAEGAAAAS8AwYXQLOmV2ZW50LXR5cGUH + AAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGljYXRpb24vanNvbg06bWVzc2FnZS10eXBlBwAF + ZXZlbnR7ImJ5dGVzIjoiZXlKMGVYQmxJam9pWTI5dWRHVnVkRjlpYkc5amExOWtaV3gwWVNJc0lt + bHVaR1Y0SWpvd0xDSmtaV3gwWVNJNmV5SjBlWEJsSWpvaWRHVjRkRjlrWld4MFlTSXNJblJsZUhR + aU9pSWdZU0o5ZlE9PSIsInAiOiJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpL + TE1OIn26R/hGAAABDQAAAEu34FBlCzpldmVudC10eXBlBwAFY2h1bmsNOmNvbnRlbnQtdHlwZQcA + EGFwcGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRlcyI6ImV5SjBlWEJs + SWpvaVkyOXVkR1Z1ZEY5aWJHOWphMTlrWld4MFlTSXNJbWx1WkdWNElqb3dMQ0prWld4MFlTSTZl + eUowZVhCbElqb2lkR1Y0ZEY5a1pXeDBZU0lzSW5SbGVIUWlPaUlnZEdWemRDSjlmUT09IiwicCI6 + ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFEifUsoqQQAAADHAAAA + S98Zc7oLOmV2ZW50LXR5cGUHAAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGljYXRpb24vanNv + bg06bWVzc2FnZS10eXBlBwAFZXZlbnR7ImJ5dGVzIjoiZXlKMGVYQmxJam9pWTI5dWRHVnVkRjlp + Ykc5amExOXpkRzl3SWl3aWFXNWtaWGdpT2pCOSIsInAiOiJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2 + d3h5ekFCQ0RFRkdISUpLIn289g6LAAABLgAAAEsxgQWxCzpldmVudC10eXBlBwAFY2h1bmsNOmNv + bnRlbnQtdHlwZQcAEGFwcGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJieXRl + cyI6ImV5SjBlWEJsSWpvaWJXVnpjMkZuWlY5a1pXeDBZU0lzSW1SbGJIUmhJanA3SW5OMGIzQmZj + bVZoYzI5dUlqb2laVzVrWDNSMWNtNGlMQ0p6ZEc5d1gzTmxjWFZsYm1ObElqcHVkV3hzZlN3aWRY + TmhaMlVpT25zaWIzVjBjSFYwWDNSdmEyVnVjeUk2T0gxOSIsInAiOiJhYmNkZWZnaGlqa2xtbm9w + cXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVYifezNQVkAAAFWAAAAS/gjrr8LOmV2ZW50 + LXR5cGUHAAVjaHVuaw06Y29udGVudC10eXBlBwAQYXBwbGljYXRpb24vanNvbg06bWVzc2FnZS10 + eXBlBwAFZXZlbnR7ImJ5dGVzIjoiZXlKMGVYQmxJam9pYldWemMyRm5aVjl6ZEc5d0lpd2lZVzFo + ZW05dUxXSmxaSEp2WTJzdGFXNTJiMk5oZEdsdmJrMWxkSEpwWTNNaU9uc2lhVzV3ZFhSVWIydGxi + a052ZFc1MElqb3pOeXdpYjNWMGNIVjBWRzlyWlc1RGIzVnVkQ0k2T0N3aWFXNTJiMk5oZEdsdmJr + eGhkR1Z1WTNraU9qUXpNaXdpWm1seWMzUkNlWFJsVEdGMFpXNWplU0k2TXpVNGZYMD0iLCJwIjoi + YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUYifYwQjVc= + headers: + Connection: + - keep-alive + Content-Type: + - application/vnd.amazon.eventstream + Date: + - Thu, 13 Feb 2025 14:11:44 GMT + Set-Cookie: test_set_cookie + Transfer-Encoding: + - chunked + X-Amzn-Bedrock-Content-Type: + - application/json + x-amzn-RequestId: + - 2423a140-3984-4d26-8741-1484ad05d541 + status: + code: 200 + message: OK +version: 1 diff --git a/instrumentation/opentelemetry-instrumentation-botocore/tests/test_botocore_bedrock.py b/instrumentation/opentelemetry-instrumentation-botocore/tests/test_botocore_bedrock.py index 24a30eedc7..57d3697254 100644 --- a/instrumentation/opentelemetry-instrumentation-botocore/tests/test_botocore_bedrock.py +++ b/instrumentation/opentelemetry-instrumentation-botocore/tests/test_botocore_bedrock.py @@ -12,6 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +# pylint:disable=too-many-lines + from __future__ import annotations import json @@ -83,6 +85,87 @@ def test_converse_with_content( assert_message_in_logs(logs[0], "gen_ai.user.message", user_content, span) +@pytest.mark.skipif( + BOTO3_VERSION < (1, 35, 56), reason="Converse API not available" +) +@pytest.mark.vcr() +def test_converse_with_content_different_events( + span_exporter, + log_exporter, + bedrock_runtime_client, + instrument_with_content, +): + # pylint:disable=too-many-locals + messages = anthropic_claude_converse_messages() + llm_model_value = "anthropic.claude-v2" + system_content = anthropic_claude_converse_system() + response = bedrock_runtime_client.converse( + system=system_content, + messages=messages, + modelId=llm_model_value, + ) + + (span,) = span_exporter.get_finished_spans() + assert_converse_completion_attributes( + span, + llm_model_value, + response, + "chat", + ) + + logs = log_exporter.get_finished_logs() + assert len(logs) == 4 + assert_message_in_logs( + logs[0], "gen_ai.system.message", {"content": system_content}, span + ) + user_message, assistant_message, last_user_message = messages + user_content = filter_message_keys(user_message, ["content"]) + assert_message_in_logs(logs[1], "gen_ai.user.message", user_content, span) + assistant_content = filter_message_keys(assistant_message, ["content"]) + assert_message_in_logs( + logs[2], "gen_ai.assistant.message", assistant_content, span + ) + last_user_content = filter_message_keys(last_user_message, ["content"]) + assert_message_in_logs( + logs[3], "gen_ai.user.message", last_user_content, span + ) + + +@pytest.mark.skipif( + BOTO3_VERSION < (1, 35, 56), reason="Converse API not available" +) +@pytest.mark.vcr() +def test_converse_no_content_different_events( + span_exporter, + log_exporter, + bedrock_runtime_client, + instrument_no_content, +): + messages = anthropic_claude_converse_messages() + llm_model_value = "anthropic.claude-v2" + system_content = anthropic_claude_converse_system() + response = bedrock_runtime_client.converse( + system=system_content, + messages=messages, + modelId=llm_model_value, + ) + + (span,) = span_exporter.get_finished_spans() + assert_converse_completion_attributes( + span, + llm_model_value, + response, + "chat", + ) + + logs = log_exporter.get_finished_logs() + assert len(logs) == 4 + assert_message_in_logs(logs[0], "gen_ai.system.message", None, span) + assert_message_in_logs(logs[1], "gen_ai.user.message", None, span) + assert_message_in_logs(logs[2], "gen_ai.assistant.message", None, span) + assert_message_in_logs(logs[3], "gen_ai.user.message", None, span) + + @pytest.mark.skipif( BOTO3_VERSION < (1, 35, 56), reason="Converse API not available" ) @@ -225,6 +308,58 @@ def test_converse_stream_with_content( assert_message_in_logs(logs[0], "gen_ai.user.message", user_content, span) +@pytest.mark.skipif( + BOTO3_VERSION < (1, 35, 56), reason="ConverseStream API not available" +) +@pytest.mark.vcr() +def test_converse_stream_with_content_different_events( + span_exporter, + log_exporter, + bedrock_runtime_client, + instrument_with_content, +): + # pylint:disable=too-many-locals + messages = anthropic_claude_converse_messages() + llm_model_value = "anthropic.claude-v2" + system_content = anthropic_claude_converse_system() + response = bedrock_runtime_client.converse_stream( + system=system_content, + messages=messages, + modelId=llm_model_value, + ) + + # consume the stream in order to have it traced + for _ in response["stream"]: + pass + + (span,) = span_exporter.get_finished_spans() + assert_stream_completion_attributes( + span, + llm_model_value, + input_tokens=mock.ANY, + output_tokens=mock.ANY, + finish_reason=("end_turn",), + operation_name="chat", + ) + + logs = log_exporter.get_finished_logs() + assert len(logs) == 4 + assert_message_in_logs( + logs[0], "gen_ai.system.message", {"content": system_content}, span + ) + user_message, assistant_message, last_user_message = messages + user_content = filter_message_keys(user_message, ["content"]) + assert_message_in_logs(logs[1], "gen_ai.user.message", user_content, span) + assistant_content = filter_message_keys(assistant_message, ["content"]) + assert_message_in_logs( + logs[2], "gen_ai.assistant.message", assistant_content, span + ) + last_user_content = filter_message_keys(last_user_message, ["content"]) + assert_message_in_logs( + logs[3], "gen_ai.user.message", last_user_content, span + ) + + @pytest.mark.skipif( BOTO3_VERSION < (1, 35, 56), reason="ConverseStream API not available" ) @@ -289,6 +424,47 @@ def test_converse_stream_no_content( assert_message_in_logs(logs[0], "gen_ai.user.message", None, span) +@pytest.mark.skipif( + BOTO3_VERSION < (1, 35, 56), reason="ConverseStream API not available" +) +@pytest.mark.vcr() +def test_converse_stream_no_content_different_events( + span_exporter, + log_exporter, + bedrock_runtime_client, + instrument_no_content, +): + messages = anthropic_claude_converse_messages() + llm_model_value = "anthropic.claude-v2" + system_content = anthropic_claude_converse_system() + response = bedrock_runtime_client.converse_stream( + system=system_content, + messages=messages, + modelId=llm_model_value, + ) + + # consume the stream in order to have it traced + for _ in response["stream"]: + pass + + (span,) = span_exporter.get_finished_spans() + assert_stream_completion_attributes( + span, + llm_model_value, + input_tokens=mock.ANY, + output_tokens=mock.ANY, + finish_reason=("end_turn",), + operation_name="chat", + ) + + logs = log_exporter.get_finished_logs() + assert len(logs) == 4 + assert_message_in_logs(logs[0], "gen_ai.system.message", None, span) + assert_message_in_logs(logs[1], "gen_ai.user.message", None, span) + assert_message_in_logs(logs[2], "gen_ai.assistant.message", None, span) + assert_message_in_logs(logs[3], "gen_ai.user.message", None, span) + + @pytest.mark.skipif( BOTO3_VERSION < (1, 35, 56), reason="ConverseStream API not available" ) @@ -391,6 +567,8 @@ def get_invoke_model_body( temperature=None, top_p=None, stop_sequences=None, + system=None, + messages=None, ): def set_if_not_none(config, key, value): if value is not None: @@ -404,10 +582,14 @@ def set_if_not_none(config, key, value): set_if_not_none(config, "topP", top_p) set_if_not_none(config, "stopSequences", stop_sequences) body = { - "messages": [{"role": "user", "content": [{"text": prompt}]}], + "messages": messages + if messages + else [{"role": "user", "content": [{"text": prompt}]}], "inferenceConfig": config, "schemaVersion": "messages-v1", } + if system: + body["system"] = system elif llm_model == "amazon.titan-text-lite-v1": config = {} set_if_not_none(config, "maxTokenCount", max_tokens) @@ -417,11 +599,15 @@ def set_if_not_none(config, key, value): body = {"inputText": prompt, "textGenerationConfig": config} elif llm_model == "anthropic.claude-v2": body = { - "messages": [ + "messages": messages + if messages + else [ {"role": "user", "content": [{"text": prompt, "type": "text"}]} ], "anthropic_version": "bedrock-2023-05-31", } + if system: + body["system"] = system set_if_not_none(body, "max_tokens", max_tokens) set_if_not_none(body, "temperature", temperature) set_if_not_none(body, "top_p", top_p) @@ -486,6 +672,69 @@ def test_invoke_model_with_content( assert_message_in_logs(logs[0], "gen_ai.user.message", user_content, span) +@pytest.mark.parametrize( + "model_family", + ["amazon.nova", "anthropic.claude"], +) +@pytest.mark.vcr() +def test_invoke_model_with_content_different_events( + span_exporter, + log_exporter, + bedrock_runtime_client, + instrument_with_content, + model_family, +): + # pylint:disable=too-many-locals + llm_model_value = get_model_name_from_family(model_family) + max_tokens = 10 + if llm_model_value == "amazon.nova-micro-v1:0": + messages = amazon_nova_messages() + system = amazon_nova_system() + elif llm_model_value == "anthropic.claude-v2": + messages = anthropic_claude_messages() + system = anthropic_claude_system() + + body = get_invoke_model_body( + llm_model_value, + system=system, + messages=messages, + max_tokens=max_tokens, + ) + response = bedrock_runtime_client.invoke_model( + body=body, + modelId=llm_model_value, + ) + + (span,) = span_exporter.get_finished_spans() + assert_completion_attributes_from_streaming_body( + span, + llm_model_value, + response, + "chat", + request_max_tokens=max_tokens, + ) + + logs = log_exporter.get_finished_logs() + assert len(logs) == 4 + assert_message_in_logs( + logs[0], + "gen_ai.system.message", + {"content": [{"text": "You are a friendly model"}]}, + span, + ) + user_message, assistant_message, last_user_message = messages + user_content = filter_message_keys(user_message, ["content"]) + assert_message_in_logs(logs[1], "gen_ai.user.message", user_content, span) + assistant_content = filter_message_keys(assistant_message, ["content"]) + assert_message_in_logs( + logs[2], "gen_ai.assistant.message", assistant_content, span + ) + last_user_content = filter_message_keys(last_user_message, ["content"]) + assert_message_in_logs( + logs[3], "gen_ai.user.message", last_user_content, span + ) + + @pytest.mark.parametrize( "model_family", ["amazon.nova", "amazon.titan", "anthropic.claude"], @@ -525,6 +774,55 @@ def test_invoke_model_no_content( assert_message_in_logs(logs[0], "gen_ai.user.message", None, span) +@pytest.mark.parametrize( + "model_family", + ["amazon.nova", "anthropic.claude"], +) +@pytest.mark.vcr() +def test_invoke_model_no_content_different_events( + span_exporter, + log_exporter, + bedrock_runtime_client, + instrument_no_content, + model_family, +): + llm_model_value = get_model_name_from_family(model_family) + max_tokens = 10 + if llm_model_value == "amazon.nova-micro-v1:0": + messages = amazon_nova_messages() + system = amazon_nova_system() + elif llm_model_value == "anthropic.claude-v2": + messages = anthropic_claude_messages() + system = anthropic_claude_system() + + body = get_invoke_model_body( + llm_model_value, + max_tokens=max_tokens, + system=system, + messages=messages, + ) + response = bedrock_runtime_client.invoke_model( + body=body, + modelId=llm_model_value, + ) + + (span,) = span_exporter.get_finished_spans() + assert_completion_attributes_from_streaming_body( + span, + llm_model_value, + response, + "chat", + request_max_tokens=max_tokens, + ) + + logs = log_exporter.get_finished_logs() + assert len(logs) == 4 + assert_message_in_logs(logs[0], "gen_ai.system.message", None, span) + assert_message_in_logs(logs[1], "gen_ai.user.message", None, span) + assert_message_in_logs(logs[2], "gen_ai.assistant.message", None, span) + assert_message_in_logs(logs[3], "gen_ai.user.message", None, span) + + @pytest.mark.vcr() def test_invoke_model_with_invalid_model( span_exporter, @@ -647,6 +945,221 @@ def test_invoke_model_with_response_stream_with_content( assert_message_in_logs(logs[0], "gen_ai.user.message", user_content, span) +@pytest.mark.parametrize( + "model_family", + ["amazon.nova", "anthropic.claude"], +) +@pytest.mark.vcr() +def test_invoke_model_with_response_stream_with_content_different_events( + span_exporter, + log_exporter, + bedrock_runtime_client, + instrument_with_content, + model_family, +): + # pylint:disable=too-many-locals + llm_model_value = get_model_name_from_family(model_family) + if llm_model_value == "amazon.nova-micro-v1:0": + messages = amazon_nova_messages() + system = amazon_nova_system() + finish_reason = "max_tokens" + elif llm_model_value == "anthropic.claude-v2": + messages = anthropic_claude_messages() + system = anthropic_claude_system() + finish_reason = "end_turn" + + max_tokens = 10 + body = get_invoke_model_body( + llm_model_value, + system=system, + messages=messages, + max_tokens=max_tokens, + ) + response = bedrock_runtime_client.invoke_model_with_response_stream( + body=body, + modelId=llm_model_value, + ) + + # consume the stream in order to have it traced + for _ in response["body"]: + pass + + (span,) = span_exporter.get_finished_spans() + assert_stream_completion_attributes( + span, + llm_model_value, + input_tokens=mock.ANY, + output_tokens=mock.ANY, + request_max_tokens=max_tokens, + finish_reason=(finish_reason,), + operation_name="chat", + ) + + logs = log_exporter.get_finished_logs() + assert len(logs) == 4 + assert_message_in_logs( + logs[0], + "gen_ai.system.message", + {"content": [{"text": "You are a friendly model"}]}, + span, + ) + user_message, assistant_message, last_user_message = messages + user_content = filter_message_keys(user_message, ["content"]) + assert_message_in_logs(logs[1], "gen_ai.user.message", user_content, span) + assistant_content = filter_message_keys(assistant_message, ["content"]) + assert_message_in_logs( + logs[2], "gen_ai.assistant.message", assistant_content, span + ) + last_user_content = filter_message_keys(last_user_message, ["content"]) + assert_message_in_logs( + logs[3], "gen_ai.user.message", last_user_content, span + ) + + +@pytest.mark.parametrize( + "model_family", + ["amazon.nova", "amazon.titan", "anthropic.claude"], +) +@pytest.mark.vcr() +def test_invoke_model_with_response_stream_no_content( + span_exporter, + log_exporter, + bedrock_runtime_client, + instrument_no_content, + model_family, +): + # pylint:disable=too-many-locals,too-many-branches + llm_model_value = get_model_name_from_family(model_family) + max_tokens, temperature, top_p, stop_sequences = 10, 0.8, 1, ["|"] + body = get_invoke_model_body( + llm_model_value, max_tokens, temperature, top_p, stop_sequences + ) + response = bedrock_runtime_client.invoke_model_with_response_stream( + body=body, + modelId=llm_model_value, + ) + + # consume the stream in order to have it traced + finish_reason = None + input_tokens, output_tokens = None, None + text = "" + for event in response["body"]: + json_bytes = event["chunk"].get("bytes", b"") + decoded = json_bytes.decode("utf-8") + chunk = json.loads(decoded) + + # amazon.titan + if (stop_reason := chunk.get("completionReason")) is not None: + finish_reason = stop_reason + + if (output_text := chunk.get("outputText")) is not None: + text += output_text + + # amazon.titan, anthropic.claude + if invocation_metrics := chunk.get("amazon-bedrock-invocationMetrics"): + input_tokens = invocation_metrics["inputTokenCount"] + output_tokens = invocation_metrics["outputTokenCount"] + + # anthropic.claude + if (message_type := chunk.get("type")) is not None: + if message_type == "content_block_start": + text += chunk["content_block"]["text"] + elif message_type == "content_block_delta": + text += chunk["delta"]["text"] + elif message_type == "message_delta": + finish_reason = chunk["delta"]["stop_reason"] + + # amazon nova + if "contentBlockDelta" in chunk: + text += chunk["contentBlockDelta"]["delta"]["text"] + if "messageStop" in chunk: + finish_reason = chunk["messageStop"]["stopReason"] + if "metadata" in chunk: + usage = chunk["metadata"]["usage"] + input_tokens = usage["inputTokens"] + output_tokens = usage["outputTokens"] + + assert text + assert finish_reason + assert input_tokens + assert output_tokens + + (span,) = span_exporter.get_finished_spans() + assert_stream_completion_attributes( + span, + llm_model_value, + input_tokens, + output_tokens, + (finish_reason,), + "text_completion" if model_family == "amazon.titan" else "chat", + top_p, + temperature, + max_tokens, + stop_sequences, + ) + + logs = log_exporter.get_finished_logs() + assert len(logs) == 1 + assert_message_in_logs(logs[0], "gen_ai.user.message", None, span) + + +@pytest.mark.parametrize( + "model_family", + ["amazon.nova", "anthropic.claude"], +) +@pytest.mark.vcr() +def test_invoke_model_with_response_stream_no_content_different_events( + span_exporter, + log_exporter, + bedrock_runtime_client, + instrument_no_content, + model_family, +): + llm_model_value = get_model_name_from_family(model_family) + if llm_model_value == "amazon.nova-micro-v1:0": + messages = amazon_nova_messages() + system = amazon_nova_system() + finish_reason = "max_tokens" + elif llm_model_value == "anthropic.claude-v2": + messages = anthropic_claude_messages() + system = anthropic_claude_system() + finish_reason = "end_turn" + + max_tokens = 10 + body = get_invoke_model_body( + llm_model_value, + system=system, + messages=messages, + max_tokens=max_tokens, + ) + response = bedrock_runtime_client.invoke_model_with_response_stream( + body=body, + modelId=llm_model_value, + ) + + # consume the stream in order to have it traced + for _ in response["body"]: + pass + + (span,) = span_exporter.get_finished_spans() + assert_stream_completion_attributes( + span, + llm_model_value, + input_tokens=mock.ANY, + output_tokens=mock.ANY, + request_max_tokens=max_tokens, + finish_reason=(finish_reason,), + operation_name="chat", + ) + + logs = log_exporter.get_finished_logs() + assert len(logs) == 4 + assert_message_in_logs(logs[0], "gen_ai.system.message", None, span) + assert_message_in_logs(logs[1], "gen_ai.user.message", None, span) + assert_message_in_logs(logs[2], "gen_ai.assistant.message", None, span) + assert_message_in_logs(logs[3], "gen_ai.user.message", None, span) + + @pytest.mark.vcr() def test_invoke_model_with_response_stream_handles_stream_error( span_exporter, @@ -672,7 +1185,7 @@ def test_invoke_model_with_response_stream_handles_stream_error( EventStream, "_parse_event", side_effect=EventStreamError( - {"modelStreamErrorException": {}}, "InvokeModelWithRespnseStream" + {"modelStreamErrorException": {}}, "InvokeModelWithResponseStream" ), ): with pytest.raises(EventStreamError): @@ -726,3 +1239,49 @@ def test_invoke_model_with_response_stream_invalid_model( logs = log_exporter.get_finished_logs() assert len(logs) == 0 + + +def amazon_nova_messages(): + return [ + {"role": "user", "content": [{"text": "Say this is a test"}]}, + {"role": "assistant", "content": [{"text": "This is a test"}]}, + { + "role": "user", + "content": [{"text": "Say again this is a test"}], + }, + ] + + +def amazon_nova_system(): + return [ + {"text": "You are a friendly model"}, + ] + + +def anthropic_claude_converse_messages(): + return amazon_nova_messages() + + +def anthropic_claude_converse_system(): + return amazon_nova_system() + + +def anthropic_claude_messages(): + return [ + { + "role": "user", + "content": [{"text": "Say this is a test", "type": "text"}], + }, + { + "role": "assistant", + "content": [{"text": "This is a test", "type": "text"}], + }, + { + "role": "user", + "content": [{"text": "Say again this is a test", "type": "text"}], + }, + ] + + +def anthropic_claude_system(): + return "You are a friendly model"