Run 编排
概述
wesgine 的 Run 编排系统管理 Agent 的执行流程,包括计划制定(Plan)、任务委派(Delegation)、循环检测(CycleDetector)和错误流检测(ErrorStreakDetector)。编排的核心理念是:LLM 驱动执行,引擎提供韧性保障。
Plan 系统
Plan 是 Agent 在执行复杂任务时创建的线性清单(不是 DAG)。Plan 由 LLM 驱动——引擎不隐式推进步骤,只有模型通过 plan 工具显式操作。
Plan 生命周期
planning → active → completed
→ terminated (run_interrupted / nudge_exhausted)
| 状态 | 含义 |
|---|---|
planning | 初始状态,Plan 正在创建中 |
active | 有步骤正在执行 |
completed | 模型声明任务完成 |
terminated | Run 异常终止或 nudge 耗尽 |
Plan 工具
| 动作 | 说明 |
|---|---|
plan(action=create, steps=[...]) | 创建计划 |
plan(action=update, task_id=N, status=done) | 更新步骤状态 |
plan(action=complete) | 声明计划完成(收口剩余 open 步骤) |
执行顺序 = 数组顺序。没有
depends_on,没有 DAG,模型决定先后。
Nudge 机制
当模型尝试 end_turn 但 Plan 仍有未完成步骤时,引擎注入提醒消息(nudge),引导模型继续执行。Nudge 有严格上限 3 次,耗尽后 Run 正常终止,未完成步骤保留原状。
Delegation(任务委派)
通过 delegate_task 工具,Agent 可以将子任务委派给独立的子 Agent:
delegate_task(goal="审查合同第三章", context="...", toolsets=["file"])
两种模式
| 模式 | 说明 |
|---|---|
| 同步(默认) | 父 Agent 等待子 Agent 完成后继续 |
异步(background=true) | 父 Agent 立即继续,子 Agent 结果稍后回注 |
角色控制
| 角色 | 能力 |
|---|---|
leaf(默认) | 专注执行,不可再委派 |
orchestrator | 可继续委派子任务(受 max_spawn_depth 限制) |
委派子 Run 的 Actor 自动从父 Run 继承。
CycleDetector(循环检测)
CycleDetector 是引擎内唯一的终止来源——它检测"可证明的死循环"(完全相同操作 + 完全相同结果),不是"你跑太久了"。
两阶段协议
| 阶段 | 触发条件 | 行为 |
|---|---|---|
| 自愈 | 首次达到终止阈值 | 注入纠正消息 + 重置计数器 |
| HITL | 第二次达到终止阈值 | 问用户"怎么办";超时 60s 自动终止 |
工具分类
不同工具有不同的阈值:
| 类别 | 示例 | 说明 |
|---|---|---|
| exploration | read、grep、search | 只读操作,阈值较高 |
| action | edit、write、exec | 变更操作,阈值较低 |
| progress-aware | edit(参数变化时) | 参数变化时 streak 减半 |
ErrorStreakDetector(伪进展检测)
检测连续的工具调用错误。当错误连续出现时,触发 HITL 询问用户是否继续,防止 Agent 在无效路径上空转。
Run 终止哲学
wesgine 的终止哲学是:引擎不因 counter 阈值主动终止。Run 终止只来自以下途径:
- 用户主动中断(
POST /sessions/{sid}/interrupt) - CycleDetector 自愈失败后 HITL 超时
- ErrorStreakDetector HITL 超时
- 外部预算检查返回 Exhausted
- Cell Stop(生命周期)
Run 生命周期与 SSE 连接完全解耦——SSE 断开不会取消 Run。
TaskMemory
每个 Session 可以关联一个 TaskMemory,用于存储任务执行过程中的结构化信息:
- Plan:当前任务计划
- Findings:执行过程中发现的信息
- Decisions:做出的决策
- Checkpoints:里程碑
- Learnings:学到的经验