pydantic-ai-slim 1.0.11__tar.gz → 1.0.12__tar.gz

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 (128) hide show
  1. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/PKG-INFO +3 -3
  2. pydantic_ai_slim-1.0.12/pydantic_ai/__init__.py +215 -0
  3. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/_a2a.py +1 -1
  4. {pydantic_ai_slim-1.0.11/pydantic_ai/profiles → pydantic_ai_slim-1.0.12/pydantic_ai}/_json_schema.py +5 -3
  5. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/_thinking_part.py +1 -1
  6. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/_utils.py +24 -7
  7. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/agent/__init__.py +1 -2
  8. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/builtin_tools.py +20 -1
  9. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/common_tools/duckduckgo.py +2 -2
  10. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/common_tools/tavily.py +2 -2
  11. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/direct.py +4 -4
  12. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/durable_exec/dbos/_agent.py +1 -1
  13. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/durable_exec/dbos/_mcp_server.py +1 -2
  14. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/durable_exec/dbos/_model.py +2 -2
  15. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/durable_exec/temporal/_agent.py +1 -1
  16. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/durable_exec/temporal/_function_toolset.py +1 -1
  17. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/durable_exec/temporal/_mcp_server.py +1 -1
  18. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/durable_exec/temporal/_model.py +3 -3
  19. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/durable_exec/temporal/_toolset.py +1 -3
  20. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/ext/aci.py +1 -1
  21. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/ext/langchain.py +1 -1
  22. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/mcp.py +20 -6
  23. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/messages.py +14 -11
  24. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/models/__init__.py +1 -1
  25. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/models/anthropic.py +21 -14
  26. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/models/bedrock.py +6 -5
  27. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/models/google.py +2 -2
  28. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/models/openai.py +79 -29
  29. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/output.py +11 -1
  30. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/profiles/__init__.py +1 -1
  31. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/profiles/google.py +1 -1
  32. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/profiles/openai.py +1 -1
  33. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/__init__.py +1 -1
  34. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/anthropic.py +1 -1
  35. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/azure.py +1 -1
  36. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/bedrock.py +1 -1
  37. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/cerebras.py +1 -1
  38. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/cohere.py +1 -1
  39. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/deepseek.py +1 -1
  40. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/fireworks.py +1 -1
  41. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/github.py +1 -1
  42. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/google.py +1 -1
  43. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/google_gla.py +1 -1
  44. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/google_vertex.py +1 -1
  45. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/grok.py +1 -1
  46. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/groq.py +1 -1
  47. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/heroku.py +1 -1
  48. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/huggingface.py +1 -1
  49. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/litellm.py +1 -1
  50. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/mistral.py +1 -1
  51. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/moonshotai.py +1 -1
  52. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/ollama.py +1 -1
  53. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/openai.py +1 -1
  54. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/openrouter.py +1 -1
  55. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/together.py +1 -1
  56. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/vercel.py +1 -1
  57. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/toolsets/function.py +1 -2
  58. pydantic_ai_slim-1.0.11/pydantic_ai/__init__.py +0 -85
  59. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/.gitignore +0 -0
  60. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/LICENSE +0 -0
  61. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/README.md +0 -0
  62. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/__main__.py +0 -0
  63. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/_agent_graph.py +0 -0
  64. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/_cli.py +0 -0
  65. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/_function_schema.py +0 -0
  66. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/_griffe.py +0 -0
  67. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/_mcp.py +0 -0
  68. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/_otel_messages.py +0 -0
  69. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/_output.py +0 -0
  70. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/_parts_manager.py +0 -0
  71. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/_run_context.py +0 -0
  72. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/_system_prompt.py +0 -0
  73. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/_tool_manager.py +0 -0
  74. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/ag_ui.py +0 -0
  75. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/agent/abstract.py +0 -0
  76. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/agent/wrapper.py +0 -0
  77. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/common_tools/__init__.py +0 -0
  78. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/durable_exec/__init__.py +0 -0
  79. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/durable_exec/dbos/__init__.py +0 -0
  80. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/durable_exec/dbos/_utils.py +0 -0
  81. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/durable_exec/temporal/__init__.py +0 -0
  82. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/durable_exec/temporal/_logfire.py +0 -0
  83. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/durable_exec/temporal/_run_context.py +0 -0
  84. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/exceptions.py +0 -0
  85. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/ext/__init__.py +0 -0
  86. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/format_prompt.py +0 -0
  87. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/models/cohere.py +0 -0
  88. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/models/fallback.py +0 -0
  89. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/models/function.py +0 -0
  90. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/models/gemini.py +0 -0
  91. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/models/groq.py +0 -0
  92. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/models/huggingface.py +0 -0
  93. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/models/instrumented.py +0 -0
  94. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/models/mcp_sampling.py +0 -0
  95. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/models/mistral.py +0 -0
  96. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/models/test.py +0 -0
  97. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/models/wrapper.py +0 -0
  98. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/profiles/amazon.py +0 -0
  99. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/profiles/anthropic.py +0 -0
  100. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/profiles/cohere.py +0 -0
  101. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/profiles/deepseek.py +0 -0
  102. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/profiles/grok.py +0 -0
  103. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/profiles/groq.py +0 -0
  104. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/profiles/harmony.py +0 -0
  105. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/profiles/meta.py +0 -0
  106. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/profiles/mistral.py +0 -0
  107. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/profiles/moonshotai.py +0 -0
  108. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/profiles/qwen.py +0 -0
  109. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/providers/gateway.py +0 -0
  110. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/py.typed +0 -0
  111. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/result.py +0 -0
  112. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/retries.py +0 -0
  113. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/run.py +0 -0
  114. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/settings.py +0 -0
  115. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/tools.py +0 -0
  116. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/toolsets/__init__.py +0 -0
  117. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/toolsets/_dynamic.py +0 -0
  118. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/toolsets/abstract.py +0 -0
  119. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/toolsets/approval_required.py +0 -0
  120. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/toolsets/combined.py +0 -0
  121. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/toolsets/external.py +0 -0
  122. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/toolsets/filtered.py +0 -0
  123. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/toolsets/prefixed.py +0 -0
  124. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/toolsets/prepared.py +0 -0
  125. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/toolsets/renamed.py +0 -0
  126. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/toolsets/wrapper.py +0 -0
  127. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pydantic_ai/usage.py +0 -0
  128. {pydantic_ai_slim-1.0.11 → pydantic_ai_slim-1.0.12}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pydantic-ai-slim
3
- Version: 1.0.11
3
+ Version: 1.0.12
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.11
36
+ Requires-Dist: pydantic-graph==1.0.12
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.11; extra == 'evals'
60
+ Requires-Dist: pydantic-evals==1.0.12; extra == 'evals'
61
61
  Provides-Extra: google
62
62
  Requires-Dist: google-genai>=1.31.0; extra == 'google'
63
63
  Provides-Extra: groq
@@ -0,0 +1,215 @@
1
+ from importlib.metadata import version as _metadata_version
2
+
3
+ from .agent import (
4
+ Agent,
5
+ CallToolsNode,
6
+ EndStrategy,
7
+ InstrumentationSettings,
8
+ ModelRequestNode,
9
+ UserPromptNode,
10
+ capture_run_messages,
11
+ )
12
+ from .builtin_tools import CodeExecutionTool, UrlContextTool, WebSearchTool, WebSearchUserLocation
13
+ from .exceptions import (
14
+ AgentRunError,
15
+ ApprovalRequired,
16
+ CallDeferred,
17
+ FallbackExceptionGroup,
18
+ ModelHTTPError,
19
+ ModelRetry,
20
+ UnexpectedModelBehavior,
21
+ UsageLimitExceeded,
22
+ UserError,
23
+ )
24
+ from .format_prompt import format_as_xml
25
+ from .messages import (
26
+ AgentStreamEvent,
27
+ AudioFormat,
28
+ AudioMediaType,
29
+ AudioUrl,
30
+ BaseToolCallPart,
31
+ BaseToolReturnPart,
32
+ BinaryContent,
33
+ BuiltinToolCallPart,
34
+ BuiltinToolReturnPart,
35
+ DocumentFormat,
36
+ DocumentMediaType,
37
+ DocumentUrl,
38
+ FileUrl,
39
+ FinalResultEvent,
40
+ FinishReason,
41
+ FunctionToolCallEvent,
42
+ FunctionToolResultEvent,
43
+ HandleResponseEvent,
44
+ ImageFormat,
45
+ ImageMediaType,
46
+ ImageUrl,
47
+ ModelMessage,
48
+ ModelMessagesTypeAdapter,
49
+ ModelRequest,
50
+ ModelRequestPart,
51
+ ModelResponse,
52
+ ModelResponsePart,
53
+ ModelResponsePartDelta,
54
+ ModelResponseStreamEvent,
55
+ MultiModalContent,
56
+ PartDeltaEvent,
57
+ PartStartEvent,
58
+ RetryPromptPart,
59
+ SystemPromptPart,
60
+ TextPart,
61
+ TextPartDelta,
62
+ ThinkingPart,
63
+ ThinkingPartDelta,
64
+ ToolCallPart,
65
+ ToolCallPartDelta,
66
+ ToolReturn,
67
+ ToolReturnPart,
68
+ UserContent,
69
+ UserPromptPart,
70
+ VideoFormat,
71
+ VideoMediaType,
72
+ VideoUrl,
73
+ )
74
+ from .output import NativeOutput, PromptedOutput, StructuredDict, TextOutput, ToolOutput
75
+ from .profiles import (
76
+ DEFAULT_PROFILE,
77
+ InlineDefsJsonSchemaTransformer,
78
+ JsonSchemaTransformer,
79
+ ModelProfile,
80
+ ModelProfileSpec,
81
+ )
82
+ from .settings import ModelSettings
83
+ from .tools import DeferredToolRequests, DeferredToolResults, RunContext, Tool, ToolApproved, ToolDefinition, ToolDenied
84
+ from .toolsets import (
85
+ AbstractToolset,
86
+ ApprovalRequiredToolset,
87
+ CombinedToolset,
88
+ ExternalToolset,
89
+ FilteredToolset,
90
+ FunctionToolset,
91
+ PrefixedToolset,
92
+ PreparedToolset,
93
+ RenamedToolset,
94
+ ToolsetFunc,
95
+ ToolsetTool,
96
+ WrapperToolset,
97
+ )
98
+ from .usage import RequestUsage, RunUsage, UsageLimits
99
+
100
+ __all__ = (
101
+ '__version__',
102
+ # agent
103
+ 'Agent',
104
+ 'EndStrategy',
105
+ 'CallToolsNode',
106
+ 'ModelRequestNode',
107
+ 'UserPromptNode',
108
+ 'capture_run_messages',
109
+ 'InstrumentationSettings',
110
+ # exceptions
111
+ 'AgentRunError',
112
+ 'CallDeferred',
113
+ 'ApprovalRequired',
114
+ 'ModelRetry',
115
+ 'ModelHTTPError',
116
+ 'FallbackExceptionGroup',
117
+ 'UnexpectedModelBehavior',
118
+ 'UsageLimitExceeded',
119
+ 'UserError',
120
+ # messages
121
+ 'AgentStreamEvent',
122
+ 'AudioFormat',
123
+ 'AudioMediaType',
124
+ 'AudioUrl',
125
+ 'BaseToolCallPart',
126
+ 'BaseToolReturnPart',
127
+ 'BinaryContent',
128
+ 'BuiltinToolCallPart',
129
+ 'BuiltinToolReturnPart',
130
+ 'DocumentFormat',
131
+ 'DocumentMediaType',
132
+ 'DocumentUrl',
133
+ 'FileUrl',
134
+ 'FinalResultEvent',
135
+ 'FinishReason',
136
+ 'FunctionToolCallEvent',
137
+ 'FunctionToolResultEvent',
138
+ 'HandleResponseEvent',
139
+ 'ImageFormat',
140
+ 'ImageMediaType',
141
+ 'ImageUrl',
142
+ 'ModelMessage',
143
+ 'ModelMessagesTypeAdapter',
144
+ 'ModelRequest',
145
+ 'ModelRequestPart',
146
+ 'ModelResponse',
147
+ 'ModelResponsePart',
148
+ 'ModelResponsePartDelta',
149
+ 'ModelResponseStreamEvent',
150
+ 'MultiModalContent',
151
+ 'PartDeltaEvent',
152
+ 'PartStartEvent',
153
+ 'RetryPromptPart',
154
+ 'SystemPromptPart',
155
+ 'TextPart',
156
+ 'TextPartDelta',
157
+ 'ThinkingPart',
158
+ 'ThinkingPartDelta',
159
+ 'ToolCallPart',
160
+ 'ToolCallPartDelta',
161
+ 'ToolReturn',
162
+ 'ToolReturnPart',
163
+ 'UserContent',
164
+ 'UserPromptPart',
165
+ 'VideoFormat',
166
+ 'VideoMediaType',
167
+ 'VideoUrl',
168
+ # profiles
169
+ 'ModelProfile',
170
+ 'ModelProfileSpec',
171
+ 'DEFAULT_PROFILE',
172
+ 'InlineDefsJsonSchemaTransformer',
173
+ 'JsonSchemaTransformer',
174
+ # tools
175
+ 'Tool',
176
+ 'ToolDefinition',
177
+ 'RunContext',
178
+ 'DeferredToolRequests',
179
+ 'DeferredToolResults',
180
+ 'ToolApproved',
181
+ 'ToolDenied',
182
+ # toolsets
183
+ 'AbstractToolset',
184
+ 'ApprovalRequiredToolset',
185
+ 'CombinedToolset',
186
+ 'ExternalToolset',
187
+ 'FilteredToolset',
188
+ 'FunctionToolset',
189
+ 'PrefixedToolset',
190
+ 'PreparedToolset',
191
+ 'RenamedToolset',
192
+ 'ToolsetFunc',
193
+ 'ToolsetTool',
194
+ 'WrapperToolset',
195
+ # builtin_tools
196
+ 'WebSearchTool',
197
+ 'WebSearchUserLocation',
198
+ 'UrlContextTool',
199
+ 'CodeExecutionTool',
200
+ # output
201
+ 'ToolOutput',
202
+ 'NativeOutput',
203
+ 'PromptedOutput',
204
+ 'TextOutput',
205
+ 'StructuredDict',
206
+ # format_prompt
207
+ 'format_as_xml',
208
+ # settings
209
+ 'ModelSettings',
210
+ # usage
211
+ 'RunUsage',
212
+ 'RequestUsage',
213
+ 'UsageLimits',
214
+ )
215
+ __version__ = _metadata_version('pydantic_ai_slim')
@@ -10,7 +10,7 @@ from typing import Any, Generic, TypeVar
10
10
  from pydantic import TypeAdapter
