OpenAIのGPTシリーズ、GoogleのGemini、AnthropicのClaudeと各社から生成AIを使うAPIがリリースされており自分のアプリに組み込むことができる。ただし、それらのモデルを使うには、それぞれのアカウントを作る必要があり、とても面倒だ。そこで試したいのがOpenRouterだ。なんと60社600以上のAIモデルを使うことができる。今回は、OpenRouterを使って、いろいろなAIの意見を聞くツールを作ってみよう。

  • OpenRouterでいろいろな生成AIを使ってみよう

    OpenRouterでいろいろな生成AIを使ってみよう

OpenRouterとは

冒頭で説明したように、各社が公開しているAIのAPIを使うには、それぞれの会社ごとにアカウントを作成し、クレジットカードを登録して、APIキーを取得する必要がある。この作業が意外と面倒だ。しかも、ちょっと試したいだけなのに、OpenAIやAnthropicのAPIを使うには、5ドル分のクレジットを購入しないといけない。そのため、複数のモデルを試したいという場合は、どうしても無駄が多くなってしまう。

そこで、利用したいのがOpenRouterだ。このサービスを利用すると、複数のAIモデルを一つのアカウントで利用できる。そして、OpenRouterは、60社300以上のAIモデルを提供しているのも嬉しいところだ。OpenAIのGPTシリーズ、GoogleのGemini、AnthropicのClaudeなどの有名なモデルも利用できるし、その他にも様々なモデルが提供されている。

ただし、各社の有料モデルを使う場合には、オリジナルのモデルよりも若干手数料分だけ高くなる。それでも、複数のモデルを一つのAPIで利用できるメリットは大きい。

なお、本稿執筆時点では、無料枠が用意されており、1ドルを超えるまでは、無料で試すことができるようだ。そこで、本稿でも無料枠の範囲で遊んでみよう。

  • OpenRouterのWebサイト - 60社600以上のモデルを利用できる

    OpenRouterのWebサイト - 60社600以上のモデルを利用できる

OpenRouterでアカウントを作ろう

それでは、OpenRouterでアカウントを作ってみよう。まずは、OpenRouterのWebサイトにアクセスして、右上の「Sign Up」ボタンをクリックしよう。そして、メールアドレスとパスワードを入力して、アカウントを作成しよう。アカウントを作成したら、ログインしてみよう。なお、GitHub、Google、Web3 Walletのアカウントでもログインできる。

そして、ログインしたら、こちらのURLにて、[Create]ボタンを押して、APIキーを作成しよう。その際、APIキーを識別する名前(Name)に加えて、ユニークな点として、APIキーのリセットタイミング(Reset limit every...)や、APIキーの有効期限(Expiration)、クレジットの制限(Credit limit)を設定することができる。

APIキーの有効期限は、無制限(No expiration)、1時間、1日、7日、30日、90日、1年(1 year)などを選ぶことができる。この点で、テスト用のAPIキーであれば、1日から7日で無効になるようにすると安心して使うことができるだろう。この点、よく考えられていると感じた。

  • APIキーを作成しよう

    APIキーを作成しよう

APIキーは作成した時だけ表示されるので、コピーして大切に保存しておこう。もし、APIキーを紛失してしまった場合は、再度ゼロからAPIキーを作成する必要がある。なお、APIキーは複数作成することができるので、用途に応じて使い分けられる。

なお、APIキーはセキュリティ上の理由から、プログラムのコード内に書かないように気をつけよう。

APIキーを環境変数に登録しよう

取得したAPIキーは、環境変数に登録しよう。

macOSならば「~/.zshrc」に以下の設定を追記しよう。UbuntuなどのLinuxならば「~/.bashrc」に以下の設定を追記しよう。そして、ターミナルを開いて「source (追記したファイル名)」を実行しよう。これで、環境変数にAPIキーが登録される。

export OPENROUTER_API_KEY="sk-or-xxxxxxxxx"

Windowsの場合は、コントロールパネルから「システムとセキュリティ」→「システム」→「システムの詳細設定」→「環境変数」と進み、「新規」ボタンをクリックして、変数名に「OPENROUTER_API_KEY」、変数値にAPIキーを入力して保存しよう。

  • Windowsで環境変数を設定しているところ

    Windowsで環境変数を設定しているところ

OpenRouterのAPIを試してみよう

OpenRouterのAPIを試すために、ターミナルで以下のコマンドを実行して、LiteLLMライブラリをインストールしよう。

pip install litellm

そして、次のようなプログラムを作って試してみよう。OpenAI、Anthropic、Googleの安価モデルを指定して、質問に対する回答を表示するプログラムだ。

import os
from litellm import completion

