11from functools import wraps
22
33from sentry_sdk .integrations import DidNotEnable
4+ from sentry_sdk .tracing_utils import set_span_errored
45from ..spans import invoke_agent_span , update_invoke_agent_span , handoff_span
6+ from ..utils import _capture_exception , _record_exception_on_span
57
68from typing import TYPE_CHECKING
79
810if TYPE_CHECKING :
911 from typing import Any , Optional
1012
13+ from sentry_sdk .tracing import Span
14+
1115try :
1216 import agents
1317except ImportError :
@@ -27,13 +31,15 @@ def _patch_agent_run():
2731 original_execute_final_output = agents ._run_impl .RunImpl .execute_final_output
2832
2933 def _start_invoke_agent_span (context_wrapper , agent , kwargs ):
30- # type: (agents.RunContextWrapper, agents.Agent, dict[str, Any]) -> None
34+ # type: (agents.RunContextWrapper, agents.Agent, dict[str, Any]) -> Span
3135 """Start an agent invocation span"""
3236 # Store the agent on the context wrapper so we can access it later
3337 context_wrapper ._sentry_current_agent = agent
3438 span = invoke_agent_span (context_wrapper , agent , kwargs )
3539 context_wrapper ._sentry_agent_span = span
3640
41+ return span
42+
3743 def _end_invoke_agent_span (context_wrapper , agent , output = None ):
3844 # type: (agents.RunContextWrapper, agents.Agent, Optional[Any]) -> None
3945 """End the agent invocation span"""
@@ -65,18 +71,21 @@ async def patched_run_single_turn(cls, *args, **kwargs):
6571 context_wrapper = kwargs .get ("context_wrapper" )
6672 should_run_agent_start_hooks = kwargs .get ("should_run_agent_start_hooks" )
6773
74+ span = getattr (context_wrapper , "_sentry_current_agent" , None )
6875 # Start agent span when agent starts (but only once per agent)
6976 if should_run_agent_start_hooks and agent and context_wrapper :
70- # End any existing span for a different agent
71- if _has_active_agent_span (context_wrapper ):
72- current_agent = _get_current_agent (context_wrapper )
73- if current_agent and current_agent != agent :
74- _end_invoke_agent_span (context_wrapper , current_agent )
75-
76- _start_invoke_agent_span (context_wrapper , agent , kwargs )
77+ span = _start_invoke_agent_span (context_wrapper , agent , kwargs )
7778
7879 # Call original method with all the correct parameters
79- result = await original_run_single_turn (* args , ** kwargs )
80+ try :
81+ result = await original_run_single_turn (* args , ** kwargs )
82+ except Exception as exc :
83+ if span is not None and span .timestamp is None :
84+ _record_exception_on_span (span , exc )
85+ span .__exit__ (None , None , None )
86+
87+ _capture_exception (exc )
88+ raise exc from None
8089
8190 return result
8291
0 commit comments