複数LLMを一つのAPIで管理！OpenRouterで実現する一元管理

## はじめに
近年、LLM（大規模言語モデル）に関する研究が急速に進展しており、API経由で利用可能なモデルの選択肢が大幅に増えています。最初期はOpenAIのGPT-3.5 Turboを使うかGPT-4を使うかの2択でしたが（と筆者は感じていますが）、現在ではAnthropicのClaude、GoogleのGemini、DeepSeek-AIのDeepSeekなど、さまざまなLLMが登場しています。

この流れは、開発の自由度を飛躍的に向上させる一方で、複数のAPIキーやコスト、使用量の管理といった課題も少なからず浮上させています。また支払った費用分のAPIリソースを全て利用できていない個人開発者の方もいらっしゃるのではないでしょうか。（私もその一員です。）

今回は(APIで活用できる)**複数のLLMを一元管理することで、APIキーの管理やコスト管理の負担を軽減できる**OpenRouterについて紹介したいと思います。

::: note
本記事のターゲット

- LLMの利用において、複数のAPIキーを管理している方
- 複数のLLMのコストを管理している方
- （どちらかというと）個人開発者の方
:::


## OpenRouterの概要
OpenRouterは複数のLLMを単一のAPIで利用できるようにする統合サービスです​。
AnthropicのClaude、OpenAIのGPT-4、DeepSeek-AIのDeepSeek V3など、異なるプロバイダーが提供するモデルを一つのAPIキーでシームレスに切り替えて利用でき、管理の手間が削減されます。

2025年3月22日時点で361モデルが使用可能です。直近で言うと3月12日にReportが発表されたGemma 3も使うことができます。

![ 2025-03-22 22.23.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487820/0814e466-0afb-44c5-bfde-6e03fb240653.png)

https://openrouter.ai/models


