Skip to content

Gemini (Google AI)

Google Gemini CLI と Google AI SDK(@google/genai)がそのまま接続できる Gemini ネイティブ互換エンドポイント。

POST/v1beta/models/{model}:generateContent
POST/v1beta/models/{model}:streamGenerateContent
POST/v1beta/models/{model}:countTokens
GET/v1beta/models

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 を付加します。

Google Gen AI SDK (Python)
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)
Google Gen AI SDK (TypeScript)
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 に設定してください。

Gemini CLI
export GEMINI_API_KEY="plm_..."
export GOOGLE_GEMINI_BASE_URL="https://router.pleum.ai"
gemini
base URL に /v1beta を付けないでください。SDK が再度付加してパスが重複し、 リクエストが失敗します。必ずルート https://router.pleum.ai のみを指定してください。

認証は plm_ API キーを Gemini 標準ヘッダー x-goog-api-key または ?key= クエリで渡します。Authorization: Bearer ヘッダーも受け付けます。

コンテンツ生成#

パラメータ必須説明
contentsarray必須{role, parts} 配列。roleusermodelpartstextinline_data ブロック配列です。
systemInstructionobject | string任意システムプロンプト。parts の text のみ抽出して system メッセージに変換します。
generationConfigobject任意camelCase と snake_case 両方を受け付けます — temperaturemaxOutputTokenstopPstopSequences など。
toolsarray任意Gemini 形式の関数宣言(functionDeclarations)。双方向に変換されます。
toolConfigobject任意関数呼び出しモード(functionCallingConfig)。
safetySettingsarray任意受け付けますが upstream には転送されません。
request
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)で送れます。

200 OK
{
  "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] マーカーはありません。

stream
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}}

トークン数#

:countTokensgenerateContent と同じ本文を受け取り、{"totalTokens": <int>} を返します。ヒューリスティックな推定値であり、実際の トークナイザーの結果ではありません。

count tokens
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 と同じ公開可視性ルールを共有します。

list models
curl https://router.pleum.ai/v1beta/models \
  -H "x-goog-api-key: plm_..."

# -> {"models": [{"name": "models/gemini-2.5-flash", "supportedGenerationMethods": [...]}, ...]}
費用は Gemini 本文を壊さないようレスポンスヘッダー X-Cost-Krw(整数)・X-Cost-Usd(小数)で公開されます(Anthropic エンドポイントと同一パターン)。ストリーミングは 完了時にしか費用が確定しないためヘッダーは省略されます。