Pydantic AI 的核心理念是将整类错误从运行时前移到编写时。通过 Pydantic 模型定义 Agent 的输入、输出和工具参数,开发者的 IDE 和类型检查器能够在编码阶段发现类型不匹配问题,获得类似 Rust 的"if it compiles, it works"的安全感。
框架支持几乎所有主流模型提供商,包括 OpenAI、Anthropic、Google Gemini、DeepSeek、Grok、Cohere、Mistral、Perplexity,以及 Azure AI Foundry、Amazon Bedrock、Ollama 等 30 余个。切换模型只需修改一个字符串,无需改动业务代码。
Pydantic AI 内置结构化输出验证、自动重试、持久化执行、可观测性集成等生产级特性。v1 版本于 2025 年 9 月发布并承诺 API 稳定,v2 版本于 2026 年 6 月发布,引入 Capabilities 机制重构扩展体系。
Agent 是 Pydantic AI 与 LLM 交互的主要接口,可视为以下组件的容器:
v2 版本引入的核心原语,将 Agent 的指令、工具、生命周期钩子和模型设置捆绑为单一可组合单元。一个 Capability 可以是一个记忆系统、一个护栏、一个编码工具包,通过一个概念触及 Agent 的每一层。
官方提供的即用型 Capabilities 库,包含代码执行、文件访问、护栏、子 Agent 编排等功能,开发者可按需选择构建编码 Agent、研究助手等应用。
Agent 循环的核心逻辑已趋于稳定:调用模型、执行工具、将结果反馈给模型。Pydantic AI 提供五种运行方式:
agent.run():异步函数,返回包含完成响应的 RunResultagent.run_sync():同步函数,内部调用 run()agent.run_stream():异步上下文管理器,支持流式输出agent.run_stream_sync():同步版本的流式运行agent.iter():返回 AgentRun,可遍历底层 Graph 的节点当模型决定调用工具时,Pydantic AI 自动执行工具函数、验证参数、将结果追加到消息历史,并继续循环。整个过程对开发者透明,只需通过 @agent.tool 装饰器注册工具函数。
每次运行结束时,Pydantic AI 根据 Agent 定义的 output_type 验证模型输出。验证失败时,框架将错误信息反馈给模型并要求重试,重试次数可通过 retries 参数配置。
一个 Capability 捆绑 Agent 的指令、工具、生命周期钩子和模型设置,使整个扩展(如记忆系统、护栏、编码工具包)能够通过一个概念触及 Agent 的每一层。
from pydantic_ai import Agent
from pydantic_ai.capabilities import Capability, Thinking, ToolSearch, WebSearch
agent = Agent(
'anthropic:claude-opus-4-7',
instructions='Research thoroughly and cite your sources.',
capabilities=[
Thinking(effort='high'),
WebSearch(),
ToolSearch(),
Capability(
id='github',
description='Look up GitHub issues, pull requests, and code.',
instructions='Use the GitHub tools when a question is about a repository.',
toolset=MCPToolset('https://mcp.example.com/github'),
defer_loading=True,
),
],
)标记 defer_loading=True 的 Capability 在模型需要之前不会出现在提示中。模型只在紧凑目录中看到一行描述,然后在决定使用时才一次性加载整个捆绑包(包括指令和工具)。
Capabilities 通过钩子读取和重写模型在每一步看到的内容,包括其工具、指令和消息历史。代码模式和工具搜索都基于相同的公共钩子构建。
开发者通过 output_type 参数指定 Pydantic 模型作为 Agent 的输出类型。框架会根据该模型生成 JSON Schema,并将其嵌入 LLM 请求中,利用各提供商的原生结构化输出机制(如 OpenAI 的 response_format、Anthropic 的工具调用接口)。
LLM 返回原始响应后,Pydantic AI 根据 JSON Schema 对其进行验证,包括类型检查、字段约束和枚举成员资格验证。验证失败时,框架将错误信息反馈给模型并要求重新生成。
验证失败触发自动重试,重试次数可通过 Agent(retries={'output': N}) 配置。每次重试消耗一个输出重试预算单位,直到达到上限或验证成功。
Pydantic Graph 使用类型提示定义节点和边,每个节点的 run 方法显式声明返回类型(即下一个可能的节点),使图结构在定义时即可验证。
from pydantic_graph import Graph, BaseNode, End
from dataclasses import dataclass
@dataclass
class ConversationState:
user_name: str | None = None
interests: list[str] = field(default_factory=list)
@dataclass
class GreetUser(BaseNode[ConversationState]):
async def run(self, ctx: GraphRunContext[ConversationState]) -> 'AskName':
print("Hello! Welcome to our recommendation system.")
return AskName()
@dataclass
class AskName(BaseNode[ConversationState]):
async def run(self, ctx: GraphRunContext[ConversationState]) -> 'AskInterests':
name = input("What's your name? ")
ctx.state.user_name = name
return AskInterests()
# 定义图
conversation_graph = Graph(
nodes=[GreetUser, AskName, AskInterests, GenerateRecommendations, SayGoodbye],
state_type=ConversationState,
)Graph 支持状态持久化,允许工作流在任意节点暂停并从断点恢复。这对于长时间运行的工作流和人机交互场景尤为重要。
Graph 节点内部可以嵌入 Pydantic AI Agent,实现 AI 驱动的工作流节点。每个步骤都可以调用 Agent 进行结构化输出处理。
Web Search 通过 WebSearchTool 实现,作为 NativeTool 传递给模型的 Capabilities 列表。与常见的自定义工具不同,原生工具由模型提供商的基础设施直接执行。
可以通过包装函数根据运行上下文动态配置 WebSearchTool,例如根据用户位置设置搜索参数,或在无位置信息时禁用该工具。
Tool Search 允许 Agent 按需发现工具,而不是在提示中列出数百个工具。当工具数量庞大时,这能显著减少 Token 消耗并提高模型选择工具的准确性。
与 defer_loading 的 Capability 类似,Tool Search 只在模型决定需要时才加载工具定义。模型首先看到紧凑的工具目录,然后在需要时加载完整工具信息。
Tool Search 作为内置 Capability 提供,可与其他 Capabilities 组合使用。它基于与用户自定义 Capabilities 相同的公共钩子构建。
部分提供商暴露内置压缩 API,Pydantic AI 将其封装为 Capabilities:
通过 history processor 包装为 ProcessHistory capability,可在任何模型上实现上下文管理:
Harness 提供一系列即用型模型无关压缩策略,包括零 LLM 历史编辑(滑动窗口修剪、清除旧工具结果、去重重复文件读取、钳制过大的消息部分)和 LLM 摘要,以及 TieredCompaction 编排器,仅在需要时从廉价策略升级到昂贵策略。
持久化执行使 Agent 运行能够在进程崩溃、机器重启或长时间等待后从上一个完成的步骤恢复,而不是从头开始。通过检查点记录每个步骤,在恢复时重放或重新加载状态。
Pydantic AI 原生支持四种持久化执行解决方案:
通过附加对应的 Durability capability 即可启用持久化执行:
from pydantic_ai import Agent
from pydantic_ai.durable_exec.temporal import TemporalDurability
agent = Agent(
'openai:gpt-5.6-sol',
instructions='Research the topic and write a structured brief.',
capabilities=[WebSearch(), WebFetch(), TemporalDurability()],
)Pydantic AI 内置对 Logfire 的支持,只需两行代码即可启用:
import logfire
logfire.configure()
logfire.instrument_pydantic_ai()每次 Agent 运行生成一个 trace,包含:
Pydantic AI 的检测功能使用 OpenTelemetry,可发送到任何 OTel 后端。Logfire 是基于 OTel 构建的商业平台,提供慷慨的免费套餐。
最简单快速的测试方式,不调用真实 LLM,而是根据工具 schema 生成有效的结构化数据。默认会调用 Agent 中的所有工具,然后返回纯文本或结构化响应。
from pydantic_ai.models.test import TestModel
with agent.override(model=TestModel()):
result = agent.run_sync('Hello')
assert isinstance(result.output, str)用于更复杂的测试场景,允许定义自定义响应逻辑:
from pydantic_ai.models.function import FunctionModel, ModelContext
from pydantic_ai.messages import ModelResponse, TextPart
def custom_model_function(messages: list, info: ModelContext) -> ModelResponse:
return ModelResponse(parts=[TextPart(content='Custom response')])
with agent.override(model=FunctionModel(custom_model_function)):
result = agent.run_sync('Any query')设置 ALLOW_MODEL_REQUESTS=False 全局阻止对非测试模型的请求,防止测试中意外产生 API 费用。
由于完全基于 Python 类型提示,IDE 能够提供自动补全、类型检查和重构支持。工具名称拼写错误会在运行前被编辑器标红。
Pydantic AI 只有约二十个公共概念,无全局状态,无回调注册表,工具调用在各提供商间统一抽象。开发者可以在一个下午读完源代码并预测每行代码的行为。
通过 Logfire 可以可视化 Agent 运行的完整流程,包括模型调用、工具调用、重试记录。SQL 查询方式比自定义查询语言更易于调试生产问题。
Pydantic AI 将类型安全作为一等公民,输出验证内置且默认启用。LangChain 的输出解析器存在但可选,且经常被绕过。
LangChain 拥有 700+ 预构建集成,覆盖向量库、文档加载器、记忆系统等。Pydantic AI 覆盖主流提供商,集成数量较少但增长迅速。
熟悉 Pydantic 或 FastAPI 的开发者可以几乎零学习成本上手 Pydantic AI。LangChain 入门简单但深度陡峭,需要理解 LCEL、runnable 协议和大量 API 表面。
Pydantic AI 专为生产可靠性设计,通过强制类型安全和验证输出来减少运行时错误。LangChain 通过 LangGraph 在大规模部署中得到验证,在 Klarna、Uber、Elastic 等公司有实际应用。