MTPLX 2.10.0

Measured on an M5 Max against 2.9.2, stock settings:

2.9.2 2.10.0
27B decode, 3k chat answer 55.9 tok/s 64.3 tok/s (+15%)
27B decode, 88k context 23.6 tok/s 30.4 tok/s (+29%)
27B decode, 147k context 12.0 tok/s 18.4 tok/s (+54%)
27B prefill, 88k context 379 tok/s 535 tok/s (+41%)
Decode cost with q8 KV quantization crash, or -50% -4%
Decode cost with q4 KV quantization crash, or -50% -19%
Rewriting a file the model just wrote 73.8 tok/s 87.6 tok/s (+19%)
Allocator growth in one long answer 8.6 GB 0.6 GB (-93%)
Multi-file agent task, wall clock 150.2 s 44.2 s (-71%)
Agent first token, mid-session 1.8 to 2.2 s 0.11 s (-94%)
48 GB Mac, long coding session 3.1 to 4.6 tok/s in swap (#305) 33 tok/s at 42k (7 to 10x)

Every row is stock 2.9.2 against stock 2.10.0 on the same Mac, so rows that ride a raised dependency floor or a changed default show that full stock-to-stock gain; the body section for each row says exactly what was measured and how. The 48 GB row is the pinned simulated seat from the release gate.

Qwen 3.8 Flash-Next

Qwen's 125B MoE preview is a native MTPLX family. The backend is parity-exact against the reference implementation, the model's own MTP draft head rides the standard speculative lane, and the family got its own kernel campaign before release. Through the real server on an M5 Max it measures 61 tok/s plain decode and 63 to 76 tok/s with the MTP head, depending on workload.

Coding agents

The defaults are now tuned on wall-clock receipts from real multi-file tasks through OpenCode, Pi, and Hermes, and the failure modes that killed agent runs are gone.

The engine plans memory for your Mac

MTPLX no longer assumes a 128 GB studio machine (issue #305 and friends). The serve banner prints the plan: engine budget, weights, resolved context window, and session bank. The default window is the largest one whose KV actually fits, so a 48 GB Mac serving the Speed model resolves 196,608 tokens instead of an impossible 262,144, and says so in the log instead of silently thrashing swap. On the simulated 48 GB seat at 42k context the release gate measured 33 tok/s decode and 645 tok/s prefill, with zero calls into the slow fallback path; 48 GB users on 2.9.2 had reported 3.1 to 4.6 tok/s with the app showing 129 percent memory used (#305). 128 GB machines are unchanged.

Decode past 128k

Past 131,072 prompt tokens the engine silently repaged dense decode into a layout that excluded the packed verify kernel, so verify paid about 30 times its normal round cost and speculative decode collapsed to plain AR speed. At 147k context on a 128 GB M5 Max, decode measured 12.0 tok/s before the fix, 16.3 after it, and 18.4 with prompt-copy speculation off.

Long answers and rewrites hold their speed

A 34k-token generation decayed from 86 to 25 tok/s inside one request, and rewriting a file the model had just produced ran no faster than writing it fresh. Three causes were found and fixed:

Receipts carry the copy-lane counters, launches with MTPLX_DROP_EVENTS=0 record per-round timings for decay attribution, and the growth-lever envs now beat the profile instead of being silently stomped.

Community lanes, adapted with credit

Four community pull requests landed this cycle, each adapted and measured before shipping.

mlx floor raised to 0.32.2

A clean same-wheel A/B measured mlx 0.32.0 against 0.32.2 at 33.8 to 44.3 tok/s decode at 16k (+31%), 23.6 to 30.4 tok/s at 88k (+29%), and 379 to 535 tok/s prefill (+41%). The table's short-context row is a same-mlx engine pair on seed-identical 3,205-token answers. The mlx floor bump stacks on top of that for installs still sitting on 0.32.0; the floor pin converges everyone. The dependency floor moves so existing installs converge on the faster stack, and pin-guard tests fail loudly if an environment or a shipped profile ever drifts below it.

KV cache quantization works now

KV quantization used to crash serving at warmup, and before that bug existed it could cost half your decode speed. This release replaces the lane. Measured at 16k context on an M5 Max against quantization off, q8 costs about 4 percent decode and q4 about 19 percent, at half and a quarter the KV memory. That is still short of our zero-loss bar, so both toggles stay opt-in: q8 is a fair trade for double the context headroom, and q4 is for capacity emergencies.

Session cache and time to first token

See what the engine did

The decode cliff hid for months because fast lanes declined silently, so this release closes that class of blindness.

Server and API

App

CLI

Fixed

Experimental, off by default

Gated lanes for operators. Everything here defaults off and changes nothing unless exported.

Updating