Reference CLI Reference .env.common Architecture

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:

--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 psstatus tablelist of rows
container benchmarkbenchmark reportone result object
container statslive throughput linesone compact JSON record per tick (NDJSON)
profile listprofile tablelist of rows
profile showkey: value textobject
config listconfig tablelist of rows
config showYAML dumpobject
config flagssupported flag tableobject with backend, image, and flags
config from-recipewrite the selected recipe configpreview object without writing
image listimage tablelist of rows
system gpuGPU tablelist of rows
system mem-estimateestimate and per-GPU fit reportestimate and per-GPU fit object
system diskbackend storage reportbackend-tagged storage object
system env-checkreport textfindings object
updatestatus or confirmation flowstatus/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]
ArgumentDescription
PROFILEProfile name (from profiles.yaml). Required.
OptionDefaultBackendDescription
--backend, -bauto-detectbothForce backend (vllm, llamacpp); auto-detect if omitted.
--tag, -t""bothImage 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.
--devFalsebothUse 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-imageFalsebothMirrors 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.
--pullFalsebothForce --pull always for non-dev images. Locally built dev images remain --pull never.
--repo-urlfrom .env.commonboth--dev only: override the source repo URL (default from VLLM_REPO_URL / LLAMACPP_REPO_URL).
--branchfrom .env.commonboth--dev only: override the source branch (default from VLLM_BRANCH / LLAMACPP_BRANCH).
--forceFalsebothAllow a detected GPU overlap. Port conflicts and failed port probes always abort.
--replaceFalsebothStop 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]
ArgumentDescription
PROFILEProfile name (from profiles.yaml). Required.
OptionDefaultDescription
--backend, -bauto-detectForce backend; auto-detect if omitted.
--max-workers, -wfrom PREPARE_MAX_WORKERSPositive 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]
ArgumentDescription
PROFILEProfile name (from profiles.yaml). Required.
OptionDefaultDescription
--backend, -bauto-detectForce 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]
ArgumentDescription
PROFILEProfile name (from profiles.yaml). Required.
OptionDefaultDescription
--backend, -bauto-detectForce backend; auto-detect if omitted.
--tail, -n200Number of recent lines to show before following.
--follow / --no-follow, -f / -F--followFollow 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]
OptionDefaultDescription
--backend, -ballLimit to one backend (vllm, llamacpp); show all if omitted.
--jsonFalseEmit JSON instead of a table.
--running, -rFalseOnly 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]
ArgumentDescription
PROFILEProfile name to render. Omit to re-render all profiles.
OptionDefaultDescription
--backend, -ballLimit 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]
OptionDefaultDescription
--backend, -bautoForce backend; auto-detect if omitted.
--prompt(built-in)Prompt sent to the chat endpoint.
--max-tokens200max_tokens for the request.
--runs3Measured runs; the reported figure is their median.
--warmup1Warmup runs discarded before measuring.
--jsonFalseEmit 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]
OptionDefaultDescription
--backend, -ballLimit to one backend; show all if omitted.
--interval, -i2.0Seconds between /metrics samples.
--onceFalseTake two samples one interval apart, print one tick, then exit.
--jsonFalseEmit 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]
OptionDefaultDescription
--backend, -ballLimit to one backend (vllm, llamacpp).
--jsonFalseEmit 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]
ArgumentDescription
NAMEProfile name. Required.
OptionDefaultDescription
--backend, -bauto-detectForce backend; auto-detect if omitted.
--jsonFalseEmit 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]
ArgumentDescription
NAMEProfile name (lowercase: [a-z0-9_-]). Required.
OptionDefaultBackendDescription
--backend, -bvllmbothBackend (vllm, llamacpp).
--port, -p0bothHost port (0 = backend default: 8000 vLLM / 8080 llama.cpp).
--gpu-id, -g"0"bothGPU id(s), comma-separated. (vLLM: tensor_parallel_size is derived from the count.)
--tensor-parallel0vLLMExplicit tensor-parallel degree. 0 derives it from the --gpu-id count.
--model, -m""vLLMHugging Face model id.
--config, -cprofile namebothLinked config name.
--containerprofile namebothContainer name.
--lora / --no-lora--no-loravLLMEnable LoRA.
--max-loras0vLLMMaximum simultaneously loaded LoRAs. 0 leaves the field unset.
--max-lora-rank0vLLMMaximum supported LoRA rank. 0 leaves the field unset.
--lora-modules""vLLMComma-separated name=path adapter mappings.
--extra-pip""vLLMExtra pip packages installed before serve. (First-class profile field — do not pass via --set EXTRA_PIP_PACKAGES=….)
--set(none)bothRepeatable: 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.cppGGUF filename.
--hf-repo""llama.cppHugging Face repo for download.
--hf-file""llama.cppHF 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]
ArgumentDescription
NAMEProfile name. Required.
OptionBackendDescription
--backend, -bbothForce backend; auto-detect if omitted.
--port, -pbothNew host port.
--gpu-id, -gbothNew GPU id(s); re-derives tensor_parallel_size unless --tensor-parallel is also passed.
--tensor-parallelvLLMExplicit tensor-parallel degree; overrides the value derived from --gpu-id.
--model, -mvLLMNew Hugging Face model id.
--config, -cbothNew linked config name.
--containerbothNew container name.
--lora / --no-loravLLMToggle LoRA.
--max-lorasvLLMSet a positive simultaneous LoRA limit; pass 0 to clear it.
--max-lora-rankvLLMSet a positive maximum LoRA rank; pass 0 to clear it.
--lora-modulesvLLMSet comma-separated name=path adapters; pass an empty string to clear them.
--extra-pipvLLMExtra pip packages.
--setbothRepeatable: KEY=VALUE to add/override in env_vars. Protected Hugging Face/Docker/Compose control keys are rejected.
--unsetbothRepeatable: KEY to remove from env_vars.
--model-filellama.cppNew GGUF filename.
--hf-repollama.cppNew HF download repo.
--hf-filellama.cppNew HF download file.
--image-tagbothDocker 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]
ArgumentDescription
OLDExisting profile name. Required.
NEWNew profile name. Required. Must be unique across both backends.
OptionDefaultDescription
--backend, -bauto-detectForce 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]
ArgumentDescription
SRCProfile to copy from. Required.
DSTNew profile name. Required.
OptionDefaultDescription
--backend, -bauto-detectForce 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]
ArgumentDescription
NAMEProfile name. Required.
OptionDefaultDescription
--backend, -bauto-detectForce backend; auto-detect if omitted.
--with-configFalseAlso delete the linked config YAML.
--yes, -yFalseSkip 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]
ArgumentDescription
MODELvLLM model id, e.g. Qwen/Qwen3-8B. Required only for vLLM.
OptionDefaultDescription
--backend, -bvllmvllm or llamacpp.
--name, -nderived from modelProfile name.
--port, -p0Host 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-loraEnable LoRA.
--recipeFalsevLLM: apply the model's official recipe during Quick Setup.
--recipe-fromMODELvLLM: borrow another model's recipe while keeping the requested model id.
--variantautovLLM: select a recipe precision variant.
--featurenonevLLM: repeatable recipe feature.
--hf-repononellama.cpp Hugging Face GGUF repository.
--hf-filenonellama.cpp GGUF filename.
--ctx-size32768llama.cpp context size.
--n-gpu-layers99llama.cpp GPU layers.
--batch-sizebackend defaultllama.cpp logical batch size.
--cache-type-k / --cache-type-vbf16llama.cpp KV cache types.
--flash-attn / --no-flash-attn--flash-attnllama.cpp flash attention.
--jinja / --no-jinja--jinjallama.cpp chat-template support.
--override-tensorsnonellama.cpp tensor override regex.
--copy-fromnoneCopy 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:

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]
OptionDefaultDescription
--backend, -ballLimit to one backend.
--jsonFalseEmit 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]
ArgumentDescription
NAMEConfig name. Required.
OptionDefaultDescription
--backend, -bauto-resolveForce backend (resolved from existing files if omitted).
--jsonFalseEmit 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]
ArgumentDescription
NAMEConfig name (becomes <name>.yaml). Required.
OptionDefaultBackendDescription
--backend, -bvllmbothBackend.
--model, -m""vLLMmodel: field.
--gpu-mem"0.9"vLLMgpu-memory-utilization:.
--set(none)bothRepeatable: KEY=VALUE entries (YAML-typed values).
--overwriteFalsebothOverwrite 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]
ArgumentDescription
NAMEConfig name. Required.
OptionBackendDescription
--backend, -bbothForce backend; auto-resolved otherwise.
--setbothRepeatable: KEY=VALUE (YAML-typed values). Re-enables a disabled key automatically.
--unsetbothRepeatable: KEY to remove (from active or disabled).
--disablebothRepeatable: park KEY as an inert comment marker without deleting its value.
--enablebothRepeatable: restore a previously disabled KEY.
--model, -mvLLMSet the model: field.
--gpu-memvLLMSet 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]
ArgumentDescription
SRCSource config name to copy from. Required.
DSTNew config name to create. Required.
OptionDefaultDescription
--backend, -bauto-resolveBackend of SRC; required only if SRC exists in both backends.
--overwriteFalseOverwrite 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]
OptionDefaultDescription
--backend, -bvllmBackend whose server flags to inspect.
--imageconfigured/default imageDiscover directly from this Docker image.
--profilenoneUse the profile's backend and pinned image. Mutually exclusive with --image.
--jsonFalseEmit 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]
OptionDefaultDescription
--listFalseList the recipe's variants + features and exit.
--variantautoPrecision variant (default/fp8/awq/…). Auto-picks a GPU-fitting one if omitted.
--feature(none)Repeatable: opt-in feature to enable (e.g. reasoning).
--name, -nautoConfig name (derived from the model id if omitted).
--jsonFalsePreview the resulting config as JSON without writing.
--overwriteFalseOverwrite 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.
--mergeFalseMerge 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]
ArgumentDescription
OLDExisting config name. Required.
NEWNew config name. Required.
OptionDefaultDescription
--backend, -bauto-detectRequired if OLD exists in both backends.
--yes, -yFalseSkip 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]
ArgumentDescription
NAMEConfig name. Required.
OptionDefaultDescription
--backend, -bauto-resolveForce backend; auto-resolved otherwise.
--yes, -yFalseSkip 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]
OptionDefaultDescription
--backend, -bvllmSelect the vLLM or llama.cpp image repository.
--repobackend defaultOverride the repository to list locally.
--devFalseAlso list the selected backend's local dev images.
--remoteFalseQuery vLLM's DockerHub stable + nightly tags. Rejected for llama.cpp.
--jsonFalseEmit 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]
ArgumentDescription
TAGImage tag. Required for vLLM; llama.cpp defaults to server-cuda.
OptionDefaultDescription
--backendvllmSelect backend-aware repository and tag defaults.
--repobackend defaultImage 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]
ArgumentDescription
REFImage reference (e.g. vllm/vllm-openai:v0.10.0, vllm-dev:main, llamacpp-dev:fork-master, or a 12-char id). Required.
OptionDefaultDescription
--force, -fFalsePass --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).

