User 25.09.: „Warum kann ich Modell-Tests nicht selbst anstoßen, sondern muss immer auf die Box warten?“ Nachts testet das Radar weiter selbst. Tagsüber jetzt auch per Knopf – aber nur, wenn Kandidat, Warm-Set UND der heutige Coder zusammen unter die 115-GB-Grenze passen (der Test-Wächter stoppt den Kandidaten erst bis zu 10 s, nachdem der Coder zu laden beginnt), und nicht 00:00–03:30. Sonst steht der Grund beim Kandidaten. Test als Auftrag (radar_lauf.py --test), höchstens 2 h, dieselben Leitplanken wie nachts; jedes Ergebnis kommt als Meldung. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7.5 KiB
Radar — Modell-Radar, Stack-Radar, Prüfstand
Stand 24.09.2026, Code in main = 75611be. Für Techniker und Agenten.
Es gibt zwei Radare mit getrennten Aufgaben:
- Modell-Radar (Box-Wart,
mc2-radar.timerum 00:30): sucht und testet neue Modelle für Hirn und Coder selbst. Getauscht wird nur per Knopf „Übernehmen". - Stack-Radar (Hermes-Cron „KI und Stack Radar", Sa 08:00): Wochenbericht über den Zustand der Box und über Neuigkeiten draußen (Releases, Entwurfsmodelle). Er testet und ändert nichts.
Modell-Radar
Code: backend/services/radar.py, Nachtlauf backend/radar_lauf.py, Messungen deploy/bench/pruefstand.py,
Merkliste deploy/radar-watchlist.json. Zustand: /srv/models/mc2-radar.json, Baseline
/srv/models/mc2-radar-baseline.json, Downloads /srv/models/radar/<id>/. Protokoll:
journalctl --user -u mc2-radar.
Leitplanken (User-Entscheid 23.09.)
- Zwei Rollen: Hirn (Alias
hermes) und Coder (Aliascoder), jede mit Bild-Zwilling (visionbzw.coder-bild). - Tests nur nachts 00:30–02:30, höchstens ein neuer Kandidat pro Woche. Um 03:00 braucht der NerdQuiz-Nachtlauf das Hirn.
- Jetzt testen (seit 25.09.2026, User-Wunsch): Auf der Modelle-Seite hat jeder wartende Kandidat den Knopf, wenn er
samt heutigem Coder neben das Warm-Set passt (Bedarf + 29 GB Coder ≤ 88 GB, also ~59 GB) und es nicht zwischen 00:00
und 03:30 ist. Grund: Tagsüber kann jederzeit der Coder laden; der Test-Wächter stoppt den Kandidaten dann, aber
erst nach bis zu zehn Sekunden — so lange müssen alle drei in den Speicher passen. Sonst steht der Grund beim
Kandidaten, und er wartet auf die Nacht. Der Test läuft als Auftrag (
radar_lauf.py --test <id>, Gruppe „radar“), höchstens zwei Stunden, mit denselben Leitplanken wie nachts; jedes Ergebnis kommt als Meldung. Er zählt für die Wochengrenze mit (erster_start).POST /api/radar/{id}/testen, 409 mit Grund, wenn es nicht geht. - Nur was neben das Warm-Set passt: 27 GB Warm-Set plus Kandidat mit KV-Cache ≤ 115 GB, gerechnet mit dem Kontext aus dem Betrieb (131 072; passt das nicht, stufenweise kleiner, nie unter 32 768). Ab 90 % des Budgets heißt es „passt knapp".
- Pflicht: GGUF plus Bild-Projektor (mmproj), mindestens 20B Parameter; als Hirn höchstens 12B aktive Parameter (dichte Modelle nie als Hirn). Die installierte Engine muss die Architektur kennen, und die Platte darf nach dem Download nicht über 80 % liegen.
- Durchgefallene werden gelöscht, Bestandene bleiben liegen. Getauscht wird erst mit „Übernehmen".
Ablauf einer Nacht
- Um 00:30 startet
mc2-radar.service(Persistent=true, holt einen verpassten Lauf nach). - Suche, höchstens einmal am Tag: zuerst die Merkliste in ihrer Reihenfolge, dann die Hugging-Face-Entdeckung (höchstens 3 Funde je Rolle). Jeder Fund wird bewertet: Dateien, Größe, Engine-Unterstützung, Speicher. Der Knopf „Jetzt suchen" macht dasselbe sofort (läuft synchron und kann Minuten dauern).
- Offene Urteile nachholen: Kandidaten mit Status „getestet", bei denen die Vergleichsmessung fehlte.
- Test, wenn ein Kandidat dran ist:
- Download nach
/srv/models/radar/<id>/. - Baseline des heutigen Modells der Rolle über llama-swap (gecacht, höchstens monatlich neu gemessen).
- In llama-swap bleibt nur das Warm-Set; ein Aufpasser entlädt Modelle, die nachts nachgeladen werden (etwa den Coder).
- Draft-Varianten kurz messen: ohne Draft, eingebauter MTP-Kopf, Draft des heutigen Modells (nur bei gleicher Architektur und genug Speicher). Ein Draft aus der Merkliste wird allein genommen.
- Mit der schnellsten Variante den Prüfstand fahren; der Kandidat läuft als eigener
llama-serverauf:5899. - Bild-Probe über einen Zwilling ohne Draft, dann das Urteil.
- Download nach
- Frist: Die Messungen prüfen das Fensterende 02:30 selbst. 5 Minuten danach zieht die Notbremse
(Kandidaten-Server und Download stoppen, der Prozess endet hart).
RuntimeMaxSec=2h10minbeendet die Unit spätestens um 02:40 samtllama-server. - Bestanden: Meldung „[Modell-Radar] … hat den Nachttest bestanden"; nachts landet sie in der Morgenmeldung.
Status eines Kandidaten: neu → wartet → getestet → bestanden oder durchgefallen → uebernommen oder verworfen. Höchstens 3 Versuche je Kandidat; ein Abbruch, für den der Kandidat nichts kann, zählt nicht als Versuch.
Prüfstand (deploy/bench/pruefstand.py)
- Der Kandidat läuft als eigener
llama-serverauf127.0.0.1:5899; der Live-Stack bleibt unberührt. - Hirn: Tempo kurz und bei 13k Kontext (Prefill, Decode, Draft-Akzeptanz), Werkzeug-Aufrufe zwischen ~100 Werkzeugen mit ~12k Kontext, Deutsch- und JSON-Probe.
- Coder: Tempo, Werkzeug-Aufrufe eines Coding-Agenten, 10 kleine Programmieraufgaben mit Unit-Tests in einem Temp-Ordner mit Zeitlimit.
- Bild: ein im Code gezeichnetes Bild (Formen, Farben, Text), einmal direkt, einmal mitten in einer Werkzeug-Aufgabe.
- Urteil: bestanden = keine Verschlechterung bei den Pflichtwerten UND mindestens ein echter Vorteil.
- Handbetrieb:
deploy/bench/pruefstand-hirn.pymisst Kandidaten mit festen Pfaden gegen die Live-Modelle, optional mit einem Werkzeug-Test durch den echten Hermes (Providerpruefstandin der Hermes-Config).
Übernehmen und Verwerfen (Seite „Modelle")
Übernehmen geht nur bei Status „bestanden" und nicht während eines Nachtlaufs:
- Der Ordner wandert von
/srv/models/radar/nach/srv/models/<Repo-Name>. - Eintrag in llama-swap mit dem getesteten Draft und den Betriebs-Flags der Rolle, ohne Projektor. Dazu der
Bild-Zwilling
<Eintrag>-Bildin der Gruppebild(ttl 900). Der alte Zwilling fliegt aus der Config, seine Dateien bleiben. - Hirn: Alias
hermes, Gruppebrains, ttl 0,model.defaultin der Hermes-Config; Hermes startet dafür kurz neu. Der Aliasfastwandert mit,MC_WARMSETim Steward-Drop-in wird umgestellt und der Steward neu gestartet. Coder: Rollecoder;heavywandert mit, die ttl des alten Coders wird übernommen. - Das alte Modell bleibt auf der Platte (Aufräumen-Panel).
Verwerfen: Die heruntergeladenen Dateien werden gelöscht, und das Radar testet dieses Modell nie wieder.
Ein Tausch schreibt die llama-swap-Config heute noch mehrmals (offener Punkt in wissen/OFFENE-FAEDEN.md).
Merkliste
deploy/radar-watchlist.json, Felder je Eintrag: name, rolle (hirn oder coder), repo, quant (Standard
Q4_K_M), eng (passt nur knapp), notiz, ueberspringen (Grund, dann kein Test), optional draft und flags.
Merkliste und Hugging-Face-Entdeckung zusammen ergeben die Warteschlange; Merkliste zuerst.
Stack-Radar (Hermes-Cron „KI und Stack Radar", Sa 08:00)
deploy/jobs/stack-radar.shsammelt Fakten und meldet selbst übernotify.shmit Betreff „[Stack-Radar]".deploy/jobs/stack-ist.shprüft Ergebnisse statt Lebenszeichen: Lösen die Rollen-Aliase auf? Lief der letzte Timer gut? Ist die Sicherung jünger als zwei Tage?deploy/jobs/stack-upstream.pyschaut nach draußen: Releases, gemergte PRs, neue Entwurfsmodelle und Modelle der Familien, die die Box fährt; verglichen mit dem letzten Lauf (~/.hermes/state/stack-upstream.json). Liste:deploy/trend-radar-watchlist.json.- Das Hirn (
fast) schreibt aus den Fakten einen kurzen Bericht; es darf nichts dazuerfinden. Antwortet es nicht, gehen die roten Rohbefunde trotzdem raus. - Grundsatz: „Fakten sammelt ein Skript, Prosa schreibt das Modell." Mehr in deploy/jobs/README.md.