Map Hermes reasoning controls into Qwen templates

This commit is contained in:
Mikei386
2026-08-25 14:52:43 +02:00
parent 7df28d9750
commit 63fc921988
6 changed files with 149 additions and 2 deletions
+60
View File
@@ -1108,6 +1108,64 @@ def _request_has_image(data: dict) -> bool:
)
# ---------------------------------------------------------------------------
# llama.cpp Chat-Template-Parameter
# ---------------------------------------------------------------------------
_REASONING_EFFORT_MAP = {
"minimal": "low",
"low": "low",
"medium": "medium",
"high": "xhigh",
"xhigh": "xhigh",
"max": "xhigh",
"ultra": "xhigh",
}
_REASONING_OFF = {"", "none", "off", "disabled", "false"}
def _normalize_llamacpp_reasoning(data: dict) -> dict:
"""Mappt OpenAI/Hermes-Reasoning auf llama.cpp-Template-Parameter.
Hermes sendet ``reasoning_effort`` bei einem Custom Provider als
Top-Level-Feld. llama.cpp akzeptiert das Feld zwar, reicht es dort aber
nicht an das Jinja-Chat-Template weiter. Qwen3.8 erwartet stattdessen
``chat_template_kwargs.reasoning_effort`` bzw. ``enable_thinking=false``.
Die Funktion verändert den übergebenen Request absichtlich in-place und
entfernt das wirkungslose Top-Level-Feld. Andere Template-Argumente des
Clients bleiben erhalten.
"""
if "reasoning_effort" not in data:
return data
raw_effort = data.pop("reasoning_effort")
effort = str(raw_effort).strip().lower() if raw_effort is not None else ""
template_kwargs = data.get("chat_template_kwargs")
if not isinstance(template_kwargs, dict):
template_kwargs = {}
data["chat_template_kwargs"] = template_kwargs
if effort in _REASONING_OFF:
template_kwargs.pop("reasoning_effort", None)
template_kwargs["enable_thinking"] = False
return data
mapped = _REASONING_EFFORT_MAP.get(effort)
if mapped is None:
# Unbekannte OpenAI-Erweiterungen dürfen das Qwen-Template nicht mit
# einem ungültigen Wert zum Abbruch bringen. Das Template verwendet
# in diesem Fall seine eigene Voreinstellung.
log.warning("Unbekanntes reasoning_effort=%r ignoriert", raw_effort)
if not template_kwargs:
data.pop("chat_template_kwargs", None)
return data
template_kwargs["enable_thinking"] = True
template_kwargs["reasoning_effort"] = mapped
return data
# ---------------------------------------------------------------------------
# HTTP-Handler
# ---------------------------------------------------------------------------
@@ -1916,6 +1974,8 @@ class Handler(BaseHTTPRequestHandler):
if profile is not None:
switch_profile(profile, implicit=True)
data = _normalize_llamacpp_reasoning(data)
if _request_has_image(data):
data = _normalize_chat_images(data)
log.info("Vision: Bild wird direkt an das aktive "