pydantic-ai-slim 0.0.24__py3-none-any.whl → 0.0.25__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/__init__.py +5 -1
- pydantic_ai/_agent_graph.py +256 -346
- pydantic_ai/_utils.py +1 -1
- pydantic_ai/agent.py +572 -147
- pydantic_ai/messages.py +31 -0
- pydantic_ai/models/__init__.py +12 -1
- pydantic_ai/models/anthropic.py +41 -49
- pydantic_ai/models/cohere.py +1 -1
- pydantic_ai/models/function.py +3 -3
- pydantic_ai/models/gemini.py +18 -2
- pydantic_ai/models/instrumented.py +225 -0
- pydantic_ai/models/mistral.py +0 -3
- pydantic_ai/models/openai.py +2 -5
- pydantic_ai/models/test.py +6 -6
- pydantic_ai/models/wrapper.py +45 -0
- pydantic_ai/result.py +106 -144
- {pydantic_ai_slim-0.0.24.dist-info → pydantic_ai_slim-0.0.25.dist-info}/METADATA +2 -2
- pydantic_ai_slim-0.0.25.dist-info/RECORD +32 -0
- pydantic_ai_slim-0.0.24.dist-info/RECORD +0 -30
- {pydantic_ai_slim-0.0.24.dist-info → pydantic_ai_slim-0.0.25.dist-info}/WHEEL +0 -0
pydantic_ai/result.py
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations as _annotations
|
|
2
2
|
|
|
3
|
-
from abc import ABC, abstractmethod
|
|
4
3
|
from collections.abc import AsyncIterable, AsyncIterator, Awaitable, Callable
|
|
5
|
-
from copy import
|
|
4
|
+
from copy import copy
|
|
6
5
|
from dataclasses import dataclass, field
|
|
7
6
|
from datetime import datetime
|
|
8
7
|
from typing import Generic, Union, cast
|
|
@@ -14,7 +13,7 @@ from . import _result, _utils, exceptions, messages as _messages, models
|
|
|
14
13
|
from .tools import AgentDepsT, RunContext
|
|
15
14
|
from .usage import Usage, UsageLimits
|
|
16
15
|
|
|
17
|
-
__all__ = 'ResultDataT', 'ResultDataT_inv', 'ResultValidatorFunc'
|
|
16
|
+
__all__ = 'ResultDataT', 'ResultDataT_inv', 'ResultValidatorFunc'
|
|
18
17
|
|
|
19
18
|
|
|
20
19
|
T = TypeVar('T')
|
|
@@ -53,15 +52,34 @@ _logfire = logfire_api.Logfire(otel_scope='pydantic-ai')
|
|
|
53
52
|
|
|
54
53
|
|
|
55
54
|
@dataclass
|
|
56
|
-
class
|
|
57
|
-
"""
|
|
58
|
-
|
|
59
|
-
You should not import or use this type directly, instead use its subclasses `RunResult` and `StreamedRunResult`.
|
|
60
|
-
"""
|
|
55
|
+
class StreamedRunResult(Generic[AgentDepsT, ResultDataT]):
|
|
56
|
+
"""Result of a streamed run that returns structured data via a tool call."""
|
|
61
57
|
|
|
62
58
|
_all_messages: list[_messages.ModelMessage]
|
|
63
59
|
_new_message_index: int
|
|
64
60
|
|
|
61
|
+
_usage_limits: UsageLimits | None
|
|
62
|
+
_stream_response: models.StreamedResponse
|
|
63
|
+
_result_schema: _result.ResultSchema[ResultDataT] | None
|
|
64
|
+
_run_ctx: RunContext[AgentDepsT]
|
|
65
|
+
_result_validators: list[_result.ResultValidator[AgentDepsT, ResultDataT]]
|
|
66
|
+
_result_tool_name: str | None
|
|
67
|
+
_on_complete: Callable[[], Awaitable[None]]
|
|
68
|
+
|
|
69
|
+
_initial_run_ctx_usage: Usage = field(init=False)
|
|
70
|
+
is_complete: bool = field(default=False, init=False)
|
|
71
|
+
"""Whether the stream has all been received.
|
|
72
|
+
|
|
73
|
+
This is set to `True` when one of
|
|
74
|
+
[`stream`][pydantic_ai.result.StreamedRunResult.stream],
|
|
75
|
+
[`stream_text`][pydantic_ai.result.StreamedRunResult.stream_text],
|
|
76
|
+
[`stream_structured`][pydantic_ai.result.StreamedRunResult.stream_structured] or
|
|
77
|
+
[`get_data`][pydantic_ai.result.StreamedRunResult.get_data] completes.
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
def __post_init__(self):
|
|
81
|
+
self._initial_run_ctx_usage = copy(self._run_ctx.usage)
|
|
82
|
+
|
|
65
83
|
def all_messages(self, *, result_tool_return_content: str | None = None) -> list[_messages.ModelMessage]:
|
|
66
84
|
"""Return the history of _messages.
|
|
67
85
|
|
|
@@ -80,7 +98,7 @@ class _BaseRunResult(ABC, Generic[ResultDataT]):
|
|
|
80
98
|
return self._all_messages
|
|
81
99
|
|
|
82
100
|
def all_messages_json(self, *, result_tool_return_content: str | None = None) -> bytes:
|
|
83
|
-
"""Return all messages from [`all_messages`][pydantic_ai.result.
|
|
101
|
+
"""Return all messages from [`all_messages`][pydantic_ai.result.StreamedRunResult.all_messages] as JSON bytes.
|
|
84
102
|
|
|
85
103
|
Args:
|
|
86
104
|
result_tool_return_content: The return content of the tool call to set in the last message.
|
|
@@ -112,7 +130,7 @@ class _BaseRunResult(ABC, Generic[ResultDataT]):
|
|
|
112
130
|
return self.all_messages(result_tool_return_content=result_tool_return_content)[self._new_message_index :]
|
|
113
131
|
|
|
114
132
|
def new_messages_json(self, *, result_tool_return_content: str | None = None) -> bytes:
|
|
115
|
-
"""Return new messages from [`new_messages`][pydantic_ai.result.
|
|
133
|
+
"""Return new messages from [`new_messages`][pydantic_ai.result.StreamedRunResult.new_messages] as JSON bytes.
|
|
116
134
|
|
|
117
135
|
Args:
|
|
118
136
|
result_tool_return_content: The return content of the tool call to set in the last message.
|
|
@@ -127,78 +145,6 @@ class _BaseRunResult(ABC, Generic[ResultDataT]):
|
|
|
127
145
|
self.new_messages(result_tool_return_content=result_tool_return_content)
|
|
128
146
|
)
|
|
129
147
|
|
|
130
|
-
@abstractmethod
|
|
131
|
-
def usage(self) -> Usage:
|
|
132
|
-
raise NotImplementedError()
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
@dataclass
|
|
136
|
-
class RunResult(_BaseRunResult[ResultDataT]):
|
|
137
|
-
"""Result of a non-streamed run."""
|
|
138
|
-
|
|
139
|
-
data: ResultDataT
|
|
140
|
-
"""Data from the final response in the run."""
|
|
141
|
-
_result_tool_name: str | None
|
|
142
|
-
_usage: Usage
|
|
143
|
-
|
|
144
|
-
def usage(self) -> Usage:
|
|
145
|
-
"""Return the usage of the whole run."""
|
|
146
|
-
return self._usage
|
|
147
|
-
|
|
148
|
-
def all_messages(self, *, result_tool_return_content: str | None = None) -> list[_messages.ModelMessage]:
|
|
149
|
-
"""Return the history of _messages.
|
|
150
|
-
|
|
151
|
-
Args:
|
|
152
|
-
result_tool_return_content: The return content of the tool call to set in the last message.
|
|
153
|
-
This provides a convenient way to modify the content of the result tool call if you want to continue
|
|
154
|
-
the conversation and want to set the response to the result tool call. If `None`, the last message will
|
|
155
|
-
not be modified.
|
|
156
|
-
|
|
157
|
-
Returns:
|
|
158
|
-
List of messages.
|
|
159
|
-
"""
|
|
160
|
-
if result_tool_return_content is not None:
|
|
161
|
-
return self._set_result_tool_return(result_tool_return_content)
|
|
162
|
-
else:
|
|
163
|
-
return self._all_messages
|
|
164
|
-
|
|
165
|
-
def _set_result_tool_return(self, return_content: str) -> list[_messages.ModelMessage]:
|
|
166
|
-
"""Set return content for the result tool.
|
|
167
|
-
|
|
168
|
-
Useful if you want to continue the conversation and want to set the response to the result tool call.
|
|
169
|
-
"""
|
|
170
|
-
if not self._result_tool_name:
|
|
171
|
-
raise ValueError('Cannot set result tool return content when the return type is `str`.')
|
|
172
|
-
messages = deepcopy(self._all_messages)
|
|
173
|
-
last_message = messages[-1]
|
|
174
|
-
for part in last_message.parts:
|
|
175
|
-
if isinstance(part, _messages.ToolReturnPart) and part.tool_name == self._result_tool_name:
|
|
176
|
-
part.content = return_content
|
|
177
|
-
return messages
|
|
178
|
-
raise LookupError(f'No tool call found with tool name {self._result_tool_name!r}.')
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
@dataclass
|
|
182
|
-
class StreamedRunResult(_BaseRunResult[ResultDataT], Generic[AgentDepsT, ResultDataT]):
|
|
183
|
-
"""Result of a streamed run that returns structured data via a tool call."""
|
|
184
|
-
|
|
185
|
-
_usage_limits: UsageLimits | None
|
|
186
|
-
_stream_response: models.StreamedResponse
|
|
187
|
-
_result_schema: _result.ResultSchema[ResultDataT] | None
|
|
188
|
-
_run_ctx: RunContext[AgentDepsT]
|
|
189
|
-
_result_validators: list[_result.ResultValidator[AgentDepsT, ResultDataT]]
|
|
190
|
-
_result_tool_name: str | None
|
|
191
|
-
_on_complete: Callable[[], Awaitable[None]]
|
|
192
|
-
is_complete: bool = field(default=False, init=False)
|
|
193
|
-
"""Whether the stream has all been received.
|
|
194
|
-
|
|
195
|
-
This is set to `True` when one of
|
|
196
|
-
[`stream`][pydantic_ai.result.StreamedRunResult.stream],
|
|
197
|
-
[`stream_text`][pydantic_ai.result.StreamedRunResult.stream_text],
|
|
198
|
-
[`stream_structured`][pydantic_ai.result.StreamedRunResult.stream_structured] or
|
|
199
|
-
[`get_data`][pydantic_ai.result.StreamedRunResult.get_data] completes.
|
|
200
|
-
"""
|
|
201
|
-
|
|
202
148
|
async def stream(self, *, debounce_by: float | None = 0.1) -> AsyncIterator[ResultDataT]:
|
|
203
149
|
"""Stream the response as an async iterable.
|
|
204
150
|
|
|
@@ -234,61 +180,17 @@ class StreamedRunResult(_BaseRunResult[ResultDataT], Generic[AgentDepsT, ResultD
|
|
|
234
180
|
if self._result_schema and not self._result_schema.allow_text_result:
|
|
235
181
|
raise exceptions.UserError('stream_text() can only be used with text responses')
|
|
236
182
|
|
|
237
|
-
usage_checking_stream = _get_usage_checking_stream_response(
|
|
238
|
-
self._stream_response, self._usage_limits, self.usage
|
|
239
|
-
)
|
|
240
|
-
|
|
241
|
-
# Define a "merged" version of the iterator that will yield items that have already been retrieved
|
|
242
|
-
# and items that we receive while streaming. We define a dedicated async iterator for this so we can
|
|
243
|
-
# pass the combined stream to the group_by_temporal function within `_stream_text_deltas` below.
|
|
244
|
-
async def _stream_text_deltas_ungrouped() -> AsyncIterator[tuple[str, int]]:
|
|
245
|
-
# if the response currently has any parts with content, yield those before streaming
|
|
246
|
-
msg = self._stream_response.get()
|
|
247
|
-
for i, part in enumerate(msg.parts):
|
|
248
|
-
if isinstance(part, _messages.TextPart) and part.content:
|
|
249
|
-
yield part.content, i
|
|
250
|
-
|
|
251
|
-
async for event in usage_checking_stream:
|
|
252
|
-
if (
|
|
253
|
-
isinstance(event, _messages.PartStartEvent)
|
|
254
|
-
and isinstance(event.part, _messages.TextPart)
|
|
255
|
-
and event.part.content
|
|
256
|
-
):
|
|
257
|
-
yield event.part.content, event.index
|
|
258
|
-
elif (
|
|
259
|
-
isinstance(event, _messages.PartDeltaEvent)
|
|
260
|
-
and isinstance(event.delta, _messages.TextPartDelta)
|
|
261
|
-
and event.delta.content_delta
|
|
262
|
-
):
|
|
263
|
-
yield event.delta.content_delta, event.index
|
|
264
|
-
|
|
265
|
-
async def _stream_text_deltas() -> AsyncIterator[str]:
|
|
266
|
-
async with _utils.group_by_temporal(_stream_text_deltas_ungrouped(), debounce_by) as group_iter:
|
|
267
|
-
async for items in group_iter:
|
|
268
|
-
yield ''.join([content for content, _ in items])
|
|
269
|
-
|
|
270
183
|
with _logfire.span('response stream text') as lf_span:
|
|
271
184
|
if delta:
|
|
272
|
-
async for text in
|
|
185
|
+
async for text in self._stream_response_text(delta=delta, debounce_by=debounce_by):
|
|
273
186
|
yield text
|
|
274
187
|
else:
|
|
275
|
-
# a quick benchmark shows it's faster to build up a string with concat when we're
|
|
276
|
-
# yielding at each step
|
|
277
|
-
deltas: list[str] = []
|
|
278
188
|
combined_validated_text = ''
|
|
279
|
-
async for text in
|
|
280
|
-
|
|
281
|
-
combined_text = ''.join(deltas)
|
|
282
|
-
combined_validated_text = await self._validate_text_result(combined_text)
|
|
189
|
+
async for text in self._stream_response_text(delta=delta, debounce_by=debounce_by):
|
|
190
|
+
combined_validated_text = await self._validate_text_result(text)
|
|
283
191
|
yield combined_validated_text
|
|
284
|
-
|
|
285
192
|
lf_span.set_attribute('combined_text', combined_validated_text)
|
|
286
|
-
|
|
287
|
-
_messages.ModelResponse(
|
|
288
|
-
parts=[_messages.TextPart(combined_validated_text)],
|
|
289
|
-
model_name=self._stream_response.model_name,
|
|
290
|
-
)
|
|
291
|
-
)
|
|
193
|
+
await self._marked_completed(self._stream_response.get())
|
|
292
194
|
|
|
293
195
|
async def stream_structured(
|
|
294
196
|
self, *, debounce_by: float | None = 0.1
|
|
@@ -303,10 +205,6 @@ class StreamedRunResult(_BaseRunResult[ResultDataT], Generic[AgentDepsT, ResultD
|
|
|
303
205
|
Returns:
|
|
304
206
|
An async iterable of the structured response message and whether that is the last message.
|
|
305
207
|
"""
|
|
306
|
-
usage_checking_stream = _get_usage_checking_stream_response(
|
|
307
|
-
self._stream_response, self._usage_limits, self.usage
|
|
308
|
-
)
|
|
309
|
-
|
|
310
208
|
with _logfire.span('response stream structured') as lf_span:
|
|
311
209
|
# if the message currently has any parts with content, yield before streaming
|
|
312
210
|
msg = self._stream_response.get()
|
|
@@ -315,15 +213,14 @@ class StreamedRunResult(_BaseRunResult[ResultDataT], Generic[AgentDepsT, ResultD
|
|
|
315
213
|
yield msg, False
|
|
316
214
|
break
|
|
317
215
|
|
|
318
|
-
async
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
await self._marked_completed(msg)
|
|
216
|
+
async for msg in self._stream_response_structured(debounce_by=debounce_by):
|
|
217
|
+
yield msg, False
|
|
218
|
+
|
|
219
|
+
msg = self._stream_response.get()
|
|
220
|
+
yield msg, True
|
|
221
|
+
|
|
222
|
+
lf_span.set_attribute('structured_response', msg)
|
|
223
|
+
await self._marked_completed(msg)
|
|
327
224
|
|
|
328
225
|
async def get_data(self) -> ResultDataT:
|
|
329
226
|
"""Stream the whole response, validate and return it."""
|
|
@@ -343,7 +240,7 @@ class StreamedRunResult(_BaseRunResult[ResultDataT], Generic[AgentDepsT, ResultD
|
|
|
343
240
|
!!! note
|
|
344
241
|
This won't return the full usage until the stream is finished.
|
|
345
242
|
"""
|
|
346
|
-
return self.
|
|
243
|
+
return self._initial_run_ctx_usage + self._stream_response.usage()
|
|
347
244
|
|
|
348
245
|
def timestamp(self) -> datetime:
|
|
349
246
|
"""Get the timestamp of the response."""
|
|
@@ -391,6 +288,71 @@ class StreamedRunResult(_BaseRunResult[ResultDataT], Generic[AgentDepsT, ResultD
|
|
|
391
288
|
self._all_messages.append(message)
|
|
392
289
|
await self._on_complete()
|
|
393
290
|
|
|
291
|
+
async def _stream_response_structured(
|
|
292
|
+
self, *, debounce_by: float | None = 0.1
|
|
293
|
+
) -> AsyncIterator[_messages.ModelResponse]:
|
|
294
|
+
async with _utils.group_by_temporal(self._stream_response, debounce_by) as group_iter:
|
|
295
|
+
async for _items in group_iter:
|
|
296
|
+
yield self._stream_response.get()
|
|
297
|
+
|
|
298
|
+
async def _stream_response_text(
|
|
299
|
+
self, *, delta: bool = False, debounce_by: float | None = 0.1
|
|
300
|
+
) -> AsyncIterator[str]:
|
|
301
|
+
"""Stream the response as an async iterable of text."""
|
|
302
|
+
|
|
303
|
+
# Define a "merged" version of the iterator that will yield items that have already been retrieved
|
|
304
|
+
# and items that we receive while streaming. We define a dedicated async iterator for this so we can
|
|
305
|
+
# pass the combined stream to the group_by_temporal function within `_stream_text_deltas` below.
|
|
306
|
+
async def _stream_text_deltas_ungrouped() -> AsyncIterator[tuple[str, int]]:
|
|
307
|
+
# yields tuples of (text_content, part_index)
|
|
308
|
+
# we don't currently make use of the part_index, but in principle this may be useful
|
|
309
|
+
# so we retain it here for now to make possible future refactors simpler
|
|
310
|
+
msg = self._stream_response.get()
|
|
311
|
+
for i, part in enumerate(msg.parts):
|
|
312
|
+
if isinstance(part, _messages.TextPart) and part.content:
|
|
313
|
+
yield part.content, i
|
|
314
|
+
|
|
315
|
+
async for event in self._stream_response:
|
|
316
|
+
if (
|
|
317
|
+
isinstance(event, _messages.PartStartEvent)
|
|
318
|
+
and isinstance(event.part, _messages.TextPart)
|
|
319
|
+
and event.part.content
|
|
320
|
+
):
|
|
321
|
+
yield event.part.content, event.index
|
|
322
|
+
elif (
|
|
323
|
+
isinstance(event, _messages.PartDeltaEvent)
|
|
324
|
+
and isinstance(event.delta, _messages.TextPartDelta)
|
|
325
|
+
and event.delta.content_delta
|
|
326
|
+
):
|
|
327
|
+
yield event.delta.content_delta, event.index
|
|
328
|
+
|
|
329
|
+
async def _stream_text_deltas() -> AsyncIterator[str]:
|
|
330
|
+
async with _utils.group_by_temporal(_stream_text_deltas_ungrouped(), debounce_by) as group_iter:
|
|
331
|
+
async for items in group_iter:
|
|
332
|
+
# Note: we are currently just dropping the part index on the group here
|
|
333
|
+
yield ''.join([content for content, _ in items])
|
|
334
|
+
|
|
335
|
+
if delta:
|
|
336
|
+
async for text in _stream_text_deltas():
|
|
337
|
+
yield text
|
|
338
|
+
else:
|
|
339
|
+
# a quick benchmark shows it's faster to build up a string with concat when we're
|
|
340
|
+
# yielding at each step
|
|
341
|
+
deltas: list[str] = []
|
|
342
|
+
async for text in _stream_text_deltas():
|
|
343
|
+
deltas.append(text)
|
|
344
|
+
yield ''.join(deltas)
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
@dataclass
|
|
348
|
+
class FinalResult(Generic[ResultDataT]):
|
|
349
|
+
"""Marker class storing the final result of an agent run and associated metadata."""
|
|
350
|
+
|
|
351
|
+
data: ResultDataT
|
|
352
|
+
"""The final result data."""
|
|
353
|
+
tool_name: str | None
|
|
354
|
+
"""Name of the final result tool; `None` if the result came from unstructured text content."""
|
|
355
|
+
|
|
394
356
|
|
|
395
357
|
def _get_usage_checking_stream_response(
|
|
396
358
|
stream_response: AsyncIterable[_messages.ModelResponseStreamEvent],
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pydantic-ai-slim
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.25
|
|
4
4
|
Summary: Agent Framework / shim to use Pydantic with LLMs, slim package
|
|
5
5
|
Author-email: Samuel Colvin <samuel@pydantic.dev>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -28,7 +28,7 @@ Requires-Dist: eval-type-backport>=0.2.0
|
|
|
28
28
|
Requires-Dist: griffe>=1.3.2
|
|
29
29
|
Requires-Dist: httpx>=0.27
|
|
30
30
|
Requires-Dist: logfire-api>=1.2.0
|
|
31
|
-
Requires-Dist: pydantic-graph==0.0.
|
|
31
|
+
Requires-Dist: pydantic-graph==0.0.25
|
|
32
32
|
Requires-Dist: pydantic>=2.10
|
|
33
33
|
Provides-Extra: anthropic
|
|
34
34
|
Requires-Dist: anthropic>=0.40.0; extra == 'anthropic'
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
pydantic_ai/__init__.py,sha256=2Sc-fnJ3OtqFrIZ47PsVVBE_TWPHWuKbik9upnFQw_4,647
|
|
2
|
+
pydantic_ai/_agent_graph.py,sha256=ihtYxeh59G6BR8piOp7eZyNoB4nLb3XhFnoDuwna1G4,28789
|
|
3
|
+
pydantic_ai/_griffe.py,sha256=RYRKiLbgG97QxnazbAwlnc74XxevGHLQet-FGfq9qls,3960
|
|
4
|
+
pydantic_ai/_parts_manager.py,sha256=ARfDQY1_5AIY5rNl_M2fAYHEFCe03ZxdhgjHf9qeIKw,11872
|
|
5
|
+
pydantic_ai/_pydantic.py,sha256=dROz3Hmfdi0C2exq88FhefDRVo_8S3rtkXnoUHzsz0c,8753
|
|
6
|
+
pydantic_ai/_result.py,sha256=tN1pVulf_EM4bkBvpNUWPnUXezLY-sBrJEVCFdy2nLU,10264
|
|
7
|
+
pydantic_ai/_system_prompt.py,sha256=602c2jyle2R_SesOrITBDETZqsLk4BZ8Cbo8yEhmx04,1120
|
|
8
|
+
pydantic_ai/_utils.py,sha256=w9BYSfFZiaX757fRtMRclOL1uYzyQnxV_lxqbU2WTPs,9435
|
|
9
|
+
pydantic_ai/agent.py,sha256=MGVvvccxcD2g9t-Tjd1uyff0CwGk4D7--KWIRgB9Gxo,63361
|
|
10
|
+
pydantic_ai/exceptions.py,sha256=eGDKX6bGhgVxXBzu81Sk3iiAkXr0GUtgT7bD5Rxlqpg,2028
|
|
11
|
+
pydantic_ai/format_as_xml.py,sha256=QE7eMlg5-YUMw1_2kcI3h0uKYPZZyGkgXFDtfZTMeeI,4480
|
|
12
|
+
pydantic_ai/messages.py,sha256=RGzYX58M1plN-y2BmoGLA9m3r-tcha60OmzqOuiMLbk,18218
|
|
13
|
+
pydantic_ai/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
|
+
pydantic_ai/result.py,sha256=Rqbog6efO1l_bFJSuAd-_ZZLoQa_rz4motOGeR_5N3I,16803
|
|
15
|
+
pydantic_ai/settings.py,sha256=ntuWnke9UA18aByDxk9OIhN0tAgOaPdqCEkRf-wlp8Y,3059
|
|
16
|
+
pydantic_ai/tools.py,sha256=lhupwm815lPlFFS79B0P61AyhUYtepA62LbZOCJrPEY,13205
|
|
17
|
+
pydantic_ai/usage.py,sha256=60d9f6M7YEYuKMbqDGDogX4KsA73fhDtWyDXYXoIPaI,4948
|
|
18
|
+
pydantic_ai/models/__init__.py,sha256=Qw_g58KzGUmuDKOBa2u3yFrNbgCXkdRSNtkhseLC1VM,13758
|
|
19
|
+
pydantic_ai/models/anthropic.py,sha256=9kyWzt81Vrx9NUUZVXLRuGB0cJ3jPVNVCo9jgX89tPI,17752
|
|
20
|
+
pydantic_ai/models/cohere.py,sha256=Rotl0F8O3fz7hvR269j-JGves42WieNDWU046XbIpWk,11000
|
|
21
|
+
pydantic_ai/models/function.py,sha256=YU2Y3t5Olw0tBzWXUr0DkjtxtyVXUtlOhbmoRdtKx84,10333
|
|
22
|
+
pydantic_ai/models/gemini.py,sha256=vTN3lRTTXfVHFAUJJQN2IRH24iabUWe5feYu8syV5Lc,31433
|
|
23
|
+
pydantic_ai/models/groq.py,sha256=M7P-9LrH1lm4wyIMiytsHf28bwkukOyVzw3S7F9sbic,14612
|
|
24
|
+
pydantic_ai/models/instrumented.py,sha256=cvjHgQE_gJOH-YVQyvx9tBpGNB_Iuc8N8THn0TL0Rjk,8791
|
|
25
|
+
pydantic_ai/models/mistral.py,sha256=yUJj9MT8iaujMrD7dMOOAWHfAJJQEuWGNLtChHdyakg,25795
|
|
26
|
+
pydantic_ai/models/openai.py,sha256=B6kn8xP5J5Pjfwyq5zJStpCWph8ZU8B6-NuNgNMXdLQ,17151
|
|
27
|
+
pydantic_ai/models/test.py,sha256=Ux20cmuJFkhvI9L1N7ItHNFcd-j284TBEsrM53eWRag,16873
|
|
28
|
+
pydantic_ai/models/vertexai.py,sha256=9Kp_1KMBlbP8_HRJTuFnrkkFmlJ7yFhADQYjxOgIh9Y,9523
|
|
29
|
+
pydantic_ai/models/wrapper.py,sha256=Zr3fgiUBpt2N9gXds6iSwaMEtEsFKr9WwhpHjSoHa7o,1410
|
|
30
|
+
pydantic_ai_slim-0.0.25.dist-info/METADATA,sha256=VbDk3sx1LMYhOxZaouy_IcVSlFvOzE00ph8NSm-Wdyo,2839
|
|
31
|
+
pydantic_ai_slim-0.0.25.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
32
|
+
pydantic_ai_slim-0.0.25.dist-info/RECORD,,
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
pydantic_ai/__init__.py,sha256=FbYetEgT6OO25u2KF5ZnFxKpz5DtnSpfckRXP4mjl8E,489
|
|
2
|
-
pydantic_ai/_agent_graph.py,sha256=_uCNK12sEXmzB-Vk1OaCR-AMARYzEoInjKXZyx7ODjA,33136
|
|
3
|
-
pydantic_ai/_griffe.py,sha256=RYRKiLbgG97QxnazbAwlnc74XxevGHLQet-FGfq9qls,3960
|
|
4
|
-
pydantic_ai/_parts_manager.py,sha256=ARfDQY1_5AIY5rNl_M2fAYHEFCe03ZxdhgjHf9qeIKw,11872
|
|
5
|
-
pydantic_ai/_pydantic.py,sha256=dROz3Hmfdi0C2exq88FhefDRVo_8S3rtkXnoUHzsz0c,8753
|
|
6
|
-
pydantic_ai/_result.py,sha256=tN1pVulf_EM4bkBvpNUWPnUXezLY-sBrJEVCFdy2nLU,10264
|
|
7
|
-
pydantic_ai/_system_prompt.py,sha256=602c2jyle2R_SesOrITBDETZqsLk4BZ8Cbo8yEhmx04,1120
|
|
8
|
-
pydantic_ai/_utils.py,sha256=zfuY3NiPPsSM5J1q2JElfbfIa8S1ONGOlC7M-iyBVso,9430
|
|
9
|
-
pydantic_ai/agent.py,sha256=q9nc_bTUuwxYVrzmUb5NkwOUWQm2XIsxpTuyyAuVdpU,44900
|
|
10
|
-
pydantic_ai/exceptions.py,sha256=eGDKX6bGhgVxXBzu81Sk3iiAkXr0GUtgT7bD5Rxlqpg,2028
|
|
11
|
-
pydantic_ai/format_as_xml.py,sha256=QE7eMlg5-YUMw1_2kcI3h0uKYPZZyGkgXFDtfZTMeeI,4480
|
|
12
|
-
pydantic_ai/messages.py,sha256=kzXn4ZjlX9Sy2KXgFHWYbbwPk7TzTPdztzOJLWEONwU,17101
|
|
13
|
-
pydantic_ai/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
|
-
pydantic_ai/result.py,sha256=HYTkmb-6fzbxXRlsPOyVic_EexEGN4JLfZfVBKpJtfM,18390
|
|
15
|
-
pydantic_ai/settings.py,sha256=ntuWnke9UA18aByDxk9OIhN0tAgOaPdqCEkRf-wlp8Y,3059
|
|
16
|
-
pydantic_ai/tools.py,sha256=lhupwm815lPlFFS79B0P61AyhUYtepA62LbZOCJrPEY,13205
|
|
17
|
-
pydantic_ai/usage.py,sha256=60d9f6M7YEYuKMbqDGDogX4KsA73fhDtWyDXYXoIPaI,4948
|
|
18
|
-
pydantic_ai/models/__init__.py,sha256=WCvo5bI2dWJbKPhdGWID-HFGrZGo3jvtHhgwaDuY75s,13219
|
|
19
|
-
pydantic_ai/models/anthropic.py,sha256=lArkCv0oZQeG1SqyEHlqKUyrcEYzYrS5fkW_ICKlikU,17749
|
|
20
|
-
pydantic_ai/models/cohere.py,sha256=yLUA3bTQg-4NNjpvD2DXkUIMluia8vETChsjYYN13lg,11016
|
|
21
|
-
pydantic_ai/models/function.py,sha256=5AWAFo-AZ0UyX8wBAYc5nd6U6XpOFvnsYr8vVfatEXQ,10333
|
|
22
|
-
pydantic_ai/models/gemini.py,sha256=CGaHve4wQxkGEa1hArgldvOBk79blGdOqdeLxMH_NQM,30846
|
|
23
|
-
pydantic_ai/models/groq.py,sha256=M7P-9LrH1lm4wyIMiytsHf28bwkukOyVzw3S7F9sbic,14612
|
|
24
|
-
pydantic_ai/models/mistral.py,sha256=1DA1AX-V46p7dI75-4aRwQ8TrQxdh5ZQaoMYZO7VRkI,25868
|
|
25
|
-
pydantic_ai/models/openai.py,sha256=kUV13suTp1ueibH2uYWaRCX832GApImdxSiGqNyfWo4,17161
|
|
26
|
-
pydantic_ai/models/test.py,sha256=6X0r78biqnvakiH1nFKYQFNOs4dWrS-yqe0RFBrKW0s,16873
|
|
27
|
-
pydantic_ai/models/vertexai.py,sha256=9Kp_1KMBlbP8_HRJTuFnrkkFmlJ7yFhADQYjxOgIh9Y,9523
|
|
28
|
-
pydantic_ai_slim-0.0.24.dist-info/METADATA,sha256=kSbEzpXrgMTSHX0ojDw-Mtf8QQFCFE5fIJTRZihLe1w,2839
|
|
29
|
-
pydantic_ai_slim-0.0.24.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
30
|
-
pydantic_ai_slim-0.0.24.dist-info/RECORD,,
|
|
File without changes
|