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
|
|
@ -20,11 +20,11 @@ def _run(coro):
|
|||
|
||||
def test_llm_fallback_uses_second_on_error():
|
||||
class BadLLM:
|
||||
async def complete(self, text, history=None, session_id=None):
|
||||
async def complete(self, text, history=None, session_id=None, language=None):
|
||||
raise RuntimeError("down")
|
||||
|
||||
class GoodLLM:
|
||||
async def complete(self, text, history=None, session_id=None):
|
||||
async def complete(self, text, history=None, session_id=None, language=None):
|
||||
return "ok"
|
||||
|
||||
chain = FallbackLLMProvider("llm", [("bad", BadLLM()), ("good", GoodLLM())])
|
||||
|
|
@ -37,7 +37,7 @@ def test_llm_fallback_uses_second_on_error():
|
|||
|
||||
def test_llm_fallback_all_fail_raises():
|
||||
class BadLLM:
|
||||
async def complete(self, text, history=None, session_id=None):
|
||||
async def complete(self, text, history=None, session_id=None, language=None):
|
||||
raise RuntimeError("x")
|
||||
|
||||
chain = FallbackLLMProvider("llm", [("a", BadLLM()), ("b", BadLLM())])
|
||||
|
|
@ -47,18 +47,18 @@ def test_llm_fallback_all_fail_raises():
|
|||
|
||||
def test_llm_stream_fallback_before_first_token():
|
||||
class BadStream:
|
||||
async def complete(self, text, history=None, session_id=None):
|
||||
async def complete(self, text, history=None, session_id=None, language=None):
|
||||
return "x"
|
||||
|
||||
async def stream(self, text, history=None, session_id=None):
|
||||
async def stream(self, text, history=None, session_id=None, language=None):
|
||||
raise RuntimeError("boom")
|
||||
yield # macht die Funktion zum Generator
|
||||
|
||||
class GoodStream:
|
||||
async def complete(self, text, history=None, session_id=None):
|
||||
async def complete(self, text, history=None, session_id=None, language=None):
|
||||
return "ok"
|
||||
|
||||
async def stream(self, text, history=None, session_id=None):
|
||||
async def stream(self, text, history=None, session_id=None, language=None):
|
||||
yield "he"
|
||||
yield "llo"
|
||||
|
||||
|
|
@ -74,11 +74,11 @@ def test_llm_stream_fallback_before_first_token():
|
|||
|
||||
def test_config_llm_fallback_applied(monkeypatch):
|
||||
class BadLLM:
|
||||
async def complete(self, text, history=None, session_id=None):
|
||||
async def complete(self, text, history=None, session_id=None, language=None):
|
||||
raise RuntimeError("primary down")
|
||||
|
||||
class GoodLLM:
|
||||
async def complete(self, text, history=None, session_id=None):
|
||||
async def complete(self, text, history=None, session_id=None, language=None):
|
||||
return "rescued"
|
||||
|
||||
class StubTTS:
|
||||
|
|
@ -102,7 +102,7 @@ def test_config_llm_fallback_applied(monkeypatch):
|
|||
|
||||
def test_metrics_endpoint_records_requests_and_stages(monkeypatch):
|
||||
class StubLLM:
|
||||
async def complete(self, text, history=None, session_id=None):
|
||||
async def complete(self, text, history=None, session_id=None, language=None):
|
||||
return "hi"
|
||||
|
||||
class StubTTS:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue