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
git clone https://huggingface.co/omida-ai/pluto-1
pip install -e pluto-1/code
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.
escalateis 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.
# 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
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.
License and commercial use
Pluto-1 is released for non-commercial use under CC 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
@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.
- Downloads last month
- 21




