错误恢复
Myrm 错误恢复确保 Agent 在网络故障、模型宕机、限流与意外错误时自动持续运行,无需用户介入。中断回合自动续跑(崩溃恢复)
服务进程在回合中途崩溃时,Myrm 不会让你猜「到底跑没跑完」:- 每轮正常流开始前写入 write-ahead 标记,成功完成后清除
- 服务重启后启动扫描,在 15 分钟 freshness 窗口内恢复符合条件的回合
- crash-loop 断路器:同一标记最多 2 次失败尝试
- 恢复后的助手消息持久化
token_economics(与主路径成本记账一致) ReplaySafety双态重放仲裁:崩溃中断的只读工具(读文件、检索等)自动生成安全成功占位,免除模型二次无效反思;带写副作用工具严格返回中断错误,杜绝重复写入破坏数据- 插话(Steering)指令持久化回放:用户在崩溃前输入的纠偏与转向指令随崩溃标记落盘持久化,服务重启后自动重新灌入调度队列,100% 零丢失
- 可在 Settings → 偏好 → 高级 → 中断回合自动续跑 关闭
相对 Hermes v0.19 的诚实说明: Hermes 在你 重开聊天会话 时也会触发自动续跑。Myrm 当前在 服务重启/warmup 时恢复;重开聊天页 + live SSE 触发仍在 roadmap,尚未上线。官网/文档只写已上线能力。
并行工作区合并失败(GUI)
当并行子代理使用隔离工作区(ISOLATED_COPY)且 batch_merge 或 sync_back 失败时,Myrm 不会在日志里悄悄吞掉:
- 聊天界面展示 warning 横幅 与 可折叠错误面板(
WorkspaceMergeWarning) - 失败信息写入消息 metadata(
workspaceMergeFailures),刷新页面后仍可见 - 本轮以
completionStatus: warning结束,提示产出可能不完整
14 层恢复架构
熔断器
防止模型提供商宕机时级联失败:状态
错误分类
厂商政策阻断前置自愈与故障转移
在接入 Claude Pro/Max 等厂商第三方订阅授权时,常遭遇单边 HTTP 403 政策阻断(如third-party client not permitted、extra usage credits required)。传统框架(如 Hermes、OpenClaw)将该类 403 错误误判为普通认证失败(auth_permanent),导致长任务直接崩溃夭折。
Myrm 实现全链路工业级政策阻断自愈闭环:
- 前置特征嗅探:分类器将专有政策签名优先于通用 403 鉴权匹配,精准提取
PROVIDER_POLICY_BLOCKED错误类型; - 状态机自动降级:阻断发生时自动触发模型故障转移(Failover),平滑切换至 Agent Profile 备用模型(如 GPT-4o / DeepSeek),任务零中断;
- 前端全语系诚实契约卡片:在设置页透明披露订阅政策与额度事实,并引导用户配置官方 API Key 或备用模型,消除认知偏差。
凭证池
单 Key 限流时自动轮换下一可用 Key:- 4 种分发策略(轮询、最少使用、随机、优先级)
- 按 Key 错误感知冷却
- 每 Key 指数退避
- 冷却到期自动探测
错误诊断
错误时提供结构化可执行反馈:9 类错误
每条错误含
error_hint、error_category(28 种规范化分类,由 ToolErrorCategory StrEnum 统一管理,4 语言 i18n 全覆盖)与建议 RecoveryAction — GUI 显示为可点击按钮。跨层同步测试套件(46 项)确保 harness 枚举与前端 i18n key 永不漂移。
交互式恢复按钮
对于常见 LLM 错误,错误卡片包含一键修复按钮,直接跳转到对应设置页面:
按钮标签支持 5 种语言(英/中/日/韩/德),自动匹配用户界面语言。如果诊断引擎遇到意外错误,会优雅降级 — 基础错误信息正常显示,不影响使用。
代码执行自动诊断
当 Agent 运行 Python 代码或 Bash 命令时,执行引擎自动分类错误并生成可操作提示:
引擎内置 import-to-PyPI 映射表(PIL → Pillow, sklearn → scikit-learn, yaml → PyYAML 等),并自动检测是否可用
uv pip。所有代码在 VenvManager 管理的共享虚拟环境中运行,确保用户安装的包不会污染系统 Python。
透明命令自动修复
除提示外,Myrm 还会在沙箱内确定性自动修复常见脆弱命令,让 Agent 在失败之前就完成任务。壳层初始化(resilience_init.sh)包装易失败命令并透明降级:
每次降级都会向 LLM 回写一行
[System Note: ...],说明「框架已自动降级以保证成功」,模型直接继续——无需重新分析、零额外 token、零人工干预。这是竞品「失败经验检索」想用运行时语义检索达到的效果的确定性等价物,且零 LLM 成本、零时延、不触碰提示词缓存(该 note 走动态工具输出通道)。结合上面的规则级 error_hint 与已持久化的重复失败规则(tool_capture),Agent 既自动修复脆弱命令,又能在跨会话间学会工具容易如何失败。
失败分锅归因(Fault-Side Attribution)
任务失败时,最痛的问题往往不是「失败了」,而是「这锅是谁的」?模型幻觉?工具故障?环境配置?还是你给的指令不清晰?竞品只会甩出一段红色报错,剩下的全靠用户猜。Myrm 以确定性规则把每次失败归因到六个故障侧之一——纯规则分类已有错误元数据,零 LLM 成本:
归因在产品的三处呈现:
- 实时进度步骤 — SSE 进度面板在每个失败步骤上打上 fault-side 徽章,一眼看出该重试、换模型、改输入还是升级
- 执行轨迹时间线 — 轨迹中的每个错误事件都带归因,事后可回看根因
- 恢复动作按钮 — 带归因的错误携带可点击的
recovery_actions按钮(更新 API Key、充值余额、切换模型),直达正确设置页
压缩丢约束审计
竞品连名字都叫不出的失败模式:上下文压缩之后,你的约束是被压缩器丢了,还是被模型无视了?Myrm 的dropped_manifest 记录压缩丢弃的每一条约束片段,让 GUI 能准确区分两者——业界唯一的压缩后(post-compaction)归因能力。
验证:harness fault_side 100% 覆盖 + trace_builder 98% + broadcaster 99%;前端 fault-side 徽章渲染套件(66 vitest);server fault-side 消费集成(11 项测试)。
Shell 会话自愈
Myrm 在长驻交互式 bash 会话中执行命令(而非每次调用新开一次性进程),因此cd、export 与环境状态跨命令持久。长驻会话会引入一次性方案永远不会遇到的两种故障类——Myrm 以确定性方式解决:
环境变量逐字节保真注入
环境变量通过 ANSI-C 引号($'…') 注入 bash,含 $、反引号、双引号、换行、tab、回车等特殊字符的值被逐字节原样保留——永不被二次展开、永远无法拆断初始化批次。Naive 转义(如把 " 转成 \\")会在值含奇数个 " 时提前闭合双引号上下文,令 bash 卡死在 PS2 续行提示,导致后续所有命令全部超时。已通过 20 组真实 bash -c 往返参数化测试验证(引号奇偶、反斜杠、$HOME、反引号、换行/tab/CR、Unicode、%、!、空值)。
卡死自愈
阻塞或吞 stdin 的命令(cat、ssh、python -c "input()"、tail -f)会永久毒化长驻 shell——后续输出与标记全被吞掉。Myrm 检测并透明恢复:
- 超时自愈:超时命令 kill 整个进程组并标记会话为
TERMINATED;下一条 execute/stream 调用透明重建会话(env/cwd 重新注入) - 边界损坏检测:吞 stdin 命令把输出标记回显成原始文本时,exit-code 字段解析失败 → 触发
parse_failed标志 → 走同一 kill + 重建路径,绝不把错乱半截输出返回给 LLM - 双路径一致:
execute与execute_stream(实时 SSE)均触发自愈
会话级防线
- 随机命令标记(
secrets.token_hex)分隔输出,用户输出永不碰撞固定分隔符——杜绝截断误判 bash -n语法预检:未闭合 heredoc/括号在触碰长驻进程前拦截exit()拦截函数:尾部exit N从命令块返回而非终止 shell——cwd/env 不丢- 块内 rc 捕获 +
EXITtrap:即使set -eerrexit 崩溃也输出完整标记对与真实退出码 - 实时 PII 脱敏:主机路径与凭证 token 在
execute与 SSE 流双路径掩码一致
env.execute、jiuwenclaw sandbox daemon)因不携带状态而无需面对引号或卡死问题——但它们每次调用都丢失 cd/export 状态,且无法在任务中途自愈。
模型自升级
轻量模型发现无法完成任务时:- 输出特殊标记
<<<NEEDS_PRO>>> EscalationScrubber拦截(对用户隐藏)- Agent 自动切换到配置的更强模型
- 任务无缝继续
循环检测
7 个独立检测器识别不同类型 Agent 循环:
渐进响应:先向上下文注入带上下文感知建议的警告,持续则强制中断(严重级别:WARNING 3-5次 → ERROR 6-9次 → CRITICAL 10+次)。
压缩后循环防护
当上下文溢出触发紧急压缩时,LoopGuard 精确处理过渡:- 循环检测状态全程存活 — 滑动窗口(模式检测)和错误签名运行在
ContextVar中,与压缩操作的消息列表完全解耦 - 迭代预算智能重置 —
notify_compaction()重置total_calls,避免 Agent 因压缩前的历史累积被过早终止,同时保留error_signatures实现跨压缩边界的失败追踪 - Agent 阶段保留 — 当前执行阶段(探索、执行等)跨压缩保持,确保上下文感知的检测阈值不变
压缩后记忆保护
上下文压缩后,Agent 的记忆检索不会出现滞后或丢失,这得益于 5 层记忆保护架构:- SystemMessage 免压缩:用户 profile 和规则以 SystemMessage 注入,位于上下文首位,不参与压缩
- Learned Context 免压缩:学习型上下文以 HumanMessage 注入,非工具调用配对,不会被压缩处理器选中
- PreCompactProcessor 主动召回:压缩前自动触发向量数据库语义搜索,将相关记忆注入为独立消息块,确保压缩后 LLM 仍可访问关键记忆
- 实时向量索引:Qdrant 向量数据库写入后立即可搜索,不存在索引滞后问题
- 记忆提取独立:会话结束时的记忆提取使用原始对话,不受会话内压缩影响
迭代预算
Agent 有可配置迭代上限(默认 50),阈值基于图递归限制动态计算:
阈值根据
graph_recursion_limit 自动推导并转换为工具调用次数,确保预算在任何配置下都能正确缩放。grace 摘要结构化总结已完成工作、剩余任务与继续建议。
静默工具重试
工具调用因瞬时错误(网络超时、限流、临时不可用)失败时,系统自动重试 — 用户只看到心跳计时器在跳动,永远看不到失败。6 层重试架构
与竞品的区别
- 非 prompt 指令:重试逻辑是确定性代码(Pydantic schema + 计数器),不是 LLM 可能忽略的自然语言指令
- 非仅开发者可见:不同于框架级重试配置(如 LangGraph 的
RetryPolicy),心跳 UI 让终端用户也能看到执行状态 - 非打扰式:重试静默进行 — 无错误弹窗,瞬时故障无需用户决策
工具反馈忽视守卫
弱模型常无视工具反馈:工具已返回明确的不可恢复错误,模型仍换着花样重试、切换无关工具、甚至编造答案 — 烧 token 且产出半成品。学术研究(Scale AI 的 Tool Feedback Neglect 论文、Zhou et al. 2024)已将其列为独立 failure mode,但全部竞品仅有研究、无产品落地。Myrm 落地为生产级运行时守卫:
验证:terminal guard 单元套件(20)+ 家族分类分支覆盖(12)+ 注册表两通道语义(9)+ 全链路中间件集成(7)+ server E2E 确定性重写(连续 8 次通过)+ Chrome E2E 真实会话通过 + 全量回归 4116 passed, 2 skipped(2026-08)。
文件检查点
任何破坏性文件操作前,AutoSnapshotInterceptor 自动快照:
- 覆盖 6 类工具:
write_file、patch_file、delete_file、move_file、execute_terminal、code_execute - 每轮去重防冗余快照
- 快照支持 GUI 一键回滚
数据库安全
五级防护体系确保数据(对话、定时任务、记忆)在任何故障下零丢失:
多步表重建迁移(如
CREATE TABLE AS SELECT → DROP → RENAME)被完整保护:即使进程中断,迁移前快照提供干净的恢复点。
子Agent错误摘要防污染
当子Agent崩溃产生长篇错误信息时,系统自动压缩错误后再返回父Agent — 防止上下文污染导致父Agent推理质量下降。
这防止了多Agent系统中的常见故障模式:子Agent的冗长崩溃输出占满父Agent的上下文窗口,导致层级间级联推理退化。
子Agent失败时保留部分进展
当子Agent执行到中途失败(LLM 错误、预算耗尽、超时或运行时异常),所有已完成的工作将被保留并返回给父Agent —— 永不丢失。为什么重要
如果没有部分进展保留,一个完成了80%复杂任务后遇到限速的子Agent会丢失所有工作。父Agent不得不从零开始 —— 浪费已消耗的Token,成本翻倍。 Myrm 的方式:- 父Agent收到所有已完成的结构化输出
- 父Agent可从子Agent停止的地方继续
- 成功部分消耗的Token不浪费
- 过长的部分输出自动截断(通过
max_error_chars * 2可配置)
竞品对比
级联错误防护体系
Myrm 在 Agent 层级的每个层面提供纵深防御,防止级联故障:
与传统微服务的依赖链不同,LLM Agent 中工具之间不存在显式 DAG 依赖 — 调用顺序由 LLM 推理链动态决定。Myrm 在正确的抽象层面解决级联错误:基础设施熔断 + 行为模式检测 + 层级级联取消,而非试图建模不存在的工具依赖图。
实测验证:级联错误防护全模块 604 项测试通过(LoopGuard、FrequencyGuard、E-Stop、ToolCallBroadcaster、SubagentExecutor、CircuitBreaker、ToolGuards)。
重试风暴与预算防护
Myrm 主动防止失控重试循环并保护 API 预算:
这是主动截断(立即停止执行),不是被动监控(仅记录和告警)。检测到重试风暴时,Agent 被强制停止并输出当前最佳结果 — 同时保护云托管算力成本和本地 API Key 余额。
实测验证:重试防护全模块 330 项测试通过(LoopGuard、FrequencyGuard、BudgetGuard、MultidimensionalBudgetGuard、BudgetBoundaryMiddleware)。
预算防护体系
Myrm 在所有部署模式下提供全面的预算控制:- MultidimensionalBudgetGuard:会话/日/单次调用 3 维 USD 限制,4 级渐进响应(OK → WARNING → FINALIZATION → EXCEEDED)
- 动态预算提示:当预算降至 WARNING 或 FINALIZATION 时,自动将真实剩余 USD 金额注入 LLM 提示词 — AI 精确知道还能花多少钱并自动调整行为
- BudgetBadge:聊天输入区实时预算徽章,显示使用百分比和颜色编码状态
- BudgetExceededDialog:预算超限弹窗,一键充值或升级套餐
- ChannelBudget:每个 IM 渠道(Telegram、微信等)独立预算限额
- BudgetPolicySection:完整的预算策略配置 UI,支持 finalization reserve
- DailyChart:30 天用量趋势图 + 缓存命中率叠加折线
数据生命周期管理
Myrm 自动管理所有存储引擎的数据保留 — 无需手动清理:- 9 大自动调度器:Context 文件 3 级清理(30d/14d/7d)、Auth 日志可配置轮转、Chat 回收站 30 天自动清除、SQLite WAL checkpoint(每 6h)、数据库轮转备份、Qdrant segment 优化、Browser zombie 检测(48h 阈值)、Kanban GC、Incognito 1h 自动清除
- MemoryGuardian:自适应维护频率 — 健康时每 6h,异常时缩短至每 2h。健康分数驱动(70 normal / 35 critical),连续 2 次不健康后强制维护
- 文件引用追踪:通过
file_access_tracker防止误删被引用的上下文文件 - 调度器健康 API:所有后台调度器的实时 green/yellow/red 状态监控
- 热备份:每次维护周期后自动 SQLite 热备份
技能进化 — 自我改进的 Agent
Myrm 的 Agent 能从失败中学习并自主进化技能:- 自动进化:当技能失败或收到负反馈时,系统生成进化提案直接更新技能文件本身 — 而非临时的 prompt 补丁
- 审查生命周期:安全变更自动应用,风险变更变成可审查的 growth case(approve/reject 工作流)
- 语义去重:similarity_checker 防止技能熵增 — 重复或近似技能在保存前被拦截
- 经验账本:每个进化事件(14 种类型)永久记录,用于审计和分析
- 质量告警:技能质量下降时通过 Webhook 通知,支持主动维护
用户体验
恢复对用户透明:- 模型宕机? — 毫秒级切换备用
- 网络断开? — 流从断点 Token 续传
- 限流? — Key 轮换或退避后重试
- API Key 过期? — 错误卡片中一键跳转设置页更新
- Agent 循环? — 早期检测,避免浪费预算
- 响应截断? — 文本截断:无缝 keep+continue 渐进输出提升(2x/3x/4x,上限32768);工具截断:丢弃无效内容+自动重试;JSON截断:本地修复。Output Cap 自适应恢复覆盖 5 种提供商格式(Anthropic/OpenRouter/LM Studio/vLLM/DashScope)。SSE 状态通知支持5种语言。388项output-cap专项 + 294项截断/恢复测试已验证(2026-07)
- 升级中断? — 迁移前快照自动恢复数据
- 子Agent崩溃? — 错误自动压缩,父Agent仅收到精简摘要,推理不受污染
- 工具调用失败? — 静默重试 + 心跳计时,你看到的是”执行中 15s”而非报错
- 流式错误可恢复? — 错误消息附带
recovery_actions可点击按钮(重试、切换模型、安装依赖),直接在聊天界面操作。结构化diagnostic_result提供 i18n 错误诊断 + 分步修复指引,无需猜测原因 - 反复失败? — 3-Strike 协议自动升级请求协助 — 不会无限循环
- 环境异常? — Doctor 诊断面板并行执行 9 项探针(Python 版本、依赖、LLM 连通性、网络、工作区存储、数据库、浏览器、Hook 系统、桌面控制),GUI 健康卡片一目了然,一键修复按钮快速恢复。无需打开终端执行命令,所有诊断和修复操作均在图形界面完成
- SSE 断线了? — 目标进度面板自动清除过期指示器,重新同步服务端最新状态,已完成的步骤保留展示。不会出现幽灵转圈或 Agent 已停止却仍显示「进行中」的误导
- 取消正在运行的任务? — 端到端取消信号在 0.5s 内传播到整条执行链(CancellationMonitor 轮询间隔)。后台任务被 kill,子代理级联取消,资源清理,token 注册表注销
- 长任务中断连了? — 宽限期容忍机制保持任务存活。持续断连时,OfflineDurableTask 自动注册后台继续运行,完成后推送通知。后台进程(npm install、webpack watch、测试套件)由进程级单例注册表管理,与 SSE 流完全解耦——刷新页面或重连永不杀掉正在运行的守护进程。SSE 重连采用标准 Last-Event-ID 协议 + 5MB 滑动窗口缓冲,事件回放无重复、无缺失、无乱序。流式并发已加固:慢消费者(弱网手机)永远不会阻塞其他客户端——yield 点位于共享条件锁之外,多端同时查看同一会话互不阻塞
- 服务器重启时目标正在执行? — 孤儿目标自动暂停并标注原因。持久任务在下次启动时从 LangGraph checkpoint 恢复 — 零重复工作
- 普通对话中进程崩溃了? — InterruptedTurnMarker 在每次 Agent 流启动前写入持久化预写记录。重启后自动扫描符合条件的标记并在后台续跑,包含聊天历史重新加载、消息持久化、崩溃循环断路器(最多 2 次尝试)、15 分钟新鲜度窗口、成功/失败用户通知。可通过
autoContinueInterruptedTurns设置控制(默认启用) - 需要紧急全停? — E-Stop API (
/freeze) 一键取消所有活跃 Agent 流 — 生产环境的紧急熔断按钮