pydantic-ai-slim 1.0.1__py3-none-any.whl → 1.0.2__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.
- pydantic_ai/_agent_graph.py +50 -31
- pydantic_ai/_tool_manager.py +4 -0
- pydantic_ai/agent/__init__.py +3 -0
- pydantic_ai/durable_exec/dbos/__init__.py +6 -0
- pydantic_ai/durable_exec/dbos/_agent.py +718 -0
- pydantic_ai/durable_exec/dbos/_mcp_server.py +89 -0
- pydantic_ai/durable_exec/dbos/_model.py +137 -0
- pydantic_ai/durable_exec/dbos/_utils.py +10 -0
- pydantic_ai/mcp.py +1 -1
- pydantic_ai/messages.py +12 -0
- pydantic_ai/models/__init__.py +8 -0
- pydantic_ai/models/anthropic.py +24 -0
- pydantic_ai/models/google.py +43 -4
- pydantic_ai/models/instrumented.py +27 -14
- pydantic_ai/models/openai.py +67 -16
- pydantic_ai/providers/bedrock.py +11 -3
- pydantic_ai/tools.py +11 -0
- pydantic_ai/toolsets/function.py +7 -0
- {pydantic_ai_slim-1.0.1.dist-info → pydantic_ai_slim-1.0.2.dist-info}/METADATA +6 -4
- {pydantic_ai_slim-1.0.1.dist-info → pydantic_ai_slim-1.0.2.dist-info}/RECORD +23 -18
- {pydantic_ai_slim-1.0.1.dist-info → pydantic_ai_slim-1.0.2.dist-info}/WHEEL +0 -0
- {pydantic_ai_slim-1.0.1.dist-info → pydantic_ai_slim-1.0.2.dist-info}/entry_points.txt +0 -0
- {pydantic_ai_slim-1.0.1.dist-info → pydantic_ai_slim-1.0.2.dist-info}/licenses/LICENSE +0 -0
pydantic_ai/models/openai.py
CHANGED
|
@@ -24,6 +24,7 @@ from ..messages import (
|
|
|
24
24
|
BuiltinToolCallPart,
|
|
25
25
|
BuiltinToolReturnPart,
|
|
26
26
|
DocumentUrl,
|
|
27
|
+
FinishReason,
|
|
27
28
|
ImageUrl,
|
|
28
29
|
ModelMessage,
|
|
29
30
|
ModelRequest,
|
|
@@ -72,6 +73,7 @@ try:
|
|
|
72
73
|
)
|
|
73
74
|
from openai.types.responses import ComputerToolParam, FileSearchToolParam, WebSearchToolParam
|
|
74
75
|
from openai.types.responses.response_input_param import FunctionCallOutput, Message
|
|
76
|
+
from openai.types.responses.response_status import ResponseStatus
|
|
75
77
|
from openai.types.shared import ReasoningEffort
|
|
76
78
|
from openai.types.shared_params import Reasoning
|
|
77
79
|
except ImportError as _import_error:
|
|
@@ -103,6 +105,25 @@ allows this model to be used more easily with other model types (ie, Ollama, Dee
|
|
|
103
105
|
"""
|
|
104
106
|
|
|
105
107
|
|
|
108
|
+
_CHAT_FINISH_REASON_MAP: dict[
|
|
109
|
+
Literal['stop', 'length', 'tool_calls', 'content_filter', 'function_call'], FinishReason
|
|
110
|
+
] = {
|
|
111
|
+
'stop': 'stop',
|
|
112
|
+
'length': 'length',
|
|
113
|
+
'tool_calls': 'tool_call',
|
|
114
|
+
'content_filter': 'content_filter',
|
|
115
|
+
'function_call': 'tool_call',
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
_RESPONSES_FINISH_REASON_MAP: dict[Literal['max_output_tokens', 'content_filter'] | ResponseStatus, FinishReason] = {
|
|
119
|
+
'max_output_tokens': 'length',
|
|
120
|
+
'content_filter': 'content_filter',
|
|
121
|
+
'completed': 'stop',
|
|
122
|
+
'cancelled': 'error',
|
|
123
|
+
'failed': 'error',
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
|
|
106
127
|
class OpenAIChatModelSettings(ModelSettings, total=False):
|
|
107
128
|
"""Settings used for an OpenAI model request."""
|
|
108
129
|
|
|
@@ -474,24 +495,22 @@ class OpenAIChatModel(Model):
|
|
|
474
495
|
if reasoning_content := getattr(choice.message, 'reasoning_content', None):
|
|
475
496
|
items.append(ThinkingPart(content=reasoning_content))
|
|
476
497
|
|
|
477
|
-
vendor_details: dict[str, Any]
|
|
498
|
+
vendor_details: dict[str, Any] = {}
|
|
478
499
|
|
|
479
500
|
# Add logprobs to vendor_details if available
|
|
480
501
|
if choice.logprobs is not None and choice.logprobs.content:
|
|
481
502
|
# Convert logprobs to a serializable format
|
|
482
|
-
vendor_details =
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
'
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
],
|
|
494
|
-
}
|
|
503
|
+
vendor_details['logprobs'] = [
|
|
504
|
+
{
|
|
505
|
+
'token': lp.token,
|
|
506
|
+
'bytes': lp.bytes,
|
|
507
|
+
'logprob': lp.logprob,
|
|
508
|
+
'top_logprobs': [
|
|
509
|
+
{'token': tlp.token, 'bytes': tlp.bytes, 'logprob': tlp.logprob} for tlp in lp.top_logprobs
|
|
510
|
+
],
|
|
511
|
+
}
|
|
512
|
+
for lp in choice.logprobs.content
|
|
513
|
+
]
|
|
495
514
|
|
|
496
515
|
if choice.message.content is not None:
|
|
497
516
|
items.extend(split_content_into_text_and_thinking(choice.message.content, self.profile.thinking_tags))
|
|
@@ -507,14 +526,21 @@ class OpenAIChatModel(Model):
|
|
|
507
526
|
assert_never(c)
|
|
508
527
|
part.tool_call_id = _guard_tool_call_id(part)
|
|
509
528
|
items.append(part)
|
|
529
|
+
|
|
530
|
+
finish_reason: FinishReason | None = None
|
|
531
|
+
if raw_finish_reason := choice.finish_reason: # pragma: no branch
|
|
532
|
+
vendor_details['finish_reason'] = raw_finish_reason
|
|
533
|
+
finish_reason = _CHAT_FINISH_REASON_MAP.get(raw_finish_reason)
|
|
534
|
+
|
|
510
535
|
return ModelResponse(
|
|
511
536
|
parts=items,
|
|
512
537
|
usage=_map_usage(response),
|
|
513
538
|
model_name=response.model,
|
|
514
539
|
timestamp=timestamp,
|
|
515
|
-
provider_details=vendor_details,
|
|
540
|
+
provider_details=vendor_details or None,
|
|
516
541
|
provider_response_id=response.id,
|
|
517
542
|
provider_name=self._provider.name,
|
|
543
|
+
finish_reason=finish_reason,
|
|
518
544
|
)
|
|
519
545
|
|
|
520
546
|
async def _process_streamed_response(
|
|
@@ -823,6 +849,14 @@ class OpenAIResponsesModel(Model):
|
|
|
823
849
|
items.append(TextPart(content.text))
|
|
824
850
|
elif item.type == 'function_call':
|
|
825
851
|
items.append(ToolCallPart(item.name, item.arguments, tool_call_id=item.call_id))
|
|
852
|
+
|
|
853
|
+
finish_reason: FinishReason | None = None
|
|
854
|
+
provider_details: dict[str, Any] | None = None
|
|
855
|
+
raw_finish_reason = details.reason if (details := response.incomplete_details) else response.status
|
|
856
|
+
if raw_finish_reason:
|
|
857
|
+
provider_details = {'finish_reason': raw_finish_reason}
|
|
858
|
+
finish_reason = _RESPONSES_FINISH_REASON_MAP.get(raw_finish_reason)
|
|
859
|
+
|
|
826
860
|
return ModelResponse(
|
|
827
861
|
parts=items,
|
|
828
862
|
usage=_map_usage(response),
|
|
@@ -830,6 +864,8 @@ class OpenAIResponsesModel(Model):
|
|
|
830
864
|
provider_response_id=response.id,
|
|
831
865
|
timestamp=timestamp,
|
|
832
866
|
provider_name=self._provider.name,
|
|
867
|
+
finish_reason=finish_reason,
|
|
868
|
+
provider_details=provider_details,
|
|
833
869
|
)
|
|
834
870
|
|
|
835
871
|
async def _process_streamed_response(
|
|
@@ -1169,6 +1205,9 @@ class OpenAIStreamedResponse(StreamedResponse):
|
|
|
1169
1205
|
async for chunk in self._response:
|
|
1170
1206
|
self._usage += _map_usage(chunk)
|
|
1171
1207
|
|
|
1208
|
+
if chunk.id and self.provider_response_id is None:
|
|
1209
|
+
self.provider_response_id = chunk.id
|
|
1210
|
+
|
|
1172
1211
|
try:
|
|
1173
1212
|
choice = chunk.choices[0]
|
|
1174
1213
|
except IndexError:
|
|
@@ -1178,6 +1217,10 @@ class OpenAIStreamedResponse(StreamedResponse):
|
|
|
1178
1217
|
if choice.delta is None: # pyright: ignore[reportUnnecessaryComparison]
|
|
1179
1218
|
continue
|
|
1180
1219
|
|
|
1220
|
+
if raw_finish_reason := choice.finish_reason:
|
|
1221
|
+
self.provider_details = {'finish_reason': raw_finish_reason}
|
|
1222
|
+
self.finish_reason = _CHAT_FINISH_REASON_MAP.get(raw_finish_reason)
|
|
1223
|
+
|
|
1181
1224
|
# Handle the text part of the response
|
|
1182
1225
|
content = choice.delta.content
|
|
1183
1226
|
if content is not None:
|
|
@@ -1237,6 +1280,13 @@ class OpenAIResponsesStreamedResponse(StreamedResponse):
|
|
|
1237
1280
|
if isinstance(chunk, responses.ResponseCompletedEvent):
|
|
1238
1281
|
self._usage += _map_usage(chunk.response)
|
|
1239
1282
|
|
|
1283
|
+
raw_finish_reason = (
|
|
1284
|
+
details.reason if (details := chunk.response.incomplete_details) else chunk.response.status
|
|
1285
|
+
)
|
|
1286
|
+
if raw_finish_reason: # pragma: no branch
|
|
1287
|
+
self.provider_details = {'finish_reason': raw_finish_reason}
|
|
1288
|
+
self.finish_reason = _RESPONSES_FINISH_REASON_MAP.get(raw_finish_reason)
|
|
1289
|
+
|
|
1240
1290
|
elif isinstance(chunk, responses.ResponseContentPartAddedEvent):
|
|
1241
1291
|
pass # there's nothing we need to do here
|
|
1242
1292
|
|
|
@@ -1244,7 +1294,8 @@ class OpenAIResponsesStreamedResponse(StreamedResponse):
|
|
|
1244
1294
|
pass # there's nothing we need to do here
|
|
1245
1295
|
|
|
1246
1296
|
elif isinstance(chunk, responses.ResponseCreatedEvent):
|
|
1247
|
-
|
|
1297
|
+
if chunk.response.id: # pragma: no branch
|
|
1298
|
+
self.provider_response_id = chunk.response.id
|
|
1248
1299
|
|
|
1249
1300
|
elif isinstance(chunk, responses.ResponseFailedEvent): # pragma: no cover
|
|
1250
1301
|
self._usage += _map_usage(chunk.response)
|
pydantic_ai/providers/bedrock.py
CHANGED
|
@@ -35,11 +35,19 @@ class BedrockModelProfile(ModelProfile):
|
|
|
35
35
|
ALL FIELDS MUST BE `bedrock_` PREFIXED SO YOU CAN MERGE THEM WITH OTHER MODELS.
|
|
36
36
|
"""
|
|
37
37
|
|
|
38
|
-
bedrock_supports_tool_choice: bool =
|
|
38
|
+
bedrock_supports_tool_choice: bool = False
|
|
39
39
|
bedrock_tool_result_format: Literal['text', 'json'] = 'text'
|
|
40
40
|
bedrock_send_back_thinking_parts: bool = False
|
|
41
41
|
|
|
42
42
|
|
|
43
|
+
def bedrock_amazon_model_profile(model_name: str) -> ModelProfile | None:
|
|
44
|
+
"""Get the model profile for an Amazon model used via Bedrock."""
|
|
45
|
+
profile = amazon_model_profile(model_name)
|
|
46
|
+
if 'nova' in model_name:
|
|
47
|
+
return BedrockModelProfile(bedrock_supports_tool_choice=True).update(profile)
|
|
48
|
+
return profile
|
|
49
|
+
|
|
50
|
+
|
|
43
51
|
class BedrockProvider(Provider[BaseClient]):
|
|
44
52
|
"""Provider for AWS Bedrock."""
|
|
45
53
|
|
|
@@ -58,13 +66,13 @@ class BedrockProvider(Provider[BaseClient]):
|
|
|
58
66
|
def model_profile(self, model_name: str) -> ModelProfile | None:
|
|
59
67
|
provider_to_profile: dict[str, Callable[[str], ModelProfile | None]] = {
|
|
60
68
|
'anthropic': lambda model_name: BedrockModelProfile(
|
|
61
|
-
bedrock_supports_tool_choice=
|
|
69
|
+
bedrock_supports_tool_choice=True, bedrock_send_back_thinking_parts=True
|
|
62
70
|
).update(anthropic_model_profile(model_name)),
|
|
63
71
|
'mistral': lambda model_name: BedrockModelProfile(bedrock_tool_result_format='json').update(
|
|
64
72
|
mistral_model_profile(model_name)
|
|
65
73
|
),
|
|
66
74
|
'cohere': cohere_model_profile,
|
|
67
|
-
'amazon':
|
|
75
|
+
'amazon': bedrock_amazon_model_profile,
|
|
68
76
|
'meta': meta_model_profile,
|
|
69
77
|
'deepseek': deepseek_model_profile,
|
|
70
78
|
}
|
pydantic_ai/tools.py
CHANGED
|
@@ -253,6 +253,7 @@ class Tool(Generic[AgentDepsT]):
|
|
|
253
253
|
docstring_format: DocstringFormat
|
|
254
254
|
require_parameter_descriptions: bool
|
|
255
255
|
strict: bool | None
|
|
256
|
+
sequential: bool
|
|
256
257
|
requires_approval: bool
|
|
257
258
|
function_schema: _function_schema.FunctionSchema
|
|
258
259
|
"""
|
|
@@ -274,6 +275,7 @@ class Tool(Generic[AgentDepsT]):
|
|
|
274
275
|
require_parameter_descriptions: bool = False,
|
|
275
276
|
schema_generator: type[GenerateJsonSchema] = GenerateToolJsonSchema,
|
|
276
277
|
strict: bool | None = None,
|
|
278
|
+
sequential: bool = False,
|
|
277
279
|
requires_approval: bool = False,
|
|
278
280
|
function_schema: _function_schema.FunctionSchema | None = None,
|
|
279
281
|
):
|
|
@@ -327,6 +329,7 @@ class Tool(Generic[AgentDepsT]):
|
|
|
327
329
|
schema_generator: The JSON schema generator class to use. Defaults to `GenerateToolJsonSchema`.
|
|
328
330
|
strict: Whether to enforce JSON schema compliance (only affects OpenAI).
|
|
329
331
|
See [`ToolDefinition`][pydantic_ai.tools.ToolDefinition] for more info.
|
|
332
|
+
sequential: Whether the function requires a sequential/serial execution environment. Defaults to False.
|
|
330
333
|
requires_approval: Whether this tool requires human-in-the-loop approval. Defaults to False.
|
|
331
334
|
See the [tools documentation](../deferred-tools.md#human-in-the-loop-tool-approval) for more info.
|
|
332
335
|
function_schema: The function schema to use for the tool. If not provided, it will be generated.
|
|
@@ -347,6 +350,7 @@ class Tool(Generic[AgentDepsT]):
|
|
|
347
350
|
self.docstring_format = docstring_format
|
|
348
351
|
self.require_parameter_descriptions = require_parameter_descriptions
|
|
349
352
|
self.strict = strict
|
|
353
|
+
self.sequential = sequential
|
|
350
354
|
self.requires_approval = requires_approval
|
|
351
355
|
|
|
352
356
|
@classmethod
|
|
@@ -357,6 +361,7 @@ class Tool(Generic[AgentDepsT]):
|
|
|
357
361
|
description: str | None,
|
|
358
362
|
json_schema: JsonSchemaValue,
|
|
359
363
|
takes_ctx: bool = False,
|
|
364
|
+
sequential: bool = False,
|
|
360
365
|
) -> Self:
|
|
361
366
|
"""Creates a Pydantic tool from a function and a JSON schema.
|
|
362
367
|
|
|
@@ -370,6 +375,7 @@ class Tool(Generic[AgentDepsT]):
|
|
|
370
375
|
json_schema: The schema for the function arguments
|
|
371
376
|
takes_ctx: An optional boolean parameter indicating whether the function
|
|
372
377
|
accepts the context object as an argument.
|
|
378
|
+
sequential: Whether the function requires a sequential/serial execution environment. Defaults to False.
|
|
373
379
|
|
|
374
380
|
Returns:
|
|
375
381
|
A Pydantic tool that calls the function
|
|
@@ -389,6 +395,7 @@ class Tool(Generic[AgentDepsT]):
|
|
|
389
395
|
name=name,
|
|
390
396
|
description=description,
|
|
391
397
|
function_schema=function_schema,
|
|
398
|
+
sequential=sequential,
|
|
392
399
|
)
|
|
393
400
|
|
|
394
401
|
@property
|
|
@@ -398,6 +405,7 @@ class Tool(Generic[AgentDepsT]):
|
|
|
398
405
|
description=self.description,
|
|
399
406
|
parameters_json_schema=self.function_schema.json_schema,
|
|
400
407
|
strict=self.strict,
|
|
408
|
+
sequential=self.sequential,
|
|
401
409
|
)
|
|
402
410
|
|
|
403
411
|
async def prepare_tool_def(self, ctx: RunContext[AgentDepsT]) -> ToolDefinition | None:
|
|
@@ -466,6 +474,9 @@ class ToolDefinition:
|
|
|
466
474
|
Note: this is currently only supported by OpenAI models.
|
|
467
475
|
"""
|
|
468
476
|
|
|
477
|
+
sequential: bool = False
|
|
478
|
+
"""Whether this tool requires a sequential/serial execution environment."""
|
|
479
|
+
|
|
469
480
|
kind: ToolKind = field(default='function')
|
|
470
481
|
"""The kind of tool:
|
|
471
482
|
|
pydantic_ai/toolsets/function.py
CHANGED
|
@@ -97,6 +97,7 @@ class FunctionToolset(AbstractToolset[AgentDepsT]):
|
|
|
97
97
|
require_parameter_descriptions: bool | None = None,
|
|
98
98
|
schema_generator: type[GenerateJsonSchema] | None = None,
|
|
99
99
|
strict: bool | None = None,
|
|
100
|
+
sequential: bool = False,
|
|
100
101
|
requires_approval: bool = False,
|
|
101
102
|
) -> Callable[[ToolFuncEither[AgentDepsT, ToolParams]], ToolFuncEither[AgentDepsT, ToolParams]]: ...
|
|
102
103
|
|
|
@@ -112,6 +113,7 @@ class FunctionToolset(AbstractToolset[AgentDepsT]):
|
|
|
112
113
|
require_parameter_descriptions: bool | None = None,
|
|
113
114
|
schema_generator: type[GenerateJsonSchema] | None = None,
|
|
114
115
|
strict: bool | None = None,
|
|
116
|
+
sequential: bool = False,
|
|
115
117
|
requires_approval: bool = False,
|
|
116
118
|
) -> Any:
|
|
117
119
|
"""Decorator to register a tool function which takes [`RunContext`][pydantic_ai.tools.RunContext] as its first argument.
|
|
@@ -161,6 +163,7 @@ class FunctionToolset(AbstractToolset[AgentDepsT]):
|
|
|
161
163
|
If `None`, the default value is determined by the toolset.
|
|
162
164
|
strict: Whether to enforce JSON schema compliance (only affects OpenAI).
|
|
163
165
|
See [`ToolDefinition`][pydantic_ai.tools.ToolDefinition] for more info.
|
|
166
|
+
sequential: Whether the function requires a sequential/serial execution environment. Defaults to False.
|
|
164
167
|
requires_approval: Whether this tool requires human-in-the-loop approval. Defaults to False.
|
|
165
168
|
See the [tools documentation](../deferred-tools.md#human-in-the-loop-tool-approval) for more info.
|
|
166
169
|
"""
|
|
@@ -179,6 +182,7 @@ class FunctionToolset(AbstractToolset[AgentDepsT]):
|
|
|
179
182
|
require_parameter_descriptions,
|
|
180
183
|
schema_generator,
|
|
181
184
|
strict,
|
|
185
|
+
sequential,
|
|
182
186
|
requires_approval,
|
|
183
187
|
)
|
|
184
188
|
return func_
|
|
@@ -196,6 +200,7 @@ class FunctionToolset(AbstractToolset[AgentDepsT]):
|
|
|
196
200
|
require_parameter_descriptions: bool | None = None,
|
|
197
201
|
schema_generator: type[GenerateJsonSchema] | None = None,
|
|
198
202
|
strict: bool | None = None,
|
|
203
|
+
sequential: bool = False,
|
|
199
204
|
requires_approval: bool = False,
|
|
200
205
|
) -> None:
|
|
201
206
|
"""Add a function as a tool to the toolset.
|
|
@@ -222,6 +227,7 @@ class FunctionToolset(AbstractToolset[AgentDepsT]):
|
|
|
222
227
|
If `None`, the default value is determined by the toolset.
|
|
223
228
|
strict: Whether to enforce JSON schema compliance (only affects OpenAI).
|
|
224
229
|
See [`ToolDefinition`][pydantic_ai.tools.ToolDefinition] for more info.
|
|
230
|
+
sequential: Whether the function requires a sequential/serial execution environment. Defaults to False.
|
|
225
231
|
requires_approval: Whether this tool requires human-in-the-loop approval. Defaults to False.
|
|
226
232
|
See the [tools documentation](../deferred-tools.md#human-in-the-loop-tool-approval) for more info.
|
|
227
233
|
"""
|
|
@@ -242,6 +248,7 @@ class FunctionToolset(AbstractToolset[AgentDepsT]):
|
|
|
242
248
|
require_parameter_descriptions=require_parameter_descriptions,
|
|
243
249
|
schema_generator=schema_generator,
|
|
244
250
|
strict=strict,
|
|
251
|
+
sequential=sequential,
|
|
245
252
|
requires_approval=requires_approval,
|
|
246
253
|
)
|
|
247
254
|
self.add_tool(tool)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pydantic-ai-slim
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.2
|
|
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.
|
|
32
|
+
Requires-Dist: genai-prices>=0.0.23
|
|
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.
|
|
36
|
+
Requires-Dist: pydantic-graph==1.0.2
|
|
37
37
|
Requires-Dist: pydantic>=2.10
|
|
38
38
|
Requires-Dist: typing-inspection>=0.4.0
|
|
39
39
|
Provides-Extra: a2a
|
|
@@ -52,10 +52,12 @@ Requires-Dist: pyperclip>=1.9.0; extra == 'cli'
|
|
|
52
52
|
Requires-Dist: rich>=13; extra == 'cli'
|
|
53
53
|
Provides-Extra: cohere
|
|
54
54
|
Requires-Dist: cohere>=5.16.0; (platform_system != 'Emscripten') and extra == 'cohere'
|
|
55
|
+
Provides-Extra: dbos
|
|
56
|
+
Requires-Dist: dbos>=1.13.0; extra == 'dbos'
|
|
55
57
|
Provides-Extra: duckduckgo
|
|
56
58
|
Requires-Dist: ddgs>=9.0.0; extra == 'duckduckgo'
|
|
57
59
|
Provides-Extra: evals
|
|
58
|
-
Requires-Dist: pydantic-evals==1.0.
|
|
60
|
+
Requires-Dist: pydantic-evals==1.0.2; extra == 'evals'
|
|
59
61
|
Provides-Extra: google
|
|
60
62
|
Requires-Dist: google-genai>=1.31.0; extra == 'google'
|
|
61
63
|
Provides-Extra: groq
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
pydantic_ai/__init__.py,sha256=CfqGPSjKlDl5iw1L48HbELsDuzxIzBFnFnovI_GcFWA,2083
|
|
2
2
|
pydantic_ai/__main__.py,sha256=Q_zJU15DUA01YtlJ2mnaLCoId2YmgmreVEERGuQT-Y0,132
|
|
3
3
|
pydantic_ai/_a2a.py,sha256=2Hopcyl6o6U91eVkd7iAbEPYA5f0hJb8A5_fwMC0UfM,12168
|
|
4
|
-
pydantic_ai/_agent_graph.py,sha256=
|
|
4
|
+
pydantic_ai/_agent_graph.py,sha256=dO2RClUNQwLeKIpwB3JsbNYy6KNx2eXCrf4BIJ7p0qo,47622
|
|
5
5
|
pydantic_ai/_cli.py,sha256=C-Uvbdx9wWnNqZKHN_r8d4mGte_aIPikOkKrTPvdrN8,14057
|
|
6
6
|
pydantic_ai/_function_schema.py,sha256=olbmUMQoQV5qKV4j0-cOnhcTINz4uYyeDqMyusrFRtY,11234
|
|
7
7
|
pydantic_ai/_griffe.py,sha256=BphvTL00FHxsSY56GM-bNyCOdwrpL0T3LbDQITWUK_Q,5280
|
|
@@ -12,30 +12,35 @@ pydantic_ai/_parts_manager.py,sha256=SZi2_G9Z5Z9BLuInfgcki9p5yUhVjR38WcxfuOoECLA
|
|
|
12
12
|
pydantic_ai/_run_context.py,sha256=AFSTtOBbUAnPpM-V5_b5fLMVAFbEBX4oOdYsGR9ayt4,1824
|
|
13
13
|
pydantic_ai/_system_prompt.py,sha256=WdDW_DTGHujcFFaK-J7J6mA4ZDJZ0IOKpyizJA-1Y5Q,1142
|
|
14
14
|
pydantic_ai/_thinking_part.py,sha256=x80-Vkon16GOyq3W6f2qzafTVPC5dCgF7QD3k8ZMmYU,1304
|
|
15
|
-
pydantic_ai/_tool_manager.py,sha256=
|
|
15
|
+
pydantic_ai/_tool_manager.py,sha256=1lPPIrEc9sLR9c3GEv2GE2STZ88ipTHRqUYNzqrAKzo,9779
|
|
16
16
|
pydantic_ai/_utils.py,sha256=xa2PoAcTN-oXhfXOONOighmue-jtSv668o9Fu_IdO0A,16062
|
|
17
17
|
pydantic_ai/ag_ui.py,sha256=L21cc_LN532psY70GNgJNaj-PtBpLgqARJBF1zb2ZX4,28127
|
|
18
18
|
pydantic_ai/builtin_tools.py,sha256=t0wa6KsgDCRoZMKJKRzRDyxaz1X4mDWMHlGjQmqFLdg,3222
|
|
19
19
|
pydantic_ai/direct.py,sha256=zMsz6poVgEq7t7L_8FWM6hmKdqTzjyQYL5xzQt_59Us,14951
|
|
20
20
|
pydantic_ai/exceptions.py,sha256=zsXZMKf2BJuVsfuHl1fWTkogLU37bd4yq7D6BKHAzVs,4968
|
|
21
21
|
pydantic_ai/format_prompt.py,sha256=37imBG2Fgpn-_RfAFalOX8Xc_XpGH2gY9tnhJDvxfk8,4243
|
|
22
|
-
pydantic_ai/mcp.py,sha256=
|
|
23
|
-
pydantic_ai/messages.py,sha256=
|
|
22
|
+
pydantic_ai/mcp.py,sha256=cmgi3Nq_qe1cTqs-R92WMfZw6bwjSqy2R6NiR7isPcQ,30364
|
|
23
|
+
pydantic_ai/messages.py,sha256=PrewulR99D-WHBLIUjZDPiDSOHaTfo6-_AGDl14KdTA,54897
|
|
24
24
|
pydantic_ai/output.py,sha256=wzNgVKJgxyXtSH-uNbRxIaUNLidxlQcwWYT2o1gY2hE,12037
|
|
25
25
|
pydantic_ai/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
26
26
|
pydantic_ai/result.py,sha256=FrJbd0nwaRVIxGH_EhV-ITQvrrd-JaDya9EDsE5-Pps,25389
|
|
27
27
|
pydantic_ai/retries.py,sha256=QM4oDA9DG-Y2qP06fbCp8Dqq8ups40Rr4HYjAOlbNyM,14650
|
|
28
28
|
pydantic_ai/run.py,sha256=qpTu2Q2O3lvcQAZREuIpyL0vQN13AvW99SwD7Oe9hKc,15175
|
|
29
29
|
pydantic_ai/settings.py,sha256=yuUZ7-GkdPB-Gbx71kSdh8dSr6gwM9gEwk84qNxPO_I,3552
|
|
30
|
-
pydantic_ai/tools.py,sha256=
|
|
30
|
+
pydantic_ai/tools.py,sha256=McOPcViIGCjJzoyoipUTrttPPRMsIkbbm9ike8PaS8c,19712
|
|
31
31
|
pydantic_ai/usage.py,sha256=UoSOwhH-NTAeXl7Tq8GWXcW82m8zQLQvThvQehEx08g,14070
|
|
32
|
-
pydantic_ai/agent/__init__.py,sha256=
|
|
32
|
+
pydantic_ai/agent/__init__.py,sha256=WES-ZG7s7QQOOBIMN8fE9nXRTt_zD_M0WFsgwuz1O7c,62499
|
|
33
33
|
pydantic_ai/agent/abstract.py,sha256=nKDP_T0hRhi1RGVNIcAQbmQkTrwGWbTxt_Lzwfa7cPs,44291
|
|
34
34
|
pydantic_ai/agent/wrapper.py,sha256=--IJo8Yb-2uzcCBSIB9oB_9FQ1R7yZYkWnLSq0iUExs,9464
|
|
35
35
|
pydantic_ai/common_tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
36
36
|
pydantic_ai/common_tools/duckduckgo.py,sha256=cJd-BUg-i50E0QjKveRCndGlU5GdvLq9UgNNJ18VQIQ,2263
|
|
37
37
|
pydantic_ai/common_tools/tavily.py,sha256=Q1xxSF5HtXAaZ10Pp-OaDOHXwJf2mco9wScGEQXD7E4,2495
|
|
38
38
|
pydantic_ai/durable_exec/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
39
|
+
pydantic_ai/durable_exec/dbos/__init__.py,sha256=H_dT0ERuNCBP0Im8eVGl8F9h7E9Aj87-pvmnLpDelF0,199
|
|
40
|
+
pydantic_ai/durable_exec/dbos/_agent.py,sha256=TS_4RjBawsD7ykdtG_gCQyXIh9clfJF1Ig7_vimxWvo,32464
|
|
41
|
+
pydantic_ai/durable_exec/dbos/_mcp_server.py,sha256=XeDeBnyNwonPMZaSd2IMDf3ye0CTgYO9b9Vh8ZoeT6A,3009
|
|
42
|
+
pydantic_ai/durable_exec/dbos/_model.py,sha256=XNGLKJ5a9znUWnMSIA0SzxvQmUJREWzcVDrnfdjMoac,5115
|
|
43
|
+
pydantic_ai/durable_exec/dbos/_utils.py,sha256=_aNceFvTcNeqb78sTDYM2TdYph85tbdeLueyXY1lbTA,242
|
|
39
44
|
pydantic_ai/durable_exec/temporal/__init__.py,sha256=XKwy68wfgmjr057nolRwGHTKiadxufpQEGEUprAV09k,5563
|
|
40
45
|
pydantic_ai/durable_exec/temporal/_agent.py,sha256=9-yANaXqbOELkvTu_zeJI5tROKUY2t9-WYUIksSmzD8,36901
|
|
41
46
|
pydantic_ai/durable_exec/temporal/_function_toolset.py,sha256=Hnfz3ukOqgq8j3h9u97S-fMfq4un1HZA4kxN2irWD_0,5562
|
|
@@ -47,20 +52,20 @@ pydantic_ai/durable_exec/temporal/_toolset.py,sha256=HxmQ5vut7Zd5eyrC27eNNn5_CHA
|
|
|
47
52
|
pydantic_ai/ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
48
53
|
pydantic_ai/ext/aci.py,sha256=sUllKDNO-LOMurbFgxwRHuzNlBkSa3aVBqXfEm-A_vo,2545
|
|
49
54
|
pydantic_ai/ext/langchain.py,sha256=iLVEZv1kcLkdIHo3us2yfdi0kVqyJ6qTaCt9BoLWm4k,2335
|
|
50
|
-
pydantic_ai/models/__init__.py,sha256=
|
|
51
|
-
pydantic_ai/models/anthropic.py,sha256=
|
|
55
|
+
pydantic_ai/models/__init__.py,sha256=30HXKHE_iGcAMdGfanYY_UEmyyM16bKg-PPf0jZPcbo,36091
|
|
56
|
+
pydantic_ai/models/anthropic.py,sha256=0qbN9cRF_ho6Nm2jWnHsFs-Yss9KA-Rrp7g_Xp8beac,31278
|
|
52
57
|
pydantic_ai/models/bedrock.py,sha256=Eeq-rqZWaVu2tbH8eSNoxp5dq5RH8esnsOp-ge_XGu4,30786
|
|
53
58
|
pydantic_ai/models/cohere.py,sha256=aKgpcYfIKwMfEroWxfLyzYu8ELuddF4TXv7s0LU3Pcc,13052
|
|
54
59
|
pydantic_ai/models/fallback.py,sha256=XJ74wRxVT4dF0uewHH3is9I-zcLBK8KFIhpK3BB6mRw,5526
|
|
55
60
|
pydantic_ai/models/function.py,sha256=uWGdw4sFhhmczjU44rwe6i2XFafOXAalIigWGCSivYg,14231
|
|
56
61
|
pydantic_ai/models/gemini.py,sha256=DYEaOnwGmo9FUGVkRRrydGuQwYhnO-Cq5grTurLWgb4,39376
|
|
57
|
-
pydantic_ai/models/google.py,sha256=
|
|
62
|
+
pydantic_ai/models/google.py,sha256=npkTLwS8w-SfvsU9iB3_yOZfCfreJhKEmuuu_I9RQfk,33701
|
|
58
63
|
pydantic_ai/models/groq.py,sha256=am-Qpp6RLFqwRnouIdACWd5nxOBB92Bn0hRs-VdrD38,25561
|
|
59
64
|
pydantic_ai/models/huggingface.py,sha256=sWjHTVfqOtdlOENdERkPxtGjQ8quUNepPjqlXSR7aGk,20417
|
|
60
|
-
pydantic_ai/models/instrumented.py,sha256=
|
|
65
|
+
pydantic_ai/models/instrumented.py,sha256=DCnyG7HXgV-W2EWac8oZb2A8PL8yarXeU7Rt97l4w_s,21421
|
|
61
66
|
pydantic_ai/models/mcp_sampling.py,sha256=qnLCO3CB5bNQ86SpWRA-CSSOVcCCLPwjHtcNFvW9wHs,3461
|
|
62
67
|
pydantic_ai/models/mistral.py,sha256=yS5pBYtFUkICwkvGN23iBbBfaBASN1DARsB6QQbBjOc,32344
|
|
63
|
-
pydantic_ai/models/openai.py,sha256=
|
|
68
|
+
pydantic_ai/models/openai.py,sha256=WwbEHpSR_ZOBt0-oQ_sUbDxUFDuS0hcd5H4dEboG4ew,66978
|
|
64
69
|
pydantic_ai/models/test.py,sha256=1kBwi7pSUt9_K1U-hokOilplxJWPQ3KRKH_s8bYmt_s,19969
|
|
65
70
|
pydantic_ai/models/wrapper.py,sha256=9MeHW7mXPsEK03IKL0rtjeX6QgXyZROOOzLh72GiX2k,2148
|
|
66
71
|
pydantic_ai/profiles/__init__.py,sha256=V6uGAVJuIaYRuZOQjkdIyFfDKD5py18RC98njnHOFug,3293
|
|
@@ -81,7 +86,7 @@ pydantic_ai/profiles/qwen.py,sha256=9SnTpMKndxNQMFyumyaOczJa5JGWbYQdpVKKW4OzKjk,
|
|
|
81
86
|
pydantic_ai/providers/__init__.py,sha256=QlFpPM_kGnF_YAzwB9Dgmxx4Emp33x0bh831H_xKDXE,4478
|
|
82
87
|
pydantic_ai/providers/anthropic.py,sha256=bDFNAE4WB66Dn7YDnI3dv6yBbMmM9Kzt2kalM4Fq8WQ,3158
|
|
83
88
|
pydantic_ai/providers/azure.py,sha256=msYyeQoHATxCJkiF1N05lPSJivh-SWKK1463WF6xTK4,5823
|
|
84
|
-
pydantic_ai/providers/bedrock.py,sha256=
|
|
89
|
+
pydantic_ai/providers/bedrock.py,sha256=eq9KflG4pT1Ny2mlaSHkXYdwn8L6S36qTJijrp98Cd4,6160
|
|
85
90
|
pydantic_ai/providers/cerebras.py,sha256=2zgsNxup_7OEPOXnbJHMYnVRDnB9UYTQnOO4wv7xnYA,3436
|
|
86
91
|
pydantic_ai/providers/cohere.py,sha256=-F0prLuI2aDtHNZakd1GlyvgFLio-fo5n6fRbyPMvro,2858
|
|
87
92
|
pydantic_ai/providers/deepseek.py,sha256=JSc7dQbB-l7_Phf61ZLb4_c1oym9fHea_h2Yq88uoL8,3032
|
|
@@ -109,13 +114,13 @@ pydantic_ai/toolsets/approval_required.py,sha256=zyYGEx2VqprLed16OXg1QWr81rnAB0C
|
|
|
109
114
|
pydantic_ai/toolsets/combined.py,sha256=LQzm_g6gskiHRUMFDvm88SSrz8OGxbdxyHiKzQrMBNU,4026
|
|
110
115
|
pydantic_ai/toolsets/external.py,sha256=J9mWQm1HLbRCOJwpLBIvUZZGR_ywSB7pz8MrXkRNBoU,1736
|
|
111
116
|
pydantic_ai/toolsets/filtered.py,sha256=PSQG9EbBYJpHUEBb_4TGzhjAcQPo5aPKvTuReeoWYtQ,864
|
|
112
|
-
pydantic_ai/toolsets/function.py,sha256=
|
|
117
|
+
pydantic_ai/toolsets/function.py,sha256=v7KDeTaJhpeF58Wyvgtwji5m5_ejFb1e538T8w-0Qfo,13304
|
|
113
118
|
pydantic_ai/toolsets/prefixed.py,sha256=0KwcDkW8OM36ZUsOLVP5h-Nj2tPq78L3_E2c-1Fbh5s,1426
|
|
114
119
|
pydantic_ai/toolsets/prepared.py,sha256=Zjfz6S8In6PBVxoKFN9sKPN984zO6t0awB7Lnq5KODw,1431
|
|
115
120
|
pydantic_ai/toolsets/renamed.py,sha256=JuLHpi-hYPiSPlaTpN8WiXLiGsywYK0axi2lW2Qs75k,1637
|
|
116
121
|
pydantic_ai/toolsets/wrapper.py,sha256=KRzF1p8dncHbva8CE6Ud-IC5E_aygIHlwH5atXK55k4,1673
|
|
117
|
-
pydantic_ai_slim-1.0.
|
|
118
|
-
pydantic_ai_slim-1.0.
|
|
119
|
-
pydantic_ai_slim-1.0.
|
|
120
|
-
pydantic_ai_slim-1.0.
|
|
121
|
-
pydantic_ai_slim-1.0.
|
|
122
|
+
pydantic_ai_slim-1.0.2.dist-info/METADATA,sha256=JnuivQtWEN9B9SRrwIx0ncpu_gL8667W6F1kCRGTxgw,4626
|
|
123
|
+
pydantic_ai_slim-1.0.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
124
|
+
pydantic_ai_slim-1.0.2.dist-info/entry_points.txt,sha256=kbKxe2VtDCYS06hsI7P3uZGxcVC08-FPt1rxeiMpIps,50
|
|
125
|
+
pydantic_ai_slim-1.0.2.dist-info/licenses/LICENSE,sha256=vA6Jc482lEyBBuGUfD1pYx-cM7jxvLYOxPidZ30t_PQ,1100
|
|
126
|
+
pydantic_ai_slim-1.0.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|