powered by TechFeed
表示モード
ハウツー

OpenRouterで複数AIモデルを1つのAPIに統一 — GPT・Claude・Llamaの切り替えはモデル名の文字列を変えるだけ

10月28日、Bala Priyaが「Access Multiple AI Models in Your Python Apps Using OpenRouter」と題した記事を公開した。OpenRouterを使って1つのAPIエンドポイントから複数のAIモデルを切り替え・比較・フォールバック設定する実践的な手順が紹介されている。

10月28日、Bala Priyaが「Access Multiple AI Models in Your Python Apps Using OpenRouter」と題した記事を公開した。OpenRouterを使って1つのAPIエンドポイントから複数のAIモデルを切り替え・比較・フォールバック設定する実践的な手順が紹介されている。


なぜOpenRouterか

GPT、Claude、Llamaを比較しようとすると、通常は3つのプロバイダーにそれぞれアカウントを作り、異なる認証方式を覚え、リクエストコードを3回書き直す必要がある。

OpenRouterはその手間を丸ごと省く。数十のプロバイダーの前段に立ち、単一のAPIエンドポイントでまとめて受け付ける。モデルの切り替えはペイロードのmodelフィールドの文字列1か所を変えるだけで、それ以外のコードは一切変更不要だ。

さらに実用的なのはコスト面だ。OpenRouterは一部モデルに:freeサフィックスを付けており、これらは支払い情報の登録なしで利用できる。この記事のサンプルコードはすべて無料モデルで動作する。


セットアップ

openrouter.aiでアカウントを作成し、KeysセクションからAPIキーを発行する。キーは環境変数に保存しておく。

export OPENROUTER_API_KEY="your-key-here"

依存パッケージはrequestsのみ。OpenRouterは素のHTTP APIなので専用SDKは不要だ(公式SDKのopenrouterパッケージも存在するが、記事ではJSONの中身を直接確認しやすいrequestsを採用している)。

pip install requests

最初のリクエスト

すべてのリクエストは同じ形をしている。modelフィールドにprovider/model-name形式で指定し、messagesにロールとコンテンツを渡す。レスポンスはOpenAI互換のJSON形式に正規化されるため、プロバイダーが変わってもdata["choices"][0]["message"]["content"]で本文を取り出せる。

import os
import requests

API_URL = "https://openrouter.ai/api/v1/chat/completions"
API_KEY = os.getenv("OPENROUTER_API_KEY")

customer_message = (
    "My order #48213 arrived with the wrong charger. "
    "I need the correct one before Friday, can you help?"
)

payload = {
    "model": "meta-llama/llama-3.2-3b-instruct:free",
    "messages": [
        {"role": "system", "content": "You are a concise, polite customer support agent."},
        {"role": "user", "content": customer_message},
    ],
}

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json",
}

response = requests.post(API_URL, headers=headers, json=payload)
data = response.json()
print(f"Model used: {data['model']}")
print(f"Reply: {data['choices'][0]['message']['content']}")

モデルを切り替えて比較する

コードの構造を変えずに複数モデルの回答を比較できるのがOpenRouterの核心的な利点だ。model_nameを引数にした関数を1つ用意し、ループで回すだけでよい。

def ask_model(model_name, message):
    payload = {
        "model": model_name,
        "messages": [
            {"role": "system", "content": "You are a concise, polite customer support agent."},
            {"role": "user", "content": message},
        ],
    }
    response = requests.post(API_URL, headers=headers, json=payload)
    return response.json()

ticket = "My order #48213 arrived with the wrong charger. I need the correct one before Friday."

for model in [
    "meta-llama/llama-3.2-3b-instruct:free",
    "qwen/qwen3-4b:free",
    "mistralai/mistral-7b-instruct:free",
]:
    result = ask_model(model, ticket)
    reply = result["choices"][0]["message"]["content"]
    print(f"--- {model} ---")
    print(reply, "\n")

3つの異なるAPIを叩く代わりに、同じ関数を3回呼び出すだけだ。


3つの便利な設定

モデル選択を自動化する

どのモデルでもよい場合は"model": "openrouter/free"を指定する。OpenRouterが利用可能な無料モデルを自動で選ぶ。プロトタイピング時のコストゼロ設定として機能する。利用可能なモデルの詳細はopenrouter.ai/modelsで確認できる。

プロバイダーをコスト・レイテンシで選ぶ

同じモデルが複数のプロバイダーでホストされている場合、providerフィールドで優先基準を指定できる。

payload["provider"] = {"sort": "price"}   # 最安値優先
payload["provider"] = {"sort": "latency"} # 低レイテンシ優先

有料モデルを本番規模で使う際に効いてくる設定だ。

フォールバックでサービス継続性を確保する

プロバイダー障害、レート制限、コンテンツフィルターによるリクエスト拒否などで単一モデルが応答しないケースに備えるには、model(単数)ではなく**models(リスト)**を使う。

payload = {
    "models": [
        "qwen/qwen3-4b:free",
        "meta-llama/llama-3.2-3b-instruct:free",
        "mistralai/mistral-7b-instruct:free",
    ],
    "messages": [{"role": "user", "content": ticket}],
}

OpenRouterがリスト順に試行し、最初に成功したモデルの回答を返す。アプリ側にリトライロジックを書く必要がなくなる。


機能まとめ

設定 動作 使うタイミング
modelに:free付きモデル名 特定の無料モデルを指定 コストゼロで特定モデルを使いたいとき
modelの値を変更 モデルを切り替えて比較 どのモデルが用途に合うか検証時
"model": "openrouter/free" 利用可能な無料モデルを自動選択 無料保証でプロトタイピングするとき
"provider": {"sort": "price/latency"} コストまたは速度でプロバイダーを選択 有料モデルを大量に使うとき
"models": [...](リスト) 順番に試行して最初の成功を返す 単一障害点を避けたいとき

詳細はAccess Multiple AI Models in Your Python Apps Using OpenRouterを参照していただきたい。