ローカルLLM(mlx / mlx-vlm / llama.cpp / router)を OpenAI 互換 API として起動・管理する拡張サーバーライブラリ(相乗り/自動起動・MTP・高レベルクライアント付き)
Project description
local-llm-server
ローカルLLM(mlx / mlx-vlm / llama.cpp)を OpenAI 互換 API として 立てるサーバー。Ollama と同じイメージで、サーバーを 1 つ起動して、あとは OpenAI 互換 API を叩くだけ。テキスト/画像を自動で振り分ける router、本体の出力を変えず高速化する MTP(投機的デコード)を備える。
- 既定モデル
Qwen3.6-27B-4bitはマルチモーダル。mac (Apple Silicon) では何もせず 画像入力までそのまま動く(既定バックエンドmlx-vlm)。 - コア(サーバー起動・router・MTP 解決)は標準ライブラリのみで動作。
インストール(uv)
uv add "local-llm-server[mlx]"
extras 指定はクォート必須(zsh の glob 展開回避)。内訳:
| extra | 入るもの | 用途 |
|---|---|---|
| (無し) | コアのみ(標準ライブラリ) | 起動・router・MTP 解決だけ使う |
mlx |
mlx-lm / mlx-vlm |
Apple Silicon で実際に推論する |
client |
openai |
後述の「Python から自動起動」を使う場合 |
使い方
1. サーバーを起動する
別ターミナルで起動しておく(初回はモデルを自動ダウンロード)。
uv run local-llm-server # 既定(mac: mlx-vlm + 既定モデル)
uv run local-llm-server --backend mlx # テキスト専用で軽く(画像不可)
uv run local-llm-server --draft-model auto # MTP で高速化(~2倍速)
uv run local-llm-server --backend router # テキストLLMとVLMを同時起動し自動振り分け
uv run local-llm-server --backend llama-cpp --model /path/to/model.gguf
--backend省略時は OS 自動判定(mac arm64 →mlx-vlm、他 →llama-cpp)。--host/--port(既定127.0.0.1:8080)。--以降はバックエンド固有引数。- 並列: llama.cpp は
--parallel N、mlx 系は--instances N(連番ポート)。
2. 接続する(OpenAI 互換 API)
起動後、http://127.0.0.1:8080/v1 に任意の OpenAI 互換クライアントを向けるだけ
(api_key はローカルなので任意)。
curl:
curl -s http://127.0.0.1:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "mlx-community/Qwen3.6-27B-4bit",
"messages": [{"role": "user", "content": "俳句を一つ詠んでください。"}]
}' | python3 -c "import sys, json; print(json.load(sys.stdin)['choices'][0]['message']['content'])"
Python(標準の openai クライアント):
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:8080/v1", api_key="not-needed")
resp = client.chat.completions.create(
model="mlx-community/Qwen3.6-27B-4bit",
messages=[{"role": "user", "content": "ローカルLLMの利点を3つ。"}],
)
print(resp.choices[0].message.content)
ストリーミングは stream=True、画像は OpenAI と同じ image_url content パートで渡す。
3. 停止する
起動した端末で Ctrl+C。別端末からは --stop(起動時と同じ --port / --instances
/ --backend router を指定):
uv run local-llm-server --stop
kill $(lsof -ti tcp:8080) でも止まる。子プロセス(バックエンド・MTP ドラフター)も
一緒に停止する。
(任意)Python から自動起動する
「サーバーが無ければ自分で起動し、終了時に止める」を 1 呼び出しで済ませたいとき。
上記の手順 1〜3 を内包する利便機能で、要 [client](uv add "local-llm-server[mlx,client]")。
from local_llm_server import connect
# 既存サーバーがあれば相乗り、無ければ MTP 付きで自動起動 → 繋がった client を返す
llm = connect(model="mlx-community/Qwen3.6-27B-4bit", draft_model="auto")
print(llm.respond("こんにちは"))
llm.stop() # 自動起動した場合のみ停止(相乗りなら無害)
サーバーの用意だけ行う ensure_server()、サーバー制御の LocalServer / ServerConfig /
ServerPool も公開している(→ examples/)。
MTP(投機的デコード)
本体モデルの出力を変えずに ~2倍速にする高速化(Qwen3.6-27B で実測 38→75 tok/s、採択率
93%)。起動時に --draft-model auto(または connect(draft_model="auto"))を渡すと、本体名
から対応ドラフターを自動選択する(mlx-vlm 限定。対応表 MTP_DRAFTERS / 解決 resolve_drafter)。
examples
実機で動く完全なサンプル(Apple Silicon)。uv run するだけで動く:
uv run examples/connect_and_generate.py # 自動起動 + 生成(最短)
uv run examples/generate_with_mtp.py # LocalServer + openai で MTP 生成 + tok/s 表示
詳細は examples/README.md。
ライセンス
Apache-2.0
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file local_llm_server-0.2.0.tar.gz.
File metadata
- Download URL: local_llm_server-0.2.0.tar.gz
- Upload date:
- Size: 35.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fe972ab6cdbaa9168911f8b3e412add18b2777fc4f66488fc076abc136a3a011
|
|
| MD5 |
0036364fe057bc0f8e28e61a5cdae79c
|
|
| BLAKE2b-256 |
e11bcc978e42a444beabe6069f43124c4e85ced25891dc2ebfdd592001a56fe7
|
File details
Details for the file local_llm_server-0.2.0-py3-none-any.whl.
File metadata
- Download URL: local_llm_server-0.2.0-py3-none-any.whl
- Upload date:
- Size: 30.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0d6c77961d8abedbae23856c08bea65e30aa20064aa4ccd10f480958040ad0ea
|
|
| MD5 |
be872cb58fb9e680860cfddefed0b068
|
|
| BLAKE2b-256 |
ea69bcd820d5749f5abc3b579b06cb2f2316a616a08cb690e4bb0b9fe5c9032a
|