Skip to content

Commit ec91534

Browse files
.
1 parent 5de11d9 commit ec91534

9 files changed

Lines changed: 1132 additions & 2662 deletions

File tree

‎sentry_sdk/integrations/openai_agents/patches/agent_run.py‎

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,10 @@
1313
)
1414

1515
if TYPE_CHECKING:
16-
from typing import Any, Awaitable, Callable, Optional, Union
16+
from typing import Any, Awaitable, Callable, Optional
1717

1818
from agents.run_internal.run_steps import SingleStepResult
1919

20-
from sentry_sdk.tracing import Span
2120

2221
try:
2322
import agents
@@ -51,7 +50,7 @@ def _maybe_start_agent_span(
5150
should_run_agent_start_hooks: bool,
5251
span_kwargs: "dict[str, Any]",
5352
is_streaming: bool = False,
54-
) -> "Optional[Union[Span, StreamedSpan]]":
53+
) -> "Optional[StreamedSpan]":
5554
"""
5655
Start an agent invocation span if conditions are met.
5756
Handles ending any existing span for a different agent.
@@ -82,10 +81,7 @@ def _maybe_start_agent_span(
8281
if not is_streaming:
8382
return span
8483

85-
if isinstance(span, StreamedSpan):
86-
span.set_attribute(SPANDATA.GEN_AI_RESPONSE_STREAMING, True)
87-
else:
88-
span.set_data(SPANDATA.GEN_AI_RESPONSE_STREAMING, True)
84+
span.set_attribute(SPANDATA.GEN_AI_RESPONSE_STREAMING, True)
8985

9086
return span
9187

@@ -114,11 +110,7 @@ async def _run_single_turn(
114110
context_wrapper, agent, should_run_agent_start_hooks, kwargs
115111
)
116112

117-
if (
118-
span is None
119-
or (isinstance(span, StreamedSpan) and span.end_timestamp is not None)
120-
or (not isinstance(span, StreamedSpan) and span.timestamp is not None)
121-
):
113+
if span is None or span.end_timestamp is not None:
122114
return await original_run_single_turn(*args, **kwargs)
123115

124116
try:
@@ -198,11 +190,7 @@ async def _run_single_turn_streamed(
198190
is_streaming=True,
199191
)
200192

201-
if (
202-
span is None
203-
or (isinstance(span, StreamedSpan) and span.end_timestamp is not None)
204-
or (not isinstance(span, StreamedSpan) and span.timestamp is not None)
205-
):
193+
if span is None or span.end_timestamp is not None:
206194
return await original_run_single_turn_streamed(*args, **kwargs)
207195

208196
try:

‎sentry_sdk/integrations/openai_agents/patches/error_tracing.py‎

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22
from typing import TYPE_CHECKING
33

44
import sentry_sdk
5-
from sentry_sdk.consts import SPANSTATUS
65
from sentry_sdk.traces import SpanStatus
7-
from sentry_sdk.tracing_utils import has_span_streaming_enabled
86

97
if TYPE_CHECKING:
108
from typing import Any
@@ -56,15 +54,9 @@ def sentry_attach_error_to_current_span(
5654
the agents library swallows exceptions.
5755
"""
5856
# Set the current Sentry span to errored
59-
span_streaming = has_span_streaming_enabled(sentry_sdk.get_client().options)
60-
if span_streaming:
61-
current_span = sentry_sdk.get_current_scope().streamed_span
62-
if current_span is not None:
63-
current_span.status = SpanStatus.ERROR
64-
else:
65-
current_span = sentry_sdk.get_current_span()
66-
if current_span is not None:
67-
current_span.set_status(SPANSTATUS.INTERNAL_ERROR)
57+
current_span = sentry_sdk.get_current_scope().streamed_span
58+
if current_span is not None:
59+
current_span.status = SpanStatus.ERROR
6860

6961
# Call the original function
7062
return original_attach_error(error, *args, **kwargs)

