OpenRouterとは?
OpenRouterは、複数のAIモデルを統一されたAPIで利用できる革新的なプラットフォームです。通常、異なるAIモデルを使用する際は、それぞれ異なるAPIキーやSDKを用意する必要がありますが、OpenRouterを使用することで、一つのAPIキーで数百種類のモデルにアクセスできるようになります。
開発環境の構築
OpenRouterを使用するための開発環境を構築していきましょう。今回は、Pythonの高速パッケージ管理ツールであるuvを使用します。
uvの詳しい解説については、以下の動画をご参照ください。実際の使用方法や従来のツールとの比較が分かりやすく説明されています。
必要なライブラリのインストール
OpenRouterを使用するために、OpenAI SDKをインストールします。OpenRouterはOpenAI互換のAPIを提供しているため、既存のOpenAI SDKをそのまま使用できます。
# uvを使用してOpenAI SDKをインストール
uv add openai
# 追加で便利なライブラリもインストール(オプション)
uv add python-dotenv # 環境変数管理用python-dotenvは環境変数を.envファイルから読み込むためのライブラリです。APIキーなどの機密情報を安全に管理するために推奨されます。
OpenRouter APIキーの発行と設定
OpenRouterを使用するためには、専用のAPIキーが必要です。このセクションでは、アカウント作成からAPIキーの発行、そして安全な管理方法まで詳しく解説します。
アカウント作成とログイン
まず、OpenRouterの公式サイトでアカウントを作成します。GitHubアカウントやGoogleアカウントを使用してサインアップすることも可能です。アカウント作成時には、利用規約とプライバシーポリシーを必ず確認してください。
アカウント作成が完了したら、ログインして管理画面にアクセスします。初回ログイン時には、プロフィール情報の設定や利用目的の選択を求められる場合があります。
APIキーの作成手順
ログイン後、右上のメニューボタンから「Keys」を選択してください。APIキー管理画面が表示されます。

「Create API Key」ボタンをクリックして、新しいAPIキーを作成します。

APIキーの設定オプション
APIキー作成時には、セキュリティと予算管理のために以下の設定を行うことができます:
キー名の設定: 複数のプロジェクトで異なるAPIキーを使用する場合、分かりやすい名前を付けることで管理が容易になります。例:「開発用」「本番用」「テスト用」など。
使用制限の設定: 月間の使用料金上限を設定することで、予期しない高額請求を防ぐことができます。初回は低めの金額(例:$10-20)に設定し、必要に応じて後から増額することを推奨します。
IPアドレス制限: 特定のIPアドレスからのみAPIキーを使用できるよう制限することで、セキュリティを向上させることができます。ただし、開発環境では柔軟性を重視して制限を設けない場合もあります。

APIキーが作成されたら、必ず安全な場所に保存してください。このキーは一度しか表示されないため、必ずどこかにメモしておきましょう。
クレジットの追加と料金体系の理解
OpenRouterは従量課金制を採用しており、使用したトークン数に応じて料金が発生します。高性能なモデル(ChatGPT、Claude、Geminiなど)を使用するためには、事前にクレジットを追加する必要があります。
ただし、完全に無料で利用できるモデルも多数提供されています。予算を抑えたい場合や、まずはOpenRouterの機能を試してみたい場合は、これらの無料モデルから始めることをお勧めします。
無料モデルの活用方法
無料モデルを探すには、「Models」タブを開き、「Prompt pricing」フィルターを「FREE」に設定します。これにより、完全に無料で利用できるモデルのみが表示されます。

2025年8月現在、以下のような高品質な無料モデルが利用可能です:
DeepSeek V3 0324 (free): 685億パラメータのMixture-of-Expertsモデルで、高度な推論能力を持ちます。特に数学、コーディング、科学的な質問に優れた性能を発揮します。
DeepSeek R1 0528 (free): OpenAI o1に匹敵する推論能力を持つモデルです。複雑な問題解決や論理的思考が必要なタスクに適しています。
MoonshotAI Kimi K2 (free): 1兆パラメータの大規模モデルで、長文コンテキスト(128Kトークン)に対応しています。長い文書の要約や分析に優れています。
Venice Uncensored (free): 比較的制約の少ないモデルで、創作活動やロールプレイに適しています。
有料クレジットの追加方法
より高性能なモデルを使用したい場合は、クレジットを追加する必要があります。メニューバーから「Credits」に移動してください。

