Skip to content

Commit aea824a

Browse files
feat(openai-agents): Truncate long messages
1 parent 98e3148 commit aea824a

File tree

3 files changed

+70
-12
lines changed

3 files changed

+70
-12
lines changed

sentry_sdk/integrations/openai_agents/spans/invoke_agent.py

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
get_start_span_function,
44
set_data_normalized,
55
normalize_message_roles,
6+
truncate_and_annotate_messages,
67
)
78
from sentry_sdk.consts import OP, SPANDATA
89
from sentry_sdk.scope import should_send_default_pii
@@ -61,12 +62,17 @@ def invoke_agent_span(context, agent, kwargs):
6162

6263
if len(messages) > 0:
6364
normalized_messages = normalize_message_roles(messages)
64-
set_data_normalized(
65-
span,
66-
SPANDATA.GEN_AI_REQUEST_MESSAGES,
67-
normalized_messages,
68-
unpack=False,
65+
scope = sentry_sdk.get_current_scope()
66+
messages_data = truncate_and_annotate_messages(
67+
normalized_messages, span, scope
6968
)
69+
if messages_data is not None:
70+
set_data_normalized(
71+
span,
72+
SPANDATA.GEN_AI_REQUEST_MESSAGES,
73+
messages_data,
74+
unpack=False,
75+
)
7076

7177
_set_agent_data(span, agent)
7278

sentry_sdk/integrations/openai_agents/utils.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
normalize_message_roles,
55
set_data_normalized,
66
normalize_message_role,
7+
truncate_and_annotate_messages,
78
)
89
from sentry_sdk.consts import SPANDATA, SPANSTATUS, OP
910
from sentry_sdk.integrations import DidNotEnable
@@ -135,12 +136,16 @@ def _set_input_data(span, get_response_kwargs):
135136
}
136137
)
137138

138-
set_data_normalized(
139-
span,
140-
SPANDATA.GEN_AI_REQUEST_MESSAGES,
141-
normalize_message_roles(request_messages),
142-
unpack=False,
143-
)
139+
normalized_messages = normalize_message_roles(request_messages)
140+
scope = sentry_sdk.get_current_scope()
141+
messages_data = truncate_and_annotate_messages(normalized_messages, span, scope)
142+
if messages_data is not None:
143+
set_data_normalized(
144+
span,
145+
SPANDATA.GEN_AI_REQUEST_MESSAGES,
146+
messages_data,
147+
unpack=False,
148+
)
144149

145150

146151
def _set_output_data(span, result):

tests/integrations/openai_agents/test_openai_agents.py

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,13 @@
33
import pytest
44
from unittest.mock import MagicMock, patch
55
import os
6+
import json
67

8+
import sentry_sdk
9+
from sentry_sdk import start_span
10+
from sentry_sdk.consts import SPANDATA
711
from sentry_sdk.integrations.openai_agents import OpenAIAgentsIntegration
8-
from sentry_sdk.integrations.openai_agents.utils import safe_serialize
12+
from sentry_sdk.integrations.openai_agents.utils import _set_input_data, safe_serialize
913
from sentry_sdk.utils import parse_version
1014

1115
import agents
@@ -1219,3 +1223,46 @@ def failing_tool(message: str) -> str:
12191223
# Verify error status was set (this is the key test for our patch)
12201224
# The span should be marked as error because the tool execution failed
12211225
assert execute_tool_span["tags"]["status"] == "error"
1226+
1227+
1228+
def test_openai_agents_message_truncation(sentry_init, capture_events):
1229+
"""Test that large messages are truncated properly in OpenAI Agents integration."""
1230+
1231+
large_content = (
1232+
"This is a very long message that will exceed our size limits. " * 1000
1233+
)
1234+
1235+
sentry_init(
1236+
integrations=[OpenAIAgentsIntegration()],
1237+
traces_sample_rate=1.0,
1238+
send_default_pii=True,
1239+
)
1240+
1241+
test_messages = [
1242+
{"role": "system", "content": "small message 1"},
1243+
{"role": "user", "content": large_content},
1244+
{"role": "assistant", "content": large_content},
1245+
{"role": "user", "content": "small message 4"},
1246+
{"role": "assistant", "content": "small message 5"},
1247+
]
1248+
1249+
get_response_kwargs = {"input": test_messages}
1250+
1251+
with start_span(op="gen_ai.chat") as span:
1252+
scope = sentry_sdk.get_current_scope()
1253+
_set_input_data(span, get_response_kwargs)
1254+
if hasattr(scope, "_gen_ai_original_message_count"):
1255+
truncated_count = scope._gen_ai_original_message_count.get(span.span_id)
1256+
assert truncated_count == 5, (
1257+
f"Expected 5 original messages, got {truncated_count}"
1258+
)
1259+
1260+
assert SPANDATA.GEN_AI_REQUEST_MESSAGES in span._data
1261+
messages_data = span._data[SPANDATA.GEN_AI_REQUEST_MESSAGES]
1262+
assert isinstance(messages_data, str)
1263+
1264+
parsed_messages = json.loads(messages_data)
1265+
assert isinstance(parsed_messages, list)
1266+
assert len(parsed_messages) == 2
1267+
assert "small message 4" in str(parsed_messages[0])
1268+
assert "small message 5" in str(parsed_messages[1])

0 commit comments

Comments
 (0)