pydantic-ai-slim 0.0.24__py3-none-any.whl → 0.0.26__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/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 deepcopy
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', 'RunResult', 'StreamedRunResult'
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 _BaseRunResult(ABC, Generic[ResultDataT]):
57
- """Base type for results.
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._BaseRunResult.all_messages] as JSON bytes.
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._BaseRunResult.new_messages] as JSON bytes.
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 _stream_text_deltas():
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 _stream_text_deltas():
280
- deltas.append(text)
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
- await self._marked_completed(
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 with _utils.group_by_temporal(usage_checking_stream, debounce_by) as group_iter:
319
- async for _events in group_iter:
320
- msg = self._stream_response.get()
321
- yield msg, False
322
- msg = self._stream_response.get()
323
- yield msg, True
324
- # TODO: Should this now be `final_response` instead of `structured_response`?
325
- lf_span.set_attribute('structured_response', msg)
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._run_ctx.usage + self._stream_response.usage()
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],
pydantic_ai/tools.py CHANGED
@@ -2,7 +2,7 @@ from __future__ import annotations as _annotations
2
2
 
3
3
  import dataclasses
4
4
  import inspect
5
- from collections.abc import Awaitable
5
+ from collections.abc import Awaitable, Sequence
6
6
  from dataclasses import dataclass, field
7
7
  from typing import TYPE_CHECKING, Any, Callable, Generic, Literal, Union, cast
8
8
 
@@ -45,7 +45,7 @@ class RunContext(Generic[AgentDepsT]):
45
45
  """The model used in this run."""
46
46
  usage: Usage
47
47
  """LLM usage associated with the run."""
48
- prompt: str
48
+ prompt: str | Sequence[_messages.UserContent]
49
49
  """The original user prompt passed to the run."""
50
50
  messages: list[_messages.ModelMessage] = field(default_factory=list)
51
51
  """Messages exchanged in the conversation so far."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pydantic-ai-slim
3
- Version: 0.0.24
3
+ Version: 0.0.26
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.24
31
+ Requires-Dist: pydantic-graph==0.0.26
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=TVhfNuYTLoFyhbJAWo0ptNrnzqiiwfJ-GOoKy0nNg00,812
2
+ pydantic_ai/_agent_graph.py,sha256=lNKTtUyVY14M0WODP5K1NUaE9zJA716-9rZutapSg8A,29042
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=0Xcxdu9fU-7OgO29OEVhPiHjDn4rOSvTZRaTiJWpcU4,63701
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=U-RgeRsMR-Ew6IoeBDrnQVONX9AwxyVd0aTnAxEA7EM,20918
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=c6QPa3Lio5S-iC3av7rYHaxHQTH_2y5LmlL6DGLmTRk,13249
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=8Q6SFGJUadyuMfOgdlY7dhFQ05eHM1yfJTNCEuhwM1I,19083
20
+ pydantic_ai/models/cohere.py,sha256=vZrubg2ljXrtQYuJJMILm0DXui9JH__lenWSvxZRArM,11166
21
+ pydantic_ai/models/function.py,sha256=SnopbJJJ5AN8RApL4WFzeJlY1qJR21Doj5kU9BKhAlA,10684
22
+ pydantic_ai/models/gemini.py,sha256=dY5ZDeACnYaQ9f4LBXfA1OCz-1XMB8xX5x0jWXmoe_M,33650
23
+ pydantic_ai/models/groq.py,sha256=GuzDUAbVOZzsq6qNQegiCsvoO8rr9LPsDnLbeaSrHMc,16075
24
+ pydantic_ai/models/instrumented.py,sha256=cvjHgQE_gJOH-YVQyvx9tBpGNB_Iuc8N8THn0TL0Rjk,8791
25
+ pydantic_ai/models/mistral.py,sha256=ggOvA3u5bkbcXUfZRsdgcJxK3Ne_AG0GoFXCf-GdMSk,27136
26
+ pydantic_ai/models/openai.py,sha256=3uTLFWoFQEEXhI9ZjKdTrVp7IKsXXlx6lG67rHIkSN4,19817
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.26.dist-info/METADATA,sha256=BGIpdC-aNoqyw6TLUXxPiY6zp1yVZQwJIETUCDlFYjE,2839
31
+ pydantic_ai_slim-0.0.26.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
32
+ pydantic_ai_slim-0.0.26.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,,