コンテンツにスキップ

Google Gemini API

Google Gemini API は Google のネイティブ生成 AI プロトコルです。クライアントが既に Google GenAI SDK 仕様に従って開発されている場合、Base URL と API Key を RouteAPI に切り替えるだけで、リクエスト構造を書き直すことなく直接使用できます。

Gemini API は、モデル名を URL パスに埋め込むというユニークな設計を使用しています。リクエストボディは contents 配列で会話を表現し、各メッセージの役割は user または model(assistant ではないことに注意)です。レスポンス構造は candidates 配列でラップされ、安全フィルタリングと複数候補生成をサポートしています。

利用シーン:

シーン説明
Google GenAI SDKgoogle-generativeai Python / Node.js SDK、base_url を変更するだけ
Gemini REST クライアント既に Gemini REST API 用に開発されたアプリケーション
マルチモーダルアプリケーション画像、ビデオ、オーディオ入力のネイティブサポートが必要なシーン
Google AI Studio エクスポートAI Studio からエクスポートされたコードは直接移行可能

クライアントが OpenAI プロトコルのみをサポートしている場合は、Chat Completions を使用してください。RouteAPI は内部で必要なフォーマット変換を行いますが、クライアントがネイティブにサポートするプロトコルを優先することで、最高の互換性が得られます。

Gemini API のエンドポイント設計は独特です:モデル名が URL パスに直接埋め込まれます。

POST /v1beta/models/{model}:generateContent

完全なアドレスの例:

https://api.routeapi.ai/v1beta/models/gemini-1.5-pro:generateContent

ストリーミングエンドポイント:

https://api.routeapi.ai/v1beta/models/gemini-1.5-pro:streamGenerateContent

{model} 部分を実際のモデル名(gemini-1.5-pro、gemini-1.5-flash、gemini-2.0-flash-exp など)に置き換えます。コロン前のモデル名とコロン後のメソッド名の間にスペースはありません。

リクエストヘッダー:

Authorization: Bearer sk-your-routeapi-token
Content-Type: application/json

すべてのプロトコルで同じ RouteAPI Token を使用します。Token はサーバー側に保存し、ブラウザ、モバイルデバイス、または公開リポジトリに公開しないでください。

フィールド型必須説明
contentsarrayはい会話コンテンツリスト、最低1つ
generationConfigobjectいいえ生成設定パラメータ
safetySettingsarrayいいえ安全フィルタリング設定
systemInstructionobjectいいえシステム指示、独立したフィールド
toolsarrayいいえ関数呼び出しツール定義
toolConfigobjectいいえツール呼び出し設定

基本リクエスト例:

{
"contents": [
{
"role": "user",
"parts": [
{ "text": "RouteAPI を一文で紹介してください" }
]
}
],
"generationConfig": {
"temperature": 0.7,
"maxOutputTokens": 1024
}
}

Gemini API は3層のネスト構造を使用します:

  1. contents 配列に複数のメッセージが含まれる
  2. 各メッセージには role と parts フィールドがある
  3. parts 配列に実際のコンテンツブロックが含まれる

主な違い:

  • role は user または model のみ(assistant ではない)
  • コンテンツは parts 配列に配置する必要があり、各要素は part オブジェクト
  • マルチモーダル parts をサポート:テキスト、画像、ビデオ、オーディオを同じメッセージの parts に混在可能
{
"contents": [
{
"role": "user",
"parts": [
{ "text": "この画像を分析してください" },
{
"inlineData": {
"mimeType": "image/jpeg",
"data": "base64エンコードされた画像データ..."
}
}
]
},
{
"role": "model",
"parts": [
{ "text": "これは...を示す画像です" }
]
}
]
}
パラメータ型説明
temperaturenumberサンプリング温度、範囲 0 から 2、デフォルト 1.0
topPnumbernucleus sampling パラメータ、デフォルト 0.95
topKinteger確率が最も高い K 個のトークンからのみサンプリング
maxOutputTokensinteger最大出力トークン数
stopSequencesarrayカスタム停止シーケンス、最大5個
candidateCountinteger生成する候補の数、デフォルト 1
responseMimeTypestringレスポンス形式、例 "application/json"
responseSchemaobject出力構造を制約する JSON Schema

例:

