fix(brain): Info-Halluzination-Guard + expliziter Claude-Wunsch im Router
Local erfand Live-Auskuenfte (aktueller Song, Restzeit, Skip-Titel) ohne run_spotify zu rufen. Neuer Detektor _claims_live_media_state() + Guard eskaliert solche Behauptungen ohne echten Skill-Call an Claude. Local-Prompt gehaertet: nie Titel/Interpret/Restzeit ohne Tool-Ergebnis nennen. Router: _FORCE_CLAUDE respektiert 'nimm Claude/Clodi' → nie lokal. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -86,6 +86,18 @@ _HARD_HINTS = re.compile(
|
||||
|
||||
_MAX_LEN_FOR_LOCAL = 220 # laengere Nachrichten = eher komplexe Aufgaben → Claude
|
||||
|
||||
# Expliziter Nutzer-Wunsch „nimm das grosse Modell". Stefan sagt oft „frag Clodi"
|
||||
# / „benutze direkt Claude" — dann soll der Turn NICHT lokal versucht werden,
|
||||
# sondern direkt an Claude gehen. „Clodi/Clody" ist sein Kosename fuer Claude und
|
||||
# meint praktisch immer Routing; „claude"/„grosses modell" nur in Imperativ-Kontext
|
||||
# (nimm/nutze/frag/…), damit reine Trivia „was ist Claude" nicht faelschlich matcht.
|
||||
_FORCE_CLAUDE = re.compile(
|
||||
r"\b(clodi|clody)\b"
|
||||
r"|\b(nimm|nutze|benutze|verwende|frag(e|st)?|nimms?t?|mit|via|direkt|per)\b"
|
||||
r"[^.?!]*\b(claude|gro(ss|ß)es?\s+modell)\b",
|
||||
re.IGNORECASE,
|
||||
)
|
||||
|
||||
|
||||
def _strip_leading_hint_blocks(text: str) -> str:
|
||||
"""Fuehrende `[ ... ]`-Hint-Bloecke (GPS, Barge-In von der Bridge) weg —
|
||||
@@ -108,6 +120,10 @@ def should_try_local(user_message: str, cfg: dict) -> bool:
|
||||
msg = _strip_leading_hint_blocks(user_message)
|
||||
if not msg or len(msg) > _MAX_LEN_FOR_LOCAL:
|
||||
return False
|
||||
# Expliziter „nimm Claude/Clodi"-Wunsch → nie lokal (User hat entschieden).
|
||||
if _FORCE_CLAUDE.search(msg):
|
||||
logger.info("[router] expliziter Claude-Wunsch erkannt → nicht lokal")
|
||||
return False
|
||||
if _TOOL_HINTS.search(msg):
|
||||
return False
|
||||
if _HARD_HINTS.search(msg):
|
||||
@@ -166,6 +182,13 @@ def build_local_system_prompt(identity_anchor: str, has_tools: bool = False,
|
||||
"'Spotify: …' / 'Playlist abspielen'-Quittung o.ae. ohne echten "
|
||||
"Skill-Aufruf. Kannst/willst du es nicht per Werkzeug tun, sag es "
|
||||
"ehrlich oder eskaliere — erfinde keine Bestaetigung.",
|
||||
"Das gilt GENAUSO fuer Live-Auskuenfte: Nenne NIEMALS einen aktuellen "
|
||||
"Songtitel, Interpreten, die Restzeit oder was gerade laeuft/welches "
|
||||
"Geraet spielt, ohne den passenden Skill (z.B. run_spotify) WIRKLICH "
|
||||
"aufgerufen und sein Ergebnis gelesen zu haben. Kein Tool-Ergebnis = du "
|
||||
"weisst es NICHT — dann eskaliere, statt einen Titel/eine Zeit zu raten. "
|
||||
"Gib nur weiter, was im Skill-Ergebnis wirklich steht; hat der Skill "
|
||||
"keinen Titel geliefert (z.B. nur 'OK: next'), erfinde auch keinen.",
|
||||
]
|
||||
parts += [
|
||||
"",
|
||||
|
||||
Reference in New Issue
Block a user