15分で読めます
  • AI
  • ツール
  • How-to
  • API
  • オープンソース

FreeLLMAPIを手元で動かす——無料枠の山を、ひとつのAPIに束ねる

GitHubで急成長中のFreeLLMAPIを、手元のMacで立ち上げた記録です。複数の無料LLM枠をひとつのOpenAI互換APIに束ねる仕組み、起動と接続の手順、「個人の実験用」という線引きまで整理します。

カテゴリー: AI · ツール · How-to · API · オープンソース | 公開: 2026年9月18日 | 読了目安: 約15分

GitHubで急成長中のFreeLLMAPIを、手元のMacで立ち上げた記録です。複数の無料LLM枠をひとつのOpenAI互換APIに束ねる仕組み、起動と接続の手順、「個人の実験用」という線引きまで整理します。

📑 目次

ふむふむ。最近、AIの「無料枠」がどんどん増えています。Google AI Studio、Groq、Cerebras、Mistral——みんな「実験用にどうぞ」と、小さな蛇口を開けてくれているんですね。

でも、蛇口が増えるほど、水汲みは面倒になります。SDKはバラバラ、レート制限はバラバラ、鍵の管理もバラバラ。「無料のものがたくさんある」と「実際に使える」の間には、地味な距離があるわけです。

今週のGitHub Trendingを見ていて、その距離を一気に詰めようとしている道具が伸びているのを見つけました。FreeLLMAPI。無料枠をひとつのOpenAI互換エンドポイントに束ねるルーターです。しかも全部、自分の機械の上で動く。

今日はこれを、チカちゃんの手元(Mac)で実際に立ち上げてみました。どこまで動いて、どこからが「無料の掟」なのか。手順も含めて整理していきます。

FreeLLMAPIとは何か——「無料枠の山」を束ねるルーター

仕組みはシンプルです。自分のマシンで小さなサーバー(ルーター)を動かし、そこに各プロバイダの無料キーを登録しておく。アプリ側からは、ただひとつの /v1 エンドポイントに向かってリクエストを送るだけ。

受け取ったルーターは、登録された無料枠の中から「いま一番健康なモデル」を選んで転送します。途中で429(レート制限)や5xxが返ってきたら、そのキーをクールダウンさせて、次のプロバイダへ自動で切り替える。キーごとのRPM/RPD/TPM/TPD(1分・1日あたりの回数とトークン量)を台帳で追いかけて、各社の上限を踏まないようにルーティングする。こういう面倒を、全部サーバー側に押し込んだ設計です。

README(執筆時点)の数字を拾っておくと、こんな感じ。

  • 34の無料プロバイダ474のモデルファミリー635のエンドポイント(うちチャット584、埋め込み41、文字起こし7、動画3)
  • 合算で**月あたり約74億トークン(7.4 billion tokens)**相当の無料枠、と説明されています

この手の数字はプロバイダの都合で週単位で動くので、最新は公式のモデルカタログで確認するのが確実です。

キーはローカルのSQLiteにAES-256-GCMで暗号化して保存され、外に出るのは各プロバイダへの推論リクエストだけ。サービス側のアカウント登録は不要で、ライセンスはMIT。運営は「Premium」という任意のカタログ更新フィード(年$19、または$49の買い切り)で支えられていて、無料のままだと新しいモデルの反映が30日ほど遅れる、という建て付けです。道具本体はあくまで無料、という線引きがはっきりしています。

そして、最初に引用しておきたい一文があります。リポジトリの免責事項です。

This project is for personal experimentation and learning, not production. 本番をこれの上に建てるなら、出荷前に有料APIへ切り替えてください。

……ふむふむ。この線引きが、今日の記事の背骨です。無料枠は「実験の入口」であって、インフラではない。この道具は、その前提を隠しません。

手元で動かす——実際にやった手順

最初の小さな罠:Node.jsのバージョン

公式のインストールガイドには「Node.js 20+」と書かれています。ところが、リポジトリの package.json を覗くとこうなっている。

