执行中途失败怎么办?sprix-sage-router进度感知重规划与失败恢复实战
【免费下载链接】sprix-sage-routerSprix AI at 屿智同行 — state-aware SELF/COLLABORATE/HANDOFF routing for A2A agent networks.项目地址: https://gitcode.com/gh_mirrors/sp/sprix-sage-router
多智能体任务跑到一半,负责执行的 Agent 突然挂了,系统该怎么办?继续硬撑、拉队友、还是整体换人?sprix-sage-router(Sprix SAGE Router)正是为此而生的 A2A 网络状态感知路由器:它在任务执行过程中实时比较 SELF(自己继续)、COLLABORATE(协作增援)、HANDOFF(整体移交)三条路线,把失败进度、累计上下文和预算约束一起纳入同一个可审计的效用函数,完成进度感知的重规划与失败恢复。
为什么执行中途失败是最难处理的时刻
很多 Agent 系统只在任务开始时做一次匹配:选个能力最强的 Agent 就开工。一旦执行中途失败——Agent 不可用、预算超支、质量不达标——系统往往只能粗暴地"从头再选一次"。这会带来两个问题:
- ⚠️丢失已有进度:已经完成的依赖步骤、积累的上下文,在重新选型时没有被考虑;
- 🔄决策不可解释:换不换人、换给谁,全靠写死的启发式规则,出了问题无从排查。
SAGE 的思路是:把"执行中途的状态"变成一等公民。路由器不再只看静态能力表,而是读取任务实时状态,在三种恢复路线里做统一权衡,并保留完整审计轨迹。
三种恢复路线:继续、增援还是移交
SAGE 将失败后的恢复路径归纳为三种模式,它们在同一条效用公式中直接竞争,而不是靠零散规则硬编码:
| 路线 | 归属 | 适合场景 |
|---|---|---|
| SELF自己继续 | 原执行 Agent | 已有能力和上下文足够,失败只是暂时波动 |
| COLLABORATE协作增援 | 原 Agent 保留所有权 | 缺的只是一块能力拼图,拉几个互补 Agent 补齐 |
| HANDOFF整体移交 | 其他 Agent 接手全部所有权 | 专家优势明显,且上下文转移损失可接受 |
一个值得注意的细节:进度越深,上下文越难转移,整体移交(HANDOFF)的成本就越高。SAGE 用进度 × 上下文可转移性来量化这部分损失,避免"任务做到 80% 却轻率换人"的决策。三种模式的完整决策边界分析见 ALGORITHM.md。
进度感知重规划:用 ExecutionState 告诉路由器"现在到哪了"
重规划的前提是路由器"知道现场"。SAGE 用一个轻量的执行状态结构承载这些信息,定义见 sprix_sage.py:
| 字段 | 含义 |
|---|---|
progress | 任务整体完成度(0~1) |
completed_requirements | 已完成的需求/DAG 节点集合 |
failed_agents | 本次执行中失败的 Agent |
failure_count | 累计失败次数 |
active_agents/active_mode | 当前在跑的团队和模式 |
关键行为有两条:
- 失败 Agent 被硬过滤:凡在
failed_agents里的 Agent,直接标记"failed"原因,无论它预测质量多高都不会进入候选,见 sprix_sage.py。 - 切换损失随失败次数递减:失败次数越多,路由器对"再次换人"的摩擦惩罚越轻(恢复折扣),避免在已经出状况的任务上因害怕切换成本而停在原地,见切换损失实现 sprix_sage.py。
失败恢复完整流程:记录 → 重规划 → 持久化
仓库提供了可直接运行的失败恢复示例 examples/replan_and_persist.py,完整流程分三步。
第一步:把失败证据记回学习状态
执行结束后,用record_outcome把真实结果喂回路由器。失败证据(如success=0.1)会更新该 Agent 的上下文信任度,后续选型时它的可信度会被自动调低——这是"从失败中学习"而非"把失败的 Agent 拉黑了事":
router.record_outcome( initial, ExecutionOutcome( success=0.1, requirement_scores={"coding": 0.1}, actual_cost=0.05, actual_latency_ms=750, ), )第二步:注入执行状态,重规划绕开失败 Agent
构造带失败信息的ExecutionState(进度 0.4、generalist已失败),再次调用route。路由器会把失败 Agent 移出候选,围绕剩余需求重新比较三种模式:
state = ExecutionState( active_agents=initial.agents, active_mode=initial.mode, progress=0.4, failed_agents=frozenset({"generalist"}), failure_count=1, ) replanned = router.route(task, state=state)第三步:版本化快照,让恢复经验跨重启保留
学习到的信任、协同和报价保真度不会随进程消失。export_state导出带版本号的 JSON 快照,restore_state在新实例上恢复(实现见 sprix_sage.py):
snapshot_json = json.dumps(router.export_state()) restored = SAGERouter(agents, incumbent_id="generalist") restored.restore_state(json.loads(snapshot_json))生产环境建议对快照做原子写入与加密,运维细节参考 docs/OPERATIONS.md。
可审计:明确看到路由器为什么排除谁
重规划最怕"黑盒换人"。用route_with_trace替代route调用,除了胜出决策,还能拿到完整审计包:
- ✅ 胜出的路由 + 按效用排序的可行备选方案;
- ✅ 每个被淘汰 Agent 的硬性过滤原因(failed / unavailable / 缺权限 / 超预算 / 超时);
- ✅ 最终团队的角色分配与通信拓扑。
排查"为什么把失败 Agent 换成了它"时,只需检查excluded_agents里的理由即可,无需翻日志猜。
快速上手:3 步跑通失败恢复演示
SAGE 参考实现零运行时依赖(Python 3.10+),克隆仓库即可运行:
git clone https://gitcode.com/gh_mirrors/sp/sprix-sage-router cd sprix-sage-router python -m examples.replan_and_persist终端会依次打印初始路由、失败后的重规划结果,以及恢复后路由器成功模型的学习更新次数。想看更完整的端到端路由(含 A2A 执行计划生成),可运行 examples/a2a_execution_plan.py,其原理说明见 docs/INTEGRATION.md。
小结
执行中途失败时,别再"从头选一遍"。sprix-sage-router 给出的答案可以浓缩成四句话:
- 📊 用
ExecutionState把进度与失败事实如实注入,重规划才谈得上"进度感知"; - 🚫 失败 Agent 走硬过滤,不进候选;
- ⚖️ SELF / COLLABORATE / HANDOFF 在同一效用函数里竞争,且失败越多、换人阻力越小;
- 💾 失败证据与学习状态版本化落盘,恢复能力跨重启保留,全程可审计。
作为研究预览项目,SAGE 已具备完整的重规划闭环与状态持久化;若你要在真实 A2A 网络上落地,建议按 docs/OPERATIONS.md 的分阶段上线流程(离线回放 → 影子决策 → 灰度)逐步推进。
【免费下载链接】sprix-sage-routerSprix AI at 屿智同行 — state-aware SELF/COLLABORATE/HANDOFF routing for A2A agent networks.项目地址: https://gitcode.com/gh_mirrors/sp/sprix-sage-router
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考