The short answer
Qwen3-4B-Q4_K_M returned exact JSON on 8 of 12 attempts; Qwen3-0.6B-Q8_0 and Qwen3-1.7B-Q8_0 each passed 3 of 12. The 0.6B file had the shortest median request time: 0.285 seconds. Start with the tested 4B file for these JSON tasks, and check every answer against your rules. Paid provider charges were $0; hardware and electricity costs were not measured.
Four repeated tasks on one M4 Pro, with different quantizations, cannot establish a general model winner or isolate model size.
Results at a glance
| Exact model file | Strict passes | Formatting-only failures | Content or schema failures |
|---|---|---|---|
| Qwen3-0.6B-Q8_0.gguf | 3 / 12 | 3 | 6 |
| Qwen3-1.7B-Q8_0.gguf | 3 / 12 | 3 | 6 |
| Qwen3-4B-Q4_K_M.gguf | 8 / 12 | 0 | 4 |
Passing meant returning only JSON with the exact keys, values, types and array order. Removing a code fence did not turn a failed answer into a pass.
| Exact model file | Median request seconds | Runtime generation tokens/s | Peak sampled process RSS, GiB |
|---|---|---|---|
| Qwen3-0.6B-Q8_0.gguf | 0.285 | 200.9 | 1.18 |
| Qwen3-1.7B-Q8_0.gguf | 0.583 | 87.2 | 2.21 |
| Qwen3-4B-Q4_K_M.gguf | 0.682 | 67.5 | 2.70 |
Timing includes the unscored summaries and excludes downloads, loading and hashing. RSS is sampled server-process memory, not total unified-memory or GPU use. Read the full measurement limits.
The 4B file passed more JSON attempts
It passed 8/12, but approved a $101 item despite the $100 ceiling on all three approval-task attempts.
The smaller files answered faster
Their median request times were lower, but both passed 3/12 JSON attempts. The 1.7B file kept an outdated owner and launch date on all three correction-task attempts.

