Fix: "Modelle finden" bevorzugt faehigste passende Modelle (kein Downgrade) + Rollen-Farben zentral

- discover.rank_runnable: rankt jetzt fit-level > params_b(desc) > downloads -> fuer die
  128GB-Box wird das faehigste passende (MoE-)Modell empfohlen statt kleiner Populaer-Modelle.
  Top-4-Anzeige nutzt dasselbe Ranking.
- maintenance.model_upgrades: schlaegt KEIN Downgrade mehr vor (rec.params_b >= installiert*0.95).
  Behebt: fast 35B-A3B -> 4B wurde faelschlich als Upgrade angeboten.
- Frontend: Rollen-Farb-Mapping zentralisiert in ModelBadges (ROLE_TONE/roleTone);
  Cockpit/RolesCard/ActiveModelsCard nutzen es statt eigener Duplikate.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-06-27 02:35:21 +02:00
parent 38f0394166
commit 8bb4e11f31
11 changed files with 444 additions and 430 deletions
+14
View File
@@ -164,6 +164,12 @@ def model_upgrades() -> list[dict]:
installed = llamaswap.list_models()
active_roles = {m["role"] for m in installed if m.get("role")}
# Größtes installiertes Modell je Rolle (params_b) — Basis für „kein Downgrade".
inst_params: dict[str, float] = {}
for m in installed:
r, pb = m.get("role"), (m.get("capabilities") or {}).get("params_b")
if r and pb:
inst_params[r] = max(inst_params.get(r, 0.0), float(pb))
cmds = " ".join(str(s.get("cmd", "")).lower()
for s in (llamaswap.read_config().get("models") or {}).values())
@@ -178,6 +184,14 @@ def model_upgrades() -> list[dict]:
rec = c.get("recommended")
if not rec:
continue
# KEIN Downgrade: Empfehlung nur, wenn sie mind. so „groß"/fähig ist wie das
# installierte Modell der Rolle (verhindert z.B. fast 35B-A3B → 4B).
rec_model = next((x for x in c.get("models", []) if x.get("repo") == rec), None)
rec_params = float((rec_model or {}).get("params_b") or 0.0)
cur = inst_params.get(role, 0.0)
if cur and rec_params and rec_params < cur * 0.95:
continue
base = rec.split("/")[-1].lower()
stem = base[:-5] if base.endswith("-gguf") else base
if base in cmds or (stem and stem in cmds):