## OpenRouterの使い方(サンプルコード)
環境構築のセットアップ方法は末尾に簡単に記載しています。
[OpenRouterのセットアップ](#参考:OpenRouterのセットアップ)

公式Documentのリンクはこちら。

https://openrouter.ai/docs/quickstart

以下OpenAI SDKを用いたサンプルコードです。

先述したように単一のエンドポイント(`https://openrouter.ai/api/v1`)に対してモデル名を指定するだけで様々なモデルを使うことができます。

```python 
from openai import OpenAI
import os 

model_name = "anthropic/claude-3.5-haiku-20241022" #モデル名指定

client = OpenAI(
  base_url="https://openrouter.ai/api/v1",
  api_key=os.getenv("OPENROUTER_API_KEY"), #APIキー
)

completion = client.chat.completions.create(
  model=model_name,
  messages=[
    {
      "role": "user",
      "content": "こんにちは"
    }
  ]
)
print(completion.choices[0].message.content)
```

OpenRouterはOpenAI SDK以外にもLangChainやPydanticAIなどのフレームワークで使うことができます。

https://openrouter.ai/docs/community/frameworks

私はよくLangChainでコーディングを行うので、自分への備忘録のためにLangChainのコードも記載しておきます。

<details><summary>LangChainで記述したOpenRouterの処理</summary>

```python 
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers.string import StrOutputParser
import os 

model_name = "anthropic/claude-3.5-haiku-20241022"

llm = ChatOpenAI(
  openai_api_key=os.getenv("OPENROUTER_API_KEY"),
  openai_api_base="https://openrouter.ai/api/v1",
  model_name=model_name,
)

parser = StrOutputParser()

chain = llm | parser

result = chain.invoke("こんにちは")
print(result)
```
</details>

## OpenRouterの使用感
ここでは筆者がOpenRouterを使った感触・使用感について(主観込みで)まとめます。筆者は使用感と後述する注意点踏まえて、個人利用の範囲であればOpenRouterで問題ないかなと思っています。


まず[モデル選択](https://openrouter.ai/models)において、モデル名のコピーが簡単にできます。
以下添付写真のように、モデルの横にあるクリップボードマークからOpenRouterに登録されているモデル名をコピーでき、プログラム(または設定ファイル)にペーストすれば簡単に利用できます。

![ 2025-03-22 22.25.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487820/c4dd19ad-1fed-4302-bac5-8a18289f97ef.png)

またモデルをクリックすると、モデルの基本情報(コンテキストウィンドウやコスト)などが確認できます。これは利用者目線で地味に嬉しいです。

![ 2025-03-22 22.26.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487820/e4726c68-4289-4e4e-98c4-61e8c4e92f8b.png)

アクティビティ画面から使用したモデル、プロバイダー、APIキーごとに使用量を確認することができます。（Filtersから各項目のフィルタリング検索可能）

![ 2025-03-22 22.55.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487820/470209d5-5235-4ab5-a2c9-090637749cec.png)

また1つ1つのリクエストに対してレイテンシーやトークン数などの確認も可能です。ただし入出力の値などは確認できないので、入出力の管理まで行いたい場合は別途LLMOpsを導入する必要があります。

![ 2025-03-22 22.59.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487820/d124e465-40df-4e65-bc77-dd75d945d14a.png)

上記のようにOpenRouterは必要最低限の機能が実装されているので、個人利用の範囲では問題なく使うことができると思います。

---

### 余談:無料のモデルを使うには？
無料のモデルを使いたい場合は、モデル名にfreeと書いてあるモデルを使うと良いです。（2025年3月22日現在は49モデルが無料で使えるモデルとして登録されています。）

![ 2025-03-22 23.21.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487820/aaaeaca6-88d8-4734-b75b-2c2fab3f96d5.png)

---


## OpenRouterの使用上の注意点
OpenRouterの注意点を紹介します。特にOpenRouterの商用利用を検討されている方は注意してください。

- **OpenRouter利用によるレイテンシ増加**

OpenRouterはリクエストを一旦受け取ってから目的のLLMサービスに転送するため、直接APIを呼ぶ場合と比べて通信の往復が一回余分に発生します。その結果若干の遅延オーバーヘッドが生じることで、最小限のレイテンシが出せないケースがあります。

- **OpenRouterのレートリミット**

AnthropicやGoogle系モデル利用時にOpenRouterのレート上限に達してしまいがちとの報告もあります。

https://www.reddit.com/r/AI_Agents/comments/1iindyq/comment/mfg6xu2/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button

(2025年3月26日追記)リリース直後かつSNSで話題になっているモデルは、アクセスが集中しているため比較的429エラーが返ってきやすいので注意が必要です。

- **一部のプロバイダーがサポートされていない**

CerebrasやGroqといったLLMを高速に活用できるプロバイダーの使用ができません。
それに伴い、例えばLlamaをできる限り高速で動かしたい場合などはOpenRouterではなく、Cerebrasなどを使うと良いでしょう。

https://artificialanalysis.ai/models/llama-3-3-instruct-70b/providers

https://openrouter.ai/meta-llama/llama-3.3-70b-instruct:free

- **クレジット残高について**

o1-proなど高価なモデルを使うためには、ある程度クレジットをチャージしておく必要があります。クレジット不足だと以下のようなエラーが出ます。(o1-proの使用を試みた際のエラー)

```bash 
ValueError: {'message': 'More credits are required to run this request. 100000 token capacity required, 8665 available. To increase, visit https://openrouter.ai/settings/credits and add more credits', 'code': 402, 'metadata': {'provider_name': 'OpenAI'}}
```

## さいごに
OpenRouterの概要や使用感について説明しました。

OpenRouterは複数のLLMを単一のAPIで使用できる便利なサービスです。
今回紹介していないですがプロバイダーの最適な選択やモデルおよびプロバイダーの動的な切り替えなどのOpenRouterには他の機能もあります。ドキュメントリンクを以下において置くので、興味のある方はご覧になってください。

https://openrouter.ai/docs/features/model-routing

https://openrouter.ai/docs/features/provider-routing

またOpenRouterの類似サービスが気になると言う方は、末尾に簡単ですがDeepResearchの調査結果も載せておきます。([リンク](#参考:OpenRouterの類似サービス))

この記事が少しでも参考になれば幸いです。


## 参考:OpenRouterのセットアップ

- アカウント作成

https://openrouter.ai/

- クレジットの追加

https://openrouter.ai/settings/credits

- APIキーの作成

https://openrouter.ai/settings/keys

- 環境構築

筆者の環境はこちら
```bash
% uv version                                                                       uv 0.4.28 (debe67ffd 2024-10-28)
% uv run python --version
Python 3.10.11
```


環境構築のためのコマンド
```bash 
% uv init {プロジェクト名}
% uv add openai langchain_openai
% uv run {Pythonファイル名}
% export OPENROUTER_API_KEY={OpenRouterのAPIキー}
```

## 参考:OpenRouterの類似サービス
- DeepResearchの結果
    - https://chatgpt.com/share/67df4e4c-f6c4-800d-b3ba-6adafa3cd26a