
I Tried Decision 2.0 on an M4 Mac's MPS Using the Same 20 Questions as Strands Decider
This page has been translated by machine translation. View original
Introduction
Decision 2.0 is a series of decision-only models for vLLM Semantic Router. The Hugging Face repositories were created between September 28 and 29, 2026. Six sizes, from Kai-0.6B to Vega-27B, have been released.
I ran three of them, Eos-0.8B, Sol-2B, and Nox-4B, on the same 20 questions and the same decision prompt as in the previous article on Strands Decider 2B.
Differences from Kev and Strands Decider
| Aspect | Decision 2.0 | Kev | Strands Decider |
|---|---|---|---|
| Sizes | Kai-0.6B / Eos-0.8B / Sol-2B / Nox-4B / Lux-9B / Vega-27B | 0.8B / 4B / 9B / 27B | 2B |
| Base model | Qwen3 (Kai), Qwen3.5 (Eos, Sol, Nox, Lux), Qwen3.8 (Vega) | Qwen3.5 (0.8B, 4B, 9B), Qwen3.8 (27B) | Qwen3.5-2B |
| Training method | Varies by size. Kai, Eos, Sol, and Lux fine-tune all parameters, Nox merges a rank-128 LoRA into the base, and Vega uses a rank-512 LoRA adapter | 0.8B, 4B, and 9B use a rank-16 LoRA on a frozen base. 27B fine-tunes all parameters | rank-16 LoRA |
| Output head | Reads out the endpoint vector of each choice and the vector of the whole question with a shared bilinear MLP | pointer head (scores the last token of each choice against the final token of the question) | pointer head (scores the answer for each choice produced by the torso) |
| Invocation | Hugging Face AutoModel (trust_remote_code=True) with system_one(), or pipeline("decision"). The package has no HTTP server, and the dtype is fixed by the runtime and cannot be chosen |
POST /v1/systemone (compatible with TypeSafe's System One API). Runs on MLX on a Mac |
POST /v1/systemone (compatible with the same API) via strands-decider serve, and ask |
| Maximum input length (values in the model card / config) | Kai 8,192, Eos to Lux 16,384, Vega 32,768 tokens | state 65,536 tokens (verified: 8,192 for 0.8B to 9B, 65,536 for 27B) | max_length 4,096 (config file) |
For details on Kev and Strands Decider, see their respective model cards and announcements.
Conditions tested
The decision prompt uses the same instructions as model.route in Kiro Crew. Because the criteria in Crew's decision prompt is null, Decider rejected it with HTTP 422 in the previous article. Eos-0.8B also returned invalid_question without running inference. Therefore, as in the previous article, I used B_desc, which adds the tier descriptions as criteria. The state was passed in the form {"message": body text}. The 20 Japanese questions are also identical to the previous article. For each condition, I ran one question first as a warm-up and excluded it from measurement.
Decision prompt B_desc (prompts.py)
INSTR_B = (
"How hard is this request for an AI coding assistant? Answer one of: "
"simple = a short, local, mechanical request answerable in one step -- a rename, a lookup, a small edit, a direct factual question; "
"medium = ordinary work over a few files or steps -- write a function, explain some code, fix a bug whose cause is already named; "
"complex = work needing a plan, a trade-off or reasoning across a whole system -- design, architecture, a diagnosis with no named cause, a risky refactor. "
"Being wrong in the two directions does not cost the same. A turn put in a lower tier than it needs gets less room to work in and a worse answer; "
"a turn put higher only costs more. So answer simple only when the request is self-contained and you can see the whole of it -- "
"a request that is a plan, a judgement call, several instructions at once, or that names work you cannot see, is not simple however short it is."
)
TIER_DESC = {
"simple": "a short, local, mechanical request answerable in one step -- a rename, a lookup, a small edit, a direct factual question",
"medium": "ordinary work over a few files or steps -- write a function, explain some code, fix a bug whose cause is already named",
"complex": "work needing a plan, a trade-off or reasoning across a whole system -- design, architecture, a diagnosis with no named cause, a risky refactor",
}
The execution environment was a Mac mini (M4 Pro, 24GB, macOS 27.0.1) with Python 3.12.14, torch 2.14.1, and transformers 5.18.0. The 20 questions were run 3 times for each of the 3 models.
I pinned the commit of each model (3594047d for Eos-0.8B, 23cbe9f9 for Sol-2B, and 25e8f67d for Nox-4B). The Decider and Kev-4B values in the results tables are from the logs of the previous article, measured on the same Mac.
How to run it
Create a virtual environment with uv and install the dependencies.
uv venv --python 3.12
uv pip install torch==2.14.1 transformers==5.18.0 safetensors==0.8.0
I saved the above decision prompt to prompts.py and called it from the following Python code.
from transformers import AutoModel
from prompts import INSTR_B, TIER_DESC
model = AutoModel.from_pretrained(
"vllm-sr/Decision-2.0-Eos-0.8B",
trust_remote_code=True,
revision="3594047d69f476f1d01cf84c593e213fc3a4dfe0",
device="mps",
)
model.eval()
text = "このリポジトリで使っている Node.js のバージョンは?"
result = model.system_one(
state={"message": text},
questions={"tier": {"type": "choice", "instructions": INSTR_B, "criteria": TIER_DESC}},
)
trust_remote_code=True executes Python code on Hugging Face, so I pinned the commit by specifying revision.
Every time the model loaded, a tokenizer warning, incorrect regex pattern … fix_mistral_regex=True, appeared. To check the effect of the warning, I replaced the runtime's internal tokenizer (runtime.backend.tokenizer) with one reloaded using fix_mistral_regex=True. When I re-ran Eos-0.8B on the 20 B_desc questions on the M4 Pro's MPS, the tiers were unchanged compared with before the replacement, and the probability difference was at most 0.046. The values in the results tables are from before the replacement.
Results
Decisions
"Within expected" is the number of questions where the tier fell in the "Acceptable" column, and "Exact match" is the number of questions where the model returned the same tier as the expected answer. Eos-0.8B's decisions were identical across the 3 runs.
| Question | Expected | Acceptable | Decider 2B | Kev-4B | Eos-0.8B | Eos and Decider agree |
|---|---|---|---|---|---|---|
| P01 | simple | simple, medium | simple | simple | medium | × |
| P02 | medium | medium, simple | simple | simple | medium | × |
| P03 | simple | simple | simple | simple | simple | ○ |
| P04 | medium | medium, complex | complex | simple | complex | ○ |
| P05 | medium | medium, complex | complex | simple | medium | × |
| P06 | complex | complex, medium | complex | complex | medium | × |
| P07 | simple | simple, medium | simple | simple | simple | ○ |
| P08 | simple | simple, medium | simple | simple | simple | ○ |
| P09 | complex | complex, medium | complex | complex | complex | ○ |
| P10 | simple | simple, medium | simple | simple | simple | ○ |
| P11 | medium | medium, complex | medium | simple | complex | × |
| P12 | simple | simple, medium | simple | simple | medium | × |
| P13 | complex | complex | complex | complex | complex | ○ |
| P14 | complex | complex, medium | medium | medium | complex | × |
| P15 | medium | medium, simple | medium | complex | medium | ○ |
| P16 | medium | medium, simple | medium | simple | medium | ○ |
| P17 | complex | complex | complex | complex | complex | ○ |
| P18 | complex | complex, medium | medium | medium | medium | ○ |
| P19 | medium | medium, complex | complex | medium | medium | × |
| P20 | complex | complex | complex | complex | complex | ○ |
| Model | Within expected | Exact match | Lower / higher than expected |
|---|---|---|---|
| Decider 2B (previous) | 20/20 | 14 | 3 / 3 |
| Kev-4B (previous) | 16/20 | 12 | 7 / 1 |
| Eos-0.8B | 20/20 | 14 | 2 / 4 |
| Sol-2B | 19/20 | 16 | 0 / 4 |
| Nox-4B | 16/20 | 12 | 7 / 1 |
The number of exact matches with the expected answer for Eos-0.8B is 14, the same as Decider. On the other hand, Eos-0.8B and Decider returned the same tier on 12 of the 20 questions. I also ran Sol-2B and Nox-4B under the same conditions. The number within expected did not increase as the size grew, and all 4 out-of-expectation results for Nox-4B are simple decisions.
Response time
The Decider and Kev-4B values were measured on the client side by sending requests to the HTTP server, in a session of the previous article separate from this one. Kev-4B ran on MLX (bf16). For Eos-0.8B, Sol-2B, and Nox-4B, I measured the system_one() call within the process.
| Model | Mean | Median | Min–Max | 20-question total | Runs |
|---|---|---|---|---|---|
| Decider 2B (previous) | 376–381ms | 327–335ms | 320–752ms | approx. 7.6 s | 3 |
| Kev-4B (previous, MLX) | 604ms | 526ms | 439–1,222ms | 12.1 s | 2 |
| Eos-0.8B | 479ms | 435ms | 365–997ms | 9.4–9.8 s | 3 |
| Sol-2B | 645ms | 587ms | 508–1,338ms | 12.8–13.1 s | 3 |
| Nox-4B | 1,794ms | 1,628ms | 1,366–3,470ms | 34.6–37.2 s | 3 |
The mean, median, and min–max for Eos-0.8B, Sol-2B, and Nox-4B are values aggregated over the 3 runs (60 responses). The mean, median, and 20-question total for Decider are ranges of the per-run values over the 3 runs. Kev-4B had the same values in both runs. Eos-0.8B was about 100ms longer than Decider on average, and Sol-2B and Nox-4B were longer still than Eos-0.8B.
Memory
footprint is the Physical footprint from the macOS footprint command, and includes the GPU portion in unified memory. RSS is the resident memory from ps. For Eos-0.8B, Sol-2B, and Nox-4B, the value outside the parentheses is at process exit, and the value inside the parentheses is the peak during measurement. The Decider values were measured on the server process from the previous article right after the evaluation finished.
| Model | footprint | RSS | MPS allocation |
|---|---|---|---|
| Decider 2B (previous) | approx. 5.1–5.2GB | 0.9GB | — |
| Kev-4B (previous, MLX) | 10GB | 2.2GB | — |
| Eos-0.8B | 5.3GB (5.96GB) | 1.1GB (3.6GB) | 2.9GB |
| Sol-2B | 9.7GB (11GB) | 0.6GB (8.6GB) | 7.2GB |
| Nox-4B | 19GB (21GB) | 0.6GB (10.3GB) | 16.1GB |
The footprint was comparable between Eos-0.8B and Decider. On the 24GB Mac mini, Nox-4B's footprint reached 21GB at its peak.
Summary
Decision 2.0 comes in 6 sizes from 0.6B to 27B, and like Kev, you can choose the size.
On these 20 questions, Eos-0.8B and Sol-2B achieved decision accuracy comparable to Strands Decider 2B.
The differences showed up in speed and memory. Eos-0.8B was about 100ms slower than Decider, with comparable memory. Sol-2B responded even more slowly and used more memory.
Decision 2.0 is one of the decision-only models, including Jev covered in the previous article, that offers a wide range of size choices in an OSS implementation. I'd like to keep an eye on it going forward.
