I Tried Decision 2.0 on an M4 Mac's MPS Using the Same 20 Questions as Strands Decider

I Tried Decision 2.0 on an M4 Mac's MPS Using the Same 20 Questions as Strands Decider

We ran the Decision 2.0 judgment-only models Eos-0.8B, Sol-2B and Nox-4B on the same 20 questions as Strands Decider 2B, comparing expected-result counts, response time and memory. Also covers how they differ from Kev and Decider.
2026.10.04

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.

https://huggingface.co/vllm-sr/Decision-2.0-Eos-0.8B

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.

https://dev.classmethod.jp/articles/strands-decider-2b-m4-mac-kiro-crew/

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.

https://github.com/jaredpalmer/kev

https://strandsagents.com/blog/introducing-strands-decider/

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.


AI白書2026 配布中

クラスメソッドが独自に行なったAI診断調査をもとに、企業のAI活用の現在地を調査レポートとしてまとめました。企業規模別の活用度傾向に加え、規模を超えてAI活用を進める企業に共通する取り組みまで、自社の現在地を捉えるためのヒントにぜひ。

AI白書2026

無料でダウンロードする

Share this article