Skip to content

Commit ed2f642

Browse files
committed
remove single message size truncation for now
1 parent 44ec306 commit ed2f642

File tree

6 files changed

+5
-225
lines changed

6 files changed

+5
-225
lines changed

sentry_sdk/ai/utils.py

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,10 @@ def truncate_messages_by_size(messages, max_bytes=MAX_GEN_AI_MESSAGE_BYTES):
112112
if not messages:
113113
return messages
114114

115+
# make a list out of the messages in case it's just a string? why is this needed?
115116
truncated_messages = list(messages)
116117

118+
# while there is more than one message, serialize and measure the size, and if it's too big, remove the oldest message
117119
while len(truncated_messages) > 1:
118120
serialized = serialize(
119121
truncated_messages, is_vars=False, max_value_length=round(max_bytes * 0.8)
@@ -126,24 +128,6 @@ def truncate_messages_by_size(messages, max_bytes=MAX_GEN_AI_MESSAGE_BYTES):
126128

127129
truncated_messages.pop(0)
128130

129-
if len(truncated_messages) == 1:
130-
last_message = truncated_messages[0].copy()
131-
content = last_message.get("content", "")
132-
133-
if content and isinstance(content, str):
134-
if len(content) > int(max_bytes * 0.8):
135-
last_message["content"] = content[: int(max_bytes * 0.8)] + "..."
136-
else:
137-
last_message["content"] = content
138-
truncated_messages[0] = last_message
139-
140-
if content and isinstance(content, list):
141-
if len(content) > int(max_bytes * 0.8):
142-
last_message["content"] = content[: int(max_bytes * 0.8)] + "..."
143-
else:
144-
last_message["content"] = content
145-
truncated_messages[0] = last_message
146-
147131
return truncated_messages
148132

149133

tests/integrations/anthropic/test_anthropic.py

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -989,51 +989,3 @@ def test_anthropic_message_truncation(sentry_init, capture_events):
989989

990990
result_size = len(messages_data.encode("utf-8"))
991991
assert result_size <= MAX_GEN_AI_MESSAGE_BYTES
992-
993-
994-
def test_anthropic_single_large_message_preservation(sentry_init, capture_events):
995-
"""Test that a single very large message gets preserved with truncated content."""
996-
sentry_init(
997-
integrations=[AnthropicIntegration(include_prompts=True)],
998-
traces_sample_rate=1.0,
999-
send_default_pii=True,
1000-
)
1001-
events = capture_events()
1002-
1003-
client = Anthropic(api_key="test-api-key")
1004-
client.messages._post = mock.Mock(
1005-
return_value=Message(
1006-
id="test",
1007-
content=[TextBlock(text="Hello", type="text")],
1008-
model="claude-3",
1009-
role="assistant",
1010-
type="message",
1011-
usage=Usage(input_tokens=100, output_tokens=50),
1012-
)
1013-
)
1014-
1015-
huge_content = (
1016-
"This is an extremely long message that will definitely exceed size limits. "
1017-
* 2000
1018-
)
1019-
messages = [{"role": "user", "content": huge_content}]
1020-
1021-
with start_transaction(name="anthropic tx"):
1022-
client.messages.create(
1023-
model="claude-3-sonnet-20240229",
1024-
messages=messages,
1025-
max_tokens=100,
1026-
)
1027-
1028-
(event,) = events
1029-
(span,) = event["spans"]
1030-
1031-
assert SPANDATA.GEN_AI_REQUEST_MESSAGES in span["data"]
1032-
messages_data = span["data"][SPANDATA.GEN_AI_REQUEST_MESSAGES]
1033-
assert isinstance(messages_data, str)
1034-
1035-
parsed_messages = json.loads(messages_data)
1036-
assert isinstance(parsed_messages, list)
1037-
assert len(parsed_messages) == 1
1038-
assert parsed_messages[0]["role"] == "user"
1039-
assert len(parsed_messages[0]["content"]) < len(huge_content)

tests/integrations/litellm/test_litellm.py

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -599,48 +599,3 @@ def test_litellm_message_truncation(sentry_init, capture_events):
599599

600600
result_size = len(messages_data.encode("utf-8"))
601601
assert result_size <= MAX_GEN_AI_MESSAGE_BYTES
602-
603-
604-
def test_litellm_single_large_message_preservation(sentry_init, capture_events):
605-
"""Test that a single very large message gets preserved with truncated content."""
606-
sentry_init(
607-
integrations=[LiteLLMIntegration(include_prompts=True)],
608-
traces_sample_rate=1.0,
609-
send_default_pii=True,
610-
)
611-
events = capture_events()
612-
613-
huge_content = (
614-
"This is an extremely long message that will definitely exceed size limits. "
615-
* 2000
616-
)
617-
messages = [{"role": "user", "content": huge_content}]
618-
619-
mock_response = MockCompletionResponse()
620-
621-
with start_transaction(name="litellm test"):
622-
kwargs = {
623-
"model": "gpt-3.5-turbo",
624-
"messages": messages,
625-
}
626-
627-
_input_callback(kwargs)
628-
_success_callback(
629-
kwargs,
630-
mock_response,
631-
datetime.now(),
632-
datetime.now(),
633-
)
634-
635-
(event,) = events
636-
(span,) = event["spans"]
637-
638-
assert SPANDATA.GEN_AI_REQUEST_MESSAGES in span["data"]
639-
messages_data = span["data"][SPANDATA.GEN_AI_REQUEST_MESSAGES]
640-
assert isinstance(messages_data, str)
641-
642-
parsed_messages = json.loads(messages_data)
643-
assert isinstance(parsed_messages, list)
644-
assert len(parsed_messages) == 1
645-
assert parsed_messages[0]["role"] == "user"
646-
assert len(parsed_messages[0]["content"]) < len(huge_content)

tests/integrations/openai/test_openai.py

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1554,44 +1554,3 @@ def test_openai_message_truncation(sentry_init, capture_events):
15541554
if SPANDATA.GEN_AI_REQUEST_MESSAGES in span_meta:
15551555
messages_meta = span_meta[SPANDATA.GEN_AI_REQUEST_MESSAGES]
15561556
assert "len" in messages_meta.get("", {})
1557-
1558-
1559-
def test_openai_single_large_message_content_truncation(sentry_init, capture_events):
1560-
"""Test that a single very large message gets content truncated, not removed entirely."""
1561-
sentry_init(
1562-
integrations=[OpenAIIntegration(include_prompts=True)],
1563-
traces_sample_rate=1.0,
1564-
send_default_pii=True,
1565-
)
1566-
events = capture_events()
1567-
1568-
client = OpenAI(api_key="z")
1569-
client.chat.completions._post = mock.Mock(return_value=EXAMPLE_CHAT_COMPLETION)
1570-
1571-
huge_content = (
1572-
"This is an extremely long message that will definitely exceed size limits. "
1573-
* 2000
1574-
)
1575-
messages = [{"role": "user", "content": huge_content}]
1576-
1577-
with start_transaction(name="openai tx"):
1578-
client.chat.completions.create(
1579-
model="some-model",
1580-
messages=messages,
1581-
)
1582-
1583-
(event,) = events
1584-
span = event["spans"][0]
1585-
assert SPANDATA.GEN_AI_REQUEST_MESSAGES in span["data"]
1586-
1587-
messages_data = span["data"][SPANDATA.GEN_AI_REQUEST_MESSAGES]
1588-
assert isinstance(messages_data, str)
1589-
1590-
parsed_messages = json.loads(messages_data)
1591-
assert isinstance(parsed_messages, list)
1592-
assert len(parsed_messages) == 1
1593-
assert parsed_messages[0]["role"] == "user"
1594-
assert len(parsed_messages[0]["content"]) < len(huge_content)
1595-
1596-
result_size = len(messages_data.encode("utf-8"))
1597-
assert result_size <= MAX_GEN_AI_MESSAGE_BYTES

tests/integrations/openai_agents/test_openai_agents.py

Lines changed: 0 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1130,57 +1130,3 @@ def test_openai_agents_message_truncation(
11301130
total_original_size = len(large_system_prompt) + len(large_user_message)
11311131
total_parsed_size = sum(len(str(msg)) for msg in parsed_messages)
11321132
assert total_parsed_size < total_original_size
1133-
1134-
1135-
def test_openai_agents_single_large_message_preservation(
1136-
sentry_init, capture_events, mock_model_response
1137-
):
1138-
"""Test that a single very large message gets preserved with truncated content."""
1139-
huge_content = (
1140-
"This is an extremely long message that will definitely exceed size limits. "
1141-
* 2000
1142-
)
1143-
1144-
agent = Agent(
1145-
name="test_agent",
1146-
model="gpt-4",
1147-
instructions="You are helpful.",
1148-
)
1149-
1150-
with patch.dict(os.environ, {"OPENAI_API_KEY": "test-key"}):
1151-
with patch(
1152-
"agents.models.openai_responses.OpenAIResponsesModel.get_response"
1153-
) as mock_get_response:
1154-
mock_get_response.return_value = mock_model_response
1155-
1156-
sentry_init(
1157-
integrations=[OpenAIAgentsIntegration()],
1158-
traces_sample_rate=1.0,
1159-
send_default_pii=True,
1160-
)
1161-
1162-
events = capture_events()
1163-
1164-
result = agents.Runner.run_sync(
1165-
agent, huge_content, run_config=test_run_config
1166-
)
1167-
1168-
assert result is not None
1169-
1170-
(event,) = events
1171-
spans = event["spans"]
1172-
invoke_agent_span, ai_client_span = spans
1173-
assert "gen_ai.request.messages" in invoke_agent_span["data"]
1174-
1175-
messages_data = invoke_agent_span["data"]["gen_ai.request.messages"]
1176-
assert isinstance(messages_data, str)
1177-
1178-
parsed_messages = json.loads(messages_data)
1179-
assert isinstance(parsed_messages, list)
1180-
assert len(parsed_messages) >= 1
1181-
1182-
user_message = next(
1183-
(msg for msg in parsed_messages if msg.get("role") == "user"), None
1184-
)
1185-
if user_message and "content" in user_message:
1186-
assert len(user_message["content"]) < len(huge_content)

tests/test_ai_message_utils.py

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
)
1010
from sentry_sdk._types import AnnotatedValue
1111
from sentry_sdk.serializer import serialize
12+
from sentry_sdk.utils import safe_serialize
1213

1314

1415
@pytest.fixture
@@ -69,24 +70,6 @@ def test_empty_messages_list(self):
6970
)
7071
assert result == []
7172

