Gemini (Google AI)
Google Gemini CLI と Google AI SDK(@google/genai)がそのまま接続できる Gemini ネイティブ互換エンドポイント。
PleumRouter は Gemini ネイティブフォーマット(generateContent / streamGenerateContent)をそのまま公開します。Gemini CLI や Google AI SDK に固定されたツールは OpenAI 互換の base URL では接続できないため、この受信面が必要です。各リクエストは 内部標準(OpenAI 互換)パイプラインに変換されてルーティング・課金・ストリーミングコアがそのまま再利用され、 レスポンスは Gemini フォーマット(candidates[] / usageMetadata) に再シリアライズされます。
接続#
Google AI SDK では baseUrl(Python は HttpOptions(base_url=...)) をルート https://router.pleum.ai に設定してください。SDK が /v1beta/models/{model}:generateContent を付加します。
from google import genai
client = genai.Client(
api_key="plm_...",
http_options=genai.types.HttpOptions(base_url="https://router.pleum.ai"),
)
response = client.models.generate_content(
model="gemini-2.5-flash",
contents="Hello",
)
print(response.text)import { GoogleGenAI } from "@google/genai";
const client = new GoogleGenAI({
apiKey: "plm_...",
httpOptions: { baseUrl: "https://router.pleum.ai" },
});
const response = await client.models.generateContent({
model: "gemini-2.5-flash",
contents: "Hello",
});
console.log(response.text);Gemini CLI は GOOGLE_GEMINI_BASE_URL をルートに、plm_ キーを GEMINI_API_KEY に設定してください。
export GEMINI_API_KEY="plm_..."
export GOOGLE_GEMINI_BASE_URL="https://router.pleum.ai"
gemini/v1beta を付けないでください。SDK が再度付加してパスが重複し、 リクエストが失敗します。必ずルート https://router.pleum.ai のみを指定してください。認証は plm_ API キーを Gemini 標準ヘッダー x-goog-api-key または ?key= クエリで渡します。Authorization: Bearer ヘッダーも受け付けます。
コンテンツ生成#
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
| contents | array | 必須 | {role, parts} 配列。role は user・model。parts は text・inline_data ブロック配列です。 |
| systemInstruction | object | string | 任意 | システムプロンプト。parts の text のみ抽出して system メッセージに変換します。 |
| generationConfig | object | 任意 | camelCase と snake_case 両方を受け付けます — temperature・maxOutputTokens・topP・stopSequences など。 |
| tools | array | 任意 | Gemini 形式の関数宣言(functionDeclarations)。双方向に変換されます。 |
| toolConfig | object | 任意 | 関数呼び出しモード(functionCallingConfig)。 |
| safetySettings | array | 任意 | 受け付けますが upstream には転送されません。 |
curl https://router.pleum.ai/v1beta/models/gemini-2.5-flash:generateContent \
-H "x-goog-api-key: plm_..." \
-H "content-type: application/json" \
-d '{
"systemInstruction": {"parts": [{"text": "You are a helpful assistant."}]},
"contents": [{"role": "user", "parts": [{"text": "Hello"}]}],
"generationConfig": {"temperature": 0.7, "maxOutputTokens": 1024}
}'レスポンスは Gemini スキーマに従います。テキストは candidates[].content.parts に格納され、 トークン使用量は usageMetadata.promptTokenCount / candidatesTokenCount / totalTokenCount として返されます。画像は inline_data(base64)で送れます。
{
"candidates": [
{
"content": {
"parts": [{"text": "Hello! How can I help you?"}],
"role": "model"
},
"finishReason": "STOP",
"index": 0
}
],
"usageMetadata": {
"promptTokenCount": 5,
"candidatesTokenCount": 7,
"totalTokenCount": 12
}
}ストリーミング#
:streamGenerateContent は ?alt=sse クエリで SSE フォーマットを使用します。 各 data: 行は GenerateContentResponse 形状の JSON チャンクで、[DONE] マーカーはありません。
curl "https://router.pleum.ai/v1beta/models/gemini-2.5-flash:streamGenerateContent?alt=sse" \
-H "x-goog-api-key: plm_..." \
-H "content-type: application/json" \
-d '{
"contents": [{"role": "user", "parts": [{"text": "Hello"}]}]
}'
# Each SSE data: line is a GenerateContentResponse JSON chunk (no [DONE] marker).
# data: {"candidates":[{"content":{"parts":[{"text":"Hello"}],"role":"model"},"index":0}]}
# data: {"candidates":[{"content":{"parts":[{"text":"! How can I help you?"}],"role":"model"},"index":0}],"usageMetadata":{"promptTokenCount":5,"candidatesTokenCount":7,"totalTokenCount":12}}トークン数#
:countTokens は generateContent と同じ本文を受け取り、{"totalTokens": <int>} を返します。ヒューリスティックな推定値であり、実際の トークナイザーの結果ではありません。
curl https://router.pleum.ai/v1beta/models/gemini-2.5-flash:countTokens \
-H "x-goog-api-key: plm_..." \
-H "content-type: application/json" \
-d '{
"contents": [{"role": "user", "parts": [{"text": "Hello"}]}]
}'
# -> {"totalTokens": 5}モデル一覧#
GET /v1beta/models は Gemini フォーマットのモデル一覧を返します。GET /v1/models と同じ公開可視性ルールを共有します。
curl https://router.pleum.ai/v1beta/models \
-H "x-goog-api-key: plm_..."
# -> {"models": [{"name": "models/gemini-2.5-flash", "supportedGenerationMethods": [...]}, ...]}X-Cost-Krw(整数)・X-Cost-Usd(小数)で公開されます(Anthropic エンドポイントと同一パターン)。ストリーミングは 完了時にしか費用が確定しないためヘッダーは省略されます。