pydantic-ai-slim 1.0.17__py3-none-any.whl → 1.0.18__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.

@@ -312,6 +312,7 @@ class ModelResponsePartsManager:
312
312
  tool_name: str,
313
313
  args: str | dict[str, Any] | None,
314
314
  tool_call_id: str | None = None,
315
+ id: str | None = None,
315
316
  ) -> ModelResponseStreamEvent:
316
317
  """Immediately create or fully-overwrite a ToolCallPart with the given information.
317
318
 
@@ -323,6 +324,7 @@ class ModelResponsePartsManager:
323
324
  tool_name: The name of the tool being invoked.
324
325
  args: The arguments for the tool call, either as a string, a dictionary, or None.
325
326
  tool_call_id: An optional string identifier for this tool call.
327
+ id: An optional identifier for this tool call part.
326
328
 
327
329
  Returns:
328
330
  ModelResponseStreamEvent: A `PartStartEvent` indicating that a new tool call part
@@ -332,6 +334,7 @@ class ModelResponsePartsManager:
332
334
  tool_name=tool_name,
333
335
  args=args,
334
336
  tool_call_id=tool_call_id or _generate_tool_call_id(),
337
+ id=id,
335
338
  )
336
339
  if vendor_part_id is None:
337
340
  # vendor_part_id is None, so we unconditionally append a new ToolCallPart to the end of the list
@@ -62,6 +62,8 @@ class PydanticAIPlugin(ClientPlugin, WorkerPlugin):
62
62
  'logfire',
63
63
  'rich',
64
64
  'httpx',
65
+ 'anyio',
66
+ 'httpcore',
65
67
  # Imported inside `logfire._internal.json_encoder` when running `logfire.info` inside an activity with attributes to serialize
66
68
  'attrs',
67
69
  # Imported inside `logfire._internal.json_schema` when running `logfire.info` inside an activity with attributes to serialize
pydantic_ai/messages.py CHANGED
@@ -1052,6 +1052,13 @@ class BaseToolCallPart:
1052
1052
  In case the tool call id is not provided by the model, Pydantic AI will generate a random one.
1053
1053
  """
1054
1054
 
1055
+ _: KW_ONLY
1056
+
1057
+ id: str | None = None
1058
+ """An optional identifier of the tool call part, separate from the tool call ID.
1059
+
1060
+ This is used by some APIs like OpenAI Responses."""
1061
+
1055
1062
  def args_as_dict(self) -> dict[str, Any]:
