joakimpalm-zen/xyntetik-runner 是一个用 C 编写的单二进制 GGUF 引擎。它同时处理服务与评分、使用所部署量化权重的 LoRA 训练,并在 CPU/CUDA/Metal 上提供 OpenAI 与 Anthropic 兼容的 API。2026-11-07 的最新提交(合并 PR #672,R2.14)所触及的对象是 `chat_template_kwargs`。它是随请求附带、会被传递给模型聊天模板(把消息组装成提示词字符串的 Jinja 模板)的一组选项。本次变更的要点是:已知键不再被悄悄丢弃,而是要么被应用,要么被拒绝。
Runner 会对每个模型家族使用自身的渲染器来渲染模板,不会直接解释文件中的 Jinja。因此,某个键只有在该渲染器真正处理它的位置才会生效。R2.14 在这里作了区分。现在会被应用的是 LFM2 和 LFM2-24B 的 `preserve_thinking`、Qwen 3.8 的 `preserve_thinking: false`(默认保留所有思考)、Apertus 的 `enable_thinking`、Granite 4.2 的 `reasoning_effort: low`。反之,在文件中的模板把该键作为变量读取的位置,请求会以 400(`unsupported_template_kwarg`)被拒绝。这些包括 Responses 和 Messages 的 `preserve_thinking`、Messages 的 `reasoning_effort` 与 `reasoning_strength`、以及 `add_generation_prompt: false`。Spark 现在也会像其自身模板那样拒绝 `reasoning_effort: xhigh`。MANUAL 中已用表格整理出各键在哪个模型家族、哪个接口面(Chat Completions、Responses)上生效。该提交在 18 个文件中新增 654 行、删除 90 行,并一并包含 `tests/test_known_kwargs.py` 以及 `docs/compat-reports/r2.14-known-kwargs-2026-11-06/` 下的审计日志(前后对比)。
不过,这些并不全是实测结果。CHANGELOG 写明与 33 个参考实现做过比较,但有 19 个模型家族无法在本主机上与参考实现对照,因此不是通过实测、而只是用拒绝规则加以覆盖。R2.14 记录在 CHANGELOG 的 Unreleased 条目下,所以它并不是已发布的发行版。null 的 `preserve_thinking` 被视为缺失值,但 Qwen 3.8 的模板会将其当作 false 处理,这一差异依然存在。对于一个一直在追踪“开启与关闭思考控制的开关会悄悄产生不同结果”这一问题、并按模型家族保持一致性的项目而言,这可以视为一项改进。不过,仅凭这一次提交很难确认那 19 个模型家族的实测一致性。