手元の環境に、チャットだけでなくエージェントタスクや MCP ツールまで含んだ AI ワークスペースを立てる手順です。本線の構成は 自分で運用する vLLM を LiteLLM の後ろに置く 形で、既定のローカルモデルは vLLM 経由の qwen3.8-27b(コンテキスト 262K)です。GPU がまだ用意できない場合の最短ルートとして Ollama も使えるので、その両方を書きます。
対象は OpenMake LLM(MIT)です。私が開発しているものなので、その前提で読んでください。以下の記述は README と公開している変更履歴に載っている内容だけで構成しています。
構成の考え方
アプリから見えるモデルの口は常に一つ、OpenAI 互換のエンドポイントです。その先に何を置くかで役割が変わります。
| 置くもの | 位置づけ | 使いどころ |
|---|---|---|
| vLLM + LiteLLM | 本線。既定のローカルモデルを供給する | 自分の GPU で常用する。埋め込みや画像モデルも同居させられる |
| Ollama | 外部プロバイダーの一つ。インストーラーの選択肢 1 でもある | GPU 機がまだない、まず動かしてみたい |
| OpenRouter / NVIDIA NIM など | 外部プロバイダー(自分の鍵を登録) | 特定の役割だけ大きいモデルに投げたい |
外部プロバイダーは自分の鍵を登録したときだけ経路に乗ります。鍵は AES-256-GCM で暗号化して保管されます。何も登録しなければ、モデル呼び出しはローカルで完結します。
動作確認環境
| 項目 | 値 |
|---|---|
| OS | Linux / macOS(Intel・Apple Silicon)。Windows は WSL2(Ubuntu) |
| Node.js | 24 |
| データベース | PostgreSQL、Redis(どちらも Docker コンテナ) |
| プロセス管理 | PM2 |
| 既定ポート | API 52416、Web 3000 |
| 推論 | vLLM + LiteLLM(本線)。筆者の環境は NVIDIA DGX Spark GB10、埋め込みは BGE-m3、画像生成は FLUX |
Node、Docker、PM2 はインストーラーが確認し、足りなければ可能な範囲で sudo なしに入れます。
1. インストール
リポジトリを clone しなくても構いません。リポジトリ外で実行されたことを検出すると、~/openmake_llm にソースを取得してそこで自分自身を実行し直します。
curl -fsSL https://raw.githubusercontent.com/openmake/openmake_llm/main/install.sh | bash
取得先を変えたい場合は OMK_HOME=...、ブランチやタグを指定したい場合は OMK_REF=... を使います。従来どおりの手順でも動きます。
git clone https://github.com/openmake/openmake_llm.git
cd openmake_llm
./install.sh
パイプ経由で実行しても /dev/tty から対話的に質問されます。CI のように端末がない環境では自動承認されます。
インストーラーがやることは次のとおりです。ツールチェーンの確認、ランダムなシークレット付きの .env 生成、依存関係のインストール、PostgreSQL と Redis の起動、マイグレーション適用、両アプリのビルド、PM2 での起動、/health の待ち受け。最後に Web の URL と生成された管理者パスワードを表示します。
2. 本線: vLLM + LiteLLM を指す
GPU 機で vLLM を立て、その前段に LiteLLM を置きます。アプリ側から見えるのは LiteLLM のエンドポイント一つです。筆者の環境では Mac mini がアプリを、DGX Spark が推論だけを担当し、2台を Tailscale でつないでいます。
./install.sh --yes \
--llm-base-url http://<litellm-host>:4000/v1 \
--llm-api-key <litellm-key> \
--llm-model <served-model-name>
vLLM を使うときの注意点を三つ挙げます。いずれも公開している変更履歴に載っている実際の修正です。
-
画像枚数の上限(1.40.0)。 リクエストあたりのプロンプト画像枚数を、vLLM 側の
--limit-mm-per-promptの上限である 8 に合わせました。片側にだけ書かれた上限は、超過時にスタックの奥で分かりにくいエラーになります。 -
モデル名の固定(1.38.0)。 DGX 側でモデルを差し替えた際、モデル一覧の出どころが静的なカタログ 1 行しかなかったため、アプリが古い名前に張り付いたままになりました。現在は起動時と定期プローブで LiteLLM の
/model/infoを読み、静的な一覧はフォールバックとしてのみ残しています。 -
コンテキスト溢れ。 262K でも溢れます。入口でトークン数を見積もり(画像も含む)、入力を切り詰め、次に
max_tokensを下げ、それでも収まらなければ監査記録と自動アラート付きで HTTP 413 を返します。溢れを隠さずに扱う設計です。
外部モデルを並列に使う場合の実測も残しています。ディスカッションとディープリサーチを外部モデルで走らせたところ、5 並列の呼び出しが B.AI 無料キーで 5/5、hasa キーで 3/5 が 429 になりました(1.40.0)。現在はプロバイダー単位のセマフォと Retry-After を尊重する指数バックオフが入っています。
3. 最短ルート: Ollama を指す
GPU 機がまだない場合や、とりあえず動かしてみたい場合はこちらです。インストーラーの選択肢 1 がこれで、Ollama は OpenAI 互換のエンドポイントを持つのでベース URL を向けるだけです。API キーは不要なので任意の文字列で構いません。
ollama serve
ollama pull qwen3:8b
./install.sh --yes \
--llm-base-url http://127.0.0.1:11434/v1 \
--llm-api-key ollama \
--llm-model qwen3:8b
Ollama は位置づけとしては外部プロバイダーの一つです。後から vLLM に本線を移しても、アプリ側は .env のエンドポイントを差し替えるだけで済みます。
外部プロバイダーを最初から指定する場合はこの形です。
./install.sh --yes \
--llm-base-url https://openrouter.ai/api/v1 \
--llm-api-key sk-or-... \
--llm-model qwen/qwen3-235b-a22b
4. ポートがぶつかるとき
すでに 5432 や 6379 を使っている場合は、コンテナ側をずらします。指定した値は .env に入り、サービス管理スクリプトもそれを読み直します。
./install.sh --yes --postgres-port 55432 --redis-port 56379
5. 再実行と部分実行
./install.sh の再実行は安全です。上書きではなく修復として動きます。よく使うフラグを挙げます。
-
--skip-docker: PostgreSQL と Redis を自分で管理している場合 -
--skip-build: ビルドを飛ばす -
--no-start: 起動しない -
--force-env:.envを作り直す
一覧は ./install.sh --help にあります。
6. macOS の場合
Docker Desktop、OrbStack、Colima のいずれでも動きます。GUI が要らなければ Colima が軽いです。
brew install colima docker docker-compose
colima start
Homebrew の compose プラグインが docker CLI に登録されていない場合は、インストーラーが ~/.docker/config.json に cliPluginsExtraDirs を追記します。
7. 起動後の確認
サービス管理は openmake_llm.sh に集約されています。
./openmake_llm.sh status
./openmake_llm.sh health
./openmake_llm.sh logs
Web UI を開くと、UI 表示言語は Accept-Language から自動判定されます。日本語は最初から入っていて、設定から明示的に切り替えることもできます。回答の言語は質問した言語に独立して追従します。
立てたあとに使えるもの
チャット以外に次のものが動きます。手順とは直接関係ありませんが、何のために立てるのかがはっきりするので挙げておきます。
- エージェントタスク。永続的な Docker サンドボックス(シェル・Python・ブラウザ・ファイル)で複数ターン実行し、危険な手順は人の承認を待ちます。実行ごとにターン数、経過時間、トークンコストが出ます。目標を達成できなかった場合は完了扱いにせず
[GOAL_INCOMPLETE]マーカーと目標判定を返します。 - ディープリサーチ。分解、取得、検証、引用付きの統合まで行います。
- MCP ツール。内蔵 22 個に加えて外部 MCP サーバーを追加でき、それぞれ別コンテナで
--cap-drop ALL、非 root、メモリ上限、ネットワークポリシー付きで動きます。 - ロール別のモデル振り分け。
agent、judge、research、spawn、review、summaryに別々のモデルを割り当てられます。失敗時はローカル既定にフォールバックします。
制約
- デスクトップアプリは現時点で macOS / Apple Silicon のみです。Web UI はどこでも動きます。
- Kubernetes 向けの構成は用意していません。単一ホスト前提の設計です。
- ホスト版デモのゲストは既定のローカルモデルのみ利用できます。
- 構築にかかる時間は、ほぼモデルのエンドポイントを用意する時間です。
参照
- ソース(MIT): https://github.com/openmake/openmake_llm
- セルフホストガイド(日本語): https://openmake.cc/ja/docs/
- ライブデモ: https://chat.openmake.cc
手順で詰まった箇所があればコメントで教えてください。ドキュメント側を直します。
