pydantic-ai-slim 1.0.14__py3-none-any.whl → 1.0.15__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pydantic-ai-slim might be problematic. Click here for more details.

Files changed (38) hide show
  1. pydantic_ai/__init__.py +19 -1
  2. pydantic_ai/_agent_graph.py +116 -93
  3. pydantic_ai/_cli.py +4 -7
  4. pydantic_ai/_output.py +236 -192
  5. pydantic_ai/_parts_manager.py +8 -42
  6. pydantic_ai/_tool_manager.py +9 -16
  7. pydantic_ai/agent/abstract.py +169 -1
  8. pydantic_ai/builtin_tools.py +82 -0
  9. pydantic_ai/direct.py +7 -0
  10. pydantic_ai/durable_exec/dbos/_agent.py +106 -3
  11. pydantic_ai/durable_exec/temporal/_agent.py +123 -6
  12. pydantic_ai/durable_exec/temporal/_model.py +8 -0
  13. pydantic_ai/format_prompt.py +4 -3
  14. pydantic_ai/mcp.py +20 -10
  15. pydantic_ai/messages.py +149 -3
  16. pydantic_ai/models/__init__.py +15 -1
  17. pydantic_ai/models/anthropic.py +7 -3
  18. pydantic_ai/models/cohere.py +4 -0
  19. pydantic_ai/models/function.py +7 -4
  20. pydantic_ai/models/gemini.py +8 -0
  21. pydantic_ai/models/google.py +56 -23
  22. pydantic_ai/models/groq.py +11 -5
  23. pydantic_ai/models/huggingface.py +5 -3
  24. pydantic_ai/models/mistral.py +6 -8
  25. pydantic_ai/models/openai.py +197 -57
  26. pydantic_ai/models/test.py +4 -0
  27. pydantic_ai/output.py +5 -2
  28. pydantic_ai/profiles/__init__.py +2 -0
  29. pydantic_ai/profiles/google.py +5 -2
  30. pydantic_ai/profiles/openai.py +2 -1
  31. pydantic_ai/result.py +46 -30
  32. pydantic_ai/run.py +35 -7
  33. pydantic_ai/usage.py +5 -4
  34. {pydantic_ai_slim-1.0.14.dist-info → pydantic_ai_slim-1.0.15.dist-info}/METADATA +3 -3
  35. {pydantic_ai_slim-1.0.14.dist-info → pydantic_ai_slim-1.0.15.dist-info}/RECORD +38 -38
  36. {pydantic_ai_slim-1.0.14.dist-info → pydantic_ai_slim-1.0.15.dist-info}/WHEEL +0 -0
  37. {pydantic_ai_slim-1.0.14.dist-info → pydantic_ai_slim-1.0.15.dist-info}/entry_points.txt +0 -0
  38. {pydantic_ai_slim-1.0.14.dist-info → pydantic_ai_slim-1.0.15.dist-info}/licenses/LICENSE +0 -0
pydantic_ai/result.py CHANGED
@@ -4,7 +4,7 @@ from collections.abc import AsyncIterator, Awaitable, Callable, Iterable
4
4
  from copy import deepcopy
5
5
  from dataclasses import dataclass, field
6
6
  from datetime import datetime
7
- from typing import Generic, cast, overload
7
+ from typing import TYPE_CHECKING, Generic, cast, overload
8
8
 
9
9
  from pydantic import ValidationError
10
10
  from typing_extensions import TypeVar, deprecated
@@ -15,9 +15,7 @@ from ._output import (
15
15
  OutputSchema,
16
16
  OutputValidator,
17
17
  OutputValidatorFunc,
18
- PlainTextOutputSchema,
19
18
  TextOutputSchema,
20
- ToolOutputSchema,
21
19
  )
22
20
  from ._run_context import AgentDepsT, RunContext
23
21
  from ._tool_manager import ToolManager
@@ -27,9 +25,11 @@ from .output import (
27
25
  OutputDataT,
28
26
  ToolOutput,
29
27
  )
30
- from .run import AgentRunResult
31
28
  from .usage import RunUsage, UsageLimits
32
29
 
