fix(bridge): User informieren wenn ARIA Marker fuer nicht-existente Datei setzt
Bridge-Logs zeigten: ARIA setzt zwei Marker (aria_rave2.mid und .mp3), hat die .mid aber nie wirklich erstellt. Bridge filterte sie silent → Stefan sah nur eine Bubble und dachte das Marker-System ist kaputt. Jetzt: _extract_file_markers gibt auch eine Liste der "missing"-Pfade zurueck, und im Antworttext steht ein Hinweis-Block fuer den User welche Files versprochen aber nicht erstellt wurden. Plus System-Prompt geschaerft: ARIA soll vor dem Marker pruefen ob das File wirklich existiert. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
+15
-4
@@ -894,9 +894,11 @@ class ARIABridge:
|
||||
# enthalten, Endung beliebig). Mehrfach im Text moeglich.
|
||||
_FILE_MARKER_RE = re.compile(r"\[FILE:\s*(/shared/uploads/[^\]]+?)\s*\]", re.IGNORECASE)
|
||||
|
||||
def _extract_file_markers(self, text: str) -> tuple[str, list[dict]]:
|
||||
"""Sucht [FILE: /shared/uploads/...]-Marker, gibt (cleaned_text, file_list) zurueck."""
|
||||
def _extract_file_markers(self, text: str) -> tuple[str, list[dict], list[str]]:
|
||||
"""Sucht [FILE: /shared/uploads/...]-Marker.
|
||||
Returns (cleaned_text, valid_files, missing_paths)."""
|
||||
files: list[dict] = []
|
||||
missing: list[str] = []
|
||||
for m in self._FILE_MARKER_RE.finditer(text):
|
||||
path = m.group(1).strip()
|
||||
if not path.startswith("/shared/uploads/"):
|
||||
@@ -904,6 +906,7 @@ class ARIABridge:
|
||||
continue
|
||||
if not os.path.isfile(path):
|
||||
logger.warning("[core] FILE-Marker zeigt auf nicht existente Datei: %s", path)
|
||||
missing.append(path)
|
||||
continue
|
||||
name = os.path.basename(path)
|
||||
mime, _ = mimetypes.guess_type(path)
|
||||
@@ -917,7 +920,7 @@ class ARIABridge:
|
||||
cleaned = self._FILE_MARKER_RE.sub("", text).strip()
|
||||
# Zwei aufeinanderfolgende Leerzeilen → eine
|
||||
cleaned = re.sub(r"\n{3,}", "\n\n", cleaned)
|
||||
return cleaned, files
|
||||
return cleaned, files, missing
|
||||
|
||||
async def _broadcast_aria_file(self, file_info: dict) -> None:
|
||||
"""ARIA hat eine Datei fuer den User erstellt — App+Diagnostic informieren."""
|
||||
@@ -950,9 +953,17 @@ class ARIABridge:
|
||||
# ARIA legt damit Dateien fuer den User bereit (Bilder, PDFs, etc.).
|
||||
# Der Marker wird aus dem Antworttext entfernt (TTS soll ihn nicht
|
||||
# vorlesen) und parallel als file_from_aria-Event geschickt.
|
||||
text, aria_files = self._extract_file_markers(text)
|
||||
text, aria_files, missing_files = self._extract_file_markers(text)
|
||||
for f in aria_files:
|
||||
await self._broadcast_aria_file(f)
|
||||
# Bei fehlenden Files: User informieren (sonst sieht er nur stille
|
||||
# Verluste — ARIA hat den Marker hingeschrieben aber das File nicht
|
||||
# tatsaechlich angelegt).
|
||||
if missing_files:
|
||||
missing_list = "\n".join(f" • {os.path.basename(p)}" for p in missing_files)
|
||||
text = (text + "\n\n[Hinweis] Folgende Dateien hat ARIA zwar erwaehnt "
|
||||
f"aber nicht erstellt:\n{missing_list}\n"
|
||||
"Bitte ARIA bitten, sie wirklich zu schreiben.").strip()
|
||||
|
||||
metadata = payload.get("metadata", {})
|
||||
is_critical = metadata.get("critical", False)
|
||||
|
||||
Reference in New Issue
Block a user