Gemini
Google Gen AI SDK または Gemini CLI を使い、ネイティブの Gemini API で Gemini のモデルを呼び出します。generateContent、alt=sse によるストリーミング、countTokens、思考について説明します。
Lovely Router は、Gemini API の generateContent、streamGenerateContent、countTokens の各メソッドを /v1beta/models/{model} で提供します。Google Gen AI SDK の接続先を https://lovelyrouter.com に向け、API キーとして Lovely Router のキーを渡してください。リクエスト本文は変更されずに転送されるため、各フィールドには Google の API リファレンスがそのまま当てはまります。
SDK を設定する#
SDK はキーを x-goog-api-key で送ります。?key= クエリパラメータでも使えます。
curl "https://lovelyrouter.com/v1beta/models/gemini-3.1-pro:generateContent" \
-H "x-goog-api-key: $LOVELY_API_KEY" \
-H "content-type: application/json" \
-d '{
"contents": [{"role": "user", "parts": [{"text": "Explain DNS in two sentences."}]}]
}'SDK は pip install google-genai または npm install @google/genai でインストールします。モデル ID は GET /v1/models に従います。gemini-3.1-pro-preview のような Google 側の表記も同じモデルとして解決されます。GET /v1beta/models は、この形式で利用できるすべてのモデルを、Gemini 独自のレスポンス形式で返します。
レスポンスをストリーミングする#
:streamGenerateContent?alt=sse を呼び出すと、Server-Sent Events を受け取れます。各イベントは部分的な GenerateContentResponse で、最後のイベントに最終的な usageMetadata が含まれます。SDK は alt=sse を自動で付けます。
curl -N "https://lovelyrouter.com/v1beta/models/gemini-3-flash:streamGenerateContent?alt=sse" \
-H "x-goog-api-key: $LOVELY_API_KEY" \
-H "content-type: application/json" \
-d '{"contents": [{"role": "user", "parts": [{"text": "Count to ten, slowly."}]}]}'alt=sse を付けない場合、このメソッドは 1 つの JSON 配列をストリーミングします。それでも動作しますが、SSE のほうがパースしやすく、ストリームが停止した場合にゲートウェイがきれいなエラーイベントを送れます。ストリーミングを参照してください。
システム指示と思考を設定する#
systemInstruction、generationConfig、safetySettings、tools(関数宣言)は、Google のドキュメントどおりに転送されます。Gemini 3 のモデルは既定で思考を行います。調整するには、Google の思考ガイドに従って thinkingConfig を使います。
response = client.models.generate_content(
model="gemini-3.1-pro",
contents="Plan a three-day trip to Kyoto.",
config=types.GenerateContentConfig(
system_instruction="You are a concise travel planner.",
max_output_tokens=4096,
),
)
print(response.text)
print(response.usage_metadata)思考トークンは usageMetadata.thoughtsTokenCount に報告され、candidatesTokenCount と合わせて出力の料金で課金されます。思考の要約("thought": true のパート)は、リクエストで generationConfig.thinkingConfig.includeThoughts: true を指定した場合にのみ返されます(Google の API と同じ)。指定しない場合、回答に思考のパートは含まれません。
トークンをカウントする#
:countTokens は生成の呼び出しと同じ contents を受け取り、totalTokens を返します。無料で、残高が 0 でも使えます。カウントは概算です。コンテキストウィンドウに収まるかの確認に使い、正確な請求額の予測には使わないでください。
curl "https://lovelyrouter.com/v1beta/models/gemini-3.1-pro:countTokens" \
-H "x-goog-api-key: $LOVELY_API_KEY" \
-H "content-type: application/json" \
-d '{"contents": [{"role": "user", "parts": [{"text": "Hello, Gemini"}]}]}'Gemini CLI を使う#
Gemini CLI は、エンドポイントとキーを環境変数から読み込みます。
export GOOGLE_GEMINI_BASE_URL=https://lovelyrouter.com
export GEMINI_API_KEY="$LOVELY_API_KEY"
gemini -m gemini-3.1-proその他のクライアントについてはお使いのツールで使うを参照してください。
キャッシュ#
Gemini は、繰り返し使われるプロンプトのプレフィックスを自動でキャッシュします(暗黙的キャッシュ)。キャッシュされたトークンは usageMetadata.cachedContentTokenCount に表示され、キャッシュ読み取りの料金で課金されます。ゲートウェイは各会話を同じチャネルに固定し、キャッシュを有効なまま保ちます。プロンプトキャッシュを参照してください。
サポートされていないもの#
次の Gemini API エンドポイントは 404 を返します:cachedContents(明示的なコンテキストキャッシュ)、ファイルのアップロード、embedContent と batchEmbedContents、バッチモード、Live API。
ヘッダー#
| ヘッダー | 説明 |
|---|---|
x-goog-api-key | Lovely Router のキー。Authorization: Bearer と ?key= も使えます。 |
x-lovely-group | 任意。キーがグループに紐付けられていない場合に、リクエストをチャネルグループに固定します。 |
x-session-id | 任意。キャッシュを意識したルーティングのために、リクエストを 1 つの会話としてまとめます。 |
エラーは Gemini の形式 {"error": {"code": 429, "message": "...", "status": "RESOURCE_EXHAUSTED"}} で返ります。エラーを参照してください。