pplx-decider
3 TagsUpdated Apache-2.0by Perplexity AI
Perplexity's decision model: Qwen3.5-4B distilled from its 27B decision models, with a readout over 255 answer codes. Every question of a request shares one sequence and reads the whole request, and the probabilities are calibrated with Perplexity's temperature. Up to 255 options.
ollaya run pplx-decider --preset triage "I was charged twice for my subscription this month and want a refund."curl http://localhost:11435/api/decide \
-H "Content-Type: application/json" \
-d '{
"model": "pplx-decider",
"state": "I was charged twice for my subscription this month and want a refund.",
"questions": {
"department": {
"type": "choice",
"instructions": "Which team should handle this?",
"criteria": {
"billing": "Payments, invoices and refunds",
"technical": "Bugs, errors and outages",
"account": "Login, profile and settings"
}
},
"refund": {
"type": "noul",
"instructions": "Is the customer asking for a refund?"
}
}
}'# Already using a TypeSafe SDK? Set TYPESAFE_BASE_URL=http://localhost:11435 instead.
import requests
response = requests.post(
"http://localhost:11435/api/decide",
json={
"model": "pplx-decider",
"state": "I was charged twice for my subscription this month and want a refund.",
"questions": {
"department": {
"type": "choice",
"instructions": "Which team should handle this?",
"criteria": {
"billing": "Payments, invoices and refunds",
"technical": "Bugs, errors and outages",
"account": "Login, profile and settings"
}
},
"refund": {
"type": "noul",
"instructions": "Is the customer asking for a refund?"
}
}
},
)
answers = response.json()["answers"]
print(answers["department"]["choice"], answers["refund"]["noul"])const response = await fetch("http://localhost:11435/api/decide", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
model: "pplx-decider",
state: "I was charged twice for my subscription this month and want a refund.",
questions: {
department: {
type: "choice",
instructions: "Which team should handle this?",
criteria: {
billing: "Payments, invoices and refunds",
technical: "Bugs, errors and outages",
account: "Login, profile and settings"
}
},
refund: {
type: "noul",
instructions: "Is the customer asking for a refund?"
}
}
}),
});
const { answers } = await response.json();
console.log(answers.department.choice, answers.refund.noul);Models
View all| Name |
|---|
| pplx-deciderlatest9.1 GB · 8192 ctx · 100+ languages |
| pplx-decider:flash9.1 GB · 8192 ctx · 100+ languages |
| pplx-decider:flash-fp169.1 GB · 8192 ctx · 100+ languages |
Readme
pplx-decider is Perplexity's family of decision models, released under Apache-2.0 with their code in each model repository. Ollaya runs the flash model: Qwen3.5-4B post-trained by Perplexity, distilled from its 27B decision models, with a readout over 255 answer codes. A request is one sequence: the state, then every question with its options, each followed by a marker where the readout picks the answer. It never generates text.
Models
| Tag | Base | Checkpoint | Params | Decision Index 0.3 (upstream) |
|---|---|---|---|---|
pplx-decider:latest, pplx-decider:flash | Qwen3.5-4B | flash v1.2, 2026-10 (pplx-decider-flash-v1.2) | 4B | 58.9 joint, 60.1 one question per request |
The Decision Index numbers are from the model card. The 27B models (pplx-decider-v1.2, -v1.1-27b) use the same layout but need about 54 GB of memory in Ollaya's fp32 runtime, so they are not in the library.
Usage
ollaya run pplx-decider --preset triage "My order never arrived and support ignores me. Refund me today or I'm switching to your competitor."Point any TypeSafe client at http://localhost:11435 and set the model to pplx-decider.
Speed
- RTX 5090, over HTTP (Ollaya Bench): five-question triage requests take 127 ms at the median, all questions in one forward pass; 232 ms per question at the median on Bespoke Labs' public benchmark, 380 ms per five-question typed-decisions request.
Accuracy
Measured by Ollaya on an RTX 5090: 0.824 macro accuracy on Bespoke Labs' public benchmark (3,880 human-labeled questions, pooled ECE 0.016) and 0.726 on the 400 typed-decisions states. Its public score is the highest of any model Ollaya or Ollama 0.40 serves, Ollama's 27B pplx-decider included (0.816 public, 0.702 typed). See the comparison with Ollama.
How it works
- One sequence per request. Every question reads the state and the other questions: the model's full-attention layers see the whole request, not only what comes before. The model card finds the flash model more accurate with one question per request on most multi-question tasks, so send related questions together and independent ones apart.
- Calibrated. The readout logits are divided by the temperature Perplexity fitted on held-out requests (1.55).
- Weights. The files download from Hugging Face, pinned to a commit and verified by sha256, byte for byte Perplexity's. Ollaya hosts only the ONNX graph (11 MB).
- Parity. Ollaya's Rust runtime matches upstream
pplx_deciderin fp32: identical token sequences, the same rejections and the same decision on all 696 test questions, probabilities within 6.8e-6. - fp16 tag.
pplx-decider:flash-fp16computes the trunk in fp16 on NVIDIA GPUs, with the norms, the recurrent state, the attention softmax and the heads in fp32 (how): 90 ms for five questions on the RTX 5090 instead of 127 ms, 695 of 696 decisions the same aspplx-decider:flashon the parity set, and 0.726 on typed decisions. On a CPU usepplx-decider:flash.
Limits
- Context. 8,192 tokens per sequence. A longer request is split by its questions, every part keeping the whole state; a question that does not fit alone is rejected.
- Not ported. Images (upstream accepts them).