File size: 8,860 Bytes
5f15b97 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 | ---
license: cc-by-nc-4.0
license_name: cc-by-nc-4.0
license_link: https://creativecommons.org/licenses/by-nc/4.0/
language:
- en
library_name: pytorch
pipeline_tag: text-classification
tags:
- decision-model
- system-one
- calibrated-decisions
- typed-decisions
- choice
- noul
- score
- ensemble
- modernbert
- deberta
- pytorch
- safetensors
---
# Pluto-1
### A 333M decision model that beats 27B-class Jev 1.13 on Typed Decisions at 1/80th the size and 13x lower latency.
Pluto-1 is a dual-encoder decision model. Give it a state and typed questions; it
returns calibrated probability distributions for `choice`, `noul`, and `score`
questions. It never generates text. There is nothing to parse, nothing to retry,
and nothing to hallucinate.
Built solo on one **RTX 5060 Ti 16GB**.
**Headline:** 0.7515 accuracy on the independent Typed Decisions test split,
beating published Jev 1.13 (0.727) and Liquid d1 (0.742), at **54 ms p50** and
**332.8M parameters**. Laya-typed, measured by us on the same rows, remains 1.65
points higher on raw accuracy; Pluto-1 wins on calibration, latency, and size.
---
## The receipts
400 held-out cases / 2,000 probabilistic decisions. Higher accuracy, lower KL,
Brier, and ECE are better.
| Model | Params | Mode | Accuracy | KL | Brier | ECE | p50 |
|---|---:|---|---:|---:|---:|---:|---:|
| **Pluto-1** | **332.8M** | fitted on train | **0.7515** | **0.1183** | **0.0649** | **0.1400** | **54.2 ms** |
| Pluto-1 Air (ablation) | 149.1M | fitted on train | 0.7275 | 0.1391 | 0.0765 | 0.1067 | 26.9 ms |
| Laya-typed | 421.3M | fitted on train | **0.7680** | 0.1171 | 0.0615 | 0.2152 | 66.2 ms |
| Jev 1.13 | ~27B | zero-shot (published) | 0.727 | 1.442 | 0.148 | 0.144 | ~710 ms |
| Liquid d1 | ~3B | zero-shot (published) | 0.742 | 0.475 | 0.155 | 0.124 | ~525 ms |
**What this means**
- **Beats Jev 1.13 and d1 on accuracy.** 1/80th Jev's size, ~13x lower latency.
- **Within 1.65 points of Laya-typed.** 35% lower ECE, 18% lower latency, 21% fewer parameters.
- **Calibration is the point.** 0.140 ECE on 2,000 decisions; 0.107 for the 149M single.
- **No token bill at inference.** One encoder pass per specialist, no generated tokens.




*The per-primitive chart is an ablation against the 149M single checkpoint; that
single checkpoint is not included in this repository.*
### Comparison hygiene
Pluto-1 and Laya-typed are fitted on the benchmark's `train` split. Jev 1.13 and
d1 numbers are published zero-shot values. Laya-typed was run by us with
`laya 0.4.17` on the same test rows and scored with the public metric definition.
This is a descriptive comparison, not a controlled head-to-head across every
system and every task. The benchmark `test` split was never used for training,
early stopping, model selection, or calibration.
---
## Architecture