# 複数のモデルを指定 --- (*1)
models = [
    "openrouter/openai/gpt-5-mini",
    "openrouter/anthropic/claude-3-haiku",
    "openrouter/google/gemini-2.5-flash"
]
# 質問したいことを指定 --- (*2)
question = "こんにちは。好きな食べ物を一言で答えて。"
print(f"質問: {question}")
# 上記で指定したモデルを一つずつ実行 --- (*3)
for model in models:
    response = completion(
        model=model,
        messages=[
            {"role": "user", "content": question}
        ],
        api_key=os.getenv("OPENROUTER_API_KEY"),
        max_tokens=1000, # ← 今回これの指定が重要 --- (*4)
    )
    msg = response.choices[0].message.content
    print(f"{model}の回答: {msg}")

上記のプログラムを「hello3.py」という名前で保存しよう。そして、ターミナルで以下のコマンドを入力して、プログラムを実行してみよう。

python hello3.py

正しく実行できると、以下のように、質問に対する各モデルの回答が表示されるはずだ。

  • プログラムを実行してみたところ

    プログラムを実行してみたところ

なお、次のようなエラーが出てしまった場合、既に、無料枠を越えてしまっていることを意味する。そのため、OpenRouterのWebサイトでクレジットカードを登録して、クレジットを購入しよう。

litellm.exceptions.APIError: litellm.APIError:
    APIError: OpenrouterException - {"error":
    {"message":"This request requires more credits,
        or fewer max_tokens.
        You requested up to 65536 tokens,
        but can only afford 20000.
        To increase, visit https://openrouter.ai/settings/credits
        and upgrade to a paid account",
    "code":402,"metadata":{"provider_name":null}},
    "user_id":"user_xxxxx"}

うまく実行できたら、プログラムを確認しよう。このプログラムは、LiteLLM というライブラリを使って、複数のAIモデルに同じ質問を順番に送り、それぞれの返答を表示するものだ。いくつかのモデルにまとめて同じ質問をして、回答の違いを見比べられるところがポイントとなる。

プログラムの(*1)では、使いたいモデルの名前をリストにまとめて指定している。ここでは、OpenRouter経由で、OpenAI、Anthropic、Googleの安価モデルを指定した。

(*2)では、各モデルに送る質問文を変数questionに代入した。この変数を1か所変えるだけで、全モデルに対して異なる質問が可能だ。

(*3)では、先ほど用意したモデル一覧を順番に取り出して、ひとつずつAPIを呼び出している。この中のcompletion(...)が実際の問い合わせ処理となる。

また、api_key=os.getenv("OPENROUTER_API_KEY")と指定することで、環境変数からAPIキーを読み取って、APIに与えているのがポイントだ。これによって、APIキーをコード内に直接書かずに済むので、セキュリティ上のリスクを減らすことができる。

LLMのAPIにアクセスした後で、「response.choices[0].message.content」と書いているが、これによって、モデルの返答本文を取り出している。

(*4)では、max_tokens=1000を指定している。ここは今回のコードの中でも特に重要な部分だ。max_tokensは、モデルが返してよい最大の出力量を決めるための設定だ。今回、無料枠の中でいろいろ遊ぶためには、この値を1000以下に設定するのが安全だ。

APIに尋ねるGUIを作ってみよう

それでは、GUIを作って、各種AIの返答を得るプログラムを作ってみよう。ここでは、TkEasyGUIを使って、簡単なGUIを作ってみよう。TkEasyGUIは、TkinterをベースにしたPythonのGUIライブラリで、簡単にGUIを作ることができる。以下のプログラムは、こちらにもアップしている。

import os
from queue import Queue
import TkEasyGUI as eg
from litellm import completion

# 複数のモデルを指定 --- (*1)
models = [
    "openrouter/openai/gpt-5-mini",
    "openrouter/anthropic/claude-3-haiku",
    "openrouter/google/gemini-2.5-flash"
]

def ask_llm(question, model):
    """LLMに質問する関数"""  # --- (*2)
    response = completion(
        model=model,
        messages=[
            {"role": "user", "content": question}
        ],
        api_key=os.getenv("OPENROUTER_API_KEY"),
        max_tokens=1000, # ← 今回これの指定が重要
    )
    return response.choices[0].message.content

# GUIでやりとりするためのキュー --- (*3)
ui_queue = Queue()

# GUIを作成 --- (*4)
def main():
    layout = [
        [eg.Text("質問を入力してください:")],
        [
            eg.Input(key="question", expand_x=True, size=(40,1)),
            eg.Button("質問")
        ],
        [eg.Text("回答:")],
        [eg.Multiline(key="answer", expand_x=True, expand_y=True)],
    ]
    font = ("Arial", 20 if eg.is_mac() else 12)
    window = eg.Window("LLMに質問", layout, size=(800, 600), font=font)
    while window.is_running():
        event, values = window.read(timeout=300)
        if event == "質問":
            question = values["question"]
            window.start_thread(ask_proc, question, window)
        if not ui_queue.empty():
            model, answer = ui_queue.get()
            window["answer"].print(f"{model}の回答:", text_color="white", background_color="red")
            window["answer"].print(f"{answer}\n\n", text_color="black", background_color="white")
    window.close()

def ask_proc(question, window):
    """質問を処理する関数"""  # --- (*5)
    for model in models:
        window.start_thread(ask_llm_proc, question, model)

