Skip to content

Commit 14a1116

Browse files
fix(openai-agents): Remove context variables (#5184)
1 parent 7857282 commit 14a1116

File tree

5 files changed

+18
-37
lines changed

5 files changed

+18
-37
lines changed

sentry_sdk/integrations/openai_agents/_context_vars.py

Lines changed: 0 additions & 18 deletions
This file was deleted.

sentry_sdk/integrations/openai_agents/patches/agent_run.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
if TYPE_CHECKING:
99
from typing import Any, Optional
1010

11+
from sentry_sdk.tracing import Span
12+
1113
try:
1214
import agents
1315
except ImportError:
@@ -27,13 +29,15 @@ def _patch_agent_run():
2729
original_execute_final_output = agents._run_impl.RunImpl.execute_final_output
2830

2931
def _start_invoke_agent_span(context_wrapper, agent, kwargs):
30-
# type: (agents.RunContextWrapper, agents.Agent, dict[str, Any]) -> None
32+
# type: (agents.RunContextWrapper, agents.Agent, dict[str, Any]) -> Span
3133
"""Start an agent invocation span"""
3234
# Store the agent on the context wrapper so we can access it later
3335
context_wrapper._sentry_current_agent = agent
3436
span = invoke_agent_span(context_wrapper, agent, kwargs)
3537
context_wrapper._sentry_agent_span = span
3638

39+
return span
40+
3741
def _end_invoke_agent_span(context_wrapper, agent, output=None):
3842
# type: (agents.RunContextWrapper, agents.Agent, Optional[Any]) -> None
3943
"""End the agent invocation span"""
@@ -73,7 +77,8 @@ async def patched_run_single_turn(cls, *args, **kwargs):
7377
if current_agent and current_agent != agent:
7478
_end_invoke_agent_span(context_wrapper, current_agent)
7579

76-
_start_invoke_agent_span(context_wrapper, agent, kwargs)
80+
span = _start_invoke_agent_span(context_wrapper, agent, kwargs)
81+
agent._sentry_agent_span = span
7782

7883
# Call original method with all the correct parameters
7984
result = await original_run_single_turn(*args, **kwargs)

sentry_sdk/integrations/openai_agents/patches/models.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,8 @@
22

33
from sentry_sdk.integrations import DidNotEnable
44

5-
from .._context_vars import (
6-
_invoke_agent_response_model_context,
7-
_response_model_context,
8-
)
95
from ..spans import ai_client_span, update_ai_client_span
6+
from sentry_sdk.consts import SPANDATA
107

118
from typing import TYPE_CHECKING
129

@@ -47,7 +44,7 @@ async def wrapped_fetch_response(*args, **kwargs):
4744
response = await original_fetch_response(*args, **kwargs)
4845
# Store model from raw response in context variable
4946
if hasattr(response, "model"):
50-
_response_model_context.set(str(response.model))
47+
agent._sentry_raw_response_model = str(response.model)
5148
return response
5249

5350
model._fetch_response = wrapped_fetch_response
@@ -59,13 +56,15 @@ async def wrapped_get_response(*args, **kwargs):
5956
result = await original_get_response(*args, **kwargs)
6057

6158
# Retrieve response model from context and attach to ModelResponse
62-
response_model = _response_model_context.get(None)
59+
response_model = getattr(agent, "_sentry_raw_response_model", None)
6360
if response_model:
6461
result._sentry_response_model = response_model
65-
_response_model_context.set(None) # Clear context
6662

67-
# Also store for invoke_agent span (will be the last one used)
68-
_invoke_agent_response_model_context.set(response_model)
63+
agent_span = getattr(agent, "_sentry_agent_span", None)
64+
if agent_span:
65+
agent_span.set_data(
66+
SPANDATA.GEN_AI_RESPONSE_MODEL, response_model
67+
)
6968

7069
update_ai_client_span(span, agent, kwargs, result)
7170

sentry_sdk/integrations/openai_agents/patches/runner.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@ async def wrapper(*args, **kwargs):
2626
# Isolate each workflow so that when agents are run in asyncio tasks they
2727
# don't touch each other's scopes
2828
with sentry_sdk.isolation_scope():
29-
agent = args[0]
29+
# Clone agent because agent invocation spans are attached per run.
30+
agent = args[0].clone()
3031
with agent_workflow_span(agent):
3132
result = None
33+
args = (agent, *args[1:])
3234
try:
3335
result = await original_func(*args, **kwargs)
3436
return result

sentry_sdk/integrations/openai_agents/spans/invoke_agent.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from sentry_sdk.scope import should_send_default_pii
1010
from sentry_sdk.utils import safe_serialize
1111

12-
from .._context_vars import _invoke_agent_response_model_context
1312
from ..consts import SPAN_ORIGIN
1413
from ..utils import _set_agent_data, _set_usage_data
1514

@@ -89,12 +88,6 @@ def update_invoke_agent_span(context, agent, output):
8988
if hasattr(context, "usage"):
9089
_set_usage_data(span, context.usage)
9190

92-
# Add response model if available (will be the last model used)
93-
response_model = _invoke_agent_response_model_context.get(None)
94-
if response_model:
95-
span.set_data(SPANDATA.GEN_AI_RESPONSE_MODEL, response_model)
96-
_invoke_agent_response_model_context.set(None) # Clear after use
97-
9891
if should_send_default_pii():
9992
set_data_normalized(
10093
span, SPANDATA.GEN_AI_RESPONSE_TEXT, output, unpack=False

0 commit comments

Comments
 (0)