From 133a491aca8af77e506b8a11d737bd889b13f0d7 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 24 Sep 2026 13:05:25 +0200 Subject: [PATCH] llama-swap: brains verdraengt nichts mehr (exclusive: false) - Lucy-Anfragen warfen den Coder raus Ohne den Key ist eine llama-swap-Gruppe exklusiv: JEDE Anfrage ans Hirn entlud den Coder und die Bild-Zwillinge (live gemessen 24.09.). Fuer OpenChamber hiess das nach jeder Lucy-, NerdQuiz- oder Job-Anfrage: Coder neu laden und den ganzen Vorlauf nachrechnen. set_group setzt den Key fuer immer-warme Gruppen jetzt selbst, damit ein Hirn-Tausch ihn nicht wieder verliert. Co-Authored-By: Claude Opus 5.5 --- backend/services/llamaswap.py | 4 ++++ backend/tests/test_radar.py | 13 +++++++++++++ deploy/llama-swap.config.yaml | 4 ++++ 3 files changed, 21 insertions(+) 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