Release notes, v0.12.2
TandemLLM 0.12.2 fixes two Chat-tab bugs from the issue tracker and brings back LFM2.5's older saved conversations. No model, card or profile changed, and every profile writes the same text as in 0.12.1. Every change is in CHANGELOG.md, and the PDF below is the manual.
Large reads in the Chat tab
A run that read a large file could die with a request over the window. AgentSparko reported it in #18. That request's estimate was 4,612 tokens low, and max_tokens left only 256 for the error (SRV-639).
- One step's tool results now share the room the model has left: half of what is left under the compaction line, 2,000 tokens at least, split across the step's calls.
read_filestops at whole lines and ends with the offset to read on from. A line longer than one read goes on with a newcolumnargument. A 700 KB file used to come back as its first and last 16,000 characters, with about 400 KB left out unsaid.- Each request's estimate keeps a margin for text the engine has not counted yet. Near the window, chatd counts the request on our engine with
POST /v1/tokenizeand refuses one that is over before it sends it.
The #18 repro on the DGX Spark (Qwen3.8-27B, 262,144 tokens, a 700 KB .md, "read it and summarize") now ends with a summary.
read_file's schema changes, so each chat's first request after the update reads its prompt again.
The port preview streams
joeynyc found that the port preview held an app's whole answer until the app closed the connection (#86). A preview with Server-Sent Events or a long-poll never showed an event, and the sandbox counted as busy, out of reach of the idle stop (SRV-633).
- The answer goes on to the browser once its head is read. A page, script or style sheet up to 8 MiB is still read whole and rewritten. Bigger ones pass as they are, with
X-Tandem-Rewrite: skipped. - The app has 300 s to start its answer, else 504. If the client leaves, or takes no bytes for 60 s, chatd ends the relay inside the sandbox and frees it.
- The engine's chat forward ends its request to chatd when the browser leaves, also while chatd has nothing to send yet. On the DGX Spark a held long-poll ended in the sandbox within 0.2 s.
LFM2.5 saved conversations
0.11.2 changed two LFM2.5 modules without changing a stored row and gave them no equivalence entry, so 0.11.2 to 0.12.1 adopted none of the older tier files (ENG-381). On the DGX Spark, tools/lfm_attn_rows_check.py found the split attention equal to 0.11.1's byte for byte at 1 to 32 rows. The entries are in now.
Boxes that upgrade from 0.9.x to 0.11.1 adopt their LFM2.5 conversations again. Those that ran 0.11.2 to 0.12.1 already lost them.
Other fixes
- The dashboard's build uses source-map-js 1.2.2 (OPS-205, GHSA-68fv-2mgg-jv7q). It is a build-time dependency, and the served bundle is unchanged.
- Three CPU tests that failed on 0.12.0 and 0.12.1 pass (SRV-635, SRV-637, ENG-381).
tests/test_security_docs.pychecks SECURITY.md and the threat model against the tree (OPS-202).
Speed was not measured for 0.12.2, since no engine code that writes text changed after 0.12.1.
Update
Run the installer again: bash ~/TandemLLM/src/install.sh --yes --ref v0.12.2, then tandem restart and tandem chat restart. On a box you installed with --setup, add --setup --force-setup and run ops/use-profile.sh with your profile after it.
Files of the release
- tandemllm-manual-0.12.2.pdf (4496 KiB)