llmux image build-dev [OPTIONS]
OptionDefaultBackendDescription
--backendvllmbothWhich backend to build for (vllm or llamacpp).
--branch, -bfrom .env.commonbothSource branch. Falls back to VLLM_BRANCH / LLAMACPP_BRANCH (default main / master).
--repo-urlfrom .env.commonbothSource repo URL. Falls back to VLLM_REPO_URL / LLAMACPP_REPO_URL.
--tag, -tbranch namebothCustom output tag.
--officialFalsevLLMBuild with upstream Dockerfile defaults (skips local GPU-arch detection patches). Ignored for llama.cpp with a warning.
--cuda-arch""llama.cppOverride 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-archFalsellama.cppDisable 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]
OptionDefaultDescription
--jsonFalseEmit 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]
ArgumentDescription
MODEL_IDHugging Face model id, e.g. Qwen/Qwen3-8B. Required.
OptionDefaultDescription
--jsonFalseEmit 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]
OptionDefaultDescription
--backend, -bllamacppvllm or llamacpp.
--jsonFalseEmit 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]
OptionDefaultDescription
--jsonFalseEmit 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]
OptionDefaultDescription
--checkFalseOnly report; never touch the checkout.
--yes, -yFalseUpdate without asking for confirmation.
--jsonFalseEmit 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:

AliasEquivalent to
llmux tuilaunch the TUI explicitly
llmux gpullmux system gpu
llmux env-checkllmux system env-check
llmux upllmux container up
llmux preparellmux container prepare
llmux downllmux container down
llmux logsllmux container logs
llmux psllmux container ps
llmux benchllmux container benchmark
llmux statsllmux container stats
llmux render-envllmux container render-env

These aliases share the exact arguments, options, and defaults of their canonical commands.