strands-decider-1B-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.
English only. The trimmed vocabulary splits Chinese, Japanese, Korean, Arabic, Hindi and Ukrainian text into byte pieces, and the model reads it poorly (table below). German and Polish mostly hold.
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. - The vocabulary is trimmed from 248,320 to 96,460 tokens: the tokens v21's training prompts use, plus ASCII, closed under the tokenizer's BPE merges.
1.06B parameters (857M in the 15 layers, 198M embedding, 4M linear block, 1M head), 2.1 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 | 174 | 5 | 0.0076 |
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 50.4 (Intelligence 30.9, Calibration 69.8); v21 53.2 (32.3, 74.2).
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 | 20 | 25 | 20 | 23 | 26 | 35 | 41 | 37 |
Long inputs, with max_length 131072 (24 public tasks placed after unrelated news text): 18 of 24 at 16k
tokens (v21 19) and 20 of 24 at 64k (v21 21), one answer changed at each length.
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-1B-v21-pruned --device cuda --port 8000 # POST /v1/systemone; JevBench's typesafe adapter
strands-decider ask alxnahas/strands-decider-1B-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-1B-v21-pruned
Base model
Qwen/Qwen3.5-2B-Base