‎sentry_sdk/integrations/openai_agents/patches/models.py‎

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@
1717
from ..spans import ai_client_span, update_ai_client_span
1818

1919
if TYPE_CHECKING:
20-
from typing import Any, Callable, Union
20+
from typing import Any, Callable
2121

22-
from sentry_sdk.tracing import Span
2322

2423
try:
2524
import agents
@@ -29,7 +28,7 @@
2928

3029

3130
def _inject_trace_propagation_headers(
32-
hosted_tool: "HostedMCPTool", span: "Union[Span, StreamedSpan]"
31+
hosted_tool: "HostedMCPTool", span: "StreamedSpan"
3332
) -> None:
3433
headers = hosted_tool.tool_config.get("headers")
3534
if headers is None:
@@ -141,12 +140,7 @@ async def wrapped_stream_response(*args: "Any", **kwargs: "Any") -> "Any":
141140
for hosted_tool in hosted_tools:
142141
_inject_trace_propagation_headers(hosted_tool, span=span)
143142

144-
set_on_span = (
145-
span.set_attribute
146-
if isinstance(span, StreamedSpan)
147-
else span.set_data
148-
)
149-
set_on_span(SPANDATA.GEN_AI_RESPONSE_STREAMING, True)
143+
span.set_attribute(SPANDATA.GEN_AI_RESPONSE_STREAMING, True)
150144

151145
streaming_response = None
152146
ttft_recorded = False
@@ -157,7 +151,9 @@ async def wrapped_stream_response(*args: "Any", **kwargs: "Any") -> "Any":
157151
# Detect first content token (text delta event)
158152
if not ttft_recorded and hasattr(event, "delta"):
159153
ttft = time.perf_counter() - start_time
160-
set_on_span(SPANDATA.GEN_AI_RESPONSE_TIME_TO_FIRST_TOKEN, ttft)
154+
span.set_attribute(
155+
SPANDATA.GEN_AI_RESPONSE_TIME_TO_FIRST_TOKEN, ttft
156+
)
161157
ttft_recorded = True
162158

163159
# Capture the full response from ResponseCompletedEvent

