Decisions API¶
vLLM provides a text-only implementation of OpenAI's
POST /v1/decisions
API. Start a supported model:
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY")
decision = client.decisions.create(
model="Qwen/Qwen3-0.6B",
input="The package arrived with a broken screen.",
questions=[
{
"type": "predicate",
"name": "damaged",
"instructions": "Does the customer report a damaged item?",
},
{
"type": "choice",
"name": "department",
"instructions": "Which department should handle this complaint?",
"choices": [{"value": "returns"}, {"value": "billing"}],
},
{
"type": "score",
"instructions": "How severe is the damage?",
"levels": [{"label": "cosmetic"}, {"label": "broken"}],
},
],
)
print(decision.answers)
Use OpenAI Python SDK 3.26.0 or newer for client.decisions.create.
input accepts a string or an array of user messages with string content or
input_text parts. Answers retain question order and echo name, including
null for unnamed questions. Choice values preserve strings and booleans.
Scores are probability-weighted averages of zero-based level indices.
The request contract follows the OpenAI OpenAPI schemas retrieved on
October 7, 2026. This MVP supports 1–64 questions, 2–26 choices, and 2–10 score
levels. Upstream permits 200 questions and 255 choices; this backend returns
a 400 when either model limit is exceeded.
The optional safety_identifier is caller metadata, available in request
body logging with --enable-log-requests and DEBUG logging; it does not
authenticate callers.
Implementation and limits¶
This MVP uses the same autoregressive label-reading backend as structured decisions. It supports the same Qwen architectures and logprob modes; other models return 501. Each question reads one token, using A–Z labels checked against the tokenizer at startup. Usage reports the actual prompt and output tokens across these reads, including prefix-cache counters.
Probabilities are normalized over the supplied options. confidence is the
winning label's probability over the full vocabulary; it is not calibrated
to OpenAI's models. Thinking is disabled for these reads.
Image inputs, other message roles, tools, streaming, and per-question refusal
scoring are outside this MVP. Unsupported request fields and input types are
rejected. The /v1/systemone endpoint retains its existing request format and
--enable-structured-decisions flag.
Winnow checkpoints¶
Winnow-trained Gemma4 checkpoints use a fixed turn serialization and candidate labels rather than the generic chat prompt. Opt in explicitly:
vllm serve /path/to/winnow-checkpoint \
--hf-overrides '{"decision_read_strategy":"winnow","decision_temperature":1.0}' \
--logprobs-mode raw_logprobs --enable-prefix-caching
This uses the shared Decisions API and label-read backend. Each question is scheduled independently with the same state prefix. Request-specific chat instructions or chat-template overrides are rejected. The upstream limits of 64 questions and 26 options apply. The API's confidence and response schemas remain unchanged; they differ from Ollaya's Jev wire responses.
decision_temperature divides candidate log probabilities before their
conditional softmax. Use 1 when the required scale is folded into the exported
weights. An additional validation-fitted temperature in calibration.json is
external: set decision_temperature to that value for that calibrated variant.
Temperature changes conditional answer probabilities; confidence retains the
winning label's original full-vocabulary probability from the engine read.
Preserve the exported
Gemma logit-softcap configuration. Loading an unrelated Gemma4 checkpoint does
not make it Winnow-trained.
The checkpoint must be compatible with the installed engine's model and quantization loaders. This strategy does not add or change model loaders.
The Decisions API accepts text. For a checkpoint deployment that interprets
input as a JSON state, set decision_state_format to json in --hf-overrides
and send a JSON document as the input string. The strategy parses that document
before applying Winnow's canonical state serialization. This preserves object
and array states when comparing against Ollaya. The default text mode treats
input literally. Invalid JSON in json mode fails before inference.