Map Hermes reasoning controls into Qwen templates
This commit is contained in:
@@ -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 "
|
||||
|
||||
Reference in New Issue
Block a user