Skip to main content

ローカル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

local_llm_server-0.2.0.tar.gz (35.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

local_llm_server-0.2.0-py3-none-any.whl (30.5 kB view details)

Uploaded Python 3

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

Hashes for local_llm_server-0.2.0.tar.gz
Algorithm Hash digest
SHA256 fe972ab6cdbaa9168911f8b3e412add18b2777fc4f66488fc076abc136a3a011
MD5 0036364fe057bc0f8e28e61a5cdae79c
BLAKE2b-256 e11bcc978e42a444beabe6069f43124c4e85ced25891dc2ebfdd592001a56fe7

See more details on using hashes here.

File details

Details for the file local_llm_server-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for local_llm_server-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0d6c77961d8abedbae23856c08bea65e30aa20064aa4ccd10f480958040ad0ea
MD5 be872cb58fb9e680860cfddefed0b068
BLAKE2b-256 ea69bcd820d5749f5abc3b579b06cb2f2316a616a08cb690e4bb0b9fe5c9032a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page