{
"generationConfig": {
"temperature": 0.9,
"topP": 0.95,
"topK": 40,
"maxOutputTokens": 2048,
"stopSequences": ["END", "STOP"]
}
}

システム指示は独立したフィールドで、contents には含まれません:

{
"systemInstruction": {
"parts": [
{ "text": "あなたは厳密な技術アシスタントで、回答は簡潔に保ちます。" }
]
},
"contents": [
{
"role": "user",
"parts": [{ "text": "API ゲートウェイとは何かを説明してください" }]
}
]
}

コンテンツ安全フィルタリングレベルを制御:

{
"safetySettings": [
{
"category": "HARM_CATEGORY_HARASSMENT",
"threshold": "BLOCK_MEDIUM_AND_ABOVE"
},
{
"category": "HARM_CATEGORY_HATE_SPEECH",
"threshold": "BLOCK_MEDIUM_AND_ABOVE"
}
]
}

一般的なカテゴリ: HARM_CATEGORY_HARASSMENT、HARM_CATEGORY_HATE_SPEECH、HARM_CATEGORY_SEXUALLY_EXPLICIT、HARM_CATEGORY_DANGEROUS_CONTENT。

しきい値オプション: BLOCK_NONE、BLOCK_LOW_AND_ABOVE、BLOCK_MEDIUM_AND_ABOVE、BLOCK_ONLY_HIGH。

Gemini API はマルチモーダル入力をネイティブにサポートし、parts 配列の異なるタイプを通じて実現します。

{ "text": "これはテキストコンテンツです" }
{
"inlineData": {
"mimeType": "image/jpeg",
"data": "/9j/4AAQSkZJRgABAQAAAQ..."
}
}

サポートされる画像形式: image/jpeg、image/png、image/webp、image/heic、image/heif。

{
"fileData": {
"mimeType": "image/jpeg",
"fileUri": "https://example.com/image.jpg"
}
}
{
"fileData": {
"mimeType": "video/mp4",
"fileUri": "gs://bucket-name/video.mp4"
}
}

ビデオサポート: video/mp4、video/mpeg、video/mov など。 オーディオサポート: audio/wav、audio/mp3、audio/aac など。

{
"contents": [
{
"role": "user",
"parts": [
{ "text": "このビデオとこの画像の関連性を分析してください" },
{
"fileData": {
"mimeType": "video/mp4",
"fileUri": "gs://my-bucket/video.mp4"
}
},
{
"inlineData": {
"mimeType": "image/jpeg",
"data": "base64..."
}
}
]
}
]
}
{
"candidates": [
{
"content": {
"parts": [
{
"text": "RouteAPI は複数の AI モデルプロバイダーを統一管理する API ゲートウェイです。"
}
],
"role": "model"
},
"finishReason": "STOP",
"safetyRatings": [
{
"category": "HARM_CATEGORY_HARASSMENT",
"probability": "NEGLIGIBLE"
}
]
}
],
"usageMetadata": {
"promptTokenCount": 12,
"candidatesTokenCount": 18,
"totalTokenCount": 30
}
}
フィールド説明
candidates候補レスポンス配列、デフォルトは1つ
candidates[].content生成されたコンテンツ、リクエストの contents 要素と同じ構造
candidates[].content.role常に "model"
candidates[].finishReason完了理由
candidates[].safetyRatings安全評価の詳細
usageMetadataトークン使用統計
値意味
STOPモデルが自然に終了
MAX_TOKENSmaxOutputTokens 制限に達した
SAFETY安全フィルタートリガーによりブロック
RECITATIONコンテンツ重複検出によりブロック
OTHERその他の理由
フィールド説明
promptTokenCount入力トークン数
candidatesTokenCount出力トークン数(すべての候補の合計)
totalTokenCount合計トークン数
cachedContentTokenCountキャッシュヒットトークン数(コンテキストキャッシングを使用した場合)

streamGenerateContent エンドポイントを使用してストリーミングレスポンスを実装:

POST /v1beta/models/{model}:streamGenerateContent

ストリーミングレスポンスは SSE(Server-Sent Events)形式を使用し、各イベントは JSON オブジェクトです:

