diff --git a/backend/services/llamaswap.py b/backend/services/llamaswap.py index 7a28bf1..5c33e1b 100644 --- a/backend/services/llamaswap.py +++ b/backend/services/llamaswap.py @@ -444,6 +444,10 @@ def set_group(group: str, members: list[str], swap: bool = False, persist: bool cfg = read_config() groups = cfg.setdefault("groups", {}) groups[group] = {"swap": swap, "persist": persist, "persistent": persist, + # Eine immer-warme Gruppe darf nichts verdrängen. llama-swap macht Gruppen sonst + # `exclusive`, und JEDE Anfrage ans Hirn entlud den Coder samt Prompt-Cache + # (live gefunden 24.09.2026: Lucy-Anfrage → OpenChamber-Coder weg). + **({"exclusive": False} if persist else {}), "members": list(members)} # Härtung: eine persistente (immer-warme) Gruppe verlangt ttl:0 je Mitglied. # `persistent` schützt NUR gegen Verdrängung durch andere Modelle, NICHT gegen diff --git a/backend/tests/test_radar.py b/backend/tests/test_radar.py index 601ebe7..42cf4e2 100644 --- a/backend/tests/test_radar.py +++ b/backend/tests/test_radar.py @@ -654,3 +654,16 @@ def test_baseline_misst_bilder_ueber_den_zwilling(monkeypatch, ps): radar._baseline("hirn", time.time() + 60) assert aufrufe[1]["bild"] is False and aufrufe[1]["bild_modell"] is None assert aufrufe[0]["kennung"] != aufrufe[1]["kennung"] # neuer Zwilling → neue Baseline + + +def test_immer_warme_gruppe_verdraengt_nichts(monkeypatch): + """24.09.: ohne exclusive: false entlud jede Anfrage ans Hirn den Coder — set_group muss das setzen.""" + from services import llamaswap + cfg = {"models": {"h": {"cmd": "x", "ttl": 300}}, "groups": {}} + monkeypatch.setattr(llamaswap, "read_config", lambda: cfg) + monkeypatch.setattr(llamaswap, "write_config", lambda c: None) + llamaswap.set_group("brains", ["h"], swap=False, persist=True) + assert cfg["groups"]["brains"]["exclusive"] is False and cfg["groups"]["brains"]["persistent"] is True + assert cfg["models"]["h"]["ttl"] == 0 + llamaswap.set_group("andere", ["h"], swap=True, persist=False) + assert "exclusive" not in cfg["groups"]["andere"] diff --git a/deploy/llama-swap.config.yaml b/deploy/llama-swap.config.yaml index 08e6ed5..1a3ff21 100644 --- a/deploy/llama-swap.config.yaml +++ b/deploy/llama-swap.config.yaml @@ -140,6 +140,10 @@ groups: # MC2-interne Lese-Key (API/UI) und wird von llama-swap ignoriert. Beide pflegen! persist: true persistent: true + # 24.09.2026: exclusive: false — ohne den Key ist eine Gruppe in llama-swap exklusiv, und JEDE Anfrage ans + # Hirn entlud den Coder (und die Bild-Zwillinge). Für OpenChamber hieß das: Lucy fragt etwas, der Coder + # fliegt raus, die nächste Coding-Anfrage lädt ihn neu und rechnet den ganzen Vorlauf nach. Live gemessen. + exclusive: false members: - Qwen3-Embedding-0.6B - Qwen3-Reranker-0.6B