Systemaudit vom 27.08.2026. Alle Befunde gemessen, nicht vermutet.
VIER STILLE DEFEKTE
1. mc2-steward startete seit Wochen nicht (live: 207.609 Neustarts).
steward.py importierte services.memory, das beim Mem0-Ausbau geloescht
wurde -> ImportError bei jedem Start. Re-Warm- und Health-Waechter
waren damit tot.
2. Jedes Hermes-Update wurde automatisch zurueckgerollt.
hermes-postcheck.sh prueft vier Dinge, die es seit dem 07.08. nicht mehr
gibt (Sidecar :8765, /api/memory, memory.provider, mc2-memory-Plugin).
Die Checks konnten nicht gruen werden -> autoupdate.sh wertete jedes
Update als rot und rollte es zurueck. Checks ersatzlos entfernt; der
Tool-Smoke laeuft ohnehin durch den echten Agenten.
3. 7 von 12 Skills waren per Knopfdruck nicht startbar.
deploy.sh kopiert Skills mit tr '-' '_' nach ~/.hermes/skills/,
routers/skills.py gab Hermes aber den Ordnernamen MIT Bindestrich.
Der Knopf meldete Erfolg, ausgefuehrt wurde nichts. Neu: _hermes_name().
4. deploy.sh warf bei jedem Deploy die Live-Modellkonfiguration weg.
MC2 schreibt /etc/llama-swap/config.yaml selbst; die Repo-Datei ist nur
ein Abzug (ihm fehlt u.a. kritiker/Devstral). Jetzt: erst sichern, Diff
zeigen, dann kopieren. MC_DEPLOY_SKIP_SWAP_CONFIG=1 ueberspringt.
MEM0-AUSBAU VOLLENDET (Kriterium 3: 17 -> 0 Dateien)
- mem0_service/, mcp/mcp_memory.py und hermes/plugins/mc2-memory entfernt;
das Plugin schickte bei JEDEM Turn zwei 404-Requests an tote Routen.
- MEMORY_DB/MEM0_SERVICE_URL, _mem0_reachable(), MC_MEMORY_DB und
MC_MEM_DEDUPE_ENABLED aus Config/Router/Unit entfernt.
- mem0_ms war strukturell tot (park("retrieve") wird nirgends mehr
aufgerufen) -> aus Backend, API-Typ und Latenzkarte entfernt.
- Verbinden-Tab: tote Gedaechtnis-MCP-Leitung raus, Status-Kachel bleibt.
- AGENTS.md beschrieb Mem0 noch als aktiv - korrigiert.
GATEWAY-ROBUSTHEIT
- _proxy gab bei ungueltigen Payloads HTTP 500 (gemessen 5/5: Rohtext,
leerer Body, JSON-Liste, JSON-String, null) -> jetzt 5/5 HTTP 400.
- Bild-Weiche ohne Deckel: 10 Bilder x 2 Versuche x 240 s hielten den
Client bis zu 80 min. Neu: MC_CODER_IMAGE_MAX (4), Rueckfall auf die
Vision-Umleitung.
- /v1/models: nicht-JSON von der Engine gab 500 -> jetzt 502.
UNITS UND DEPLOY
- mc2-steward.service, dessen warmset-Drop-in und voice-service.service
fehlten im Repo, obwohl maintenance.py und stack-postcheck.sh sie
voraussetzen. 1:1 von der laufenden Box uebernommen.
- deploy.sh startete mc2-steward nie neu; restore.sh liess mc2-gateway und
mc2-steward mit alter Config weiterlaufen. Beide ergaenzt.
FRONTEND
- useEigenleben rief /api/eigenleben - existiert im Backend nicht und wurde
nirgends genutzt. Samt Typen entfernt.
- Anleitung beschrieb einen Gedaechtnis-Tab, den es nicht gibt.
- Abgeglichen: alle uebrigen 63 Frontend-Aufrufe treffen echte Routen, alle
5 SSE-Invalidation-Keys sind gemappt, keine ungefangenen Promises.
Gates: compileall gruen - ruff "All checks passed" - tsc gruen - vite build
gruen (dist aktualisiert) - Importe app/steward/gateway_app gruen.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
71 lines
3.4 KiB
Bash
71 lines
3.4 KiB
Bash
#!/usr/bin/env bash
|
|
# Lädt das warme "brains"-Set nach einem llama-swap-(Re)Start vor, damit die ERSTE
|
|
# Anfrage nicht kalt ist (llama-swap lädt sonst lazy bei Bedarf).
|
|
# Eingehängt als ExecStartPost=-/usr/local/bin/llama-swap-warmup.sh in llama-swap.
|
|
#
|
|
# `fast` = das Agent-Hirn (Qwen3.6-35B-A3B), `embed` = das Embedding-Modell
|
|
# (Qwen3-Embedding-0.6B). Die Augen (vision/VL-30B) sind seit 07.07.
|
|
# ON-DEMAND (User-Entscheid) und gehören NICHT mehr ins Warm-Set — die Lucy-App wärmt sie
|
|
# beim Start selbst an. Modelle werden NICHT automatisch zusammen geladen — jedes einzeln
|
|
# anstoßen, sonst bleibt es kalt.
|
|
# Embedding läuft im --embedding-Modus → anderer Endpunkt (/v1/embeddings, nicht chat).
|
|
# Selbst-detachend: blockiert den Service-Start nicht.
|
|
# NACH ÄNDERUNG: sudo cp deploy/warmup.sh /usr/local/bin/llama-swap-warmup.sh (root-Kopie!)
|
|
set -u
|
|
URL="${MC_LLAMA_SWAP_URL:-http://127.0.0.1:8080}"
|
|
BRAINS="${MC_WARMUP_MODELS:-fast}"
|
|
EMBEDS="${MC_WARMUP_EMBED:-embed}"
|
|
# Reranker laufen im --reranking-Modus und antworten NUR auf /v1/rerank — weder Chat noch
|
|
# Embeddings wecken sie. Solange das hier fehlte, galt der Reranker dem Waechter dauerhaft
|
|
# als "fehlend": er rief warmup.sh alle 90 s auf, ohne dass sich je etwas aendern konnte
|
|
# (600 vergebliche Laeufe in 24 h, aelteste Meldung 15.07.2026).
|
|
RERANKS="${MC_WARMUP_RERANK:-reranker}"
|
|
|
|
if [ "${1:-}" != "--inner" ]; then
|
|
setsid "$0" --inner >/dev/null 2>&1 &
|
|
exit 0
|
|
fi
|
|
|
|
# --- ab hier im entkoppelten Hintergrundprozess ---
|
|
for _ in $(seq 1 60); do # auf llama-swap warten (max ~120s)
|
|
curl -sf "$URL/v1/models" >/dev/null 2>&1 && break
|
|
sleep 2
|
|
done
|
|
|
|
for m in $BRAINS; do # Chat-Hirne über /v1/chat/completions
|
|
curl -s -m 180 -X POST "$URL/v1/chat/completions" \
|
|
-H 'Content-Type: application/json' \
|
|
-d "{\"model\":\"$m\",\"max_tokens\":1,\"messages\":[{\"role\":\"user\",\"content\":\"ping\"}]}" \
|
|
>/dev/null 2>&1 || true
|
|
done
|
|
|
|
for m in $EMBEDS; do # Embedding-Modelle über /v1/embeddings
|
|
curl -s -m 120 -X POST "$URL/v1/embeddings" \
|
|
-H 'Content-Type: application/json' \
|
|
-d "{\"model\":\"$m\",\"input\":\"ping\"}" \
|
|
>/dev/null 2>&1 || true
|
|
done
|
|
|
|
for m in $RERANKS; do # Reranker über /v1/rerank (eigener Endpunkt!)
|
|
curl -s -m 120 -X POST "$URL/v1/rerank" \
|
|
-H 'Content-Type: application/json' \
|
|
-d "{\"model\":\"$m\",\"query\":\"ping\",\"documents\":[\"ping\"]}" \
|
|
>/dev/null 2>&1 || true
|
|
done
|
|
|
|
# Agenten-Prompt vorkauen: Hermes' Systemprompt (~70 KB, 33 Tool-Schemas) kostet nach
|
|
# jedem Modell-(Neu-)Laden sonst 30-40 s Prefill BEIM ERSTEN USER-CALL (gemessen 03.07.:
|
|
# kalt 37 s, mit gefülltem Prompt-Cache ~6 s). Ein Wegwerf-Turn füllt den -cram-Cache.
|
|
AGENT_KEY="$(grep -E '^API_SERVER_KEY=' "$HOME/.hermes/.env" 2>/dev/null | cut -d= -f2- | tr -d '"' | tr -d "'")"
|
|
if [ -n "$AGENT_KEY" ]; then
|
|
for _ in $(seq 1 45); do # auf hermes-gateway warten (Boot-Reihenfolge)
|
|
curl -sf -m 2 "http://127.0.0.1:8642/health" >/dev/null 2>&1 && break
|
|
sleep 2
|
|
done
|
|
curl -s -m 120 -X POST "http://127.0.0.1:8642/v1/chat/completions" \
|
|
-H "Authorization: Bearer $AGENT_KEY" -H 'Content-Type: application/json' \
|
|
-H 'X-Hermes-Session-Id: warmup-prefill' \
|
|
-d '{"model":"hermes","stream":false,"messages":[{"role":"user","content":"Sag nur OK."}]}' \
|
|
>/dev/null 2>&1 || true
|
|
fi
|