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.
This checkpoint is Nano cut to its first 12 layers, answering with the trained layer-12 exit head (no additional training). Verified to reproduce the full model's layer-12 answers (max probability difference 0.0000 over 100 dev records).
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.
Nano-lite was not separately run on the test sets. Reference numbers for its exact computation (the layer-12 exit) on a held-out split of training-distribution records never trained on:
| head |
accuracy |
| exit layer 6 |
0.723 |
| exit layer 12 (= Nano-lite) |
0.743 |
| exit layer 18 |
0.750 |
| full Nano |
0.757 |
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 |
3.4 |
15.9 |
| short (≤ 64 tokens) / 5 |
6.9 |
17.9 |
| short (≤ 64 tokens) / 20 |
21.5 |
21.4 |
| medium (200–400 tokens) / 1 |
4.9 |
16.9 |
| medium (200–400 tokens) / 5 |
15.3 |
17.7 |
| medium (200–400 tokens) / 20 |
53.0 |
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-lite')
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.824}, "refund": {"answer": 0.9790767856434824, "confidence": 0.978}, "urgency": {"answer": "NOT_ANSWERABLE", "confidence": 0.242}}
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).