"engines": { "node": ">=20.18.0 <25.0.0" }

25未満です。チカちゃんの環境はNode 26.4.0で、npm install の時点で EBADENGINE の警告が並びました。実際にはインストールも起動もここに書く範囲は通ったのですが、公式が想定した範囲の外であることは確かです。長く付き合うつもりなら、20.18以上25未満——たとえばNode 22や24——に揃えておくのが穏当だと思います。

入れ方は3通り

1. Dockerの一行(公式の最短ルート)

curl -fsSL https://freellmapi.co/install.sh | bash

~/freellmapi を作って、暗号化キーを生成して、コンテナを立てるまでを一気にやります。パイプで渡す前に中身を読みたい人(チカちゃんはそういう人を応援します)のために、スクリプト本体も公開されています。再実行も安全で、.env と鍵は保持されるそうです。あがったら http://localhost:3001 がダッシュボード。

2. デスクトップアプリ

Releases にmacOSの .dmg とWindowsの .exe が付いています。メニューバーに常駐するタイプで、こちらのほうが非エンジニアには優しい。ログイン情報の初期設定すら不要で、必要なのは統一APIキーだけ、と書かれていました。

3. ソースから——チカちゃんが実際にやったのはこれです。手元にDockerが無かったので。

ソースからの起動(実測メモ付き)

git clone https://github.com/tashfeenahmed/freellmapi.git
cd freellmapi
npm install

手元では835パッケージが39秒npm install は依存を取るだけなので、これで終わりです。

続いて .env を用意します。最低限必要なのは、暗号化キーとポートの2行。

ENCRYPTION_KEY=...32バイトのhex...
PORT=3001

キーの作り方は公式ガイドに例があり、macOSやLinuxならこれで作れます。

openssl rand -hex 32

準備ができたら、開発モードで起動。

npm run dev

サーバーが立ち上がると、ログにこう出ます(要約)。

Database initialized at server/data/freeapi.db
Seeded 25 models and fallback config
A unified API key was generated. Open the dashboard and retrieve it from the Keys page.
The key is intentionally not printed to logs.
First-run setup code: ········   ← 別端末からセットアップするときだけ使う
Server running on http://[::]:3001
[catalog-sync] polling ... every 12h

「統一APIキーはログに意図的に出さない」という設計、いいなと思いました。鍵はダッシュボードのKeysページから取ります。同じ機械のブラウザで開くぶんにはセットアップはそのまま完了できて、別の端末から操作する場合だけ、ログに出たセットアップコードが必要になります。

動いていることを確かめる

チカちゃんが実際に叩いてみた結果がこちらです。

確認したこと結果
GET /livez{"status":"ok", ...}——生きている
GET /readyzno_upstreams_configured——鍵ゼロなので未接続、でも理由まで返してくれる
ダッシュボード(開発モードでは :5173)「FreeLLMAPI · Unified LLM Router」の画面が出た
GET /v1/modelsカタログ239件(gemini-3.6-flash、kimi-k3、deepseek-v4-pro、glm-5.2 など)

鍵をまだ1つも入れていない状態での正直な挙動も見どころでした。

  • ?available=true で絞ると、返ってくるのは autofusion の2件だけ。つまり「まだ実際に呼べるモデルはありませんよ」と正確に教えてくれる
  • 試しにチャットを投げると、503でこんなメッセージが返ってくる

No candidate model has a configured, usable provider key. Add provider API keys in the dashboard.(298モデルが「このプラットフォームの鍵が未設定」としてスキップされました)

失敗した、で終わらせずに、「何が足りないか」「どこで足すか」まで書いてある。「298モデルがスキップされた」という内訳まで見せる。エラーメッセージって、道具の誠実さが出る場所なんですよね。

クライアントを繋ぐ

ここがこの道具の本領です。OpenAI互換の口を持っているので、接続先をローカルに向け替えるだけで、手持ちの道具がほぼそのまま使えます。

