/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_TOKENS と SAFETY があります。part には thoughtSignature のみが含まれ、text は含まれない場合があるため、反復処理する際は if "text" in p でフィルターしてください。そうしないと KeyError が発生します。thoughtSignature
Gemini 3シリーズのモデルは、部分にthoughtSignature(暗号化された推論状態)を付与します — テストでは、軽量版の gemini-3.1-flash-lite でもこれが返ります。
- シングルターン: 不要です。無視してください。
- マルチターン / 関数呼び出し: 前回レスポンスの
thoughtSignatureを次のターンのcontentsにそのまま返し、モデルが推論チェーンを継続できるようにします。公式のgoogle-genaiSDK はこれを自動的に処理します。REST を手書きする場合は、フィールドを落とさないでください。Gemini の関数呼び出し を参照してください。
ストリーミング応答 (SSE)
エンドポイント…:streamGenerateContent。各行は data: {...} で、各チャンクの増分は candidates[0].content.parts[0].text です:
usageMetadata は 各チャンクに含まれ、累積されます(candidatesTokenCount は出力とともに増えます)— 最後の チャンクの値だけを使えばよく、手動で合計する必要はありません。OpenAI互換モードとの主な違い
使用量と課金
thoughtsTokenCount(推論用 token)は出力レートで課金されます。コストを抑えるには、thinking_levelを使って上限を設定してください。- キャッシュヒット項目(
cachedContentTokenCount)の割引については、Gemini キャッシュ課金をご覧ください。 - 完全なフィールドリファレンスは、Gemini ネイティブ形式ガイドの「使用量フィールド」セクションにあります。
関連リンク
- 同じグループ: Gemini ネイティブフォーマットガイド · マルチモーダル & コード実行 · Function Calling
- 互換フォーマット対応版: OpenAI 互換モード: レスポンスの処理
- token の取得 / 管理:
https://api.apiyi.com/token