LLM Gatewayツール比較:LiteLLM vs PortKey vs OpenRouter でAI APIを統合する
オープンソースラボ編集部 ・ 2026年6月13日
LLM Gatewayツール比較:LiteLLM vs PortKey vs OpenRouter でAI APIを統合する
GPT-4・Claude・Gemini・Llama 3など数十のLLMを使うアプリケーションで、APIキー管理・コスト計測・ロードバランシング・フォールバック・レート制限・キャッシュを統一管理する**LLM Gateway(AIプロキシ)**が不可欠になっています。LiteLLM(OSS・最大シェア)・PortKey(フルマネージド+OSS)・OpenRouter(SaaSプロキシ)の3つが2026年のデファクトスタンダードです。
LLM Gatewayを使う理由
- APIキー一元管理: 各LLMのAPIキーをGatewayが管理→アプリはGatewayの単一エンドポイントのみ
- コスト最適化: リクエストのコスト計測・プロバイダー間ルーティング・セマンティックキャッシュでコスト削減
- HA・フォールバック: OpenAI APIが落ちたらAnthropic Claudeに自動フォールバック→99.99%可用性
- 観測性: すべてのLLMリクエストのログ・レイテンシ・トークン数・コストを一元可視化
主要ツールの概要
LiteLLM
2023年公開、Python製のOSSです。GitHubスター17k+。最大シェアのOSSLLMプロキシで、100+のLLMプロバイダー(OpenAI・Anthropic・Google・Azure・Ollama・Groq・Bedrock)をOpenAI互換のAPI形式に統一します。PythonライブラリとしてもProxyサーバーとしても使えます。
# docker-compose.yml: LiteLLM Proxy
version: "3.8"
services:
litellm:
image: ghcr.io/berriai/litellm:main-latest
restart: unless-stopped
ports:
- "4000:4000"
volumes:
- ./litellm-config.yaml:/app/config.yaml
environment:
OPENAI_API_KEY: ${OPENAI_API_KEY}
ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}
GOOGLE_API_KEY: ${GOOGLE_API_KEY}
GROQ_API_KEY: ${GROQ_API_KEY}
DATABASE_URL: postgresql://litellm:${DB_PASS}@postgres/litellm
LITELLM_MASTER_KEY: ${LITELLM_MASTER_KEY}
command: --config /app/config.yaml --port 4000 --detailed_debug
postgres:
image: postgres:16-alpine
environment:
POSTGRES_DB: litellm
POSTGRES_USER: litellm
POSTGRES_PASSWORD: ${DB_PASS}
redis:
image: redis:7-alpine
# litellm-config.yaml: モデルルーティング・フォールバック設定
model_list:
# OpenAI GPT-4o
- model_name: gpt-4o
litellm_params:
model: openai/gpt-4o
api_key: os.environ/OPENAI_API_KEY
rpm: 500
# Anthropic Claude(フォールバック用)
- model_name: gpt-4o
litellm_params:
model: anthropic/claude-sonnet-4-6
api_key: os.environ/ANTHROPIC_API_KEY
rpm: 1000
# Google Gemini
- model_name: gemini-pro
litellm_params:
model: gemini/gemini-2.0-flash
api_key: os.environ/GOOGLE_API_KEY
# ローカルOllama(ゼロコスト)
- model_name: llama3-local
litellm_params:
model: ollama/llama3.2
api_base: http://ollama:11434
router_settings:
routing_strategy: cost-based-routing
enable_pre_call_checks: true
retry_policy:
TimeoutErrorRetries: 3
RateLimitErrorRetries: 3
fallbacks:
- gpt-4o:
- gpt-4o # 自動フォールバック(1つ目が失敗→2つ目のgpt-4o=Claudeへ)
litellm_settings:
success_callback: ["langfuse"]
failure_callback: ["langfuse", "slack"]
cache: true
cache_params:
type: redis
host: redis
port: 6379
# Python: LiteLLM経由でマルチプロバイダーLLMを呼び出す
from openai import OpenAI
import litellm
from litellm import completion, acompletion
import asyncio
# LiteLLM Proxy経由(既存OpenAIコードをURLだけ変更)
client = OpenAI(
api_key='sk-your-litellm-master-key',
base_url='http://localhost:4000/v1',
)
def chat_with_fallback(prompt: str, preferred_model: str = 'gpt-4o') -> str:
'''フォールバック付きでLLM APIを呼び出す'''
response = client.chat.completions.create(
model=preferred_model,
messages=[{'role': 'user', 'content': prompt}],
)
return response.choices[0].message.content
async def parallel_llm_comparison(prompt: str) -> dict:
'''複数LLMの回答を並列で比較取得'''
tasks = [
acompletion(model='openai/gpt-4o', messages=[{'role': 'user', 'content': prompt}]),
acompletion(model='anthropic/claude-sonnet-4-6', messages=[{'role': 'user', 'content': prompt}]),
acompletion(model='gemini/gemini-2.0-flash', messages=[{'role': 'user', 'content': prompt}]),
]
results = await asyncio.gather(*tasks, return_exceptions=True)
return {
'gpt-4o': results[0].choices[0].message.content if not isinstance(results[0], Exception) else str(results[0]),
'claude': results[1].choices[0].message.content if not isinstance(results[1], Exception) else str(results[1]),
'gemini': results[2].choices[0].message.content if not isinstance(results[2], Exception) else str(results[2]),
}
def get_cost_summary() -> dict:
'''今月のLLMコストをモデル別に取得(LiteLLM Proxy API経由)'''
import requests
headers = {'Authorization': f'Bearer sk-your-master-key'}
resp = requests.get('http://localhost:4000/global/spend', headers=headers)
return resp.json()
# 使用例
answer = chat_with_fallback('PythonでRustよりも優れている点を3つ挙げてください')
print(answer)
cost = get_cost_summary()
print(f'今月のLLM費用: ${cost.get("total_cost", 0):.2f}')
PortKey
2023年公開のOSSプロキシです(GatewayはOSS、フルマネージドSaaSあり)。GitHubスター7k+。AI Gatewayに特化した高機能プロキシで、LLMリクエストのA/Bテスト・セマンティックキャッシュ・Guardrails(プロンプトインジェクション検知・PII検出)・バジェット管理・仮想APIキーが特徴です。
# Python: Portkey SDKでLLMルーティング・A/Bテスト
from portkey_ai import Portkey
portkey = Portkey(
api_key='pk-xxxxx',
virtual_key='openai-virtual-key-xxxxx', # 各プロバイダーのAPIキーをPortkey管理
)
# A/Bテスト: 50%の確率でGPT-4o vs Claude Sonnet
response = portkey.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': 'Hello'}],
config={
'strategy': {'mode': 'ab_test'},
'targets': [
{'provider': 'openai', 'model': 'gpt-4o', 'weight': 0.5},
{'provider': 'anthropic', 'model': 'claude-sonnet-4-6', 'weight': 0.5},
],
},
)
print(response.choices[0].message.content)
OpenRouter
クラウドSaaSのLLMプロキシです(OSSなし)。最多200+モデルへの単一APIアクセスを提供し、コスト最適化ルーティング・Pay-As-You-Goモデルで手軽にマルチLLMプロバイダーを使えます。OSSではないですが比較のため掲載します。
# Python: OpenRouter APIを使う(OpenAI互換)
from openai import OpenAI
client = OpenAI(
base_url='https://openrouter.ai/api/v1',
api_key='sk-or-v1-xxxxx', # OpenRouter APIキー
)
response = client.chat.completions.create(
model='anthropic/claude-sonnet-4-6', # OpenRouter経由でClaude使用
messages=[{'role': 'user', 'content': 'Tell me about LLM gateways'}],
extra_headers={'HTTP-Referer': 'https://myapp.example.com', 'X-Title': 'My App'},
)
print(response.choices[0].message.content)
機能比較表
| 比較項目 | LiteLLM | PortKey | OpenRouter |
|---|---|---|---|
| OSSセルフホスト | ✅ | ✅(OSS Gateway) | ❌ SaaSのみ |
| 対応モデル数 | 100+ | 100+ | 200+ |
| セマンティックキャッシュ | ✅ | ✅ | ✅ |
| Guardrails | 限定 | ✅ | ✅ |
| GitHub Stars | 17k+ | 7k+ | N/A |
LLM Gatewayは/categories/llm-toolsの中核インフラとして、LlamaIndex・LangChainのRAGパイプラインからのLLM呼び出しをLiteLLM Proxy経由にするだけでコスト計測・フォールバック・キャッシュを自動適用できます。DevOpsカテゴリ/categories/devopsのKubernetes上でLiteLLM ProxyをDeploymentとして運用し、HorizontalPodAutoscalerで負荷に応じてスケールさせる大規模AI基盤構成が採用されています。
FAQ
Q. LiteLLMでOpenAIからAnthropicへのフォールバックを設定するには?
A. litellm-config.yamlのfallbacks設定でフォールバックチェーンを定義します。設定例: router_settings.fallbacksでgpt-4o → claude-sonnet-4-6 → gemini-2.0-flashの順に自動フォールバック。条件別フォールバック: content_policy_fallbacks(コンテンツポリシー違反時)・context_window_fallbacks(コンテキスト長超過時)・TimeoutErrorRetries(タイムアウト時のリトライ回数)をそれぞれ設定。動作: ①OpenAI APIが503を返す→②自動的にAnthropicにリクエスト転送→③成功したらそのレスポンスを返す→④失敗したらGeminiへ。ログ: LangFuse・Heliconeなどの観測ツールと連携してフォールバック発生をトレース。
Q. LiteLLMでセマンティックキャッシュを使ってコストを削減するには?
A. Redisとのセマンティックキャッシュ(embedding類似度ベース)を設定してAPIコストを削減します。設定: litellm_settings.cache_params.type: semantic・embedding_model: text-embedding-ada-002・similarity_threshold: 0.95。効果: 「東京の天気は?」と「今の東京の気温は?」は意味が類似(コサイン類似度>0.95)→2回目は実際のLLM APIを呼ばずキャッシュ応答→費用ゼロ。コスト削減効果: ユースケースによって30〜70%のAPIコスト削減が報告されている。キャッシュ有効期間: ttl: 3600(1時間)→頻繁に変わる情報は短いTTLを設定。
Q. LiteLLMのバーチャルキー(Virtual Key)でチームごとにAPIコストを管理するには?
A. LiteLLM ProxyのVirtual Keyでチーム・プロジェクトごとに予算上限を設定します。①Admin UI(http://localhost:4000/ui)でVirtual Keyを発行→チームA・チームB・プロジェクトXに個別キーを渡す②各キーに予算上限設定: budget_id: team-a-budget・max_budget: 50.0(月$50まで)・budget_reset_at: 2026-07-01T00:00:00Z③超過時: チームAが$50を超えるとBudgetExceededErrorを返す→チームBには影響なし④ダッシュボード: LiteLLM UI(またはGrafana連携)で各チームの消費コストをリアルタイム監視。
Q. LiteLLMをKubernetesで本番運用するには?
A. Helm Chartでの水平スケール・PostgreSQL + Redis・HTTPS Ingress・ReadinessProbeの設定が重要です。①helm repo add litellm https://helm.litellm.ai→helm install litellm litellm/litellm --values values.yaml②values.yaml: replicaCount: 3・resources.requests.memory: 512Mi・image.tag: main-latest③LoadBalancer Ingress + TLS証明書でHTTPS終端④readinessProbe: httpGet: path: /health/readinessで各Podの健全性チェック→HorizontalPodAutoscaler(minReplicas: 3・maxReplicas: 10・CPU/QPSベース)でオートスケール⑤外部PostgreSQL(RDS/CloudSQL)とRedis ClusterをSTATEFULとして別管理→LiteLLM Podはステートレスで安全にスケール。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| OSS・セルフホスト・100+モデル・フォールバック | LiteLLM |
| A/Bテスト・Guardrails・セマンティックキャッシュ | PortKey |
| セットアップ不要・200+モデル・SaaS | OpenRouter |