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を参照していただきたい。




