diagnostic/server.js — Handler umgebaut: event: "agent" für Deltas, event: "chat" mit state: "final" für Antworten, extractChatText() parst das content[] Array

bridge/aria_bridge.py — Gleicher Fix: _extract_chat_text() Methode, neue Event-Handler für agent und chat mit state, Legacy-Namen als Fallback
This commit is contained in:
2026-03-13 08:14:52 +01:00
parent fcb22f60d3
commit 9cad631015
3 changed files with 133 additions and 39 deletions
+64 -10
View File
@@ -625,28 +625,64 @@ class ARIABridge:
event_name = message.get("event", "")
payload = message.get("payload", {})
if event_name == "chat:delta":
# Streaming-Delta — fuer spaeter (Live-Typing in der App)
delta = payload.get("delta", payload.get("text", ""))
if delta:
# ── agent Events: Streaming-Deltas vom LLM ──
if event_name == "agent":
data = payload.get("data", {})
delta = data.get("delta", "")
if delta and payload.get("stream") == "assistant":
logger.debug("[core] Delta: '%s'", delta[:40])
return
# ── chat Events: Snapshots mit state=delta|final|error ──
if event_name == "chat":
state = payload.get("state", "")
if state == "final":
text = self._extract_chat_text(payload)
if not text:
logger.warning("[core] chat final ohne Text: %s", json.dumps(payload)[:200])
return
logger.info("[core] Antwort: '%s'", text[:80])
await self._process_core_response(text, payload)
return
if state == "error":
error = payload.get("error", "Unbekannt")
logger.error("[core] Chat-Fehler: %s", error)
await self._send_to_rvs({
"type": "chat",
"payload": {
"text": f"[Fehler] {error}",
"sender": "aria",
},
"timestamp": int(asyncio.get_event_loop().time() * 1000),
})
return
# state=delta — periodischer Snapshot, ignorieren
return
# ── Legacy event names (chat:delta, chat:final, chat:error) ──
if event_name == "chat:delta":
delta = payload.get("delta", payload.get("text", ""))
if delta:
logger.debug("[core] Delta (legacy): '%s'", delta[:40])
return
if event_name == "chat:final":
# Fertige Antwort von aria-core
text = payload.get("text", payload.get("message", ""))
if not text:
text = self._extract_chat_text(payload)
if not text:
logger.warning("[core] chat:final ohne Text: %s", json.dumps(payload)[:200])
return
logger.info("[core] Antwort: '%s'", text[:80])
logger.info("[core] Antwort (legacy): '%s'", text[:80])
await self._process_core_response(text, payload)
return
if event_name == "chat:error":
error = payload.get("error", payload.get("message", "Unbekannt"))
logger.error("[core] Chat-Fehler: %s", error)
# Fehler auch an die App melden
logger.error("[core] Chat-Fehler (legacy): %s", error)
await self._send_to_rvs({
"type": "chat",
"payload": {
@@ -657,9 +693,27 @@ class ARIABridge:
})
return
# Andere Events loggen (presence, tick, etc.)
# tick, health, etc. — ignorieren
if event_name in ("tick", "health"):
return
logger.debug("[core] Event: %s", event_name)
@staticmethod
def _extract_chat_text(payload: dict) -> str:
"""Extrahiert Text aus OpenClaw chat-Event message.content Array."""
try:
content = payload.get("message", {}).get("content", [])
if isinstance(content, list):
return "".join(
c.get("text", "") for c in content if c.get("type") == "text"
)
if isinstance(content, str):
return content
except (AttributeError, TypeError):
pass
return payload.get("text", "")
async def _process_core_response(self, text: str, payload: dict) -> None:
"""Verarbeitet eine fertige Antwort von aria-core.