diff --git a/stt/server/stt_server/brain.py b/stt/server/stt_server/brain.py index 7cfd3b9..098dbf4 100644 --- a/stt/server/stt_server/brain.py +++ b/stt/server/stt_server/brain.py @@ -19,6 +19,12 @@ async def ask( memories: list[str] | None = None, ) -> str: system = settings.system_prompt + if settings.disable_thinking: + # Qwen3 est un modèle « thinking » : sans ça il dépense tout le budget max_tokens + # en raisonnement (`reasoning_content`) → `content` vide, ou part en réflexion longue + # → timeout (502). Le token de contrôle `/no_think` désactive le mode raisonnement. + # Inoffensif pour les modèles non-Qwen (simple texte ignoré). + system += "\n/no_think" if memories: souvenirs = "\n".join(f"- {m}" for m in memories) system += ( @@ -39,4 +45,10 @@ async def ask( async with httpx.AsyncClient(timeout=settings.request_timeout) as client: r = await client.post(settings.litellm_url, json=payload, headers=headers) r.raise_for_status() - return r.json()["choices"][0]["message"]["content"].strip() + msg = r.json()["choices"][0]["message"] + # Filet de sécurité : si un modèle « thinking » renvoie un content vide (tout parti + # en reasoning_content), on récupère le raisonnement plutôt que de renvoyer "". + content = (msg.get("content") or "").strip() + if not content: + content = (msg.get("reasoning_content") or "").strip() + return content diff --git a/stt/server/stt_server/config.py b/stt/server/stt_server/config.py index 13297f9..c1c7778 100644 --- a/stt/server/stt_server/config.py +++ b/stt/server/stt_server/config.py @@ -31,6 +31,9 @@ class Settings: max_tokens: int = int(os.getenv("STT_MAX_TOKENS", "200")) temperature: float = float(os.getenv("STT_TEMPERATURE", "0.7")) request_timeout: float = float(os.getenv("STT_REQUEST_TIMEOUT", "60")) + # Qwen3 est un modèle « thinking » → ajoute `/no_think` pour désactiver le raisonnement + # (sinon content vide / timeout). Inoffensif pour les modèles non-Qwen. + disable_thinking: bool = os.getenv("STT_DISABLE_THINKING", "true").lower() == "true" # Mémoire long-terme (Qdrant) — dégrade proprement si Qdrant/embeddings injoignables memory_longterm: bool = os.getenv("STT_MEMORY_LONGTERM", "true").lower() == "true"