11import sentry_sdk
2- from contextvars import ContextVar
32from sentry_sdk .consts import SPANDATA
43from sentry_sdk .scope import should_send_default_pii
54from sentry_sdk .tracing_utils import set_span_errored
1110 from typing import Any , Optional
1211
1312
14- # Store the current agent context in a contextvar for re-entrant safety
15- # Using a list as a stack to support nested agent calls
16- _agent_context_stack : "ContextVar[list[dict[str, Any]]]" = ContextVar (
17- "pydantic_ai_agent_context_stack" , default = []
18- )
19-
20-
21- def push_agent (agent : "Any" , is_streaming : bool = False ) -> None :
22- """Push an agent context onto the stack along with its streaming flag."""
23- stack = _agent_context_stack .get ().copy ()
24- stack .append ({"agent" : agent , "is_streaming" : is_streaming })
25- _agent_context_stack .set (stack )
26-
27-
28- def pop_agent () -> None :
29- """Pop an agent context from the stack."""
30- stack = _agent_context_stack .get ().copy ()
31- if stack :
32- stack .pop ()
33- _agent_context_stack .set (stack )
34-
35-
36- def get_current_agent () -> "Any" :
37- """Get the current agent from the contextvar stack."""
38- stack = _agent_context_stack .get ()
39- if stack :
40- return stack [- 1 ]["agent" ]
41- return None
42-
43-
4413def _should_send_prompts () -> bool :
4514 """
4615 Check if prompts should be sent to Sentry.
@@ -66,16 +35,10 @@ def _set_agent_data(span: "sentry_sdk.tracing.Span", agent: "Any") -> None:
6635
6736 Args:
6837 span: The span to set data on
69- agent: Agent object (can be None, will try to get from contextvar if not provided)
38+ agent: Agent object
7039 """
71- # Extract agent name from agent object or contextvar
72- agent_obj = agent
73- if not agent_obj :
74- # Try to get from contextvar
75- agent_obj = get_current_agent ()
76-
77- if agent_obj and hasattr (agent_obj , "name" ) and agent_obj .name :
78- span .set_data (SPANDATA .GEN_AI_AGENT_NAME , agent_obj .name )
40+ if agent and hasattr (agent , "name" ) and agent .name :
41+ span .set_data (SPANDATA .GEN_AI_AGENT_NAME , agent .name )
7942
8043
8144def _get_model_name (model_obj : "Any" ) -> "Optional[str]" :
@@ -104,7 +67,7 @@ def _get_model_name(model_obj: "Any") -> "Optional[str]":
10467
10568
10669def _set_model_data (
107- span : "sentry_sdk.tracing.Span" , model : "Any" , model_settings : "Any"
70+ span : "sentry_sdk.tracing.Span" , agent : "Any" , model : "Any" , model_settings : "Any"
10871) -> None :
10972 """Set model-related data on a span.
11073
@@ -113,13 +76,10 @@ def _set_model_data(
11376 model: Model object (can be None, will try to get from agent if not provided)
11477 model_settings: Model settings (can be None, will try to get from agent if not provided)
11578 """
116- # Try to get agent from contextvar if we need it
117- agent_obj = get_current_agent ()
118-
11979 # Extract model information
12080 model_obj = model
121- if not model_obj and agent_obj and hasattr (agent_obj , "model" ):
122- model_obj = agent_obj .model
81+ if not model_obj and agent and hasattr (agent , "model" ):
82+ model_obj = agent .model
12383
12484 if model_obj :
12585 # Set system from model
@@ -133,8 +93,8 @@ def _set_model_data(
13393
13494 # Extract model settings
13595 settings = model_settings
136- if not settings and agent_obj and hasattr (agent_obj , "model_settings" ):
137- settings = agent_obj .model_settings
96+ if not settings and agent and hasattr (agent , "model_settings" ):
97+ settings = agent .model_settings
13898
13999 if settings :
140100 settings_map = {
0 commit comments