Run 终止哲学(INV-TERM-01)
wesgine 的 Run 终止设计:无限制,有韧性。引擎不因 counter 阈值主动终止正常运行的任务。
核心原则
引擎不主动终止。
传统 Agent 框架的做法是设置 max_iterations 或 max_tokens,超了就停。wesgine 认为这是错的:
- 用户不应该猜"这个任务需要多少轮"
- 截断一个正在进展的任务比让它多跑几轮更昂贵
- counter 阈值无法区分"正在做事"和"卡住了"
合法终止途径
Run 只在以下情况终止:
| 途径 | 说明 | 来源 |
|---|---|---|
| 模型自然结束 | 模型回复不含 tool_calls | 正常 |
| 用户中断 | POST /sessions/{sid}/interrupt | 用户主动 |
| CycleDetector | 完全相同的操作 + 完全相同的结果 | 引擎内建 |
| ErrorStreak HITL 超时 | 连续错误 → HITL → 用户不响应 | 引擎内建 |
| BudgetCheckFn | 外部预算检查返回 Exhausted | 应用层 |
| Cell Stop | Cell 生命周期管理 | 管理操作 |
已废弃的终止路径
以下终止机制已被移除:
| 废弃机制 | 为什么移除 |
|---|---|
| PlanStall | 无法区分"思考"和"卡住" |
| ProgressTracker | 与 CycleDetector 重叠 |
| PlanningPhaseHardLimit | 任意截断计划阶段 |
| max_iterations 硬限制 | 与终止哲学矛盾 |
CycleDetector:唯一的引擎内终止源
CycleDetector 检测可证明的死循环:完全相同的操作 + 完全相同的结果。
两阶段协议
首次 CycleTerm
↓
自愈(注入纠正消息 + 重置 counter)
↓ 自愈失败
第二次 CycleTerm
↓
HITL(问用户怎么办)
↓ 超时 60s
终止 + 保存进度
工具分类
| 类别 | 阈值特点 |
|---|---|
| Exploration(read/grep/search) | 高阈值 |
| Action(edit/write/exec) | 中等阈值 |
| Plan | 低阈值 |
参数变化时 streak /= 2(progress-aware halving)。
ErrorStreak:伪进展检测
与 CycleDetector 互补:
| CycleDetector | ErrorStreak | |
|---|---|---|
| 检测 | 相同操作重复 | 不同操作持续失败 |
| 触发 | 自愈 → HITL | 直接 HITL |
| 终止 | HITL 超时 | HITL 超时 |
BudgetCheckFn:应用层预算
应用层可注入 BudgetCheckFn:
AppRunRequest{
BudgetCheckFn: func(usage BudgetUsage) BudgetDecision {
if usage.TotalTokens > limit {
return BudgetExhausted
}
return BudgetOK
},
}
返回 BudgetExhausted 时 Run 终止。
Grace Call
预算即将耗尽时,引擎给模型最后一次 LLM 调用:
- 模型可以输出最终总结
- 不触发工具调用
- 之后 Run 正常终结
这是终止哲学的体现:即使要停,也给模型收尾的机会。
Run 限制字段
虽然不主动终止,Run 仍有可观测的限制字段:
| 字段 | 说明 | 是否触发终止 |
|---|---|---|
| TokenBudget | Token 预算 | ❌ 仅事件通知 |
| TurnBudget | 轮次预算 | ❌ 仅事件通知 |
| TimeBudget | 时间预算 | ❌ 仅事件通知 |
| MaxTokenEstimate | 最大 Token 估算 | ❌ 上下文压缩参考 |
这些限制用于:
- 向前端推送
budget_status事件 - 触发 Grace Call
- 压缩决策的参考值
终态事件保证(INV-TERM-04)
无论哪种终止路径,Run 必须发出终态事件:
| 事件 | 终止原因 |
|---|---|
EventDone | 正常完成 / context_cancelled |
EventError | 错误终止 |
EventInterrupted | 用户中断 |
缺少终态事件 → terminal guard 合成虚假 EventError。
相关文档
- Run 生命周期 →
run-lifecycle.md - ErrorStreak 检测 →
error-streak-detection.md - HITL 系统 →
hitl-system.md - Run 预算管理 →
run-budget-management.md