Skip to content

Commit 003cb73

Browse files
feat(ai): Add original input length meta attribute (#5375)
1 parent d4db6d3 commit 003cb73

File tree

8 files changed

+23
-0
lines changed

8 files changed

+23
-0
lines changed

sentry_sdk/ai/utils.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import sentry_sdk
1616
from sentry_sdk.utils import logger
17+
from sentry_sdk.consts import SPANDATA
1718

1819
MAX_GEN_AI_MESSAGE_BYTES = 20_000 # 20KB
1920
# Maximum characters when only a single message is left after bytes truncation
@@ -698,6 +699,8 @@ def truncate_and_annotate_messages(
698699
if len(messages) > 1:
699700
scope._gen_ai_original_message_count[span.span_id] = len(messages)
700701

702+
span.set_data(SPANDATA.META_GEN_AI_ORIGINAL_INPUT_MESSAGES_LENGTH, len(messages))
703+
701704
return [truncated_message]
702705

703706

sentry_sdk/consts.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -869,6 +869,14 @@ class SPANDATA:
869869
Example: "a1b2c3d4e5f6"
870870
"""
871871

872+
META_GEN_AI_ORIGINAL_INPUT_MESSAGES_LENGTH = (
873+
"sentry.sdk_meta.gen_ai.input.messages.original_length"
874+
)
875+
"""
876+
The original number of input non-system instruction messages, before SDK trimming.
877+
Example: 4
878+
"""
879+
872880

873881
class SPANSTATUS:
874882
"""

tests/integrations/anthropic/test_anthropic.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1010,6 +1010,7 @@ def test_anthropic_message_truncation(sentry_init, capture_events):
10101010
assert len(parsed_messages) == 1
10111011
assert "small message 5" in str(parsed_messages[0])
10121012

1013+
assert chat_span["data"][SPANDATA.META_GEN_AI_ORIGINAL_INPUT_MESSAGES_LENGTH] == 5
10131014
assert tx["_meta"]["spans"]["0"]["data"]["gen_ai.request.messages"][""]["len"] == 5
10141015

10151016

@@ -1061,6 +1062,7 @@ async def test_anthropic_message_truncation_async(sentry_init, capture_events):
10611062
assert len(parsed_messages) == 1
10621063
assert "small message 5" in str(parsed_messages[0])
10631064

1065+
assert chat_span["data"][SPANDATA.META_GEN_AI_ORIGINAL_INPUT_MESSAGES_LENGTH] == 5
10641066
assert tx["_meta"]["spans"]["0"]["data"]["gen_ai.request.messages"][""]["len"] == 5
10651067

10661068

tests/integrations/google_genai/test_google_genai.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -990,6 +990,7 @@ def test_google_genai_message_truncation(
990990
assert parsed_messages[0]["role"] == "user"
991991
assert small_content in parsed_messages[0]["content"]
992992

993+
assert invoke_span["data"][SPANDATA.META_GEN_AI_ORIGINAL_INPUT_MESSAGES_LENGTH] == 2
993994
assert (
994995
event["_meta"]["spans"]["0"]["data"]["gen_ai.request.messages"][""]["len"] == 2
995996
)

tests/integrations/langchain/test_langchain.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1070,6 +1070,8 @@ def test_langchain_message_truncation(sentry_init, capture_events):
10701070
assert isinstance(parsed_messages, list)
10711071
assert len(parsed_messages) == 1
10721072
assert "small message 5" in str(parsed_messages[0])
1073+
1074+
assert llm_span["data"][SPANDATA.META_GEN_AI_ORIGINAL_INPUT_MESSAGES_LENGTH] == 5
10731075
assert tx["_meta"]["spans"]["0"]["data"]["gen_ai.request.messages"][""]["len"] == 5
10741076

10751077

tests/integrations/langgraph/test_langgraph.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1384,4 +1384,6 @@ def original_invoke(self, *args, **kwargs):
13841384
assert isinstance(parsed_messages, list)
13851385
assert len(parsed_messages) == 1
13861386
assert "small message 5" in str(parsed_messages[0])
1387+
1388+
assert invoke_span["data"][SPANDATA.META_GEN_AI_ORIGINAL_INPUT_MESSAGES_LENGTH] == 5
13871389
assert tx["_meta"]["spans"]["0"]["data"]["gen_ai.request.messages"][""]["len"] == 5

tests/integrations/litellm/test_litellm.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,8 @@ def test_litellm_message_truncation(sentry_init, capture_events):
754754
assert isinstance(parsed_messages, list)
755755
assert len(parsed_messages) == 1
756756
assert "small message 5" in str(parsed_messages[0])
757+
758+
assert chat_span["data"][SPANDATA.META_GEN_AI_ORIGINAL_INPUT_MESSAGES_LENGTH] == 5
757759
assert tx["_meta"]["spans"]["0"]["data"]["gen_ai.request.messages"][""]["len"] == 5
758760

759761

tests/integrations/openai/test_openai.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1607,6 +1607,7 @@ def test_ai_client_span_responses_api(
16071607
"gen_ai.usage.total_tokens": 30,
16081608
"gen_ai.request.model": "gpt-4o",
16091609
"gen_ai.response.text": "the model response",
1610+
"sentry.sdk_meta.gen_ai.input.messages.original_length": 1,
16101611
"thread.id": mock.ANY,
16111612
"thread.name": mock.ANY,
16121613
}
@@ -1910,6 +1911,7 @@ async def test_ai_client_span_responses_async_api(
19101911
"gen_ai.usage.output_tokens.reasoning": 8,
19111912
"gen_ai.usage.total_tokens": 30,
19121913
"gen_ai.response.text": "the model response",
1914+
"sentry.sdk_meta.gen_ai.input.messages.original_length": 1,
19131915
"thread.id": mock.ANY,
19141916
"thread.name": mock.ANY,
19151917
}
@@ -2177,6 +2179,7 @@ async def test_ai_client_span_streaming_responses_async_api(
21772179
"gen_ai.usage.total_tokens": 30,
21782180
"gen_ai.request.model": "gpt-4o",
21792181
"gen_ai.response.text": "the model response",
2182+
"sentry.sdk_meta.gen_ai.input.messages.original_length": 1,
21802183
"thread.id": mock.ANY,
21812184
"thread.name": mock.ANY,
21822185
}

0 commit comments

Comments
 (0)