循环检测与错误连击检测
wesgine 的两大自保护机制:CycleDetector 检测真循环,ErrorStreakDetector 检测伪进展。
CycleDetector(循环检测器)
核心概念
CycleDetector 检测「可证明的死循环」——完全相同操作 + 完全相同结果。它不是"你跑太久了"的计时器。
两阶段终止协议
| 阶段 | 触发 | 行为 |
|---|---|---|
| 自愈 | 首次 CycleTerm | 注入纠正消息 + 重置计数器 |
| HITL | 第二次 CycleTerm | 询问用户"怎么办",超时 60s 自动终止 |
工具分类(四级 fallback)
- 硬编码 map:wesgine 内置 ~20 个工具
- ExtraCategories:消费方声明
- ToolMeta 自动推断:
ReadOnly=true→ exploration - 默认:
categoryAction
阈值配置
| 类别 | Warn | Term |
|---|---|---|
| Exploration(读操作) | 可配置 | 可配置 |
| Action(写操作) | 可配置 | 可配置 |
| IdenticalCall(完全相同调用) | 4 | 7 |
Per-Run 覆盖
AppRunRequest{
CycleDetectOverride: &CycleDetectConfig{
ActionTermThreshold: 40,
IdenticalCallTermThreshold: 5,
},
}
委派子 Run 可用更严格阈值。
Progress-Aware 工具
参数变化时 streak /= 2(减半)——edit 同一文件多次修改是正常操作。
ErrorStreakDetector(错误连击检测器)
核心概念
检测「伪进展」——工具持续报错但 Agent 继续调用,看起来在工作实际在空转。
触发
连续 N 次工具调用返回错误(IsError=true)。
行为
触发 HITL 询问用户是否继续,超时自动终止(INV-STREAK-01)。
两者的区别
| CycleDetector | ErrorStreakDetector | |
|---|---|---|
| 检测什么 | 相同操作重复 | 持续错误 |
| 判据 | 工具名+参数相同 | 工具返回 IsError |
| 终止方式 | 两阶段(自愈→HITL) | 直接 HITL |
| 分类 | plan 归 exploration | 不分类 |
Plan 工具的分类
plan 在 toolCategoryMap 内置分类为 categoryExploration——探索预算 + 进度减半。应用层不得重复声明 ExtraCategories / progressAwareTools。
与 Run 终止的关系
引擎不因 counter 阈值主动终止(INV-TERM-01)。CycleDetector 是唯一的引擎内终止来源——它检测可证明的死循环,不是"你跑太久了"。
终止路径全景:
- CycleDetector 自愈失败后 HITL 超时
- ErrorStreakDetector HITL 超时
- 外部
BudgetCheckFn返回 Exhausted - 用户
POST /sessions/{sid}/interrupt - Cell Stop
相关文档
- Run 生命周期 →
run-lifecycle.md - HITL 交互 →
hitl-interaction.md - Plan 系统 →
plan-system.md