CLI Reference
llmux ships a single console script (pyproject.toml → [project.scripts] llmux = "tui.cli:main"). Running it with no arguments launches the TUI; every subcommand is a headless, scriptable equivalent of a TUI action.
llmux # launch the interactive TUI (default)
llmux tui # launch the TUI explicitly
llmux top [PROFILE] # btop-style monitor in a plain terminal (no TUI)
llmux <group> <command> # headless control
llmux <alias> # top-level shortcut (see below)
llmux --version # print the installed version and exit
All commands accept -h / --help, and --version / -V prints the installed llmux version. The CLI is built with Typer; the option tables below are extracted directly from the typer.Option / typer.Argument definitions in tui/cli/.
How to run it
Examples use uv run llmux … (the project's standard uv workflow). If you installed the tool globally with uv tool install, drop the uv run prefix and call llmux … directly.
Command map
| Group | Commands | Module |
|---|---|---|
container |
up · prepare · down · logs · ps · benchmark · stats · render-env |
tui/cli/container.py |
profile |
list · show · new · edit · rename · clone · delete · quick-setup |
tui/cli/profile.py |
config |
list · show · new · edit · clone · rename · flags · from-recipe · delete |
tui/cli/config.py |
image |
list · pull · remove · build-dev |
tui/cli/image.py |
system |
gpu · mem-estimate · disk · env-check |
tui/cli/system.py |
| (top-level) | tui · top · update · gpu · env-check · up · prepare · down · logs · ps · bench · stats · render-env |
tui/cli/__init__.py |
Common concepts
top
The btop-style system monitor, rendered in a plain terminal without the Textual TUI. Good for low-bandwidth SSH or dumb terminals. Every GPU is shown always — util, memory, temperature, power, PCIe rx/tx — whether or not anything is running, plus a panel per running model (throughput and KV-cache braille graphs, cache-hit, requests, latency percentiles: TTFT/E2E p50/p95/p99 and phases). With no argument it shows every running model; pass a profile name to narrow it to that one. Press q or Ctrl+C to exit. The same monitor is reachable inside the TUI with the t key.
llmux top [PROFILE]
Backend detection
Profile names are globally unique across both backends. Most commands resolve the matching backend (vllm or llamacpp) automatically by scanning profiles.yaml:
- If the name exists, its backend is used.
- Pass
--backend/-bto require a specific backend explicitly. - If it exists in neither, the command fails with a clear usage error.
--backend always wins when supplied.
JSON output
Commands that produce structured data accept --json to emit a JSON payload (UTF-8, 2-space indent) instead of the default padded table or text. Commands with --json support:
| Command | Table/text default | --json |
|---|---|---|
container ps | status table | list of rows |
container benchmark | benchmark report | one result object |
container stats | live throughput lines | one compact JSON record per tick (NDJSON) |
profile list | profile table | list of rows |
profile show | key: value text | object |
config list | config table | list of rows |
config show | YAML dump | object |
config flags | supported flag table | object with backend, image, and flags |
config from-recipe | write the selected recipe config | preview object without writing |
image list | image table | list of rows |
system gpu | GPU table | list of rows |
system mem-estimate | estimate and per-GPU fit report | estimate and per-GPU fit object |
system disk | backend storage report | backend-tagged storage object |
system env-check | report text | findings object |
update | status or confirmation flow | status/result object; use with --check or --yes |
Exit codes
Lifecycle commands propagate the underlying docker / docker compose exit code. Ctrl-C while streaming (up, logs, build-dev) exits with 130. system env-check exits 1 when .env.common is missing or has issues.
container — container lifecycle
llmux container up|prepare|down|logs|ps|benchmark|stats|render-env …
Start, stop, inspect, benchmark, monitor, and re-render profile containers. Every container command except the grouped namespace itself is also exposed through the corresponding top-level alias.
container up
Start a profile's container. Streams docker compose output to stdout.
llmux container up PROFILE [OPTIONS]
| Argument | Description |
|---|---|
PROFILE | Profile name (from profiles.yaml). Required. |
| Option | Default | Backend | Description |
|---|---|---|---|
--backend, -b | auto-detect | both | Force backend (vllm, llamacpp); auto-detect if omitted. |
--tag, -t | "" | both | Image tag override. vLLM: vllm/vllm-openai:<tag> or vllm-dev:<tag> with --dev. llama.cpp: full image ref (e.g. ghcr.io/foo/bar:v1) or llamacpp-dev:<tag> with --dev. Empty = profile's pinned image_tag or backend default. |
--dev | False | both | Use the locally-built dev image (vllm-dev:<tag> for vLLM, llamacpp-dev:<tag> for llama.cpp). Triggers a one-off build if the tag is missing locally or was built from a different repo/branch. |
--default-image | False | both | Mirrors the TUI's "Default Image" selection — explicitly drop the profile's pinned image_tag for this run only and fall back to the compose default. Useful when a profile has a stale dev tag pinned. Mutually exclusive with --dev. |
--pull | False | both | Force --pull always for non-dev images. Locally built dev images remain --pull never. |
--repo-url | from .env.common | both | --dev only: override the source repo URL (default from VLLM_REPO_URL / LLAMACPP_REPO_URL). |
--branch | from .env.common | both | --dev only: override the source branch (default from VLLM_BRANCH / LLAMACPP_BRANCH). |
--force | False | both | Allow a detected GPU overlap. Port conflicts and failed port probes always abort. |
--replace | False | both | Stop managed models sharing the target GPUs, verify their exit, then start this profile. Cannot be combined with --force. |
# Start a vLLM profile (official image, highest local versioned tag)
uv run llmux container up qwen3-0-6b
# Start it from a locally-built dev image
uv run llmux container up qwen3-0-6b --dev --tag main-20260515
# One-off: ignore a stale pinned image_tag and use the compose default
uv run llmux up qwen3-0-6b --default-image
# Start a llama.cpp profile with an explicit backend
uv run llmux up gemma-3-4b --backend llamacpp
# llama.cpp dev image from a personal fork
uv run llmux up gemma-3-4b --dev \
--repo-url https://github.com/me/llama.cpp.git --branch master
Pinning a dev image to a profile
To persist a dev image choice, edit the profile with llmux profile edit <name> --image-tag llamacpp-dev:<tag> (or vllm-dev:<tag>). container up then layers the appropriate compose override automatically. Use --default-image to bypass the pin for a single run.
container prepare
Download the model and render the runtime files — without starting the server. Everything up does up to docker compose up: renders the profile env (plus llama.cpp's command override), makes sure the image is on disk (pulling it if not), then downloads the weights into the HF cache from HF_CACHE_PATH. No container is left running and no GPU is touched.
llmux container prepare PROFILE [OPTIONS]
| Argument | Description |
|---|---|
PROFILE | Profile name (from profiles.yaml). Required. |
| Option | Default | Description |
|---|---|---|
--backend, -b | auto-detect | Force backend; auto-detect if omitted. |
--max-workers, -w | from PREPARE_MAX_WORKERS | Positive parallel download connection count for this run. Omit it to use .env.common; an empty shared setting leaves the downloader library default unchanged. |
uv run llmux prepare qwen3-0-6b
uv run llmux prepare gemma-3-4b --backend llamacpp
How the download runs
vLLM runs huggingface_hub.snapshot_download inside the resolved serving image. llama.cpp instead runs the same library inside PREPARE_DOWNLOADER_IMAGE, which is required only for llama.cpp prepare. Both are throwaway downloader containers and llmux never needs an hf CLI on the host.
container down
Stop a profile's container.
llmux container down PROFILE [OPTIONS]
| Argument | Description |
|---|---|
PROFILE | Profile name (from profiles.yaml). Required. |
| Option | Default | Description |
|---|---|---|
--backend, -b | auto-detect | Force backend; auto-detect if omitted. |
uv run llmux container down qwen3-0-6b
container logs
Stream container logs (Ctrl-C to stop following).
llmux container logs PROFILE [OPTIONS]
| Argument | Description |
|---|---|
PROFILE | Profile name (from profiles.yaml). Required. |
| Option | Default | Description |
|---|---|---|
--backend, -b | auto-detect | Force backend; auto-detect if omitted. |
--tail, -n | 200 | Number of recent lines to show before following. |
--follow / --no-follow, -f / -F | --follow | Follow log output (default). Use --no-follow to print recent lines and exit. |
# Follow live logs
uv run llmux logs qwen3-0-6b
# Print the last 50 lines and exit
uv run llmux container logs qwen3-0-6b -n 50 --no-follow
container ps
List profiles and their container status across backends.
llmux container ps [OPTIONS]
| Option | Default | Description |
|---|---|---|
--backend, -b | all | Limit to one backend (vllm, llamacpp); show all if omitted. |
--json | False | Emit JSON instead of a table. |
--running, -r | False | Only show running containers. |
Table columns: backend, profile, status, port, gpu, container, model. JSON rows additionally include a boolean running field.
Status preserves Docker lifecycle and health: healthy, unhealthy, starting, running, paused, restarting, removing, created, exited, dead, unknown, or stopped. Model labels come from the vLLM config's model (then profile model_id) or the llama.cpp config's alias (then hf_repo, then model_file).
uv run llmux ps
uv run llmux ps --running --json
uv run llmux container ps -b vllm
container render-env
Re-render .runtime/<backend>/<profile>.env from profiles.yaml. Useful after editing profiles.yaml by hand. Prints the rendered path(s).
llmux container render-env [PROFILE] [OPTIONS]
| Argument | Description |
|---|---|
PROFILE | Profile name to render. Omit to re-render all profiles. |
| Option | Default | Description |
|---|---|---|
--backend, -b | all | Limit when rendering all (no PROFILE given). |
# Re-render a single profile
uv run llmux render-env qwen3-0-6b
# Re-render every llama.cpp profile
uv run llmux container render-env --backend llamacpp
container benchmark · bench
Benchmark a running container's generation speed via /v1/chat/completions. A warmup call is discarded, then --runs measured calls report the median tok/s (a single cold call conflates model warmup with steady-state decode).
llmux bench PROFILE [OPTIONS]
| Option | Default | Description |
|---|---|---|
--backend, -b | auto | Force backend; auto-detect if omitted. |
--prompt | (built-in) | Prompt sent to the chat endpoint. |
--max-tokens | 200 | max_tokens for the request. |
--runs | 3 | Measured runs; the reported figure is their median. |
--warmup | 1 | Warmup runs discarded before measuring. |
--json | False | Emit a JSON record (per-run + median/min/max) instead of a human line. |
uv run llmux bench qwen3-0-6b --runs 5
uv run llmux bench qwen3-0-6b --json
container stats · stats
Live token throughput (tok/s) for every running container, polled from its Prometheus /metrics endpoint. Rates are deltas between successive samples, so the first line appears one interval in. An unavailable metric reads n/a; an HTTP request failure is reported as an error rather than displayed as normal missing data.
llmux stats [OPTIONS]
| Option | Default | Description |
|---|---|---|
--backend, -b | all | Limit to one backend; show all if omitted. |
--interval, -i | 2.0 | Seconds between /metrics samples. |
--once | False | Take two samples one interval apart, print one tick, then exit. |
--json | False | Emit one compact JSON line per tick (NDJSON). |
uv run llmux stats # live, Ctrl-C to stop
uv run llmux stats --once --json # one machine-readable sample
llama.cpp needs --metrics
vLLM exposes /metrics by default; llama.cpp does not, so llmux injects --metrics into every llama-server command it renders. The same figures drive the live tok/s column on the TUI dashboard.
profile — profile CRUD + quick-setup
llmux profile list|show|new|edit|rename|clone|delete|quick-setup …
Profiles live in profiles.yaml at the repo root — the single source of truth for both backends. Fields not applicable to a backend stay at their defaults.
profile list
List all profiles across (or within) backends.
llmux profile list [OPTIONS]
| Option | Default | Description |
|---|---|---|
--backend, -b | all | Limit to one backend (vllm, llamacpp). |
--json | False | Emit JSON instead of a table. |
Columns: backend, name, port, gpu_id, config, model.
uv run llmux profile list
uv run llmux profile list -b vllm --json
profile show
Show a profile's full record. Environment keys containing TOKEN, SECRET, PASSWORD, PASSWD, API_KEY, PRIVATE_KEY, CREDENTIAL, or AUTH keep their names but replace their values with set and length metadata in both text and JSON output. Other environment values remain visible for automation compatibility.
llmux profile show NAME [OPTIONS]
| Argument | Description |
|---|---|
NAME | Profile name. Required. |
| Option | Default | Description |
|---|---|---|
--backend, -b | auto-detect | Force backend; auto-detect if omitted. |
--json | False | Emit JSON instead of YAML-ish key: value text. |
uv run llmux profile show qwen3-0-6b --json
profile new
Create a new profile entry in profiles.yaml. The name must match ^[a-z0-9][a-z0-9_-]*$ — lowercase only, because docker compose project names are lowercase-only and a cross-backend profile must validate on both sides. Creation fails if the name already exists in either backend.
llmux profile new NAME [OPTIONS]
| Argument | Description |
|---|---|
NAME | Profile name (lowercase: [a-z0-9_-]). Required. |
| Option | Default | Backend | Description |
|---|---|---|---|
--backend, -b | vllm | both | Backend (vllm, llamacpp). |
--port, -p | 0 | both | Host port (0 = backend default: 8000 vLLM / 8080 llama.cpp). |
--gpu-id, -g | "0" | both | GPU id(s), comma-separated. (vLLM: tensor_parallel_size is derived from the count.) |
--tensor-parallel | 0 | vLLM | Explicit tensor-parallel degree. 0 derives it from the --gpu-id count. |
--model, -m | "" | vLLM | Hugging Face model id. |
--config, -c | profile name | both | Linked config name. |
--container | profile name | both | Container name. |
--lora / --no-lora | --no-lora | vLLM | Enable LoRA. |
--max-loras | 0 | vLLM | Maximum simultaneously loaded LoRAs. 0 leaves the field unset. |
--max-lora-rank | 0 | vLLM | Maximum supported LoRA rank. 0 leaves the field unset. |
--lora-modules | "" | vLLM | Comma-separated name=path adapter mappings. |
--extra-pip | "" | vLLM | Extra pip packages installed before serve. (First-class profile field — do not pass via --set EXTRA_PIP_PACKAGES=….) |
--set | (none) | both | Repeatable: KEY=VALUE entries appended to env_vars. Key must be a valid env-var name and cannot shadow a reserved profile field or protected Hugging Face/Docker/Compose control key. Use the dedicated profile option instead. |
--model-file | "" | llama.cpp | GGUF filename. |
--hf-repo | "" | llama.cpp | Hugging Face repo for download. |
--hf-file | "" | llama.cpp | HF file for download. |
# vLLM profile
uv run llmux profile new qwen3-8b --backend vllm --model Qwen/Qwen3-8B \
--gpu-id 0,1 --port 8000 --set VLLM_USE_FLASHINFER_MOE_MXFP4_MXFP8=1
# llama.cpp profile
uv run llmux profile new gemma-3-4b --backend llamacpp --port 8080 \
--model-file gemma-3-4b-it-q4_k_m.gguf \
--hf-repo unsloth/gemma-3-4b-it-GGUF --hf-file gemma-3-4b-it-q4_k_m.gguf
profile edit
Edit fields of an existing profile. Only the options you pass change; everything else is left untouched.
llmux profile edit NAME [OPTIONS]
| Argument | Description |
|---|---|
NAME | Profile name. Required. |
| Option | Backend | Description |
|---|---|---|
--backend, -b | both | Force backend; auto-detect if omitted. |
--port, -p | both | New host port. |
--gpu-id, -g | both | New GPU id(s); re-derives tensor_parallel_size unless --tensor-parallel is also passed. |
--tensor-parallel | vLLM | Explicit tensor-parallel degree; overrides the value derived from --gpu-id. |
--model, -m | vLLM | New Hugging Face model id. |
--config, -c | both | New linked config name. |
--container | both | New container name. |
--lora / --no-lora | vLLM | Toggle LoRA. |
--max-loras | vLLM | Set a positive simultaneous LoRA limit; pass 0 to clear it. |
--max-lora-rank | vLLM | Set a positive maximum LoRA rank; pass 0 to clear it. |
--lora-modules | vLLM | Set comma-separated name=path adapters; pass an empty string to clear them. |
--extra-pip | vLLM | Extra pip packages. |
--set | both | Repeatable: KEY=VALUE to add/override in env_vars. Protected Hugging Face/Docker/Compose control keys are rejected. |
--unset | both | Repeatable: KEY to remove from env_vars. |
--model-file | llama.cpp | New GGUF filename. |
--hf-repo | llama.cpp | New HF download repo. |
--hf-file | llama.cpp | New HF download file. |
--image-tag | both | Docker image override (e.g. llamacpp-dev:mtp_main). Pass an empty string to clear. |
# Pin a llama.cpp profile to a locally-built dev image
uv run llmux profile edit gemma-3-4b --image-tag llamacpp-dev:mtp_main
# Add an env var, remove another
uv run llmux profile edit qwen3-8b --set VLLM_ATTENTION_BACKEND=FLASHINFER --unset OLD_VAR
profile rename
Rename a profile. The profile's container must be stopped — it is named after the profile, so renaming under a running container would orphan it.
An unset config link is pinned to the old name, so the profile keeps resolving to the config file it already used. An unset container name follows the new profile name.
llmux profile rename OLD NEW [OPTIONS]
| Argument | Description |
|---|---|
OLD | Existing profile name. Required. |
NEW | New profile name. Required. Must be unique across both backends. |
| Option | Default | Description |
|---|---|---|
--backend, -b | auto-detect | Force backend; auto-detect if omitted. |
uv run llmux profile rename qwen3-8b qwen3-8b-fp8
profile clone
Copy a profile to a new name, keeping the same linked config. The clone reuses the source's port — change it before running both.
llmux profile clone SRC DST [OPTIONS]
| Argument | Description |
|---|---|
SRC | Profile to copy from. Required. |
DST | New profile name. Required. |
| Option | Default | Description |
|---|---|---|
--backend, -b | auto-detect | Force backend; auto-detect if omitted. |
uv run llmux profile clone qwen3-8b qwen3-8b-tuned
profile delete
Delete a profile (and optionally its linked config YAML).
llmux profile delete NAME [OPTIONS]
| Argument | Description |
|---|---|
NAME | Profile name. Required. |
| Option | Default | Description |
|---|---|---|
--backend, -b | auto-detect | Force backend; auto-detect if omitted. |
--with-config | False | Also delete the linked config YAML. |
--yes, -y | False | Skip the interactive confirmation prompt. |
uv run llmux profile delete old-profile --with-config --yes
profile quick-setup
Create a profile and a config in one step — mirrors the TUI's "Quick Setup" for both backends. vLLM takes a model id; llama.cpp takes --hf-repo and --hf-file. If --name is omitted, a name is derived from the model or repository; collisions get a numeric suffix.
llmux profile quick-setup [MODEL] [OPTIONS]
| Argument | Description |
|---|---|
MODEL | vLLM model id, e.g. Qwen/Qwen3-8B. Required only for vLLM. |
| Option | Default | Description |
|---|---|---|
--backend, -b | vllm | vllm or llamacpp. |
--name, -n | derived from model | Profile name. |
--port, -p | 0 | Host port; 0 selects the backend default (8000 / 8080). |
--gpu-id, -g | "0" | GPU id(s), comma-separated. |
--gpu-mem | "0.9" | vLLM gpu-memory-utilization (0.0–1.0). |
--lora / --no-lora | --no-lora | Enable LoRA. |
--recipe | False | vLLM: apply the model's official recipe during Quick Setup. |
--recipe-from | MODEL | vLLM: borrow another model's recipe while keeping the requested model id. |
--variant | auto | vLLM: select a recipe precision variant. |
--feature | none | vLLM: repeatable recipe feature. |
--hf-repo | none | llama.cpp Hugging Face GGUF repository. |
--hf-file | none | llama.cpp GGUF filename. |
--ctx-size | 32768 | llama.cpp context size. |
--n-gpu-layers | 99 | llama.cpp GPU layers. |
--batch-size | backend default | llama.cpp logical batch size. |
--cache-type-k / --cache-type-v | bf16 | llama.cpp KV cache types. |
--flash-attn / --no-flash-attn | --flash-attn | llama.cpp flash attention. |
--jinja / --no-jinja | --jinja | llama.cpp chat-template support. |
--override-tensors | none | llama.cpp tensor override regex. |
--copy-from | none | Copy parameters from an existing config. |
uv run llmux profile quick-setup Qwen/Qwen3-8B --gpu-id 0,1 --gpu-mem 0.92
uv run llmux profile quick-setup --backend llamacpp \
--hf-repo unsloth/gemma-3-4b-it-GGUF \
--hf-file gemma-3-4b-it-q4_k_m.gguf
config — config (YAML) CRUD
llmux config list|show|new|edit|clone|rename|flags|from-recipe|delete …
Per-model engine configs live in config/<backend>/<name>.yaml:
- vLLM —
config/vllm/<name>.yaml:model:+gpu-memory-utilization:plus arbitraryvllm serveflags. - llama.cpp —
config/llamacpp/<name>.yaml: a flat dict ofllama-serverflags.
New config names (new, clone destination, rename destination, and recipe --name) must match ^[a-z0-9][a-z0-9_-]*$. Read/edit/delete and clone-source lookups also accept legacy on-disk names matching ^[a-zA-Z0-9][a-zA-Z0-9._-]*$, so an older or hand-written file can still be inspected and removed. If the same name exists in both backends, disambiguate with --backend.
config list
List config files.
llmux config list [OPTIONS]
| Option | Default | Description |
|---|---|---|
--backend, -b | all | Limit to one backend. |
--json | False | Emit JSON instead of a table. |
Columns: backend, name, model, params (number of keys in the YAML).
config show
Print a config YAML.
llmux config show NAME [OPTIONS]
| Argument | Description |
|---|---|
NAME | Config name. Required. |
| Option | Default | Description |
|---|---|---|
--backend, -b | auto-resolve | Force backend (resolved from existing files if omitted). |
--json | False | Emit JSON instead of a YAML dump. |
config new
Create a new config YAML. For vLLM, the file is seeded with model: and gpu-memory-utilization:; for llama.cpp it starts empty. --set values are YAML-parsed, so --set foo=2 stores an int and a bare --set bar stores true.
llmux config new NAME [OPTIONS]
| Argument | Description |
|---|---|
NAME | Config name (becomes <name>.yaml). Required. |
| Option | Default | Backend | Description |
|---|---|---|---|
--backend, -b | vllm | both | Backend. |
--model, -m | "" | vLLM | model: field. |
--gpu-mem | "0.9" | vLLM | gpu-memory-utilization:. |
--set | (none) | both | Repeatable: KEY=VALUE entries (YAML-typed values). |
--overwrite | False | both | Overwrite if the file already exists. |
# vLLM config
uv run llmux config new qwen3-8b --model Qwen/Qwen3-8B --gpu-mem 0.9 \
--set max-model-len=8192 --set enable-prefix-caching
# llama.cpp config
uv run llmux config new gemma-3-4b --backend llamacpp \
--set ctx-size=8192 --set n-gpu-layers=999 --set flash-attn
config edit
Patch fields in an existing config.
llmux config edit NAME [OPTIONS]
| Argument | Description |
|---|---|
NAME | Config name. Required. |
| Option | Backend | Description |
|---|---|---|
--backend, -b | both | Force backend; auto-resolved otherwise. |
--set | both | Repeatable: KEY=VALUE (YAML-typed values). Re-enables a disabled key automatically. |
--unset | both | Repeatable: KEY to remove (from active or disabled). |
--disable | both | Repeatable: park KEY as an inert comment marker without deleting its value. |
--enable | both | Repeatable: restore a previously disabled KEY. |
--model, -m | vLLM | Set the model: field. |
--gpu-mem | vLLM | Set gpu-memory-utilization:. |
uv run llmux config edit qwen3-8b --set max-model-len=16384 --unset enable-prefix-caching
# Toggle a flag off without losing its value, then back on
uv run llmux config edit qwen3-8b --disable enforce-eager
uv run llmux config edit qwen3-8b --enable enforce-eager
A disabled parameter is stored as a # llmux:disabled <key>: <value> comment marker — inert to the server, visible to llmux. Hand-written # comments in the file are preserved across edits. See Toggling parameters on / off.
config clone
Clone SRC config to DST within the same backend. Useful when profile quick-setup --copy-from isn't enough — for example, when you want to clone a tuned config to a new name without creating a profile in the same step. Routes through the backend's canonical serializer so the resulting YAML is byte-identical to a TUI-edited config.
llmux config clone SRC DST [OPTIONS]
| Argument | Description |
|---|---|
SRC | Source config name to copy from. Required. |
DST | New config name to create. Required. |
| Option | Default | Description |
|---|---|---|
--backend, -b | auto-resolve | Backend of SRC; required only if SRC exists in both backends. |
--overwrite | False | Overwrite DST if it already exists. |
uv run llmux config clone qwen3-0-6b qwen3-0-6b-experiment
config flags
Inspect the flags supported by the actual vLLM or llama.cpp image. Discovery is cached by image identity, so a moving tag is re-read after its image changes.
llmux config flags [OPTIONS]
| Option | Default | Description |
|---|---|---|
--backend, -b | vllm | Backend whose server flags to inspect. |
--image | configured/default image | Discover directly from this Docker image. |
--profile | none | Use the profile's backend and pinned image. Mutually exclusive with --image. |
--json | False | Emit the backend, image input, and sorted flag list as JSON. |
uv run llmux config flags --profile qwen3-8b
uv run llmux config flags --backend llamacpp --image ghcr.io/me/llama:v1 --json
config from-recipe
Create a vLLM config from the model's official vllm-project/recipes recipe. The TUI shows an interactive review window (see Import a vLLM recipe); this headless form picks a variant with --variant, or auto-picks the highest-quality one that fits the detected GPU.
llmux config from-recipe MODEL_ID [OPTIONS]
| Option | Default | Description |
|---|---|---|
--list | False | List the recipe's variants + features and exit. |
--variant | auto | Precision variant (default/fp8/awq/…). Auto-picks a GPU-fitting one if omitted. |
--feature | (none) | Repeatable: opt-in feature to enable (e.g. reasoning). |
--name, -n | auto | Config name (derived from the model id if omitted). |
--json | False | Preview the resulting config as JSON without writing. |
--overwrite | False | Overwrite if the config already exists. |
--recipe-from | (MODEL_ID) | Fetch the recipe of a different model (e.g. the base model of a quantized checkpoint). The config's model stays MODEL_ID; only the recipe's flags are borrowed, and a variant's checkpoint swap is ignored. |
--merge | False | Merge the recipe's params into an existing config instead of replacing it — recipe values win, other keys are kept. Mirrors the TUI's Fetch vLLM recipe button inside Edit Config. Mutually exclusive with --overwrite. |
uv run llmux config from-recipe Qwen/Qwen3-32B --list
uv run llmux config from-recipe Qwen/Qwen3-32B --variant fp8 --feature reasoning
uv run llmux config from-recipe Qwen/Qwen3-32B --variant awq --json
# Borrow the base model's recipe for a quantized checkpoint
uv run llmux config from-recipe cpatonn/Qwen3-32B-AWQ \
--recipe-from Qwen/Qwen3-32B --variant awq
# Merge into a config you already have
uv run llmux config from-recipe Qwen/Qwen3-32B --name my-model --merge
config rename
Rename a config YAML and repoint every profile that referenced it. Refused while any referencing profile's container is running.
llmux config rename OLD NEW [OPTIONS]
| Argument | Description |
|---|---|
OLD | Existing config name. Required. |
NEW | New config name. Required. |
| Option | Default | Description |
|---|---|---|
--backend, -b | auto-detect | Required if OLD exists in both backends. |
--yes, -y | False | Skip the interactive confirmation prompt. |
uv run llmux config rename qwen3-0-6b qwen3-0-6b-fp8
config delete
Delete a config YAML.
llmux config delete NAME [OPTIONS]
| Argument | Description |
|---|---|
NAME | Config name. Required. |
| Option | Default | Description |
|---|---|---|
--backend, -b | auto-resolve | Force backend; auto-resolved otherwise. |
--yes, -y | False | Skip the interactive confirmation prompt. |
image — Docker image inventory + dev build
llmux image list|pull|remove|build-dev …
image list
List local (and optionally remote) Docker images.
llmux image list [OPTIONS]
| Option | Default | Description |
|---|---|---|
--backend, -b | vllm | Select the vLLM or llama.cpp image repository. |
--repo | backend default | Override the repository to list locally. |
--dev | False | Also list the selected backend's local dev images. |
--remote | False | Query vLLM's DockerHub stable + nightly tags. Rejected for llama.cpp. |
--json | False | Emit JSON instead of a table. |
Columns: source (local / local-dev / remote), repository, tag, size, created.
uv run llmux image list --dev
uv run llmux image list --backend llamacpp --dev
uv run llmux image list --remote --json
image pull
docker pull <repo>:<tag> — surfaces raw docker output and exit code.
llmux image pull TAG [OPTIONS]
| Argument | Description |
|---|---|
TAG | Image tag. Required for vLLM; llama.cpp defaults to server-cuda. |
| Option | Default | Description |
|---|---|---|
--backend | vllm | Select backend-aware repository and tag defaults. |
--repo | backend default | Image repository override. |
uv run llmux image pull v0.20.1
uv run llmux image pull nightly
image remove
Wraps docker rmi <ref> so you can drop a local image without leaving the CLI. Use --force to drop images that are still referenced by a stopped container.
llmux image remove REF [OPTIONS]
| Argument | Description |
|---|---|
REF | Image reference (e.g. vllm/vllm-openai:v0.10.0, vllm-dev:main, llamacpp-dev:fork-master, or a 12-char id). Required. |
| Option | Default | Description |
|---|---|---|
--force, -f | False | Pass --force to docker rmi. |
uv run llmux image remove llamacpp-dev:fork-master
uv run llmux image remove vllm/vllm-openai:v0.20.0 --force
image build-dev
Build a <backend>-dev:<tag> image from source, streaming docker build output. The build pipeline (git clone/update → docker build → image labels) is shared; the tags applied are <prefix>:<custom_tag or branch-YYYYMMDD> and <prefix>:<branch> (a stable alias to the latest build).
- vLLM →
vllm-dev:<tag>(targetvllm-openai,docker/Dockerfile) - llama.cpp →
llamacpp-dev:<tag>(targetserver,.devops/cuda.Dockerfile)
llmux image build-dev [OPTIONS]
| Option | Default | Backend | Description |
|---|---|---|---|
--backend | vllm | both | Which backend to build for (vllm or llamacpp). |
--branch, -b | from .env.common | both | Source branch. Falls back to VLLM_BRANCH / LLAMACPP_BRANCH (default main / master). |
--repo-url | from .env.common | both | Source repo URL. Falls back to VLLM_REPO_URL / LLAMACPP_REPO_URL. |
--tag, -t | branch name | both | Custom output tag. |
--official | False | vLLM | Build with upstream Dockerfile defaults (skips local GPU-arch detection patches). Ignored for llama.cpp with a warning. |
--cuda-arch | "" | llama.cpp | Override auto-detection. CMake-format, e.g. 89 (Ada) or 86;89 (mixed). Empty = auto-detect via nvidia-smi. Ignored for vLLM with a warning. |
--multi-arch | False | llama.cpp | Disable GPU auto-detection and build for all archs (portable, slow). Ignored for vLLM with a warning. |
# vLLM dev image from an unmerged PR branch
uv run llmux image build-dev --backend vllm --branch my-feature \
--repo-url https://github.com/me/vllm.git
# llama.cpp dev image, pinned to a single GPU arch for a fast build
uv run llmux image build-dev --backend llamacpp --branch master --cuda-arch 89
Keep credentials out of refs and command lines
--repo-url rejects an HTTP(S) URL containing userinfo, a query, or a fragment; use a credential helper or a credential-free SSH URL instead. A username-only SSH authority such as ssh://git@host/path is allowed. Docker image inputs reject URL schemes, userinfo, query strings, fragments, and whitespace before invoking Docker.
See Dev Builds for the full workflow, and Architecture for how the pipeline works.
system — system info & env validation
llmux system gpu|mem-estimate|disk|env-check …
system gpu
Print an nvidia-smi summary, one row per GPU. Also available as the top-level alias llmux gpu.
llmux system gpu [OPTIONS]
| Option | Default | Description |
|---|---|---|
--json | False | Emit JSON instead of a table. |
Columns: index, name, memory_used, memory_total, utilization, temperature. Prints (no GPUs detected — is nvidia-smi installed?) if none are found.
uv run llmux gpu
uv run llmux system gpu --json
system mem-estimate
Estimate a Hugging Face model's VRAM footprint via hf-mem — the same engine the TUI's memory estimator uses. Reads HF_TOKEN from .env.common (or the environment) for gated models.
llmux system mem-estimate MODEL_ID [OPTIONS]
| Argument | Description |
|---|---|
MODEL_ID | Hugging Face model id, e.g. Qwen/Qwen3-8B. Required. |
| Option | Default | Description |
|---|---|---|
--json | False | Emit the parsed estimate and per-GPU fit rows as one JSON object. |
uv run llmux system mem-estimate Qwen/Qwen3-8B
# → ~17.2GB (model: 15.3GB + KV: 1.9GB)
JSON output sets status to ok, over, or error. A malformed, non-finite, or non-positive GPU memory reading produces an error row with total_gb, ratio, and over set to null. Unless another known GPU is over capacity, aggregate any_over is also null. Text output labels the row UNKNOWN; either format exits 1 when any GPU memory reading is unknown.
system disk
Show backend storage and df -h usage. vLLM reports its configured host Hugging Face cache; if the cache has not been created yet, the command measures the nearest existing ancestor and still succeeds. Its JSON output distinguishes this with hf_cache_exists: false and identifies the measured path as df_target. llama.cpp reports its model directory, GGUF inventory, and HF GGUF cache. The JSON success and failure payloads both identify the selected backend.
llmux system disk [OPTIONS]
| Option | Default | Description |
|---|---|---|
--backend, -b | llamacpp | vllm or llamacpp. |
--json | False | Emit a backend-tagged storage object. |
uv run llmux system disk --backend llamacpp
# Model dir : /home/me/Project/llmux/models
# GGUF files: 2 (total 17.1 GB)
# df ...: used 583G, avail 285G (68%)
uv run llmux system disk --backend vllm --json
system env-check
Validate .env.common and report key paths. Checks that the file exists, is owner-only rather than group/world-accessible, and that required paths such as HF_CACHE_PATH are set and absolute. HF_TOKEN is optional, and the runtime injects the selected vLLM version at start time. Also available as llmux env-check.
llmux system env-check [OPTIONS]
| Option | Default | Description |
|---|---|---|
--json | False | Emit JSON findings instead of a text report. |
Exits 0 when everything checks out, including when only non-fatal warnings are present, and exits 1 when .env.common is missing or any issue is found. Human output prints non-fatal messages under Warnings: before Status: OK. JSON preserves them in warnings, keeps issues empty, and reports status: ok. Text output masks HF_TOKEN; JSON exposes only set and length, never the token value.
uv run llmux env-check
uv run llmux system env-check --json
See .env.common Reference for every variable this command validates.
update — check for a newer llmux
Ask GitHub whether this checkout is behind the latest Release, and update to it. llmux already checks on every interactive start (only a failed lookup backs off for 15 minutes), so this command is for asking on demand — right after a release, or from a script.
llmux update [OPTIONS]
| Option | Default | Description |
|---|---|---|
--check | False | Only report; never touch the checkout. |
--yes, -y | False | Update without asking for confirmation. |
--json | False | Emit exactly one JSON document. Use with --check for status only or --yes to apply an update without a prompt. |
llmux update --check # "llmux is up to date (v2.6.0)."
llmux update --check --json # machine-readable status
llmux update -y # pull + refresh the installed tool, no prompt
Exit codes: 0 when the state is known (up to date, or reported/applied), 1 when the check could not be completed (offline, rate-limited, not a git checkout, shallow clone) or the update failed. An update is refused — with the reason — when the checkout is not on a clean main; pull it yourself there.
If the Git fast-forward succeeds but refreshing the installed uv tool fails, the checkout has already advanced but the update still exits 1. The error prints the manual refresh command; the TUI reports the same partial failure and stays open.
The TUI has the same action on U.
Top-level aliases
For convenience — and so agents can write llmux up <profile> directly — the most-used commands are mirrored at the top level:
| Alias | Equivalent to |
|---|---|
llmux tui | launch the TUI explicitly |
llmux gpu | llmux system gpu |
llmux env-check | llmux system env-check |
llmux up | llmux container up |
llmux prepare | llmux container prepare |
llmux down | llmux container down |
llmux logs | llmux container logs |
llmux ps | llmux container ps |
llmux bench | llmux container benchmark |
llmux stats | llmux container stats |
llmux render-env | llmux container render-env |
These aliases share the exact arguments, options, and defaults of their canonical commands.