OpenClawでOpenAI互換モードを使用してGeminiモデルを呼び出し、画像認識を行う際にエラーが発生することは、マルチモーダルAIエージェントを構築する多くの開発者にとって共通の悩みです。本記事では、「Invalid JSON payload」エラーの根本原因を深く分析し、OpenClawでのGemini画像認識失敗問題を迅速に解決するための3つの検証済みソリューションを提供します。
コアバリュー: 本記事を読むことで、OpenAI互換モードとGeminiネイティブAPIの決定的な違いを理解し、正しい設定方法を習得して、画像認識エラーを完全に解決できるようになります。

OpenClaw Gemini 画像認識失敗のエラー現象
OpenClawでGeminiモデルを設定した後、画像認識を試みると、バックグラウンドログに通常以下のような典型的なエラーが表示されます。
Invalid JSON payload received. Unknown name "patternProperties"
at 'tools[0].function_declarations[3].parameters.properties[4].value':
Cannot find field.
Invalid JSON payload received. Unknown name "const"
at 'tools[0].function_declarations[37].parameters.properties[0].value':
Cannot find field.
OpenClaw Gemini 画像認識エラーの主な特徴
| 特徴 | 具体的な状況 | 診断の意義 |
|---|---|---|
| エラー箇所 | tools[0].function_declarations |
ツール呼び出しのJSONスキーマに問題あり |
| エラーフィールド | patternProperties、const |
GeminiがサポートしていないJSONスキーマキーワード |
| 発生条件 | OpenAI互換モード (openai-completions) を使用 |
形式変換が不完全 |
| 再現頻度 | 高頻度で再現、稀にリトライで成功 | スキーマ検証がスキップされる場合があるため |
| 影響範囲 | 画像認識、ツール呼び出しの両方に影響 | 画像そのものの問題ではない |
OpenClaw Gemini 画像認識失敗の迅速な診断
Geminiの画像認識能力に問題があると思い込むのはよくある誤解です。実際には、Gemini公式のビジョン理解デモを使用してAPIを直接テストすれば、画像認識機能は完全に正常に動作します。問題は、OpenClawがOpenAI互換モードを通じてリクエストを転送する際の形式の非互換性にあります。
検証方法は非常に簡単です。
# Gemini APIを直接呼び出して画像認識をテスト — 完全に正常
import google.generativeai as genai
import PIL.Image
genai.configure(api_key="YOUR_GEMINI_API_KEY")
model = genai.GenerativeModel("gemini-2.5-flash")
image = PIL.Image.open("test.jpg")
response = model.generate_content(["この画像を説明してください", image])
print(response.text) # ✅ 正常に画像の説明が出力される
🎯 診断アドバイス: OpenClawでGeminiの画像認識問題が発生した場合は、まず上記の方法でAPIキーとモデル自体に問題がないことを確認してください。APIYI (apiyi.com) プラットフォームを利用すれば、Geminiのビジョン理解能力を素早くテストでき、プラットフォーム側で自動的に形式の互換性問題を処理してくれます。
OpenClaw Gemini 画像認識失敗の根本原因分析
問題の根本原因を理解することで、最適な解決策を選択できるようになります。OpenClaw で Gemini の画像認識が失敗する核心的な理由は、JSON Schema の互換性の問題にあります。
OpenAI と Gemini のツール呼び出しにおける JSON Schema の違い
OpenClaw が OpenAI 互換モード(openai-completions)を使用して Gemini を呼び出す際、リクエストの流れは以下のようになります。
OpenClaw がリクエストを構築 (OpenAI 形式)
↓
ツール定義を含む JSON Schema が含まれる
↓
Gemini の OpenAI 互換エンドポイントへ送信
↓
Gemini が function_declarations を解析
↓
❌ 未対応の Schema フィールドを検出 → 400 エラー

