feat(brain): Compacting fuer ARIAs lokalen Modus + Erklaerung in der Info-Box

Lokal bekam ARIA starr die letzten 8 Nachrichten — alles davor war fuer das
lokale Modell weg. Neu (local_compact.py):
- Fenster nach Tokens: so viele der letzten Nachrichten, wie in ~75 % des
  Kontextfensters der Karte passen (Systemprompt + Antwort abgezogen), max.
  LOCAL_MAX_TURNS (12). Kontextfenster vom Cluster (Bridge /internal/llm-models).
- Was herausfaellt, fasst das lokale Modell im Hintergrund zum laufenden
  Notizzettel zusammen (pro Projekt, /data/local_summaries.json); er geht als
  "Bisheriger Verlauf" in den lokalen Systemprompt. Destillat ins Gedaechtnis
  laeuft unveraendert weiter. Reset des Gespraechs loescht auch den Zettel.
- Bridge/local_llm: optionale laengere Frist fuer Hintergrund-Aufrufe
  (Compacting 180 s statt der 30 s fuer schnelle Antworten).

Diagnostic: Info-Box zum Kontext erklaert Kuerzen / Compacting / Gedaechtnis
und was ARIA davon nutzt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-25 15:10:18 +01:00
co-authored by Claude Opus 5.5
parent 48fc88d430
commit b93b62eea9
6 changed files with 233 additions and 9 deletions
+13 -3
View File
@@ -4271,7 +4271,7 @@ class ARIABridge:
async def _local_llm(self, messages: list, max_tokens: int = 512,
temperature: float = 0.7, stop=None, tools=None,
model=None) -> dict:
model=None, timeout: Optional[float] = None) -> dict:
"""Schickt einen llm_request an den llm-adapter (AI-Box), wartet auf
llm_response. tools (B1b) werden durchgereicht; tool_calls kommen zurueck.
Rueckgabe: {ok, content, tool_calls, model, elapsedMs} oder {ok:False, error}."""
@@ -4286,7 +4286,7 @@ class ARIABridge:
res = await self._llm_cluster.route({
"model": model or "", "messages": messages, "max_tokens": max_tokens,
"temperature": temperature, "stop": stop, "tools": tools,
}, timeout=self._LLM_TIMEOUT_S)
}, timeout=timeout or self._LLM_TIMEOUT_S)
if not res.get("ok"):
err = res.get("error") or "llm-adapter Fehler"
if res.get("errorCode") == "model_unavailable":
@@ -4773,6 +4773,10 @@ class ARIABridge:
elif method == "POST" and path == "/internal/satellite-list":
# Brain fragt: welche Satelliten/Netze sind online + Capabilities.
await _send_response(writer, 200, {"ok": True, "satellites": self._satellite_list()})
elif method in ("GET", "POST") and path == "/internal/llm-models":
# Brain fragt: welche lokalen Modelle sind geladen + ihr
# Kontextfenster (fuer ARIAs Compacting im lokalen Modus).
await _send_response(writer, 200, {"ok": True, "models": self._llm_cluster.models()})
elif method in ("GET", "POST") and path == "/internal/worker-list":
# Diagnostic/Brain fragt: welche Compute-Worker sind online (Flotte).
await _send_response(writer, 200, {"ok": True, "workers": self._worker_list()})
@@ -4934,10 +4938,16 @@ class ARIABridge:
temperature = 0.7
_tools = data.get("tools") if isinstance(data.get("tools"), list) else None
_model = data.get("model") if isinstance(data.get("model"), str) else None
# Hintergrund-Arbeit (Compacting) darf laenger dauern als die
# 30 s fuer schnelle Antworten — gedeckelt auf 5 min.
try:
_timeout = min(300.0, float(data["timeout"])) if data.get("timeout") else None
except (TypeError, ValueError):
_timeout = None
result = await self._local_llm(
messages=messages, max_tokens=max_tokens,
temperature=temperature, stop=data.get("stop"),
tools=_tools, model=_model,
tools=_tools, model=_model, timeout=_timeout,
)
status = 200 if result.get("ok") else 502
await _send_response(writer, status, result)