From b51f30b49affd3dec6945e8de1df0b4b99776a0f Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Fri, 26 Jun 2026 19:29:22 +0200 Subject: [PATCH] Fix: /running-Objekte zu Namen normalisieren (Live-Panel + warm-Badges) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Neuere llama-swap-Versionen liefern /running als Liste von Objekten ({model,state,...}) statt Strings. get_running_models() normalisiert nun auf Namens-Strings → running.includes(name) im Frontend matcht wieder (ActiveModels- Card + RolesCard 'warm'-Badges). Logger in llamaswap.py ergänzt. Co-Authored-By: Claude Opus 4.8 --- backend/services/llamaswap.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/backend/services/llamaswap.py b/backend/services/llamaswap.py index f1ae1cc..0782ced 100644 --- a/backend/services/llamaswap.py +++ b/backend/services/llamaswap.py @@ -6,6 +6,7 @@ NEU in 2.0: `groups` für Ko-Residenz (schnell + schwer gleichzeitig geladen, `swap:false`) → Multi-Model-Delegation ohne Nachlade-Latenz. """ +import logging import os import re @@ -14,6 +15,8 @@ from ruamel.yaml.scalarstring import LiteralScalarString from config import CMD_TEMPLATE, CONFIG_PATH, DEFAULT_TTL, LLAMA_SWAP_URL, SPEC_DRAFT_MODEL_PATH +log = logging.getLogger(__name__) + # Kanonische Rollen (vereinheitlicht ggü. v1: kein manager/reviewer mehr). ROLE_IDS = {"vision", "coder", "reasoning", "agent", "scout"} @@ -304,12 +307,15 @@ def delete_model(model_id: str) -> bool: def get_running_models() -> list[str]: - """Fragt den /running Endpunkt von llama-swap ab. Gibt geladene Modelle zurück.""" + """Fragt den /running Endpunkt von llama-swap ab. Gibt die Namen der geladenen + Modelle zurück. Neuere llama-swap-Versionen liefern Objekte ({model, state, ...}) + statt Strings — beide Formen werden auf Namens-Strings normalisiert.""" try: with httpx.Client(timeout=2.0) as c: r = c.get(f"{LLAMA_SWAP_URL}/running") if r.status_code == 200: - return r.json().get("running") or [] + data = r.json().get("running") or [] + return [x.get("model", "") if isinstance(x, dict) else x for x in data] except Exception: - pass + log.warning("get_running_models fehlgeschlagen", exc_info=True) return []