--- 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.