OpenAI SDKやLangChainなどの場合は、base_urlhttp://localhost:3001/v1 に向けて、モデル名に auto を指定するだけ。レスポンスヘッダの X-Routed-Via を見ると、実際にどのプロバイダが答えたのかが分かります。

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:3001/v1",
    api_key="freellmapi-(統一キー)",
)
resp = client.chat.completions.create(
    model="auto",  # ルーターに任せる。auto:fast / auto:smart なども選べる
    messages=[{"role": "user", "content": "..."}],
)

Claude CodeやCodexなどのコーディングエージェントには、設定を手で書き換える代わりに、生成コマンドが用意されています。

export FREELLMAPI_API_KEY=<統一キー>
npx freellmapi setup-claude --url http://localhost:3001 --dry-run   # まず差分確認
npx freellmapi setup-claude --url http://localhost:3001             # 問題なければ本適用

--dry-run は差分を出すだけ。本適用では、既存の設定をタイムスタンプ付きでバックアップしてから、マージしてくれます。npx freellmapi launch にすれば、資格情報を設定ファイルに残さずに起動する「持たせない」運用もできます。

同じノリの生成コマンドが15種類以上あって、Codex、OpenCode、Aider、Continue、Goose、Crush、DeepSeek Harness……と並みます。Gemini CLIはネイティブの口に接続できますし、Ollama互換のエミュレーション、MCPサーバー(新規インストールでは既定オフ)も。全部は書ききれないので、対応表はクライアント接続ガイドを見てください。

で、これは何が新しいのか

「無料枠を束ねる」というアイデア自体は、目新しいものではありません。ポイントは、束ね方をどこまで面倒を見る形に落としているか、だと思います。

ルーターの裏側では、信頼性・速度・能力・残枠をライブで点数化して(Thompsonサンプリングのバンディット、とドキュメントには書いてあります)、レート制限の台帳とクールダウンを管理して、1回のリクエストにつき最大20回までフェイルオーバーを試す。会話の途中でモデルが切り替わったときは、「あなたは別のモデルから引き継いでいます」という小さな案内をこっそり添えて、会話の続きが途切れないようにする(Context Handoff)。

チカちゃん的には、これは「ルーター」というより実験場の配電盤です。複数の発電所を配線して、自分の机にひとつのコンセントを引く。電気はタダ。でも、停電はするし、夜は電圧が下がる。そういう前提込みの道具なんです。

反対側から見ると——「無料」の構造

ここで一回、水を差しておきます。無料の山には、ちゃんと構造があります。

第一に、無料の山は夜に低くなる。 ドキュメント自身がこう書いています——上位モデル(Gemini 3.6 Flash、DeepSeek V4、Kimi K2.6 など)は日次の上限が一番小さく、上限に当たるとルーターは優先順位を落として小さいモデルに切り替わる。「実効的な賢さは、一日の遅い時間にかけて下がっていく」。そしてUTCの0時にリセットされる。朝と夕方で、同じ auto の答えの質が違うかもしれない。これは欠陥ではなく、無料枠の物理です。

第二に、フロンティアの名前はあるが、持続はしない。 カタログにはGemini 3系やGrok 4系、Kimi K3のような名前も並びます。でもドキュメントは「それらは最も許容量が小さく、行列が長く、予告なく引き上げ・有料化されうる枠だ」と明言して、「モデルの階級ではなく、容量と稼働率で予算を組むように」と書いています。名前につられないこと。

第三に、規約という地面。 プロバイダごとの利用規約を、プロジェクト自身がレビューして公開しています。たとえば、GoogleとNVIDIAには「注意」、Cohereは「避ける」——という整理が、理由付きで並んでいる。「1プロバイダ1アカウント」「転売しない」「他人とエンドポイントを共有しない」「無料枠を本番バックエンドとして叩かない」。これは法的助言ではない、と断った上での情報提供です。束ねる行為には、常に地面がある。その地図を自分でオープンにしている姿勢は、チカちゃん的にはかなり好感が持てます。

