pydantic-ai-slim 0.6.2__py3-none-any.whl → 0.7.1__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 (58) hide show
  1. pydantic_ai/_a2a.py +6 -4
  2. pydantic_ai/_agent_graph.py +37 -37
  3. pydantic_ai/_cli.py +3 -3
  4. pydantic_ai/_output.py +8 -0
  5. pydantic_ai/_tool_manager.py +3 -0
  6. pydantic_ai/ag_ui.py +25 -14
  7. pydantic_ai/{agent.py → agent/__init__.py} +209 -1027
  8. pydantic_ai/agent/abstract.py +942 -0
  9. pydantic_ai/agent/wrapper.py +227 -0
  10. pydantic_ai/direct.py +9 -9
  11. pydantic_ai/durable_exec/__init__.py +0 -0
  12. pydantic_ai/durable_exec/temporal/__init__.py +83 -0
  13. pydantic_ai/durable_exec/temporal/_agent.py +699 -0
  14. pydantic_ai/durable_exec/temporal/_function_toolset.py +92 -0
  15. pydantic_ai/durable_exec/temporal/_logfire.py +48 -0
  16. pydantic_ai/durable_exec/temporal/_mcp_server.py +145 -0
  17. pydantic_ai/durable_exec/temporal/_model.py +168 -0
  18. pydantic_ai/durable_exec/temporal/_run_context.py +50 -0
  19. pydantic_ai/durable_exec/temporal/_toolset.py +77 -0
  20. pydantic_ai/ext/aci.py +10 -9
  21. pydantic_ai/ext/langchain.py +4 -2
  22. pydantic_ai/mcp.py +203 -75
  23. pydantic_ai/messages.py +2 -2
  24. pydantic_ai/models/__init__.py +93 -9
  25. pydantic_ai/models/anthropic.py +16 -7
  26. pydantic_ai/models/bedrock.py +8 -5
  27. pydantic_ai/models/cohere.py +1 -4
  28. pydantic_ai/models/fallback.py +10 -3
  29. pydantic_ai/models/function.py +9 -4
  30. pydantic_ai/models/gemini.py +15 -9
  31. pydantic_ai/models/google.py +84 -20
  32. pydantic_ai/models/groq.py +17 -14
  33. pydantic_ai/models/huggingface.py +18 -12
  34. pydantic_ai/models/instrumented.py +3 -1
  35. pydantic_ai/models/mcp_sampling.py +3 -1
  36. pydantic_ai/models/mistral.py +12 -18
  37. pydantic_ai/models/openai.py +57 -30
  38. pydantic_ai/models/test.py +3 -0
  39. pydantic_ai/models/wrapper.py +6 -2
  40. pydantic_ai/profiles/openai.py +1 -1
  41. pydantic_ai/providers/google.py +7 -7
  42. pydantic_ai/result.py +21 -55
  43. pydantic_ai/run.py +357 -0
  44. pydantic_ai/tools.py +0 -1
  45. pydantic_ai/toolsets/__init__.py +2 -0
  46. pydantic_ai/toolsets/_dynamic.py +87 -0
  47. pydantic_ai/toolsets/abstract.py +23 -3
  48. pydantic_ai/toolsets/combined.py +19 -4
  49. pydantic_ai/toolsets/deferred.py +10 -2
  50. pydantic_ai/toolsets/function.py +23 -8
  51. pydantic_ai/toolsets/prefixed.py +4 -0
  52. pydantic_ai/toolsets/wrapper.py +14 -1
  53. pydantic_ai/usage.py +17 -1
  54. {pydantic_ai_slim-0.6.2.dist-info → pydantic_ai_slim-0.7.1.dist-info}/METADATA +7 -5
  55. {pydantic_ai_slim-0.6.2.dist-info → pydantic_ai_slim-0.7.1.dist-info}/RECORD +58 -45
  56. {pydantic_ai_slim-0.6.2.dist-info → pydantic_ai_slim-0.7.1.dist-info}/WHEEL +0 -0
  57. {pydantic_ai_slim-0.6.2.dist-info → pydantic_ai_slim-0.7.1.dist-info}/entry_points.txt +0 -0
  58. {pydantic_ai_slim-0.6.2.dist-info → pydantic_ai_slim-0.7.1.dist-info}/licenses/LICENSE +0 -0
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import asyncio
4
4
  from collections.abc import Sequence
5
5
  from contextlib import AsyncExitStack
6
- from dataclasses import dataclass, field
6
+ from dataclasses import dataclass, field, replace
7
7
  from typing import Any, Callable
8
8
 
9
9
  from typing_extensions import Self
@@ -40,6 +40,14 @@ class CombinedToolset(AbstractToolset[AgentDepsT]):
40
40
  self._entered_count = 0
41
41
  self._exit_stack = None
42
42
 
43
+ @property
44
+ def id(self) -> str | None:
45
+ return None # pragma: no cover
46
+
47
+ @property
48
+ def label(self) -> str:
49
+ return f'{self.__class__.__name__}({", ".join(toolset.label for toolset in self.toolsets)})' # pragma: no cover
50
+
43
51
  async def __aenter__(self) -> Self:
44
52
  async with self._enter_lock:
45
53
  if self._entered_count == 0:
@@ -63,13 +71,15 @@ class CombinedToolset(AbstractToolset[AgentDepsT]):
63
71
 
64
72
  for toolset, tools in zip(self.toolsets, toolsets_tools):
65
73
  for name, tool in tools.items():