72-
def test_single_message_under_limit(self):
73-
"""Test single message under size limit"""
74-
messages = [{"role": "user", "content": "Hello!"}]
75-
result = truncate_messages_by_size(
76-
messages, max_bytes=MAX_GEN_AI_MESSAGE_BYTES // 500
77-
)
78-
assert result == messages
79-
80-
def test_single_message_over_limit(self):
81-
"""Test single message that exceeds size limit"""
82-
large_content = "x" * 10000
83-
messages = [{"role": "user", "content": large_content}]
84-
85-
result = truncate_messages_by_size(messages, max_bytes=100)
86-
assert len(result) == 1
87-
assert result[0]["role"] == "user"
88-
assert len(result[0]["content"]) < len(large_content)
89-
9073
def test_progressive_truncation(self, large_messages):
9174
"""Test that truncation works progressively with different limits"""
9275
limits = [
@@ -288,7 +271,8 @@ def __init__(self):
288271
orig_count = span_data.pop("_gen_ai_messages_original_count", None)
289272
if orig_count is not None and SPANDATA.GEN_AI_REQUEST_MESSAGES in span_data:
290273
span_data[SPANDATA.GEN_AI_REQUEST_MESSAGES] = AnnotatedValue(
291-
span_data[SPANDATA.GEN_AI_REQUEST_MESSAGES], {"len": orig_count}
274+
safe_serialize(span_data[SPANDATA.GEN_AI_REQUEST_MESSAGES]),
275+
{"len": orig_count},
292276
)
293277

294278
# Verify the annotation happened

0 commit comments

Comments
 (0)