data: {"candidates":[{"content":{"parts":[{"text":"RouteAPI"}],"role":"model"},"finishReason":""}],"usageMetadata":{"promptTokenCount":12,"candidatesTokenCount":1,"totalTokenCount":13}}
data: {"candidates":[{"content":{"parts":[{"text":" は"}],"role":"model"},"finishReason":""}],"usageMetadata":{"promptTokenCount":12,"candidatesTokenCount":3,"totalTokenCount":15}}
data: {"candidates":[{"content":{"parts":[{"text":"API ゲートウェイ"}],"role":"model"},"finishReason":""}],"usageMetadata":{"promptTokenCount":12,"candidatesTokenCount":5,"totalTokenCount":17}}
data: {"candidates":[{"content":{"parts":[{"text":""}],"role":"model"},"finishReason":"STOP","safetyRatings":[{"category":"HARM_CATEGORY_HARASSMENT","probability":"NEGLIGIBLE"}]}],"usageMetadata":{"promptTokenCount":12,"candidatesTokenCount":18,"totalTokenCount":30}}

ストリーミングの特徴:

  • 各チャンクは完全な JSON オブジェクトで、完全な candidates 構造を含む
  • finishReason が空文字列の場合は継続、値がある場合は完了
  • 最後のチャンクには完全な safetyRatings と最終的な usageMetadata が含まれる
  • ストリーミングレスポンスには明示的な [DONE] マーカーがなく、finishReason で完了を判断

Gemini API は関数呼び出しをサポートし、モデルが外部ツールを呼び出すことを可能にします。

{
"tools": [
{
"functionDeclarations": [
{
"name": "get_weather",
"description": "指定された都市の現在の天気を照会します。都市名は日本語のフル名を使用します。",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "都市名、例: 東京"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"]
}
},
"required": ["city"]
}
}
]
}
]
}

モデルが関数呼び出しリクエストを返す:

{
"candidates": [
{
"content": {
"parts": [
{
"functionCall": {
"name": "get_weather",
"args": {
"city": "東京",
"unit": "celsius"
}
}
}
],
"role": "model"
},
"finishReason": "STOP"
}
]
}

関数実行結果を新しい user メッセージとして返す:

{
"contents": [
{
"role": "user",
"parts": [{ "text": "東京の現在の天気はどうですか?" }]
},
{
"role": "model",
"parts": [
{
"functionCall": {
"name": "get_weather",
"args": { "city": "東京", "unit": "celsius" }
}
}
]
},
{
"role": "user",
"parts": [
{
"functionResponse": {
"name": "get_weather",
"response": {
"content": "東京、晴れ、気温 23 度、湿度 45%。"
}
}
}
]
}
]
}
項目Gemini APIOpenAI Chat Completions
エンドポイント形式/v1beta/models/{model}:generateContent/v1/chat/completions
モデル指定URL パス内リクエストボディの model フィールド
会話配列フィールドcontentsmessages
メッセージ構造role + parts 配列role + content 文字列/配列
役割名user / modeluser / assistant / system
システム指示systemInstruction オブジェクトmessages 内の role: "system"
レスポンスラッパーcandidates 配列choices 配列
レスポンスコンテンツの場所candidates[0].content.parts[0].textchoices[0].message.content
完了理由フィールドfinishReasonfinish_reason
使用統計フィールドusageMetadatausage
Gemini APIOpenAI Chat Completions備考
generationConfig.temperaturetemperatureGemini 上限 2、OpenAI も 2
generationConfig.topPtop_p命名スタイルが異なる
generationConfig.topK対応なしOpenAI はサポートなし
generationConfig.maxOutputTokensmax_tokens / max_completion_tokensフィールド名が異なる
generationConfig.stopSequencesstop名前が異なる
generationConfig.candidateCountn意味は同じ
generationConfig.responseMimeTyperesponse_format.type制御方法が異なる
generationConfig.responseSchemaresponse_format.json_schema階層が異なる
safetySettings対応なしOpenAI はコンテンツモデレーション API を使用
tools[].functionDeclarationstools[].functionラッパーレベルが異なる
toolConfigtool_choiceフィールド名と構造が異なる

