llama-swap: brains verdraengt nichts mehr (exclusive: false) - Lucy-Anfragen warfen den Coder raus
Ampel / ampel (push) Failing after 20s

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 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-09-24 13:05:25 +02:00
co-authored by Claude Opus 5.5
parent 91aa16eee1
commit 133a491aca
3 changed files with 21 additions and 0 deletions
+4
View File
@@ -444,6 +444,10 @@ def set_group(group: str, members: list[str], swap: bool = False, persist: bool
cfg = read_config() cfg = read_config()
groups = cfg.setdefault("groups", {}) groups = cfg.setdefault("groups", {})
groups[group] = {"swap": swap, "persist": persist, "persistent": persist, 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)} "members": list(members)}
# Härtung: eine persistente (immer-warme) Gruppe verlangt ttl:0 je Mitglied. # Härtung: eine persistente (immer-warme) Gruppe verlangt ttl:0 je Mitglied.
# `persistent` schützt NUR gegen Verdrängung durch andere Modelle, NICHT gegen # `persistent` schützt NUR gegen Verdrängung durch andere Modelle, NICHT gegen
+13
View File
@@ -654,3 +654,16 @@ def test_baseline_misst_bilder_ueber_den_zwilling(monkeypatch, ps):
radar._baseline("hirn", time.time() + 60) radar._baseline("hirn", time.time() + 60)
assert aufrufe[1]["bild"] is False and aufrufe[1]["bild_modell"] is None assert aufrufe[1]["bild"] is False and aufrufe[1]["bild_modell"] is None
assert aufrufe[0]["kennung"] != aufrufe[1]["kennung"] # neuer Zwilling → neue Baseline 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"]
+4
View File
@@ -140,6 +140,10 @@ groups:
# MC2-interne Lese-Key (API/UI) und wird von llama-swap ignoriert. Beide pflegen! # MC2-interne Lese-Key (API/UI) und wird von llama-swap ignoriert. Beide pflegen!
persist: true persist: true
persistent: 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: members:
- Qwen3-Embedding-0.6B - Qwen3-Embedding-0.6B
- Qwen3-Reranker-0.6B - Qwen3-Reranker-0.6B