pydantic-ai-examples 0.8.1__tar.gz → 1.0.0b1__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.
Files changed (51) hide show
  1. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/PKG-INFO +6 -7
  2. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/chat_app.py +3 -4
  3. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/evals/custom_evaluators.py +5 -6
  4. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/evals/example_01_generate_dataset.py +1 -2
  5. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/evals/example_02_add_custom_evaluators.py +1 -2
  6. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/evals/example_03_unit_testing.py +4 -2
  7. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/flight_booking.py +1 -2
  8. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/rag.py +1 -2
  9. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/sql_gen.py +2 -3
  10. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pyproject.toml +3 -4
  11. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/.gitignore +0 -0
  12. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/LICENSE +0 -0
  13. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/README.md +0 -0
  14. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/__main__.py +0 -0
  15. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/ag_ui/__init__.py +0 -0
  16. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/ag_ui/__main__.py +0 -0
  17. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/ag_ui/api/__init__.py +0 -0
  18. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/ag_ui/api/agentic_chat.py +0 -0
  19. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/ag_ui/api/agentic_generative_ui.py +0 -0
  20. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/ag_ui/api/human_in_the_loop.py +0 -0
  21. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/ag_ui/api/predictive_state_updates.py +0 -0
  22. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/ag_ui/api/shared_state.py +0 -0
  23. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/ag_ui/api/tool_based_generative_ui.py +0 -0
  24. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/bank_support.py +0 -0
  25. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/chat_app.html +0 -0
  26. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/chat_app.ts +0 -0
  27. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/data_analyst.py +0 -0
  28. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/evals/__init__.py +0 -0
  29. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/evals/agent.py +0 -0
  30. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/evals/datasets/time_range_v1.yaml +0 -0
  31. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/evals/datasets/time_range_v1_schema.json +0 -0
  32. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/evals/datasets/time_range_v2.yaml +0 -0
  33. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/evals/datasets/time_range_v2_schema.json +0 -0
  34. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/evals/example_04_compare_models.py +1 -1
  35. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/evals/models.py +0 -0
  36. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/py.typed +0 -0
  37. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/pydantic_model.py +0 -0
  38. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/question_graph.py +3 -3
  39. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/roulette_wheel.py +0 -0
  40. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/slack_lead_qualifier/__init__.py +0 -0
  41. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/slack_lead_qualifier/agent.py +0 -0
  42. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/slack_lead_qualifier/app.py +0 -0
  43. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/slack_lead_qualifier/functions.py +0 -0
  44. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/slack_lead_qualifier/modal.py +0 -0
  45. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/slack_lead_qualifier/models.py +0 -0
  46. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/slack_lead_qualifier/slack.py +0 -0
  47. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/slack_lead_qualifier/store.py +0 -0
  48. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/stream_markdown.py +0 -0
  49. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/stream_whales.py +0 -0
  50. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/weather_agent.py +0 -0
  51. {pydantic_ai_examples-0.8.1 → pydantic_ai_examples-1.0.0b1}/pydantic_ai_examples/weather_agent_gradio.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pydantic-ai-examples
3
- Version: 0.8.1
3
+ Version: 1.0.0b1
4
4
  Summary: Examples of how to use Pydantic AI and what it can do.
5
5
  Author-email: Samuel Colvin <samuel@pydantic.dev>, Marcelo Trylesinski <marcelotryle@gmail.com>, David Montague <david@pydantic.dev>, Alex Hall <alex@pydantic.dev>, Douwe Maan <douwe@pydantic.dev>
6
6
  License-Expression: MIT
@@ -17,26 +17,25 @@ Classifier: Operating System :: Unix
17
17
  Classifier: Programming Language :: Python
18
18
  Classifier: Programming Language :: Python :: 3
19
19
  Classifier: Programming Language :: Python :: 3 :: Only
20
- Classifier: Programming Language :: Python :: 3.9
21
20
  Classifier: Programming Language :: Python :: 3.10
22
21
  Classifier: Programming Language :: Python :: 3.11
23
22
  Classifier: Programming Language :: Python :: 3.12
24
23
  Classifier: Programming Language :: Python :: 3.13
25
24
  Classifier: Topic :: Internet
26
25
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
27
- Requires-Python: >=3.9
26
+ Requires-Python: >=3.10
28
27
  Requires-Dist: asyncpg>=0.30.0
29
28
  Requires-Dist: datasets>=4.0.0
30
29
  Requires-Dist: devtools>=0.12.2
31
30
  Requires-Dist: duckdb>=1.3.2
32
31
  Requires-Dist: fastapi>=0.115.4
33
- Requires-Dist: gradio>=5.9.0; python_version > '3.9'
32
+ Requires-Dist: gradio>=5.9.0
34
33
  Requires-Dist: logfire[asyncpg,fastapi,httpx,sqlite3]>=3.14.1
35
- Requires-Dist: mcp[cli]>=1.4.1; python_version >= '3.10'
34
+ Requires-Dist: mcp[cli]>=1.4.1
36
35
  Requires-Dist: modal>=1.0.4
37
36
  Requires-Dist: pandas>=2.2.3
38
- Requires-Dist: pydantic-ai-slim[ag-ui,anthropic,groq,openai,vertexai]==0.8.1
39
- Requires-Dist: pydantic-evals==0.8.1
37
+ Requires-Dist: pydantic-ai-slim[ag-ui,anthropic,groq,openai,vertexai]==1.0.0b1
38
+ Requires-Dist: pydantic-evals==1.0.0b1
40
39
  Requires-Dist: python-multipart>=0.0.17
41
40
  Requires-Dist: rich>=13.9.2
42
41
  Requires-Dist: uvicorn>=0.32.0
@@ -10,14 +10,14 @@ from __future__ import annotations as _annotations
10
10
  import asyncio
11
11
  import json
12
12
  import sqlite3
13
- from collections.abc import AsyncIterator
13
+ from collections.abc import AsyncIterator, Callable
14
14
  from concurrent.futures.thread import ThreadPoolExecutor
15
15
  from contextlib import asynccontextmanager
16
16
  from dataclasses import dataclass
17
17
  from datetime import datetime, timezone
18
18
  from functools import partial
19
19
  from pathlib import Path
20
- from typing import Annotated, Any, Callable, Literal, TypeVar
20
+ from typing import Annotated, Any, Literal, TypeVar
21
21
 
22
22
  import fastapi
23
23
  import logfire
@@ -25,8 +25,7 @@ from fastapi import Depends, Request
25
25
  from fastapi.responses import FileResponse, Response, StreamingResponse
26
26
  from typing_extensions import LiteralString, ParamSpec, TypedDict
27
27
 
