ai / 20260727
11. Agent 的错误应该在哪一层处理
同样表现为任务失败,403、参数越界、工具退出和模型格式错误需要不同处理
本次测试中,Claude Code 请求返回 403,Grok 返回 402。两者都没有进入工具调用。如果只记录 task_failed,这两条轨迹会与本地命令失败混在一起。
先按失败发生的位置分类
| 层级 | 示例 | 首选处理 |
|---|---|---|
| 模型服务 | 限流、服务端异常 | 按退避策略重试 |
| 认证与组织 | 401、403 | 修正配置,不循环重试 |
| 额度 | 402 或额度不足 | 提示用户处理账户状态 |
| 协议解析 | 响应结构不合法 | 保存原始响应,有限重试 |
| 参数校验 | 缺字段、类型错误 | 把结构错误反馈给模型 |
| 权限 | 资源未授权 | 请求确认或停止 |
| 工具执行 | 文件不存在、退出码非零 | 依据工具语义处理 |
| 结果回填 | 内容过大、序列化失败 | 截断、引用或修复编码 |
错误层级决定谁有能力修复。模型不能通过换一种措辞修正账户额度;执行器也不能通过重启进程修正一个缺失的工具参数。
重试还要判断是否可恢复
指数退避是让每次重试等待时间逐步增加的策略,适合临时限流和服务端异常。它不适合权限拒绝、参数确定错误或额度不足。
| 错误性质 | 是否自动重试 |
|---|---|
| 临时且无副作用 | 可以,设置次数和总时间 |
| 参数可由模型修正 | 回填一次结构化错误 |
| 需要用户授权 | 等待用户,不计作模型重试 |
| 外部状态未知 | 先查询 |
| 配置或账户错误 | 停止并给出证据 |
错误要保留机器字段与可读说明
工具只返回“失败了”,模型无法决定下一步;只返回原始堆栈,又会增加上下文并暴露内部路径。日志与模型回填可以分层:
- 日志保存错误类型、原始信息、调用标识、耗时和重试计数。
- 模型收到稳定错误码、必要说明和允许的下一步。
- 用户看到影响、可执行处理和相关证据。
三种受众需要的信息不同。
部分失败不能抹掉成功结果
并行调用中,一个成功、一个失败,应保存两项独立状态。模型可以利用成功结果继续完成部分任务,运行时也只需重试失败项。
若聚合层把整个批次改成失败,已完成动作会丢失,并可能在重试时重复执行。
失败也要有终止条件
每项任务应限制:
- 模型总轮次。
- 单工具重试次数。
- 总运行时间。
- 总 Token。
- 连续同类错误次数。
达到上限后进入明确终态,并说明哪一步未完成。没有终止条件的 Agent 循环会把确定性错误变成持续消耗。
Claude Code 与 Grok 的本次失败告诉我的不是产品能力高低,而是错误分层的重要性:两条请求都到达服务端,却停在不同账户或组织检查位置。比较最终答案之前,先确认轨迹是否进入了同一阶段。
版权声明: 如无特别声明,本文版权归 sshipanoo 所有,转载请注明本文链接。
(采用 CC BY-NC-SA 4.0 许可协议进行授权)
本文标题:11. Agent 的错误应该在哪一层处理
本文链接:https://www.sshipanoo.com/blog/ai/agent-runtime-lab/11-Agent错误分层/