错误恢复
Myrm 错误恢复确保 Agent 在网络故障、模型宕机、限流与意外错误时自动持续运行,无需用户介入。14 层恢复架构
| 层 | 机制 | 处理场景 |
|---|---|---|
| L1 | 流恢复 | LLM 流式传输中断 — Token 级精确续传 |
| L2 | 连续流恢复 | 连续流失败 — 多中断间保持上下文 |
| L3 | 熔断器 | 模型提供商宕机 — 3 级冷却(auth 30min / permanent 10min / transient 1min)+ 半开探测 |
| L4 | 回退预设 | 提供商故障转移 — 预设备用模型链 |
| L5 | Agent 恢复 | 工具执行失败 — 自动重规划替代策略 |
| L6 | 截断恢复 | 响应被截断 — 本地 JSON 修复 + 渐进输出预算提升(2x→3x→4x)自动重试 |
| L7 | 辅助模型防护 | 小模型安全 — 摘要前动态截断消息防崩溃 |
| L8 | 确定性回退 | 无 LLM 安全网 — 规则摘要防死锁 |
| L9 | 图片自动缩放 | 超限图片 — 自动重编码压缩 |
| L10 | 媒体拒绝恢复 | 模型拒收媒体 — 移除媒体仅文本重试 |
| L11 | 思考签名恢复 | 思考模式签名错误 — 关闭思考模式重试 |
| L12 | 长上下文档切换 | 超标准窗口 — 自动切长上下文模型变体 |
| L13 | 空响应恢复 | 模型返回空白 — 调参重试 |
| L14 | Grace-Call 摘要 | 达迭代上限 — 最后一次无工具 LLM 调用生成结构化摘要,用户不见空白 |
熔断器
防止模型提供商宕机时级联失败:状态
错误分类
| 错误类型 | 冷却 | 恢复策略 |
|---|---|---|
auth | 30 分钟 | 检查凭证,尝试其他 Key |
permanent | 10 分钟 | 切换回退模型 |
transient | 1 分钟 | 退避重试 |
凭证池
单 Key 限流时自动轮换下一可用 Key:- 4 种分发策略(轮询、最少使用、随机、优先级)
- 按 Key 错误感知冷却
- 每 Key 指数退避
- 冷却到期自动探测
错误诊断
错误时提供结构化可执行反馈:9 类错误
| 类别 | 示例 | 恢复提示 |
|---|---|---|
FileNotFoundError | 文件引用缺失 | 建议搜索正确路径 |
PermissionError | 权限不足 | 建议请求审批 |
ConnectionError | 网络失败 | 自动退避重试 |
TimeoutError | LLM 超时 | 增加超时或简化请求 |
RateLimitError | API 配额用尽 | 换 Key 或等待 |
ContextOverflow | 窗口超限 | 触发压缩 |
AuthError | 凭证无效 | 轮换下一 Key |
ToolError | 工具执行失败 | 尝试替代工具 |
ModelError | 模型能力不足 | 升级到更强模型 |
error_hint、error_category 与建议 RecoveryAction — GUI 显示为可点击按钮。
模型自升级
轻量模型发现无法完成任务时:- 输出特殊标记
<<<NEEDS_PRO>>> EscalationScrubber拦截(对用户隐藏)- Agent 自动切换到配置的更强模型
- 任务无缝继续
循环检测
5 个独立检测器识别不同类型 Agent 循环:| 检测器 | 模式 | 动作 |
|---|---|---|
| 重复 | 相同参数重复调用同一工具 | 警告 → 中断 |
| 乒乓 | A→B→A→B 交替 | 警告 → 中断 |
| 无进展 | 跨轮输出不变 | 警告 → 中断 |
| 发散 | 工具调用越来越偏题 | 警告 → 中断 |
| 输出递减 | 响应质量下降 | 警告 → 中断 |
迭代预算
Agent 有可配置迭代上限与分级警告:| 阈值 | 动作 |
|---|---|
| 35 轮 | 首次警告:「接近上限」 |
| 45 轮 | 二次警告:「快达上限,请收尾」 |
| 48 轮 | 最终警告:「剩 2 轮」 |
| 50 轮 | 硬停 + grace 摘要 |
文件检查点
任何破坏性文件操作前,AutoSnapshotInterceptor 自动快照:
- 覆盖 6 类工具:
write_file、patch_file、delete_file、move_file、execute_terminal、code_execute - 每轮去重防冗余快照
- 快照支持 GUI 一键回滚
用户体验
恢复对用户透明:- 模型宕机? — 毫秒级切换备用
- 网络断开? — 流从断点 Token 续传
- 限流? — Key 轮换或退避后重试
- Agent 循环? — 早期检测,避免浪费预算
- 响应截断? — 先本地 JSON 修复,再扩大输出预算重试

