本次测试中,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错误分层/