|

解決 OpenClaw 調用 Gemini 圖片識別失敗的 3 種方法:OpenAI 兼容模式常見報錯與原生格式配置指南

OpenClaw 中使用 OpenAI 兼容模式調用 Gemini 模型進行圖片識別時經常遇到報錯,是很多開發者在配置多模態 AI 代理時的常見痛點。本文將深入分析 Invalid JSON payload 報錯的根本原因,並提供 3 種經過驗證的解決方案,幫助你快速修復 OpenClaw Gemini 圖片識別失敗問題。

核心價值: 讀完本文,你將理解 OpenAI 兼容模式與 Gemini 原生 API 的關鍵差異,掌握正確的配置方法,徹底解決圖片識別失敗問題。

<!-- 背景 --> <!-- 標題 --> OpenClaw + Gemini 圖片識別故障排查與解決路徑 <!-- 頂部:問題節點 --> OpenAI 兼容模式調用 Gemini → 400 錯誤 <!-- 向下箭頭 --> <!-- 原因分析 --> 根因: JSON Schema 字段不兼容 (patternProperties / const) <!-- 向下分支箭頭 --> <!-- 方案一 --> 方案一: 原生格式 google-generative-ai 去掉 /openai 路徑 推薦 ✅ <!-- 方案二 --> 方案二: API 中轉 API易 自動格式轉換 多模型統一調用 最省心 ✅ <!-- 方案三 --> 方案三: 手動清理 代碼移除不兼容字段 維護成本高 最靈活 ⚙️ <!-- 底部結果 --> Gemini 圖片識別恢復正常 視覺理解 · 工具調用 · 多模態輸入


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 Schema
報錯字段 patternPropertiesconst Gemini 不支持的 JSON Schema 關鍵字
觸發條件 使用 OpenAI 兼容模式 (openai-completions 格式轉換不完整
復現頻率 高頻復現,偶爾重試可成功 Schema 校驗有時被跳過
影響範圍 圖片識別、工具調用均受影響 非圖片本身問題

OpenClaw Gemini 圖片識別失敗的快速診斷

一個常見的誤區是認爲 Gemini 的圖片識別能力有問題。實際上,使用 Gemini 官方的視覺理解 demo 直接測試 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 Key 和模型本身沒問題。通過 API易 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 錯誤

<!-- 標題 --> OpenAI 兼容模式 vs Gemini 原生模式 請求流程對比 <!-- 分隔線 --> <!-- 左側標題 --> ❌ OpenAI 兼容模式 <!-- 右側標題 --> ✅ Gemini 原生模式 <!-- 左側流程 --> <!-- Step 1 --> OpenClaw 構建請求 api: “openai-completions” <!-- Step 2 --> 包含 OpenAI 格式 JSON Schema patternProperties / const / $schema <!-- Step 3 --> 發送到 Gemini 兼容端點 …/v1beta/openai/chat/completions <!-- Step 4 --> Gemini 解析 function_declarations 遇到不支持的字段 → 校驗失敗 <!-- Step 5 失敗 --> 400 Bad Request Unknown name “patternProperties” <!-- 右側流程 --> <!-- Step 1 --> OpenClaw 構建請求 api: “google-generative-ai” <!-- Step 2 --> Gemini 原生格式 Schema 兼容的 function_declarations <!-- Step 3 --> 發送到 Gemini 原生端點 …/v1beta/models/gemini:generate <!-- Step 4 --> Gemini 正常解析請求 Schema 完全兼容 → 校驗通過 <!-- Step 5 成功 --> 200 OK 圖片識別結果正常返回 <!-- 底部說明 --> 核心差異: api 參數從 “openai-completions” → “google-generative-ai” baseUrl 去掉 /openai 後綴 · Schema 格式自動適配 · 圖片識別完全支持

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 的格式要求不匹配。


解決方案一:切換 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 快速切換

# 方式一: 重新初始化 Gemini 配置
openclaw onboard --auth-choice gemini-api-key

# 方式二: 手動編輯配置文件
# 配置文件位置: ~/.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
        }
      }
    }
  }
}

🚀 快速開始: 如果你不想手動處理配置兼容性問題,推薦使用 API易 apiyi.com 平臺的統一接口。平臺內部會自動將 OpenAI 格式請求轉換爲 Gemini 原生格式,開發者無需關注 Schema 差異。


解決方案二:通過 API 中轉平臺自動處理兼容性

如果你希望在 OpenClaw 中繼續使用 OpenAI 兼容模式調用多種模型(包括 Gemini),可以通過 API 中轉平臺來解決格式兼容性問題。

中轉平臺的工作原理

OpenClaw (OpenAI 格式請求)
    ↓
API 中轉平臺 (如 API易)
    ↓ 自動清理不兼容的 JSON Schema 字段
    ↓ 自動轉換請求格式
Gemini API (原生格式)
    ↓
✅ 正常返回圖片識別結果

配置示例

# 通過 API易 中轉平臺調用 Gemini 圖片識別
import openai
import base64

client = openai.OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://api.apiyi.com/v1"  # API易 統一接口
)

# 讀取圖片並編碼
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 通過 API易 中轉
JSON Schema 兼容性 ❌ 需手動處理 ✅ 自動清理
OpenAI SDK 兼容 ⚠️ 部分兼容 ✅ 完全兼容
多模型切換 需修改配置 改 model 參數即可
圖片格式 base64 inline base64 inline
工具調用 受限 Schema 自動轉換
額外成本 平臺費用

在 OpenClaw 中配置 API易 中轉:

