#!/usr/bin/env bash # Chef-Gutachter-Feed (Orchestrator-Finale, User-Idee 06.07.): gpt-oss-120b als NÄCHTLICHER # Chef-Gutachter über die autonome Arbeit der Box — bewusst NIE im heißen Pfad (Kaltladen # ~2-5 min ist um 04:30 egal; tagsüber bleibt Lucy schnell). Muster wie dreaming-feed.sh: # liegt in ~/.hermes/scripts/, stdout wird dem Cron-Agenten als Prompt eingespeist. # Der eigentliche RICHTER läuft als Ein-Schuss-Completion direkt gegen llama-swap (:8080, # fremdblick-Architektur — umgeht Hermes' Delegations-Floor und braucht keinen Subagenten). # Richter-Kette: gpt-oss-120b; wirft der beim Laden "exited prematurely" (neben dem Warm-Set # live gesehen, E2E 07.07.), übernimmt GLM-4.6V-Flash als gekennzeichnete VERTRETUNG. set -uo pipefail ENDPOINT="${CHEF_ENDPOINT:-http://127.0.0.1:8080/v1/chat/completions}" CHEF="${CHEF_MODEL:-gpt-oss-120b}" VERTRETUNG="${CHEF_FALLBACK:-GLM-4.7-Flash}" MC="$HOME/mission-control-v2" VAULT="$HOME/wissens-vault" # ---------- Versionierter Auftrag für den Boten-Agenten ---------- cat "$MC/deploy/chef-gutachter-prompt.md" echo # ---------- Beweismaterial der letzten 24 h (hart begrenzt, erst sammeln, dann kürzen) ---------- EVID="$( echo "## BEWEISMATERIAL (automatisch erhoben am $(date '+%d.%m.%Y %H:%M'))" echo echo "### Vorschlags-Branches (Werkstatt/Orchestrator, jüngste zuerst):" git -C "$MC" fetch -q origin 2>/dev/null || true git -C "$MC" for-each-ref --sort=-committerdate refs/remotes/origin \ --format='%(committerdate:relative) | %(refname:short) | %(subject)' 2>/dev/null | head -10 echo echo "### main-Commits der letzten 24 h:" git -C "$MC" log --since='24 hours ago' --oneline origin/main 2>/dev/null | head -12 echo echo "### Wissens-Vault (neue Traum-Notizen, 24 h):" git -C "$VAULT" log --since='24 hours ago' --name-only --pretty='— %s' 2>/dev/null | head -20 echo echo "### Betriebs-Warnungen (journal, 24 h, je Dienst gezählt):" journalctl --user --since '24 hours ago' -p warning --no-pager 2>/dev/null \ | grep -oE 'hermes-gateway|mission-control-2|mem0-service|voice-service|hermes-builtin-ui' \ | sort | uniq -c | sort -rn | head -6 echo echo "### Aktivitäts-Insights (1 Tag):" bash -lc 'hermes insights --days 1' 2>/dev/null | sed 's/\x1b\[[0-9;]*m//g' | head -30 )" RASTER='Du bist der CHEF-GUTACHTER über die autonome Arbeit einer lokalen KI-Box (Hermes-Agent, Werkstatt, Orchestrator, Traum-Kreislauf). Du bekommst BEWEISMATERIAL der letzten 24 Stunden. Urteile AUSSCHLIESSLICH auf Basis dieses Materials — kein Lob und keine Behauptung ohne konkreten Beleg darin; fehlt dir zu einem Punkt Material, sage das offen. Antworte auf DEUTSCH, kompakt, in exakt dieser Struktur: VERDIKT: RISIKEN: <0-3 Punkte, je mit Beleg aus dem Material; "keine erkennbar" wenn leer> TOP-3 FUER DEN COMMANDER: ' # Ein-Schuss-Richter: $1=Modell-ID $2=curl-Timeout $3=max_tokens judge() { local req req="$(jq -n --arg m "$1" --arg sys "$RASTER" --arg usr "$EVID" --argjson mt "$3" \ '{model:$m, messages:[{role:"system",content:$sys},{role:"user",content:$usr}], max_tokens:$mt, temperature:0.2}')" curl -s -m "$2" "$ENDPOINT" -H 'Content-Type: application/json' --data-binary "$req" \ | python3 -c ' import json, sys try: d = json.load(sys.stdin) msg = d["choices"][0]["message"] out = (msg.get("content") or msg.get("reasoning_content") or "").strip() print(out) except Exception: pass' } RICHTER="$CHEF" VERDIKT="$(judge "$CHEF" 420 2600)" if [ -z "${VERDIKT// /}" ]; then RICHTER="$VERTRETUNG (Vertretung — $CHEF hat nicht geladen)" VERDIKT="$(judge "$VERTRETUNG" 240 1200)" fi echo "$EVID" echo if [ -z "${VERDIKT// /}" ]; then echo "## CHEF-VERDIKT: AUSGEFALLEN" echo "Beide Richter ($CHEF, $VERTRETUNG) haben nicht geantwortet — das dem Commander ehrlich melden." else echo "## CHEF-VERDIKT (Richter: $RICHTER)" echo "$VERDIKT" fi # Morgenlage für die Zentrale: das Verdikt STILL in den Briefkasten spiegeln (priority=silent — # Lucy soll die Wand Text nicht vorlesen; die Telegram-Botschaft macht der Cron-Agent selbst). # Cockpit („Morgenlage"-Karte) und Chronik lesen es dort mit source=chef-gutachter heraus. if [ -n "${VERDIKT// /}" ]; then curl -sf -m 5 -X POST "${MC_ANNOUNCE_URL:-http://127.0.0.1:9001/api/voice/announce}" \ -H 'Content-Type: application/json' \ --data "$(python3 - "$RICHTER" "$VERDIKT" <<'PY' import json, sys print(json.dumps({"text": sys.argv[2], "subject": f"Morgenlage (Richter: {sys.argv[1]})", "source": "chef-gutachter", "priority": "silent"})) PY )" >/dev/null 2>&1 || true fi