Gemini API がサポートしていない JSON Schema フィールド一覧
これが問題の核心です。Gemini の function_declarations における JSON Schema のサポートは制限されたサブセットとなっており、以下のフィールドは直接 400 エラーを引き起こします。
| 未対応フィールド | OpenAI のサポート | エラーメッセージ | 影響度 |
|---|---|---|---|
patternProperties |
✅ 対応 | Unknown name "patternProperties" | 🔴 高 |
const |
✅ 対応 | Unknown name "const" | 🔴 高 |
additionalProperties |
✅ 対応 | Unknown name "additionalProperties" | 🔴 高 |
$schema |
✅ 対応 | Unknown name "$schema" | 🟡 中 |
exclusiveMaximum |
✅ 対応 | Unknown name "exclusiveMaximum" | 🟡 中 |
exclusiveMinimum |
✅ 対応 | Unknown name "exclusiveMinimum" | 🟡 中 |
propertyNames |
✅ 対応 | Unknown name "propertyNames" | 🟡 中 |
なぜ GPT-5.4 に切り替えると問題ないのか
これは、根本原因分析をさらに裏付けるものです。OpenClaw でモデルを Gemini から GPT-5.4 に切り替えると、画像認識は直ちに正常に戻ります。これは、GPT-5.4 の API が JSON Schema 仕様を完全にネイティブサポートしており、OpenClaw が生成するツール定義 Schema が完全に適合しているためです。
📌 重要なポイント: これは Gemini の画像認識能力の問題ではなく、OpenClaw の OpenAI 互換モードが送信するツール Schema が、Gemini API のフォーマット要件と一致していないことが原因です。
解決策1:Geminiネイティブ形式への切り替え(推奨)
最も確実な解決策は、OpenClawでGeminiのAPIインターフェースタイプを openai-completions から google-generative-ai ネイティブ形式へ切り替えることです。
設定手順
変更前 (OpenAI互換モード — 問題あり):
{
"provider": "google",
"model": "gemini-2.5-flash",
"baseUrl": "https://generativelanguage.googleapis.com/v1beta/openai",
"api": "openai-completions",
"apiKey": "YOUR_GEMINI_API_KEY"
}
変更後 (Geminiネイティブ形式 — 推奨):
{
"provider": "google",
"model": "gemini-2.5-flash",
"baseUrl": "https://generativelanguage.googleapis.com/v1beta",
"api": "google-generative-ai",
"apiKey": "YOUR_GEMINI_API_KEY"
}
ネイティブ形式設定の主な変更点
| 設定項目 | OpenAI互換モード | Geminiネイティブ形式 | 説明 |
|---|---|---|---|
baseUrl |
.../v1beta/openai |
.../v1beta |
/openai パスを削除 |
api |
openai-completions |
google-generative-ai |
インターフェースタイプを切り替え |
| 画像形式 | base64 inline | base64 / File API | ネイティブで多様な形式をサポート |
| ツール呼び出し | OpenAI function calling | Gemini function declarations | Schemaは完全互換 |
| thinking パラメータ | 非互換パラメータが送信される可能性 | ネイティブ thinkingBudget | 競合なし |
OpenClaw CLIによるクイック切り替え
# 方法1: Gemini設定を再初期化
openclaw onboard --auth-choice gemini-api-key
# 方法2: 設定ファイルを直接編集
# 設定ファイルの場所: ~/.openclaw/config.json
# api フィールドを "openai-completions" から "google-generative-ai" に変更
OpenClaw Geminiネイティブ設定ファイルの完全な例を表示
{
"providers": {
"google": {
"apiKey": "YOUR_GEMINI_API_KEY",
"models": {
"gemini-2.5-flash": {
"api": "google-generative-ai",
"baseUrl": "https://generativelanguage.googleapis.com/v1beta",
"capabilities": {
"vision": true,
"functionCalling": true,
"streaming": true
},
"reasoning": false
},
"gemini-2.5-pro": {
"api": "google-generative-ai",
"baseUrl": "https://generativelanguage.googleapis.com/v1beta",
"capabilities": {
"vision": true,
"functionCalling": true,
"streaming": true
},
"reasoning": true,
"thinkingBudget": 8192
}
}
}
}
}
🚀 クイックスタート: 設定の互換性問題を個別に管理したくない場合は、APIYI (apiyi.com) プラットフォームの統合インターフェースの使用をお勧めします。プラットフォーム側でOpenAI形式のリクエストを自動的にGeminiネイティブ形式に変換するため、開発者はSchemaの違いを気にする必要がありません。
解決策2:API中継サービスによる自動互換性処理
OpenClawで引き続きOpenAI互換モードを使用して複数のモデル(Geminiを含む)を呼び出したい場合は、API中継サービスを利用してフォーマットの互換性問題を解決できます。
中継サービスの仕組み
OpenClaw (OpenAI形式リクエスト)
↓
API中継サービス (例: APIYI)
↓ 互換性のないJSON Schemaフィールドを自動クリーンアップ
↓ リクエスト形式を自動変換
Gemini API (ネイティブ形式)
↓
✅ 画像認識結果を正常に返却
設定例
# APIYI 中継サービス経由でGeminiの画像認識を呼び出す
import openai
import base64
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.apiyi.com/v1" # APIYI 統合インターフェース
)
# 画像を読み込んでエンコード
with open("test.jpg", "rb") as f:
image_data = base64.b64encode(f.read()).decode("utf-8")
response = client.chat.completions.create(
model="gemini-2.5-flash",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "この画像の内容を説明してください"},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{image_data}"
}
}
]
}
]
)
print(response.choices[0].message.content)
中継サービス vs 直結の比較
| 比較項目 | Gemini API直結 | APIYI中継利用 |
|---|---|---|
| JSON Schema互換性 | ❌ 手動対応が必要 | ✅ 自動クリーンアップ |
| OpenAI SDK互換 | ⚠️ 部分的互換 | ✅ 完全互換 |
| モデル切り替え | 設定変更が必要 | modelパラメータ変更のみ |
| 画像形式 | base64 inline | base64 inline |
| ツール呼び出し | Schema制限あり | 自動変換 |
| 追加コスト | なし | プラットフォーム利用料 |
OpenClawでAPIYI中継を設定する場合:
{
"provider": "apiyi",
"model": "gemini-2.5-flash",
"baseUrl": "https://api.apiyi.com/v1",
"api": "openai-completions",
"apiKey": "YOUR_APIYI_KEY"
}
💡 選択のアドバイス: OpenClawで複数のモデル(GPT-5.4、Claude、Geminiなど)を同時に使用している場合、APIYI (apiyi.com) を通じてAPI呼び出しを一元管理する方が効率的です。モデルごとに異なるAPI形式を設定する手間を省くことができます。
解決策3:JSON Schema の非互換フィールドを手動でクリーンアップする
コードレベルで互換性の問題を解決したい場合は、リクエストを送信する前に Gemini がサポートしていない JSON Schema フィールドを手動で削除することができます。
JSON Schema クリーンアップ関数
def clean_schema_for_gemini(schema: dict) -> dict:
"""Gemini がサポートしていない JSON Schema フィールドをクリーンアップする"""
unsupported_keys = {
"patternProperties",
"const",
"additionalProperties",
"$schema",
"exclusiveMaximum",
"exclusiveMinimum",
"propertyNames",
}
if isinstance(schema, dict):
return {
k: clean_schema_for_gemini(v)
for k, v in schema.items()
if k not in unsupported_keys
}
elif isinstance(schema, list):
return [clean_schema_for_gemini(item) for item in schema]
return schema
ツール定義のクリーンアップと呼び出しの完全なサンプルを見る
import openai
import json
def clean_schema_for_gemini(schema):
"""Gemini がサポートしていない JSON Schema フィールドを再帰的にクリーンアップする"""
unsupported_keys = {
"patternProperties", "const", "additionalProperties",
"$schema", "exclusiveMaximum", "exclusiveMinimum",
"propertyNames", "if", "then", "else",
"allOf", "anyOf", "oneOf", "not",
}
if isinstance(schema, dict):
cleaned = {}
for k, v in schema.items():
if k not in unsupported_keys:
cleaned[k] = clean_schema_for_gemini(v)
return cleaned
elif isinstance(schema, list):
return [clean_schema_for_gemini(item) for item in schema]
return schema
def clean_tools_for_gemini(tools):
"""ツールリスト内のすべての Schema をクリーンアップする"""
cleaned_tools = []
for tool in tools:
tool_copy = json.loads(json.dumps(tool))
if "function" in tool_copy:
params = tool_copy["function"].get("parameters", {})
tool_copy["function"]["parameters"] = clean_schema_for_gemini(params)
cleaned_tools.append(tool_copy)
return cleaned_tools
# 使用例
tools = [
{
"type": "function",
"function": {
"name": "analyze_image",
"description": "画像の内容を分析する",
"parameters": {
"type": "object",
"properties": {
"image_url": {"type": "string"},
"detail": {"type": "string", "const": "high"} # Gemini は非対応
},
"patternProperties": {"^x-": {"type": "string"}}, # Gemini は非対応
"additionalProperties": False # Gemini は非対応
}
}
}
]
# クリーンアップ後に呼び出し
cleaned_tools = clean_tools_for_gemini(tools)
client = openai.OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.apiyi.com/v1"
)
response = client.chat.completions.create(
model="gemini-2.5-flash",
messages=[{"role": "user", "content": "Hello"}],
tools=cleaned_tools
)
⚠️ 注意: Schema の手動クリーンアップ手法は、ツールごとのパラメータ定義を個別に処理する必要があるため、メンテナンスコストが高くなります。ツールの数が多い場合や頻繁に変更される場合は、方案一(ネイティブ形式)または方案二(API中継サービス)を優先的に検討してください。
3つの解決策の比較と選定のアドバイス

