0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

複数の LLM プロバイダーを統一するゲートウェイの実装 — OrcaRouter で 200+ モデルを OpenAI 互換 API 1 つに束ねる

0
Posted at

複数の LLM プロバイダーを統一するゲートウェイの実装 — OrcaRouter で 200+ モデルを OpenAI 互換 API 1 つに束ねる

この記事で作るもの

  • OpenAI / Anthropic / Google / DeepSeek など、複数プロバイダーのモデルを 1 つの OpenAI 互換エンドポイント・1 つの API キーで呼び分ける構成
  • プロンプトの難易度に応じて自動でモデルを振り分ける Named Router(Adaptive / Gated)
  • どのリクエストがどのモデル・プロバイダー・公開価格で処理されたかをリクエスト単位で監査する運用

使うのは OrcaRouter です。base_url を 1 行差し替えるところから、本番運用の設計まで通しで実装します。


はじめに

LLM を本番に組み込むと、たいていプロバイダーは 1 社では済みません。コード生成は Claude、抽出・要約は DeepSeek、マルチモーダルは Gemini、と用途ごとに最適なモデルが分かれるからです。

ところが、プロバイダーを増やすたびに実装側のコストが積み上がります。

  • SDK が増える:OpenAI SDK、Anthropic SDK、Google GenAI SDK……それぞれ I/F が違う
  • API キーと請求が増える:n 社ぶんのキー管理、n 社ぶんの請求・与信・為替処理
  • フェイルオーバーを自前で書く:あるプロバイダーが落ちたとき別社へ切り替えるロジックを毎回実装する
  • 新モデルのたびに if/else が陳腐化する:「このプロンプトはどのモデルへ」の振り分けがアプリ側にハードコードされ、保守負担になる

この記事では、これらを 1 つのゲートウェイの背後に統一します。完成すると、アプリ側のコードは OpenAI SDK 1 つのまま、エンドポイントとキーを変えるだけで 200+ モデルにアクセスでき、振り分け・フェイルオーバー・監査はゲートウェイ側に寄せられます。

対象読者

  • 複数の LLM プロバイダーを 1 つの基盤に統合したい開発者・SRE
  • 社内・顧客向けに LLM 基盤を設計する SIer / プラットフォームエンジニア
  • LLM のコストとルーティング判断を可視化・統制したい運用担当

動作環境

  • Python 3.10+(サンプルは Python。Node.js / その他の OpenAI 互換 SDK でも同様です)
  • openai パッケージ(pip install openai
  • OrcaRouter アカウント(後述。クレジットカード不要・無料で始められます)

1. なぜ「プロバイダー統一ゲートウェイ」が必要なのか

まず、ゲートウェイを挟まない場合と挟む場合で、何が変わるかを整理します。

ゲートウェイを挟むと、アプリが知るべきことは「1 つのエンドポイントと 1 つのキー」だけになります。プロバイダーの追加・切替・フェイルオーバー・コスト監査は、アプリのデプロイを伴わずにゲートウェイ側で完結します。これが「統一ゲートウェイ」の価値です。


2. OrcaRouter の全体像

この記事で使う OrcaRouter は、Continuum AI(米国)が開発し、FlashLabs(日本)が日本独占で提供する適応型推論ゲートウェイです。

統一ゲートウェイとして見たときの要点は次の 3 つです。

  • 200+ モデルを 1 エンドポイント・1 キーで:OpenAI / Anthropic / Google / Meta / Mistral / DeepSeek / Alibaba / Moonshot など、主要プロバイダーのフロンティア/オープンモデルを横断して呼べます
  • OpenAI 互換:既存の OpenAI SDK / Anthropic SDK / Google GenAI SDK をそのまま使えます。base_url を差し替える 1 行だけで導入できます
  • プロバイダーへ直接接続:7+ の主要プロバイダーへ直接送信(Anthropic Direct / OpenAI Direct / Bedrock / Vertex 等)。再販業者を挟まないため、**トークン課金はプロバイダー公開価格と同額(上乗せ 0%)**です

ここからは、実際に手を動かして統一ゲートウェイを構築していきます。


3. Step 1:API キーを取得する

OrcaRouter のアカウントを作成し、API キーを発行します。

  1. OrcaRouter 登録ページ(500 万無料クレジト付き、クレジットカード不要) にアクセスします
  2. アカウントを作成します(クレジットカードの登録は不要です)
  3. ダッシュボードの API キー画面で新しいキーを発行します(sk-orca- で始まる文字列)

登録すると 500 万の無料クレジトが付与されるので、課金設定なしでそのまま動作確認まで進められます。発行は 60 秒ほどで完了し、すぐにライブで使えます。

API呼び出し.png

発行したキーは環境変数に入れておきます。

export ORCAROUTER_API_KEY="sk-orca-..."

4. Step 2:base_url を 1 行差し替えて最初のリクエストを送る

OrcaRouter は OpenAI 互換なので、既存の OpenAI SDK の base_url を差し替えるだけで接続できます。

from openai import OpenAI
import os

client = OpenAI(
    base_url="https://api.orcarouter.ai/v1",   # ← この 1 行だけ差し替える
    api_key=os.environ["ORCAROUTER_API_KEY"],
)

response = client.chat.completions.create(
    model="openai/gpt-5.5",
    messages=[{"role": "user", "content": "OrcaRouter の接続テストです。1 文で挨拶してください。"}],
)

print(response.choices[0].message.content)

ポイントは、model をプロバイダー込みの ID(openai/gpt-5.5)で指定している点です。同じクライアント・同じキーのまま、model を変えるだけで別プロバイダーのモデルに切り替えられます。これが統一ゲートウェイの最初の一歩です。

モデル ID は プロバイダー/モデル名 の形式です。本記事の ID はすべて例であり、利用可能な最新のモデルと正確な ID は OrcaRouter 公式ドキュメント のモデル一覧でご確認ください。


5. Step 3:プロバイダーを横断してモデルを呼び分ける

統一できているかを確認するため、1 つのキーのまま複数プロバイダーのモデルを順に呼んでみます。

prompts = {
    "コード生成(重い処理)": ("anthropic/claude-opus-4.8",
        "二分探索を Python で実装してください。"),
    "抽出(定型処理)": ("deepseek/deepseek-v4-pro",
        "次の文から会社名だけを抽出: 『FlashLabs 株式会社は東京都千代田区にあります』"),
    "要約(マルチモーダル対応モデル)": ("google/gemini-3.5-flash",
        "『LLM ゲートウェイ』を 30 字以内で説明してください。"),
}

for label, (model, content) in prompts.items():
    res = client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": content}],
    )
    print(f"[{label}] {model}")
    print(res.choices[0].message.content, "\n")