66
- if existing_tools := all_tools.get(name):
74
+ tool_toolset = tool.toolset
75
+ if existing_tool := all_tools.get(name):
76
+ capitalized_toolset_label = tool_toolset.label[0].upper() + tool_toolset.label[1:]
67
77
  raise UserError(
68
- f'{toolset.name} defines a tool whose name conflicts with existing tool from {existing_tools.toolset.name}: {name!r}. {toolset.tool_name_conflict_hint}'
78
+ f'{capitalized_toolset_label} defines a tool whose name conflicts with existing tool from {existing_tool.toolset.label}: {name!r}. {toolset.tool_name_conflict_hint}'
69
79
  )
70
80
 
71
81
  all_tools[name] = _CombinedToolsetTool(
72
- toolset=tool.toolset,
82
+ toolset=tool_toolset,
73
83
  tool_def=tool.tool_def,
74
84
  max_retries=tool.max_retries,
75
85
  args_validator=tool.args_validator,
@@ -87,3 +97,8 @@ class CombinedToolset(AbstractToolset[AgentDepsT]):
87
97
  def apply(self, visitor: Callable[[AbstractToolset[AgentDepsT]], None]) -> None:
88
98
  for toolset in self.toolsets:
89
99
  toolset.apply(visitor)
100
+
101
+ def visit_and_replace(
102
+ self, visitor: Callable[[AbstractToolset[AgentDepsT]], AbstractToolset[AgentDepsT]]
103
+ ) -> AbstractToolset[AgentDepsT]:
104
+ return replace(self, toolsets=[toolset.visit_and_replace(visitor) for toolset in self.toolsets])
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from dataclasses import dataclass, replace
3
+ from dataclasses import replace
4
4
  from typing import Any
5
5
 
6
6
  from pydantic_core import SchemaValidator, core_schema
@@ -12,7 +12,6 @@ from .abstract import AbstractToolset, ToolsetTool
12
12
  TOOL_SCHEMA_VALIDATOR = SchemaValidator(schema=core_schema.any_schema())
13
13
 
14
14
 
15
- @dataclass
16
15
  class DeferredToolset(AbstractToolset[AgentDepsT]):
17
16
  """A toolset that holds deferred tools whose results will be produced outside of the Pydantic AI agent run in which they were called.
18
17
 
@@ -20,6 +19,15 @@ class DeferredToolset(AbstractToolset[AgentDepsT]):
20
19
  """
21
20
 
22
21
  tool_defs: list[ToolDefinition]
22
+ _id: str | None
23
+
24
+ def __init__(self, tool_defs: list[ToolDefinition], *, id: str | None = None):
25
+ self.tool_defs = tool_defs
26
+ self._id = id
27
+
28
+ @property
29
+ def id(self) -> str | None:
30
+ return self._id
23
31
 
24
32
  async def get_tools(self, ctx: RunContext[AgentDepsT]) -> dict[str, ToolsetTool[AgentDepsT]]:
25
33
  return {
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from collections.abc import Awaitable, Sequence
4
- from dataclasses import dataclass, field, replace
4
+ from dataclasses import dataclass, replace
5
5
  from typing import Any, Callable, overload
6
6
 
7
7
  from pydantic.json_schema import GenerateJsonSchema
@@ -20,30 +20,40 @@ from .abstract import AbstractToolset, ToolsetTool
20
20
 
21
21
 
22
22
  @dataclass
23
- class _FunctionToolsetTool(ToolsetTool[AgentDepsT]):
23
+ class FunctionToolsetTool(ToolsetTool[AgentDepsT]):
24
24
  """A tool definition for a function toolset tool that keeps track of the function to call."""
25
25
 
26
26
  call_func: Callable[[dict[str, Any], RunContext[AgentDepsT]], Awaitable[Any]]
27
+ is_async: bool
27
28
 
28
29
 
29
- @dataclass(init=False)
30
30
  class FunctionToolset(AbstractToolset[AgentDepsT]):
31
31
  """A toolset that lets Python functions be used as tools.
32
32
 
33
33
  See [toolset docs](../toolsets.md#function-toolset) for more information.
34
34
  """
35
35
 
36
- max_retries: int = field(default=1)
37
- tools: dict[str, Tool[Any]] = field(default_factory=dict)
36
+ max_retries: int
37
+ tools: dict[str, Tool[Any]]
38
+ _id: str | None
38
39
 
39
- def __init__(self, tools: Sequence[Tool[AgentDepsT] | ToolFuncEither[AgentDepsT, ...]] = [], max_retries: int = 1):
40
+ def __init__(
41
+ self,
42
+ tools: Sequence[Tool[AgentDepsT] | ToolFuncEither[AgentDepsT, ...]] = [],
43
+ max_retries: int = 1,
44
+ *,
45
+ id: str | None = None,
46
+ ):
40
47
  """Build a new function toolset.
41
48
 
42
49
  Args:
43
50
  tools: The tools to add to the toolset.
44
51
  max_retries: The maximum number of retries for each tool during a run.
52
+ id: An optional unique ID for the toolset. A toolset needs to have an ID in order to be used in a durable execution environment like Temporal, in which case the ID will be used to identify the toolset's activities within the workflow.
45
53
  """
46
54
  self.max_retries = max_retries
55
+ self._id = id
56
+
47
57
  self.tools = {}
48
58
  for tool in tools:
49
59
  if isinstance(tool, Tool):
@@ -51,6 +61,10 @@ class FunctionToolset(AbstractToolset[AgentDepsT]):
51
61
  else:
52
62
  self.add_function(tool)
53
63
 
64
+ @property
65
+ def id(self) -> str | None:
66
+ return self._id
67
+
54
68
  @overload
55
69
  def tool(self, func: ToolFuncEither[AgentDepsT, ToolParams], /) -> ToolFuncEither[AgentDepsT, ToolParams]: ...
56
70
 
@@ -222,17 +236,18 @@ class FunctionToolset(AbstractToolset[AgentDepsT]):
222
236
  else:
223
237
  raise UserError(f'Tool name conflicts with previously renamed tool: {new_name!r}.')
224
238
 
225
- tools[new_name] = _FunctionToolsetTool(
239
+ tools[new_name] = FunctionToolsetTool(
226
240
  toolset=self,
227
241
  tool_def=tool_def,
228
242
  max_retries=tool.max_retries if tool.max_retries is not None else self.max_retries,
229
243
  args_validator=tool.function_schema.validator,
230
244
  call_func=tool.function_schema.call,
245
+ is_async=tool.function_schema.is_async,
231
246
  )
232
247
  return tools
233
248
 
234
249
  async def call_tool(
235
250
  self, name: str, tool_args: dict[str, Any], ctx: RunContext[AgentDepsT], tool: ToolsetTool[AgentDepsT]
236
251
  ) -> Any:
237
- assert isinstance(tool, _FunctionToolsetTool)
252
+ assert isinstance(tool, FunctionToolsetTool)
238
253
  return await tool.call_func(tool_args, ctx)
@@ -17,6 +17,10 @@ class PrefixedToolset(WrapperToolset[AgentDepsT]):
17
17
 
18
18
  prefix: str
19
19
 
20
+ @property
21
+ def tool_name_conflict_hint(self) -> str:
22
+ return 'Change the `prefix` attribute to avoid name conflicts.'
23
+
20
24
  async def get_tools(self, ctx: RunContext[AgentDepsT]) -> dict[str, ToolsetTool[AgentDepsT]]:
21
25
  return {
22
26
  new_name: replace(
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from dataclasses import dataclass
3
+ from dataclasses import dataclass, replace
4
4
  from typing import Any, Callable
5
5
 
6
6
  from typing_extensions import Self
@@ -18,6 +18,14 @@ class WrapperToolset(AbstractToolset[AgentDepsT]):
18
18
 
19
19
  wrapped: AbstractToolset[AgentDepsT]
20
20
 
21
+ @property
22
+ def id(self) -> str | None:
23
+ return None # pragma: no cover
24
+
25
+ @property
26
+ def label(self) -> str:
27
+ return f'{self.__class__.__name__}({self.wrapped.label})'
28
+
21
29
  async def __aenter__(self) -> Self:
22
30
  await self.wrapped.__aenter__()
23
31
  return self
@@ -35,3 +43,8 @@ class WrapperToolset(AbstractToolset[AgentDepsT]):
35
43
 
36
44
  def apply(self, visitor: Callable[[AbstractToolset[AgentDepsT]], None]) -> None:
37
45
  self.wrapped.apply(visitor)
46
+
47
+ def visit_and_replace(
48
+ self, visitor: Callable[[AbstractToolset[AgentDepsT]], AbstractToolset[AgentDepsT]]
49
+ ) -> AbstractToolset[AgentDepsT]:
50
+ return replace(self, wrapped=self.wrapped.visit_and_replace(visitor))
pydantic_ai/usage.py CHANGED
@@ -96,6 +96,10 @@ class UsageLimits:
96
96
  """The maximum number of tokens allowed in responses from the model."""
97
97
  total_tokens_limit: int | None = None
98
98
  """The maximum number of tokens allowed in requests and responses combined."""
99
+ count_tokens_before_request: bool = False
100
+ """If True, perform a token counting pass before sending the request to the model,
101
+ to enforce `request_tokens_limit` ahead of time. This may incur additional overhead
102
+ (from calling the model's `count_tokens` API before making the actual request) and is disabled by default."""
99
103
 
100
104
  def has_token_limits(self) -> bool:
101
105
  """Returns `True` if this instance places any limits on token counts.
@@ -111,11 +115,23 @@ class UsageLimits:
111
115
  )
112
116
 
113
117
  def check_before_request(self, usage: Usage) -> None:
114
- """Raises a `UsageLimitExceeded` exception if the next request would exceed the request_limit."""
118
+ """Raises a `UsageLimitExceeded` exception if the next request would exceed any of the limits."""
115
119
  request_limit = self.request_limit
116
120
  if request_limit is not None and usage.requests >= request_limit:
117
121
  raise UsageLimitExceeded(f'The next request would exceed the request_limit of {request_limit}')
118
122
 
123
+ request_tokens = usage.request_tokens or 0
124
+ if self.request_tokens_limit is not None and request_tokens > self.request_tokens_limit:
125
+ raise UsageLimitExceeded(
126
+ f'The next request would exceed the request_tokens_limit of {self.request_tokens_limit} ({request_tokens=})'
127
+ )
128
+
129
+ total_tokens = usage.total_tokens or 0
130
+ if self.total_tokens_limit is not None and total_tokens > self.total_tokens_limit:
131
+ raise UsageLimitExceeded(
132
+ f'The next request would exceed the total_tokens_limit of {self.total_tokens_limit} ({total_tokens=})'
133
+ )
134
+
119
135
  def check_tokens(self, usage: Usage) -> None:
120
136
  """Raises a `UsageLimitExceeded` exception if the usage exceeds any of the token limits."""
121
137
  request_tokens = usage.request_tokens or 0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pydantic-ai-slim
3
- Version: 0.6.2
3
+ Version: 0.7.1
4
4
  Summary: Agent Framework / shim to use Pydantic with LLMs, slim package
5
5
  Author-email: Samuel Colvin <samuel@pydantic.dev>, Marcelo Trylesinski <marcelotryle@gmail.com>, David Montague <david@pydantic.dev>, Alex Hall <alex@pydantic.dev>, Douwe Maan <douwe@pydantic.dev>
6
6
  License-Expression: MIT
@@ -30,7 +30,7 @@ Requires-Dist: exceptiongroup; python_version < '3.11'
30
30
  Requires-Dist: griffe>=1.3.2
31
31
  Requires-Dist: httpx>=0.27
32
32
  Requires-Dist: opentelemetry-api>=1.28.0
33
- Requires-Dist: pydantic-graph==0.6.2
33
+ Requires-Dist: pydantic-graph==0.7.1
34
34
  Requires-Dist: pydantic>=2.10
35
35
  Requires-Dist: typing-inspection>=0.4.0
36
36
  Provides-Extra: a2a
@@ -51,7 +51,7 @@ Requires-Dist: cohere>=5.16.0; (platform_system != 'Emscripten') and extra == 'c
51
51
  Provides-Extra: duckduckgo
52
52
  Requires-Dist: ddgs>=9.0.0; extra == 'duckduckgo'
53
53
  Provides-Extra: evals
54
- Requires-Dist: pydantic-evals==0.6.2; extra == 'evals'
54
+ Requires-Dist: pydantic-evals==0.7.1; extra == 'evals'
55
55
  Provides-Extra: google
56
56
  Requires-Dist: google-genai>=1.28.0; extra == 'google'
57
57
  Provides-Extra: groq
@@ -59,17 +59,19 @@ Requires-Dist: groq>=0.25.0; extra == 'groq'
59
59
  Provides-Extra: huggingface
60
60
  Requires-Dist: huggingface-hub[inference]>=0.33.5; extra == 'huggingface'
61
61
  Provides-Extra: logfire
62
- Requires-Dist: logfire>=3.11.0; extra == 'logfire'
62
+ Requires-Dist: logfire>=3.14.1; extra == 'logfire'
63
63
  Provides-Extra: mcp
64
64
  Requires-Dist: mcp>=1.10.0; (python_version >= '3.10') and extra == 'mcp'
65
65
  Provides-Extra: mistral
66
66
  Requires-Dist: mistralai>=1.9.2; extra == 'mistral'
67
67
  Provides-Extra: openai
68
- Requires-Dist: openai>=1.92.0; extra == 'openai'
68
+ Requires-Dist: openai>=1.99.9; extra == 'openai'
69
69
  Provides-Extra: retries
70
70
  Requires-Dist: tenacity>=8.2.3; extra == 'retries'
71
71
  Provides-Extra: tavily
72
72
  Requires-Dist: tavily-python>=0.5.0; extra == 'tavily'
73
+ Provides-Extra: temporal
74
+ Requires-Dist: temporalio>=1.15.0; extra == 'temporal'
73
75
  Provides-Extra: vertexai
74
76
  Requires-Dist: google-auth>=2.36.0; extra == 'vertexai'
75
77
  Requires-Dist: requests>=2.32.2; extra == 'vertexai'
@@ -1,55 +1,67 @@
1
1
  pydantic_ai/__init__.py,sha256=Uy0J4BgX4CXsa0sUUb5K0FC4uUWGIwBici93QHLkNsk,1478
2
2
  pydantic_ai/__main__.py,sha256=Q_zJU15DUA01YtlJ2mnaLCoId2YmgmreVEERGuQT-Y0,132
3
- pydantic_ai/_a2a.py,sha256=Tw_j9VRud0rLEk5kRs4GhRyhWYioXnsoZaTTyISq4M4,12126
4
- pydantic_ai/_agent_graph.py,sha256=1VK6SAYFJBYtUoK0i49fTbG81oiHGvrD9oonPDU1mIs,37818
5
- pydantic_ai/_cli.py,sha256=YkiW2u9HGPd9fsgo9dpK1DZvtUPk4uXGQJcm75XgfhU,13250
3
+ pydantic_ai/_a2a.py,sha256=wux52DmJQceLJwF71qxb0Uqupk3aS61m005-NmuWZIw,12164
4
+ pydantic_ai/_agent_graph.py,sha256=CairpjIY302UegGzzA5C56kDqvXR6l2gcR6vSdai2JI,37714
5
+ pydantic_ai/_cli.py,sha256=nr3hW7Y4vHzk7oXpfOCupwuJ6Z2SmZLz2dYS6ljCpuc,13281
6
6
  pydantic_ai/_function_schema.py,sha256=YFHxb6bKfhgeY6rNdbuYXgndGCDanveUx2258xkSNlQ,11233
7
7
  pydantic_ai/_griffe.py,sha256=Ugft16ZHw9CN_6-lW0Svn6jESK9zHXO_x4utkGBkbBI,5253
8
8
  pydantic_ai/_mcp.py,sha256=PuvwnlLjv7YYOa9AZJCrklevBug99zGMhwJCBGG7BHQ,5626
9
- pydantic_ai/_output.py,sha256=2k-nxfPNLJEb-wjnPhQo63lh-yQH1XsIhNG1hjsrim0,37462
9
+ pydantic_ai/_output.py,sha256=6Vxlw8F9nRWCkjy4qvFF8tmDi2xZn7Dq72T6s4C5kAM,37640
10
10
  pydantic_ai/_parts_manager.py,sha256=lWXN75zLy_MSDz4Wib65lqIPHk1SY8KDU8_OYaxG3yw,17788
11
11
  pydantic_ai/_run_context.py,sha256=pqb_HPXytE1Z9zZRRuBboRYes_tVTC75WGTpZgnb2Ko,1691
12
12
  pydantic_ai/_system_prompt.py,sha256=lUSq-gDZjlYTGtd6BUm54yEvTIvgdwBmJ8mLsNZZtYU,1142
13
13
  pydantic_ai/_thinking_part.py,sha256=x80-Vkon16GOyq3W6f2qzafTVPC5dCgF7QD3k8ZMmYU,1304
14
- pydantic_ai/_tool_manager.py,sha256=BdjPntbSshNvYVpYZUNxb-yib5n4GPqcDinbNpzhBVo,8960
14
+ pydantic_ai/_tool_manager.py,sha256=0_4Ed8kUj_Z_AdTpyBdz5rdYbmlCxf1DUh2vrIk7rYE,9031
15
15
  pydantic_ai/_utils.py,sha256=Ge9rtu8NJvsfSFjx1MduITPr0-9b_I0emDFSpwJbYes,16372
16
- pydantic_ai/ag_ui.py,sha256=snIBVMcUUm3WWZ5P5orikyAzvM-7vGunNMgIudhvK-A,26156
17
- pydantic_ai/agent.py,sha256=inwfTJJMiE3IBjle6aFycqhnN-JJMUEfbsgWyMkRIOo,96346
16
+ pydantic_ai/ag_ui.py,sha256=2cKSSvl1j0pxVNCFQO82l7LVtkJMt0HUaEXGwy3y558,26463
18
17
  pydantic_ai/builtin_tools.py,sha256=mwIq-7m0ZSbCZp1zxswjRfQM648QE01IDfifvqDGxUQ,3023
19
- pydantic_ai/direct.py,sha256=WRfgke3zm-eeR39LTuh9XI2TrdHXAqO81eDvFwih4Ko,14803
18
+ pydantic_ai/direct.py,sha256=mduSzkCapSAuzV90da1aARy9n-Jwj6papgbMWGbWIkQ,14943
20
19
  pydantic_ai/exceptions.py,sha256=vHRH_b6JpMi5p5EGhz2O4FSeKGJv3WMD291Y1FjHYFc,3528
21
20
  pydantic_ai/format_prompt.py,sha256=Or-Ytq55RQb1UJqy2HKIyPpZ-knWXfdDP3Z6tNc6Orw,4244
22
- pydantic_ai/mcp.py,sha256=v_f4CRzJ399uPC96aqTiEzpaYvuo6vIQyLIpXQBudsY,26271
23
- pydantic_ai/messages.py,sha256=HPsVQ-V2mLZ22xbUGe8vuKH8z1uQ95DvYuTpCS_Zxc4,45658
21
+ pydantic_ai/mcp.py,sha256=n9_ECHmFE-eOZmb1bDh94oy81caefdtSGo1oH2KKWMo,31162
22
+ pydantic_ai/messages.py,sha256=kLw3yBtUEoRQ43zZ43PpasgC6EeVbSQi4Fl0PB1tQwA,45700
24
23
  pydantic_ai/output.py,sha256=54Cwd1RruXlA5hucZ1h-SxFrzKHJuLvYvLtH9iyg2GI,11988
25
24
  pydantic_ai/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
- pydantic_ai/result.py,sha256=N9YJ8WshUUyLgdbDVivmhgn8e6NPqFH9JQjEoR2_J9E,21767
25
+ pydantic_ai/result.py,sha256=PgsaEcIFt9rkWs3F3RW2jqI8Qhmf5gEtCHZ7jVr2d34,19765
27
26
  pydantic_ai/retries.py,sha256=Xkj-gZAd3wc12CVsIErVYx2EIdIwD5yJOL4Ou6jDQ2s,10498
27
+ pydantic_ai/run.py,sha256=VSZEadgzRc_tytnHt2Gemdv9z05e6aEJTNPQ7DmuUck,15130
28
28
  pydantic_ai/settings.py,sha256=yuUZ7-GkdPB-Gbx71kSdh8dSr6gwM9gEwk84qNxPO_I,3552
29
- pydantic_ai/tools.py,sha256=4UNpllVugXaJWLlehVgjoOyM-r4jy4vJ7uSUSbsPBiQ,14765
30
- pydantic_ai/usage.py,sha256=ceC9HHflyM_rkLBJqtaWPc-M8bEoq5rZF4XwGblPQoU,5830
29
+ pydantic_ai/tools.py,sha256=H7pCfLYvtQ9j2I5qQGF_UCzUpufO14vEgLowFE8msNA,14764
30
+ pydantic_ai/usage.py,sha256=UddLBMmytzKBmsLzyGHHbJAnr4VQkMA8-vSjCeifz3w,6801
31
+ pydantic_ai/agent/__init__.py,sha256=GrQ_HqEo8Usw4QGzCOqD6zjn_htDs2zK53ocm1Fr4WM,60033
32
+ pydantic_ai/agent/abstract.py,sha256=m83vk00sV7q3MqIHucExkMsiEF52dANHptGl8TNEkbw,42035
33
+ pydantic_ai/agent/wrapper.py,sha256=cVIpfPWF63oTD1jeWdFY-OS_ty2nwbeSwsI7upd30Kw,9155
31
34
  pydantic_ai/common_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
35
  pydantic_ai/common_tools/duckduckgo.py,sha256=aQsm7zKuoRNgPM8ltbdyj8dPkREEkQenimsf_laF6kc,2245
33
36
  pydantic_ai/common_tools/tavily.py,sha256=Q1xxSF5HtXAaZ10Pp-OaDOHXwJf2mco9wScGEQXD7E4,2495
37
+ pydantic_ai/durable_exec/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
+ pydantic_ai/durable_exec/temporal/__init__.py,sha256=kzUnYUOmHNIsn6UzAa3-vEZx0VpIDZiY84iaRm6z-Qs,3356
39
+ pydantic_ai/durable_exec/temporal/_agent.py,sha256=hKJW-oCU5W83sofQ-1f40IQe1FS-qrcmq4Dr-KcSy2c,32864
40
+ pydantic_ai/durable_exec/temporal/_function_toolset.py,sha256=qKTs7T6YcJ2LBOvrlYBRUHd9zn86TuUaY0Qw5TPGSmE,3848
41
+ pydantic_ai/durable_exec/temporal/_logfire.py,sha256=_dsvVIdpYJEUyoFUIDYQjCO6TjTITqvlJHwNy_Fi2cw,1866
42
+ pydantic_ai/durable_exec/temporal/_mcp_server.py,sha256=J7CC4gRDhM4uQo3_kNKV7e4uiWC0He0AgS7bdq9Pt4o,6005
43
+ pydantic_ai/durable_exec/temporal/_model.py,sha256=3EN9NuTjmWsB57Y9ukvo4hFf3bw-xF90QNSJ18y1iRk,6631
44
+ pydantic_ai/durable_exec/temporal/_run_context.py,sha256=5NTomzWBAlFcXeVw-4mqa76Rmrc8b3G1bB5ElVsAyCY,2310
45
+ pydantic_ai/durable_exec/temporal/_toolset.py,sha256=XlQx7NGSKR9n-mjNWaTn-i3HW9X4z5fZUAM9DwDTBwY,2865
34
46
  pydantic_ai/ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
- pydantic_ai/ext/aci.py,sha256=vUaNIj6pRM52x6RkPW_DohSYxJPm75pPUfOMw2i5Xx0,2515
36
- pydantic_ai/ext/langchain.py,sha256=GemxfhpyG1JPxj69PbRiSJANnY8Q5s4hSB7wqt-uTbo,2266
37
- pydantic_ai/models/__init__.py,sha256=BzQFH8ncFbQs9dWnQugilodg7ycvdYc4csp_Dj7_Y3E,31131
38
- pydantic_ai/models/anthropic.py,sha256=vJzO-DjL3sN3-xd_oTjPjI2h1NzEQBTw4T6DsMm-4G8,29424
39
- pydantic_ai/models/bedrock.py,sha256=FbHSb6go0vLUKOfJ1f7fz3APgG_Ct0325DmPxysFhR0,30788
40
- pydantic_ai/models/cohere.py,sha256=EUDKwF-UZjEqmZvqOA7sLpYnaythiG_3unGpcRNAI1c,13261
41
- pydantic_ai/models/fallback.py,sha256=URaV-dTQWkg99xrlkmknue5lXZWDcEt7cJ1Vsky4oB4,5130
42
- pydantic_ai/models/function.py,sha256=qKDltLV2hNFivZGj0spAtloLwY5yL0XbiZqQ-2Zk9JE,14117
43
- pydantic_ai/models/gemini.py,sha256=1Od0FqE-pA_fCaHLleMTK4XKb7Ue6GTeeQbRgSHVesk,38538
44
- pydantic_ai/models/google.py,sha256=lijot-mkchJXV7XryHZOMFM3bdt-t7nfjQ8j82oVcvE,26131
45
- pydantic_ai/models/groq.py,sha256=MUshoLXZWDkyPZm7_JxUEFm28AJOQHe6ikh-DRdYGAk,20772
46
- pydantic_ai/models/huggingface.py,sha256=fkAtCpZom_Nlf2yylUtFEHKm4NebHd2edfI_0vGgnSU,19660
47
- pydantic_ai/models/instrumented.py,sha256=j6zFwfF_xxog2OrU2xaObBRkc0wyGqjIqFIMv7cxqmI,16212
48
- pydantic_ai/models/mcp_sampling.py,sha256=q9nnjNEAAbhrfRc_Qw5z9TtCHMG_SwlCWW9FvKWjh8k,3395
49
- pydantic_ai/models/mistral.py,sha256=NuHxGMlxL9zUOeqggoWgu7Tii2-9MPMMZDsoYYCINkw,32386
50
- pydantic_ai/models/openai.py,sha256=2DlShhEY3iJoQkOHJy_G-SIN3LrvOePV5FKBrhfeH1E,59765
51
- pydantic_ai/models/test.py,sha256=33kb7Z3CWdTRIsVAiir-OVr7Er8QjW1qFfLc6jzjCKc,18998
52
- pydantic_ai/models/wrapper.py,sha256=A5-ncYhPF8c9S_czGoXkd55s2KOQb65p3jbVpwZiFPA,2043
47
+ pydantic_ai/ext/aci.py,sha256=sUllKDNO-LOMurbFgxwRHuzNlBkSa3aVBqXfEm-A_vo,2545
48
+ pydantic_ai/ext/langchain.py,sha256=iLVEZv1kcLkdIHo3us2yfdi0kVqyJ6qTaCt9BoLWm4k,2335
49
+ pydantic_ai/models/__init__.py,sha256=PQcyiPaSj72mt9kjPgg69eboqHqRl0JlBHTS3eCO5uY,34611
50
+ pydantic_ai/models/anthropic.py,sha256=th3jyYMcqa-I_hyOvtH5PKyOCX-IDnriaMT5VPKBVAo,29777
51
+ pydantic_ai/models/bedrock.py,sha256=wlw-9zuRnvMW-T5Nt1_rBTLWrYBllhCbu1GzkaBWddk,30819
52
+ pydantic_ai/models/cohere.py,sha256=ZbRvCPgPjDLItUj-r08VPmR8D8e6ARbUiRd8rsZ-1sY,13094
53
+ pydantic_ai/models/fallback.py,sha256=8d5C2MDbVBQ1NFHIciaIAJd8-DGzpTbMzIPIR1Dj4Xc,5514
54
+ pydantic_ai/models/function.py,sha256=CKSy_xA__n92BnOzfI9BXRsRVy3WjvuRyzibU26I8Js,14299
55
+ pydantic_ai/models/gemini.py,sha256=SWeahyDS_8STbofWJoIDvayBIGv-d4CYUuIBERPZkpI,38676
56
+ pydantic_ai/models/google.py,sha256=xiAbIT0WkfdwwvjGY5WzOgTpkpxXI7-A2cvnyxwmI8s,29636
57
+ pydantic_ai/models/groq.py,sha256=xibIAuIpSbdlF5ONAKLpEcU3qYX3JfAJRBh2K7Fh_U4,20840
58
+ pydantic_ai/models/huggingface.py,sha256=ONsqk_4YiojEpVzJvAjc5z92Bln71PKvk8eK53309bk,19731
59
+ pydantic_ai/models/instrumented.py,sha256=vVHO2sHkZnH7kcFr2iozOOuacfwGQYORhSgUtvDYZEU,16315
60
+ pydantic_ai/models/mcp_sampling.py,sha256=0pAMCTkzmhQuyhik8KG2ZUYGVh4tofjdZBf6WdR78ik,3490
61
+ pydantic_ai/models/mistral.py,sha256=-nB6VoHvNveLZHRCmXQaX9EFUJlFHXXt7nRyFtI2SIE,32251
62
+ pydantic_ai/models/openai.py,sha256=ys4opGwro9SX-JA2-Xul5hV_xydq5LusOR5Ck-D18Uo,61110
63
+ pydantic_ai/models/test.py,sha256=XKfJOwjnaMAuGpQwMT-H99vIicFymdJDpAtr0PU0Zoo,19151
64
+ pydantic_ai/models/wrapper.py,sha256=9MeHW7mXPsEK03IKL0rtjeX6QgXyZROOOzLh72GiX2k,2148
53
65
  pydantic_ai/profiles/__init__.py,sha256=Ggk_pbNnRcaGnDWEBppsH3sUk8ajckaaXKfJlkLQWVo,2775
54
66
  pydantic_ai/profiles/_json_schema.py,sha256=CthOGmPSjgEZRRglfvg31zyQ9vjHDdacXoFpmba93dE,7206
55
67
  pydantic_ai/profiles/amazon.py,sha256=IPa2wydpcbFLLvhDK35-pwwoKo0Pg4vP84823fHx0zc,314
@@ -62,7 +74,7 @@ pydantic_ai/profiles/groq.py,sha256=5jLNnOuxq3HTrbY-cizJyGa1hIluW7sCPLmDP1C1unc,
62
74
  pydantic_ai/profiles/meta.py,sha256=JdZcpdRWx8PY1pU9Z2i_TYtA0Cpbg23xyFrV7eXnooY,309
63
75
  pydantic_ai/profiles/mistral.py,sha256=ll01PmcK3szwlTfbaJLQmfd0TADN8lqjov9HpPJzCMQ,217
64
76
  pydantic_ai/profiles/moonshotai.py,sha256=LL5RacKHKn6rdvhoKjpGgZ8aVriv5NMeL6HCWEANAiU,223
65
- pydantic_ai/profiles/openai.py,sha256=80ffJK9T7YbBRR7mhyRkjDB29pYi2H4dIQOAmIr5Ppc,7530
77
+ pydantic_ai/profiles/openai.py,sha256=YIzZAeJWO8dhmeHcOQk-Kyh6DUd5b0I5EQSTcK0-qy4,7564
66
78
  pydantic_ai/profiles/qwen.py,sha256=zU19r2lVBxU0v0fXyA9G-VvG3XzBZMZJVxCpQutU9k0,309
67
79
  pydantic_ai/providers/__init__.py,sha256=yxPgiTJKFYZbDW18tmVM6mmD2Znol3WwniwnhtlN0Ak,4141
68
80
  pydantic_ai/providers/anthropic.py,sha256=D35UXxCPXv8yIbD0fj9Zg2FvNyoMoJMeDUtVM8Sn78I,3046
@@ -72,7 +84,7 @@ pydantic_ai/providers/cohere.py,sha256=LT6QaLPJBBlFUgYgXQOfKpbM9SXLzorWFxI7jNfOX
72
84
  pydantic_ai/providers/deepseek.py,sha256=kUdM8eVp1lse4bS_uy70Gy7wgog94NTZ36GY-vhSB50,3060
73
85
  pydantic_ai/providers/fireworks.py,sha256=TPbqOpNgXG59qovBaHWbbV2vsvROwlHwQ3PvqHUBH-s,3626
74
86
  pydantic_ai/providers/github.py,sha256=zPu3oVJKjUE4zIqZ0YfgcTFBNdEy5rIBrSOdPCHJEG4,4406
75
- pydantic_ai/providers/google.py,sha256=iyAqYB-Rcpy6Rea-QfS_FL1v6ej-DZpGx-rPY3X_df0,6067
87
+ pydantic_ai/providers/google.py,sha256=iLXcKUl5r7wdLuZtT1IM3obGZi7ecLM_PDyWdQKDncI,6038
76
88
  pydantic_ai/providers/google_gla.py,sha256=dLkDxps5gEtxsQiDbs1e88lXLYeX4i2qnJtDiFFJ0Ng,1965
77
89
  pydantic_ai/providers/google_vertex.py,sha256=9wJGctzQTEtmTTr3KCFAubDREMQJ4zOXt9k52F8R8Zs,9739
78
90
  pydantic_ai/providers/grok.py,sha256=dIkpxuuJlZ4pFtTSgeeJgiM_Z3mJU9qvk4f7jvSzi24,3141
@@ -85,18 +97,19 @@ pydantic_ai/providers/openai.py,sha256=7iGij0EaFylab7dTZAZDgXr78tr-HsZrn9EI9AkWB
85
97
  pydantic_ai/providers/openrouter.py,sha256=NXjNdnlXIBrBMMqbzcWQnowXOuZh4NHikXenBn5h3mc,4061
86
98
  pydantic_ai/providers/together.py,sha256=zFVSMSm5jXbpkNouvBOTjWrPmlPpCp6sQS5LMSyVjrQ,3482
87
99
  pydantic_ai/providers/vercel.py,sha256=wFIfyfD2RCAVRWtveDDMjumOkP8v9AHy94KV1HXF180,4285
88
- pydantic_ai/toolsets/__init__.py,sha256=JCnqqAFeuHhmVW4XK0LM6Op_9B1cvsQUJ3vTmQ9Z5cQ,590
89
- pydantic_ai/toolsets/abstract.py,sha256=LqunlpwUsoHVn4VMtdjEoLY5kiMUF74PZ4KW539K8tQ,6027
90
- pydantic_ai/toolsets/combined.py,sha256=UBSZ5quJAm4aITkI4enOTJ6sEDndkJ2sKvT1sTeX5LU,3440
91
- pydantic_ai/toolsets/deferred.py,sha256=j_CO2KesBXFPyVYiIk3sO2bimJ1bssnShdaGx4UNuPQ,1444
100
+ pydantic_ai/toolsets/__init__.py,sha256=btvEfRHUzW8E6HiWP-AUKc0xBvIEigW6qWqVfnN11Ag,643
101
+ pydantic_ai/toolsets/_dynamic.py,sha256=EdhClHnmxEy3bdGdVrzg4TLGlYrK3m8VIqWxzGdIXew,2957
102
+ pydantic_ai/toolsets/abstract.py,sha256=jYgDcgnuWfMAgcjqripJQOlxWf2O7R-rAfsZUcC1MoI,7061
103
+ pydantic_ai/toolsets/combined.py,sha256=QmzU7jA98hnbddMOqvwuu2vUZoaPspu37-W0-hlQ-lw,4122
104
+ pydantic_ai/toolsets/deferred.py,sha256=Bm2ZthtjpmeZqlH57zFJc9z7n_xYtZgjX5hog36Qm9U,1654
92
105
  pydantic_ai/toolsets/filtered.py,sha256=qmPeQDTZoWa_yyk6VXKHcpV9NFgdnLN48sBf7WItjBs,855
93
- pydantic_ai/toolsets/function.py,sha256=Pgc8q6vh3qkBzI3xL0k-CQaETGG63zfy1PyWtqqzXwc,10186
94
- pydantic_ai/toolsets/prefixed.py,sha256=MIStkzUdiU0rk2Y6P19IrTBxspH5pTstGxsqCBt-CX0,1293
106
+ pydantic_ai/toolsets/function.py,sha256=KKmHMljuV8YdaIDtHEs6xmyiUl-kaqTiQQGYtoWEfEs,10613
107
+ pydantic_ai/toolsets/prefixed.py,sha256=0KwcDkW8OM36ZUsOLVP5h-Nj2tPq78L3_E2c-1Fbh5s,1426
95
108
  pydantic_ai/toolsets/prepared.py,sha256=Zjfz6S8In6PBVxoKFN9sKPN984zO6t0awB7Lnq5KODw,1431
96
109
  pydantic_ai/toolsets/renamed.py,sha256=JuLHpi-hYPiSPlaTpN8WiXLiGsywYK0axi2lW2Qs75k,1637
97
- pydantic_ai/toolsets/wrapper.py,sha256=WjLoiM1WDuffSJ4mDS6pZrEZGHgZ421fjrqFcB66W94,1205
98
- pydantic_ai_slim-0.6.2.dist-info/METADATA,sha256=OHGCaSYj8KsdXNyUSUXFkcs8WHTf49t137GrbtaCtqk,4172
99
- pydantic_ai_slim-0.6.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
100
- pydantic_ai_slim-0.6.2.dist-info/entry_points.txt,sha256=kbKxe2VtDCYS06hsI7P3uZGxcVC08-FPt1rxeiMpIps,50
101
- pydantic_ai_slim-0.6.2.dist-info/licenses/LICENSE,sha256=vA6Jc482lEyBBuGUfD1pYx-cM7jxvLYOxPidZ30t_PQ,1100
102
- pydantic_ai_slim-0.6.2.dist-info/RECORD,,
110
+ pydantic_ai/toolsets/wrapper.py,sha256=mMuMPdko9PJUdcsexlRXbwViSwKKJfv6JE58d8HK3ds,1646
111
+ pydantic_ai_slim-0.7.1.dist-info/METADATA,sha256=DMu_iRcI1lhpIap8dm_3UX3vapXTkwtAauYAbDVxskk,4252
112
+ pydantic_ai_slim-0.7.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
113
+ pydantic_ai_slim-0.7.1.dist-info/entry_points.txt,sha256=kbKxe2VtDCYS06hsI7P3uZGxcVC08-FPt1rxeiMpIps,50
114
+ pydantic_ai_slim-0.7.1.dist-info/licenses/LICENSE,sha256=vA6Jc482lEyBBuGUfD1pYx-cM7jxvLYOxPidZ30t_PQ,1100
115
+ pydantic_ai_slim-0.7.1.dist-info/RECORD,,