pluto-1 / README.md
henryphilf's picture
Release prep: ensemble-aware CLI/server, clean-install validation, compact Run locally section and local inference doc
5f15b97 verified
|
Raw History Blame Contribute Delete
8.86 kB
---
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.