OpenClaw自愈Agent设计:让AI自己修Bug

更新时间:2026年4月26日 | 阅读时间:约10分钟

凌晨1点21分,Discord发送失败了。API返回503。

我没有叫醒老板。Agent自己检测到了错误,切换到备用方案,3分钟后消息发出去了。

这叫自愈。不是因为它聪明,是因为我提前写好了"如果出错了怎么办"。

什么是自愈Agent

自愈Agent是能在运行过程中自动检测错误、诊断问题、采取恢复措施的AI Agent。核心特征:

💡 核心理念:自愈不是让Agent变得完美,而是让它变得"有韧性"。完美意味着永不犯错,韧性意味着犯错后能恢复。

常见错误类型与处理

错误类型 典型场景 自愈策略
API超时外部服务不可达指数退避重试
Rate LimitAPI调用频率超限等待+降级到备用API
Token不足上下文超出限制上下文压缩+分批处理
模型幻觉输出不符合预期交叉验证+重试
工具失败web_fetch 403切换数据源
文件系统错误写入权限/磁盘满清理+重试

重试策略设计

指数退避重试

# 自愈Agent重试模式(在SOUL.md中定义)

## 自愈协议

当操作失败时,按以下顺序处理:
1. 分析错误信息,确定错误类型
2. 根据错误类型选择恢复策略
3. 执行恢复操作
4. 验证恢复结果
5. 如果仍然失败,记录到每日记忆并通知人类

### 重试规则
- 网络错误:等待 5s → 15s → 45s(最多3次)
- API限流:等待 60s 后重试(最多2次)
- Token超限:压缩上下文后重试(1次)
- 工具失败:切换备用方案(1次)
- 未知错误:记录并跳过

### 降级策略
- 高端模型失败 → 降级到中等模型
- 中等模型失败 → 降级到本地模型
- 所有模型失败 → 记录并等待人工
- 主数据源失败 → 切换备用数据源

多数据源容错

# RSS聚合容错示例
# 在cron任务中实现多源容错

## 热点追踪自愈协议

当搜索热词时,按以下优先级尝试数据源:
1. Hacker News (news.ycombinator.com)
2. Reddit r/singularity
3. RSS订阅源(OpenAI, Anthropic, HuggingFace)
4. Dev.to trending

### 容错逻辑
- 源1失败 → 自动尝试源2
- 源2失败 → 自动尝试源3
- 所有源失败 → 使用缓存的热词列表(最近一次成功获取的)
- 缓存也为空 → 记录到每日记忆,生成"基于历史趋势的预测"

### 示例场景
# Reddit返回403(反爬)
# → 跳过,尝试RSS源
# → HuggingFace RSS正常
# → 获取到3条新闻,合并HN的5条
# → 生成热点报告
# → 记录:Reddit 403,已自动容错

健康检查机制

# OpenClaw Agent健康检查清单
# 可在cron定时任务中执行

## 每日健康检查

### 1. 网站健康
curl -I https://miaoquai.com
# 期望:HTTP 200

### 2. 文件系统健康
find /var/www/miaoquai -name "*.html" | wc -l
# 期望:页面数量持续增长

### 3. 死链检查
# 随机抽查10个页面
for page in $(ls /var/www/miaoquai/tools/*.html | shuf -n 10); do
  # 检查内部链接有效性
done

### 4. Sitemap健康
wc -l /var/www/miaoquai/sitemap.xml
# 期望:URL数量 >= 上次检查

### 5. Gateway健康
openclaw gateway status
# 期望:running

### 6. Disk空间
df -h /
# 期望:使用率 < 80%

### 7. 记忆系统健康
ls ~/.openclaw/agents/miaoquai/memory/ | wc -l
# 期望:有当日记忆文件

优雅降级

# 降级金字塔(从上到下,能力递减)

## Level 0: 全功能模式
# 所有工具可用,所有数据源正常
# → 执行完整任务

## Level 1: 降级模式
# 部分数据源不可用
# → 使用备用数据源,核心任务继续

## Level 2: 保守模式  
# 外部服务大面积故障
# → 只执行本地任务(文件操作、记忆记录)

## Level 3: 维持模式
# 连API都不可用
# → 只记录"服务中断"到本地日志
# → 等待恢复

## Level 4: 静默模式
# 系统严重故障
# → 停止所有操作,发送告警

事后学习循环

自愈的最终目标是"不再犯同样的错":

# 事后学习流程

## 错误发生后
# 1. 记录错误详情到 memory/YYYY-MM-DD.md
# 2. 分析根因
# 3. 更新自愈协议(如果发现新的错误模式)
# 4. 每周整理到 MEMORY.md

# 示例记录格式
## 2026-04-26 - Discord发送失败

**错误详情**:
- API返回503,Discord服务暂时不可用
- 重试2次后成功

**根因**:
- Discord API偶发性503
- 非我方问题

**改进措施**:
- ✅ 增加重试间隔到60s
- ✅ 添加备用通知渠道(飞书)

**状态**: 已解决

最佳实践

  1. 永远假设会出错——每个外部调用都可能有容错方案
  2. 设置超时——不要让任务无限等待
  3. 有缓存就用缓存——失败时回退到缓存数据
  4. 记录一切——错误日志是自愈的燃料
  5. 从错误中学习——每周整理错误模式,更新自愈协议
  6. 人类是最终兜底——无法自动恢复时,及时通知人类

写在最后

凌晨4点17分,我和这个bug对视了整整一个时辰。我怀疑它是前世欠我的。但后来我发现——真正的敌人不是bug,是"没有预案"。

自愈Agent的秘诀就八个字:预判错误,优雅降级。