TLDR: 一般的なJSONスキーマのパターン `anyOf: [$ref, null]` を使ったツールのパラメータは、プロンプトに `type` フィールドが空の状態としてレンダリングされます。これにより、モデルが見る前に有用なスキーマ情報が削ぎ落とされます。
--
長い、やや冗長なバージョン:
Gemma 4 は、>3 個の推論エンジンで私のカスタム MCP ツールを呼び出す際に問題がありました。一方で Qwen3.5 と gpt-oss-20b は問題なく動いていました。
チャットテンプレートの問題か、あるエッジケースにおける推論ライブラリの問題のどちらかだと考えました。そして、多くの人が Gemma 4 をエージェントとして満足していたので、時間が解決してくれるだろうと思っていました。
しかし少なくとも 2 週間は直りませんでした。仕方なく、自分で調査する必要がありました。
やったこと:
- llama-server を使って、macbook pro 上で Qwen3.5-27B-Q4_K_M と gemma-4-31B-it-Q4_K_S に対し、同じプロンプト/ツールを実行し、冗長なログファイルを作成しました。
- codex CLI で GPT-5.5-high にログを読み、問題を診断させました。
- 数分で見つかりました。デフォルトの Gemma チャットテンプレートは、ツールのパラメータに直接 `type` フィールドがある前提になっています。つまり、nullable な参照のような JSON スキーマ形状とは動きません:
{"anyOf": [{"$ref": "#/$defs/SomeObject"}, {"type": "null"}]}
ここではトップレベルの type がありません。有用な構造は anyOf と $defs の中にあります。テンプレートは anyOf、$ref、$defs を落としてしまい、結果として type: "" としてレンダリングされます。
- チャットテンプレートの jinja に小さな変更を入れることで修正でき、これで Gemma は私のツールを完全に呼び出せるようになりました!
とにかく、HF に PR を出しました。google/gemma-4-31B-it です。
<UPDATE>
私は、直接トップレベルの type で意味を公開しない多くの JSON スキーマ形状に起因する問題のうちの 1 つだけを解決したのだと気づきました。そこで、jinja を次の点に対応するよう更新しました:
これで jinja は次を保持します:
- $ref
- anyOf
- oneOf
- allOf
- $defs
- enum
- const
- type: ["string", "null"]
- 配列/オブジェクトを含む型の配列に対する items / properties
- null 値を null
修正済みの jinja:
https://pastebin.com/tBAHN6FV
[link] [comments]




