Skip to main content
通過 Gemini 原生格式/v1beta generateContent)呼叫時,響應是 Google 的 candidates / parts 結構,與 OpenAI 相容格式不同。本頁講清非流式(generateContent)與流式(streamGenerateContent)兩種響應怎麼解析。
請求側(base_url 為 https://api.apiyi.com 不帶 /v1x-goog-api-key 鑑權、thinking_level 思考控制)見 Gemini 原生格式呼叫指南。本頁只講響應側。示例用輕量模型 gemini-3.1-flash-lite

非流式響應

端點 …:generateContent正文在 candidates[0].content.parts[]
取正文要遍歷 parts 拼接每個 text
finishReason大寫 STOP(不是 OpenAI 的小寫 stop),其它取值如 MAX_TOKENSSAFETY。一個 part 可能只含 thoughtSignature 而無 text,遍歷時要用 if "text" in p 過濾,否則會 KeyError。

thoughtSignature(思維簽名)

Gemini 3 系列會在 part 上附帶 thoughtSignature(加密的推理狀態)——實測連輕量的 gemini-3.1-flash-lite 也會返回
  • 單輪:用不到,忽略即可。
  • 多輪 / 函式呼叫:要把上一輪響應裡的 thoughtSignature 原樣回傳到下一輪的 contents 中,模型才能延續推理鏈。官方 google-genai SDK 自動處理;手寫 REST 時注意不要丟棄該欄位。詳見 Gemini 函式呼叫
這正是原生格式與 OpenAI 相容模式 的關鍵區別:相容模式下推理模型無狀態、不暴露簽名;原生格式才有 thoughtSignature 且多輪需回傳。

流式響應(SSE)

端點 …:streamGenerateContent,每行 data: {...},每塊的增量在 candidates[0].content.parts[0].text
經 API易 閘道,流式統一返回 SSE 的 data:(加不加 ?alt=sse 都一樣),沒有 [DONE] 終止符——以 finishReason == "STOP" 的那一塊為結束。最後一塊通常只含 thoughtSignature 而無 text
usageMetadata 每塊都帶,且是累計值candidatesTokenCount 隨輸出增長)——以最後一塊為準即可,無需自己累加。

與 OpenAI 相容格式的關鍵差異

usage 與計費

  • thoughtsTokenCount(思考 token)按輸出價計費,可用 thinking_level 控檔省錢。
  • 快取命中 cachedContentTokenCount 的折扣見 Gemini 快取計費
  • 各欄位完整說明見 Gemini 原生格式呼叫指南 的「用量欄位」一節。

相關連結