fix(llm): LLM antwortet jetzt in der konfigurierten Systemsprache
Bisher wurde `language` zwar an STT/TTS übergeben, aber nie an den LLM.
Lokales Modell antwortete deshalb immer auf Englisch/Deutsch, egal ob
Französisch, Spanisch o.a. eingestellt war.
Lösung: `language`-Parameter durch die gesamte LLM-Schicht gezogen:
- base.py: `lang_instruction()` helper + Signatur erweitert
- local_openai_compatible.py: Sprachanweisung ("Respond in Français.")
wird als letzter System-Part in den Message-Stack eingefügt
- openrouter.py: Explizite Sprachanweisung ergänzt den bestehenden
"Answer in the same language as the user"-Prompt
- fallback.py: FallbackLLMProvider leitet `language` durch
- orchestrator.py: alle 3 LLM-Aufrufstellen übergeben `language`
- Tests: alle Stub-LLMs um `language=None` ergänzt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
c3f6206d0c
commit
81d4cf6fd8
14 changed files with 89 additions and 44 deletions
|
|
@ -2,6 +2,26 @@ import json
|
|||
from abc import ABC, abstractmethod
|
||||
from collections.abc import AsyncIterator
|
||||
|
||||
_LANG_NAMES: dict[str, str] = {
|
||||
"de": "Deutsch",
|
||||
"en": "English",
|
||||
"fr": "Français",
|
||||
"es": "Español",
|
||||
"it": "Italiano",
|
||||
"nl": "Nederlands",
|
||||
"ru": "Русский",
|
||||
"zh": "中文",
|
||||
"cmn": "中文",
|
||||
}
|
||||
|
||||
|
||||
def lang_instruction(language: str | None) -> str | None:
|
||||
"""'Respond in X.' instruction for the given ISO language code, or None."""
|
||||
if not language:
|
||||
return None
|
||||
name = _LANG_NAMES.get(language, language)
|
||||
return f"Respond in {name}."
|
||||
|
||||
|
||||
def sse_delta(line: str) -> str | None:
|
||||
"""Extrahiert das Token-Delta aus einer OpenAI-kompatiblen SSE-Zeile (oder None)."""
|
||||
|
|
@ -24,6 +44,7 @@ class LLMProvider(ABC):
|
|||
text: str,
|
||||
history: list[dict] | None = None,
|
||||
session_id: str | None = None,
|
||||
language: str | None = None,
|
||||
) -> str: ...
|
||||
|
||||
async def stream(
|
||||
|
|
@ -31,9 +52,10 @@ class LLMProvider(ABC):
|
|||
text: str,
|
||||
history: list[dict] | None = None,
|
||||
session_id: str | None = None,
|
||||
language: str | None = None,
|
||||
) -> AsyncIterator[str]:
|
||||
"""Token-Stream. Default: kein echtes Streaming -> komplette Antwort als ein Chunk.
|
||||
|
||||
Provider mit SSE-Unterstuetzung ueberschreiben diese Methode.
|
||||
"""
|
||||
yield await self.complete(text, history=history, session_id=session_id)
|
||||
yield await self.complete(text, history=history, session_id=session_id, language=language)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue