ErrorStreak 检测(INV-STREAK-01)
wesgine 的 ErrorStreak 检测器识别"伪进展"——模型不断发起不同的工具调用但持续收到错误。
与 CycleDetector 的区别
| CycleDetector | ErrorStreak | |
|---|---|---|
| 检测目标 | 完全相同的操作 + 完全相同的结果 | 不同操作但持续失败 |
| 触发条件 | 相同调用重复 N 次 | 连续错误累积 |
| 典型场景 | 死循环(read 同文件同偏移) | 乱试(各种命令都报错) |
工作机制
工具调用 1 → 成功 → streak 重置
工具调用 2 → 失败 → streak = 1
工具调用 3 → 失败 → streak = 2
...
工具调用 N → 失败 → streak = N → 触发 HITL
连续错误判定
- 只看连续的错误
- 一次成功重置计数
- 不区分错误类型
HITL 触发
检测到 ErrorStreak 后:
- 发起 HITL 请求,告知用户模型在持续犯错
- 用户可以:
- 提供指导 → 注入系统消息继续
- 取消 Run
- HITL 超时 → Run 终止,原因
error_streak
为什么不自动终止
与终止哲学(INV-TERM-01)一致:
- 引擎不因 counter 阈值主动终止
- ErrorStreak 可能是临时网络问题
- 人工判断比自动终止更准确
- HITL 给用户选择权
与 CycleDetector 的协作
两者独立工作,互不干扰:
工具调用
↓
CycleDetector 检查(相同调用?)
↓
ErrorStreak 检查(连续失败?)
↓
任一触发 → HITL
事件
ErrorStreak 触发时发出 error_streak 事件:
- 消费方可映射为
loop_warning(如 Teleclaw 的FrontendEventMapper) - 前端显示为警告而非错误
配置
ErrorStreak 的阈值目前内置于引擎,不可通过 CellSpec 配置。
相关文档
- Run 生命周期 →
run-lifecycle.md - Run 预算管理 →
run-budget-management.md - HITL 系统 →
hitl-system.md(待创建) - 终止哲学 →
run-termination-philosophy.md(待创建)