Skip to main content

Declarative control plane and TUI for bare-metal vLLM servers.

Project description

vllmops

A tiny control plane for bare-metal vLLM servers.

CI PyPI Python License Ruff mypy

vllmops TUI


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 /metrics scrape, 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

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

vllmops-0.4.0.tar.gz (363.8 kB view details)

Uploaded Source

Built Distribution

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

vllmops-0.4.0-py3-none-any.whl (59.8 kB view details)

Uploaded Python 3

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

Hashes for vllmops-0.4.0.tar.gz
Algorithm Hash digest
SHA256 906ae03ae7372627ed5d31149564829e1c456967912cb3533111bc9b9e4363d5
MD5 cc4904c0ec1f6249c1e8d102c8ca3e8a
BLAKE2b-256 727f87f446d725c5789e92d73a4d399055d6cb712985d0539015beac3932fac7

See more details on using hashes here.

Provenance

The following attestation bundles were made for vllmops-0.4.0.tar.gz:

Publisher: publish.yml on Freim32/vllmops

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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

Hashes for vllmops-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 90823da22249129f5fa4a72ae1de370a58d89b4f6cf3349fcf3f2c86efb93432
MD5 f269ee8e92287191aa078e801faf9206
BLAKE2b-256 b50ea9d50d407ee33edf83f6147ad2966888745d3bb34f9903897d9ab23addd4

See more details on using hashes here.

Provenance

The following attestation bundles were made for vllmops-0.4.0-py3-none-any.whl:

Publisher: publish.yml on Freim32/vllmops

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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