
工具失败不是异常情况。
在真实 Agent 系统里,它是常态。
Shell 会超时。
Browser 会遇到登录、2FA、captcha。
文件会不存在。
模型会传错参数。
外部 API 会 429。
所以一个成熟的 OpenClaw 工作流,不应该假设工具总会成功,而应该有一套失败处理策略。
不要看到失败就立刻重试。
先分类:
临时失败
网络抖动、429、服务暂时不可用
参数失败
路径错、selector 错、参数缺字段
权限失败
approval 未通过、tool policy 拒绝、sandbox 看不到文件
状态失败
页面未加载、session 过期、进程等待输入
危险失败
可能破坏数据、重复提交、误删文件、发送到错误 channel
分类以后再决定:
retry
recover
rollback
ask human
report risk
stop
适合重试:
短暂网络错误
可幂等的读取
临时 5xx
页面加载偶发超时
provider 短重试
不适合盲目重试:
支付
发消息
删除
迁移数据库
提交表单
触发生产部署
因为重复执行可能造成真实副作用。
官方 retry policy 也强调:按请求重试,避免重复非幂等操作。
很多失败不是需要重试,而是需要恢复。
例如 Browser stale ref:
旧 snapshot 里的 ref 失效
↓
重新 snapshot
↓
找新的 ref
↓
再尝试一次
例如 shell 路径错误:
command failed: file not found
↓
pwd / ls / rg 确认路径
↓
用正确 workdir 重跑
这比“原样重试三次”聪明得多。
工具失败后,如果已经改变了文件或系统状态,要考虑回滚。
常见策略:
文件修改
使用 apply_patch,保留 diff,必要时反向 patch
代码改动
先看 git diff,再决定撤回哪一部分
生成文件
删除或标记临时产物
外部系统
如果没有可靠撤销 API,不要假装能 rollback
回滚不是“把一切恢复到过去”这么简单。
特别是外部系统、数据库、消息发送、支付、部署,很多动作不可逆。此时正确做法是停止、报告风险、请求人工处理。
应该问人的场景:
执行破坏性 shell 命令
approval policy 要求确认
Browser 遇到登录、2FA、captcha
要发送敏感数据到群聊
要删除、覆盖或迁移重要文件
要进行生产部署或付款
无法确定用户真实意图
人工确认不是 Agent 的失败,而是安全设计的一部分。
当工具失败或只完成部分工作时,最终回复要说明:
完成了什么
哪里失败
失败原因是什么
有没有副作用
是否重试过
是否需要人工确认
下一步建议
不要说:
已完成。
如果实际上只是:
已打开网页,但下载失败。
已生成报告,但没有成功发送。
已修改文件,但测试未通过。
OpenClaw 的 trajectory capture 可以作为每个 session 的 flight recorder。它记录 prompt、tool calls、runtime events、模型、插件、usage、错误等结构化时间线。
当你需要回答:
模型为什么调用这个工具?
哪个工具失败了?
上下文里到底有什么?
fallback 有没有发生?
可以考虑导出 trajectory bundle。
这让失败不只是“感觉上出错了”,而是可以被复盘。
用户说:
帮我清理项目里的临时文件。
Agent 不能直接:
rm -rf *
合理流程:
1. 先列出候选文件
2. 区分 build artifact、cache、用户文件
3. 给出将删除清单
4. 需要时请求确认
5. 执行可回滚或低风险删除
6. 保留日志
7. 报告删除了什么、跳过了什么
如果删除失败,应该说明哪个文件失败、为什么失败,而不是继续扩大范围。
不对。要先判断是否幂等和是否安全。
不能这么粗暴。回滚要针对本次变更,而且不能撤掉用户已有修改。
不是。它让自动化可以进入更高风险场景。
不够。要给证据、影响范围和下一步。
工具失败处理,是 Agent 可靠性的核心。
一句话总结:
可重试的才重试,可撤销的才回滚,高风险的先确认,不确定的要透明报告。
下一部分进入 Skill、MCP 与插件扩展:我们会从“如何使用 OpenClaw Skill”继续讲到如何自己写 Skill、接 MCP、做插件。