1056
1063
  """Return the arguments as a Python dictionary.
1057
1064
 
@@ -691,6 +691,7 @@ def infer_model(model: Model | KnownModelName | str) -> Model: # noqa: C901
691
691
  'together',
692
692
  'vercel',
693
693
  'litellm',
694
+ 'nebius',
694
695
  ):
695
696
  from .openai import OpenAIChatModel
696
697
 
@@ -284,6 +284,7 @@ class OpenAIChatModel(Model):
284
284
  'together',
285
285
  'vercel',
286
286
  'litellm',
287
+ 'nebius',
287
288
  ]
288
289
  | Provider[AsyncOpenAI] = 'openai',
289
290
  profile: ModelProfileSpec | None = None,
@@ -312,6 +313,7 @@ class OpenAIChatModel(Model):
312
313
  'together',
313
314
  'vercel',
314
315
  'litellm',
316
+ 'nebius',
315
317
  ]
316
318
  | Provider[AsyncOpenAI] = 'openai',
317
319
  profile: ModelProfileSpec | None = None,
@@ -339,6 +341,7 @@ class OpenAIChatModel(Model):
339
341
  'together',
340
342
  'vercel',
341
343
  'litellm',
344
+ 'nebius',
342
345
  ]
343
346
  | Provider[AsyncOpenAI] = 'openai',
344
347
  profile: ModelProfileSpec | None = None,
@@ -899,7 +902,7 @@ class OpenAIResponsesModel(Model):
899
902
  self,
900
903
  model_name: OpenAIModelName,
901
904
  *,
902
- provider: Literal['openai', 'deepseek', 'azure', 'openrouter', 'grok', 'fireworks', 'together']
905
+ provider: Literal['openai', 'deepseek', 'azure', 'openrouter', 'grok', 'fireworks', 'together', 'nebius']
903
906
  | Provider[AsyncOpenAI] = 'openai',
904
907
  profile: ModelProfileSpec | None = None,
905
908
  settings: ModelSettings | None = None,
@@ -1005,7 +1008,12 @@ class OpenAIResponsesModel(Model):
1005
1008
  items.append(TextPart(content.text, id=item.id))
1006
1009
  elif isinstance(item, responses.ResponseFunctionToolCall):
1007
1010
  items.append(
1008
- ToolCallPart(item.name, item.arguments, tool_call_id=_combine_tool_call_ids(item.call_id, item.id))
1011
+ ToolCallPart(
1012
+ item.name,
1013
+ item.arguments,
1014
+ tool_call_id=item.call_id,
1015
+ id=item.id,
1016
+ )
1009
1017
  )
1010
1018
  elif isinstance(item, responses.ResponseCodeInterpreterToolCall):
1011
1019
  call_part, return_part, file_parts = _map_code_interpreter_tool_call(item, self.system)
@@ -1178,7 +1186,7 @@ class OpenAIResponsesModel(Model):
1178
1186
  truncation=model_settings.get('openai_truncation', NOT_GIVEN),
1179
1187
  timeout=model_settings.get('timeout', NOT_GIVEN),
1180
1188
  service_tier=model_settings.get('openai_service_tier', NOT_GIVEN),
1181
- previous_response_id=previous_response_id,
1189
+ previous_response_id=previous_response_id or NOT_GIVEN,
1182
1190
  reasoning=reasoning,
1183
1191
  user=model_settings.get('openai_user', NOT_GIVEN),
1184
1192
  text=text or NOT_GIVEN,
@@ -1361,6 +1369,7 @@ class OpenAIResponsesModel(Model):
1361
1369
  elif isinstance(item, ToolCallPart):
1362
1370
  call_id = _guard_tool_call_id(t=item)
1363
1371
  call_id, id = _split_combined_tool_call_id(call_id)
1372
+ id = id or item.id
1364
1373
 
1365
1374
  param = responses.ResponseFunctionToolCallParam(
1366
1375
  name=item.tool_name,
@@ -1724,7 +1733,8 @@ class OpenAIResponsesStreamedResponse(StreamedResponse):
1724
1733
  vendor_part_id=chunk.item.id,
1725
1734
  tool_name=chunk.item.name,
1726
1735
  args=chunk.item.arguments,
1727
- tool_call_id=_combine_tool_call_ids(chunk.item.call_id, chunk.item.id),
1736
+ tool_call_id=chunk.item.call_id,
1737
+ id=chunk.item.id,
1728
1738
  )
1729
1739
  elif isinstance(chunk.item, responses.ResponseReasoningItem):
1730
1740
  pass
@@ -1963,18 +1973,15 @@ def _map_usage(response: chat.ChatCompletion | ChatCompletionChunk | responses.R
1963
1973
  return u
1964
1974
 
1965
1975
 
1966
- def _combine_tool_call_ids(call_id: str, id: str | None) -> str:
1976
+ def _split_combined_tool_call_id(combined_id: str) -> tuple[str, str | None]:
1967
1977
  # When reasoning, the Responses API requires the `ResponseFunctionToolCall` to be returned with both the `call_id` and `id` fields.
1968
- # Our `ToolCallPart` has only the `call_id` field, so we combine the two fields into a single string.
1969
- return f'{call_id}|{id}' if id else call_id
1978
+ # Before our `ToolCallPart` gained the `id` field alongside `tool_call_id` field, we combined the two fields into a single string stored on `tool_call_id`.
1970
1979
 
1971
-
1972
- def _split_combined_tool_call_id(combined_id: str) -> tuple[str, str | None]:
1973
1980
  if '|' in combined_id:
1974
1981
  call_id, id = combined_id.split('|', 1)
1975
1982
  return call_id, id
1976
1983
  else:
1977
- return combined_id, None # pragma: no cover
1984
+ return combined_id, None
1978
1985
 
1979
1986
 
1980
1987
  def _map_code_interpreter_tool_call(
@@ -142,6 +142,10 @@ def infer_provider_class(provider: str) -> type[Provider[Any]]: # noqa: C901
142
142
  from .litellm import LiteLLMProvider
143
143
 
144
144
  return LiteLLMProvider
145
+ elif provider == 'nebius':
146
+ from .nebius import NebiusProvider
147
+
148
+ return NebiusProvider
145
149
  else: # pragma: no cover
146
150
  raise ValueError(f'Unknown provider: {provider}')
147
151
 
@@ -0,0 +1,102 @@
1
+ from __future__ import annotations as _annotations
2
+
3
+ import os
4
+ from typing import overload
5
+
6
+ import httpx
7
+
8
+ from pydantic_ai import ModelProfile
9
+ from pydantic_ai.exceptions import UserError
10
+ from pydantic_ai.models import cached_async_http_client
11
+ from pydantic_ai.profiles.deepseek import deepseek_model_profile
12
+ from pydantic_ai.profiles.google import google_model_profile
13
+ from pydantic_ai.profiles.harmony import harmony_model_profile
14
+ from pydantic_ai.profiles.meta import meta_model_profile
15
+ from pydantic_ai.profiles.mistral import mistral_model_profile
16
+ from pydantic_ai.profiles.moonshotai import moonshotai_model_profile
17
+ from pydantic_ai.profiles.openai import OpenAIJsonSchemaTransformer, OpenAIModelProfile
18
+ from pydantic_ai.profiles.qwen import qwen_model_profile
19
+ from pydantic_ai.providers import Provider
20
+
21
+ try:
22
+ from openai import AsyncOpenAI
23
+ except ImportError as _import_error: # pragma: no cover
24
+ raise ImportError(
25
+ 'Please install the `openai` package to use the Nebius provider, '
26
+ 'you can use the `openai` optional group — `pip install "pydantic-ai-slim[openai]"`'
27
+ ) from _import_error
28
+
29
+
30
+ class NebiusProvider(Provider[AsyncOpenAI]):
31
+ """Provider for Nebius AI Studio API."""
32
+
33
+ @property
34
+ def name(self) -> str:
35
+ return 'nebius'
36
+
37
+ @property
38
+ def base_url(self) -> str:
39
+ return 'https://api.studio.nebius.com/v1'
40
+
41
+ @property
42
+ def client(self) -> AsyncOpenAI:
43
+ return self._client
44
+
45
+ def model_profile(self, model_name: str) -> ModelProfile | None:
46
+ provider_to_profile = {
47
+ 'meta-llama': meta_model_profile,
48
+ 'deepseek-ai': deepseek_model_profile,
49
+ 'qwen': qwen_model_profile,
50
+ 'google': google_model_profile,
51
+ 'openai': harmony_model_profile, # used for gpt-oss models on Nebius
52
+ 'mistralai': mistral_model_profile,
53
+ 'moonshotai': moonshotai_model_profile,
54
+ }
55
+
56
+ profile = None
57
+
58
+ try:
59
+ model_name = model_name.lower()
60
+ provider, model_name = model_name.split('/', 1)
61
+ except ValueError:
62
+ raise UserError(f"Model name must be in 'provider/model' format, got: {model_name!r}")
63
+ if provider in provider_to_profile:
64
+ profile = provider_to_profile[provider](model_name)
65
+
66
+ # As NebiusProvider is always used with OpenAIChatModel, which used to unconditionally use OpenAIJsonSchemaTransformer,
67
+ # we need to maintain that behavior unless json_schema_transformer is set explicitly
68
+ return OpenAIModelProfile(json_schema_transformer=OpenAIJsonSchemaTransformer).update(profile)
69
+
70
+ @overload
71
+ def __init__(self) -> None: ...
72
+
73
+ @overload
74
+ def __init__(self, *, api_key: str) -> None: ...
75
+
76
+ @overload
77
+ def __init__(self, *, api_key: str, http_client: httpx.AsyncClient) -> None: ...
78
+
79
+ @overload
80
+ def __init__(self, *, openai_client: AsyncOpenAI | None = None) -> None: ...
81
+
82
+ def __init__(
83
+ self,
84
+ *,
85
+ api_key: str | None = None,
86
+ openai_client: AsyncOpenAI | None = None,
87
+ http_client: httpx.AsyncClient | None = None,
88
+ ) -> None:
89
+ api_key = api_key or os.getenv('NEBIUS_API_KEY')
90
+ if not api_key and openai_client is None:
91
+ raise UserError(
92
+ 'Set the `NEBIUS_API_KEY` environment variable or pass it via '
93
+ '`NebiusProvider(api_key=...)` to use the Nebius AI Studio provider.'
94
+ )
95
+
96
+ if openai_client is not None:
97
+ self._client = openai_client
98
+ elif http_client is not None:
99
+ self._client = AsyncOpenAI(base_url=self.base_url, api_key=api_key, http_client=http_client)
100
+ else:
101
+ http_client = cached_async_http_client(provider='nebius')
102
+ self._client = AsyncOpenAI(base_url=self.base_url, api_key=api_key, http_client=http_client)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pydantic-ai-slim
3
- Version: 1.0.17
3
+ Version: 1.0.18
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.30
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.17
36
+ Requires-Dist: pydantic-graph==1.0.18
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.17; extra == 'evals'
60
+ Requires-Dist: pydantic-evals==1.0.18; extra == 'evals'
61
61
  Provides-Extra: google
62
62
  Requires-Dist: google-genai>=1.31.0; extra == 'google'
63
63
  Provides-Extra: groq
@@ -10,7 +10,7 @@ pydantic_ai/_json_schema.py,sha256=Br48srbwCTVIie98a9UEMGcCcTIa3E4zVvCbkxqQRso,7
10
10
  pydantic_ai/_mcp.py,sha256=PuvwnlLjv7YYOa9AZJCrklevBug99zGMhwJCBGG7BHQ,5626
11
11
  pydantic_ai/_otel_messages.py,sha256=SsMpbyI1fIISOck_wQcZJPIOei8lOmvwARkdPSCx8y8,1650
12
12
  pydantic_ai/_output.py,sha256=gHS1qwM701cH5FGGRUrMxgWlJhY1vNgdM6ylnHRa-Ew,40784
13
- pydantic_ai/_parts_manager.py,sha256=kXMhigRJAwUcputw7i54pQkc85NuNVS4Zy36lFvnRvk,19800
13
+ pydantic_ai/_parts_manager.py,sha256=05m8q2JZQk9Z8vNKOocxGDJQwYgbUGABGBRnXYJcsg8,19914
14
14
  pydantic_ai/_run_context.py,sha256=-ah9Ipf3mLTbvuYqmJSqBmBexaCcED7HGA1Llzs0dKU,2324
15
15
  pydantic_ai/_system_prompt.py,sha256=WdDW_DTGHujcFFaK-J7J6mA4ZDJZ0IOKpyizJA-1Y5Q,1142
16
16
  pydantic_ai/_thinking_part.py,sha256=_0DajGyWPa50WUTPWN1UPfZw0xD8_hHcuSt0T3fgRr0,1295
@@ -22,7 +22,7 @@ pydantic_ai/direct.py,sha256=i5yZ9Tx8IiwXg6Nz9CW4-fyXzxnjP59fsklExCh5sjA,15111
22
22
  pydantic_ai/exceptions.py,sha256=zsXZMKf2BJuVsfuHl1fWTkogLU37bd4yq7D6BKHAzVs,4968
23
23
  pydantic_ai/format_prompt.py,sha256=cLyWO8g77Y4JzqVSikqodXaAfTn6i-k206rNhYTiIsE,9710
24
24
  pydantic_ai/mcp.py,sha256=7Ouwepk-p2rOq_Rkv-MSZYyEGJ6FfrJvR7ySghuSLwc,36693
25
- pydantic_ai/messages.py,sha256=ZtfMXZBl7w5qOyPuzEaXgyRAiyxQbSulG1zG9IHkiuk,64663
25
+ pydantic_ai/messages.py,sha256=GBuRGeq3ZpEuSNdq96Mb7l-UVEl7cNuNUN1LpwaAaxQ,64848
26
26
  pydantic_ai/output.py,sha256=q91oqvJ-FqV9GbUUil7WVWbii66SVsVZ54AEm_NWSEo,13002
27
27
  pydantic_ai/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
28
  pydantic_ai/result.py,sha256=sVabgrAJXmj96I7NM-w0RBz1rH5x_zZql1V6epei4JU,26700
@@ -43,7 +43,7 @@ pydantic_ai/durable_exec/dbos/_agent.py,sha256=5yKDlsMVNKzX3Tth-HC-TAwtEhCUbhL4T
43
43
  pydantic_ai/durable_exec/dbos/_mcp_server.py,sha256=cLMCKmXQHqhqnn_E3Nf4IsNFIbqk-V7gnIvpmYeDCSA,2989
44
44
  pydantic_ai/durable_exec/dbos/_model.py,sha256=_Cxh0zYFF3cungXiSXpGHmjyBQF7KnksfurV7hMKp-E,5106
45
45
  pydantic_ai/durable_exec/dbos/_utils.py,sha256=_aNceFvTcNeqb78sTDYM2TdYph85tbdeLueyXY1lbTA,242
46
- pydantic_ai/durable_exec/temporal/__init__.py,sha256=XKwy68wfgmjr057nolRwGHTKiadxufpQEGEUprAV09k,5563
46
+ pydantic_ai/durable_exec/temporal/__init__.py,sha256=H8y0jMv5Q2aFvHZ4rm48cYn07nc1nWEQbYpcO9P6zpA,5624
47
47
  pydantic_ai/durable_exec/temporal/_agent.py,sha256=BKbKKo6FM2zx-5ohc9voDyMYONH_8sZwUNypjonWDlA,44458
48
48
  pydantic_ai/durable_exec/temporal/_function_toolset.py,sha256=3n_A5uHzygsT88LM105kKuYqwxC1sjI4bOzETeUbT4E,5553
49
49
  pydantic_ai/durable_exec/temporal/_logfire.py,sha256=ASd7vb0cd61yESI0mgU2w9SCGxsOegz95HtQjKdlQkE,2472
@@ -54,7 +54,7 @@ pydantic_ai/durable_exec/temporal/_toolset.py,sha256=IlPQrumm2MpZrb518ru15s0jIl8
54
54
  pydantic_ai/ext/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
55
  pydantic_ai/ext/aci.py,sha256=YWYLXzTQJ6hS7qfgNycA8cRl69gogGgThqEU6II7eMA,2527
56
56
  pydantic_ai/ext/langchain.py,sha256=kmbbV3Cx2BiNYEJCZMHVYQquUQD-zG2L_bwDangy0Ww,2317
57
- pydantic_ai/models/__init__.py,sha256=bZXZRrvQa5xEbv6GLvwmcI39vCZG-y6AxUGres1UtBk,35700
57
+ pydantic_ai/models/__init__.py,sha256=VlVcZZJsrZNTKbvq09khQlzGay5PZqWHsFmg9O9p0_I,35718
58
58
  pydantic_ai/models/anthropic.py,sha256=-vW7aoPrELKnJzbooCEhMu8__jY6iqvWdFJbIKeQPa8,38087
59
59
  pydantic_ai/models/bedrock.py,sha256=fha8zVZgDFYgDqO5nvBkZ2CEv4GV92yq_YnK4qmD73E,33639
60
60
  pydantic_ai/models/cohere.py,sha256=_ccK7XBts1OwD-RP8puU3z425SZ4PeJGts1WFhPjikg,14051
@@ -67,7 +67,7 @@ pydantic_ai/models/huggingface.py,sha256=711C0ysjLYKriGfSxPiaF6lqjGcNmIaJaCvAXou
67
67
  pydantic_ai/models/instrumented.py,sha256=J8eVTutr3UP1r_wd5sM5c0BIdzkRqT-EGgd2NiF0ssQ,22319
68
68
  pydantic_ai/models/mcp_sampling.py,sha256=qY4y4nXbRpNp2QbkfjzWLvF_8KLZGXypz4cc0lYRHXU,3553
69
69
  pydantic_ai/models/mistral.py,sha256=fi57hADjYxZw8wEpAcNI6mqY32VG9hHK9GGRQ-9vlZg,33905
70
- pydantic_ai/models/openai.py,sha256=_qU8o9PBwmPmELQz3V8OAjxkKy8gXiKtdG6MKQ7Iq_Y,99708
70
+ pydantic_ai/models/openai.py,sha256=nCqFy2sRihygbBbTYSbMy_W9LiXwNoRzIUNHSJk5ctc,99861
71
71
  pydantic_ai/models/test.py,sha256=5ER66nwZG7Iwm-KkzPo4vwNd3rulzgkpgysu4YcT1W4,20568
72
72
  pydantic_ai/models/wrapper.py,sha256=nwh8Gea59blbr1JDKlUnkYICuI9TUubC4qP7iZRRW28,2440
73
73
  pydantic_ai/profiles/__init__.py,sha256=UHknN-CYsQexUaxfsgz_J_uSZ9QwistLSuAErQkvbcM,3385
@@ -84,7 +84,7 @@ pydantic_ai/profiles/mistral.py,sha256=ll01PmcK3szwlTfbaJLQmfd0TADN8lqjov9HpPJzC
84
84
  pydantic_ai/profiles/moonshotai.py,sha256=e1RJnbEvazE6aJAqfmYLYGNtwNwg52XQDRDkcLrv3fU,272
85
85
  pydantic_ai/profiles/openai.py,sha256=MXOsktUqfcF2pBgYJMyFWMZafPJ7tejwyoFM2mjKzaY,9689
86
86
  pydantic_ai/profiles/qwen.py,sha256=9SnTpMKndxNQMFyumyaOczJa5JGWbYQdpVKKW4OzKjk,749
87
- pydantic_ai/providers/__init__.py,sha256=nqKuq778BrKuZCV8S5evmTKCHkFrakMDAnsHVifdvYI,4613
87
+ pydantic_ai/providers/__init__.py,sha256=UAyyyGhYypWcfJybom0yUS8lbwWD5wmOtbTDG81Wl9E,4718
88
88
  pydantic_ai/providers/anthropic.py,sha256=vwNjO2JJ0Ux_3PXI9_XvzNZ24PKessm8z2ja1uzbBwM,3327
89
89
  pydantic_ai/providers/azure.py,sha256=PFRykTOfARMdANODnTLq__0ZynX7DlQ35GVf2Qs9VBY,5814
90
90
  pydantic_ai/providers/bedrock.py,sha256=efb9YWAz6ram5QEIHNO0K-dL8chTMsjRPCNQhpbQSBY,6513
@@ -104,6 +104,7 @@ pydantic_ai/providers/huggingface.py,sha256=bCN7vX8JuzKM_bXjyLBCh-imsyCiVPXBUB1F
104
104
  pydantic_ai/providers/litellm.py,sha256=a669KrAbaj8YYMm3N3yRQduzCMtGDCoHXAQ54_XAo8o,5070
105
105
  pydantic_ai/providers/mistral.py,sha256=YqvUoqOq-wiJYnRLwUwp3lUvyApumrohSwysZaQfeBc,3074
106
106
  pydantic_ai/providers/moonshotai.py,sha256=iaQHZRYJb7hqeq-Di7Qb0LYJ8EEoE7a_wWtlt_oNa0A,3251
107
+ pydantic_ai/providers/nebius.py,sha256=nGpgbZnBZgNz4wHTi1vgvc-9tO2_zj5r3vRzEUbhPKM,3877
107
108
  pydantic_ai/providers/ollama.py,sha256=jg48g_3fYsvK8g-V3UOmR9HOsvnvb533BAB-rZZDxdA,4733
108
109
  pydantic_ai/providers/openai.py,sha256=cVVf99GgBnYBKYeWKBscvnkoRCu0ctWuKulG19lgWMo,3401
109
110
  pydantic_ai/providers/openrouter.py,sha256=o33Fk7kMyMhEM4NcSXU6IuG0cIUc45ySaenozrRypBI,4145
@@ -121,8 +122,8 @@ pydantic_ai/toolsets/prefixed.py,sha256=0KwcDkW8OM36ZUsOLVP5h-Nj2tPq78L3_E2c-1Fb
121
122
  pydantic_ai/toolsets/prepared.py,sha256=Zjfz6S8In6PBVxoKFN9sKPN984zO6t0awB7Lnq5KODw,1431
122
123
  pydantic_ai/toolsets/renamed.py,sha256=JuLHpi-hYPiSPlaTpN8WiXLiGsywYK0axi2lW2Qs75k,1637
123
124
  pydantic_ai/toolsets/wrapper.py,sha256=KRzF1p8dncHbva8CE6Ud-IC5E_aygIHlwH5atXK55k4,1673
124
- pydantic_ai_slim-1.0.17.dist-info/METADATA,sha256=-4tDOnbyA9ggeA1T1H-uhYRz0Ab9sKbwqMi3DbFUp0U,4631
125
- pydantic_ai_slim-1.0.17.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
126
- pydantic_ai_slim-1.0.17.dist-info/entry_points.txt,sha256=kbKxe2VtDCYS06hsI7P3uZGxcVC08-FPt1rxeiMpIps,50
127
- pydantic_ai_slim-1.0.17.dist-info/licenses/LICENSE,sha256=vA6Jc482lEyBBuGUfD1pYx-cM7jxvLYOxPidZ30t_PQ,1100
128
- pydantic_ai_slim-1.0.17.dist-info/RECORD,,
125
+ pydantic_ai_slim-1.0.18.dist-info/METADATA,sha256=XpATENr_fKE6BLbNaZACxFcVn8VHEb2sllDF8z5vhKc,4631
126
+ pydantic_ai_slim-1.0.18.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
127
+ pydantic_ai_slim-1.0.18.dist-info/entry_points.txt,sha256=kbKxe2VtDCYS06hsI7P3uZGxcVC08-FPt1rxeiMpIps,50
128
+ pydantic_ai_slim-1.0.18.dist-info/licenses/LICENSE,sha256=vA6Jc482lEyBBuGUfD1pYx-cM7jxvLYOxPidZ30t_PQ,1100
129
+ pydantic_ai_slim-1.0.18.dist-info/RECORD,,