Skip to content

Commit 7449603

Browse files
feat(openai-agents): Truncate long messages (#5141)
1 parent 996f935 commit 7449603

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

0 commit comments

Comments
 (0)