Release prep: ensemble-aware CLI/server, clean-install validation, compact Run locally section and local inference doc
5f15b97 verified |
Download README.md from omida-ai/pluto-1: direct link, hf CLI and curl.
- Browser
- Download file 8.86 kB
-
https://huggingface.co/omida-ai/pluto-1/resolve/main/README.md
- Command line
-
hf download hf://omida-ai/pluto-1/README.md
-
curl -L -o README.md https://huggingface.co/omida-ai/pluto-1/resolve/main/README.md
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. | |
|  | |
|  | |
|  | |
|  | |
| *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. | |