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:
+64
-10
@@ -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.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user