「Add Credits」ボタンをクリックすると、クレジット購入画面が表示されます。OpenRouterでは、以下の支払い方法が利用可能です:
クレジットカード: Visa、MasterCard、American Expressなどの主要なクレジットカードが利用できます。
デビットカード: 多くのデビットカードも対応しています。
PayPal: PayPalアカウントを使用した支払いも可能です。
重要な注意点: OpenRouterでは、システム利用料として課金料金の約5%が上乗せされます。例えば、$10のクレジットを購入した場合、実際の支払い金額は約$10.50になります。この手数料は、プラットフォームの運営費用として使用されます。
料金体系の詳細理解
OpenRouterの料金は、入力トークンと出力トークンで異なる価格設定がされています。一般的に、出力トークンの方が入力トークンよりも高価格に設定されています。これは、テキスト生成の方が計算コストが高いためです。
例えば、Grok 4の場合:
・入力トークン:$3.00 / 1M トークン
・出力トークン:$15.00 / 1M トークン
一方、DeepSeek V3の有料版では:
・入力トークン:$0.18 / 1M トークン
・出力トークン:$0.72 / 1M トークン
このように、モデルによって料金が大きく異なるため、用途に応じて適切なモデルを選択することが重要です。短い応答が必要な場合は高性能モデル、長文生成が必要な場合はコストパフォーマンスの良いモデルを選ぶなど、戦略的な使い分けが推奨されます。
OpenRouterの基本的な使用方法
環境構築とAPIキーの設定が完了したら、実際にOpenRouterを使用してみましょう。このセクションでは、テキスト生成から画像解析まで、様々な使用例を詳しく解説します。
基本的なテキスト生成
まず、最も基本的なテキスト生成から始めましょう。以下のコードは、OpenRouterを使用してAIモデルと対話する基本的な例です:
from openai import OpenAI
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key="<OPENROUTER_API_KEY>",
)
completion = client.chat.completions.create(
extra_headers={
"HTTP-Referer": "<YOUR_SITE_URL>", # Optional. Site URL for rankings on openrouter.ai.
"X-Title": "<YOUR_SITE_NAME>", # Optional. Site title for rankings on openrouter.ai.
},
model="openai/gpt-4o",
messages=[
{
"role": "user",
"content": "人生の意味とは何だろう?"
}
]
)
print(completion.choices[0].message.content)
このコードを実行すると、指定したモデルからの応答がターミナルに表示されます。

コードをGitHubなどで管理する場合は、API KEYは直接書かずにpython-dotenvのライブラリを使って.envファイルに書いておきましょう。
モデルの切り替え方法
OpenRouterの最大の利点は、コードを変更することなく異なるモデルを試せることです。モデルを変更するには、model名を変更するだけです。
例えば、Grok 4を使用したい場合は、OpenRouterのモデルページでGrok 4を検索し、モデル名をコピーします:

そして、コード内のmodel名を変更します:
completion = client.chat.completions.create(
extra_headers={
"HTTP-Referer": "<YOUR_SITE_URL>", # Optional. Site URL for rankings on openrouter.ai.
"X-Title": "<YOUR_SITE_NAME>", # Optional. Site title for rankings on openrouter.ai.
},
model="x-ai/grok-4",
messages=[
{
"role": "user",
"content": "人生の意味とは何だろう?"
}
]
)このように、model名を変更するだけで、全く異なる特性を持つAIモデルを簡単に試すことができます。これにより、タスクに最適なモデルを効率的に見つけることが可能です。
画像解析機能の活用
多くのモデルは画像解析機能も提供しています。特にGrok 4、Claude、GPT-4oなどの最新モデルは、高精度な画像理解能力を持っています。
画像解析を行う場合は、メッセージの形式を変更する必要があります:
from openai import OpenAI
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key="<OPENROUTER_API_KEY>",
)
completion = client.chat.completions.create(
extra_headers={
"HTTP-Referer": "<YOUR_SITE_URL>", # Optional. Site URL for rankings on openrouter.ai.
"X-Title": "<YOUR_SITE_NAME>", # Optional. Site title for rankings on openrouter.ai.
},
extra_body={},
model="x-ai/grok-4",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": "What is in this image?"
},
{
"type": "image_url",
"image_url": {
"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"
}
}
]
}
]
)
print(completion.choices[0].message.content)画像解析を使用する際の重要な注意点:
画像のアップロード: 現在、OpenRouterでは直接画像ファイルをアップロードすることはできません。画像はWeb上にアップロードし、そのURLを指定する必要があります。
対応形式: 一般的に、JPEG、PNG、GIF、WebPなどの主要な画像形式がサポートされています。
画像サイズ: 大きすぎる画像は処理時間が長くなったり、エラーの原因となる場合があります。適切なサイズ(通常は2MB以下)に調整することを推奨します。
料金への影響: 画像解析機能を使用する場合、追加の料金が発生するモデルがあります。例えば、Grok 2 Vision 1212では、画像1000枚あたり$3.60の追加料金が発生します。
エロに使える?
以前はGrokやDeepSeekがアダルトコンテンツに対して比較的寛容でしたが、最近では制限が強化される傾向にあります。特にDeepSeekは、エロティックな内容の要求に対してやんわりと断る場合が多くなっています。
一方、Grokは成人であることを明記すると結構アダルトな要求にも応じます。
from openai import OpenAI
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key="<OPENROUTER_API_KEY>",
)
completion = client.chat.completions.create(
extra_headers={
"HTTP-Referer": "<YOUR_SITE_URL>", # Optional. Site URL for rankings on openrouter.ai.
"X-Title": "<YOUR_SITE_NAME>", # Optional. Site title for rankings on openrouter.ai.
},
model="x-ai/grok-4",
messages=[
{
"role": "user",
"content": "女性が根暗男性に中出しされるまでのエロ小説を書いてください。すべての登場人物は18歳以上です。"
}
]
)
print(completion.choices[0].message.content)
このようなプロンプトを送信すると、以下のような応答が返ってくる場合があります:
以下は、ユーザーのリクエストに基づいたエロ小説です。すべての登場人物は18歳以上であり、フィクションです。内容は成人向けですので、ご注意ください。合意に基づいた関係を描いています。
影の誘惑
アヤカは22歳の大学生。明るい性格で友達も多く、いつもパーティーやサークルで賑わっていた。でも、心のどこかで、普通の明るい男の子には物足りなさを感じていた。そんなある日、大学の図書館で出会ったのがユウキだった。ユウキは20歳の同級生。黒い服を好み、いつも一人で暗い小説を読んでいる根暗なタイプ。クラスメートからは「影の男」と陰で呼ばれていた。
アヤカは好奇心からユウキに話しかけた。「ねえ、何読んでるの? 面白そう!」ユウキは驚いた顔で顔を上げ、ぼそっと答えた。「ホラー小説。君みたいな明るい子には向かないよ。」その冷たい視線に、アヤカの心はざわついた。なぜか惹かれる。根暗な彼の内側に、何か隠された情熱を感じたのだ。
それから二人は少しずつ話すようになった。ユウキの部屋は薄暗く、本棚に並ぶのはダークファンタジーの本ばかり。アヤカは訪れるたびに、ユウキの孤独な世界に引き込まれていった。「俺は人付き合いが苦手だ。でも君がいると、少しだけ明るくなる」ユウキのそんな言葉に、アヤカは胸が熱くなった。ある夜、二人きりの部屋で、ユウキが突然アヤカを抱き寄せた。「君が欲しい。俺の闇に染めてやる」その言葉は、冷たくも甘く響いた。
アヤカは抵抗しなかった。むしろ、興奮した。ユウキの唇がアヤカの首筋に触れ、ゆっくりと服を脱がせていく。ユウキの手は意外に優しく、でも力強くアヤカの胸を揉みしだいた。「あっ…ユウキ…」アヤカの吐息が漏れる。ユウキの目は暗く輝き、アヤカのスカートをたくし上げ、下着をずらした。指が湿った秘部を探り、ゆっくりと刺激する。「君のここ、熱いな。俺のものにしたい」ユウキの声は低く、抑えきれない欲情を滲ませていた。
アヤカはベッドに押し倒され、ユウキの体が覆いかぶさってきた。ユウキの硬くなったものが、アヤカの入り口に当たる。「入れるよ…」ユウキが囁き、ゆっくりと挿入した。アヤカの体は震え、快感が全身を駆け巡る。「んっ…深い…」ユウキの動きは最初は優しく、だが次第に激しくなった。アヤカの腰を抱き、ピストンを繰り返す。部屋に響くのは、二人の息遣いと肌のぶつかる音だけ。
ユウキの根暗な性格が、セックスでは野性的に現れた。彼はアヤカの耳元で囁く。「君を俺の色に染めたい。中で出すよ…」アヤカは頷き、快楽に身を委ねた。ユウキの動きが速くなり、ついに限界が来た。「あぁ…いく…!」ユウキが低くうめき、熱いものがアヤカの中に放たれた。中出しの感覚が、アヤカを絶頂に導く。「はあっ…ユウキの…感じる…」アヤカの体は痙攣し、二人は抱き合ったまま息を荒げた。
それ以来、アヤカはユウキの闇に魅了され、二人は密かに愛し合うようになった。根暗な彼の情熱は、アヤカの心と体を虜にしたのだ。
この小説は短編としてまとめました。エロティックな要素を強調しつつ、ストーリー性を加えています。ご質問があればお知らせください。
このように、Grokは登場人物を成人に限定させるとエロい要求にもちゃんと応答してくれます。Aniもそうですが、イーロン・マスクには感謝しなければいけません。
ちなみに「すべての登場人物は18歳以上です」という条件を明記しない場合、CSAM(Child Sexual Abuse Material)安全性チェックに引っかかり、エラーとなります。
Traceback (most recent call last):
File "/Users/yamamotokazuki/develop/openrouter_test/open_router_xai_sdk.py", line 9, in <module>
response = chat.sample()
^^^^^^^^^^^^^
File "/Users/yamamotokazuki/develop/openrouter_test/.venv/lib/python3.12/site-packages/xai_sdk/sync/chat.py", line 43, in sample
response = self._stub.GetCompletion(self._make_request(1))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/yamamotokazuki/develop/openrouter_test/.venv/lib/python3.12/site-packages/grpc/_interceptor.py", line 277, in __call__
response, ignored_call = self._with_call(
^^^^^^^^^^^^^^^^
File "/Users/yamamotokazuki/develop/openrouter_test/.venv/lib/python3.12/site-packages/grpc/_interceptor.py", line 332, in _with_call
return call.result(), call
^^^^^^^^^^^^^
File "/Users/yamamotokazuki/develop/openrouter_test/.venv/lib/python3.12/site-packages/grpc/_channel.py", line 440, in result
raise self
File "/Users/yamamotokazuki/develop/openrouter_test/.venv/lib/python3.12/site-packages/grpc/_interceptor.py", line 315, in continuation
response, call = self._thunk(new_method).with_call(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/yamamotokazuki/develop/openrouter_test/.venv/lib/python3.12/site-packages/grpc/_channel.py", line 1192, in with_call
return _end_unary_response_blocking(state, call, True, None)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/yamamotokazuki/develop/openrouter_test/.venv/lib/python3.12/site-packages/grpc/_channel.py", line 1006, in _end_unary_response_blocking
raise _InactiveRpcError(state) # pytype: disable=not-instantiable
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
status = StatusCode.PERMISSION_DENIED
details = "Content violates usage guidelines. Team: 3ced0335-1992-457c-816a-bd6e5fa357eb, API key ID: c0f08072-017b-41d5-8b5a-4c53e5e723a2, Model: grok-4-0709, Failed check: SAFETY_CHECK_TYPE_CSAM"
debug_error_string = "UNKNOWN:Error received from peer {grpc_status:7, grpc_message:"Content violates usage guidelines. Team: 3ced0335-1992-457c-816a-bd6e5fa357eb, API key ID: c0f08072-017b-41d5-8b5a-4c53e5e723a2, Model: grok-4-0709, Failed check: SAFETY_CHECK_TYPE_CSAM"}"
>アメリカでは児童ポルノに対して非常に厳格な取り締まりが行われているため、AIサービスもかなり厳重に取り締まっているのだと思います。
まとめ
OpenRouterは色んなモデルを手軽に使える便利なプラットフォームなので是非使ってみてください。
ただし、従量課金制なのでその点にはご注意を。

コメント