‎sentry_sdk/integrations/openai_agents/patches/runner.py‎

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,7 @@ async def on_tool_start(
6464
elif not should_send_default_pii():
6565
return
6666

67-
if isinstance(span, StreamedSpan):
68-
span.set_attribute(SPANDATA.GEN_AI_TOOL_INPUT, context.tool_arguments)
69-
else:
70-
span.set_data(SPANDATA.GEN_AI_TOOL_INPUT, context.tool_arguments)
67+
span.set_attribute(SPANDATA.GEN_AI_TOOL_INPUT, context.tool_arguments)
7168

7269
async def on_tool_end(
7370
self,
@@ -161,14 +158,9 @@ async def wrapper(*args: "Any", **kwargs: "Any") -> "Any":
161158
if conversation_id:
162159
agent._sentry_conversation_id = conversation_id
163160

164-
if isinstance(workflow_span, StreamedSpan):
165-
workflow_span.set_attribute(
166-
SPANDATA.GEN_AI_CONVERSATION_ID, conversation_id
167-
)
168-
else:
169-
workflow_span.set_data(
170-
SPANDATA.GEN_AI_CONVERSATION_ID, conversation_id
171-
)
161+
workflow_span.set_attribute(
162+
SPANDATA.GEN_AI_CONVERSATION_ID, conversation_id
163+
)
172164

173165
if "starting_agent" in kwargs:
174166
kwargs["starting_agent"] = agent
@@ -188,15 +180,9 @@ async def wrapper(*args: "Any", **kwargs: "Any") -> "Any":
188180
context_wrapper, "_sentry_agent_span", None
189181
)
190182

191-
if invoke_agent_span is not None and (
192-
(
193-
isinstance(invoke_agent_span, StreamedSpan)
194-
and invoke_agent_span.end_timestamp is None
195-
)
196-
or (
197-
not isinstance(invoke_agent_span, StreamedSpan)
198-
and invoke_agent_span.timestamp is None
199-
)
183+
if (
184+
invoke_agent_span is not None
185+
and invoke_agent_span.end_timestamp is None
200186
):
201187
update_invoke_agent_span(
202188
span=invoke_agent_span,

‎sentry_sdk/integrations/openai_agents/patches/tools.py‎

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from sentry_sdk.consts import SPANDATA
66
from sentry_sdk.integrations import DidNotEnable
77
from sentry_sdk.scope import should_send_default_pii
8-
from sentry_sdk.traces import StreamedSpan
98
from sentry_sdk.utils import has_data_collection_enabled
109

1110
from ..spans import execute_tool_span, update_execute_tool_span
@@ -65,10 +64,7 @@ async def sentry_wrapped_on_invoke_tool(
6564
elif not should_send_default_pii():
6665
return result
6766

68-
if isinstance(span, StreamedSpan):
69-
span.set_attribute(SPANDATA.GEN_AI_TOOL_INPUT, args[1])
70-
else:
71-
span.set_data(SPANDATA.GEN_AI_TOOL_INPUT, args[1])
67+
span.set_attribute(SPANDATA.GEN_AI_TOOL_INPUT, args[1])
7268

7369
return result
7470

‎sentry_sdk/integrations/openai_agents/spans/agent_workflow.py‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,12 @@
77
from ..consts import SPAN_ORIGIN
88

99
if TYPE_CHECKING:
10-
from typing import Union
11-
1210
import agents
1311

1412

1513
def agent_workflow_span(
1614
agent: "agents.Agent",
17-
) -> "Union[sentry_sdk.tracing.Span, sentry_sdk.traces.StreamedSpan]":
15+
) -> "sentry_sdk.traces.StreamedSpan":
1816
# Create a transaction or a span if an transaction is already active
1917
span_streaming = has_span_streaming_enabled(sentry_sdk.get_client().options)
2018
if span_streaming:

‎sentry_sdk/integrations/openai_agents/spans/execute_tool.py‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@
1010
from ..utils import _set_agent_data
1111

1212
if TYPE_CHECKING:
13-
from typing import Any, Union
13+
from typing import Any
1414

1515
import agents
1616

1717

1818
def execute_tool_span(
1919
tool: "agents.Tool", *args: "Any", **kwargs: "Any"
20-
) -> "Union[sentry_sdk.tracing.Span, StreamedSpan]":
20+
) -> "StreamedSpan":
2121
span = sentry_sdk.traces.start_span(
2222
name=f"execute_tool {tool.name}",
2323
attributes={
@@ -33,7 +33,7 @@ def execute_tool_span(
3333

3434

3535
def update_execute_tool_span(
36-
span: "Union[sentry_sdk.tracing.Span, StreamedSpan]",
36+
span: "StreamedSpan",
3737
agent: "agents.Agent",
3838
tool: "agents.Tool",
3939
result: "Any",

‎sentry_sdk/integrations/openai_agents/spans/invoke_agent.py‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@
1818
from ..utils import _set_agent_data, _set_usage_data
1919

2020
if TYPE_CHECKING:
21-
from typing import Any, Union
21+
from typing import Any
2222

2323
import agents
2424

2525

2626
def invoke_agent_span(
2727
context: "agents.RunContextWrapper", agent: "agents.Agent", kwargs: "dict[str, Any]"
28-
) -> "Union[sentry_sdk.tracing.Span, StreamedSpan]":
28+
) -> "StreamedSpan":
2929
client_options = sentry_sdk.get_client().options
3030
span = sentry_sdk.traces.start_span(
3131
name=f"invoke_agent {agent.name}",
@@ -95,7 +95,7 @@ def invoke_agent_span(
9595

9696

9797
def update_invoke_agent_span(
98-
span: "Union[sentry_sdk.tracing.Span, StreamedSpan]",
98+
span: "StreamedSpan",
9999
context: "agents.RunContextWrapper",
100100
agent: "agents.Agent",
101101
output: "Any" = None,

0 commit comments

Comments
 (0)