Skip to main content
When you call Gemini のネイティブ形式 (/v1beta generateContent), the response uses Google’s candidates / parts 構造で、OpenAI 互換モードとは異なります。このページでは、非ストリーミング(generateContent)とストリーミング(streamGenerateContent)の両方を解析する方法を説明します。
リクエスト側(base_url は https://api.apiyi.com で、/v1 なし、x-goog-api-key 認証、thinking_level 制御)は Gemini Native Format Guide で説明しています。このページはレスポンス側のみを扱います。例では軽量モデル 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シリーズのモデルは、部分に thoughtSignature(暗号化された推論状態)を付与します — テストでは、軽量版の gemini-3.1-flash-lite でもこれが返ります
  • シングルターン: 不要です。無視してください。
  • マルチターン / 関数呼び出し: 前回レスポンスの thoughtSignature を次のターンの contentsそのまま返し、モデルが推論チェーンを継続できるようにします。公式の google-genai SDK はこれを自動的に処理します。REST を手書きする場合は、フィールドを落とさないでください。Gemini の関数呼び出し を参照してください。
これは OpenAI compatible mode との重要な違いです。互換モードでは推論モデルはステートレスで、シグネチャを公開しません。thoughtSignature を持つのはネイティブ形式だけで、これをターンをまたいで返す必要があります。

ストリーミング応答 (SSE)

エンドポイント …:streamGenerateContent。各行は data: {...} で、各チャンクの増分は candidates[0].content.parts[0].text です:
APIYI ゲートウェイ経由では、ストリーミングは常に SSE data: 行を返します?alt=sse の有無にかかわらず)、また [DONE] の終端子はありませんfinishReason == "STOP" を持つチャンクで終了します。その最後のチャンクには通常、thoughtSignature のみが含まれ、text は含まれません
usageMetadata各チャンクに含まれ、累積されますcandidatesTokenCount は出力とともに増えます)— 最後の チャンクの値だけを使えばよく、手動で合計する必要はありません。

OpenAI互換モードとの主な違い

使用量と課金

  • thoughtsTokenCount(推論用 token)は出力レートで課金されます。コストを抑えるには、thinking_levelを使って上限を設定してください。
  • キャッシュヒット項目(cachedContentTokenCount)の割引については、Gemini キャッシュ課金をご覧ください。
  • 完全なフィールドリファレンスは、Gemini ネイティブ形式ガイドの「使用量フィールド」セクションにあります。

関連リンク