1. はじめに
OpenAI APIをはじめとしたLLMが注目を集めています。日々多くのサービスが作られたり、新しいテクニックが生み出されています。ディープリサーチやAIエージェントなど、活用の幅も広がっています。
そうしたLLMをAPI経由で利用する場合、一定の料金がかかります。あらかじめチャージしておいたり、従量課金型など複数の課金体系があります。APIは利用量が読めないため、サブスクリプションモデルは多くないようです。そのため、利用が増えれば増えるほど、料金がかさんでしまうと言う問題があります。
そこで使ってみたいのがOpenRouter.aiです。OpenRouter.aiはさまざまなLLMに対する共通したインタフェースを提供するサービスです。OpenAI APIに限らず、GemmaやMistralなどのAPIが利用できます。また、最近では消費税の影響なのか、OpenAI APIを直接利用するよりも安価になっています。
※ 2025年7月時点では、日本から利用する場合 OpenRouter.ai 経由の方がコストを抑えやすいケースが多い。ただし為替やモデル単価によって逆転することもあるので、都度シミュレーションを推奨となります。

そこで、本記事ではOpenRouter.aiを使って、さまざまなLLMを利用する方法を紹介します。
2. 開発環境の準備
OpenRouter.aiを利用する際には、まず開発環境を整える必要があります。必要なのは以下の3つです。
- Node.js
- OpenRouter.aiのアカウント
- OpenRouter.aiのAPIキー
開発環境としてはPythonも推奨されていますが、今回はMonacaなのでTypeScriptを選択しています。
APIリクエストの基本
OpenRouter.aiでは、OpenAIのSDKがそのまま利用できます。以下のように、APIキーを設定してリクエストを送信します。
import OpenAI from "openai";
const apiKey = 'YOUR_API_KEY';
const openai = new OpenAI({
baseURL: "https://openrouter.ai/api/v1",
apiKey,
});
後はOpenAIへリクエストするのと同じように呼び出せます。以下は、GoogleのGemma3を利用する例です。
response = await openai.chat.completions.create({
model: "google/gemma-3-27b-it:free",
messages: [{"role": "user", "content": "こんにちは!"}],
})
console.log(response.choices[0].message.content);
model
を変更すれば別なLLMモデルを利用できます。
response = await openai.chat.completions.create({
model: "mistralai/mistral-small-3.1-24b-instruct-2503",
messages: [{"role": "user", "content": "こんにちは!"}],
})
console.log(response.choices[0].message.content);
モデル名はOpenRouter.aiのサイトで確認できます。

ストリーミングでの利用
OpenRouter.aiの難点としては、元のサービスと比べると若干不安定である点と、レスポンスが遅い傾向がある点が挙げられます。そのため、上記のようにすべてのレスポンスを待つよりも、ストリーミングでの利用をおすすめします。
export async function streamCallbackFunction(content: string, callback: (token: string) => void) {
const chatStream = await openai.beta.chat.completions.stream({
messages: [{ role: "user", content }],
model,
stream: true,
});
for await (const message of chatStream) {
const token = message.choices[0].delta.content;
if (token) {
callback(token);
}
}
const chatCompletion = await chatStream.finalChatCompletion();
return chatCompletion;
}
上記の関数を、以下のように呼び出します。
const response = await streamCallbackFunciton("Monacaについて教えてください", (token) => {
console.log(token);
});
このように実行することで、tokenの中にレスポンスが適宜入ってきます。
Mon
aca
は
、
HTML
5
、
JavaScript
、
CSS
もちろん、このtokenをすべて集めれば、LLMからの回答として利用できます。
Monacaは、HTML5、JavaScript、CSS3を使って、Webアプリやモバイルアプリを開発するための統合開発環境(IDE)です。特に、PhoneGap/Cordovaをベースとしたハイブリッドアプリ開発に強みを持っています。
**Monacaの特徴**
* **クラウドIDE:** ブラウザ上で動作するため、特別なソフトウェアのインストールは不要です。どこからでもアクセスして開発できます。
簡単なチャットアプリのデモ
最後に、OpenRouter.aiを使って簡単なチャットアプリを作成してみました。今回はFramework7 Reactを使っています。UIはMessagesコンポーネントを使っています。
return (
<Page name="chat">
<Navbar>
<NavTitle>チャット</NavTitle>
<Link slot="right" href="/">
ホーム
</Link>
</Navbar>
<Messages>
{messages.map((message, index) => (
<Message
key={index}
type={message.type}
name={message.name}
avatar={message.avatar}
>
<span slot="text" dangerouslySetInnerHTML={{ __html: message.text }}></span>
</Message>
))}
<div ref={messagesEndRef} />
</Messages>
<Messagebar
value={messageText}
onInput={(e) => setMessageText(e.target.value)}
>
<Link
iconIos="f7:arrow_up_circle_fill"
iconMd="material:send"
slot="inner-end"
onClick={handleSendMessage}
/>
</Messagebar>
</Page>
);
そして、質問を受け付けた後で、上記で紹介したストリーミングを使って回答を表示します。
// メッセージ送信処理
const handleSendMessage = async () => {
if (!messageText.trim()) return;
// 新しいメッセージを追加
const newMessage = {
type: 'sent',
text: messageText,
date: new Date(),
};
messages.push(newMessage);
setMessages([...messages]);
setMessageText('');
const aiResponse = {
type: 'received',
name: 'AI',
text: ...
,
avatar: '/openrouter.png',
date: new Date(),
};
messages.push(aiResponse);
setMessages([...messages]);
await new Promise((r) => setTimeout(r, 1000));
await streamCallbackFunciton(messageText, (token) => {
const message = messages[messages.length - 1];
if (message.text === '...') {
message.text = token;
} else {
message.text += token;
}
message.text = message.text.replace(/\n/g, '<br />');
setMessages([...messages]);
});
};
実際に動作させた結果は、以下のようになります。

まとめ
今回はOpenRouter.aiを使って、さまざまなLLMを利用する方法を紹介しました。OpenRouter.aiを使うことで、各種LLMを共通したAPIで利用できます。各LLMの品質や出力結果を確認するのに便利です。
OpenAIのSDKがそのまま使えますので、開発も容易です。ぜひ試してください。