def ask_llm_proc(question, model):
    """LLMに質問する関数"""  # --- (*6)
    answer = ask_llm(question, model)
    ui_queue.put((model, answer))

if __name__ == "__main__":
    main()

上記のプログラムを「ask_llm.py」という名前で保存しよう。そして、ターミナルで以下のコマンドを入力して、プログラムを実行してみよう。

# TkEasyGUIとLiteLLMをインストール
python -m pip install TkEasyGUI litellm
# プログラムを実行
python ask_llm.py

プログラムを実行すると、次のように表示される。次の画面は、Windowsで実行した場合の画面だ。

  • GUIで気軽に三大AIに質問できる

    [GUIで気軽に三大AIに質問できる

macOSで実行して、各社のLLMに好きな寿司ネタを聞いてみると、次のような画面が表示された。ちなみに、実行するたびに異なる寿司ネタが表示された。

  • 同じプログラムをmacOSで実行してみたところ

    同じプログラムをmacOSで実行してみたところ

プログラムを簡単に確認しよう。

(*1)では、質問を送る対象となる複数のモデルをリストにまとめている。こちらのOpenRouterのモデル一覧ページに使えるモデルが列挙されているので、好きなモデルを選んで指定してみよう。例えば、「x-ai/grok-4.1-fast」を指定するには、「openrouter/x-ai/grok-4.1-fast」を追加すれば良い。

(*2)の関数ask_llmは、実際に1つのモデルへ質問を送って回答を受け取るためのものだ。また、ここでも「api_key=os.getenv("OPENROUTER_API_KEY")」を使って環境変数からAPIキーを読んでいる。

(*3)では、GUIでやりとりするためのキューを作っている。今回のプログラムでは、LLMへの問い合わせは別スレッドで動くが、GUIの部品そのものは基本的にメインのGUI側から安全に更新したい場面が多い。そこで、AIから返ってきた結果をいったん変数ui_queueに入れ、GUIのメインループがそれを取り出して画面へ表示する、という流れにしている。

(*4)では、GUI全体を作るmain関数を定義している。まず変数layoutで、画面にどんな部品を並べるかを決めている。質問入力欄、質問ボタン、そして回答表示欄というシンプルな画面構成にした。「expand_x=True」や「expand_y=True」と書くことで、ウィンドウサイズに合わせて入力欄や表示欄が広がるようになっている。

そのあとで「window = eg.Window(...)」と書くことで、実際のウィンドウを作って、イベントループを実行する。このループは、GUIアプリが動いている間ずっと回り続ける。ここでボタンが押されたか、入力内容がどうなっているか、キューに新しい回答が届いたか、といったことを繰り返し確認している。

なお、「質問」ボタンが押されたときには、入力欄から質問文を取り出し、別スレッドでLLMへの問い合わせ処理を始める。ここで別スレッドにしている理由は、API呼び出しに時間がかかるからである。もしそのままメインのGUI処理の中で問い合わせをしてしまうと、応答が返るまで画面が固まり、ボタンも押せず、見た目にも「止まったアプリ」のようになってしまう。そのため、重い処理を別で動かし、GUIはGUIとして動き続けるようにしている。

(*5)の関数ask_procでは、「質問」ボタンを押した時、実際に、複数のモデルへ問い合わせを投げる処理を実装している。

そして、(*6)の関数ask_llm_procは、関数ask_llm(question, model)を呼んで回答を取得し、そのあと、変数ui_queueにモデル名と回答を追加する処理にしている。

まとめ - OpenRouterは便利だった

以上、今回は、OpenRouterを使って、いろいろなAIの意見を聞くツールを作ってみた。OpenRouterを使うと、気軽に複数のAIモデルを一つのAPIで利用できることが分かった。いろいろなAIの意見を聞くことができるのは面白い。今なら、無料枠も用意されているので、気軽に試してみよう。

なお、ここで紹介したプログラムでは、安価なモデルを指定していることもあり、本稿執筆が終わった時点でも、0.01ドル(1.6円)程度のコストしか消費していなかった。無料枠が1ドルでもかなり無料で遊べることが分かる。

  • 20回程度の呼び出しでは、0.01ドルにしか消費しなかった

    20回程度の呼び出しでは、0.01ドルにしか消費しなかった

本家のAPIよりも、OpenRouterの方が手数料分コストが高いということだが、それほど大きな差はない。試しに、OpenAIの「GPT-5 Mini」を確認してみたところ、本家とOpenRouterで同価格(入力0.25/出力2ドル)だった(執筆時点)。仕事などで大量のAPIを消費する場合には確認した方が良いが、ちょっと試す程度であれば、それほど気にせず使うことができそうだ。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。これまで50冊以上の技術書を執筆した。直近では、「大規模言語モデルを使いこなすためのプロンプトエンジニアリングの教科書(マイナビ出版)」「Pythonでつくるデスクトップアプリ(ソシム)」「実践力を身につける Pythonの教科書 第2版」「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」など。