strands-decider-1.4B-v21-pruned
An unofficial, smaller build of
strands-decider-2B-hobson-v21 by Alex Nahas.
It is not a Strands release. Strands Decider answers typed questions about a state (noul, yes/no; choice, one of N
options; score, a level on an ordered scale) with calibrated probabilities; the v21 card describes the model and
its training.
What changed from v21
- v21's LoRA adapter is merged into
Qwen/Qwen3.5-2B-Basein float32, and the result is saved in bfloat16 (base revisionb1485b2fa6dfa1287294f269f5fb618e03d52d7c). - Decoder layers 14 to 22 (9 of 24) are removed. One linear block,
h + W rms_norm(h) + b(4.2M parameters), takes their place after layer 13. It was trained to match v21 (KL on the readout plus the final hidden state's squared error) on 1,516 rows built from v21's public training recipes, none of them JevBench items. Nothing else was trained: the readout head and its temperatures are v21's.
1.37B parameters (857M in the 15 layers, 509M embedding, 4M linear block, 1M head), 2.7 GB in bfloat16. v21 is 1.88B.
Results
JevBench public set (231 tasks, harness commit 1bcc55e), served at 4096 tokens:
| correct | answers changed vs v21 | mean KL vs v21 | |
|---|---|---|---|
| v21 | 176 | ||
| this build | 173 | 6 | 0.0072 |
v21 ran in bfloat16 on MLX, this build on torch (--device mps). The scores come from the same 231 public tasks that
were used to compare builds during the work, so they may read a little high.
Rescored with the JevBench v1.6.1 board rules on those 231 items only (no sealed half, so not a board number): Capability 51.7 (Intelligence 30.5, Calibration 72.9); v21 53.2 (32.3, 74.2).
Against other small decision models
| system | base | public tasks correct (of 231) | board v1.6.1 Capability |
|---|---|---|---|
| Strands Decider v21, bf16 β | Qwen3.5-2B, 1.88B | 176 (0.762) | β |
| decider-2b v11 (Mapika) β‘ | Qwen3.5-2B, 1.9B | 175 (0.758) | β |
| Decision 2B (FlyMy.AI) | MiniCPM5-2B, 2.5B | 174 (0.753) | 54.8 |
| This build β | Qwen3.5-2B, 15 layers, 1.37B | 173 (0.749) | β |
| system-one-open | Gemma 4 E2B | 169 (0.732) | β |
| decider-2b (Mapika), board entry | Qwen3.5-2B, 1.9B | 164 (0.710) | 44.6 |
| Malkuth-2B | 2B | 161 (0.697) | 47.6 |
| kev 0.6B | Qwen3-0.6B | 154 (0.667) | 36.9 |
| Open-Jev 2B | Qwen3.5-2B | 149 (0.645) | 47.7 |
| Decision Fast (FlyMy.AI) | Qwen3-0.6B | 146 (0.632) | 40.6 |
Every row is the same 231 public tasks through JevBench's typesafe adapter, in separate runs on different hardware:
β my runs (harness 1bcc55e), β‘ the Strands Decider harness (decider-2b v11, from
strands-labs/strands-decider),
the rest the board's per-system data of 27 September (results/v1.4.2.2 in
fstandhartinger/jevbench). The board now ranks by Capability over
1,500 items, half of them sealed (v1.6.1, scored 6 October). This build and v21 are not on it, and the rescore
above covers only the public items, so it does not compare with that column.
Other languages: 48 public tasks translated into each language, correct of 48:
| en | zh | ja | ko | ar | hi | uk | de | pl | |
|---|---|---|---|---|---|---|---|---|---|
| v21 | 45 | 43 | 43 | 44 | 40 | 31 | 42 | 43 | 39 |
| this build | 45 | 44 | 43 | 43 | 39 | 32 | 41 | 42 | 38 |
Held-out tests, never used to choose a build. The same weights in bfloat16 on MLX; accuracy in percent, and the gap to v21 in points with a 95% paired-bootstrap interval:
| tasks | v21 | this build | gap | |
|---|---|---|---|---|
| OpenBookQA (choice: each question bare, with its supporting fact, with an unrelated fact) | 3,000 | 64.1 | 64.5 | +0.4 [β0.4, +1.2] |
| BoolQ validation (noul) | 3,270 | 86.8 | 86.5 | β0.3 [β0.6, +0.1] |
Time per forward pass in bfloat16, torch 2.14.1 on MPS (Apple M4 Pro), batch 1, median of 10 runs after 3 warmups:
| tokens | 68 | 512 | 2,048 |
|---|---|---|---|
| v21, LoRA merged | 65 ms | 283 ms | 1,141 ms |
| this build | 41 ms | 177 ms | 711 ms |
This build takes 0.62 to 0.63 of v21's time (1.6x faster). On macOS, transformers runs its reference kernels for the Gated DeltaNet layers (flash-linear-attention and causal-conv1d need CUDA).
Use
The checkpoint needs the torso_dir loader on the small-model branch of
alxnahas/strands-decider, which no strands-decider
release has yet.
pip install "strands-decider @ git+https://github.com/alxnahas/strands-decider@c6003ecc25dc9fecf4fa6457fbc329b06434ea09"
strands-decider serve alxnahas/strands-decider-1.4B-v21-pruned --device cuda --port 8000 # POST /v1/systemone; JevBench's typesafe adapter
strands-decider ask alxnahas/strands-decider-1.4B-v21-pruned \
--state "Help! My payouts have been failing for 3 days! " \
--choice "Which team should handle this?=billing,sales,retail" \
--noul "Does this convey urgency?" \
--score "How frustrated is the writer?=calm,frustrated,depressed"
Output (--device mps):
noul_0 noul = 0.844
choice_0 -> billing (confidence 0.830)
billing 0.886
retail 0.058
sales 0.056
score_0 score = 1.07 (confidence 0.628)
0: calm 0.130
1: frustrated 0.669
2: depressed 0.201
max_length is 4096 in strands_decider_config.json; longer states are cut from the front.
Files
torso/: aQwen3_5ForCausalLMcheckpoint with 15 layers (transformers 5), andadapters.safetensors, the linear block (keys13.weight,13.bias: applied to the output of layer 13).head.safetensors: v21's readout head, unchanged.- Tokenizer files,
strands_decider_config.json(v21's, withuse_lorafalse andtorso_dir"torso"),export.json(sources and revisions),MANIFEST.sha256.
License
Apache-2.0, like v21 and Qwen/Qwen3.5-2B-Base; see LICENSE.md.
Model tree for alxnahas/strands-decider-1.4B-v21-pruned
Base model
Qwen/Qwen3.5-2B-Base