joakimpalm-zen/xyntetik-runner is a single-binary GGUF engine written in C. It handles serving and scoring, LoRA training that uses the deployed quantized weights as-is, and provides OpenAI- and Anthropic-compatible APIs on CPU/CUDA/Metal. The target touched by the latest commit of 2026-11-07 (merge of PR #672, R2.14) is `chat_template_kwargs`. This is the bundle of options attached to a request that get passed to the model's chat template (a Jinja template that assembles messages into a prompt string). The gist of this change is that known keys are not silently dropped, but are either applied or rejected.
The Runner renders templates with its own renderer per family, and does not interpret the Jinja in the file directly. Therefore a key only takes effect where that renderer actually handles it. R2.14 split this up. What is now applied are `preserve_thinking` for LFM2 and LFM2-24B, `preserve_thinking: false` for Qwen 3.8 (the default keeps all thinking), `enable_thinking` for Apertus, and `reasoning_effort: low` for Granite 4.2. On the other hand, in places where the template in the file reads that key as a variable, the request is rejected with a 400 (`unsupported_template_kwarg`). Those are `preserve_thinking` in Responses and Messages, `reasoning_effort` and `reasoning_strength` in Messages, and `add_generation_prompt: false`. Spark now also rejects `reasoning_effort: xhigh` exactly as its own template does. The MANUAL now organizes in a table which keys take effect in which family and on which surface (Chat Completions, Responses). The commit added 654 lines and deleted 90 lines across 18 files, and included `tests/test_known_kwargs.py` as well as the audit logs (before and after) in `docs/compat-reports/r2.14-known-kwargs-2026-11-06/`.
However, none of this is all measured result. The CHANGELOG states it compared against 33 references, but 19 families could not be checked against references on this host, so instead of measurement they were only covered by rejection rules. R2.14 is recorded under the Unreleased section of the CHANGELOG, so it is not a released release. A null `preserve_thinking` counts as an absent value, but the difference remains that Qwen 3.8's template treats it as false. This can be seen as an improvement by a project that has been tracking per-family consistency in the problem where the switch that turns thinking control on and off quietly produces different results. However, the measured consistency of the 19 families is difficult to confirm from this commit alone.