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
}]
]
}
三个参数可调。minPatternLen 和 maxPatternLen 定义扫描的块长度范围,repeatCount 定义重复次数阈值。调低 repeatCount 更敏感,调高减少误报。测试中正常对话、代码生成、自然语言重复均未触发误报。
局限是只能检测文本重复,无法检测语义循环。模型用不同表述反复同一观点时检测不到。实际遇到的 think 死循环多为明显文本重复,此方案可覆盖多数场景。
插件地址:think-loop-detector