40
40
41
41
_logfire = logfire_api .Logfire (otel_scope = 'pydantic-ai' )
42
42
43
+ # while waiting for https://github.com/pydantic/logfire/issues/745
44
+ try :
45
+ import logfire ._internal .stack_info
46
+ except ImportError :
47
+ pass
48
+ else :
49
+ from pathlib import Path
50
+
51
+ logfire ._internal .stack_info .NON_USER_CODE_PREFIXES += (str (Path (__file__ ).parent .absolute ()),)
52
+
43
53
NoneType = type (None )
44
54
EndStrategy = Literal ['early' , 'exhaustive' ]
45
55
"""The strategy for handling multiple tool calls when a final result is found.
@@ -215,7 +225,7 @@ async def run(
215
225
"""
216
226
if infer_name and self .name is None :
217
227
self ._infer_name (inspect .currentframe ())
218
- model_used , mode_selection = await self ._get_model (model )
228
+ model_used = await self ._get_model (model )
219
229
220
230
deps = self ._get_deps (deps )
221
231
new_message_index = len (message_history ) if message_history else 0
@@ -224,11 +234,10 @@ async def run(
224
234
'{agent_name} run {prompt=}' ,
225
235
prompt = user_prompt ,
226
236
agent = self ,
227
- mode_selection = mode_selection ,
228
237
model_name = model_used .name (),
229
238
agent_name = self .name or 'agent' ,
230
239
) as run_span :
231
- run_context = RunContext (deps , 0 , [], None , model_used , usage or result .Usage ())
240
+ run_context = RunContext (deps , model_used , usage or result .Usage (), user_prompt )
232
241
messages = await self ._prepare_messages (user_prompt , message_history , run_context )
233
242
run_context .messages = messages
234
243
@@ -238,15 +247,14 @@ async def run(
238
247
model_settings = merge_model_settings (self .model_settings , model_settings )
239
248
usage_limits = usage_limits or UsageLimits ()
240
249
241
- run_step = 0
242
250
while True :
243
251
usage_limits .check_before_request (run_context .usage )
244
252
245
- run_step += 1
246
- with _logfire .span ('preparing model and tools {run_step=}' , run_step = run_step ):
253
+ run_context . run_step += 1
254
+ with _logfire .span ('preparing model and tools {run_step=}' , run_step = run_context . run_step ):
247
255
agent_model = await self ._prepare_model (run_context )
248
256
249
- with _logfire .span ('model request' , run_step = run_step ) as model_req_span :
257
+ with _logfire .span ('model request' , run_step = run_context . run_step ) as model_req_span :
250
258
model_response , request_usage = await agent_model .request (messages , model_settings )
251
259
model_req_span .set_attribute ('response' , model_response )
252
260
model_req_span .set_attribute ('usage' , request_usage )
@@ -255,7 +263,7 @@ async def run(
255
263
run_context .usage .incr (request_usage , requests = 1 )
256
264
usage_limits .check_tokens (run_context .usage )
257
265
258
- with _logfire .span ('handle model response' , run_step = run_step ) as handle_span :
266
+ with _logfire .span ('handle model response' , run_step = run_context . run_step ) as handle_span :
259
267
final_result , tool_responses = await self ._handle_model_response (model_response , run_context )
260
268
261
269
if tool_responses :
@@ -377,7 +385,7 @@ async def main():
377
385
# f_back because `asynccontextmanager` adds one frame
378
386
if frame := inspect .currentframe (): # pragma: no branch
379
387
self ._infer_name (frame .f_back )
380
- model_used , mode_selection = await self ._get_model (model )
388
+ model_used = await self ._get_model (model )
381
389
382
390
deps = self ._get_deps (deps )
383
391
new_message_index = len (message_history ) if message_history else 0
@@ -386,11 +394,10 @@ async def main():
386
394
'{agent_name} run stream {prompt=}' ,
387
395
prompt = user_prompt ,
388
396
agent = self ,
389
- mode_selection = mode_selection ,
390
397
model_name = model_used .name (),
391
398
agent_name = self .name or 'agent' ,
392
399
) as run_span :
393
- run_context = RunContext (deps , 0 , [], None , model_used , usage or result .Usage ())
400
+ run_context = RunContext (deps , model_used , usage or result .Usage (), user_prompt )
394
401
messages = await self ._prepare_messages (user_prompt , message_history , run_context )
395
402
run_context .messages = messages
396
403
@@ -400,15 +407,14 @@ async def main():
400
407
model_settings = merge_model_settings (self .model_settings , model_settings )
401
408
usage_limits = usage_limits or UsageLimits ()
402
409
403
- run_step = 0
404
410
while True :
405
- run_step += 1
411
+ run_context . run_step += 1
406
412
usage_limits .check_before_request (run_context .usage )
407
413
408
- with _logfire .span ('preparing model and tools {run_step=}' , run_step = run_step ):
414
+ with _logfire .span ('preparing model and tools {run_step=}' , run_step = run_context . run_step ):
409
415
agent_model = await self ._prepare_model (run_context )
410
416
411
- with _logfire .span ('model request {run_step=}' , run_step = run_step ) as model_req_span :
417
+ with _logfire .span ('model request {run_step=}' , run_step = run_context . run_step ) as model_req_span :
412
418
async with agent_model .request_stream (messages , model_settings ) as model_response :
413
419
run_context .usage .requests += 1
414
420
model_req_span .set_attribute ('response_type' , model_response .__class__ .__name__ )
@@ -781,14 +787,14 @@ def _register_tool(self, tool: Tool[AgentDeps]) -> None:
781
787
782
788
self ._function_tools [tool .name ] = tool
783
789
784
- async def _get_model (self , model : models .Model | models .KnownModelName | None ) -> tuple [ models .Model , str ] :
790
+ async def _get_model (self , model : models .Model | models .KnownModelName | None ) -> models .Model :
785
791
"""Create a model configured for this agent.
786
792
787
793
Args:
788
794
model: model to use for this run, required if `model` was not set when creating the agent.
789
795
790
796
Returns:
791
- a tuple of `( model used, how the model was selected)`
797
+ The model used
792
798
"""
793
799
model_ : models .Model
794
800
if some_model := self ._override_model :
@@ -799,18 +805,15 @@ async def _get_model(self, model: models.Model | models.KnownModelName | None) -
799
805
'(Even when `override(model=...)` is customizing the model that will actually be called)'
800
806
)
801
807
model_ = some_model .value
802
- mode_selection = 'override-model'
803
808
elif model is not None :
804
809
model_ = models .infer_model (model )
805
- mode_selection = 'custom'
806
810
elif self .model is not None :
807
811
# noinspection PyTypeChecker
808
812
model_ = self .model = models .infer_model (self .model )
809
- mode_selection = 'from-agent'
810
813
else :
811
814
raise exceptions .UserError ('`model` must be set either when creating the agent or when calling it.' )
812
815
813
- return model_ , mode_selection
816
+ return model_
814
817
815
818
async def _prepare_model (self , run_context : RunContext [AgentDeps ]) -> models .AgentModel :
816
819
"""Build tools and create an agent model."""
0 commit comments