OpenAI から Gemini API に移行する際は、以下の順序で確認:

  1. モデル名を URL パスに移動: /v1beta/models/gemini-1.5-pro:generateContent
  2. messages を contents に改名、各メッセージの構造を role + parts 配列に変更
  3. すべての assistant 役割を model に変更
  4. content フィールドを parts 配列に変更、テキストコンテンツを { "text": "..." } でラップ
  5. システムプロンプトを messages 配列から systemInstruction オブジェクトに移動
  6. 生成パラメータを generationConfig オブジェクトにラップし、フィールド名を調整(例: maxOutputTokens、stopSequences)
  7. レスポンス解析を candidates[0].content.parts[0].text からコンテンツを抽出するように変更
  8. ストリーミングエンドポイントを streamGenerateContent に変更、各チャンクは完全な JSON
  9. ツール定義を functionDeclarations ラッパーに変更、パラメータフィールドを parameters に変更
GeminiOpenAIClaude
useruseruser
modelassistantassistant
独立した役割なしsystem独立した役割なし
独立した役割なしtool独立した役割なし

Gemini と Claude はどちらもシステム指示をトップレベルフィールドに昇格させ、メッセージ役割としては扱いません。

Terminal window
curl https://api.routeapi.ai/v1beta/models/gemini-1.5-pro:generateContent \
-H "Authorization: Bearer $ROUTEAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"contents": [
{
"role": "user",
"parts": [
{ "text": "RouteAPI を一文で紹介してください" }
]
}
],
"generationConfig": {
"temperature": 0.7,
"maxOutputTokens": 1024
}
}'

Google GenAI Python SDK を使用、client_options のみ変更:

import os
import google.generativeai as genai
from google.api_core.client_options import ClientOptions
# RouteAPI エンドポイントを設定
genai.configure(
api_key=os.environ["ROUTEAPI_KEY"],
transport="rest",
client_options=ClientOptions(
api_endpoint="https://api.routeapi.ai/v1beta"
)
)
model = genai.GenerativeModel("gemini-1.5-pro")
response = model.generate_content(
"RouteAPI を一文で紹介してください",
generation_config={
"temperature": 0.7,
"max_output_tokens": 1024
}
)
print(response.text)
print(f"入力トークン: {response.usage_metadata.prompt_token_count}")
print(f"出力トークン: {response.usage_metadata.candidates_token_count}")
import os
import google.generativeai as genai
from google.api_core.client_options import ClientOptions
from PIL import Image
genai.configure(
api_key=os.environ["ROUTEAPI_KEY"],
transport="rest",
client_options=ClientOptions(
api_endpoint="https://api.routeapi.ai/v1beta"
)
)
model = genai.GenerativeModel("gemini-1.5-pro")
image = Image.open("screenshot.jpg")
response = model.generate_content(
["この画像にはどのような UI コントロールがありますか?", image],
generation_config={"max_output_tokens": 2048}
)
print(response.text)

ストリーミング出力例(Python SDK)

Section titled “ストリーミング出力例(Python SDK)”
import os
import google.generativeai as genai
from google.api_core.client_options import ClientOptions
genai.configure(
api_key=os.environ["ROUTEAPI_KEY"],
transport="rest",
client_options=ClientOptions(
api_endpoint="https://api.routeapi.ai/v1beta"
)
)
model = genai.GenerativeModel("gemini-1.5-pro")
response = model.generate_content(
"API ゲートウェイとは何かを段階的に説明してください",
stream=True
)
for chunk in response:
print(chunk.text, end="", flush=True)
print()
  • パラメータの実際のサポート範囲は、選択したモデルとアップストリームサービスの機能によって異なります。一部の高度な機能(コンテキストキャッシング、コード実行など)は、まずテスト環境で検証することをお勧めします。
  • 明示的に 0 または false を渡されたオプションパラメータは、ユーザーが明示的に設定したものとして扱われ、デフォルト値として破棄されません。
  • 本番環境ではモデル ID を固定し、一時的なエイリアスや表示名に依存しないでください。
  • 各リクエストのモデル ID、ステータスコード、トークン使用量を記録し、レイテンシーとコストの異常のトラブルシューティングを容易にします。
  • fileUri で gs:// プロトコルを使用する場合は、ファイルがアップストリームからアクセス可能であることを確認するか、inlineData を使用して直接送信してください。
  • エラーレスポンス形式は OpenAI/Claude と異なる場合があります。詳細は エラー処理 を参照してください。