Feature Extraction
Transformers
Safetensors
lemondecider_decision
decision-engine
typed-decision
choice
classification
Merge
qwen3.5
custom_code
Instructions to use inclusionAI/LemonDecider with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use inclusionAI/LemonDecider with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("feature-extraction", model="inclusionAI/LemonDecider", trust_remote_code=True)# pip install -U transformers accelerate # Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("inclusionAI/LemonDecider", trust_remote_code=True, device_map="auto") - Notebooks
- Google Colab
- Kaggle
File size: 14,189 Bytes
31a2f05 2e78993 45a708b 31a2f05 2e78993 9a2f41d 2e78993 d8b3ed5 45a708b 2e78993 45a708b 2e78993 45a708b 2e78993 45a708b 2e78993 45a708b 2e78993 45a708b 2e78993 45a708b 2e78993 45a708b 2e78993 45a708b 2e78993 45a708b 2e78993 45a708b d8b3ed5 2e78993 d8b3ed5 45a708b d8b3ed5 45a708b 2e78993 45a708b 2e78993 45a708b 2e78993 45a708b 2e78993 45a708b 2e78993 45a708b 2e78993 d8b3ed5 2e78993 45a708b 2e78993 45a708b 2e78993 45a708b 2e78993 45a708b 2e78993 45a708b 2e78993 9a2f41d 45a708b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 | ---
license: apache-2.0
base_model: Qwen/Qwen3.5-4B
library_name: transformers
tags:
- decision-engine
- typed-decision
- choice
- classification
- merge
- qwen3.5
---
# LemonDecider 4B
**Model ID:** `lemondecider-4b-20261015-v2`
**Base model:** `Qwen/Qwen3.5-4B`
LemonDecider 4B is a typed decision engine: it reads a state and a question with a
list of options, runs **one forward pass**, and returns a probability distribution
over the options (choice / noul questions) or an ordered rating (score questions).
No text is generated and no input is ever truncated.
## Model description
| Property | Value |
|---|---|
| Architecture | Qwen3.5-4B-class hybrid backbone (linear-attention + periodic full-attention) + a bias-free **255-way readout** (`LemonDeciderReadout`, FP32 precision island), loaded through `modeling_lemondecider.LemonDeciderForDecisionClassification` (`trust_remote_code`) |
| `model_type` / protocol | `lemondecider_decision` / `lemondecider-v1` |
| Attention | `noncausal_full_attention` β all-attend prompt for the periodic full-attention layers, causal recurrence for the Gated DeltaNet layers, SDPA only |
| Pooling / temperature | last-token pooling, temperature 1.0 (uncalibrated) |
| Max input length | **262,144 tokens (256K context)** β the backbone's full position window; requests over the limit are rejected, never cut |
| Precision | backbone BF16, readout FP32 (readout GEMM executed in FP32 under autocast) |
| Serialized tensors | 724 (all vision tensors included; vision stem executed as a matrix-product patch projection) |
| Runtime | in-package Python runtime (`modeling_lemondecider.py`, `configuration_lemondecider.py`, `contract.py`, `decision_utils.py`, `model.py`), validated with transformers 5.17, flash-linear-attention 0.5.2, PyTorch SDPA |
## Training
LemonDecider 4B was fine-tuned (SFT) from the common Qwen3.5-4B initialization on
**more than 700,000 public decision/QA rows** collected by the project (about 805k
train rows from ~818k collected rows incl. dev/test splits). Every source is
public and permissive; no benchmark or evaluation data was used for training. The
released weights combine two independent SFT runs over this corpus (weight-level
combination, no training after that).
**Question formats:** choice (up to 255 options), noul (no/yes) and score (ordinal
ratings); some multimodal rows are image questions over locally registered
project-generated charts, and roughly 600k train rows carry teacher-style soft
label distributions.
**Data categories:**
- service decision arcs β user-intent routing and case triage (refund, logistics,
account actions), policy and adequacy judgment;
- language judgment β sentiment, sarcasm, NLI/factuality and paraphrase-style checks;
- knowledge and reasoning QA β multiple-choice knowledge, multi-hop reasoning,
arithmetic and math word problems;
- retrieval and selection β document and tabular retrieval, product/route selection;
- multimodal reading β chart/graph and small-graphic question answering;
- calibration-style rows β probability and ordinal confidence judgments.
**Training parameters** (from the training receipts):
- distributed FSDP on 64 GPUs (4 nodes x 16 GPUs);
- effective batch 256 rows per step, learning rate 2e-06;
- two independent runs: 2,446 steps (sequence cap 8,192) and 700 steps (sequence
cap 2,048);
- objective `valid_option_soft_cross_entropy` over valid options only
(`noul_tie_policy = true_on_equal_probability`, `choice_permutation =
global-reference`, vision tower trainable);
- precision policy fp32-master-bf16; export dtype BF16, readout FP32, temperature 1.0.
## Package artifacts
### Weight files
| File | Size | SHA-256 |
|---|---:|---|
| `model-00001-of-00002.safetensors` | 4,973,336,472 | `27b985a94ccf63aace88b2ff67c1ea0871ce745a49b22b9cda43ea4d32297d8a` |
| `model-00002-of-00002.safetensors` | 4,107,897,400 | `81f61ce9daead4be7e3d950cf027f63f16f757a176407f020406190dc2068bc0` |
| `tokenizer.json` | 19,989,492 | `6f32ce20dc35f57a7f9ad1eac03525bd7d30f9df8cea6507e958279cc3657706` |
| `model.safetensors.index.json` | 68,426 | `bda09c55c0152d7a6fb2db6898aea70e728dc528df6f9c026cefb0bd5d1d673b` |
## Evaluation results
Both evaluations ran on 2026-10-15 on self-hosted compute (64 GPUs) through the
model's own HTTP `/v1/systemone` wire contract. **No result here
is an official leaderboard or board submission**; the harnesses enforce no-truncation,
no option filtering, one fixed rendering, and coverage-adjusted scoring. Latency is
per-request server wall time on internal accelerators and is not the sub-1-second
latency-admission measurement of any external board.
Evidence directories keep the run names under which they were created during the v1
execution (`lemondeeder-eval-20261015/`); no shipped artifact in the model packages
carries that legacy spelling.
### 1) Decision Index, edition 0.3 β FULL public suite (complete run)
βοΈ 140,620 requests issued across 64 shards (frozen suite-0.3 staging, official
scorer, coverage-adjusted, chance-corrected) β **140,178 scored requests,
`complete: true`**.
| Headline | Value |
|---|---:|
| **Decision Index (public 0.3)** | **50.31** |
| Raw index | 62.47 |
| Median / mean / p95 request latency | 50.4 ms / 205.6 ms / 756.2 ms |
The public index averages the native, chance-corrected, coverage-adjusted score of
37 benchmarks in five areas with fixed weights (knowledge 25.8%, language 25.8%,
retrieval 20.0%, tools 18.3%, arts 10%); inside an area, β
gold benchmarks weigh
1.2 and the rest 1.0. Unanswered counts as wrong.
#### Per-area scores
| Area | Raw | Skill (chance-corrected) | Coverage | Benchmarks |
|---|---:|---:|---:|---:|
| Knowledge & Reasoning | 0.4895 | 0.3395 | 0.9998 | 11 |
| Language Understanding | 0.6962 | 0.5751 | 1.0000 | 9 |
| Retrieval & Classification | 0.6661 | 0.5494 | 1.0000 | 6 |
| Tools & Automation | 0.7108 | 0.6741 | 0.9986 | 5 |
| Arts & Human Taste | 0.5487 | 0.3340 | 0.9978 | 6 |
#### Per-benchmark native scores (β
= counted in the public index)
| # | Benchmark | Metric | Requests | Score | Skill | Cov. |
|---:|---|---|---:|---:|---:|---:|
| 1 | BFCL β
| case exact accuracy | 1,694 | 0.9416 | 0.9211 | 1.000 |
| 2 | ToolRet β
| nDCG@10 | 685 | 0.6540 | 0.5982 | 0.997 |
| 3 | API-Bank β
| accuracy | 508 | 0.8320 | 0.8254 | 0.996 |
| 4 | BANKING77 β
| macro-F1 | 3,080 | 0.7418 | 0.7385 | 1.000 |
| 5 | CLINC150+OOS β
| macro-F1 | 5,500 | 0.8634 | 0.8626 | 1.000 |
| 6 | RouterBench | selected quality | 10,000 | 0.7746 | 0.4715 | 1.000 |
| 9 | Home appliance simulator β
| case exact accuracy | 88 | 0.4091 | 0.4091 | 1.000 |
| 10 | SGD/SGD-X | macro-F1 | 2,500 | 0.4360 | 0.0616 | 1.000 |
| 11 | ContractNLI β
| macro-F1 | 123 | 0.7389 | 0.6224 | 1.000 |
| 12 | ANLI β
| macro-F1 | 3,200 | 0.6729 | 0.5100 | 1.000 |
| 20 | BPoMP β
| accuracy | 5,000 | 0.8718 | 0.7525 | 1.000 |
| 21 | Humicroedit β
| accuracy | 2,628 | 0.6111 | 0.2222 | 1.000 |
| 22 | POP909-CL β
| accuracy | 2,000 | 0.1890 | 0.1701 | 0.987 |
| 23 | cfcolor β
| accuracy | 5,000 | 0.6088 | 0.1827 | 1.000 |
| 24 | MMLU | accuracy | 14,033 | 0.7914 | 0.7219 | 1.000 |
| 25 | GPQA Diamond β
| accuracy | 196 | 0.4286 | 0.2381 | 1.000 |
| 26 | ARC-Easy | accuracy | 2,376 | 0.9836 | 0.9781 | 1.000 |
| 27 | ARC-Challenge | accuracy | 1,172 | 0.9548 | 0.9397 | 1.000 |
| 28 | WinoGrande β
| accuracy | 1,267 | 0.8019 | 0.6038 | 1.000 |
| 29 | HellaSwag β
| accuracy | 10,042 | 0.8520 | 0.8027 | 1.000 |
| 30 | GSM8K β
| accuracy | 2,638 | 0.5716 | 0.4866 | 1.000 |
| 31 | ChessBench β
| accuracy | 5,000 | 0.1384 | 0.0616 | 1.000 |
| 32 | MuSR β
| accuracy | 752 | 0.5731 | 0.3213 | 1.000 |
| 33 | SATA-Bench β
| case exact accuracy | 1,650 | 0.1539 | 0.1427 | 1.000 |
| 34 | SimpleBench | accuracy | 10 | 0.1000 | 0.0000 | 1.000 |
| 36 | BRIGHT β
| nDCG@10 | 220 | 0.4444 | 0.3714 | 1.000 |
| 37 | Amazon ESCI β
| macro-F1 | 5,000 | 0.4827 | 0.3511 | 1.000 |
| 38 | ACOS β
| per-review F1 | 1,565 | 0.1970 | 0.1713 | 1.000 |
| 39 | FinEntity β
| macro-F1 | 979 | 0.9381 | 0.9090 | 1.000 |
| 40 | iSarcasmEval β
| Sarcasm F1 (track A, EN) | 4,600 | 0.5552 | 0.4278 | 1.000 |
| 41 | VAST β
| macro-F1 | 3,006 | 0.7251 | 0.5876 | 1.000 |
| 42 | NLI4CT β
| macro-F1 | 5,500 | 0.7997 | 0.6103 | 1.000 |
| 43 | CRUXEval β
| accuracy | 570 | 0.6035 | 0.3709 | 1.000 |
| 44 | CLadder β
| accuracy | 5,000 | 0.6846 | 0.3692 | 1.000 |
| 45 | HLE β
| accuracy | 501 | 0.1140 | 0.0000 | 0.998 |
| 50 | Habermas Machine β
| accuracy | 1,676 | 0.4063 | 0.1384 | 1.000 |
| 56 | PhishNChips β
| phishing-decision accuracy | 2,000 | 0.7315 | 0.4630 | 1.000 |
| 57 | MMLU-Pro β
| accuracy | 12,032 | 0.5780 | 0.5254 | 1.000 |
| 58 | BBH fixed-option tasks β
| accuracy | 5,507 | 0.7018 | 0.5678 | 1.000 |
| 59 | RAGTruth β
| F1 on hallucinated class | 2,700 | 0.7601 | 0.5026 | 1.000 |
| 61 | HoVer β
| claim-verification accuracy | 4,000 | 0.7225 | 0.4450 | 1.000 |
| 62 | When2Call MCQ β
| accuracy | 3,652 | 0.6528 | 0.5371 | 1.000 |
| 64 | New Yorker caption matching β
| accuracy | 528 | 0.6307 | 0.5384 | 1.000 |
Evidence: `lemondeeder-eval-20261015/di/runs/20261015-lemondecider-4b-di-full-0.3/`
(64 shard dirs + `merged/results.jsonl` + official `scores.json`, `index.json`,
`benchmark-summary.json`).
### 2) JevBench public-231 (typed-decision public sanity suite)
231/231 items attempted and scorable, **complete**, native probability output,
dataset hash-pinned (`dc3995d8β¦de51`, jevbench-v1 harness, typesafe adapter).
| Metric | Value |
|---|---:|
| **Accuracy** | **83.12%** (192/231) |
| Macro accuracy | 84.55% |
| Brier (mean) | 0.2392 |
| Ordinal MAE (score items) | 0.1207 |
| Paraphrase consistency | 36/36 pairs agree (100%) |
| Coverage / operational success / schema validity | 1.0 / 1.0 / 1.0 (strict 1.0) |
| Latency p50 / p95 | 47.1 ms / 340.3 ms |
#### Per-family results
| Family | n | Accuracy | Brier |
|---|---:|---:|---:|
| adequacy | 12 | 1.000 | 0.051 |
| adversarial | 6 | 1.000 | 0.002 |
| ambiguous | 7 | 0.571 | 0.661 |
| extraction | 24 | 1.000 | 0.000 |
| fact | 12 | 1.000 | 0.000 |
| intent | 24 | 1.000 | 0.001 |
| judge_hard | 17 | 0.647 | 0.499 |
| long_policy | 19 | 0.579 | 0.585 |
| multi_hop | 18 | 0.722 | 0.481 |
| ordinal | 12 | 1.000 | 0.000 |
| policy | 12 | 1.000 | 0.007 |
| probability | 10 | 0.800 | 0.338 |
| routing | 12 | 1.000 | 0.013 |
| routing_hard | 5 | 1.000 | 0.000 |
| temporal_numeric | 15 | 0.067 | 1.006 |
| tool_selection | 12 | 1.000 | 0.000 |
| tradeoff | 6 | 0.833 | 0.450 |
| trap | 8 | 1.000 | 0.038 |
Known weak spots on this suite: long-policy judgement, ambiguous states, hard-judge
calls, and especially **temporal/numeric reasoning (6.7%)**, which the model inherits
from its parents' training data.
Evidence: `lemondeeder-eval-20261015/jevbench/20261015-lemondecider-4b-jevbench-public231/`
(`results.jsonl`, `ledger.jsonl`, `public-summary.json`, 5-item smoke gate passed).
## Usage
Dependencies: `transformers==5.17.0` (needs the Qwen3.5 hybrid classes),
`flash-linear-attention==0.5.2`, `pillow`, `torch` with SDPA.
This package honours a single runtime env var: `LEMONDECIDER_CUDNN_SDPA=1`
(keep the cuDNN SDPA backend on CUDA; defaults are kept on CPU/ROCm).
```python
import sys, torch
from transformers import AutoModel
ckpt = "lemondecider-4b-20261015-v2" # local package directory
sys.path.insert(0, ckpt) # make the in-package runtime importable
from decision_utils import load_processor, predict_batch
model = AutoModel.from_pretrained(
ckpt, trust_remote_code=True, local_files_only=True,
dtype=torch.bfloat16, device_map="cuda:0", attn_implementation="sdpa",
).eval()
processor = load_processor(ckpt)
rows = [{
"state": "The user asks how to return a damaged order placed last week.",
"question": {"type": "choice",
"instructions": "Pick the best next action",
"criteria": {"refund": "Process a refund",
"replace": "Send a replacement",
"escalate": "Escalate to a human"}},
}]
answers = predict_batch(model, processor, rows)
print(answers["answers"][0]) # choice, probabilities over the 3 options, confidence
```
CLI from inside the package: `python3 model.py --checkpoint . --device cuda:0 --input rows.json`.
Batching: each `predict_batch` call runs ONE forward pass over all the rows you pass
(inputs are left-padded to the longest prompt); the HTTP serving bridge chunks its
requests at 8 questions per forward pass. Requests over the 262,144-token
`max_input_length` limit are rejected with the limit named (HTTP 422 in server
wrappers) β nothing is truncated.
## Intended use & limitations
- Intended: typed decision endpoints β routing, intent classification, policy/
adequacy checks, structured QA over explicit option lists, pipeline control.
- The model emits **option probabilities only**; it is not a generative assistant.
- Ratings (`score` items) are supported through the same readout; they inherit the
parents' weak arithmetic/timing behavior (see the temporal_numeric row above).
- Trained on public data sources assembled by the project; no evaluation rows were
used for training (corpus admission contracts enforced this).
- Uncalibrated: temperature 1.0, no post-hoc calibration fitted. The 6 low-confidence
bins in the JevBench calibration table show mild over-confidence in the 0.6β0.8
confidence range.
## License
- `LICENSE` β Apache-2.0 text as preserved from the parent checkpoint lineage
(base: Qwen/Qwen3.5-4B, inherit the base model's terms).
- `LICENSE.code` β MIT for runtime/server code components adapted from upstream.
- No benchmark score is claimed by this package beyond the reproducible evidence
files listed above; the Decision Index owner reserves 80% of its Full score for
private tests, so the 50.31 public index is not a board submission.
## Acknowledgements
Built by the Lemon project. Runtime and server components build on Apache-2.0
and MIT upstream code (see LICENSE files). Base backbone by the Qwen team. |