```
state + typed questions
|
ModernBERT specialist (149M) DeBERTa specialist (184M)
| |
+-------- calibrated 0.5/0.5 ------+
|
choice / noul / score distributions
+ confidence + escalate
```
- Two specialist encoders, each with 13 per-question heads.
- The ModernBERT branch is initialized from the general Pluto-149M backbone.
- The DeBERTa-v3-base branch adds architectural diversity.
- Probabilities are averaged and temperature-calibrated per primitive.
- One case = five questions, one pass through each encoder.
- No autoregressive decoding.
---
## Quickstart
```bash
git clone https://huggingface.co/omida-ai/pluto-1
pip install -e pluto-1/code
```
```python
import json
from pluto.ensemble import EnsembleEngine
engine = EnsembleEngine("pluto-1") # or EnsembleEngine("omida-ai/pluto-1")
state = json.dumps({
"agent": {"autonomy": "checkpointed", "model": "internal-agent-v4"},
"task": "Delete personal data for the accounts in the erasure queue.",
"trace_summary": {"steps": 7, "tool_errors": 1, "irreversible_actions": 0},
})
questions = {
"action": {
"type": "choice",
"instructions": "What should the observability system do with this trace?",
"criteria": {
"continue": "Let the agent proceed without interruption.",
"human_review": "Queue this trace for a human to review.",
"observe": "Keep running, but flag the trace for later sampling.",
"stop": "Halt the agent now.",
},
},
"needs_review": {
"type": "noul",
"instructions": "This trace requires human review.",
},
"risk": {
"type": "score",
"instructions": "How risky was the agent's behaviour in this trace?",
"criteria": ["Benign", "Low", "Moderate", "High"],
},
}
result = engine.predict(state, questions)
print(result["answers"]["action"]["choice"])
print(result["answers"]["needs_review"]["noul"])
print(result["answers"]["risk"]["score"])
print(result["escalate"])
```
Supported question names: `action`, `needs_review`, `outcome`, `risk`, `urgency`,
`category`, `churn_risk`, `needs_human`, `discrepancy_severity`, `duplicate`,
`matches_order`, `credential_compromise`, `severity`, `true_positive`.
This is a **specialist** for the Typed Decisions workflows. It is not a general
chat model and does not accept arbitrary new question names.
---
## Training
- 1,200 Typed Decisions training cases. 1,080 fit / 60 validation / 60 calibration.
- 5,400 fitted decisions, 13 per-question heads, 8 epochs, freeze 8 backbone layers.
- ModernBERT-base 149.1M + DeBERTa-v3-base 183.8M, 0.5/0.5 probability average.
- Per-primitive temperatures fitted on the 60-case calibration split.
- Test split untouched until final scoring.
- General backbone initialized from Pluto-149M, trained on 655,806 calibrated
decisions from `SargeDev/jev-distill-corpus-v3`.
Data and base-model attribution is in `NOTICE`.
---
## What Pluto-1 is not
- It is not a reasoning model. It does not compete on GPQA, MMLU-Pro, HLE, or
open-ended generation.
- It is not Laya-typed on raw accuracy: Laya-typed is 1.65 points higher on this
test split. Pluto-1 wins calibration, latency, and parameter count.
- It is not a general arbitrary-schema model. The 13 question names are fixed.
- It has no certified risk-controlled abstention gate. `escalate` is a useful
confidence signal, not a guarantee. Validate thresholds on your data.
- It is English-only.
- It is synthetic-benchmark-validated. Production reliability requires production
evaluation.
---
## Run locally
Verified with the repository runtime on CPU and CUDA.
```bash
# Set HF_TOKEN in your environment while this repository is private.
pip install huggingface_hub
hf download omida-ai/pluto-1 --local-dir pluto-1
pip install -e "pluto-1/code[serve]"
pluto --model pluto-1 info
```
```python
from pluto.ensemble import EnsembleEngine
engine = EnsembleEngine("pluto-1")
result = engine.predict(
"Invoice #4411 was charged twice.",
{
"action": {"type": "choice", "instructions": "What should happen?", "criteria": {"continue": "Proceed.", "human_review": "Escalate.", "stop": "Stop."}},
"needs_review": {"type": "noul", "instructions": "Requires review."},
"urgency": {"type": "score", "instructions": "How urgent?", "criteria": ["low", "medium", "high"]},
},
)
print(result["answers"])
```
Full CPU, CUDA, CLI, and HTTP instructions: [docs/LOCAL_INFERENCE.md](docs/LOCAL_INFERENCE.md).
## License and commercial use
Pluto-1 is released for **non-commercial** use under
[CC BY-NC 4.0](https://creativecommons.org/licenses/by-nc/4.0/). You can use,
modify, and build non-commercial derivatives with attribution.
**Commercial use requires a separate license from Omida AI.** Hosted APIs, paid
products, internal business operations, consulting deliverables, and paid
redistribution are not permitted under CC BY-NC 4.0.
See `COMMERCIAL_LICENSE.md` for the commercial licensing path.
The runtime code under `code/` is Apache 2.0; that does not grant commercial
rights to the model weights. Upstream components remain under their original
licenses (see `NOTICE`).
---
## Citation
```bibtex
@misc{omida2026pluto1,
title = {Pluto-1: A Compact Calibrated Decision Model},
author = {Omida AI},
year = {2026},
url = {https://huggingface.co/omida-ai/pluto-1}
}
```
Built by **Omida AI** on one 16GB consumer GPU.
|