ゲートウェイの仕組み
Lovely Router は、送られてきた API 形式のまま各リクエストをモデルに渡します。このページでは、エンドポイント、モデル ID、認証ヘッダー、そしてゲートウェイが変更するわずかな点について説明します。
Lovely Router は、Anthropic・OpenAI・Gemini の API を 1 つのホストで提供します。形式間の変換は行いません。Anthropic 形式のリクエストは Anthropic 形式を受け付けるチャネルに送られ、リクエスト本文は2 つの小さな変更を除き、書いたとおりの内容でチャネルに届きます。モデルをそのベンダー自身の API で呼び出せば、モデルはベンダーのドキュメントどおりにリクエストを受け取ります。thinking、cache_control、tools、generationConfig などのパラメータも変更されずにモデルに届くため、各ベンダー自身のドキュメントがそのまま当てはまります。
エンドポイントとベース URL#
SDK の接続先を、その API 用のベース URL に向けます。パスは SDK が付け足します。
| API | エンドポイント | SDK のベース URL | ガイド |
|---|---|---|---|
| Anthropic Messages | POST /v1/messages、POST /v1/messages/count_tokens | https://lovelyrouter.com | Anthropic Messages |
| OpenAI Chat Completions | POST /v1/chat/completions | https://lovelyrouter.com/v1 | OpenAI Chat Completions |
| OpenAI Responses(GPT のモデル) | POST /v1/responses | https://lovelyrouter.com/v1 | Responses API |
| Gemini | POST /v1beta/models/{model}:generateContent、:streamGenerateContent、:countTokens | https://lovelyrouter.com | Gemini |
| OpenAI Images(画像モデル) | POST /v1/images/generations、POST /v1/images/edits | https://lovelyrouter.com/v1 | 画像 |
| 動画(キャラクター置き換え) | POST /v1/videos | https://lovelyrouter.com/v1 | 動画 |
| ライブ動画 | POST /v1/videos/live | https://lovelyrouter.com/v1 | ライブ動画 |
| ミュージックビデオ | POST /v1/videos/music | https://lovelyrouter.com/v1 | ミュージックビデオ |
| モデル一覧 | GET /v1/models、GET /v1beta/models | モデルと料金 |
その他のモデル関連のエンドポイントは 404 を返します。利用できないものを参照してください。データツールとブラウザエージェントの API も、同じホストとキーを使います。
各モデルが対応する API#
どのモデルにもネイティブ API があります。ベンダーがそのモデル向けに設計した形式です。できるだけネイティブ API を使ってください。
| モデルファミリー | ネイティブ API | 現在受け付けているその他の形式 |
|---|---|---|
Claude(claude-*) | Anthropic Messages | OpenAI Chat Completions、Gemini |
GPT(gpt-*) | OpenAI Chat Completions、OpenAI Responses | Anthropic Messages、Gemini |
Gemini(gemini-*) | Gemini | OpenAI Chat Completions、Anthropic Messages |
GPT Image(gpt-image-*) | OpenAI Images | なし |
ホスト型モデル(dongfangshuo-*) | OpenAI Chat Completions | Anthropic Messages |
ホスト型画像モデル(z-image-*) | OpenAI Images | なし |
モデルを別の形式で呼び出すと、チャネルがリクエストをそのモデル向けに変換するため、ベンダーの機能の一部が引き継がれない場合があります。ベンダー固有のパラメータは、そのベンダー自身の API 向けに定義されています。Anthropic の cache_control と thinking、OpenAI の reasoning_effort、Gemini の thinkingConfig が確実に機能するのは、モデルのネイティブ形式で送った場合だけです。別の形式では無視されるか、拒否される場合があります。
モデルが受け付ける形式は、そのモデルを提供するチャネルによって決まるため、変わることがあります。モデルごとの対応形式はマーケットプレイスで確認できます。送った形式を受け付けるチャネルがない場合、リクエストは 404 で失敗し、Model 'gpt-6.1-sol' is not served in gemini format in any group. のようなメッセージが返ります。
モデル ID#
GET /v1/models の ID を使います(例:claude-sonnet-5.5、gpt-6.1-sol、gemini-3.1-pro)。ゲートウェイは他のツールで使われている表記も受け付け、同じモデルとして解決します。
| 送信した ID | 解決後の ID |
|---|---|
claude-sonnet-5-5 | claude-sonnet-5.5 |
anthropic/claude-sonnet-5.5 | claude-sonnet-5.5 |
claude-haiku-4-5-20251001 | claude-haiku-4.5 |
gemini-3.1-pro-preview | gemini-3.1-pro |
models/gemini-3-flash | gemini-3-flash |
ルールは次のとおりです。大文字と小文字は区別しません。先頭の vendor/ または models/ プレフィックスは除去します。. と - は同じものとして扱います。末尾の日付(-20251001)、-preview、-latest は除去します。ログ、キーの許可リスト、請求では、常に正規の ID が使われます。
どのモデルにも一致しない ID には、404 と Model '<id>' is not available. See GET /v1/models. が返ります。
ゲートウェイが変更する点#
リクエスト本文は送られたとおりに転送されます。例外は次の 2 つです。
- モデル ID。 処理するチャネルが想定する ID に置き換えられます。そのため、レスポンスの
modelフィールドはベンダー側の表記(例:claude-sonnet-5-5)になる場合があります。 - OpenAI ストリームの使用量。 ストリーミングの Chat Completions リクエストには、ゲートウェイが呼び出しを課金できるよう
stream_options.include_usage: trueが付与されます。ストリームの最後に、空のchoices配列とusageオブジェクトを持つチャンクが 1 つ追加されます。チャンクを読むときは、choicesが空の場合に備えてください。
リクエストヘッダーは、anthropic-version、anthropic-beta、openai-beta を除いて転送されません。anthropic-version がない場合は 2023-06-01 が送られます。Gemini のエンドポイントでは、alt=sse などのクエリパラメータは転送され、key は除去されます。
レスポンスは 1 バイトも変えずに返されます。ゲートウェイは content-type と cache-control ヘッダーを保持し、独自のヘッダーを追加します(レスポンスヘッダーを参照)。ベンダーのリクエスト ID やレート制限ヘッダーは透過しません。
モデルがリクエストを無効として拒否した場合(400、404、413、422)は、同じステータスと理由が、お使いの API のエラー形式で返ります。それ以外の失敗は、まず別のチャネルで再試行されます。レート制限とフェイルオーバーとエラーを参照してください。
認証#
どのエンドポイントも、次のいずれの場所でもキーを受け付けます。そのため、各 SDK は既定の認証方法のまま使えます。
| 送り方 | 使用している SDK・ツール |
|---|---|
Authorization: Bearer lr-... | OpenAI SDK、ANTHROPIC_AUTH_TOKEN を使う Claude Code、ほとんどの HTTP クライアント |
x-api-key: lr-... | Anthropic SDK |
x-goog-api-key: lr-... | Google Gen AI SDK、Gemini CLI |
?key=lr-... クエリパラメータ | Gemini の REST の例 |
GET /v1/models と GET /v1beta/models にはキーは不要です。キーの扱いについては認証を参照してください。
レスポンスヘッダー#
| ヘッダー | 値 |
|---|---|
x-lovely-request-id | この呼び出しの ID(例:req_6f1c...)。ログの項目と一致します。サポートに問い合わせる際に添えてください。 |
x-lovely-group | 呼び出しを処理したチャネルグループ(例:claude-value)。 |
x-lovely-channel | グループのチャネルラベルを URL エンコードしたもの(例:Pooled%20capacity)。 |
x-lovely-queued-ms | 呼び出しが容量の空きを待った場合のみ付与。待機時間(ミリ秒)。 |
最初の 3 つは access-control-expose-headers に含まれているため、ブラウザからも読み取れます。
リクエストのライフサイクル#
- 認証。 キーが有効で、有効期限内である必要があります。そうでなければ
401が返ります。 - モデルの解決。 上記のとおり ID を解決し、キーのモデル許可リストと照合します(許可されていなければ
403)。 - 残高の確認。 残高が 0 以下の場合、またはキーが利用上限を超えている場合は
402が返ります。 - キーの制限の適用。 キーの 1 分あたりのリクエスト数と同時実行数の制限が適用されます(
429)。レート制限とフェイルオーバーを参照してください。 - チャネルの選択。 進行中の会話は、そのプロンプトキャッシュを持つチャネルに戻ります。新しい会話は、チャネルグループ内で最適な利用可能チャネルに送られます。プロンプトキャッシュを参照してください。
- モデルの呼び出し。 チャネルが出力を返す前に失敗した場合、リクエストは別のチャネルに移ります(最大 3 回まで試行)。ストリームは最初のトークンまで保留されるため、この切り替えは外から見えません。ストリーミングを参照してください。
- 計量と記録。 レスポンスのトークン数から請求額が決まり、数秒以内に残高から差し引かれます。モデルと料金を参照してください。
利用できないもの#
存在するのは上記のエンドポイントだけです。以下は 404 を返します。
- 保存された OpenAI のレスポンス(
/v1/responses/{id})、旧来の Completions、embeddings、画像のバリエーション(image variations)、audio、files、batches。 - Anthropic の Message Batches、Files、Models-by-id の各エンドポイント。
- Gemini の
cachedContents(明示的なコンテキストキャッシュ)、ファイルのアップロード、embedContent、Live API。
OpenAI Responses API は GPT のモデルにのみ提供されます。主なクライアントの設定はお使いのツールで使うにあります。