{
  "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 等),通過 API易 apiyi.com 統一管理 API 調用是更高效的選擇,避免爲每個模型單獨配置不同的 API 格式。


解決方案三:手動清理 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 種解決方案對比與選型建議

<!-- 標題 --> 3 種解決方案對比矩陣 <!-- 表頭 --> 對比維度 方案一: 原生格式 方案二: API 中轉 方案三: 手動清理 <!-- 行1: 配置難度 --> 配置難度 ⭐⭐ 簡單 最簡單 ⭐⭐⭐ 較複雜 <!-- 行2: 維護成本 --> 維護成本 最低 <!-- 行3: 多模型兼容 --> 多模型兼容 Gemini 專用 多模型通用 ✅ 需逐個適配 <!-- 行4: 圖片識別 --> 圖片識別 完全支持 ✅ 完全支持 ✅ 支持 ✅ <!-- 行5: 推薦場景 --> 推薦場景 僅使用 Gemini 最穩定方案 多模型混合使用 最省心方案 自建 AI 系統 最靈活方案 <!-- 底部決策建議 --> 選型決策建議 只用 Gemini → 方案一 (原生格式) | 多模型混用 → 方案二 (API易中轉) 自建系統需要精細控制 → 方案三 (手動清理) | 不確定 → 先試方案二 數據來源: API易 apiyi.com 技術團隊整理

對比維度 方案一:原生格式 方案二:API 中轉 方案三:手動清理
配置難度 ⭐⭐ 簡單 ⭐ 最簡單 ⭐⭐⭐ 較複雜
維護成本 最低
兼容性 Gemini 專用 多模型通用 需逐個適配
圖片識別 ✅ 完全支持 ✅ 完全支持 ✅ 支持
工具調用 ✅ 原生支持 ✅ 自動轉換 ⚠️ 需持續更新
多模型切換 需切換配置 改參數即可 需不同清理邏輯
推薦場景 僅用 Gemini 多模型混用 自建系統

選型決策樹

  • 只在 OpenClaw 中使用 Gemini → 方案一(原生格式),最穩定
  • OpenClaw 中混用多種模型 → 方案二(API易中轉),最省心
  • 自建 AI 應用需要精細控制 → 方案三(手動清理),最靈活
  • 不確定選哪個 → 先試方案二,通過 API易 apiyi.com 快速驗證

常見問題

Q1: 爲什麼 Gemini 不支持完整的 JSON Schema 規範?

Gemini 的 function_declarations 使用的是 OpenAPI 3.0 規範的受限子集,而非完整的 JSON Schema Draft 7+。Google 在設計時選擇了更嚴格的校驗策略,不支持 patternPropertiesconstadditionalProperties 等高級字段。這與 OpenAI 的實現不同,OpenAI 對 JSON Schema 的支持更爲寬鬆。通過 API易 apiyi.com 等中轉平臺可以自動處理這些差異,無需開發者手動適配。

Q2: 切換原生格式後,OpenClaw 的其他功能會受影響嗎?

不會。切換到 google-generative-ai 後,OpenClaw 的文本對話、工具調用、代碼生成等功能均正常工作,且圖片識別和多模態能力反而更穩定。唯一需要注意的是 thinking 參數的格式變化——原生模式使用 thinkingBudget 而非 reasoning_effort

Q3: 重試後偶爾能成功是怎麼回事?

這是因爲 Gemini 的 OpenAI 兼容端點對 Schema 的校驗並非每次都嚴格執行。在某些請求中,如果不涉及複雜工具調用(即請求中沒有包含不兼容的 Schema 字段),請求可以正常通過。但只要涉及工具調用且 Schema 包含不兼容字段,就會觸發 400 錯誤。

Q4: 使用 API 中轉平臺會增加延遲嗎?

會有少量增加,通常在 50-150ms 左右。對於圖片識別這類本身需要 1-3 秒處理的任務,這個延遲幾乎可以忽略不計。API易 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 圖片識別失敗的根本原因是 OpenAI 兼容模式下的 JSON Schema 字段不兼容,而非 Gemini 模型的視覺能力有問題。3 種解決方案各有適用場景:

  • 原生格式google-generative-ai): 最徹底,推薦單一使用 Gemini 的場景
  • API 中轉: 最省心,推薦多模型混用的場景
  • 手動清理 Schema: 最靈活,推薦自建系統的場景

推薦通過 API易 apiyi.com 快速驗證 Gemini 圖片識別效果,平臺支持 Gemini、GPT、Claude 等主流模型的統一調用,自動處理各模型 API 格式差異。

參考資料

  1. Gemini 官方文檔 – 圖片理解: Gemini 視覺理解能力說明

    • 鏈接: ai.google.dev/gemini-api/docs/image-understanding
  2. Gemini 官方文檔 – OpenAI 兼容: OpenAI SDK 調用 Gemini 的說明

    • 鏈接: ai.google.dev/gemini-api/docs/openai
  3. OpenClaw GitHub Issue #21172: patternProperties 導致 Gemini API 400 錯誤

    • 鏈接: github.com/openclaw/openclaw/issues/21172
  4. OpenClaw GitHub Issue #14456: Gemini 2.5 Flash OpenAI 兼容模式 400 錯誤

    • 鏈接: github.com/openclaw/openclaw/issues/14456
  5. OpenClaw 模型配置文檔: 模型提供商配置指南

    • 鏈接: docs.openclaw.ai/concepts/model-providers

📝 本文作者: APIYI Team — 專注 AI 大模型 API 接入與技術解析
🔗 更多教程: 訪問 API易 apiyi.com 獲取更多模型調用指南和免費測試額度

Similar Posts