From 03e5c5f9a10390f249804c3583557aac05a0e3be Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sat, 11 Jul 2026 11:05:51 +0200 Subject: [PATCH] =?UTF-8?q?fix(local-llm):=20Qwen3-Thinking=20im=20Adapter?= =?UTF-8?q?=20aus=20(schnelles=20Tier=20gr=C3=BCbelt=20nicht)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Qwen3 hat Thinking default AN -> verbraet Tokens im -Block, liefert bei kleinem max_tokens leeren content und ist ~3x langsamer (2,2s statt 0,7s im Test). ARIAs lokales Tier soll fixe Antworten geben, nicht grübeln (grübeln = harter Turn = Claude). Adapter setzt daher chat_template_kwargs {enable_thinking:false}; abschaltbar via LLM_DISABLE_THINKING=false. Verifiziert end-to-end (RVS->Adapter->llama->Qwen3): "Hallo! Ich bin bereit." in 718ms Round-trip RZ<->Gamebox@home. Co-Authored-By: Claude Opus 4.8 --- xtts/llm-adapter/adapter.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/xtts/llm-adapter/adapter.py b/xtts/llm-adapter/adapter.py index 2d7c039..d9f9854 100644 --- a/xtts/llm-adapter/adapter.py +++ b/xtts/llm-adapter/adapter.py @@ -47,6 +47,14 @@ RVS_TOKEN = os.getenv("RVS_TOKEN", "").strip() LLAMA_URL = os.getenv("LLAMA_URL", "http://llama:8081").rstrip("/") LLM_MODEL = os.getenv("LLM_MODEL", "qwen3-8b") LLM_TIMEOUT_SEC = float(os.getenv("LLM_TIMEOUT_SEC", "60")) +# Qwen3 hat Thinking-Mode default AN — dann verbraet es Tokens in einem +# -Block und liefert (bei kleinem max_tokens) leeren/abgeschnittenen +# content, ausserdem 3x langsamer. ARIAs schnelles Tier will KEIN Grübeln +# (grübeln = harter Turn = Claude). Wir schalten Thinking daher per +# chat_template_kwargs ab (Qwen3-Template versteht enable_thinking=false; +# andere Templates ignorieren das kwarg). Bei einem Modell, das darauf +# empfindlich reagiert: LLM_DISABLE_THINKING=false setzen. +LLM_DISABLE_THINKING = os.getenv("LLM_DISABLE_THINKING", "true").lower() == "true" async def _send(ws, mtype: str, payload: dict) -> None: @@ -73,6 +81,10 @@ async def _call_llama(messages: list, *, max_tokens: int, temperature: float, } if stop: body["stop"] = stop + if LLM_DISABLE_THINKING: + # llama.cpp (--jinja) reicht chat_template_kwargs an die Chat-Vorlage + # weiter. Qwen3 unterdrueckt damit den -Block. + body["chat_template_kwargs"] = {"enable_thinking": False} try: async with httpx.AsyncClient(timeout=LLM_TIMEOUT_SEC) as client: r = await client.post(f"{LLAMA_URL}/v1/chat/completions", json=body)