Declarative control plane and TUI for bare-metal vLLM servers.
Project description
vllmops
A tiny control plane for bare-metal vLLM servers.
Overview
Self-hosted vLLM made simple. Declare each model in its own YAML file, group models into profiles in your project config, then drive their full lifecycle from either the CLI or a live TUI.
- Git-friendly YAML. One file per model, profiles in
.vllmops/config.yaml. Reviewed in pull requests, reproducible on a fresh machine. - Full lifecycle.
start,stop,restart,status,health,logs. Single model or whole profile, in parallel. - CLI and TUI, same actions. Run from the terminal in scripts, or open the TUI for a live view.
- Live metrics, no stack. Direct
/metricsscrape, in-memory ring buffer. No Docker, no Prometheus, no Grafana. - Per-project venv. Each workspace pins its own vLLM via
uv. No global install required. - POSIX, type-checked, tested. Linux/macOS, mypy strict, 180+ tests.
Contents
Install
Requires Python 3.10+ on Linux or macOS.
pipx install vllmops
Or with uv:
uv tool install vllmops
Quickstart
mkdir my-llms && cd my-llms
vllmops init
uv sync # creates .venv with vLLM installed
vllmops create-model # interactive: name, HF model, GPUs, port
vllmops start qwen3 # blocks on /health by default
vllmops tui # live metrics
Layout after init:
my-llms/
├── .vllmops/config.yaml # project config
├── configs/models/*.yaml # one file per model
├── runtime/logs/ # rotated per spawn (.log + .log.prev)
├── runtime/pids/
├── pyproject.toml # vLLM as a dep, installed via uv sync
└── .env.example
Model YAML
vllmops create-model --name qwen3 --model Qwen/Qwen3-8B --gpus 0 --port 8001 writes:
name: qwen3
env:
CUDA_VISIBLE_DEVICES: '0'
HF_HOME: data/huggingface
VLLM_LOGGING_LEVEL: INFO
vllm:
executable: vllm
subcommand: serve
model: Qwen/Qwen3-8B
args:
--host: 0.0.0.0
--port: 8001
--tensor-parallel-size: 1
--dtype: auto
--served-model-name: qwen3
--disable-access-log-for-endpoints: /health,/metrics,/ping
flags: []
extra_args: []
metrics:
path: /metrics
env supports ${VAR} interpolation from the shell, .env, and the project config (shell wins). Add HF_TOKEN: ${HF_TOKEN} for gated models.
Profiles
Group models for bulk lifecycle. Declare in .vllmops/config.yaml:
profiles:
dev: [qwen3, llama-small]
prod: [qwen3-prod]
Then run lifecycle commands on the whole group. Each member is processed in parallel; already-running members are skipped (idempotent), broken YAMLs don't block the rest, failures are reported per-model:
vllmops start --profile dev # parallel spawn + parallel /health wait
vllmops stop --profile dev
vllmops restart --profile dev
vllmops profile list # all profiles with running/total counts
vllmops profile show dev # members and their state
Models not declared in any profile fall into the synthetic general group. The TUI sidebar renders the same grouping; selecting a profile node makes s/S/r operate on every member.
Commands
| Command | Description |
|---|---|
vllmops init [PATH] |
Initialize a project workspace |
vllmops create-model |
Scaffold a model YAML |
vllmops validate |
Validate all model YAMLs |
vllmops start <name> | --profile <p> |
Spawn one model or every model in a profile |
vllmops stop <name> | --profile <p> |
SIGTERM, then SIGKILL after timeout |
vllmops restart <name> | --profile <p> |
Stop, then start |
vllmops status [<name>] |
Running / stale / stopped |
vllmops health <name> |
One-shot /health probe |
vllmops logs <name> [--tail N] [-f] |
Print or follow a model log |
vllmops command <name> |
Print the underlying vLLM command |
vllmops profile list | show <p> |
Inspect profiles defined in config |
vllmops tui |
Launch the Textual TUI |
vllmops doctor |
Diagnose local setup (Python, venv, vllm, GPUs, ports, ...) |
vllmops completion <shell> |
Print shell completion script (bash, zsh, fish, powershell) |
Run vllmops <command> --help for full options.
Shell completion
# bash
vllmops completion bash > ~/.local/share/bash-completion/completions/vllmops
# zsh (ensure `fpath+=~/.zfunc` and `autoload -U compinit && compinit` are in your .zshrc)
vllmops completion zsh > ~/.zfunc/_vllmops
# fish
vllmops completion fish > ~/.config/fish/completions/vllmops.fish
Restart your shell. Alternative: vllmops --install-completion auto-detects the current shell and installs in one step.
Contributing
Contributions of any size are welcome. See CONTRIBUTING.md for local setup and the project checks.
License
Project details
Release history Release notifications | RSS feed
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 vllmops-0.4.0.tar.gz.
File metadata
- Download URL: vllmops-0.4.0.tar.gz
- Upload date:
- Size: 363.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
906ae03ae7372627ed5d31149564829e1c456967912cb3533111bc9b9e4363d5
|
|
| MD5 |
cc4904c0ec1f6249c1e8d102c8ca3e8a
|
|
| BLAKE2b-256 |
727f87f446d725c5789e92d73a4d399055d6cb712985d0539015beac3932fac7
|
Provenance
The following attestation bundles were made for vllmops-0.4.0.tar.gz:
Publisher:
publish.yml on Freim32/vllmops
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vllmops-0.4.0.tar.gz -
Subject digest:
906ae03ae7372627ed5d31149564829e1c456967912cb3533111bc9b9e4363d5 - Sigstore transparency entry: 2010895836
- Sigstore integration time:
-
Permalink:
Freim32/vllmops@3cc59f6ab313b1ceda6454b5157d7907693e2ce6 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/Freim32
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@3cc59f6ab313b1ceda6454b5157d7907693e2ce6 -
Trigger Event:
release
-
Statement type:
File details
Details for the file vllmops-0.4.0-py3-none-any.whl.
File metadata
- Download URL: vllmops-0.4.0-py3-none-any.whl
- Upload date:
- Size: 59.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
90823da22249129f5fa4a72ae1de370a58d89b4f6cf3349fcf3f2c86efb93432
|
|
| MD5 |
f269ee8e92287191aa078e801faf9206
|
|
| BLAKE2b-256 |
b50ea9d50d407ee33edf83f6147ad2966888745d3bb34f9903897d9ab23addd4
|
Provenance
The following attestation bundles were made for vllmops-0.4.0-py3-none-any.whl:
Publisher:
publish.yml on Freim32/vllmops
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
vllmops-0.4.0-py3-none-any.whl -
Subject digest:
90823da22249129f5fa4a72ae1de370a58d89b4f6cf3349fcf3f2c86efb93432 - Sigstore transparency entry: 2010896055
- Sigstore integration time:
-
Permalink:
Freim32/vllmops@3cc59f6ab313b1ceda6454b5157d7907693e2ce6 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/Freim32
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@3cc59f6ab313b1ceda6454b5157d7907693e2ce6 -
Trigger Event:
release
-
Statement type: