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?

nRouter.ai - Every model. One API key. Total control. Guardrails, budget enforcement, and smart routing included on every plan.

0
Posted at

複数LLMを1つのAPIで扱う:PythonでLLMゲートウェイを試す

はじめに

OpenAI、Anthropic、Googleなど、複数のLLMをアプリケーションから利用するケースが増えています。

しかし、プロバイダーごとにAPIの仕様、認証方法、エラー処理、料金体系が異なるため、モデルを追加するほど実装と運用が複雑になります。

この記事では、LLMゲートウェイを使って複数モデルへのアクセスを共通化する考え方と、PythonからOpenAI互換APIを呼び出す基本的な方法を紹介します。

LLMゲートウェイとは

LLMゲートウェイは、アプリケーションとAIモデルプロバイダーの間に配置する共通のAPIレイヤーです。

主に次の処理を一元化できます。

  • モデルとプロバイダーのルーティング
  • 障害発生時のフォールバック
  • APIキーの管理
  • レート制限
  • 利用予算の制御
  • 入出力のガードレール
  • トークン数、コスト、レイテンシーの記録

アプリケーション側は1つのインターフェースを利用しながら、用途に応じて異なるモデルを選択できます。

PythonからAPIを呼び出す

最初にAPIキーを環境変数へ設定します。

export NROUTER_API_KEY="your-api-key"

Windows PowerShellの場合は次のように設定します。

$env:NROUTER_API_KEY="your-api-key"

続いて、requestsをインストールします。

pip install requests

以下は、OpenAI互換エンドポイントへリクエストを送信する例です。

import os
import requests

api_key = os.environ["NROUTER_API_KEY"]

url = "https://api.nrouter.ai/v1/chat/completions"

payload = {
    "model": "deepseek-v4-pro",
    "messages": [
        {
            "role": "user",
            "content": "LLMのセマンティックキャッシュについて説明してください。"
        }
    ]
}

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

response = requests.post(
    url,
    json=payload,
    headers=headers,
    timeout=60
)

response.raise_for_status()

data = response.json()
print(data["choices"][0]["message"]["content"])

APIキーをソースコードへ直接書かず、環境変数やシークレット管理サービスを使用することが重要です。

エラー処理を追加する

本番環境では、タイムアウト、レート制限、認証エラーなどを区別して処理します。

import os
import requests

def call_llm(prompt: str) -> str:
    response = requests.post(
        "https://api.nrouter.ai/v1/chat/completions",
        headers={
            "Authorization": f"Bearer {os.environ['NROUTER_API_KEY']}",
            "Content-Type": "application/json"
        },
        json={
            "model": "deepseek-v4-pro",
            "messages": [
                {"role": "user", "content": prompt}
            ]
        },
        timeout=60
    )

    if response.status_code == 429:
        raise RuntimeError("レート制限に達しました")

    if response.status_code in {500, 502, 503, 504}:
        raise RuntimeError("モデルプロバイダーで一時的な障害が発生しました")

    response.raise_for_status()

    result = response.json()
    return result["choices"][0]["message"]["content"]


print(call_llm("Pythonのasyncioを簡単に説明してください。"))

すべてのエラーを無条件で再試行すると、遅延とコストが増える可能性があります。再試行するエラー、最大試行回数、フォールバック先を事前に定義しておきましょう。

ルーティングポリシーを設計する

「最も優れたモデルへ自動的に送る」だけでは、運用可能なルールとはいえません。

モデルの選択基準を明確にする必要があります。

例えば、次のようなルールを設定できます。

  • 分類処理には低コストのモデルを使用する
  • 複雑な推論には高性能モデルを使用する
  • 応答時間を優先する処理では低レイテンシーのモデルを選択する
  • 規制対象データは承認済みのプロバイダーだけへ送信する
  • タイムアウトやレート制限が発生した場合だけフォールバックする
  • チームの予算上限に達した場合はリクエストを停止する

重要なのは、モデルが選ばれた理由をログから説明できることです。

記録しておきたい情報

本番環境では、リクエストごとに次の情報を記録するとトラブルシューティングが容易になります。

  • 使用したモデルとプロバイダー
  • ルーティングの理由
  • 応答時間
  • 入力・出力トークン数
  • 推定コスト
  • キャッシュの使用状況
  • フォールバック回数
  • 最終ステータス

プロンプトに個人情報や機密情報が含まれる可能性がある場合は、内容をそのままログへ保存しない設計も必要です。

まとめ

複数のLLMを利用すると、単純なAPI連携はルーティング、障害対応、セキュリティ、予算管理を含むインフラ課題へ変わります。

LLMゲートウェイを導入すると、アプリケーション側のインターフェースを維持しながら、モデル選択や運用ポリシーを一元管理できます。

今回のコード例では、OpenAI互換APIを提供するマルチモデルLLMゲートウェイのnRouter.aiを使用しました。実際に導入する際は、対応モデルだけでなく、フォールバック、ガードレール、監視、予算制御、データ処理方針も確認してください。

Qiitaタグ

Python 生成AI LLM API 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?