OpenCode 插件:检测并中断大模型 Think 阶段死循环

日本語 →

GLM-5.2 等模型在 think 阶段可能出现死循环,持续输出相同内容无法自行停止。本文介绍如何用 OpenCode 插件机制实现自动检测与中断。


GLM-5.2 在 think 阶段会死循环,持续输出相同内容且无法自行停止。卡住的会话持续消耗 API 额度,阻塞工作流直到超时或手动中断。单次死循环可能浪费数元额度,对日常使用影响明显。

现有工具不适合这个场景。LoopGuard 是 Python 库,面向 LangChain 生态,需要在代码层面集成。AgentSight 基于 eBPF,仅支持 Linux,无法在 macOS 上使用。需要一个嵌入 OpenCode 的轻量方案,不侵入现有工作流。

OpenCode 插件系统提供 event hook,可监听内部事件。其中 message.part.delta 包含 streaming 增量内容,每生成一个 token 都会触发一次。利用这个事件可以实时检测输出内容是否出现重复模式。

检测逻辑是累积 delta,在文本末尾扫描 20-200 字符的块,同一块连续出现 3 次以上判定为死循环。典型的 think 循环表现为同一句话反复输出,比如:

我认为这个问题需要从多个角度来分析。首先,我认为这个问题需要从多个角度来分析。首先,我认为这个问题需要从多个角度来分析。首先,

检测到后调用 session.abort 中断会话,无需用户手动操作。

配置方式。在 ~/.config/opencode/opencode.json 添加:

{
  "plugin": [
    ["~/.config/opencode/plugins/opencode-think-loop-detector.ts", {
      "minPatternLen": 20,
      "maxPatternLen": 200,
      "repeatCount": 3
    }]
  ]
}

三个参数可调。minPatternLenmaxPatternLen 定义扫描的块长度范围,repeatCount 定义重复次数阈值。调低 repeatCount 更敏感,调高减少误报。测试中正常对话、代码生成、自然语言重复均未触发误报。

局限是只能检测文本重复,无法检测语义循环。模型用不同表述反复同一观点时检测不到。实际遇到的 think 死循环多为明显文本重复,此方案可覆盖多数场景。

插件地址:think-loop-detector