pydantic-ai-examples 0.3.5__tar.gz → 0.3.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pydantic-ai-examples might be problematic. Click here for more details.
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/PKG-INFO +3 -3
- pydantic_ai_examples-0.3.6/pydantic_ai_examples/weather_agent.py +105 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/weather_agent_gradio.py +1 -5
- pydantic_ai_examples-0.3.5/pydantic_ai_examples/weather_agent.py +0 -158
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/.gitignore +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/LICENSE +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/README.md +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/__main__.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/bank_support.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/chat_app.html +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/chat_app.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/chat_app.ts +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/evals/__init__.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/evals/agent.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/evals/custom_evaluators.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/evals/datasets/time_range_v1.yaml +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/evals/datasets/time_range_v1_schema.json +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/evals/datasets/time_range_v2.yaml +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/evals/datasets/time_range_v2_schema.json +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/evals/example_01_generate_dataset.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/evals/example_02_add_custom_evaluators.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/evals/example_03_unit_testing.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/evals/example_04_compare_models.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/evals/models.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/flight_booking.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/pydantic_model.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/question_graph.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/rag.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/roulette_wheel.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/slack_lead_qualifier/__init__.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/slack_lead_qualifier/agent.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/slack_lead_qualifier/app.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/slack_lead_qualifier/functions.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/slack_lead_qualifier/modal.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/slack_lead_qualifier/models.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/slack_lead_qualifier/slack.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/slack_lead_qualifier/store.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/sql_gen.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/stream_markdown.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/stream_whales.py +0 -0
- {pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pyproject.toml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pydantic-ai-examples
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.6
|
|
4
4
|
Summary: Examples of how to use PydanticAI and what it can do.
|
|
5
5
|
Author-email: Samuel Colvin <samuel@pydantic.dev>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -32,8 +32,8 @@ Requires-Dist: gradio>=5.9.0; python_version > '3.9'
|
|
|
32
32
|
Requires-Dist: logfire[asyncpg,fastapi,httpx,sqlite3]>=2.6
|
|
33
33
|
Requires-Dist: mcp[cli]>=1.4.1; python_version >= '3.10'
|
|
34
34
|
Requires-Dist: modal>=1.0.4
|
|
35
|
-
Requires-Dist: pydantic-ai-slim[anthropic,groq,openai,vertexai]==0.3.
|
|
36
|
-
Requires-Dist: pydantic-evals==0.3.
|
|
35
|
+
Requires-Dist: pydantic-ai-slim[anthropic,groq,openai,vertexai]==0.3.6
|
|
36
|
+
Requires-Dist: pydantic-evals==0.3.6
|
|
37
37
|
Requires-Dist: python-multipart>=0.0.17
|
|
38
38
|
Requires-Dist: rich>=13.9.2
|
|
39
39
|
Requires-Dist: uvicorn>=0.32.0
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"""Example of PydanticAI with multiple tools which the LLM needs to call in turn to answer a question.
|
|
2
|
+
|
|
3
|
+
In this case the idea is a "weather" agent — the user can ask for the weather in multiple cities,
|
|
4
|
+
the agent will use the `get_lat_lng` tool to get the latitude and longitude of the locations, then use
|
|
5
|
+
the `get_weather` tool to get the weather.
|
|
6
|
+
|
|
7
|
+
Run with:
|
|
8
|
+
|
|
9
|
+
uv run -m pydantic_ai_examples.weather_agent
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations as _annotations
|
|
13
|
+
|
|
14
|
+
import asyncio
|
|
15
|
+
from dataclasses import dataclass
|
|
16
|
+
from typing import Any
|
|
17
|
+
|
|
18
|
+
import logfire
|
|
19
|
+
from httpx import AsyncClient
|
|
20
|
+
from pydantic import BaseModel
|
|
21
|
+
|
|
22
|
+
from pydantic_ai import Agent, RunContext
|
|
23
|
+
|
|
24
|
+
# 'if-token-present' means nothing will be sent (and the example will work) if you don't have logfire configured
|
|
25
|
+
logfire.configure(send_to_logfire='if-token-present')
|
|
26
|
+
logfire.instrument_pydantic_ai()
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class Deps:
|
|
31
|
+
client: AsyncClient
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
weather_agent = Agent(
|
|
35
|
+
'openai:gpt-4.1-mini',
|
|
36
|
+
# 'Be concise, reply with one sentence.' is enough for some models (like openai) to use
|
|
37
|
+
# the below tools appropriately, but others like anthropic and gemini require a bit more direction.
|
|
38
|
+
instructions='Be concise, reply with one sentence.',
|
|
39
|
+
deps_type=Deps,
|
|
40
|
+
retries=2,
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class LatLng(BaseModel):
|
|
45
|
+
lat: float
|
|
46
|
+
lng: float
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@weather_agent.tool
|
|
50
|
+
async def get_lat_lng(ctx: RunContext[Deps], location_description: str) -> LatLng:
|
|
51
|
+
"""Get the latitude and longitude of a location.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
ctx: The context.
|
|
55
|
+
location_description: A description of a location.
|
|
56
|
+
"""
|
|
57
|
+
# NOTE: the response here will be random, and is not related to the location description.
|
|
58
|
+
r = await ctx.deps.client.get(
|
|
59
|
+
'https://demo-endpoints.pydantic.workers.dev/latlng',
|
|
60
|
+
params={'location': location_description},
|
|
61
|
+
)
|
|
62
|
+
r.raise_for_status()
|
|
63
|
+
return LatLng.model_validate_json(r.content)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
@weather_agent.tool
|
|
67
|
+
async def get_weather(ctx: RunContext[Deps], lat: float, lng: float) -> dict[str, Any]:
|
|
68
|
+
"""Get the weather at a location.
|
|
69
|
+
|
|
70
|
+
Args:
|
|
71
|
+
ctx: The context.
|
|
72
|
+
lat: Latitude of the location.
|
|
73
|
+
lng: Longitude of the location.
|
|
74
|
+
"""
|
|
75
|
+
# NOTE: the responses here will be random, and are not related to the lat and lng.
|
|
76
|
+
temp_response, descr_response = await asyncio.gather(
|
|
77
|
+
ctx.deps.client.get(
|
|
78
|
+
'https://demo-endpoints.pydantic.workers.dev/number',
|
|
79
|
+
params={'min': 10, 'max': 30},
|
|
80
|
+
),
|
|
81
|
+
ctx.deps.client.get(
|
|
82
|
+
'https://demo-endpoints.pydantic.workers.dev/weather',
|
|
83
|
+
params={'lat': lat, 'lng': lng},
|
|
84
|
+
),
|
|
85
|
+
)
|
|
86
|
+
temp_response.raise_for_status()
|
|
87
|
+
descr_response.raise_for_status()
|
|
88
|
+
return {
|
|
89
|
+
'temperature': f'{temp_response.text} °C',
|
|
90
|
+
'description': descr_response.text,
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
async def main():
|
|
95
|
+
async with AsyncClient() as client:
|
|
96
|
+
logfire.instrument_httpx(client, capture_all=True)
|
|
97
|
+
deps = Deps(client=client)
|
|
98
|
+
result = await weather_agent.run(
|
|
99
|
+
'What is the weather like in London and in Wiltshire?', deps=deps
|
|
100
|
+
)
|
|
101
|
+
print('Response:', result.output)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
if __name__ == '__main__':
|
|
105
|
+
asyncio.run(main())
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations as _annotations
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
|
-
import os
|
|
5
4
|
|
|
6
5
|
from httpx import AsyncClient
|
|
7
6
|
|
|
@@ -18,10 +17,7 @@ except ImportError as e:
|
|
|
18
17
|
TOOL_TO_DISPLAY_NAME = {'get_lat_lng': 'Geocoding API', 'get_weather': 'Weather API'}
|
|
19
18
|
|
|
20
19
|
client = AsyncClient()
|
|
21
|
-
|
|
22
|
-
# create a free API key at https://geocode.maps.co/
|
|
23
|
-
geo_api_key = os.getenv('GEO_API_KEY')
|
|
24
|
-
deps = Deps(client=client, weather_api_key=weather_api_key, geo_api_key=geo_api_key)
|
|
20
|
+
deps = Deps(client=client)
|
|
25
21
|
|
|
26
22
|
|
|
27
23
|
async def stream_from_agent(prompt: str, chatbot: list[dict], past_messages: list):
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
"""Example of PydanticAI with multiple tools which the LLM needs to call in turn to answer a question.
|
|
2
|
-
|
|
3
|
-
In this case the idea is a "weather" agent — the user can ask for the weather in multiple cities,
|
|
4
|
-
the agent will use the `get_lat_lng` tool to get the latitude and longitude of the locations, then use
|
|
5
|
-
the `get_weather` tool to get the weather.
|
|
6
|
-
|
|
7
|
-
Run with:
|
|
8
|
-
|
|
9
|
-
uv run -m pydantic_ai_examples.weather_agent
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
from __future__ import annotations as _annotations
|
|
13
|
-
|
|
14
|
-
import asyncio
|
|
15
|
-
import os
|
|
16
|
-
import urllib.parse
|
|
17
|
-
from dataclasses import dataclass
|
|
18
|
-
from typing import Any
|
|
19
|
-
|
|
20
|
-
import logfire
|
|
21
|
-
from devtools import debug
|
|
22
|
-
from httpx import AsyncClient
|
|
23
|
-
|
|
24
|
-
from pydantic_ai import Agent, ModelRetry, RunContext
|
|
25
|
-
|
|
26
|
-
# 'if-token-present' means nothing will be sent (and the example will work) if you don't have logfire configured
|
|
27
|
-
logfire.configure(send_to_logfire='if-token-present')
|
|
28
|
-
logfire.instrument_pydantic_ai()
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
@dataclass
|
|
32
|
-
class Deps:
|
|
33
|
-
client: AsyncClient
|
|
34
|
-
weather_api_key: str | None
|
|
35
|
-
geo_api_key: str | None
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
weather_agent = Agent(
|
|
39
|
-
'openai:gpt-4o',
|
|
40
|
-
# 'Be concise, reply with one sentence.' is enough for some models (like openai) to use
|
|
41
|
-
# the below tools appropriately, but others like anthropic and gemini require a bit more direction.
|
|
42
|
-
instructions=(
|
|
43
|
-
'Be concise, reply with one sentence.'
|
|
44
|
-
'Use the `get_lat_lng` tool to get the latitude and longitude of the locations, '
|
|
45
|
-
'then use the `get_weather` tool to get the weather.'
|
|
46
|
-
),
|
|
47
|
-
deps_type=Deps,
|
|
48
|
-
retries=2,
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
@weather_agent.tool
|
|
53
|
-
async def get_lat_lng(
|
|
54
|
-
ctx: RunContext[Deps], location_description: str
|
|
55
|
-
) -> dict[str, float]:
|
|
56
|
-
"""Get the latitude and longitude of a location.
|
|
57
|
-
|
|
58
|
-
Args:
|
|
59
|
-
ctx: The context.
|
|
60
|
-
location_description: A description of a location.
|
|
61
|
-
"""
|
|
62
|
-
if ctx.deps.geo_api_key is None:
|
|
63
|
-
# if no API key is provided, return a dummy response (London)
|
|
64
|
-
return {'lat': 51.1, 'lng': -0.1}
|
|
65
|
-
|
|
66
|
-
params = {'access_token': ctx.deps.geo_api_key}
|
|
67
|
-
loc = urllib.parse.quote(location_description)
|
|
68
|
-
r = await ctx.deps.client.get(
|
|
69
|
-
f'https://api.mapbox.com/geocoding/v5/mapbox.places/{loc}.json', params=params
|
|
70
|
-
)
|
|
71
|
-
r.raise_for_status()
|
|
72
|
-
data = r.json()
|
|
73
|
-
|
|
74
|
-
if features := data['features']:
|
|
75
|
-
lat, lng = features[0]['center']
|
|
76
|
-
return {'lat': lat, 'lng': lng}
|
|
77
|
-
else:
|
|
78
|
-
raise ModelRetry('Could not find the location')
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
@weather_agent.tool
|
|
82
|
-
async def get_weather(ctx: RunContext[Deps], lat: float, lng: float) -> dict[str, Any]:
|
|
83
|
-
"""Get the weather at a location.
|
|
84
|
-
|
|
85
|
-
Args:
|
|
86
|
-
ctx: The context.
|
|
87
|
-
lat: Latitude of the location.
|
|
88
|
-
lng: Longitude of the location.
|
|
89
|
-
"""
|
|
90
|
-
if ctx.deps.weather_api_key is None:
|
|
91
|
-
# if no API key is provided, return a dummy response
|
|
92
|
-
return {'temperature': '21 °C', 'description': 'Sunny'}
|
|
93
|
-
|
|
94
|
-
params = {
|
|
95
|
-
'apikey': ctx.deps.weather_api_key,
|
|
96
|
-
'location': f'{lat},{lng}',
|
|
97
|
-
'units': 'metric',
|
|
98
|
-
}
|
|
99
|
-
with logfire.span('calling weather API', params=params) as span:
|
|
100
|
-
r = await ctx.deps.client.get(
|
|
101
|
-
'https://api.tomorrow.io/v4/weather/realtime', params=params
|
|
102
|
-
)
|
|
103
|
-
r.raise_for_status()
|
|
104
|
-
data = r.json()
|
|
105
|
-
span.set_attribute('response', data)
|
|
106
|
-
|
|
107
|
-
values = data['data']['values']
|
|
108
|
-
# https://docs.tomorrow.io/reference/data-layers-weather-codes
|
|
109
|
-
code_lookup = {
|
|
110
|
-
1000: 'Clear, Sunny',
|
|
111
|
-
1100: 'Mostly Clear',
|
|
112
|
-
1101: 'Partly Cloudy',
|
|
113
|
-
1102: 'Mostly Cloudy',
|
|
114
|
-
1001: 'Cloudy',
|
|
115
|
-
2000: 'Fog',
|
|
116
|
-
2100: 'Light Fog',
|
|
117
|
-
4000: 'Drizzle',
|
|
118
|
-
4001: 'Rain',
|
|
119
|
-
4200: 'Light Rain',
|
|
120
|
-
4201: 'Heavy Rain',
|
|
121
|
-
5000: 'Snow',
|
|
122
|
-
5001: 'Flurries',
|
|
123
|
-
5100: 'Light Snow',
|
|
124
|
-
5101: 'Heavy Snow',
|
|
125
|
-
6000: 'Freezing Drizzle',
|
|
126
|
-
6001: 'Freezing Rain',
|
|
127
|
-
6200: 'Light Freezing Rain',
|
|
128
|
-
6201: 'Heavy Freezing Rain',
|
|
129
|
-
7000: 'Ice Pellets',
|
|
130
|
-
7101: 'Heavy Ice Pellets',
|
|
131
|
-
7102: 'Light Ice Pellets',
|
|
132
|
-
8000: 'Thunderstorm',
|
|
133
|
-
}
|
|
134
|
-
return {
|
|
135
|
-
'temperature': f'{values["temperatureApparent"]:0.0f}°C',
|
|
136
|
-
'description': code_lookup.get(values['weatherCode'], 'Unknown'),
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
async def main():
|
|
141
|
-
async with AsyncClient() as client:
|
|
142
|
-
logfire.instrument_httpx(client, capture_all=True)
|
|
143
|
-
# create a free API key at https://www.tomorrow.io/weather-api/
|
|
144
|
-
weather_api_key = os.getenv('WEATHER_API_KEY')
|
|
145
|
-
# create a free API key at https://www.mapbox.com/
|
|
146
|
-
geo_api_key = os.getenv('GEO_API_KEY')
|
|
147
|
-
deps = Deps(
|
|
148
|
-
client=client, weather_api_key=weather_api_key, geo_api_key=geo_api_key
|
|
149
|
-
)
|
|
150
|
-
result = await weather_agent.run(
|
|
151
|
-
'What is the weather like in London and in Wiltshire?', deps=deps
|
|
152
|
-
)
|
|
153
|
-
debug(result)
|
|
154
|
-
print('Response:', result.output)
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
if __name__ == '__main__':
|
|
158
|
-
asyncio.run(main())
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/bank_support.py
RENAMED
|
File without changes
|
{pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/chat_app.html
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/evals/__init__.py
RENAMED
|
File without changes
|
{pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/evals/agent.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/evals/models.py
RENAMED
|
File without changes
|
{pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/flight_booking.py
RENAMED
|
File without changes
|
{pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/pydantic_model.py
RENAMED
|
File without changes
|
{pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/question_graph.py
RENAMED
|
File without changes
|
|
File without changes
|
{pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/roulette_wheel.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/stream_markdown.py
RENAMED
|
File without changes
|
{pydantic_ai_examples-0.3.5 → pydantic_ai_examples-0.3.6}/pydantic_ai_examples/stream_whales.py
RENAMED
|
File without changes
|
|
File without changes
|