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.

![Accuracy](assets/benchmark_accuracy.png)

![Accuracy vs latency](assets/accuracy_vs_latency.png)

![Calibration](assets/calibration.png)

![Ensemble payoff](assets/per_kind.png)

*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

![Architecture](assets/architecture.png)

```

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.