Skip to content

[Bug] GLM-5.1 thinking output corruption — repetition loop + tool call leak #52

@terisuke

Description

@terisuke

症状

GLM-5.1 (ZhipuAI) をOpenCodeで使用した際、thinkingブロックが以下のように破壊される:

  1. 日本語+英語の混在で壊れる: # ド成否: to使用 edit with filePath: のような意味不明な出力
  2. Thinking内にtool call構造がリーク: filePath, oldString, newString 等のツール呼び出しパラメータがthinking内に出力される
  3. XMLタグの無限ループ: >invoke>invoke>invoke>... が数千回繰り返される
  4. コンテキストウィンドウを食い潰してセッションが使い物にならなくなる

再現条件

  • モデル: GLM-5.1 (ZhipuAI経由)
  • タスク: 複数ファイルの同時編集を要求する長いプロンプト
  • 言語: 日本語 + 英語混在のsystem prompt

根本原因分析

モデル側 (GLM-5.1固有)

  • XMLベースのtool call形式に対するinstruction followingが弱い
  • 長い構造化出力でrepetition loopに陥りやすい
  • thinking/action境界の理解が不足し、thinking内でtool call XMLを「計画」として生成してしまう

OpenCode側

  • GLM専用プロンプトが存在しない: session/prompt/ にはanthropic.txt, gpt.txt, gemini.txt等があるが、GLM/ZhipuAI用がない。default.txt にフォールバック
  • thinkingブロックの最大トークン数制限が不十分: repetition loopを検出・打ち切る機構がない
  • tool call XMLのthinking内リーク検出がない: thinkingブロック内に <invoke>filePath が出現しても警告なし

対策案

即効対策(設定変更)

  1. GLM-5.1には単一ファイル編集のみ依頼する(AGENTS.mdに制約追記)
  2. OpenCode設定で thinking token 上限を設定(可能なら)

Plugin対策

  1. tool.execute.after で repetition loop 検出Plugin:
"tool.execute.after": async (input, output) => {
  const repeated = output.result?.match(/(.{5,})\1{50,}/)
  if (repeated) {
    throw new Error("Repetition loop detected. Aborting.")
  }
}

コア対策(フォーク修正)

  1. GLM専用プロンプト session/prompt/glm.txt を追加(短い指示、XML構造を避ける)
  2. session/system.ts でGLMモデル検出時にプロンプト切替
  3. thinking出力のstreaming中にrepetition検出+強制停止

関連ファイル

  • packages/opencode/src/session/prompt/default.txt(GLMがフォールバックするファイル)
  • packages/opencode/src/session/system.ts(プロンプト構築)
  • packages/opencode/src/session/processor.ts(出力処理)
  • packages/opencode/src/provider/provider.ts(プロバイダー設定)

関連Epic: #51 (Master Plan)

優先度: P1(データロス/セッション破壊のリスク)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions