Pydantic AI 的发布节奏很快,2.67.0 到 2.68.0 只隔两天,而这一版把好几处「能跑但会悄悄改行为」的东西一起改了:run 内的审批与回答换成了 RequestInput、AskUser 被移到 deferred pipeline、harness 里一批标识符改了名、子 Agent 的事件也统一加了后缀。照着旧教程升级,代码不一定报错,但审批时序和事件字段会变。本教程按官方 v2.68.0 Release Notes 与 PyPI 元数据六步走完一次可回滚的升级:核对环境、锁版本升级、清理三处改名、迁移审批链路、验会话与模型回退、最后做持久委派与回归验收。所有命令都能直接跑,涉及具体函数签名的地方会明确标注「官方文档为准」,不臆造 API。
2.68.0 并过兼容性检查的 Python 开发者。前置准备:Python 3.11 或更新(PyPI 元数据为 >=3.11)、一个独立的虚拟环境、可回滚的 git 分支、现有项目的测试与一小批固定输入的回归用例;如果要验 Temporal 或 DBOS 子工作流,还需对应服务与额外依赖。模型的 API Key 由你的 provider 配置提供,请放在环境变量或密钥管理里,别写进提交到仓库的配置文件,升级后的回归跑批会产生真实费用。先看清:这一版改了什么,哪些是兼容性变更
官方 Release 页把 2.68.0 的条目分成 Compatibility Notes、Features、Bug Fixes 与 Dependencies 四组,升级前先读 Compatibility Notes。这里只挑与迁移直接相关的三类,后面的步骤按这个顺序处理。
| 变更组 | 官方条目里的名字 | 迁移时怎么处理 |
|---|---|---|
| harness 标识符 | num_results → max_results;max_duration_secs → max_duration_seconds | 全局搜索并替换,旧名不在这一批保留别名 |
| 事件字段与命名 | CapabilityEvent 字段改为 *_count / *_name / duration_ms / previous_item;outliers 改为 <Subject><PastParticiple>Event;新增 STEP_PERSISTENCE_EVENTS | 改消费事件的代码与日志解析,旧字段名保留 deprecated aliases |
| 子 Agent 事件 | 任务控制事件加 Event 后缀与过去分词命名,新增 agent_name / parent_task_id 字段 | 改订阅方;旧事件名保留 deprecated aliases |
| run 内交互 | 新增 RequestInput;AskUser 移到 deferred pipeline;deferred calls 标记 kind 与 answered_by | 调整审批时序与回放逻辑 |
两个口径先说清:① 该 Release 的 tag_name 是 v2.68.0、标题写 v2.68.0 (2026-11-11),而 published_at 是 2026-11-12,第三方版本站大多按 11 月 12 日记,别据此判断装错了包;② prerelease 为 false,这是正式版。同期的 OpenAI Agents SDK 0.24.0-alpha.7 才是 preview,两者别混。Release Notes 只列条目与 PR 编号,没有给函数签名和最小示例,本教程凡是涉及具体 API 的地方都只给「名称 + 可运行的核对命令」,用法请查官方文档与 API 参考。
Step 1:锁定当前版本与运行环境,留好回滚点
在一个独立的虚拟环境里操作,先把当前版本、Python 版本、依赖清单和测试结果留档。这样后面出现行为变化时,能分清是升级引入的还是原本就有。
# 确认 Python 版本满足 PyPI 元数据里的 >=3.11
python --version
# 记录当前安装的 pydantic-ai 版本与依赖
python -m pip show pydantic-ai
python -m pip freeze > requirements-before.txt
# 留一个可回滚的 git 状态
git status --short
git log -1 --oneline
git checkout -b upgrade-pydantic-ai-2680
# 升级前先跑一遍现有测试,保存基线输出
python -m pytest -q > pytest-before.log 2>&1
python -m pip show pytest
python -m pip 比直接敲 pip 更稳:它用的是当前虚拟环境里的解释器。若项目用 uv 或 Poetry,把 pip freeze 换成对应的锁文件快照,回滚时按同一套工具还原。Step 2:锁版本升级,按需装 extras
PyPI 上 pydantic-ai 2.68.0 要求 Python >=3.11,wheel 是 py3-none-any。官方提供的 extras 里与本次验证直接相关的是 ui、temporal、dbos、ag-ui、mcp-tasks,按你要验的功能选,不要一次全装。
# 只升级 pydantic-ai 到 2.68.0(pip)
python -m pip install --upgrade "pydantic-ai==2.68.0"
# 需要验会话存取与持久委派时,按需选 extras
python -m pip install --upgrade "pydantic-ai[ui,temporal]==2.68.0"
# 或验 DBOS 子工作流:python -m pip install --upgrade "pydantic-ai[dbos]==2.68.0"
# uv 项目的等价写法
uv add "pydantic-ai[ui,temporal]==2.68.0"
# 核对装上的确实是 2.68.0
python -m pip show pydantic-ai
python -c "import importlib.metadata as m; print(m.version('pydantic-ai'))"
# 把新版本写进依赖文件,避免 CI 里漂到别的版本
python -m pip freeze > requirements-after.txt
git diff requirements-before.txt requirements-after.txt
别用不带版本约束的批量升级:这一版还把 genai-prices 的下限提到 0.2.3(让 Anthropic fast mode 按 fast mode 费率计价),顺带更新了一批 provider 行为;一次 pip install -U -r requirements.txt 会把无关依赖一起抬上去,出问题时很难定位。先用固定版本跑通,再考虑放开约束。extras 会引入 Temporal、DBOS 等额外依赖与运行服务,只在确实要验子工作流时装。
Step 3:清理三处改名,别指望 deprecated aliases
官方在 Compatibility Notes 里明确列出三组改名。用仓库级搜索把旧标识符、旧字段和旧事件名找出来,逐处改到新名,然后重跑解析事件与读日志的测试。
# 在仓库根目录搜旧标识符(Linux / macOS / WSL)
grep -R -n -E "num_results|max_duration_secs" --include="*.py" .
grep -R -n -E "CapabilityEvent|previous_item|duration_ms" --include="*.py" .
grep -R -n -E "agent_name|parent_task_id|STEP_PERSISTENCE_EVENTS" --include="*.py" .
# 改名对照(来自官方 Compatibility Notes)
# pydantic_ai_harness:
# num_results -> max_results
# max_duration_secs -> max_duration_seconds
# CapabilityEvent 字段:
# -> *_count / *_name / duration_ms / previous_item
# CapabilityEvent outliers:
# -> <Subject><PastParticiple>Event,另新增 STEP_PERSISTENCE_EVENTS
# 子 Agent 任务控制事件:
# 加 Event 后缀与过去分词名,新增 agent_name 与 parent_task_id
# 改完做一次语法级自检与测试
python -m compileall -q .
python -m pytest -q
「旧名保留 deprecated aliases」不等于不用改:官方只对 CapabilityEvent 字段与子 Agent 事件名写了保留别名,harness 里那两个缩写标识符是「拼写展开」,条目里没有别名承诺。而且持久化过的历史事件数据仍是旧字段,回放、审计报表与日志解析要按新旧两套都能读来写。把别名当成过渡窗口,别当成长期兼容。
Step 4:把审批与回答迁到 RequestInput
这是这一版最影响行为的一条:官方新增 RequestInput,让 run 内直接请求审批与回答,同时把 AskUser 放到 deferred pipeline,并给 deferred calls 加上 kind 与 answered_by 标记。同版还修了「durable execution 里记住的 Permissions 审批未生效」的问题,并允许从 workflow signal 触发的 CancellationToken 取消 Temporal durable run。
# 核对包里确实存在官方提到的名字(只查属性,不臆造导入路径)
python -c "import importlib; m=importlib.import_module('pydantic_ai'); print([n for n in ('RequestInput','AskUser','OutputTokenLimitExceeded','ConversationStore','ModelFallback') if hasattr(m,n)])"
# 在项目里定位旧的审批写法
grep -R -n -E "AskUser|approval|Permissions|deferred" --include="*.py" .
# 官方条目里与这条链路相关的名字(逐项对照文档)
# RequestInput —— 在 run 内请求审批与回答
# AskUser —— 已移到 deferred pipeline
# kind / answered_by —— deferred calls 的标记字段
# CancellationToken —— 可从 workflow signal 取消 Temporal durable run
# PromptInjectionDefender —— 语义分类改为 durable operations,便于在 Temporal 上跑
# 用固定输入跑一条「需要人工批准」的回归用例
python -m pytest -q -k approval
Release Notes 没有给 RequestInput 的构造函数、参数与调用示例,本教程不编造可运行代码。请按官方文档与 API 参考里的签名改写项目代码;上面那条 importlib 命令只用来核对名字在你装的版本里确实存在。另外 AskUser 转到 deferred pipeline 会改变审批出现的时机,先在测试环境用小样本验证再上生产。
Step 5:验会话存取、模型回退与其他新能力
Features 组里与日常工程最相关的是 ConversationStore(通过 conversation_store 让 UI adapter 加载与保存会话)、OutputTokenLimitExceeded 与 ModelFallback 在响应被 max_tokens 截断时回退下一个模型,以及 RefineOutput harness capability。其余条目按项目是否用到逐项核对。
# 官方 2.68.0 特性清单(逐项确认是否影响你的项目)
# ConversationStore / conversation_store —— UI adapter 会话加载与保存
# OutputTokenLimitExceeded —— 响应在 max_tokens 处被截断
# ModelFallback —— 截断时回退到下一个模型
# RefineOutput —— 新增 harness capability
# GoogleDecisionsModel —— Gemini Decisions API 后端
# GoogleModel / BedrockConverseModel —— 用 AI Gateway 的流式成本
# Workspace.run —— 支持按命令指定 cwd
# DelegationTasks.discover() —— 发现委派任务
# 单个损坏任务不再阻塞 opened()
# workspace backends —— 必须让 detached processes 继续运行
# 并在 WorkspaceBackendSuite 里检查
# 回退链是否生效:用超短 max_tokens 触发一次,观察是否切到下一个模型
# 具体配置写法查官方文档;先在测试环境跑,别用生产 prompt
python -m pytest -q -k fallback
# 记录升级后的依赖与测试结果
python -m pip freeze > requirements-after.txt
python -m pytest -q > pytest-after.log 2>&1
git diff --stat
回退不是免费的:ModelFallback 在截断时切到下一个模型,意味着一次任务可能产生多次模型调用,费用与延迟都要重新量。官方还把 genai-prices 下限提到 0.2.3 以正确计价 fast mode,成本口径会跟着变。另外 GoogleDecisionsModel 对应 Gemini Decisions API,需要相应服务与凭据;Workspace.run 新增按命令 cwd,涉及路径的旧脚本要复查。
Step 6:持久委派、回归验收与回滚预案
官方支持把 SubAgents 的委派作为 Temporal 与 DBOS 的 child workflows 运行,并给子 Agent 任务控制事件补了 agent_name、parent_task_id 字段。这属于需要额外服务的能力,放在最后验;验之前先把不需要外部服务的回归跑完。
# 回归清单(逐条过一遍,别只看 pytest 退出码)
# 1. 三处改名已全局替换,事件解析兼容新旧字段
# 2. 需要批准的用例:批准前暂停、批准后继续、中断恢复不重复副作用
# 3. 会话能被保存并重新加载(用 ConversationStore 相关用例)
# 4. 超短 max_tokens 能触发截断回退,且费用在预算内
# 5. 一批固定输入的 golden traces 与升级前输出逐项对照
# 6. 用到 Temporal / DBOS 时,子工作流能启动、能取消、能完成
# 汇总对比
python -m pytest -q
git diff pytest-before.log pytest-after.log
git diff requirements-before.txt requirements-after.txt
# 回滚预案:按升级前快照还原(示例,按你项目的依赖工具调整)
# git checkout upgrade-pydantic-ai-2680^ -- requirements.txt
# python -m pip install -r requirements-before.txt
交付前自查:本教程的版本号、兼容性条目、特性名与字段来自 pydantic/pydantic-ai 官方 v2.68.0 Release Notes(GPG 已验证的正式版),Python 版本、extras 名称与 wheel 信息来自 PyPI pydantic-ai/2.68.0/json。Release Notes 不提供 API 签名与完整示例,凡涉及具体调用写法请查官方文档;项目迭代很快,命令、字段与默认行为以你使用当天的官方文档为准。升级与回归跑批都会产生真实模型费用,接 Temporal / DBOS 还需额外服务与凭据。任何落地改动都请自行审 diff、复跑测试并留好回滚路径后再提交。
做到哪一步算成功
六条验收都过,才算这次升级收口了:① importlib.metadata.version('pydantic-ai') 返回 2.68.0,且依赖文件里写死了版本;② 仓库里搜不到 num_results 与 max_duration_secs,事件解析对旧字段与新字段都能读;③ 审批用例验证了「批准前暂停、批准后继续、恢复不重复副作用」;④ 会话保存后能重新加载,超短 max_tokens 能触发 ModelFallback 回退且费用在预算内;⑤ 一批固定输入的输出与升级前基线逐项对照过,差异都能解释;⑥ 回滚命令在测试环境演练过,确认能从快照还原。做到这些,再把改动合进主分支并更新团队的升级记录。
常见问题速查
| 你遇到的现象 | 大概率原因与处理 |
|---|---|
| 装完版本不是 2.68.0 | 依赖解析被别的包约束住;用 pip show 查冲突,或换独立虚拟环境验证 |
| 标题写 11 日、发布日期写 12 日 | Release 标题按版本日期命名,published_at 是实际发布时间;以 tag_name 与 PyPI 版本为准 |
| 升级后日志解析报错 | CapabilityEvent 字段与子 Agent 事件名改了;改消费方并兼容新旧字段 |
| 旧参数还能跑,是不是不用改 | 官方只对部分名字保留 deprecated aliases,harness 那两个缩写标识符没有别名承诺,建议全部替换 |
| 审批环节时序变了 | AskUser 已移到 deferred pipeline,用 RequestInput 重写;按官方文档核对签名 |
| 模型费用比升级前高 | ModelFallback 截断回退会多调用一次模型,且 genai-prices 下限提到 0.2.3 改变计价口径 |
| Temporal 上子工作流启动失败 | 核对是否装了 temporal extra 并起好服务;本版才支持把 SubAgents 委派作为 child workflows |
| 官方文档找不到某个名字 | 本教程只列 Release Notes 中的条目名;用 hasattr 命令核对后,再去 API 参考查实际用法 |
| 把 2.68.0 当成 preview 了 | 该 Release 的 prerelease 为 false;同期的 OpenAI Agents SDK 0.24.0-alpha.7 才是预览版 |