11import functools
22
33from sentry_sdk .integrations import DidNotEnable , Integration
4- from sentry_sdk .utils import capture_internal_exceptions , parse_version
4+ from sentry_sdk .utils import parse_version
55
66try :
77 import pydantic_ai # noqa: F401
2424 from typing import Any
2525
2626 from pydantic_ai import ModelRequestContext , RunContext
27- from pydantic_ai .capabilities import Hooks
27+ from pydantic_ai .capabilities import Hooks , WrapModelRequestHandler
2828 from pydantic_ai .messages import ModelResponse
2929
3030
@@ -33,67 +33,24 @@ def register_hooks(hooks: "Hooks") -> None:
3333 Creates hooks for chat model calls and register the hooks by adding the hooks to the `capabilities` argument passed to `Agent.__init__()`.
3434 """
3535
36- @hooks .on .before_model_request
37- async def on_request (
38- ctx : "RunContext[None]" , request_context : "ModelRequestContext"
39- ) -> "ModelRequestContext" :
40- run_context_metadata = ctx .metadata
41- if not isinstance (run_context_metadata , dict ):
42- return request_context
43-
44- span = ai_client_span (
45- messages = request_context .messages ,
46- agent = None ,
47- model = request_context .model ,
48- model_settings = request_context .model_settings ,
49- )
50-
51- run_context_metadata ["_sentry_span" ] = span
52- span .__enter__ ()
53-
54- return request_context
55-
56- @hooks .on .after_model_request
57- async def on_response (
36+ @hooks .on .model_request
37+ async def on_model_request (
5838 ctx : "RunContext[None]" ,
5939 * ,
6040 request_context : "ModelRequestContext" ,
61- response : "ModelResponse " ,
41+ handler : "WrapModelRequestHandler " ,
6242 ) -> "ModelResponse" :
63- run_context_metadata = ctx .metadata
64- if not isinstance (run_context_metadata , dict ):
65- return response
43+ with ai_client_span (
44+ messages = request_context .messages ,
45+ agent = None ,
46+ model = request_context .model ,
47+ model_settings = request_context .model_settings ,
48+ ) as span :
49+ response = await handler (request_context )
6650
67- span = run_context_metadata .pop ("_sentry_span" , None )
68- if span is None :
51+ update_ai_client_span (span , response )
6952 return response
7053
71- update_ai_client_span (span , response )
72- span .__exit__ (None , None , None )
73-
74- return response
75-
76- @hooks .on .model_request_error
77- async def on_error (
78- ctx : "RunContext[None]" ,
79- * ,
80- request_context : "ModelRequestContext" ,
81- error : "Exception" ,
82- ) -> "ModelResponse" :
83- run_context_metadata = ctx .metadata
84-
85- if not isinstance (run_context_metadata , dict ):
86- raise error
87-
88- span = run_context_metadata .pop ("_sentry_span" , None )
89- if span is None :
90- raise error
91-
92- with capture_internal_exceptions ():
93- span .__exit__ (type (error ), error , error .__traceback__ )
94-
95- raise error
96-
9754 original_init = Agent .__init__
9855
9956 @functools .wraps (original_init )
@@ -102,10 +59,6 @@ def patched_init(self: "Agent[Any, Any]", *args: "Any", **kwargs: "Any") -> None
10259 caps .append (hooks )
10360 kwargs ["capabilities" ] = caps
10461
105- metadata = kwargs .get ("metadata" )
106- if metadata is None :
107- kwargs ["metadata" ] = {} # Used as shared reference between hooks
108-
10962 return original_init (self , * args , ** kwargs )
11063
11164 Agent .__init__ = patched_init # type: ignore[method-assign]
@@ -129,7 +82,6 @@ class PydanticAIIntegration(Integration):
12982
13083 identifier = "pydantic_ai"
13184 origin = f"auto.ai.{ identifier } "
132- using_request_hooks = False
13385
13486 def __init__ (
13587 self , include_prompts : bool = True , handled_tool_call_exceptions : bool = True
@@ -159,7 +111,6 @@ def setup_once() -> None:
159111 _patch_agent_run ()
160112 _patch_tool_execution ()
161113
162- PydanticAIIntegration .using_request_hooks = False
163114 try :
164115 PYDANTIC_AI_VERSION = version ("pydantic-ai-slim" )
165116 except PackageNotFoundError :
@@ -182,6 +133,5 @@ def setup_once() -> None:
182133 except ImportError :
183134 return
184135
185- PydanticAIIntegration .using_request_hooks = True
186136 hooks = Hooks ()
187137 register_hooks (hooks )
0 commit comments