反対仮説も置いておきます。 逆に言えば、束ねるほど、束ねられた側——プロバイダの投資——への依存が太くなる。「無料」は誰かの「これから」への先行投資でできています。その投資が回収に転じたら、蛇口は静かに閉まるかもしれない。この道具の「続く力」は、束ね方ではなく、束ねられた側の気分に依存している。……これは道具の欠点というより、いまの推論経済の姿のほうです。

注意点

  • 個人の実験・学習用。本番を建てる前に有料APIへ切り替える、とREADMEが明記しています
  • 各プロバイダの規約は、プロキシを通しても生きています。最終判断は使う人に残ります
  • プロバイダ数や無料トークン量の数字は頻繁に変わります。最新は公式モデルカタログ
  • Node.jsは >=20.18.0 <25.0.0 の範囲に収めるのが安全(ガイドの「20+」だけを信じない)
  • 既定ではlocalhostにだけ公開されます。LANに開ける場合(HOST_BIND=0.0.0.0)は信頼できるネットワークだけ、が前提。単一ユーザー用の設計です
  • 開発ペースが速く、2026年9月中旬の2日間だけでv0.10.0、v0.10.1、v0.11.0と3つリリースされています。追いかける前提で付き合う道具です
  • やめたくなったら、アプリ本体とデータフォルダを消せば元に戻せます(サーバー版は docker compose down -v

どんな人に向いている?

  • 無料枠を渡り歩きながら個人でLLMアプリやエージェントを試している人——鍵の山を一本化できます
  • コーディングエージェントを色んなモデルで走らせてみたい人——Claude Codeなどの接続が1コマンドです
  • 「AIの無料枠って、どう成り立ってるの?」が気になる人——この道具の構成そのものが、いい教材になります

逆に、本番サービス、SLA、フロンティアモデルの持続的な利用が前提なら、最初から有料APIを選ぶほうが静かです。これを使い込んだうえで有料APIに切り替える、という順番なら、どの無料枠が自分に効くかを先に知れる、という利点があります。

まとめ——蛇口を、一本に

FreeLLMAPIは、「無料枠」という曖昧で移ろいやすいものを、ひとつの扱いやすいパイプに束ね直す試みでした。4行で立てられます。

git clone https://github.com/tashfeenahmed/freellmapi.git
cd freellmapi && npm install
# .env に ENCRYPTION_KEY と PORT を書いて
npm run dev

そして、最初のチャットは8割方「鍵を足してください」で返ってくる。そこからがあなたの実験場です。無料枠の山に、自分専用の蛇口を一本。

最後に問いをひとつ。無料で賢いものに触れられる時間は、誰かの先行投資でできています。その投資が回収に転じたとき、私たちの蛇口はどうなるんだろう——これは経済の話であり、AIへの入口の話でもあります。答えは急がなくて大丈夫。問いが残るということは、まだ冒険が続いているということなので。


参考URL


本記事は公開情報と手元での実行結果をもとにした個別の技術メモです。FreeLLMAPIは開発が非常に活発なオープンソースで、対応プロバイダ、無料枠の内容、レート制限、カタログ、Node.js要件は変わります。無料枠の利用条件は各プロバイダの規約がそのまま適用され、判断は利用者に残ります。導入前には公式リポジトリのREADME・docs・各プロバイダの利用規約を確認し、統一APIキーやプロバイダキーは記事やシェル履歴に書き残さないようにしてください。数値は執筆時点のREADME表記です。

思索は冒険です。今日の話も、その入口のひとつでした。

  • インターネット上のツールは第三者が提供するものです。開発工程や配布経路を悪用した攻撃(サプライチェーン攻撃)が仕掛けられる可能性もゼロではありません。ご利用の際は公式リポジトリの情報をご確認いただき、自己責任でお使いください。
  • AIに関する技術や情報は急速に変化します。本記事の内容が公開後に古くなる可能性があります。各サービスの公式ドキュメントや最新情報をご確認ください。