模型输出不合法不一定要崩溃
OpenAI Agents Python v0.17.8 昨天合并了一个新 pattern:invalid_final_output recovery handler。当模型输出的结构化数据(Pydantic model)校验不过时,不再只有 ModelBehaviorError 一条路,而是可以注册一个 handler 返回合法的 fallback,让整个 run 继续正常结束。
这个 handler 能拿到错误类型(malformed non-empty vs empty output)、原始模型输出和目标 schema,但不能拿请求上下文——设计上就是纯输出修复,不是重启。它也明确不重试模型请求也不回放工具副作用,因为 tool side effect 重复是不可接受的。返回的 fallback 会走正常的 guardrails、hooks、streaming events 和 session persistence 链路——是完全一等公民的 terminal output。
工程含义很直白:structured output 失败是 Agent 系统的常态,不是异常。Schema 越复杂越细,模型越容易在边界上输出不合规内容(字段缺失、类型错误、枚举外值)。把这种失败建模成可恢复信号(而不是 raise),意味着:调度器不需要为每个 Agent 调用包一层 try/except、审批流程不会因为一次校验失败打断、log 里的 error 级别条目变少。OpenAI 自己还做了 error-kind dispatch,防止无关的 ModelBehaviorError 被意外捕获——不是所有校验失败都走同一个 handler。
对于做 Agent 平台(比如 OPC)来说,这个 pattern 启示了一个更通用的契约:terminal output 应该有 on_invalid / on_empty / on_timeout 分层恢复钩子,每个钩子明确只承诺「修复输出」而不承诺「重做执行」。恢复钩子和工具执行之间应该有 clear boundary,避免 side effect 重复。
问问自己:你 Agent 跑 1000 次 structured output,有多少次会因为模型「差一点点就合规」而丢掉了整个结果?