K2.2.2 Task 2.2

没有分类,Agent 在权限错误上浪费 5 次重试

Agent 对”权限不足”错误重试了 5 次,花了 30 秒——每次重试都一样失败。为什么?工具返回 isError: true 但没有 errorCategoryisRetryable 字段。没有分类,agent 对所有错误都套用默认重试策略,包括永久性的。

四种错误类型及恢复路径

类型示例isRetryableAgent 动作
瞬时性超时、限流、服务过载true短暂等待,带退避重试
校验性格式错误、缺字段、无效参数true(修复后)修正具体输入,重试
业务性退款超限、账户暂停、策略违规false向用户解释,升级
权限性访问拒绝、权限不足、凭证过期false升级,请求授权

为什么 agent 重试权限错误

没有 errorCategoryisRetryable,agent 没有信号知道错误是永久性的。它的默认策略(带退避重试)是为瞬时性错误设计的——最常见的类型。所以它什么都重试,包括:

  • 权限错误(不换凭证永远不会成功)
  • 业务规则违规(不做策略例外永远不会成功)
  • 用同样错误输入的校验错误(每次都一样失败)

修复:errorCategory: "permission"isRetryable: false → agent 立即停止重试并升级。

瞬时性:带退避重试

数据库超时、限流、服务过载。服务暂时不可用但会恢复。标记为 transient + retryable → agent 短暂等待然后重试。92% 的瞬时性错误带结构化元数据自动恢复(vs 通用错误的 15%)。

不要和以下混淆:校验错误(输入有问题,不是服务问题)、权限错误(访问被拒,不是暂时过载)。

校验性:修输入再重试

日期格式错误(“15th of March, 2024”而不是 ISO 8601)、缺必填字段、无效参数值。输入有错。标记为 validation + retryable → 但 agent 必须先修输入。

最好的校验错误包含字段级详情:哪个字段失败了、期望什么格式、收到了什么、正确格式的示例。“date 字段必须是 ISO 8601(YYYY-MM-DD),收到 ‘15th of March, 2024’,请转换为 ‘2024-03-15’” 能实现一次重试就纠正。

业务性:解释并升级

退款超 $500 限额、账户暂停、产品停产。业务规则阻止了操作。标记为 business + non-retryable → agent 向用户解释约束,需要时升级。

包含面向用户解释的 customerMessage 和指示 agent 下一步的 suggestedAction

权限性:立即升级

权限不足、API key 过期、未授权操作。标记为 permission + non-retryable → agent 升级到有所需授权的人。零次重试——同样的凭证每次都会失败。


一句话总结: 没有错误分类,agent 默认重试一切(在永久性错误上浪费 5 次尝试)——分类为 transient(重试)、validation(修输入)、business(解释/升级)或 permission(立即升级),配合 isRetryable 实现智能恢复。