11
11
  from typing_extensions import assert_never
12
12
 
13
- from pydantic_ai.messages import (
13
+ from pydantic_ai import (
14
14
  AudioUrl,
15
15
  BinaryContent,
16
16
  DocumentUrl,
@@ -6,7 +6,7 @@ from copy import deepcopy
6
6
  from dataclasses import dataclass
7
7
  from typing import Any, Literal
8
8
 
9
- from pydantic_ai.exceptions import UserError
9
+ from .exceptions import UserError
10
10
 
11
11
  JsonSchema = dict[str, Any]
12
12
 
@@ -54,14 +54,14 @@ class JsonSchemaTransformer(ABC):
54
54
  if not self.prefer_inlined_defs and self.defs:
55
55
  handled['$defs'] = {k: self._handle(v) for k, v in self.defs.items()}
56
56
 
57
- elif self.recursive_refs: # pragma: no cover
57
+ elif self.recursive_refs:
58
58
  # If we are preferring inlined defs and there are recursive refs, we _have_ to use a $defs+$ref structure
59
59
  # We try to use whatever the original root key was, but if it is already in use,
60
60
  # we modify it to avoid collisions.
61
61
  defs = {key: self.defs[key] for key in self.recursive_refs}
62
62
  root_ref = self.schema.get('$ref')
63
63
  root_key = None if root_ref is None else re.sub(r'^#/\$defs/', '', root_ref)
64
- if root_key is None:
64
+ if root_key is None: # pragma: no cover
65
65
  root_key = self.schema.get('title', 'root')
66
66
  while root_key in defs:
67
67
  # Modify the root key until it is not already in use
@@ -77,6 +77,8 @@ class JsonSchemaTransformer(ABC):
77
77
  if self.prefer_inlined_defs:
78
78
  while ref := schema.get('$ref'):
79
79
  key = re.sub(r'^#/\$defs/', '', ref)
80
+ if key in self.recursive_refs:
81
+ break
80
82
  if key in self.refs_stack:
81
83
  self.recursive_refs.add(key)
82
84
  break # recursive ref can't be unpacked
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations as _annotations
2
2
 
3
- from pydantic_ai.messages import TextPart, ThinkingPart
3
+ from pydantic_ai import TextPart, ThinkingPart
4
4
 
5
5
 
6
6
  def split_content_into_text_and_thinking(content: str, thinking_tags: tuple[str, str]) -> list[ThinkingPart | TextPart]:
@@ -6,7 +6,7 @@ import inspect
6
6
  import re
7
7
  import time
8
8
  import uuid
9
- from collections.abc import AsyncIterable, AsyncIterator, Awaitable, Callable, Iterator
9
+ from collections.abc import AsyncIterable, AsyncIterator, Awaitable, Callable, Iterable, Iterator
10
10
  from contextlib import asynccontextmanager, suppress
11
11
  from dataclasses import dataclass, fields, is_dataclass
12
12
  from datetime import datetime, timezone
@@ -70,16 +70,33 @@ def check_object_json_schema(schema: JsonSchemaValue) -> ObjectJsonSchema:
70
70
 
71
71
  if schema.get('type') == 'object':
72
72
  return schema
73
- elif schema.get('$ref') is not None:
74
- maybe_result = schema.get('$defs', {}).get(schema['$ref'][8:]) # This removes the initial "#/$defs/".
75
-
76
- if "'$ref': '#/$defs/" in str(maybe_result):
77
- return schema # We can't remove the $defs because the schema contains other references
78
- return maybe_result
73
+ elif ref := schema.get('$ref'):
74
+ prefix = '#/$defs/'
75
+ # Return the referenced schema unless it contains additional nested references.
76
+ if (
77
+ ref.startswith(prefix)
78
+ and (resolved := schema.get('$defs', {}).get(ref[len(prefix) :]))
79
+ and resolved.get('type') == 'object'
80
+ and not _contains_ref(resolved)
81
+ ):
82
+ return resolved
83
+ return schema
79
84
  else:
80
85
  raise UserError('Schema must be an object')
81
86
 
82
87
 
88
+ def _contains_ref(obj: JsonSchemaValue | list[JsonSchemaValue]) -> bool:
89
+ """Recursively check if an object contains any $ref keys."""
90
+ items: Iterable[JsonSchemaValue]
91
+ if isinstance(obj, dict):
92
+ if '$ref' in obj:
93
+ return True
94
+ items = obj.values()
95
+ else:
96
+ items = obj
97
+ return any(isinstance(item, dict | list) and _contains_ref(item) for item in items) # pyright: ignore[reportUnknownArgumentType]
98
+
99
+
83
100
  T = TypeVar('T')
84
101
 
85
102
 
@@ -1206,8 +1206,7 @@ class Agent(AbstractAgent[AgentDepsT, OutputDataT]):
1206
1206
 
1207
1207
  Example:
1208
1208
  ```python
1209
- from pydantic_ai import Agent, RunContext
1210
- from pydantic_ai.toolsets import AbstractToolset, FunctionToolset
1209
+ from pydantic_ai import AbstractToolset, Agent, FunctionToolset, RunContext
1211
1210
 
1212
1211
  agent = Agent('test', deps_type=str)
1213
1212
 
@@ -6,7 +6,14 @@ from typing import Literal
6
6
 
7
7
  from typing_extensions import TypedDict
8
8
 
9
- __all__ = ('AbstractBuiltinTool', 'WebSearchTool', 'WebSearchUserLocation', 'CodeExecutionTool', 'UrlContextTool')
9
+ __all__ = (
10
+ 'AbstractBuiltinTool',
11
+ 'WebSearchTool',
12
+ 'WebSearchUserLocation',
13
+ 'CodeExecutionTool',
14
+ 'UrlContextTool',
15
+ 'MemoryTool',
16
+ )
10
17
 
11
18
 
12
19
  @dataclass(kw_only=True)
@@ -133,3 +140,15 @@ class UrlContextTool(AbstractBuiltinTool):
133
140
 
134
141
  kind: str = 'url_context'
135
142
  """The kind of tool."""
143
+
144
+
145
+ class MemoryTool(AbstractBuiltinTool):
146
+ """A builtin tool that allows your agent to use memory.
147
+
148
+ Supported by:
149
+
150
+ * Anthropic
151
+ """
152
+
153
+ kind: str = 'memory'
154
+ """The kind of tool."""
@@ -4,7 +4,7 @@ from dataclasses import KW_ONLY, dataclass
4
4
  import anyio
5
5
  import anyio.to_thread
6
6
  from pydantic import TypeAdapter
7
- from typing_extensions import TypedDict
7
+ from typing_extensions import Any, TypedDict
8
8
 
9
9
  from pydantic_ai.tools import Tool
10
10
 
@@ -69,7 +69,7 @@ def duckduckgo_search_tool(duckduckgo_client: DDGS | None = None, max_results: i
69
69
  duckduckgo_client: The DuckDuckGo search client.
70
70
  max_results: The maximum number of results. If None, returns results only from the first response.
71
71
  """
72
- return Tool(
72
+ return Tool[Any](
73
73
  DuckDuckGoSearchTool(client=duckduckgo_client or DDGS(), max_results=max_results).__call__,
74
74
  name='duckduckgo_search',
75
75
  description='Searches DuckDuckGo for the given query and returns the results.',
@@ -2,7 +2,7 @@ from dataclasses import dataclass
2
2
  from typing import Literal
3
3
 
4
4
  from pydantic import TypeAdapter
5
- from typing_extensions import TypedDict
5
+ from typing_extensions import Any, TypedDict
6
6
 
7
7
  from pydantic_ai.tools import Tool
8
8
 
@@ -74,7 +74,7 @@ def tavily_search_tool(api_key: str):
74
74
 
75
75
  You can get one by signing up at [https://app.tavily.com/home](https://app.tavily.com/home).
76
76
  """
77
- return Tool(
77
+ return Tool[Any](
78
78
  TavilySearchTool(client=AsyncTavilyClient(api_key)).__call__,
79
79
  name='tavily_search',
80
80
  description='Searches Tavily for the given query and returns the results.',
@@ -44,8 +44,8 @@ async def model_request(
44
44
  """Make a non-streamed request to a model.
45
45
 
46
46
  ```py title="model_request_example.py"
47
+ from pydantic_ai import ModelRequest
47
48
  from pydantic_ai.direct import model_request
48
- from pydantic_ai.messages import ModelRequest
49
49
 
50
50
 
51
51
  async def main():
@@ -99,8 +99,8 @@ def model_request_sync(
99
99
  `loop.run_until_complete(...)`. You therefore can't use this method inside async code or if there's an active event loop.
100
100
 
101
101
  ```py title="model_request_sync_example.py"
102
+ from pydantic_ai import ModelRequest
102
103
  from pydantic_ai.direct import model_request_sync
103
- from pydantic_ai.messages import ModelRequest
104
104
 
105
105
  model_response = model_request_sync(
106
106
  'anthropic:claude-3-5-haiku-latest',
@@ -153,8 +153,8 @@ def model_request_stream(
153
153
 
154
154
  ```py {title="model_request_stream_example.py"}
155
155
 
156
+ from pydantic_ai import ModelRequest
156
157
  from pydantic_ai.direct import model_request_stream
157
- from pydantic_ai.messages import ModelRequest
158
158
 
159
159
 
160
160
  async def main():
@@ -212,8 +212,8 @@ def model_request_stream_sync(
212
212
 
213
213
  ```py {title="model_request_stream_sync_example.py"}
214
214
 
215
+ from pydantic_ai import ModelRequest
215
216
  from pydantic_ai.direct import model_request_stream_sync
216
- from pydantic_ai.messages import ModelRequest
217
217
 
218
218
  messages = [ModelRequest.user_text_prompt('Who was Albert Einstein?')]
219
219
  with model_request_stream_sync('openai:gpt-4.1-mini', messages) as stream:
@@ -8,6 +8,7 @@ from dbos import DBOS, DBOSConfiguredInstance
8
8
  from typing_extensions import Never
9
9
 
10
10
  from pydantic_ai import (
11
+ AbstractToolset,
11
12
  _utils,
12
13
  messages as _messages,
13
14
  models,
@@ -26,7 +27,6 @@ from pydantic_ai.tools import (
26
27
  Tool,
27
28
  ToolFuncEither,
28
29
  )
29
- from pydantic_ai.toolsets import AbstractToolset
30
30
 
31
31
  from ._model import DBOSModel
32
32
  from ._utils import StepConfig
@@ -7,9 +7,8 @@ from typing import TYPE_CHECKING, Any
7
7
  from dbos import DBOS
8
8
  from typing_extensions import Self
9
9
 
10
+ from pydantic_ai import AbstractToolset, ToolsetTool, WrapperToolset
10
11
  from pydantic_ai.tools import AgentDepsT, RunContext
11
- from pydantic_ai.toolsets.abstract import AbstractToolset, ToolsetTool
12
- from pydantic_ai.toolsets.wrapper import WrapperToolset
13
12
 
14
13
  from ._utils import StepConfig
15
14
 
@@ -7,12 +7,12 @@ from typing import Any
7
7
 
8
8
  from dbos import DBOS
9
9
 
10
- from pydantic_ai.agent import EventStreamHandler
11
- from pydantic_ai.messages import (
10
+ from pydantic_ai import (
12
11
  ModelMessage,
13
12
  ModelResponse,
14
13
  ModelResponseStreamEvent,
15
14
  )
15
+ from pydantic_ai.agent import EventStreamHandler
16
16
  from pydantic_ai.models import Model, ModelRequestParameters, StreamedResponse
17
17
  from pydantic_ai.models.wrapper import WrapperModel
18
18
  from pydantic_ai.settings import ModelSettings
@@ -16,6 +16,7 @@ from temporalio.workflow import ActivityConfig
16
16
  from typing_extensions import Never
17
17
 
18
18
  from pydantic_ai import (
19
+ AbstractToolset,
19
20
  _utils,
20
21
  messages as _messages,
21
22
  models,
@@ -34,7 +35,6 @@ from pydantic_ai.tools import (
34
35
  Tool,
35
36
  ToolFuncEither,
36
37
  )
37
- from pydantic_ai.toolsets import AbstractToolset
38
38
 
39
39
  from ._model import TemporalModel
40
40
  from ._run_context import TemporalRunContext
@@ -8,9 +8,9 @@ from pydantic import ConfigDict, Discriminator, with_config
8
8
  from temporalio import activity, workflow
9
9
  from temporalio.workflow import ActivityConfig
10
10
 
11
+ from pydantic_ai import FunctionToolset, ToolsetTool
11
12
  from pydantic_ai.exceptions import ApprovalRequired, CallDeferred, ModelRetry, UserError
12
13
  from pydantic_ai.tools import AgentDepsT, RunContext
13
- from pydantic_ai.toolsets import FunctionToolset, ToolsetTool
14
14
  from pydantic_ai.toolsets.function import FunctionToolsetTool
15
15
 
16
16
  from ._run_context import TemporalRunContext
@@ -9,10 +9,10 @@ from temporalio import activity, workflow
9
9
  from temporalio.workflow import ActivityConfig
10
10
  from typing_extensions import Self
11
11
 
12
+ from pydantic_ai import ToolsetTool
12
13
  from pydantic_ai.exceptions import UserError
13
14
  from pydantic_ai.mcp import MCPServer, ToolResult
14
15
  from pydantic_ai.tools import AgentDepsT, RunContext, ToolDefinition
15
- from pydantic_ai.toolsets.abstract import ToolsetTool
16
16
 
17
17
  from ._run_context import TemporalRunContext
18
18
  from ._toolset import TemporalWrapperToolset
@@ -10,13 +10,13 @@ from pydantic import ConfigDict, with_config
10
10
  from temporalio import activity, workflow
11
11
  from temporalio.workflow import ActivityConfig
12
12
 
13
- from pydantic_ai.agent import EventStreamHandler
14
- from pydantic_ai.exceptions import UserError
15
- from pydantic_ai.messages import (
13
+ from pydantic_ai import (
16
14
  ModelMessage,
17
15
  ModelResponse,
18
16
  ModelResponseStreamEvent,
19
17
  )
18
+ from pydantic_ai.agent import EventStreamHandler
19
+ from pydantic_ai.exceptions import UserError
20
20
  from pydantic_ai.models import Model, ModelRequestParameters, StreamedResponse
21
21
  from pydantic_ai.models.wrapper import WrapperModel
22
22
  from pydantic_ai.settings import ModelSettings
@@ -6,10 +6,8 @@ from typing import Any, Literal
6
6
 
7
7
  from temporalio.workflow import ActivityConfig
8
8
 
9
+ from pydantic_ai import AbstractToolset, FunctionToolset, WrapperToolset
9
10
  from pydantic_ai.tools import AgentDepsT
10
- from pydantic_ai.toolsets.abstract import AbstractToolset
11
- from pydantic_ai.toolsets.function import FunctionToolset
12
- from pydantic_ai.toolsets.wrapper import WrapperToolset
13
11
 
14
12
  from ._run_context import TemporalRunContext
15
13
 
@@ -3,8 +3,8 @@ from __future__ import annotations
3
3
  from collections.abc import Sequence
4
4
  from typing import Any
5
5
 
6
+ from pydantic_ai import FunctionToolset
6
7
  from pydantic_ai.tools import Tool
7
- from pydantic_ai.toolsets.function import FunctionToolset
8
8
 
9
9
  try:
10
10
  from aci import ACI
@@ -4,8 +4,8 @@ from typing import Any, Protocol
4
4
 
5
5
  from pydantic.json_schema import JsonSchemaValue
6
6
 
7
+ from pydantic_ai import FunctionToolset
7
8
  from pydantic_ai.tools import Tool
8
- from pydantic_ai.toolsets.function import FunctionToolset
9
9
 
10
10
 
11
11
  class LangChainTool(Protocol):
@@ -225,13 +225,27 @@ class MCPServer(AbstractToolset[Any], ABC):
225
225
  except McpError as e:
226
226
  raise exceptions.ModelRetry(e.error.message)
227
227
 
228
- content = [await self._map_tool_result_part(part) for part in result.content]
229
-
230
228
  if result.isError:
231
- text = '\n'.join(str(part) for part in content)
232
- raise exceptions.ModelRetry(text)
233
- else:
234
- return content[0] if len(content) == 1 else content
229
+ message: str | None = None
230
+ if result.content: # pragma: no branch
231
+ text_parts = [part.text for part in result.content if isinstance(part, mcp_types.TextContent)]
232
+ message = '\n'.join(text_parts)
233
+
234
+ raise exceptions.ModelRetry(message or 'MCP tool call failed')
235
+
236
+ # Prefer structured content if there are only text parts, which per the docs would contain the JSON-encoded structured content for backward compatibility.
237
+ # See https://github.com/modelcontextprotocol/python-sdk#structured-output
238
+ if (structured := result.structuredContent) and not any(
239
+ not isinstance(part, mcp_types.TextContent) for part in result.content
240
+ ):
241
+ # The MCP SDK wraps primitives and generic types like list in a `result` key, but we want to use the raw value returned by the tool function.
242
+ # See https://github.com/modelcontextprotocol/python-sdk#structured-output
243
+ if isinstance(structured, dict) and len(structured) == 1 and 'result' in structured:
244
+ return structured['result']
245
+ return structured
246
+
247
+ mapped = [await self._map_tool_result_part(part) for part in result.content]
248
+ return mapped[0] if len(mapped) == 1 else mapped
235
249
 
236
250
  async def call_tool(
237
251
  self,