28
- from pydantic_ai import Agent
29
- from pydantic_ai.exceptions import UnexpectedModelBehavior
28
+ from pydantic_ai import Agent, UnexpectedModelBehavior
30
29
  from pydantic_ai.messages import (
31
30
  ModelMessage,
32
31
  ModelMessagesTypeAdapter,
@@ -1,6 +1,11 @@
1
1
  from dataclasses import dataclass
2
2
  from datetime import timedelta
3
3
 
4
+ from pydantic_ai_examples.evals.models import (
5
+ TimeRangeBuilderSuccess,
6
+ TimeRangeInputs,
7
+ TimeRangeResponse,
8
+ )
4
9
  from pydantic_evals.evaluators import (
5
10
  Evaluator,
6
11
  EvaluatorContext,
@@ -8,12 +13,6 @@ from pydantic_evals.evaluators import (
8
13
  )
9
14
  from pydantic_evals.otel import SpanQuery
10
15
 
11
- from pydantic_ai_examples.evals.models import (
12
- TimeRangeBuilderSuccess,
13
- TimeRangeInputs,
14
- TimeRangeResponse,
15
- )
16
-
17
16
 
18
17
  @dataclass
19
18
  class ValidateTimeRange(Evaluator[TimeRangeInputs, TimeRangeResponse]):
@@ -2,11 +2,10 @@ import asyncio
2
2
  from pathlib import Path
3
3
  from types import NoneType
4
4
 
5
+ from pydantic_ai_examples.evals.models import TimeRangeInputs, TimeRangeResponse
5
6
  from pydantic_evals import Dataset
6
7
  from pydantic_evals.generation import generate_dataset
7
8
 
8
- from pydantic_ai_examples.evals.models import TimeRangeInputs, TimeRangeResponse
9
-
10
9
 
11
10
  async def main():
12
11
  dataset = await generate_dataset(
@@ -1,8 +1,6 @@
1
1
  from pathlib import Path
2
2
  from types import NoneType
3
3
 
4
- from pydantic_evals import Dataset
5
-
6
4
  from pydantic_ai_examples.evals.custom_evaluators import (
7
5
  CUSTOM_EVALUATOR_TYPES,
8
6
  AgentCalledTool,
@@ -13,6 +11,7 @@ from pydantic_ai_examples.evals.models import (
13
11
  TimeRangeInputs,
14
12
  TimeRangeResponse,
15
13
  )
14
+ from pydantic_evals import Dataset
16
15
 
17
16
 
18
17
  def main():
@@ -2,7 +2,6 @@ from pathlib import Path
2
2
  from types import NoneType
3
3
 
4
4
  import logfire
5
- from pydantic_evals import Dataset
6
5
 
7
6
  from pydantic_ai_examples.evals import infer_time_range
8
7
  from pydantic_ai_examples.evals.custom_evaluators import (
@@ -12,6 +11,7 @@ from pydantic_ai_examples.evals.models import (
12
11
  TimeRangeInputs,
13
12
  TimeRangeResponse,
14
13
  )
14
+ from pydantic_evals import Dataset
15
15
 
16
16
  logfire.configure(
17
17
  send_to_logfire='if-token-present',
@@ -29,7 +29,9 @@ def evaluate_dataset():
29
29
  report = dataset.evaluate_sync(infer_time_range)
30
30
  print(report)
31
31
 
32
- assertion_pass_rate = report.averages().assertions
32
+ averages = report.averages()
33
+ assert averages is not None
34
+ assertion_pass_rate = averages.assertions
33
35
  assert assertion_pass_rate is not None, 'There should be at least one assertion'
34
36
  assert assertion_pass_rate > 0.9, (
35
37
  f'The assertion pass rate was {assertion_pass_rate:.1%}; it should be above 90%.'
@@ -11,9 +11,8 @@ import logfire
11
11
  from pydantic import BaseModel, Field
12
12
  from rich.prompt import Prompt
13
13
 
14
- from pydantic_ai import Agent, ModelRetry, RunContext
14
+ from pydantic_ai import Agent, ModelRetry, RunContext, RunUsage, UsageLimits
15
15
  from pydantic_ai.messages import ModelMessage
16
- from pydantic_ai.usage import RunUsage, UsageLimits
17
16
 
18
17
  # 'if-token-present' means nothing will be sent (and the example will work) if you don't have logfire configured
19
18
  logfire.configure(send_to_logfire='if-token-present')
@@ -34,8 +34,7 @@ from openai import AsyncOpenAI
34
34
  from pydantic import TypeAdapter
35
35
  from typing_extensions import AsyncGenerator
36
36
 
37
- from pydantic_ai import RunContext
38
- from pydantic_ai.agent import Agent
37
+ from pydantic_ai import Agent, RunContext
39
38
 
40
39
  # 'if-token-present' means nothing will be sent (and the example will work) if you don't have logfire configured
41
40
  logfire.configure(send_to_logfire='if-token-present')
@@ -16,14 +16,13 @@ from collections.abc import AsyncGenerator
16
16
  from contextlib import asynccontextmanager
17
17
  from dataclasses import dataclass
18
18
  from datetime import date
19
- from typing import Annotated, Any, Union
19
+ from typing import Annotated, Any, TypeAlias
20
20
 
21
21
  import asyncpg
22
22
  import logfire
23
23
  from annotated_types import MinLen
24
24
  from devtools import debug
25
25
  from pydantic import BaseModel, Field
26
- from typing_extensions import TypeAlias
27
26
 
28
27
  from pydantic_ai import Agent, ModelRetry, RunContext, format_as_xml
29
28
 
@@ -91,7 +90,7 @@ class InvalidRequest(BaseModel):
91
90
  error_message: str
92
91
 
93
92
 
94
- Response: TypeAlias = Union[Success, InvalidRequest]
93
+ Response: TypeAlias = Success | InvalidRequest
95
94
  agent = Agent[Deps, Response](
96
95
  'google-gla:gemini-1.5-flash',
97
96
  # Type ignore while we wait for PEP-0747, nonetheless unions will work fine everywhere else
@@ -28,7 +28,6 @@ classifiers = [
28
28
  "Programming Language :: Python",
29
29
  "Programming Language :: Python :: 3",
30
30
  "Programming Language :: Python :: 3 :: Only",
31
- "Programming Language :: Python :: 3.9",
32
31
  "Programming Language :: Python :: 3.10",
33
32
  "Programming Language :: Python :: 3.11",
34
33
  "Programming Language :: Python :: 3.12",
@@ -44,7 +43,7 @@ classifiers = [
44
43
  "Topic :: Software Development :: Libraries :: Python Modules",
45
44
  "Topic :: Internet",
46
45
  ]
47
- requires-python = ">=3.9"
46
+ requires-python = ">=3.10"
48
47
 
49
48
  [tool.hatch.metadata.hooks.uv-dynamic-versioning]
50
49
  dependencies = [
@@ -57,8 +56,8 @@ dependencies = [
57
56
  "rich>=13.9.2",
58
57
  "uvicorn>=0.32.0",
59
58
  "devtools>=0.12.2",
60
- "gradio>=5.9.0; python_version>'3.9'",
61
- "mcp[cli]>=1.4.1; python_version >= '3.10'",
59
+ "gradio>=5.9.0",
60
+ "mcp[cli]>=1.4.1",
62
61
  "modal>=1.0.4",
63
62
  "duckdb>=1.3.2",
64
63
  "datasets>=4.0.0",
@@ -2,7 +2,6 @@ from pathlib import Path
2
2
  from types import NoneType
3
3
 
4
4
  import logfire
5
- from pydantic_evals import Dataset
6
5
 
7
6
  from pydantic_ai_examples.evals import infer_time_range
8
7
  from pydantic_ai_examples.evals.agent import time_range_agent
@@ -13,6 +12,7 @@ from pydantic_ai_examples.evals.models import (
13
12
  TimeRangeInputs,
14
13
  TimeRangeResponse,
15
14
  )
15
+ from pydantic_evals import Dataset
16
16
 
17
17
  logfire.configure(
18
18
  send_to_logfire='if-token-present',
@@ -12,6 +12,9 @@ from pathlib import Path
12
12
 
13
13
  import logfire
14
14
  from groq import BaseModel
15
+
16
+ from pydantic_ai import Agent, format_as_xml
17
+ from pydantic_ai.messages import ModelMessage
15
18
  from pydantic_graph import (
16
19
  BaseNode,
17
20
  End,
@@ -20,9 +23,6 @@ from pydantic_graph import (
20
23
  )
21
24
  from pydantic_graph.persistence.file import FileStatePersistence
22
25
 
23
- from pydantic_ai import Agent, format_as_xml
24
- from pydantic_ai.messages import ModelMessage
25
-
26
26
  # 'if-token-present' means nothing will be sent (and the example will work) if you don't have logfire configured
27
27
  logfire.configure(send_to_logfire='if-token-present')
28
28
  logfire.instrument_pydantic_ai()