feat(diagnostic): Quell-Badge an ARIA-Bubbles (local / claude / fast-path)
Zeigt pro Antwort, welcher Backend sie erzeugt hat — farbcodiert (lokal=gruen, Claude=blau, Fast-Path=lila). Nur in Diagnostic (App bleibt Mama-tauglich). - agent.chat() gibt jetzt (reply, answered_by) zurueck; an jedem Return-Punkt gesetzt (fast-path/local/claude). Beide Aufrufer (main.py, background.py) angepasst. main.py: ChatOut.answered_by. - bridge: liest answered_by aus /chat, reicht es an _process_core_response, broadcastet es im chat-Payload UND persistiert es in chat_backup (answeredBy) → bleibt nach Reload. - diagnostic: srcBadgeHtml() rendert den Badge in Live-Chat + History; server.js liefert answeredBy in der chat_history. Erweiterbar: spaeter kann ein Bild-Backend (FLUX/Modellname) denselben Kanal nutzen. Modellwechsel-fuer-Antworten (groessere Modelle bei mehr GPUs) bleibt B0.5/Skalierungs-Thema im Plan. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1257,12 +1257,14 @@ class ARIABridge:
|
||||
# Voice-Tag-Noise als Kontext sieht).
|
||||
# File-Marker werden separat als file_from_aria-Events ausgeliefert.
|
||||
display_text = strip_voice_tag_for_display(text)
|
||||
_answered_by = (payload.get("answeredBy") or "") if isinstance(payload, dict) else ""
|
||||
assistant_backup_ts = self._append_chat_backup({
|
||||
"role": "assistant",
|
||||
"text": display_text,
|
||||
"files": [{"serverPath": f["serverPath"], "name": f["name"],
|
||||
"mimeType": f["mimeType"], "size": f["size"]} for f in aria_files],
|
||||
"project_id": turn_pid,
|
||||
"answeredBy": _answered_by,
|
||||
})
|
||||
|
||||
metadata = payload.get("metadata", {})
|
||||
@@ -1305,6 +1307,8 @@ class ARIABridge:
|
||||
# Projekt-Zuordnung — App + Diagnostic sortieren die Bubble in
|
||||
# den passenden Projekt-Block. Leer = Hauptchat.
|
||||
"projectId": (payload.get("projectId") or "") if isinstance(payload, dict) else "",
|
||||
# Quell-Backend (local/claude/fast-path) fuer den Diagnostic-Badge.
|
||||
"answeredBy": (payload.get("answeredBy") or "") if isinstance(payload, dict) else "",
|
||||
},
|
||||
"timestamp": int(asyncio.get_event_loop().time() * 1000),
|
||||
})
|
||||
@@ -1633,6 +1637,9 @@ class ARIABridge:
|
||||
# gegeben damit der chat-Broadcast die Bubble dem richtigen Projekt-
|
||||
# Block in App + Diagnostic zuordnen kann.
|
||||
turn_project_id = (data.get("project_id") or "").strip()
|
||||
# Welcher Backend geantwortet hat (local/claude/fast-path) — fuer den
|
||||
# Quell-Badge in Diagnostic.
|
||||
answered_by = (data.get("answered_by") or "claude").strip()
|
||||
|
||||
# Side-Channel-Events VOR der Chat-Bubble broadcasten (z.B. skill_created)
|
||||
# damit sie in der UI vor der Reply auftauchen
|
||||
@@ -1699,7 +1706,8 @@ class ARIABridge:
|
||||
# passend behandelt wird (hier minimal, weil Brain noch keine
|
||||
# metadata mitschickt).
|
||||
try:
|
||||
await self._process_core_response(reply, {"projectId": turn_project_id})
|
||||
await self._process_core_response(reply, {"projectId": turn_project_id,
|
||||
"answeredBy": answered_by})
|
||||
except Exception:
|
||||
logger.exception("[brain] _process_core_response Fehler")
|
||||
await self._emit_activity("idle", "", project_id=project_id)
|
||||
|
||||
Reference in New Issue
Block a user