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개 패밀리의 실측 정합성은 이 커밋만으로 확인하기 어렵다.