Agent 对”权限不足”错误重试了 5 次,花了 30 秒——每次重试都一样失败。为什么?工具返回 isError: true 但没有 errorCategory 或 isRetryable 字段。没有分类,agent 对所有错误都套用默认重试策略,包括永久性的。
四种错误类型及恢复路径
| 类型 | 示例 | isRetryable | Agent 动作 |
|---|---|---|---|
| 瞬时性 | 超时、限流、服务过载 | true | 短暂等待,带退避重试 |
| 校验性 | 格式错误、缺字段、无效参数 | true(修复后) | 修正具体输入,重试 |
| 业务性 | 退款超限、账户暂停、策略违规 | false | 向用户解释,升级 |
| 权限性 | 访问拒绝、权限不足、凭证过期 | false | 升级,请求授权 |
为什么 agent 重试权限错误
没有 errorCategory 和 isRetryable,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 实现智能恢复。