bilder: Hirn und Coder sehen selbst - ueber Bild-Zwillinge, Text bleibt mit Draft schnell
Ampel / ampel (push) Failing after 21s

llama.cpp kann Draft-Beschleunigung und Bilder nicht zusammen (HTTP 500 "failed to process
speculative batch", b11057 und b11157 geprueft; speculative.n_max=0 je Anfrage hilft nicht).
Darum bekommen Hirn und Coder je einen Bild-Zwilling: gleiche Gewichte plus Projektor, ohne
Draft (vision, coder-bild), in einer eigenen llama-swap-Gruppe, die den Coder nicht verdraengt.
Probe 24.09.: beide 8/8 Bildmerkmale; Hirn-Zwilling 68 t/s, Coder-Zwilling 12,5 t/s.

Bild-Weiche v3 im Gateway: Bild im aktuellen Schritt geht an den Zwilling der Rolle, aeltere
Bilder werden einmal beschrieben (gemerkt) und als Text mitgeschickt, damit der Rest einer
Agenten-Aufgabe wieder beim schnellen Modell laeuft. Qwen3-VL gibt "vision" ab, der Coder
verliert den Projektor, der mit Draft nur HTTP 500 lieferte.

Radar misst die Bildfaehigkeit des heutigen Modells ueber dessen Zwilling (sonst gewaenne
jeder bildfaehige Kandidat mit "versteht Bilder"). Pruefstand: Coder darf vor dem Aendern
lesen (Version 3). Modelle-Seite zeigt "Bilder: ja" ueber den Zwilling.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-09-24 13:02:06 +02:00
co-authored by Claude Opus 5.5
parent 2cc1e1cc47
commit 91aa16eee1
17 changed files with 497 additions and 230 deletions
+24 -3
View File
@@ -101,6 +101,7 @@ HF_BASIS = "https://huggingface.co"
ROLLEN = ("hirn", "coder")
ALIAS = {"hirn": "hermes", "coder": "coder"} # llama-swap-Alias der Rolle heute
ZWILLING = {"hirn": "vision", "coder": "coder-bild"} # Bild-Zwilling der Rolle (seit 24.09.)
DISCOVER_ROLLEN = {"coder": "coder", "fast": "hirn", "hermes": "hirn"}
PARALLEL = {"hirn": 2, "coder": 1} # Slots im Betrieb, wie heute
KANDIDAT_FELDER = ("id", "name", "rolle", "repo", "datei", "groesse_gb", "passt", "eng", "quelle", "status",
@@ -1068,14 +1069,34 @@ class _Nachtwaechter(threading.Thread):
self._halt.set()
def _bild_zwilling(rolle: str, heute: dict) -> dict | None:
"""Der Bild-Zwilling der Rolle: trägt ZWILLING[rolle], hat einen Projektor und dieselben Gewichte."""
pfad = heute.get("gguf_path")
try:
modelle = llamaswap.list_models()
except Exception:
return None
for m in modelle:
if (ZWILLING[rolle] in {str(a).lower() for a in m.get("aliases") or []}
and "--mmproj" in str(m.get("cmd") or "") and pfad and m.get("gguf_path") == pfad):
return m
return None
def _baseline(rolle: str, frist: float) -> dict | None:
"""Werte des heutigen Modells der Rolle (Cache, höchstens monatlich neu gemessen)."""
"""Werte des heutigen Modells der Rolle (Cache, höchstens monatlich neu gemessen). Die Bild-Probe
macht der Bild-Zwilling, wenn es einen gibt — so zählt „versteht Bilder“ nicht als Vorteil eines
Kandidaten, obwohl das heutige Modell über seinen Zwilling längst sieht."""
heute = _heutige_modelle().get(rolle)
if not heute:
return None
befehl = str(heute.get("cmd") or "")
kennung = f"{heute['name']}|{hashlib.sha1(befehl.encode()).hexdigest()[:10]}"
return _pruefstand().baseline(rolle, str(BASELINE_PATH), kennung=kennung, bild="--mmproj" in befehl,
zwilling = _bild_zwilling(rolle, heute)
zwilling_befehl = str((zwilling or {}).get("cmd") or "")
kennung = f"{heute['name']}|{hashlib.sha1((befehl + zwilling_befehl).encode()).hexdigest()[:10]}"
return _pruefstand().baseline(rolle, str(BASELINE_PATH), kennung=kennung,
bild="--mmproj" in befehl or zwilling is not None,
bild_modell=ZWILLING[rolle] if zwilling else None,
frist=frist, max_alter_tage=BASELINE_TAGE, modell=ALIAS[rolle],
protokoll=_protokoll)