What we did
We ran three exact Qwen3 files on one Apple M4 Pro with 24 GiB unified memory. Each file answered four short synthetic JSON tasks three times: invoice extraction, corrected owner/date extraction, a deadline boundary and conditional approval.
We checked each reply against a fixed answer key. Code fences failed the JSON-only requirement. We also saved 18 summaries without scoring their factual quality, plus three unscored warmups. All 54 benchmark requests returned outputs.
One model and one server slot ran at a time through llama.cpp 0.4.0-dev, build 10809. We used a 4,096-token context, a 256-token output cap and seeds 4101–4103. We measured request timing and sampled server-process memory. The full settings and measurement limits are below.
Try it yourself
Inspect the outputs or repeat the strict scoring
Download the public evidence ZIP ↓
The ZIP includes prompts, outputs, the answer key, the strict scorer, exact settings, timing data and sampled memory traces. Model binaries are not included. Find the exact model files and runtime before rerunning inference.
Read the saved outputs to see the formatting and content mistakes. A new inference run uses your own hardware and electricity; the recorded $0 provider charge is not a total ownership cost.
How we tested and what this can't tell you
The original records below keep the exact conditions, measurements, source revisions and limits. The summaries remain unscored, and quantization differs across files.
Original opening: scope and output counts
In this small local pilot, Qwen3-4B-Q4_K_M returned the requested exact JSON on 8 of 12 attempts. Qwen3-0.6B-Q8_0 and Qwen3-1.7B-Q8_0 each passed 3 of 12. These results cover four short synthetic tasks repeated three times on one Apple M4 Pro with 24 GiB unified memory. They are observations about these files and settings, not a general model ranking.
We recorded 54 benchmark task outputs, plus three unscored warmup responses. The task outputs comprise 36 exact-answer JSON responses and 18 summaries. Every request returned an output. The summaries are retained but their factual quality remains unadjudicated and contributes no accuracy score.
Exact JSON results
The tasks tested invoice extraction, corrected owner/date extraction, a deadline boundary, and conditional approval. A pass required JSON-only output with the specified keys, values, types and array order. Markdown fences failed the original requirement even when the enclosed JSON was otherwise correct. We did not change that rule after seeing the results.
Formatting-only means removing one surrounding Markdown code fence reveals JSON that exactly matches the answer key. This is a diagnostic explanation, not a revised score. Content/schema failures can also contain fences; categories are mutually exclusive.
For example, the 1.7B file retained the superseded owner and launch date in all three correction-task attempts. The 4B file approved an item priced at $101 despite the stated $100 ceiling in all three approval-task attempts. The raw outputs preserve those mistakes.
Observed timing and process memory
Timing covers all 18 completed requests per file, including the unscored summaries. Request time starts after the server is ready and excludes downloads, model loading and file hashing. Generation speed is the generation-duration-weighted mean of the runtime’s reported throughput, retaining its first-token timing convention. It excludes prompt processing and loading.
RSS was sampled from the server process with macOS ps roughly every 100 ms. It is not total unified-memory or GPU physical footprint, and sampling can miss brief peaks. We did not use model file size as a substitute for measured memory. No electricity or total ownership cost was measured.
How this run was controlled
We used llama.cpp 0.4.0-dev, build 10809, commit 5266f24da. One model and one server slot ran at a time, with four CPU inference and batch threads, requested all-layer GPU offload (-ngl 99), a 4,096-token context, prompt caching disabled, temperature 0.6, top-p 0.95, a 256-token output cap, and seeds 4101–4103. The retained logs do not independently confirm actual device placement. Other runtime defaults are retained in the metadata. Each model received one unscored warmup capped at eight output tokens. Pinned source files were SHA-256 verified before inference.
The complete cohort interval was 79.98 seconds, including startup, warmups, hashing and requests. Paid provider charges were $0. Hardware and electricity are excluded from that figure.
What this can and cannot establish
There are four distinct JSON tasks per model, not 12 independent task designs. Three repetitions describe this narrow sample; they do not establish broad capability or population-level reliability. The 4B file uses Q4_K_M while the smaller files use Q8_0, so this is not a controlled model-size comparison. Summary quality remains pending, and these timings should not be generalized to other machines, prompts, contexts or runtime versions.
Primary sources and evidence
- Qwen3-0.6B-Q8_0.gguf at the tested source revision
- Qwen3-1.7B-Q8_0.gguf at the tested source revision
- Qwen3-4B-Q4_K_M.gguf at the tested source revision
- Official llama.cpp build 10809 release
The source links identify the files and runtime; they do not substantiate Kingy’s measured scores. Our saved requests, outputs, answer key, checksums and timing/RSS records provide that evidence.
Original download contents and redaction notes
Download the evidence
Download the public evidence ZIP (about 121 KB). Includes all 54 benchmark task outputs, three unscored warmup responses, prompts, answer key, reproducible strict scorer, settings, timing data and sampled process RSS traces. Local usernames, absolute path prefixes and ephemeral identifiers are redacted; prompts, response text, measurements and model hashes are preserved. Model binaries are not included.
FAQ
Which Qwen3 file passed the most JSON attempts?
Qwen3-4B-Q4_K_M.gguf passed 8/12. Qwen3-0.6B-Q8_0.gguf and Qwen3-1.7B-Q8_0.gguf each passed 3/12. Four tasks on one machine and different quantizations prevent a general model ranking.
Why did correct JSON inside a code fence fail?
The original rule required JSON-only output. A surrounding Markdown code fence failed that requirement. Formatting-only failures identify otherwise exact answers after removing the fence, but the score was not revised.
Does the memory table show total Mac memory use?
No. It shows peak sampled RSS from the server process, sampled roughly every 100 ms. It is not total unified-memory or GPU physical footprint, and brief peaks may be missed.
Did the local test cost nothing?
Paid provider charges were $0. Hardware, electricity and total ownership cost were not measured. The complete run interval was 79.98 seconds, including startup, warmups, hashing and requests.
Were the summaries scored for accuracy?
No. The 18 summaries were saved, but their factual quality remains unadjudicated and contributes no accuracy score. The exact JSON results cover 36 responses.
The Kingy Brief
Get The Kingy Brief.
AI changes, original tests and one practical thing to try. Fridays at 09:00 Vancouver time.
Free · Double opt-in · Unsubscribe anytime
Sign up for The Kingy Brief on Beehiiv.
Signup help and newsletter schedule
Signup form provided by Beehiiv. After submitting, check your inbox for "Confirm your subscription to The Kingy Brief" and open its confirmation link. Check Spam or Promotions if you cannot find it.
Fridays at 09:00 Vancouver time: source-checked AI changes, original tests and one practical thing to try. We skip a week when there is not enough verified material. Free. Unsubscribe anytime.