MTPLX 2.4.2

The agentic-cache release. If you run MTPLX under a coding agent — OpenCode, Pi, Claude Code, Cline — this release is about the slowdowns you could feel but not see: the session that gets slower the longer it runs, the tool call that triggers a mysterious multi-second pause, the warm session that suddenly re-prefills from zero. Each one was a real, named mechanism, and each is fixed or fenced here. It also lands an experimental DeepSeek-V4-Flash backend and a full documentation truth sweep.

Your warm session stops getting evicted mid-run

The session bank protects the state that makes follow-up turns fast. Two failure modes are closed:

/health now reports active sessions, the pin TTL, and recent evictions, so "what did the bank just do" has an answer.

Tool-turn commits stop being ghosts

Two background-commit pathologies made agent loops pay a cache tax on every tool turn:

And an identity fix that multiplies both: the server now honors the x-session-affinity / x-session-id headers OpenCode sends on every request, so consecutive turns from the same session stop being treated as strangers.

Every serve keeps a durable trail — diagnosis stops being archaeology

2.4.1 added opt-in bit-exact request capture. 2.4.2 turns on the always-on companion: every serve writes per-request telemetry — timings, token counts, prefill/restore behavior, request ids — to ~/.mtplx/logs/request-log-<port>.jsonl (64 MB × 4 rotation). No prompt or completion content is recorded, and MTPLX_REQUEST_LOG_JSONL=off disables it. When an agent session goes wrong at 2 a.m., the evidence now exists by default.

Three helpers ship alongside: scripts/gauntlet_scoreboard.py summarizes a session against product bars (decode floor, TTFT, re-prefill hygiene); scripts/oc_tap.py is a transparent recording proxy for content-level wire truth (it also forces Connection: close toward the client, because keep-alive pools were observed silently dropping the first request after a server restart); scripts/oc_tap_diff.py shows exactly what a client rewrote between consecutive requests.

One contract fix caught on a live gauntlet: the bridge's convergence guard could be read by the model as a session-wide tool ban ("the system explicitly forbids additional tool calls"), stalling the session. The guard now states that editing and verification tools remain allowed and that it scopes to the current reply only.

Experimental: DeepSeek-V4-Flash

A from-scratch native backend for model_type: deepseek_v4 (Hyper-Connections, compressed sparse attention with learned gated pooling, hash-routed MoE layers, grouped output-LoRA), loading the published mlx-community checkpoints directly — plus an optional single-block MTP speculative lane when the checkpoint carries mtp.0.* draft weights. The speculative lane is gated on committed- sequence identity with AR and measured up to 2.28x at K=3 on the 2bit-DQ build. Checkpoints that declare MTP but ship no draft weights (the current mlx-community conversions) degrade cleanly to AR. The backend is labeled experimental; treat throughput as unoptimized. Contributed by @davidtai (#216).

The documentation now tells the truth

Seeded by #215 (a README workflow pointing at a script that never existed — removed in #218 by @PhilipJohnBasile), a three-sweep audit verified ~450 documentation claims against the code and fixed every confirmed drift across 27 files. The ones you might have hit:

Upgrade

No defaults changed for non-agent workloads. The new session-bank and postcommit behaviors ship with conservative defaults and are fully env-tunable; set MTPLX_REQUEST_LOG_JSONL=off if you want no on-disk request trail.