This one is about trust in long agent sessions. Several of you reported the same painful shape: a coding agent session goes fine for a while, then on a plan-execution turn the model starts circling — "Let me start building now.", again and again — and never touches a file. We chased it hard, measured it at every precision (the loop reproduces on the full bf16 weights and disappears on clean context at every quantization level, so it was never quantization damage), and found the real trigger in how MTPLX rendered multi-turn reasoning history. 2.0.2 fixes that at the contract level, and closes the biggest quality-of-life issues you filed since 2.0.1. Ordered by how much it changes your day.
Qwen's chat template has a built-in rule for multi-turn conversations: reasoning (<think> blocks) is kept only for the current round, and completed turns are rendered without it. That is the shape the model was trained on. MTPLX's server used to override it — every completed assistant turn got an empty <think> scaffold the model never saw in training, stale inline reasoning could be replayed across turns, and the structured reasoning_content that agent clients like OpenCode send was silently dropped.
Deep agent histories rendered in that off-contract shape are exactly the contexts that sent the model into repetition spirals. Rendered on-contract, the same captured session that looped in three out of four runs acts immediately and cleanly in four out of four.
2.0.2 lets the template's own rule govern, which we call scoped reasoning history: completed turns render clean, and the active round — the assistant → tool → assistant chain you are in right now — keeps its full reasoning, now including the structured reasoning_content that used to be dropped. In-round continuity is strictly better than before, and history no longer carries the fuel.
This is the default on Qwen 3.6 and 3.5 models. --preserve-thinking on restores the exact previous behavior (byte-for-byte, warm caches intact), off still strips everything, and templates without Qwen's rolling-checkpoint rule (Gemma 4, custom templates) are untouched. The resolved policy prints at startup and shows as reasoning_history_mode in /v1/mtplx/settings.
Binding the server to 0.0.0.0 to serve your LAN — the top request from people running MTPLX as a home inference box — used to fall apart in the app: free ports were misreported as occupied, the port silently bumped, and the health watchdog would kill a perfectly healthy daemon because the app probed the bind address verbatim. All app-side connections now resolve wildcard binds to a connectable address, the port preflight tests the address family the daemon will actually bind, an API-key mismatch reads as "live but unauthorized" instead of "lost", and the app tells you up front that LAN serving requires an API key instead of showing a generic Degraded state (#109).
The quickstart wizard also stops pretending everything is http://127.0.0.1:8000 and prints the URLs for the host and port you actually asked for — thanks to Takeshi Hasegawa (@hasegaw) for the fix (#148).
The block-prefix restore lane — the thing that makes turn N of an agent session start decoding in a fraction of the cold time — was still gated to OpenCode's tool contract, even though the kvcache-v2 restores behind it are exact for every client. Pi, Claude Code, Cline, and custom harnesses whose transcripts diverge early in the prompt were silently re-prefilling a growing suffix on every turn (#138). The lane now engages for all clients.
Since 2.0.0 flipped the serve default for the SSD session cache, an explicit "Off" in the app's settings was silently re-enabled with default limits on every app-launched daemon — which is why some of you watched ~/.mtplx/session-bank grow back after deleting it (#140, and half of the mystery in #138). The app and generated server commands now always pass the resolved setting explicitly, including Off.
Related upgrade healing: if an app update left the runtime venv pointing at a replaced bundle path, every reinstall failed with "No such file or directory: .../bin/python3" and no amount of reinstalling fixed it. The venv now detects the broken interpreter and rebuilds itself (#139).
</reasoning>) splits across a streaming chunk — thanks to @Osamaali313 for the report and fix (#149).mtplx serve returns your terminal within a bounded five-second drain even when a browser tab holds an open dashboard or chat stream, instead of hanging forever (#124). Thermal and fan cleanup still runs.MTPLX_LOOP_GUARD=1): inert until a real verbatim loop is detected mid-response, then it steers only the tokens that would extend the repeat, and never touches tool-call content. It is off by default on purpose — MTPLX does not alter your sampling unless you ask it to, and the repetition fix that matters for our own models is section 1.The reasoning-history change went through golden-render tests against the shipped Qwen template bytes, cache-identity checks (explicit --preserve-thinking on/off users keep their warm session banks), live agent-session A/Bs on the captured looping context, and multi-turn warm-restore verification through the product path. Decode, prefill, and memory paths are untouched by this release; the engine's sampling remains bit-exact.
brew install youssofal/mtplx/mtplx or pip install mtplxSonoma or newer, Apple Silicon.