3 つのリクエストはそれぞれ Anthropic / DeepSeek / Google のモデルに届きますが、コードから見れば 同じ client・同じキー・同じ I/F です。プロバイダーごとに SDK を分ける必要も、キーを使い分ける必要もありません。

主なモデル ID の例を挙げておきます(最新の一覧は公式ドキュメントを参照してください)。

用途の例 モデル ID(例) プロバイダー
高度な推論・コード生成 anthropic/claude-opus-4.8 Anthropic
汎用・高品質 openai/gpt-5.5 OpenAI
低レイテンシ・マルチモーダル google/gemini-3.5-flash Google
定型処理・抽出(低コスト) deepseek/deepseek-v4-pro DeepSeek
定型処理・大量バッチ qwen/qwen3.7-max Alibaba
軽量・コスト重視 minimax/minimax-m3 MiniMax

ここまでで「複数プロバイダーを 1 つに束ねる」ことはできました。ただし、この段階では どのプロンプトをどのモデルへ送るかをアプリ側で指定しています。新モデルが出るたびにこの対応表を書き換えるのは、結局のところ自前の if/else 振り分けと同じ保守負担です。次の Step でこれをゲートウェイ側に寄せます。


6. Step 4:Named Router で「束ねて自動振り分け」する

OrcaRouter の Named Router を使うと、「プロンプトの難易度に応じて適切なモデルへ自動で振り分ける」ロジックをゲートウェイ側に定義できます。アプリは orcarouter/{ルーター名} を呼ぶだけになり、モデル選定はゲートウェイに任せられます。