30
+ if TYPE_CHECKING:
31
+ from .run import AgentRunResult
32
+
33
33
  __all__ = (
34
34
  'OutputDataT',
35
35
  'OutputDataT_inv',
@@ -95,7 +95,7 @@ class AgentStream(Generic[AgentDepsT, OutputDataT]):
95
95
  Debouncing is particularly important for long structured responses to reduce the overhead of
96
96
  performing validation as each token is received.
97
97
  """
98
- if not isinstance(self._output_schema, PlainTextOutputSchema):
98
+ if not isinstance(self._output_schema, TextOutputSchema):
99
99
  raise exceptions.UserError('stream_text() can only be used with text responses')
100
100
 
101
101
  if delta:
@@ -107,10 +107,17 @@ class AgentStream(Generic[AgentDepsT, OutputDataT]):
107
107
  text = await validator.validate(text, self._run_ctx) # pragma: no cover
108
108
  yield text
109
109
 
110
+ # TODO (v2): Drop in favor of `response` property
110
111
  def get(self) -> _messages.ModelResponse:
111
112
  """Get the current state of the response."""
112
113
  return self._raw_stream_response.get()
113
114
 
115
+ @property
116
+ def response(self) -> _messages.ModelResponse:
117
+ """Get the current state of the response."""
118
+ return self.get()
119
+
120
+ # TODO (v2): Make this a property
114
121
  def usage(self) -> RunUsage:
115
122
  """Return the usage of the whole run.
116
123
 
@@ -119,6 +126,7 @@ class AgentStream(Generic[AgentDepsT, OutputDataT]):
119
126
  """
120
127
  return self._initial_run_ctx_usage + self._raw_stream_response.usage()
121
128
 
129
+ # TODO (v2): Make this a property
122
130
  def timestamp(self) -> datetime:
123
131
  """Get the timestamp of the response."""
124
132
  return self._raw_stream_response.timestamp
@@ -140,13 +148,9 @@ class AgentStream(Generic[AgentDepsT, OutputDataT]):
140
148
 
141
149
  output_tool_name = final_result_event.tool_name
142
150
 
143
- if isinstance(self._output_schema, ToolOutputSchema) and output_tool_name is not None:
151
+ if self._output_schema.toolset and output_tool_name is not None:
144
152
  tool_call = next(
145
- (
146
- part
147
- for part in message.parts
148
- if isinstance(part, _messages.ToolCallPart) and part.tool_name == output_tool_name
149
- ),
153
+ (part for part in message.tool_calls if part.tool_name == output_tool_name),
150
154
  None,
151
155
  )
152
156
  if tool_call is None:
@@ -156,13 +160,15 @@ class AgentStream(Generic[AgentDepsT, OutputDataT]):
156
160
  return await self._tool_manager.handle_call(
157
161
  tool_call, allow_partial=allow_partial, wrap_validation_errors=False
158
162
  )
159
- elif deferred_tool_requests := _get_deferred_tool_requests(message.parts, self._tool_manager):
163
+ elif deferred_tool_requests := _get_deferred_tool_requests(message.tool_calls, self._tool_manager):
160
164
  if not self._output_schema.allows_deferred_tools:
161
165
  raise exceptions.UserError(
162
166
  'A deferred tool call was present, but `DeferredToolRequests` is not among output types. To resolve this, add `DeferredToolRequests` to the list of output types for this agent.'
163
167
  )
164
168
  return cast(OutputDataT, deferred_tool_requests)
165
- elif isinstance(self._output_schema, TextOutputSchema):
169
+ elif self._output_schema.allows_image and message.images:
170
+ return cast(OutputDataT, message.images[0])
171
+ elif text_processor := self._output_schema.text_processor:
166
172
  text = ''
167
173
  for part in message.parts:
168
174
  if isinstance(part, _messages.TextPart):
@@ -172,7 +178,7 @@ class AgentStream(Generic[AgentDepsT, OutputDataT]):
172
178
  # not part of the final result output, so we reset the accumulated text
173
179
  text = ''
174
180
 
175
- result_data = await self._output_schema.process(
181
+ result_data = await text_processor.process(
176
182
  text, self._run_ctx, allow_partial=allow_partial, wrap_validation_errors=False
177
183
  )
178
184
  for validator in self._output_validators:
@@ -398,7 +404,7 @@ class StreamedRunResult(Generic[AgentDepsT, OutputDataT]):
398
404
  elif self._stream_response is not None:
399
405
  async for output in self._stream_response.stream_output(debounce_by=debounce_by):
400
406
  yield output
401
- await self._marked_completed(self._stream_response.get())
407
+ await self._marked_completed(self.response)
402
408
  else:
403
409
  raise ValueError('No stream response or run result provided') # pragma: no cover
404
410
 
@@ -426,7 +432,7 @@ class StreamedRunResult(Generic[AgentDepsT, OutputDataT]):
426
432
  elif self._stream_response is not None:
427
433
  async for text in self._stream_response.stream_text(delta=delta, debounce_by=debounce_by):
428
434
  yield text
429
- await self._marked_completed(self._stream_response.get())
435
+ await self._marked_completed(self.response)
430
436
  else:
431
437
  raise ValueError('No stream response or run result provided') # pragma: no cover
432
438
 
@@ -451,15 +457,14 @@ class StreamedRunResult(Generic[AgentDepsT, OutputDataT]):
451
457
  An async iterable of the structured response message and whether that is the last message.
452
458
  """
453
459
  if self._run_result is not None:
454
- model_response = cast(_messages.ModelResponse, self.all_messages()[-1])
455
- yield model_response, True
460
+ yield self.response, True
456
461
  await self._marked_completed()
457
462
  elif self._stream_response is not None:
458
463
  # if the message currently has any parts with content, yield before streaming
459
464
  async for msg in self._stream_response.stream_responses(debounce_by=debounce_by):
460
465
  yield msg, False
461
466
 
462
- msg = self._stream_response.get()
467
+ msg = self.response
463
468
  yield msg, True
464
469
 
465
470
  await self._marked_completed(msg)
@@ -474,11 +479,22 @@ class StreamedRunResult(Generic[AgentDepsT, OutputDataT]):
474
479
  return output
475
480
  elif self._stream_response is not None:
476
481
  output = await self._stream_response.get_output()
477
- await self._marked_completed(self._stream_response.get())
482
+ await self._marked_completed(self.response)
478
483
  return output
479
484
  else:
480
485
  raise ValueError('No stream response or run result provided') # pragma: no cover
481
486
 
487
+ @property
488
+ def response(self) -> _messages.ModelResponse:
489
+ """Return the current state of the response."""
490
+ if self._run_result is not None:
491
+ return self._run_result.response
492
+ elif self._stream_response is not None:
493
+ return self._stream_response.get()
494
+ else:
495
+ raise ValueError('No stream response or run result provided') # pragma: no cover
496
+
497
+ # TODO (v2): Make this a property
482
498
  def usage(self) -> RunUsage:
483
499
  """Return the usage of the whole run.
484
500
 
@@ -492,6 +508,7 @@ class StreamedRunResult(Generic[AgentDepsT, OutputDataT]):
492
508
  else:
493
509
  raise ValueError('No stream response or run result provided') # pragma: no cover
494
510
 
511
+ # TODO (v2): Make this a property
495
512
  def timestamp(self) -> datetime:
496
513
  """Get the timestamp of the response."""
497
514
  if self._run_result is not None:
@@ -560,20 +577,19 @@ def _get_usage_checking_stream_response(
560
577
 
561
578
 
562
579
  def _get_deferred_tool_requests(
563
- parts: Iterable[_messages.ModelResponsePart], tool_manager: ToolManager[AgentDepsT]
580
+ tool_calls: Iterable[_messages.ToolCallPart], tool_manager: ToolManager[AgentDepsT]
564
581
  ) -> DeferredToolRequests | None:
565
- """Get the deferred tool requests from the model response parts."""
582
+ """Get the deferred tool requests from the model response tool calls."""
566
583
  approvals: list[_messages.ToolCallPart] = []
567
584
  calls: list[_messages.ToolCallPart] = []
568
585
 
569
- for part in parts:
570
- if isinstance(part, _messages.ToolCallPart):
571
- tool_def = tool_manager.get_tool_def(part.tool_name)
572
- if tool_def is not None: # pragma: no branch
573
- if tool_def.kind == 'unapproved':
574
- approvals.append(part)
575
- elif tool_def.kind == 'external':
576
- calls.append(part)
586
+ for tool_call in tool_calls:
587
+ tool_def = tool_manager.get_tool_def(tool_call.tool_name)
588
+ if tool_def is not None: # pragma: no branch
589
+ if tool_def.kind == 'unapproved':
590
+ approvals.append(tool_call)
591
+ elif tool_def.kind == 'external':
592
+ calls.append(tool_call)
577
593
 
578
594
  if not calls and not approvals:
579
595
  return None
pydantic_ai/run.py CHANGED
@@ -10,6 +10,7 @@ from pydantic_graph import End, GraphRun, GraphRunContext
10
10
 
11
11
  from . import (
12
12
  _agent_graph,
13
+ _utils,
13
14
  exceptions,
14
15
  messages as _messages,
15
16
  usage as _usage,
@@ -227,6 +228,7 @@ class AgentRun(Generic[AgentDepsT, OutputDataT]):
227
228
  assert isinstance(next_node, End), f'Unexpected node type: {type(next_node)}'
228
229
  return next_node
229
230
 
231
+ # TODO (v2): Make this a property
230
232
  def usage(self) -> _usage.RunUsage:
231
233
  """Get usage statistics for the run so far, including token usage, model requests, and so on."""
232
234
  return self._graph_run.state.usage
@@ -244,10 +246,12 @@ class AgentRunResult(Generic[OutputDataT]):
244
246
  output: OutputDataT
245
247
  """The output data from the agent run."""
246
248
 
247
- _output_tool_name: str | None = dataclasses.field(repr=False)
248
- _state: _agent_graph.GraphAgentState = dataclasses.field(repr=False)
249
- _new_message_index: int = dataclasses.field(repr=False)
250
- _traceparent_value: str | None = dataclasses.field(repr=False)
249
+ _output_tool_name: str | None = dataclasses.field(repr=False, compare=False, default=None)
250
+ _state: _agent_graph.GraphAgentState = dataclasses.field(
251
+ repr=False, compare=False, default_factory=_agent_graph.GraphAgentState
252
+ )
253
+ _new_message_index: int = dataclasses.field(repr=False, compare=False, default=0)
254
+ _traceparent_value: str | None = dataclasses.field(repr=False, compare=False, default=None)
251
255
 
252
256
  @overload
253
257
  def _traceparent(self, *, required: Literal[False]) -> str | None: ...
@@ -344,12 +348,36 @@ class AgentRunResult(Generic[OutputDataT]):
344
348
  self.new_messages(output_tool_return_content=output_tool_return_content)
345
349
  )
346
350
 
351
+ @property
352
+ def response(self) -> _messages.ModelResponse:
353
+ """Return the last response from the message history."""
354
+ # The response may not be the very last item if it contained an output tool call. See `CallToolsNode._handle_final_result`.
355
+ for message in reversed(self.all_messages()):
356
+ if isinstance(message, _messages.ModelResponse):
357
+ return message
358
+ raise ValueError('No response found in the message history') # pragma: no cover
359
+
360
+ # TODO (v2): Make this a property
347
361
  def usage(self) -> _usage.RunUsage:
348
362
  """Return the usage of the whole run."""
349
363
  return self._state.usage
350
364
 
365
+ # TODO (v2): Make this a property
351
366
  def timestamp(self) -> datetime:
352
367
  """Return the timestamp of last response."""
353
- model_response = self.all_messages()[-1]
354
- assert isinstance(model_response, _messages.ModelResponse)
355
- return model_response.timestamp
368
+ return self.response.timestamp
369
+
370
+
371
+ @dataclasses.dataclass(repr=False)
372
+ class AgentRunResultEvent(Generic[OutputDataT]):
373
+ """An event indicating the agent run ended and containing the final result of the agent run."""
374
+
375
+ result: AgentRunResult[OutputDataT]
376
+ """The result of the run."""
377
+
378
+ _: dataclasses.KW_ONLY
379
+
380
+ event_kind: Literal['agent_run_result'] = 'agent_run_result'
381
+ """Event type identifier, used as a discriminator."""
382
+
383
+ __repr__ = _utils.dataclasses_no_defaults_repr
pydantic_ai/usage.py CHANGED
@@ -340,12 +340,13 @@ class UsageLimits:
340
340
  if self.total_tokens_limit is not None and total_tokens > self.total_tokens_limit:
341
341
  raise UsageLimitExceeded(f'Exceeded the total_tokens_limit of {self.total_tokens_limit} ({total_tokens=})')
342
342
 
343
- def check_before_tool_call(self, usage: RunUsage) -> None:
344
- """Raises a `UsageLimitExceeded` exception if the next tool call would exceed the tool call limit."""
343
+ def check_before_tool_call(self, projected_usage: RunUsage) -> None:
344
+ """Raises a `UsageLimitExceeded` exception if the next tool call(s) would exceed the tool call limit."""
345
345
  tool_calls_limit = self.tool_calls_limit
346
- if tool_calls_limit is not None and usage.tool_calls >= tool_calls_limit:
346
+ tool_calls = projected_usage.tool_calls
347
+ if tool_calls_limit is not None and tool_calls > tool_calls_limit:
347
348
  raise UsageLimitExceeded(
348
- f'The next tool call would exceed the tool_calls_limit of {tool_calls_limit} (tool_calls={usage.tool_calls})'
349
+ f'The next tool call(s) would exceed the tool_calls_limit of {tool_calls_limit} ({tool_calls=}).'
349
350
  )
350
351
 
351
352
  __repr__ = _utils.dataclasses_no_defaults_repr
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pydantic-ai-slim
3
- Version: 1.0.14
3
+ Version: 1.0.15
4
4
  Summary: Agent Framework / shim to use Pydantic with LLMs, slim package
5
5
  Project-URL: Homepage, https://github.com/pydantic/pydantic-ai/tree/main/pydantic_ai_slim
6
6
  Project-URL: Source, https://github.com/pydantic/pydantic-ai/tree/main/pydantic_ai_slim
@@ -33,7 +33,7 @@ Requires-Dist: genai-prices>=0.0.28
33
33
  Requires-Dist: griffe>=1.3.2
34
34
  Requires-Dist: httpx>=0.27
35
35
  Requires-Dist: opentelemetry-api>=1.28.0
36
- Requires-Dist: pydantic-graph==1.0.14
36
+ Requires-Dist: pydantic-graph==1.0.15
37
37
  Requires-Dist: pydantic>=2.10
38
38
  Requires-Dist: typing-inspection>=0.4.0
39
39
  Provides-Extra: a2a
@@ -57,7 +57,7 @@ Requires-Dist: dbos>=1.14.0; extra == 'dbos'
57
57
  Provides-Extra: duckduckgo
58
58
  Requires-Dist: ddgs>=9.0.0; extra == 'duckduckgo'
59
59
  Provides-Extra: evals
60
- Requires-Dist: pydantic-evals==1.0.14; extra == 'evals'
60
+ Requires-Dist: pydantic-evals==1.0.15; extra == 'evals'
61
61
  Provides-Extra: google
62
62
  Requires-Dist: google-genai>=1.31.0; extra == 'google'
63
63
  Provides-Extra: groq
@@ -1,88 +1,88 @@
1
- pydantic_ai/__init__.py,sha256=ncKgkl6nkEbiI8yLeAQx4yFPEcIJ1xgyddxVX-f-wiE,4838
1
+ pydantic_ai/__init__.py,sha256=IgLTfgpGwbYsT_d_2wSucOfFyIMl1GH6v-yfkNs_zrM,5149
2
2
  pydantic_ai/__main__.py,sha256=Q_zJU15DUA01YtlJ2mnaLCoId2YmgmreVEERGuQT-Y0,132
3
3
  pydantic_ai/_a2a.py,sha256=3_pl7JW2yHdu31qLgCrdcTZTqXaJNjAwUV6zavah_w8,12159
4
- pydantic_ai/_agent_graph.py,sha256=ejbRDXwDhKWiksa58R6jAjRha_QzM6GuefaZvJD3TA4,53258
5
- pydantic_ai/_cli.py,sha256=n1MX7p-UKH6ZWPNwiGPZTVcXYhXG8OiJIuNMeYX5k2M,14053
4
+ pydantic_ai/_agent_graph.py,sha256=ZzUkx9remZgSdgfMPfBhKtb7ZyRuSfQb-QLESWrHGcU,53965
5
+ pydantic_ai/_cli.py,sha256=HxnWPUkEi_pRJZYZ_s25PkV361uAZY6IpN9ub5yMAzg,13994
6
6
  pydantic_ai/_function_schema.py,sha256=UnDGh7Wh5z70pEaRujXF_hKsSibQdN2ywI6lZGz3LUo,11663
7
7
  pydantic_ai/_griffe.py,sha256=BphvTL00FHxsSY56GM-bNyCOdwrpL0T3LbDQITWUK_Q,5280
8
8
  pydantic_ai/_instrumentation.py,sha256=3XJxRUT0m2K6NfpAb-JKro4Rpw-8weqQ_ydtufeKVrU,2964
9
9
  pydantic_ai/_json_schema.py,sha256=Br48srbwCTVIie98a9UEMGcCcTIa3E4zVvCbkxqQRso,7268
10
10
  pydantic_ai/_mcp.py,sha256=PuvwnlLjv7YYOa9AZJCrklevBug99zGMhwJCBGG7BHQ,5626
11
11
  pydantic_ai/_otel_messages.py,sha256=SsMpbyI1fIISOck_wQcZJPIOei8lOmvwARkdPSCx8y8,1650
12
- pydantic_ai/_output.py,sha256=OWoNkxZ1ml25MC36C_EZRPFe0V8VqIBf23bwTaMA4p0,38731
13
- pydantic_ai/_parts_manager.py,sha256=QRfZTk21tCO6jEu8hF0qZLEsyUzvu0C6-qkiFhnbqxI,21443
12
+ pydantic_ai/_output.py,sha256=gHS1qwM701cH5FGGRUrMxgWlJhY1vNgdM6ylnHRa-Ew,40784
13
+ pydantic_ai/_parts_manager.py,sha256=kXMhigRJAwUcputw7i54pQkc85NuNVS4Zy36lFvnRvk,19800
14
14
  pydantic_ai/_run_context.py,sha256=-ah9Ipf3mLTbvuYqmJSqBmBexaCcED7HGA1Llzs0dKU,2324
15
15
  pydantic_ai/_system_prompt.py,sha256=WdDW_DTGHujcFFaK-J7J6mA4ZDJZ0IOKpyizJA-1Y5Q,1142
16
16
  pydantic_ai/_thinking_part.py,sha256=_0DajGyWPa50WUTPWN1UPfZw0xD8_hHcuSt0T3fgRr0,1295
17
- pydantic_ai/_tool_manager.py,sha256=iLFza1JiIPqLNo2B_DcNIhOY1r35vSzI6DWgkPGfLtY,10833
17
+ pydantic_ai/_tool_manager.py,sha256=se5Fikg4HaiTOnxJ4LFrezktZ2Zfv9a2OH0V9PtFE54,10464
18
18
  pydantic_ai/_utils.py,sha256=TBzJ03szJPrmDdqRqKTyhRboTsyP6wppnCCprpZFBMw,16620
19
19
  pydantic_ai/ag_ui.py,sha256=X3b4P_IraypCE3r-L2ETIo8G951A1MDdP4P5TQ8Fces,32067
20
- pydantic_ai/builtin_tools.py,sha256=DFwiFEtCXhw8MWgnraps9x56X6olyDHt1UiCwIapcKk,3863
21
- pydantic_ai/direct.py,sha256=p4CvEmWjIsXlUdrnzhkLZGTpgwWv1QfMJXjAHwdKJA0,14825
20
+ pydantic_ai/builtin_tools.py,sha256=xtRIlEGUJ9UQzxqsKIXs-KD0awHCxBOvXlZ7CLq5oDM,5666
21
+ pydantic_ai/direct.py,sha256=bSYSA5RyxXQMA4gk6CA6meXRbWv2Mn3IeF8vr6viOXI,15061
22
22
  pydantic_ai/exceptions.py,sha256=zsXZMKf2BJuVsfuHl1fWTkogLU37bd4yq7D6BKHAzVs,4968
23
- pydantic_ai/format_prompt.py,sha256=qQ9zv6PJR9D4FTII6gD3_bSOHYymhRYVIxhPMscxeLI,9528
24
- pydantic_ai/mcp.py,sha256=bDH_2F36I3dVaBj76DKk53_HMvh87GSslv4k_0k4-Ig,36327
25
- pydantic_ai/messages.py,sha256=CPainRnRN80ew8IMehfHjvioGBQut1Cr4MthzQ4tihA,57773
26
- pydantic_ai/output.py,sha256=Hh3P8IJHhd0DcVy8UBaUB-aEzL3Hd8V1-KwLICUxmGs,12940
23
+ pydantic_ai/format_prompt.py,sha256=Enhe3wn-Fo15DcHM0_XgEOLSBWmNpwWYE4M_2vWw_VI,9565
24
+ pydantic_ai/mcp.py,sha256=7Ouwepk-p2rOq_Rkv-MSZYyEGJ6FfrJvR7ySghuSLwc,36693
25
+ pydantic_ai/messages.py,sha256=Riay2z3WPgx4VQN-MuXzTfrxqCW8aBSP1CHPjGPNtdo,63393
26
+ pydantic_ai/output.py,sha256=q91oqvJ-FqV9GbUUil7WVWbii66SVsVZ54AEm_NWSEo,13002
27
27
  pydantic_ai/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- pydantic_ai/result.py,sha256=eoQ6VJPvXVNReRhErOytK3-2tiy9FV6LIwywyh7DSzo,26247
28
+ pydantic_ai/result.py,sha256=vfRe-s01zBtAZ7f_NoibptI3r80XfAq7CBhpJjgHSpo,26790
29
29
  pydantic_ai/retries.py,sha256=QM4oDA9DG-Y2qP06fbCp8Dqq8ups40Rr4HYjAOlbNyM,14650
30
- pydantic_ai/run.py,sha256=wHlWl4CXIHLcgo2R8PlsU3Pjn0vuMLFfP8D6Fbany-Y,15097
30
+ pydantic_ai/run.py,sha256=dV3zIztC-lfOCKecXg_Mcx2CyOfUbxQC0JbZuPvQhTI,16227
31
31
  pydantic_ai/settings.py,sha256=0mr6KudxKKjTG8e3nsv_8vDLxNhu_1-WvefCOzCGSYM,3565
32
32
  pydantic_ai/tools.py,sha256=dCecmJtRkF1ioqFYbfT00XGGqzGB4PPO9n6IrHCQtnc,20343
33
- pydantic_ai/usage.py,sha256=KuDwSvWCzV5O9fPeEy5lUg2OhPq2eZFEFk2vYCA_DwA,14060
33
+ pydantic_ai/usage.py,sha256=mTKKkXGTdEdka4HqER4i2hE7ULF4CiunGbisjgr38Z8,14102
34
34
  pydantic_ai/agent/__init__.py,sha256=gmLwyTsyvL89sYvZR83Ba62A8lKLqTfRBk_KYbYYNQo,64116
35
- pydantic_ai/agent/abstract.py,sha256=dOpnqbQTtvc9IozGhFC_juj9vpw5071U_vIklwms_lI,44995
35
+ pydantic_ai/agent/abstract.py,sha256=PX6r2g0uzbqQdigb5qeTBdfCEbGy6Djb0haKCCmTLrc,52702
36
36
  pydantic_ai/agent/wrapper.py,sha256=xZw0spYA5oZkBc6GMcxV4hoQZSr02LbH9GCKqI3MokI,9734
37
37
  pydantic_ai/common_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
38
  pydantic_ai/common_tools/duckduckgo.py,sha256=1ae_o3zqMGrC6KFqAmuqPwJqQgNBTisuvU2jX9KU8PI,2273
39
39
  pydantic_ai/common_tools/tavily.py,sha256=a7p2X03l9GS9B_0mvZZV3jePlCwf2TLNeej62-sPycs,2505
40
40
  pydantic_ai/durable_exec/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
41
  pydantic_ai/durable_exec/dbos/__init__.py,sha256=H_dT0ERuNCBP0Im8eVGl8F9h7E9Aj87-pvmnLpDelF0,199
42
- pydantic_ai/durable_exec/dbos/_agent.py,sha256=QqUKttoZdnlb2QLuQVqLmwTNxQRy2toJ2GcwAlJLTw4,32903
42
+ pydantic_ai/durable_exec/dbos/_agent.py,sha256=35PMPRSWwfi98e-p1U-3WRJfz-rXqIBbW_qevbvmdXg,37904
43
43
  pydantic_ai/durable_exec/dbos/_mcp_server.py,sha256=cLMCKmXQHqhqnn_E3Nf4IsNFIbqk-V7gnIvpmYeDCSA,2989
44
44
  pydantic_ai/durable_exec/dbos/_model.py,sha256=_Cxh0zYFF3cungXiSXpGHmjyBQF7KnksfurV7hMKp-E,5106
45
45
  pydantic_ai/durable_exec/dbos/_utils.py,sha256=_aNceFvTcNeqb78sTDYM2TdYph85tbdeLueyXY1lbTA,242
46
46
  pydantic_ai/durable_exec/temporal/__init__.py,sha256=XKwy68wfgmjr057nolRwGHTKiadxufpQEGEUprAV09k,5563
47
- pydantic_ai/durable_exec/temporal/_agent.py,sha256=ZdGPaKyxYxCw1eL73SIH-TtMqzQH38o2kS7Taw19L_0,37149
47
+ pydantic_ai/durable_exec/temporal/_agent.py,sha256=ayNY1QpoVkgYeyQKSU90bNMoZJgWvJCMI_Ou9Ufq7kU,42557
48
48
  pydantic_ai/durable_exec/temporal/_function_toolset.py,sha256=3n_A5uHzygsT88LM105kKuYqwxC1sjI4bOzETeUbT4E,5553
49
49
  pydantic_ai/durable_exec/temporal/_logfire.py,sha256=ASd7vb0cd61yESI0mgU2w9SCGxsOegz95HtQjKdlQkE,2472
50
50
  pydantic_ai/durable_exec/temporal/_mcp_server.py,sha256=vxfWeI7ZtYyXVgX621rPtG-WOZjlKWnqJhcvR9eBgIo,6014
51
- pydantic_ai/durable_exec/temporal/_model.py,sha256=6jtcwNebL5B8nuKTLUmF5J_FhPa4-62DZoKetm0HhjA,7117
51
+ pydantic_ai/durable_exec/temporal/_model.py,sha256=sOrDgMjQmCizSXe041dNpd5EDFAXgE6r0LGZghWkaeg,7546
52
52
  pydantic_ai/durable_exec/temporal/_run_context.py,sha256=Y0RTm-P6q8Oziu2gml6hpAjhbVBeJuktEme84qwXE8A,2449
53
53
  pydantic_ai/durable_exec/temporal/_toolset.py,sha256=IlPQrumm2MpZrb518ru15s0jIl8-cGwvE6ZNWIZrFuE,2879
54
54
  pydantic_ai/ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
55
  pydantic_ai/ext/aci.py,sha256=YWYLXzTQJ6hS7qfgNycA8cRl69gogGgThqEU6II7eMA,2527
56
56
  pydantic_ai/ext/langchain.py,sha256=kmbbV3Cx2BiNYEJCZMHVYQquUQD-zG2L_bwDangy0Ww,2317
57
- pydantic_ai/models/__init__.py,sha256=8PXVHffd8qJm6yjb6GvYlBZrMacrDzPWf-FSWgCNcOk,35059
58
- pydantic_ai/models/anthropic.py,sha256=raBHsTYvdwEUg2Xv7mxjWqrgxNuZmtCQfUROGt8kBMg,38035
57
+ pydantic_ai/models/__init__.py,sha256=bZXZRrvQa5xEbv6GLvwmcI39vCZG-y6AxUGres1UtBk,35700
58
+ pydantic_ai/models/anthropic.py,sha256=OYFmejUY6W2DOVyLEaslmUBTznuH96PoZ2mOWNZLJ1Y,38220
59
59
  pydantic_ai/models/bedrock.py,sha256=fha8zVZgDFYgDqO5nvBkZ2CEv4GV92yq_YnK4qmD73E,33639
60
- pydantic_ai/models/cohere.py,sha256=5p103VxbKXZxLTmTh7GH2QiG1LVgiJRH7KdSUiRVJmA,13817
60
+ pydantic_ai/models/cohere.py,sha256=_ccK7XBts1OwD-RP8puU3z425SZ4PeJGts1WFhPjikg,14051
61
61
  pydantic_ai/models/fallback.py,sha256=fjQz7qRuxEwC6aFYkglBv-2Z39-6kZ931vs6o7PIti8,5016
62
- pydantic_ai/models/function.py,sha256=MCke1w8HHhqlWWONWpF7yW-Xh0T8zJDxqkd-09GLZbA,15816
63
- pydantic_ai/models/gemini.py,sha256=D4tFMRmS5meUBSJU7Ti5lR7Ei0Nj_ThBmRup2occkaw,39674
64
- pydantic_ai/models/google.py,sha256=ID9FekcpX2LxFb8tqFj5xDd1oB8H4Pp1jnBg8abjIWg,39783
65
- pydantic_ai/models/groq.py,sha256=iDXDXEZFehFekRvvrdGi8hUJUrpijMPNPzUNtwn6RAs,29416
66
- pydantic_ai/models/huggingface.py,sha256=NY870MVS-9_HpEL3SwA9sj-e_1aofUypI0qXDKK21Nk,21385
62
+ pydantic_ai/models/function.py,sha256=7-ej1m4f7c1TbvgB8sF02qlFD7Kf-EX-k_xN4RkbIEw,15880
63
+ pydantic_ai/models/gemini.py,sha256=Ik7e1SnDCvFyjmYHcM-6vilXyl6pHY_GKaM3pHJGNG4,40016
64
+ pydantic_ai/models/google.py,sha256=vWBkQtieMH6fJ93uNMescz7Deo13ddibv-pfcfMSEes,41534
65
+ pydantic_ai/models/groq.py,sha256=pVLl-4Z5CtiYU7bLgRlFTQhfh4LkMi6-aSkvgDuddrk,29633
66
+ pydantic_ai/models/huggingface.py,sha256=711C0ysjLYKriGfSxPiaF6lqjGcNmIaJaCvAXoucTes,21488
67
67
  pydantic_ai/models/instrumented.py,sha256=J8eVTutr3UP1r_wd5sM5c0BIdzkRqT-EGgd2NiF0ssQ,22319
68
68
  pydantic_ai/models/mcp_sampling.py,sha256=qY4y4nXbRpNp2QbkfjzWLvF_8KLZGXypz4cc0lYRHXU,3553
69
- pydantic_ai/models/mistral.py,sha256=Jtcng1ga56U77-1a6R8VwjMOwCZpZAZTje5qgw7ZVBY,33952
70
- pydantic_ai/models/openai.py,sha256=ZyR5EHCKzi9LwUGAUnXOMjcXL_BgB6G16aCt7uyoSF4,92562
71
- pydantic_ai/models/test.py,sha256=wATXt4OvSYqyStJDsiCbujLbZWXEeztdTormsJOZbTs,20267
69
+ pydantic_ai/models/mistral.py,sha256=fi57hADjYxZw8wEpAcNI6mqY32VG9hHK9GGRQ-9vlZg,33905
70
+ pydantic_ai/models/openai.py,sha256=t-H7Na6Ak7FPApcwn86-Rg_IBCvgBrPwBN-gKSnN_Wg,99216
71
+ pydantic_ai/models/test.py,sha256=5ER66nwZG7Iwm-KkzPo4vwNd3rulzgkpgysu4YcT1W4,20568
72
72
  pydantic_ai/models/wrapper.py,sha256=nwh8Gea59blbr1JDKlUnkYICuI9TUubC4qP7iZRRW28,2440
73
- pydantic_ai/profiles/__init__.py,sha256=FMMCAkEnaK5pNdOEjnxy_sZR5Aj_XF2HHg3Uv8rNj1M,3294
73
+ pydantic_ai/profiles/__init__.py,sha256=UHknN-CYsQexUaxfsgz_J_uSZ9QwistLSuAErQkvbcM,3385
74
74
  pydantic_ai/profiles/amazon.py,sha256=IPa2wydpcbFLLvhDK35-pwwoKo0Pg4vP84823fHx0zc,314
75
75
  pydantic_ai/profiles/anthropic.py,sha256=J9N46G8eOjHdQ5CwZSLiwGdPb0eeIMdsMjwosDpvNhI,275
76
76
  pydantic_ai/profiles/cohere.py,sha256=lcL34Ht1jZopwuqoU6OV9l8vN4zwF-jiPjlsEABbSRo,215
77
77
  pydantic_ai/profiles/deepseek.py,sha256=JDwfkr-0YovlB3jEKk7dNFvepxNf_YuLgLkGCtyXHSk,282
78
- pydantic_ai/profiles/google.py,sha256=QJDl29lwQlE2MBdafCVtwqS9yz-P7zGex28PBSa8NWE,4857
78
+ pydantic_ai/profiles/google.py,sha256=9-fXikwK0gnVQZ7mPWSfF63NgELUjVfkDsaPJDfXiwM,5017
79
79
  pydantic_ai/profiles/grok.py,sha256=nBOxOCYCK9aiLmz2Q-esqYhotNbbBC1boAoOYIk1tVw,211
80
80
  pydantic_ai/profiles/groq.py,sha256=jD_vG6M5q_uwLmJgkPavWWhGCqo3HvT_4UYfwzC1BMU,682
81
81
  pydantic_ai/profiles/harmony.py,sha256=HKOQ1QUBd9jLLabO9jMCq97d3pgAzd3Y7c_jiwPFS2s,555
82
82
  pydantic_ai/profiles/meta.py,sha256=JdZcpdRWx8PY1pU9Z2i_TYtA0Cpbg23xyFrV7eXnooY,309
83
83
  pydantic_ai/profiles/mistral.py,sha256=ll01PmcK3szwlTfbaJLQmfd0TADN8lqjov9HpPJzCMQ,217
84
84
  pydantic_ai/profiles/moonshotai.py,sha256=e1RJnbEvazE6aJAqfmYLYGNtwNwg52XQDRDkcLrv3fU,272
85
- pydantic_ai/profiles/openai.py,sha256=KUklAtUMymCV2yM6qpV9h3zHr7Bl3iiqHELZuOJBIYk,9593
85
+ pydantic_ai/profiles/openai.py,sha256=MXOsktUqfcF2pBgYJMyFWMZafPJ7tejwyoFM2mjKzaY,9689
86
86
  pydantic_ai/profiles/qwen.py,sha256=9SnTpMKndxNQMFyumyaOczJa5JGWbYQdpVKKW4OzKjk,749
87
87
  pydantic_ai/providers/__init__.py,sha256=nqKuq778BrKuZCV8S5evmTKCHkFrakMDAnsHVifdvYI,4613
88
88
  pydantic_ai/providers/anthropic.py,sha256=vwNjO2JJ0Ux_3PXI9_XvzNZ24PKessm8z2ja1uzbBwM,3327
@@ -121,8 +121,8 @@ pydantic_ai/toolsets/prefixed.py,sha256=0KwcDkW8OM36ZUsOLVP5h-Nj2tPq78L3_E2c-1Fb
121
121
  pydantic_ai/toolsets/prepared.py,sha256=Zjfz6S8In6PBVxoKFN9sKPN984zO6t0awB7Lnq5KODw,1431
122
122
  pydantic_ai/toolsets/renamed.py,sha256=JuLHpi-hYPiSPlaTpN8WiXLiGsywYK0axi2lW2Qs75k,1637
123
123
  pydantic_ai/toolsets/wrapper.py,sha256=KRzF1p8dncHbva8CE6Ud-IC5E_aygIHlwH5atXK55k4,1673
124
- pydantic_ai_slim-1.0.14.dist-info/METADATA,sha256=ShPYXYRzjuw6MLy43l4A2XEeY3H5XGJz1FxCYGur5HM,4631
125
- pydantic_ai_slim-1.0.14.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
126
- pydantic_ai_slim-1.0.14.dist-info/entry_points.txt,sha256=kbKxe2VtDCYS06hsI7P3uZGxcVC08-FPt1rxeiMpIps,50
127
- pydantic_ai_slim-1.0.14.dist-info/licenses/LICENSE,sha256=vA6Jc482lEyBBuGUfD1pYx-cM7jxvLYOxPidZ30t_PQ,1100
128
- pydantic_ai_slim-1.0.14.dist-info/RECORD,,
124
+ pydantic_ai_slim-1.0.15.dist-info/METADATA,sha256=f2l2aq6lWglum9DIPNIXWcaeHlEl6VSjWe9zl_xiZso,4631
125
+ pydantic_ai_slim-1.0.15.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
126
+ pydantic_ai_slim-1.0.15.dist-info/entry_points.txt,sha256=kbKxe2VtDCYS06hsI7P3uZGxcVC08-FPt1rxeiMpIps,50
127
+ pydantic_ai_slim-1.0.15.dist-info/licenses/LICENSE,sha256=vA6Jc482lEyBBuGUfD1pYx-cM7jxvLYOxPidZ30t_PQ,1100
128
+ pydantic_ai_slim-1.0.15.dist-info/RECORD,,