OpenCode プラグイン:大規模モデルの Think 段階の無限ループを検出して中断する
GLM-5.2 などのモデルは think 段階で無限ループに陥り、同じ内容を出力し続けて自力で停止できなくなる。本稿では OpenCode のプラグイン機構を用いて自動検出と中断を実装する方法を紹介する。
GLM-5.2 は think 段階で無限ループに陥り、同じ内容を出力し続けて自力で停止できない。固まったセッションは API クレジットを消費し続け、タイムアウトまたは手動中断するまでワークフローをブロックする。一度の無限ループで数元分のクレジットが無駄になり、日常使用への影響は大きい。
既存のツールはこのシナリオに適さない。LoopGuard は Python ライブラリで LangChain エコシステム向けであり、コードレベルでの統合が必要だ。AgentSight は eBPF ベースで Linux 専用、macOS では使えない。OpenCode に組み込まれ、既存のワークフローに変更を加えない軽量な手法が必要だ。
OpenCode のプラグインシステムは event フックを提供し、内部イベントを監視できる。その中の message.part.delta はストリーミングの増分コンテンツを含み、トークンが一つ生成されるたびにトリガーされる。このイベントを利用して、出力コンテンツに重複パターンが出現していないかをリアルタイムに検出できる。
検出ロジックは 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