Skip to content

botocore: handle system messages events #3266

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Feb 14, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Loading