OD-1 is an open System One decision model: give it a state (text or JSON) and typed questions (choice, noul = yes/no, score = ordinal) and it returns every answer from one forward pass, with full probability distributions including an explicit NOT_ANSWERABLE outcome. The request/response shape follows the Jev / TypeSafe /v1/systemone wire format.
Backbone: Qwen/Qwen3.5-0.8B (Apache-2.0) with typed answer heads read at marker tokens, early-exit heads (layers 6/12/18), and a CLM-style contrastive shortlist head for questions with more than 24 options. Trained with SFT + distillation from Qwen3.5-27B-FP8 (never a compared system), RLCD-style proper-score calibration, an abstention utility, option-order consistency and three adversarial hard-negative rounds; see sources.csv for every training dataset, revision and license.
Intended use and an important limitation
Use it for fast decisions on in-domain tasks, i.e. tasks like the ones in its training mix (intent/routing, yes/no checks, NLI, ratings, tool selection among offered functions, policy checks), or fine-tune it on your own labelled decisions. It is not a reliable zero-shot model for unfamiliar tasks:
- On unfamiliar tasks it over-predicts
NOT_ANSWERABLE (on an out-of-domain validation set of TREC, 20 Newsgroups, Enron spam and SUBJ it predicted NOT_ANSWERABLE 0.396 of the time; accuracy 0.339, 0.463 when forced to pick a real answer).
- The 0.8B backbone itself is the limit: the untouched Qwen3.5-0.8B scores 0.458 on the same set (the untouched 4B scores 0.805). A 4B OD-1 is in preparation for zero-shot use.
- Recommended: treat
NOT_ANSWERABLE as a signal only when its probability is very high, or pick the best real answer (argmax over the options).
Results on held-out test sets
All systems answered the same fixed samples (≤ 2,000 decisions per set, seed 0; typed-decisions: all 2,000 decisions of its test split) on 2026-09-25. Baselines were called through one shared interface: each question as one choice over its options (2–24 options), so sets with more options are n/a for them. Jev 1.13 = jev-1.13.0; Laya = convaiinnovations/laya (base and typed-decisions subfolder). Numbers are accuracy.
| test set |
this model |
Jev 1.13 |
Laya |
Laya typed-decisions |
Tev1-4B |
CLM-8B |
| typed_decisions |
0.275 (n=2000) |
0.741 |
0.353 |
0.737 |
0.690 |
0.393 |
| ag_news |
0.128 (n=2000) |
0.882 |
0.924 |
0.922 |
0.886 |
0.354 |
| dair_emotion |
0.104 (n=2000) |
0.595 |
0.597 |
0.603 |
0.583 |
0.281 |
| sst5 |
0.326 (n=2000) |
0.579 |
0.341 |
0.463 |
0.533 |
0.273 |
| banking77 |
0.382 (n=2000) |
n/a |
n/a |
n/a |
n/a |
n/a |
| massive_en |
0.451 (n=2000) |
n/a |
n/a |
n/a |
n/a |
n/a |
| bfcl_native |
0.649 (n=1252) |
0.975 |
0.679 |
0.847 |
0.954 |
0.694 |
| bfcl_pool24 |
0.568 (n=1909) |
0.969 |
0.600 |
0.741 |
0.950 |
0.625 |
| bfcl_irrelevance |
0.076 (n=1101) |
0.702 |
0.788 |
0.390 |
0.701 |
0.661 |
| bfcl_pool100 |
0.503 (n=1909) |
n/a |
n/a |
n/a |
n/a |
n/a |
| bfcl_pool1000 |
0.281 (n=1909) |
n/a |
n/a |
n/a |
n/a |
n/a |
| adversarial |
0.919 (n=2000) |
0.832 |
0.619 |
0.628 |
0.793 |
0.449 |
adversarial = our held-out set of teacher-verified paraphrases, extra distractors and removed answers built from records never trained on (its NOT_ANSWERABLE golds favour OD-1, which is the only system with that outcome). The low scores on ag_news, dair_emotion, bfcl_irrelevance and typed_decisions are the NOT_ANSWERABLE over-prediction described above.
Speed (H100, batch-1 requests, CUDA graphs, p50 ms per request)
| state / questions |
this model |
Laya typed-decisions (all questions in one call) |
| short (≤ 64 tokens) / 1 |
5.7 |
15.9 |
| short (≤ 64 tokens) / 5 |
10.8 |
17.9 |
| short (≤ 64 tokens) / 20 |
33.8 |
21.4 |
| medium (200–400 tokens) / 1 |
7.8 |
16.9 |
| medium (200–400 tokens) / 5 |
24.5 |
17.7 |
| medium (200–400 tokens) / 20 |
88.8 |
41.4 |
Many questions over a long state are slower than Laya with this one-pass route (it re-reads the state per question); a read-once route is used for large requests in the next release.
Usage
pip install torch transformers huggingface_hub
from huggingface_hub import snapshot_download
path = snapshot_download('mvbalaji/od1-nano')
import sys; sys.path.insert(0, path)
from od1.model import OD1Model
m = OD1Model.load(path, dtype='bf16', device='cuda')
m.enable_cuda_graphs() # optional, GPU
answers = m.answer(state_text_or_json_string, {
'route': {'type': 'choice', 'instructions': 'Which team?', 'criteria': {'billing': 'payments', 'tech': 'bugs'}},
'refund': {'type': 'noul', 'instructions': 'Is the customer asking for a refund?'},
'urgency': {'type': 'score', 'instructions': 'How urgent?', 'criteria': ['low', 'medium', 'high']}})
Smoke-test output of example.py for this checkpoint: {"route": {"answer": "billing", "confidence": 0.849}, "refund": {"answer": 0.9754201093452173, "confidence": 0.973}, "urgency": {"answer": 2, "confidence": 0.44}}
Training data and licenses
Open datasets with licenses permitting training (see sources.csv for dataset, revision, license, split and counts), project-generated synthetic policy checks, and teacher labels from Qwen3.5-27B-FP8. Held-out evaluation datasets were never trained on; 13-gram deduplication against every test set found no leaks after filtering.
Citation
Paper in preparation (OpenDecide-1).