| 比較項目 | 方案一:ネイティブ形式 | 方案二:API中継 | 方案三:手動クリーンアップ |
|---|---|---|---|
| 設定難易度 | ⭐⭐ 簡単 | ⭐ 最も簡単 | ⭐⭐⭐ やや複雑 |
| メンテナンスコスト | 低 | 最低 | 高 |
| 互換性 | Gemini 専用 | マルチモデル対応 | 個別対応が必要 |
| 画像認識 | ✅ 完全対応 | ✅ 完全対応 | ✅ 対応 |
| ツール呼び出し | ✅ ネイティブ対応 | ✅ 自動変換 | ⚠️ 継続的な更新が必要 |
| モデル切り替え | 設定変更が必要 | パラメータ変更のみ | クリーンアップロジックの変更が必要 |
| 推奨シーン | Gemini のみ使用 | マルチモデル混用 | 自社開発システム |
選定の意思決定ツリー
- OpenClaw で Gemini のみを使用する → 方案一(ネイティブ形式)、最も安定
- OpenClaw で複数のモデルを混用する → 方案二(APIYI中継)、最も手間がかからない
- 自社開発の AI アプリで詳細な制御が必要 → 方案三(手動クリーンアップ)、最も柔軟
- どれを選ぶか迷っている → まずは方案二を試し、APIYI (apiyi.com) で素早く検証してください
よくある質問
Q1: なぜ Gemini は完全な JSON Schema 仕様をサポートしていないのですか?
Gemini の function_declarations は、完全な JSON Schema Draft 7+ ではなく、OpenAPI 3.0 仕様の制限付きサブセットを使用しています。Google は設計時に、より厳格な検証戦略を選択しており、patternProperties、const、additionalProperties などの高度なフィールドはサポートされていません。これは OpenAI の実装とは異なり、OpenAI の JSON Schema サポートはより柔軟です。APIYI (apiyi.com) のような API中継サービスを利用すれば、これらの差異を自動的に処理できるため、開発者が手動で調整する必要はありません。
Q2: ネイティブ形式に切り替えた場合、OpenClaw の他の機能に影響はありますか?
いいえ、影響はありません。google-generative-ai に切り替えても、OpenClaw のテキスト対話、ツール呼び出し、コード生成などの機能はすべて正常に動作し、画像認識やマルチモーダル機能はむしろ安定します。唯一注意が必要なのは thinking パラメータの形式変更です。ネイティブモードでは reasoning_effort ではなく thinkingBudget を使用します。
Q3: 再試行するとたまに成功するのはなぜですか?
これは、Gemini の OpenAI 互換エンドポイントによる Schema の検証が、毎回厳密に実行されるわけではないためです。一部のリクエストにおいて、複雑なツール呼び出しが含まれていない場合(つまり、リクエストに非互換の Schema フィールドが含まれていない場合)、リクエストは正常に通過します。しかし、ツール呼び出しが含まれ、かつ Schema に非互換のフィールドが含まれている場合は、400 エラーが発生します。
Q4: API中継サービスを使用すると遅延が増えますか?
わずかな遅延(通常 50〜150ms 程度)が発生します。画像認識のように処理自体に 1〜3 秒かかるタスクであれば、この遅延はほぼ無視できるレベルです。APIYI (apiyi.com) プラットフォームは主要なモデルに対してルーティング最適化を行っているため、実際の使用感への影響は非常にわずかです。
Q5: OpenClaw 以外でも同様の問題は発生しますか?
はい。LiteLLM、LangChain、Qwen Code などのツールでも、OpenAI 互換モードを通じて Gemini を呼び出す際に、同様の JSON Schema 互換性の問題が報告されています(GitHub issue: BerriAI/litellm#14330、langchain-ai/langchainjs#8584)。これは Gemini API の一般的な制限であり、OpenClaw 特有の問題ではありません。
まとめ
OpenClaw で Gemini の画像認識が失敗する根本的な原因は、Gemini モデルの視覚能力の問題ではなく、OpenAI 互換モードにおける JSON Schema フィールドの非互換性にあります。以下の 3 つの解決策には、それぞれ適したシナリオがあります。
- ネイティブ形式 (
google-generative-ai): 最も根本的な解決策。Gemini のみを単独で使用するシナリオに推奨。 - API中継: 最も手間がかからない。複数のモデルを組み合わせて使用するシナリオに推奨。
- Schema の手動クリーニング: 最も柔軟。自社システムを構築している場合に推奨。
Gemini の画像認識効果を素早く検証するには、APIYI (apiyi.com) の利用をおすすめします。同プラットフォームは Gemini、GPT、Claude などの主要モデルの統一呼び出しをサポートしており、各モデルの API 形式の差異を自動的に処理します。
参考資料
-
Gemini 公式ドキュメント – 画像理解: Gemini の視覚理解能力に関する説明
- リンク:
ai.google.dev/gemini-api/docs/image-understanding
- リンク:
-
Gemini 公式ドキュメント – OpenAI 互換性: OpenAI SDK を使用した Gemini 呼び出しに関する説明
- リンク:
ai.google.dev/gemini-api/docs/openai
- リンク:
-
OpenClaw GitHub Issue #21172: patternProperties に起因する Gemini API 400 エラーについて
- リンク:
github.com/openclaw/openclaw/issues/21172
- リンク:
-
OpenClaw GitHub Issue #14456: Gemini 2.5 Flash OpenAI 互換モードでの 400 エラーについて
- リンク:
github.com/openclaw/openclaw/issues/14456
- リンク:
-
OpenClaw モデル設定ドキュメント: モデルプロバイダーの設定ガイド
- リンク:
docs.openclaw.ai/concepts/model-providers
- リンク:
📝 執筆者: APIYI Team — 大規模言語モデルの API 連携と技術解説に特化
🔗 その他のチュートリアル: APIYI (apiyi.com) にアクセスして、モデル呼び出しガイドや無料のテストクレジットを入手してください
