pydantic-ai-slim 1.0.14__py3-none-any.whl → 1.0.16__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 (40) hide show
  1. pydantic_ai/__init__.py +19 -1
  2. pydantic_ai/_agent_graph.py +129 -105
  3. pydantic_ai/_cli.py +7 -10
  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/__init__.py +18 -7
  8. pydantic_ai/agent/abstract.py +192 -23
  9. pydantic_ai/agent/wrapper.py +7 -4
  10. pydantic_ai/builtin_tools.py +82 -0
  11. pydantic_ai/direct.py +16 -9
  12. pydantic_ai/durable_exec/dbos/_agent.py +124 -18
  13. pydantic_ai/durable_exec/temporal/_agent.py +139 -19
  14. pydantic_ai/durable_exec/temporal/_model.py +8 -0
  15. pydantic_ai/format_prompt.py +9 -6
  16. pydantic_ai/mcp.py +20 -10
  17. pydantic_ai/messages.py +214 -44
  18. pydantic_ai/models/__init__.py +15 -1
  19. pydantic_ai/models/anthropic.py +27 -22
  20. pydantic_ai/models/cohere.py +4 -0
  21. pydantic_ai/models/function.py +7 -4
  22. pydantic_ai/models/gemini.py +8 -0
  23. pydantic_ai/models/google.py +56 -23
  24. pydantic_ai/models/groq.py +11 -5
  25. pydantic_ai/models/huggingface.py +5 -3
  26. pydantic_ai/models/mistral.py +6 -8
  27. pydantic_ai/models/openai.py +206 -58
  28. pydantic_ai/models/test.py +4 -0
  29. pydantic_ai/output.py +5 -2
  30. pydantic_ai/profiles/__init__.py +2 -0
  31. pydantic_ai/profiles/google.py +5 -2
  32. pydantic_ai/profiles/openai.py +2 -1
  33. pydantic_ai/result.py +51 -35
  34. pydantic_ai/run.py +35 -7
  35. pydantic_ai/usage.py +40 -5
  36. {pydantic_ai_slim-1.0.14.dist-info → pydantic_ai_slim-1.0.16.dist-info}/METADATA +4 -4
  37. {pydantic_ai_slim-1.0.14.dist-info → pydantic_ai_slim-1.0.16.dist-info}/RECORD +40 -40
  38. {pydantic_ai_slim-1.0.14.dist-info → pydantic_ai_slim-1.0.16.dist-info}/WHEEL +0 -0
  39. {pydantic_ai_slim-1.0.14.dist-info → pydantic_ai_slim-1.0.16.dist-info}/entry_points.txt +0 -0
  40. {pydantic_ai_slim-1.0.14.dist-info → pydantic_ai_slim-1.0.16.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',
@@ -67,12 +67,12 @@ class AgentStream(Generic[AgentDepsT, OutputDataT]):
67
67
  except ValidationError:
68
68
  pass
69
69
  if self._raw_stream_response.final_result_event is not None: # pragma: no branch
70
- yield await self.validate_response_output(self._raw_stream_response.get())
70
+ yield await self.validate_response_output(self.response)
71
71
 
72
72
  async def stream_responses(self, *, debounce_by: float | None = 0.1) -> AsyncIterator[_messages.ModelResponse]:
73
73
  """Asynchronously stream the (unvalidated) model responses for the agent."""
74
74
  # if the message currently has any parts with content, yield before streaming
75
- msg = self._raw_stream_response.get()
75
+ msg = self.response
76
76
  for part in msg.parts:
77
77
  if part.has_content():
78
78
  yield msg
@@ -80,7 +80,7 @@ class AgentStream(Generic[AgentDepsT, OutputDataT]):
80
80
 
81
81
  async with _utils.group_by_temporal(self, debounce_by) as group_iter:
82
82
  async for _items in group_iter:
83
- yield self._raw_stream_response.get() # current state of the response
83
+ yield self.response # current state of the response
84
84
 
85
85
  async def stream_text(self, *, delta: bool = False, debounce_by: float | None = 0.1) -> AsyncIterator[str]:
86
86
  """Stream the text result as an async iterable.
@@ -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
@@ -128,7 +136,7 @@ class AgentStream(Generic[AgentDepsT, OutputDataT]):
128
136
  async for _ in self:
129
137
  pass
130
138
 
131
- return await self.validate_response_output(self._raw_stream_response.get())
139
+ return await self.validate_response_output(self.response)
132
140
 
133
141
  async def validate_response_output(
134
142
  self, message: _messages.ModelResponse, *, allow_partial: bool = False
@@ -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:
@@ -195,7 +201,7 @@ class AgentStream(Generic[AgentDepsT, OutputDataT]):
195
201
  # yields tuples of (text_content, part_index)
196
202
  # we don't currently make use of the part_index, but in principle this may be useful
197
203
  # so we retain it here for now to make possible future refactors simpler
198
- msg = self._raw_stream_response.get()
204
+ msg = self.response
199
205
  for i, part in enumerate(msg.parts):
200
206
  if isinstance(part, _messages.TextPart) and part.content:
201
207
  yield part.content, i
@@ -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
@@ -3,8 +3,9 @@ from __future__ import annotations as _annotations
3
3
  import dataclasses
4
4
  from copy import copy
5
5
  from dataclasses import dataclass, fields
6
- from typing import Annotated
6
+ from typing import Annotated, Any
7
7
 
8
+ from genai_prices.data_snapshot import get_snapshot
8
9
  from pydantic import AliasChoices, BeforeValidator, Field
9
10
  from typing_extensions import deprecated, overload
10
11
 
@@ -120,6 +121,39 @@ class RequestUsage(UsageBase):
120
121
  new_usage.incr(other)
121
122
  return new_usage
122
123
 
124
+ @classmethod
125
+ def extract(
126
+ cls,
127
+ data: Any,
128
+ *,
129
+ provider: str,
130
+ provider_url: str,
131
+ provider_fallback: str,
132
+ api_flavor: str | None = None,
133
+ details: dict[str, Any] | None = None,
134
+ ) -> RequestUsage:
135
+ """Extract usage information from the response data using genai-prices.
136
+
137
+ Args:
138
+ data: The response data from the model API.
139
+ provider: The actual provider ID
140
+ provider_url: The provider base_url
141
+ provider_fallback: The fallback provider ID to use if the actual provider is not found in genai-prices.
142
+ For example, an OpenAI model should set this to "openai" in case it has an obscure provider ID.
143
+ api_flavor: The API flavor to use when extracting usage information,
144
+ e.g. 'chat' or 'responses' for OpenAI.
145
+ details: Becomes the `details` field on the returned `RequestUsage` for convenience.
146
+ """
147
+ details = details or {}
148
+ for provider_id, provider_api_url in [(None, provider_url), (provider, None), (provider_fallback, None)]:
149
+ try:
150
+ provider_obj = get_snapshot().find_provider(None, provider_id, provider_api_url)
151
+ _model_ref, extracted_usage = provider_obj.extract_usage(data, api_flavor=api_flavor)
152
+ return cls(**{k: v for k, v in extracted_usage.__dict__.items() if v is not None}, details=details)
153
+ except Exception:
154
+ pass
155
+ return cls(details=details)
156
+
123
157
 
124
158
  @dataclass(repr=False, kw_only=True)
125
159
  class RunUsage(UsageBase):
@@ -340,12 +374,13 @@ class UsageLimits:
340
374
  if self.total_tokens_limit is not None and total_tokens > self.total_tokens_limit:
341
375
  raise UsageLimitExceeded(f'Exceeded the total_tokens_limit of {self.total_tokens_limit} ({total_tokens=})')
342
376
 
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."""
377
+ def check_before_tool_call(self, projected_usage: RunUsage) -> None:
378
+ """Raises a `UsageLimitExceeded` exception if the next tool call(s) would exceed the tool call limit."""
345
379
  tool_calls_limit = self.tool_calls_limit
346
- if tool_calls_limit is not None and usage.tool_calls >= tool_calls_limit:
380
+ tool_calls = projected_usage.tool_calls
381
+ if tool_calls_limit is not None and tool_calls > tool_calls_limit:
347
382
  raise UsageLimitExceeded(
348
- f'The next tool call would exceed the tool_calls_limit of {tool_calls_limit} (tool_calls={usage.tool_calls})'
383
+ f'The next tool call(s) would exceed the tool_calls_limit of {tool_calls_limit} ({tool_calls=}).'
349
384
  )
350
385
 
351
386
  __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.16
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
@@ -29,11 +29,11 @@ Classifier: Topic :: Internet
29
29
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
30
30
  Requires-Python: >=3.10
31
31
  Requires-Dist: exceptiongroup; python_version < '3.11'
32
- Requires-Dist: genai-prices>=0.0.28
32
+ Requires-Dist: genai-prices>=0.0.30
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.16
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.16; 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=D_Oo_LbPqGwkVAaEAcFFERwrg9pVkxeZ45vtTMhES8M,54230
5
+ pydantic_ai/_cli.py,sha256=iZTCFrpJy3aUZ49nJQ5nw2INFw6gPVQd8EhB0rahVcI,14005
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=i5yZ9Tx8IiwXg6Nz9CW4-fyXzxnjP59fsklExCh5sjA,15111
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=cLyWO8g77Y4JzqVSikqodXaAfTn6i-k206rNhYTiIsE,9710
24
+ pydantic_ai/mcp.py,sha256=7Ouwepk-p2rOq_Rkv-MSZYyEGJ6FfrJvR7ySghuSLwc,36693
25
+ pydantic_ai/messages.py,sha256=CuquO_BpWsMQP73GlhcGniMzBa3np926hjUxewommp4,64465
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=sVabgrAJXmj96I7NM-w0RBz1rH5x_zZql1V6epei4JU,26700
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
34
- pydantic_ai/agent/__init__.py,sha256=gmLwyTsyvL89sYvZR83Ba62A8lKLqTfRBk_KYbYYNQo,64116
35
- pydantic_ai/agent/abstract.py,sha256=dOpnqbQTtvc9IozGhFC_juj9vpw5071U_vIklwms_lI,44995
36
- pydantic_ai/agent/wrapper.py,sha256=xZw0spYA5oZkBc6GMcxV4hoQZSr02LbH9GCKqI3MokI,9734
33
+ pydantic_ai/usage.py,sha256=_xXoPIfpENghWcjBvMj0URXQV6YwHWxxZYma4WZ4vUg,15710
34
+ pydantic_ai/agent/__init__.py,sha256=amguU7oy8PT3NTy0MK4Ir-02hgu87hWxc9Ehc2WWyGw,64704
35
+ pydantic_ai/agent/abstract.py,sha256=p94SOxrhvdBJNcBdIw1YHnBbpkgTV3LFjnDOQeWfucI,52859
36
+ pydantic_ai/agent/wrapper.py,sha256=0F7CboJSOjsmhcUy5rNJCtB29DFa0GkCyA_yt_Nq960,9925
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=5GcnOatcuLs1jjLhIEp_9qLhGvg2DYkzP15Zxtf4FrU,38151
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=mwQoasXnxKxk-nMfqBXZFDCmutWSNfD2nv7Tn1xcUBw,42796
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=-vW7aoPrELKnJzbooCEhMu8__jY6iqvWdFJbIKeQPa8,38087
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=_qU8o9PBwmPmELQz3V8OAjxkKy8gXiKtdG6MKQ7Iq_Y,99708
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.16.dist-info/METADATA,sha256=wnSrB4dase8ngwq7y219eZR9aA6FE5HYY6B4FNQ6e-Y,4631
125
+ pydantic_ai_slim-1.0.16.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
126
+ pydantic_ai_slim-1.0.16.dist-info/entry_points.txt,sha256=kbKxe2VtDCYS06hsI7P3uZGxcVC08-FPt1rxeiMpIps,50
127
+ pydantic_ai_slim-1.0.16.dist-info/licenses/LICENSE,sha256=vA6Jc482lEyBBuGUfD1pYx-cM7jxvLYOxPidZ30t_PQ,1100
128
+ pydantic_ai_slim-1.0.16.dist-info/RECORD,,