6-1. ダッシュボードで Named Router を作成する

  1. ダッシュボードで Named Router を新規作成します(例:unified-router
  2. ルーティング戦略を選びます。本番運用で効くのは Adaptive 戦略です
  3. 必要に応じて Gated モードを有効化し、mundane(定型)と hard(高度)のプールを定義します

Named Router1.png

OrcaRouter には 5 つのルーティング戦略があります。

戦略 挙動
Cheapest 生存候補のうちトークン単価が最安のモデルを選択
Quality 生存候補のうち品質スコアが最高のモデルを選択
Balanced コスト効率と品質のバランスで選択
Adaptive LinUCB 文脈バンディットで本番トラフィックの結果から継続学習

Adaptive は、各リクエストの特徴量と過去結果から「いまのクエリ群でどのモデルが期待値最大か」を学習します。成果の悪いモデルは自動的に振り分けが減り、新規モデルは探索枠で少し試行されます。事前訓練済みの静的なルーターとも、手書きの if/else とも違い、運用とともに最適化が深まるのが特徴です。

6-2. Gated モードで定型/高度を構造的に分ける

Gated モードを併用すると、リクエストをまず難易度で分類し、別プールから選びます。

「件名を 1 行で抽出する」ような軽い処理は Mundane Pool(低コストなオープンモデル)へ、「コードを書く」ような重い処理は Hard Pool(フロンティアモデル)へ、と構造的に振り分けられます。

Mundane Pool.png
Hard Pool.png

6-3. アプリ側のコードはルーター名を呼ぶだけ

ルーターを定義したら、アプリ側はモデル ID をルーター名に置き換えるだけです。

response = client.chat.completions.create(
    model="orcarouter/unified-router",   # 個別モデルではなくルーターを指定
    messages=[{"role": "user", "content": "請求書 PDF から合計金額を抽出してください。"}],
)

print(response.choices[0].message.content)

# 実際に解決されたモデルはレスポンスヘッダーで確認できる
print("解決モデル:", response.headers.get("X-Orca-Resolved-Model"))

これで、モデル選定ロジックは完全にゲートウェイ側へ移りました。新しいモデルを追加・差し替えるときも、アプリのデプロイは不要です。ダッシュボードでプールを更新するだけで反映されます。


7. Step 5:ルーティング判断を監査する

統一ゲートウェイで一番怖いのは「気づかないうちに高いモデルへ流れていた/品質の低いモデルに落ちていた」という不透明さです。OrcaRouter は、どのリクエストがどのモデル・プロバイダー・公開価格で処理されたかをリクエスト単位で記録します。

ダッシュボードでは、次のように 1 リクエストずつ追跡できます。

分類 モデル プロバイダー 公開価格 支払額
定型 deepseek/deepseek-v4-pro DeepSeek $0.0008 $0.0008
高度 anthropic/claude-opus-4.8 Anthropic Direct $0.0420 $0.0420
定型 qwen/qwen3.7-max Alibaba Cloud $0.0006 $0.0006

OrcaRouter Audit Log.jpg

「支払額 = 公開価格」が行単位で確認できます。これが上乗せ 0% の実証です。コード側からも、レスポンスヘッダーで実際の解決結果を取得できます。

print("解決モデル:", response.headers.get("X-Orca-Resolved-Model"))
print("使用ルーター:", response.headers.get("X-Orca-Router"))
print("フェイルオーバー:", response.headers.get("X-Orca-Fallback-Level"))

この監査性が効くのは、コストの最適化を事実ベースで進められるからです。定型プロンプトをオープンモデルへ寄せることで、品質を落とさずに 約 40% のコスト削減が見込めます(前提:定型プロンプト比率を 65%、定型処理は OSS で約 1/15 のコスト、粗削減額から 33% を保守的に控除した試算。出典:OrcaRouter ピッチデック「経済性」)。実際の削減額は各社のプロンプト分布によって変動し、ダッシュボードでリクエスト単位に確認できます。レンジとしては、コード生成中心で 20〜30%、抽出・RAG 中心で 50% 超が目安です。


8. Step 6:本番運用に必要な設計

統一ゲートウェイを「本番で止まらない・侵されない」状態にするための機能も、ゲートウェイ側で揃います。

  • ミッドストリーム・フェイルオーバー:ストリーム途中でプロバイダーが劣化しても、エージェントのツール状態を維持したまま別プロバイダーへ切り替えます(リクエストの再起動なし)。長時間動くエージェントで効きます
  • ガードレール 8 種:PII Shield / Secrets & API Keys / Prompt Injection / Profanity & Brand Safety / Financial Data (PCI) / System-Prompt Leak / Compliance Logger / Prompt-Size Cap。プロンプト・レスポンスを通過させる前後で検査できます
  • eval(自社データでの定期スコアリング):自社のテストケースに対してモデルとルーターを定期スコアリングし、品質劣化をユーザーより先に検知します
  • 60 秒価格更新:プロバイダー側の価格改定を 60 秒ごとに取り込み、Cheapest / Balanced の判断に反映します
  • 99.99% 稼働率 SLA:Enterprise プランで提供。ステータスページと全プロバイダーのヘルスプローブを備えます

加えて、日本国内で本番運用する場合に必要になる 円建て請求・適格請求書(インボイス)対応・JST 営業時間内の日本語サポート・国内データルーティング(AWS / GCP 日本リージョン) は、FlashLabs が Enterprise 契約に応じて即時に構成して提供します。技術基盤(Continuum AI 側)に、日本市場の本番運用層(FlashLabs 側)を重ねる形です。


OrcaRouter の機能・価格・サポートモデル

ここまでで統一ゲートウェイの構築手順を見てきました。実際にどの機能が、どの価格で、どのモデルに対して効くかを、リファレンスとして整理しておきます。

主要機能

  • アダプティブ・ルーティング:プロンプトごとに難易度を判定し、難しい推論はフロンティアモデルへ、定型処理はオープンモデルへ自動振り分け
  • 200+ モデル対応:Claude Opus 4.8、GPT-5.5 Pro、Gemini 3.5、DeepSeek V4 Pro、Qwen3.6-plus、Kimi K2.6 など
  • LinUCB 文脈バンディット:リクエスト結果から学習し、成果が悪いモデルへの振り分けを自動削減
  • ルーティング遅延 <1ms:ミリ秒未満の判定で UX を損なわない
  • 完全可視化:判定結果・モデル・プロバイダー・公開価格をリクエスト単位で記録

価格

  • 月額プラン:最大 10% ボーナスクレジット自動付与(毎月の請求サイクルごと)
  • トークン課金:プロバイダー公開価格と同額(上乗せ 0%)
  • ルーティング手数料:0%

サポートする主要モデル例

公式: OrcaRouter 料金ページ


9. ハマりどころと対処

統一ゲートウェイを構築するときに詰まりやすい点をまとめておきます。

  • model の指定形式:OrcaRouter では プロバイダー/モデル名(例:anthropic/claude-opus-4.8)または orcarouter/{ルーター名} を指定します。プロバイダー接頭辞のないモデル名だけだと解決できないことがあります
  • 個別モデル指定とルーター指定の使い分け:検証・デバッグ時は個別モデル(openai/gpt-5.5)を直接指定し、本番では Named Router(orcarouter/unified-router)に寄せると、振り分けの変更がアプリ非依存になります
  • どのモデルが選ばれたか分からないresponse.headers.get("X-Orca-Resolved-Model") で実際に解決されたモデルを確認できます。フェイルオーバーが発生したかは X-Orca-Fallback-Level で分かります
  • コストが想定とずれる:ダッシュボードのリクエスト単位ログで「分類・モデル・公開価格・支払額」を突き合わせます。定型プロンプトが Hard Pool に流れていないかを確認すると、削減余地が見えます
  • 既存ツールから使いたい:Cursor / Cline / Continue / Aider / LangChain / LlamaIndex などは OpenAI 互換設定で base_url を差し替えれば、そのまま OrcaRouter 経由にできます

10. まとめ

複数の LLM プロバイダーを、1 つの OpenAI 互換エンドポイント・1 つのキーの背後に統一し、振り分け・フェイルオーバー・監査をゲートウェイ側へ寄せる構成を実装しました。

  • Step 1〜2base_url を 1 行差し替えて接続
  • Step 3:1 キーで複数プロバイダーのモデルを呼び分け
  • Step 4:Named Router(Adaptive / Gated)で振り分けをゲートウェイ側へ
  • Step 5〜6:リクエスト単位の監査と、本番運用に必要な設計

乗り換えは 1 行、判断は全部見える。Continuum AI の先端を FlashLabs が日本に届けます。

始め方


OrcaRouter について

OrcaRouter は、Continuum AI(米国)が開発し、FlashLabs が日本独占販売する適応型推論ゲートウェイです。プロンプトごとに難易度を判定し、難しい推論はフロンティアモデルへ、定型処理はオープンモデルへ自動ルーティングすることで、品質を守りながら LLM 支出を約 40% 削減します。判断根拠はリクエスト単位で可視化され、トークン上乗せは 0%、ルーティング遅延は <1ms です。200+ モデルを 1 エンドポイントで利用可能で、導入は 1 行から可能です。

公式サイト: https://www.orcarouter.ai/ja/


FlashLabs 株式会社について

FlashLabs は、営業とカスタマーエクスペリエンスを自動化し、最終的には自律化へ導くことを目指す AI 応用研究所です。機械の処理速度・精度と人間の戦略的洞察を融合させた "Human-AI Hybrid" で、従来手法を凌駕する成果を企業にもたらします。

主要製品として、AI 推論コスト 約 40%(最大 70%)削減 を実現する「OrcaRouter」、営業・マーケティング自動化プラットフォーム「FlashIntel」、AI 音声エージェント「Chroma」などを提供しています。

  • 会社名:FlashLabs 株式会社
  • 所在地:東京都千代田区
  • 代表者:代表取締役 細井 洋一
  • 事業内容:AI 応用研究、営業・カスタマーエクスペリエンス自動化ソリューションの開発・提供
  • URL:https://www.flashlabs.ai/

Continuum AI について

Continuum AI は、次世代 AI インフラを開発する米国の研究機関です。適応型推論ゲートウェイ「OrcaRouter」を開発し、企業の AI 活用における品質とコストの両立を実現する技術を提供しています。

Continuum AI 公式サイト

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?