Repository guide · getting started · v5
pydantic / pydantic-ai · Getting started
This repository is a Python project described as an agent framework. Static analysis records 4,082 files, 45 parsed dependencies across three manifests, and 65 entrypoint records. Execution paths terminate at external or unresolved boundaries, and runtime commands are unverified.
- Original repository
- pydantic/pydantic-ai
- License
- MIT · open-source license
- Analyzed revision · last verified
- 5b73d7c0da119f12c65b015b15eba3e4d128fca9 ·
Newer revision observed; the code this guide cites is unchanged. The default branch moved to f06bba53794d, checked 2026-10-03. A revision diff of 39 changed files found no change in the code regions this guide cites. The guide still describes revision 5b73d7c0da11; repository-wide counts (files, calls and so on) refer to that revision.
Getting Started with pydantic/pydantic-ai: Initial Guide
Terms used on this page
- Entrypoint record
- A file the analyzer marks as a place where execution can start. When it carries a __main__ guard excerpt, the file contains an if __name__ == "__main__": block and the excerpt shows what that block calls; without an excerpt, the file was flagged by its name only.
- Bounded static execution path
- A call chain reconstructed from the source code without running it, stopped after a fixed number of steps. It shows how far the code can be followed on paper, not what happens at run time.
- Unresolved boundary
- Where a static path stops because the next call goes into an external library or cannot be resolved without running the code. It marks the edge of this analysis, not a defect in the repository.
- Static relations
- Calls and imports found in the source. "External or unresolved" relations point outside the analyzed files.
- Module role
- The analyzer's label for a file, inferred from how many calls go in and out (for example core, entry/orchestration, leaf). It describes a position in the call graph, not the authors' design.
- Test-like files
- Files whose names or locations look like tests. This analysis counts them; it does not run them.
- Observed · inferred · author-claimed · unresolved
- How each statement is supported: read directly from the analyzed files; derived by the analyzer from them; stated by the repository's authors (metadata, README); or not established by this analysis.
- Verified
- Two uses on these pages. In an analyzer record ("verified provenance", "a verified entrypoint") it means the record was read directly from the analyzed files, which these guides call observed; for an entrypoint, the __main__ guard text is present. Since the analyzer fix of 2026-10-04, a file that only has an entrypoint-like name such as cli.py or main.py is recorded as inferred; guides analyzed before that still call such a file verified, and it is still only a guess about how the file is used. It does not mean the code was run or tested. "Last verified" is the date the guide last passed the lab's checks against the analysis record of the stated revision; it is not a review of the repository itself.
What You Are Looking At
Repository metadata describes the project as an agent and multimodal framework typed end to end. GitHub platform metadata lists Python as the primary language, with an MIT license, a latest release tag of v2.54.0 published on October 3, 2026, and 20,385 stargazers. Static summary metrics indicate 4,082 analyzed files in total.
What It Needs
Three manifests produced dependency records: pydantic_evals/pyproject.toml, pydantic_graph/pyproject.toml, and pyproject.toml. Across these, 45 dependency records were captured.
From pydantic_evals/pyproject.toml, optional dependency logfire is recorded. From pydantic_graph/pyproject.toml, runtime dependencies include anyio, logfire-api, pydantic, and typing-inspection. In the root pyproject.toml, 40 development dependencies are recorded, including pytest, hypothesis, inline-snapshot, mypy, pyright, ruff, httpx, trio, fastmcp and mcp-types. Dependency extraction is limited to supported tables, leaving other manifest formats unparsed.
How It Starts
The repository inventory contains 65 total entrypoint records, of which 20 are detailed in the packet. Entrypoints carrying a main execution guard include script utilities such as scripts/check_cassettes.py and scripts/typecheck_changed.py calling sys.exit(main()), asyncio scripts such as scripts/upload_test_files.py calling asyncio.run(main()), test servers in tests/mcp_server.py calling mcp.run(), and automation scripts in .github/scripts/ invoking main(). In clai/clai/__main__.py, the guard executes _cli.cli_exit('clai').
The analyzer reports 580 bounded execution paths; 5 are listed, all originating at .claude/skills/testing-skill/parse_cassette.py:__main__. Each listed path terminates at unresolved boundaries such as ArgumentParser or local argument calls. Runtime execution behavior beyond these static paths is not established.
Where to Look First
Top-level directories include tests (2,501 files), src (498 files), pydantic_ai_slim (426 files), docs (351 files), and examples (63 files). The repository contains 2,514 test-like files.
The analyzer highlights project-level important files README.md, pyproject.toml, and LICENSE, alongside entrypoint files like .claude/skills/testing-skill/parse_cassette.py and automation scripts. Teaching records recommend beginning inspection with manifests and important symbols before tracing bounded paths, noting detected starting points in examples/pydantic_ai_examples/slack_lead_qualifier/app.py.
What This Analysis Cannot Tell You
Analysis is strictly static: dynamic imports, runtime dependency injection, monkey-patching, and framework dispatch are not resolved. Manifest extraction is partial and install or run commands are not verified. README extraction is line-based and author-claimed.
Analysis bounds capped repository relation extraction at 150,000 edges, leaving files after tests/harness/subagents/test_subagents_disk.py without extracted relations. Five files exceeding 400 kB were inventoried but skipped. Additionally, teaching records cite examples/pydantic_ai_examples/slack_lead_qualifier/app.py as a starting point, which is not present among the listed entrypoint records.
What this analysis could not establish
The writing model's own notes on the analysis record. Identifiers such as lim_3, exec_* or claim_… name records of that analysis; the claims table cites the same records.
- 5 files larger than 400 kB were inventoried but not parsed.
- Static relation extraction was truncated at the 150,000 repository cap.
- An entrypoint record that teaching claims refer to is omitted from the listed entrypoint records.
Claims and evidence — 25 claims, 25 supported by an independent verifier
Every substantive statement above is a claim bound to grounding IDs of the analyzed revision. Global grounding IDs are namespaced by the analysis run.
| Claim | Epistemic status | Verifier | Grounding (global IDs) |
|---|---|---|---|
| c1 Repository metadata describes the project as covering AI agents, realtime voice, image generation, and embeddings typed end to end. | author_claimed | supported | analysis_169ebfd40f3abfe7:meta_description |
| c2 Platform metadata records Python as primary language, an MIT license, release v2.54.0 published on 2026-10-03, and 20,385 stargazers. | observed | supported | analysis_169ebfd40f3abfe7:meta_primary_language, analysis_169ebfd40f3abfe7:meta_license, analysis_169ebfd40f3abfe7:meta_latest_release, analysis_169ebfd40f3abfe7:meta_stars |
| c3 The repository summary indicates 4,082 analyzed files across the project. | inferred | supported | analysis_169ebfd40f3abfe7:summary_repository |
| c4 Three pyproject.toml manifests yielded 45 total dependency records. | observed | supported | analysis_169ebfd40f3abfe7:dep_1, analysis_169ebfd40f3abfe7:dep_2, analysis_169ebfd40f3abfe7:dep_3, analysis_169ebfd40f3abfe7:dep_4, analysis_169ebfd40f3abfe7:dep_5, analysis_169ebfd40f3abfe7:dep_6, analysis_169ebfd40f3abfe7:dep_7, analysis_169ebfd40f3abfe7:dep_8, analysis_169ebfd40f3abfe7:dep_9, analysis_169ebfd40f3abfe7:dep_10, analysis_169ebfd40f3abfe7:dep_11, analysis_169ebfd40f3abfe7:dep_12, analysis_169ebfd40f3abfe7:dep_13, analysis_169ebfd40f3abfe7:dep_14, analysis_169ebfd40f3abfe7:dep_15, analysis_169ebfd40f3abfe7:dep_16, analysis_169ebfd40f3abfe7:dep_17, analysis_169ebfd40f3abfe7:dep_18, analysis_169ebfd40f3abfe7:dep_19, analysis_169ebfd40f3abfe7:dep_20, analysis_169ebfd40f3abfe7:dep_21, analysis_169ebfd40f3abfe7:dep_22, analysis_169ebfd40f3abfe7:dep_23, analysis_169ebfd40f3abfe7:dep_24, analysis_169ebfd40f3abfe7:dep_25, analysis_169ebfd40f3abfe7:dep_26, analysis_169ebfd40f3abfe7:dep_27, analysis_169ebfd40f3abfe7:dep_28, analysis_169ebfd40f3abfe7:dep_29, analysis_169ebfd40f3abfe7:dep_30, analysis_169ebfd40f3abfe7:dep_31, analysis_169ebfd40f3abfe7:dep_32, analysis_169ebfd40f3abfe7:dep_33, analysis_169ebfd40f3abfe7:dep_34, analysis_169ebfd40f3abfe7:dep_35, analysis_169ebfd40f3abfe7:dep_36, analysis_169ebfd40f3abfe7:dep_37, analysis_169ebfd40f3abfe7:dep_38, analysis_169ebfd40f3abfe7:dep_39, analysis_169ebfd40f3abfe7:dep_40, analysis_169ebfd40f3abfe7:dep_41, analysis_169ebfd40f3abfe7:dep_42, analysis_169ebfd40f3abfe7:dep_43, analysis_169ebfd40f3abfe7:dep_44, analysis_169ebfd40f3abfe7:dep_45 |
| c5 The manifest pydantic_evals/pyproject.toml lists optional dependency logfire (>=3.14.1). | observed | supported | analysis_169ebfd40f3abfe7:dep_1 |
| c6 The manifest pydantic_graph/pyproject.toml lists runtime dependencies anyio, logfire-api, pydantic, and typing-inspection. | observed | supported | analysis_169ebfd40f3abfe7:dep_2, analysis_169ebfd40f3abfe7:dep_3, analysis_169ebfd40f3abfe7:dep_4, analysis_169ebfd40f3abfe7:dep_5 |
| c7 The root pyproject.toml lists 40 dev dependencies including pytest, mypy, pyright, ruff, httpx, fastmcp, and mcp-types. | observed | supported | analysis_169ebfd40f3abfe7:dep_6, analysis_169ebfd40f3abfe7:dep_7, analysis_169ebfd40f3abfe7:dep_8, analysis_169ebfd40f3abfe7:dep_9, analysis_169ebfd40f3abfe7:dep_10, analysis_169ebfd40f3abfe7:dep_11, analysis_169ebfd40f3abfe7:dep_12, analysis_169ebfd40f3abfe7:dep_13, analysis_169ebfd40f3abfe7:dep_14, analysis_169ebfd40f3abfe7:dep_15, analysis_169ebfd40f3abfe7:dep_16, analysis_169ebfd40f3abfe7:dep_17, analysis_169ebfd40f3abfe7:dep_18, analysis_169ebfd40f3abfe7:dep_19, analysis_169ebfd40f3abfe7:dep_20, analysis_169ebfd40f3abfe7:dep_21, analysis_169ebfd40f3abfe7:dep_22, analysis_169ebfd40f3abfe7:dep_23, analysis_169ebfd40f3abfe7:dep_24, analysis_169ebfd40f3abfe7:dep_25, analysis_169ebfd40f3abfe7:dep_26, analysis_169ebfd40f3abfe7:dep_27, analysis_169ebfd40f3abfe7:dep_28, analysis_169ebfd40f3abfe7:dep_29, analysis_169ebfd40f3abfe7:dep_30, analysis_169ebfd40f3abfe7:dep_31, analysis_169ebfd40f3abfe7:dep_32, analysis_169ebfd40f3abfe7:dep_33, analysis_169ebfd40f3abfe7:dep_34, analysis_169ebfd40f3abfe7:dep_35, analysis_169ebfd40f3abfe7:dep_36, analysis_169ebfd40f3abfe7:dep_37, analysis_169ebfd40f3abfe7:dep_38, analysis_169ebfd40f3abfe7:dep_39, analysis_169ebfd40f3abfe7:dep_40, analysis_169ebfd40f3abfe7:dep_41, analysis_169ebfd40f3abfe7:dep_42, analysis_169ebfd40f3abfe7:dep_43, analysis_169ebfd40f3abfe7:dep_44, analysis_169ebfd40f3abfe7:dep_45 |
| c8 Dependency extraction parses supported PEP tables, leaving other manifest formats unparsed. | observed | supported | analysis_169ebfd40f3abfe7:lim_3a |
| c9 The repository has 65 entrypoint records, with 20 listed in the packet. | inferred | supported | analysis_169ebfd40f3abfe7:claim_2f4c621340bb |
| c10 Scripts scripts/check_cassettes.py and scripts/typecheck_changed.py contain execution guards calling sys.exit(main()). | observed | supported | analysis_169ebfd40f3abfe7:py_entry_711b9329c9af, analysis_169ebfd40f3abfe7:py_entry_d76ec7f2d16d |
| c11 Scripts scripts/upload_test_files.py, scripts/verify_vertex_gcs.py, and scripts/verify_vertex_gcs_all_types.py execute asyncio.run(main()). | observed | supported | analysis_169ebfd40f3abfe7:py_entry_4145baa0e887, analysis_169ebfd40f3abfe7:py_entry_6928137f6e36, analysis_169ebfd40f3abfe7:py_entry_28117ece2afb |
| c12 Test servers tests/mcp_server.py and tests/mcp_task_server.py call mcp.run() in their execution guards. | observed | supported | analysis_169ebfd40f3abfe7:py_entry_bea51f9f5f67, analysis_169ebfd40f3abfe7:py_entry_3d7837eecc2b |
| c13 File clai/clai/__main__.py executes _cli.cli_exit('clai') within its main guard. | observed | supported | analysis_169ebfd40f3abfe7:py_entry_ced396f72e87 |
| c14 The analyzer reports 580 bounded execution paths; 5 are listed, all originating at .claude/skills/testing-skill/parse_cassette.py:__main__ and ending at unresolved boundaries. | inferred | supported | analysis_169ebfd40f3abfe7:exec_bb0400b95179, analysis_169ebfd40f3abfe7:exec_9bbb24a4ce38, analysis_169ebfd40f3abfe7:exec_1fdb044ec706, analysis_169ebfd40f3abfe7:exec_06af0227393f, analysis_169ebfd40f3abfe7:exec_5f90db10d033 |
| c15 Runtime execution behavior beyond the documented static paths is not established. | unresolved | supported | analysis_169ebfd40f3abfe7:lim_1, analysis_169ebfd40f3abfe7:claim_4d30ade3e21e |
| c16 Top-level directories include tests (2,501 files), src (498 files), pydantic_ai_slim (426 files), docs (351 files), and examples (63 files). | inferred | supported | analysis_169ebfd40f3abfe7:summary_repository |
| c17 The repository contains 2,514 test-like files according to summary maturity signals. | inferred | supported | analysis_169ebfd40f3abfe7:summary_repository |
| c18 Files README.md, pyproject.toml, and LICENSE are classified as project-level important files. | observed | supported | analysis_169ebfd40f3abfe7:important_1, analysis_169ebfd40f3abfe7:important_2, analysis_169ebfd40f3abfe7:important_3 |
| c19 Teaching claims suggest starting with manifests and important symbols before tracing paths, noting examples/pydantic_ai_examples/slack_lead_qualifier/app.py. | inferred | supported | analysis_169ebfd40f3abfe7:claim_e56db45165bf, analysis_169ebfd40f3abfe7:claim_72d2b935d53e, analysis_169ebfd40f3abfe7:claim_067c55f84d85 |
| c20 Static analysis does not resolve dynamic imports, reflection, monkey-patching, or dynamic dispatch. | observed | supported | analysis_169ebfd40f3abfe7:lim_1 |
| c21 Installation, run, and build commands are not verified by this analysis. | observed | supported | analysis_169ebfd40f3abfe7:lim_2 |
| c22 README claims are extracted on a line basis and remain author-claimed. | observed | supported | analysis_169ebfd40f3abfe7:lim_4a |
| c23 Extraction reached the repository limit of 150,000 relations, truncating relation edges for files after tests/harness/subagents/test_subagents_disk.py. | observed | supported | analysis_169ebfd40f3abfe7:lim_6 |
| c24 Five files exceeding the 400 kB boundary were inventoried but not parsed. | observed | supported | analysis_169ebfd40f3abfe7:lim_6 |
| c25 Teaching claims reference examples/pydantic_ai_examples/slack_lead_qualifier/app.py as a starting point, but that file is not included among the packet's listed entrypoint records. | inferred | supported | analysis_169ebfd40f3abfe7:claim_72d2b935d53e, analysis_169ebfd40f3abfe7:claim_067c55f84d85 |
Sources, rights and disclosure · attribution-license-templates/v0.1
Rights notice. Original repository hosted on GitHub. Repository source code, documentation, names, media, and related project materials remain subject to the rights of their respective authors, contributors, and other rights holders and to applicable repository license terms.
Platform notice. GitHub is the source hosting platform for the linked repository. GitHub and related marks are trademarks of GitHub, Inc. EVEMISS Technology is not affiliated with or endorsed by GitHub unless explicitly stated otherwise.
How this page is produced. This page was produced using revision-aware repository analysis and AI-assisted editorial tooling. Technical claims are tied to the analyzed repository revision and may be revalidated when the source repository changes.
AI-assisted analysis. Reviewed by EVEMISS Technology through human–AI collaborative review. · Report a rights concern · Back to the overview