【速報】Claude Code + LiteLLM + Gemini 3  コマンド実行が失敗する原因

エンジニアの皆さん、こんにちは。

最近、Claude CodeLiteLLM、そして Gemini 3 Flash-preview を組み合わせて費用対効果を上げている当ブログ。

しかし本日3月12日、「昨日まで動いていた簡単なコマンド(ls -Rなど)が急に失敗するようになった」という事象を確認しました。ログを解析したところ、Gemini側のアップデートに伴う APIレスポンスの構造変化 が原因であることが判明しました。

今回はその詳細と、現時点での解決策を共有します。


1. 発生している現象

Claude Code上からGemini 3 Flash-previewを呼び出し、ファイル一覧の取得やコミットなどのツール実行(Bashコマンド等)を行おうとすると、エラーが発生して処理が中断される。

2. 原因:thoughtSignature(思考プロセス)の混入

Geminiのログ(JSONレスポンス)を比較したところ、ツール呼び出し(Function Call)時の構造に変化がありました。

❌ 失敗時のログ(現在の挙動)

{
  "functionCall": {
    "name": "Bash",
    "args": { "command": "ls -R", ... }
  },
  "thoughtSignature": "Eq0ECqoEAb4..." // ←ココが問題!
}

functionCall と同じ階層に、「思考プロセス(thoughtSignature)」が同居してしまっています。

多くのツール(LiteLLMのパーサーなど)は、「ツール呼び出しのブロックには、ツール実行に必要なデータのみが含まれる」という厳格なスキーマを想定しています。そこに予期せぬ thoughtSignature というキーが入ってきたことで、解析エラー(Validation Error)を引き起こしているのが真相です。

✅ 正常時のログ(以前の挙動、またはテキスト回答時)

以前は、以下のように「テキスト回答」と「思考データ」が別々のパーツとして分離されていました。

"parts": [
  { "text": "commit this" },
  { "text": "", "thoughtSignature": "EjQKMg..." }
]

このように分離されていれば、ツール側は不要なパーツを無視できるため、正常に動作していました。


3. 今すぐできる対策は?

いろいろ試しましたが、いまのところ解決策がなく。LiteLLM のアップデートを待つのが最善な気がしています。


まとめ

「昨日まで動いていたのに…」という時の原因の多くは、AIモデル側のレスポンス形式の微細な変化にあります。特に Gemini 3 Flash-preview のような最先端モデルは「動く標的」です。

複数社、複数モデルを使えるようにしておくのが、一番の予防策かもしれません

タイトルとURLをコピーしました