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

日期: 2026-07-03T09:20:40Z
摘要: GLM-5.2 等模型在 think 阶段可能出现死循环，持续输出相同内容无法自行停止。本文介绍如何用 OpenCode 插件机制实现自动检测与中断。
关键词:
- OpenCode
- 插件
- 死循环检测
- GLM
- Think 阶段

---

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

现有工具不适合这个场景。[LoopGuard](https://github.com/Charbelto/loopguard) 是 Python 库，面向 LangChain 生态，需要在代码层面集成。[AgentSight](https://github.com/eunomia-bpf/agentsight) 基于 eBPF，仅支持 Linux，无法在 macOS 上使用。需要一个嵌入 OpenCode 的轻量方案，不侵入现有工作流。

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

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

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

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

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

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

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

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

插件地址：[think-loop-detector](https://github.com/shikunx/think-loop-detector)
