Quickstart
In about ten minutes you install the vllm-sr CLI, serve a decision model,
ask it a question, and then let the Router use the same model for routing.
You need Linux, macOS or WSL2 with Docker or Podman, Python 3.10 or newer, 12 GiB of memory, and about 9 GB of free disk for the Router image and the model download. No GPU is needed.
Engine mode (vllm-sr serve ARTIFACT --engine) is newer than the 0.4.0
release; see the release channel note.
1. Install
Install the development channel, which includes Engine mode, into the
installer's isolated virtual environment. --no-launch leaves startup for the
next step:
curl -fsSL https://vllm-sr.ai/install.sh | bash -s -- --channel dev --no-launch
The model runtime, the vllm-srun Python package, ships only inside the Router
images, so nothing else is installed on your machine. The CLI pulls the image
on first use. The images carry the release's own PyTorch build, so their
answers are the ones the models were released with
(Choose a model).
2. Serve a model
Start Vela 3.0 vela3-fast, the Router's default decision model, which runs on a CPU in FP32. A decision model answers questions you write in plain language.
- CPU
- AMD GPU
- NVIDIA GPU
vllm-sr serve vllm-sr/vela3-fast --engine --platform cpu
On macOS the runtime runs on the CPU, because containers there get no GPU.
vllm-sr serve vllm-sr/vela3-fast --engine --platform rocm --device-ids 0
The vllm-sr-rocm image is a 6.5 GB download on first use. --device-ids N
selects a host GPU at startup; rocm:N picks one in canonical YAML.
vela3-fast's reference answers are recorded for CPUs only, so on a GPU its
self-check reports
unverified.
vllm-sr serve vllm-sr/vela3-fast --engine --platform cuda --device-ids 0
--platform cuda selects the vllm-sr-cuda image and passes the GPUs
through.
vela3-fast's reference answers are recorded for CPUs only, so on a GPU its
self-check reports
unverified.
In Engine mode the CLI starts only the persistent frontend and a managed model worker, in one Router container:
- The first start downloads the model; later starts reuse it.
- Startup prints a short summary ending in a
Ready:line with the System One URL (--verboseprints every detail). vllm-sr statusinspects the stack andvllm-sr stopstops it.--dashboardadds the Dashboard,--observabilityadds Jaeger, Prometheus and Grafana, and--no-minimalstarts the whole stack.
In a second terminal, list the public native models:
curl -s localhost:8899/v1/systemone/models
Decision 3.0 models also answer questions about images and videos. Start the
smallest, d3-edge, on an AMD GPU with
vllm-sr serve vllm-sr/d3-edge -e --platform rocm, and send images and videos
as described in
Router and Engine modes.
vllm-sr/d3-turbo reads each input once for all of its questions and also
finds things in images and videos
(Box and track questions),
and vllm-sr/d3-ultra reads a text request's question list in front of its
state. Supported models lists every model.
Where Engine mode keeps its state, and which models it publishes
- Without
--config, and with noconfig.yamlin the working directory, Engine mode keeps each model's configuration, state and download in~/.local/state/vllm-sr/engine/<model>. - The initial Engine configuration publishes the selected model on the default
listener. An existing config keeps its explicit
listeners[].apis.systemone.modelsallowlist and API keys; restarting in another mode or selecting a model never broadens it. - Every start without
--engineuses Router mode; MODEL alone does not select Engine mode. Barevllm-sr servepreserves the configured default judgment deployment, or initializes Vela 3.0 vela3-fast in a new configuration.
3. Send a request
Ask two questions about one request at once: which kind of work it is (a choice), and whether it needs multi-step reasoning (a yes/no question, called noul).
curl -s localhost:8899/v1/systemone -H 'content-type: application/json' -d '{
"model": "vllm-sr/vela3-fast",
"state": "Write a Python function that merges two sorted lists.",
"questions": {
"kind": {"type": "choice", "instructions": "What kind of work is this?",
"criteria": {"code": "Writing or fixing code", "math": "Mathematics", "chat": "Anything else"}},
"reasoning": {"type": "noul", "instructions": "Does answering this need multi-step reasoning?"}
}
}'
The answer for kind names the chosen option and the probability of every
option. The answer for reasoning is the probability that the answer is yes:
{
"model": "vllm-sr/vela3-fast",
"answers": {
"kind": {"type": "choice", "choice": "code", "probabilities": {"code": 0.98, "math": 0.005, "chat": 0.015}, "confidence": 0.97},
"reasoning": {"type": "noul", "noul": 0.457}
},
"usage": {"input_tokens": 68, "output_tokens": 0}
}
On 16 cores of an AMD EPYC 9575F this request takes about 0.1 seconds.
- Add
"options": {"return_meta": true}to also getmeta: the revision, precision (dtype) and device that answered, whether batching can move its answers (numerics), and how long it took. POST /v1/decisionstakes the same requests and the same explicit public model ID. It answers a failed question in place, where/v1/systemoneanswers the request as a whole, as System One does.- Native discovery uses
/v1/systemone/models./v1/modelsremains Chat discovery, and in Engine mode it also lists the System One models asmodels: [{name, description, release_date}].
The worker's other APIs are separate; see the HTTP API reference. Compressed bodies, multipart image uploads, assets, Box, track and long context are in System One compatibility.
4. Use it from the Router
The Router runs models for you. Name the model as a deployment with
provider: model_runtime, then ask it questions in a systemone signal. Save
this as config.yaml, replacing host.docker.internal:8000 with an
OpenAI-compatible backend that answers your users:
version: v0.5
listeners:
- name: http
address: 0.0.0.0
port: 8899
apis:
chat_completions: {}
systemone:
models: [vllm-sr/vela3-fast]
providers:
defaults:
model: answer-model
models:
- name: answer-model
backend_refs:
- name: answer
endpoint: host.docker.internal:8000
protocol: http
recipes:
- name: default
signals:
systemone:
- name: needs_reasoning
deployment: primary
question:
type: noul
instructions: Does answering this request need multi-step reasoning?
predicate:
gte: 0.7
decisions:
- name: think-first
priority: 100
rules:
operator: AND
on_unknown: no_match
conditions:
- type: systemone
name: needs_reasoning
modelRefs:
- model: answer-model
use_reasoning: true
- name: default-route
priority: 1
rules:
operator: AND
conditions: []
modelRefs:
- model: answer-model
use_reasoning: false
global:
model_catalog:
deployments:
primary:
provider: model_runtime
artifact: vllm-sr/vela3-fast
device: cpu
Validate the file, then restart in Router mode using this configuration:
vllm-sr config validate --config config.yaml
vllm-sr serve --config config.yaml --replace-active-config
--replace-active-config applies the file you just wrote over any
configuration saved for this directory; later restarts can omit it to retain
Dashboard edits. The primary deployment answers both the routing question and
direct System One requests, and the listener explicitly publishes its native
model name.
Send a request through the Router and look at which route it took:
curl -s -D - -o /dev/null localhost:8899/v1/chat/completions \
-H 'content-type: application/json' -H 'x-vsr-debug: true' \
-d '{"model": "vllm-sr/auto", "messages": [{"role": "user", "content": "Plan a three-step proof that there are infinitely many primes."}]}' \
| grep -i '^x-vsr-'
x-vsr-selected-decision names the route, and the signals member of
x-vsr-trace lists the systemone signals that matched.
If the runtime restarts later, the signal is unknown until the model is back,
and on_unknown: no_match sends requests to default-route meanwhile.
Router and Engine mode share one managed instance. To attach an independently
operated worker instead, use an explicit endpoint and model; see
Connect the Router.
Next steps
- Choose a model, size and hardware
- Turn on a built-in feature: the application signals, your own questions, embeddings for recall
- Connect the Router and place and scale workers: GPUs, Kubernetes, sharing a runtime
- Troubleshooting