June 20, 2026 · 6 min read · ← All posts

Gemma 4 12B QAT is fast enough for WebBrain, but Qwen 3.5 9B still routes a little better

We ran google/gemma-4-12B-it-qat-w4a16-ct through WebBrain's frozen first-tool-call planner harness on the currently running local vLLM server at port 8000. The result is a useful middle tier: much faster than the older Gemma 4 12B Coder Fable5 Composer 2.5 run and stronger on routing, but still a small step behind Qwen 3.5 9B on strict first-action quality.

What we ran

The live vLLM server reported:

model id: gemma-4-12b
root: google/gemma-4-12B-it-qat-w4a16-ct
max context reported by vLLM: 65536

The planner command was the same frozen legacy harness used in the recent Gemma 4 31B QAT post, with one important operational difference: this run used concurrency 8 because this vLLM instance is currently configured to allow eight parallel requests.

node test/llm/run-llamacpp.mjs \
  --base http://127.0.0.1:8000 \
  --model gemma-4-12b \
  --tag 2026-06-20-vllm-12b-qat \
  --concurrency 8 \
  --timeout 180000 \
  --no-save-request \
  --freeze test/llm/freeze/baseline-2026-05-23.json \
  --chat-template-compat alternating

That means 100 single-turn browser-agent prompts, the May 23 Claude Sonnet 4.6 WebBrain system prompt and 41-tool schema, legacy text-call compatibility, no native OpenAI tools field, and up to eight active requests at a time.

The clean rerun completed all 100 cases without transport errors in 7.7 seconds of wall time. The latency numbers below are still per-case response latencies, not wall time divided by 100.

Result files:

test/llm/results/2026-06-20-vllm-12b-qat_chrome_gemma-4-12b_frozen

The result

MetricGemma 4 12B QAT w4a16
Completed cases100/100
Transport errors0
Parsed calls92/100
Exact first-call match14/100
Tool-name match33/100
Average latency0.52s
Median latency0.43s
p95 latency0.73s
Slowest case2.70s
Benchmark wall time7.7s at concurrency 8

The model is decisive: only eight no-tool answers, and no request failures in the final run. It still has the familiar local-planner habit of over-reading the page before acting: get_accessibility_tree was the first tool in 43 cases.

The nearby local-model table

This is the most useful comparison tier for the 12B QAT run. The table uses the same strict idealFirstToolCall scoring as the previous QAT benchmark, plus the Sonnet-reference tool-name alignment used by the older local leaderboard.

ModelServing pathParsed callsExactNameSonnet matchSonnet tooledMedianp95
Gemma 4 31B QAT w4a16vLLM QAT95/10019%37%77.0%78.3%0.55s1.07s
Qwen 3.5 9BvLLM int4 AutoRound90/10015%35%70.0%69.6%0.91s1.65s
Gemma 4 12B QAT w4a16vLLM QAT, c=892/10014%33%67.0%67.4%0.43s0.73s
Gemma 4 12B Coder Fable5 Composer 2.5llama.cpp Q4_K_M94/1009%26%61.0%62.0%1.91s2.81s

The clean read:

So the 12B QAT checkpoint is not the new local routing leader. It is the better small Gemma planner.

What concurrency 8 changes

The run was intentionally saturated. With --concurrency 8, the harness keeps up to eight chat-completion requests in flight, which is why the whole 100-case replay finished in 7.7 seconds and why GPU utilization looks higher than a normal WebBrain browser loop.

That is useful for throughput testing, but it is not how one interactive extension tab usually behaves. For product feel, the median per-case latency matters more: 0.43s here is comfortably interactive. For server sizing, the wall time matters: vLLM can chew through the frozen replay very quickly when batching parallel prompts.

Vision probe

The same fixed Google password-verification screenshot was sent through test/vision-probe.mjs:

node test/vision-probe.mjs \
  test/fixtures/google-signin-password-error.jpg \
  http://127.0.0.1:8000 \
  gemma-4-12b

Timing:

Vision probe metricValue
TTFT1.90s
Total time3.49s
Prompt tokens595
Completion tokens176

What it got right:

What it missed:

That makes the vision result usable for page-state awareness, but not clean enough for identifier-sensitive routing. Compared with Qwen 3.5 9B's earlier vision run, the Gemma 12B QAT endpoint is much cheaper on image tokens and faster end-to-end, but Qwen's UI OCR and account-chip classification remain stronger. Compared with Gemma 4 31B QAT, the total time is almost identical, but the 12B model loses the account string.

What this changes

Gemma 4 12B QAT is now the local Gemma result I would use when the 31B model is too large and the older 12B Coder build is the alternative. It is materially better than that Coder run for first-action routing and fast enough that the browser loop should feel immediate.

It does not displace Qwen 3.5 9B as the small local planner with the cleaner routing profile. Qwen still makes slightly better first-tool choices in this saved replay. The reason to pick Gemma 4 12B QAT is speed, Gemma-family consistency, and a working low-token vision path. The reason to pick Qwen 3.5 9B is better affordance/OCR behavior and a small but real edge in first-action quality.

Written by Emre Sokullu. WebBrain is MIT-licensed and open on GitHub.