phase2e: Modelltausch schreibt die llama-swap-Config einmal statt bis zu siebenmal
- llamaswap.sammeln(): Aenderungen lesen dieselbe Config aus dem Speicher, geschrieben wird einmal am Ende, bei einem Fehler gar nicht - Radar-Tausch und Hirn-Umstellung nutzen es; Hermes wird erst nach dem Schreiben umgestellt - Test-Attrappe fuer update_brain_model: der Radar-Test faesst auf der Box nie die echte Hermes-Config an - Doku: Ziel-Modell, strukturierter Verlauf, Sammel-Schreiben Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
589c14d5e9
commit
a47489fa85
@@ -93,6 +93,29 @@ def config_sperre():
|
||||
datei.close()
|
||||
|
||||
|
||||
# Sammel-Schreiben (24.09.2026): Jeder Schreibvorgang lässt llama-swap neu laden und ALLE Modelle
|
||||
# entladen. Ein Modelltausch bestand aus bis zu sieben Schreibvorgängen (Eintragen, Befehl, Zwilling,
|
||||
# Alias, Gruppe, ttl …). Innerhalb von sammeln() lesen alle Änderungen dieselbe Config aus dem
|
||||
# Speicher, und geschrieben wird einmal am Ende — oder gar nicht, wenn etwas scheitert.
|
||||
_SAMMEL = threading.local()
|
||||
|
||||
|
||||
@contextmanager
|
||||
def sammeln():
|
||||
with config_sperre():
|
||||
if getattr(_SAMMEL, "aktiv", False): # verschachtelt: der äußere schreibt
|
||||
yield
|
||||
return
|
||||
_SAMMEL.aktiv, _SAMMEL.cfg = True, None
|
||||
try:
|
||||
yield
|
||||
cfg = _SAMMEL.cfg
|
||||
finally:
|
||||
_SAMMEL.aktiv, _SAMMEL.cfg = False, None
|
||||
if cfg is not None:
|
||||
_schreiben(cfg)
|
||||
|
||||
|
||||
def _mit_sperre(fn):
|
||||
@functools.wraps(fn)
|
||||
def huelle(*args, **kwargs):
|
||||
@@ -103,6 +126,14 @@ def _mit_sperre(fn):
|
||||
|
||||
# --- Lesen -------------------------------------------------------------------
|
||||
def read_config() -> dict:
|
||||
if getattr(_SAMMEL, "aktiv", False):
|
||||
if _SAMMEL.cfg is None:
|
||||
_SAMMEL.cfg = _lesen()
|
||||
return _SAMMEL.cfg
|
||||
return _lesen()
|
||||
|
||||
|
||||
def _lesen() -> dict:
|
||||
if not CONFIG_PATH.exists():
|
||||
return {"models": {}}
|
||||
from ruamel.yaml import YAML
|
||||
@@ -260,7 +291,15 @@ def _augment_vision(cmd: str, model_path: str, mmproj_path: str | None) -> str:
|
||||
|
||||
def write_config(cfg: dict) -> None:
|
||||
"""Atomar schreiben (tmp + os.replace), damit llama-swap mit -watch-config nie
|
||||
eine halbe Datei sieht. Fehlende Schreibrechte → klare Meldung."""
|
||||
eine halbe Datei sieht. Fehlende Schreibrechte → klare Meldung. Innerhalb von sammeln()
|
||||
wird nur vorgemerkt; geschrieben wird am Ende einmal."""
|
||||
if getattr(_SAMMEL, "aktiv", False):
|
||||
_SAMMEL.cfg = cfg
|
||||
return
|
||||
_schreiben(cfg)
|
||||
|
||||
|
||||
def _schreiben(cfg: dict) -> None:
|
||||
try:
|
||||
CONFIG_PATH.parent.mkdir(parents=True, exist_ok=True)
|
||||
tmp = CONFIG_PATH.with_name(CONFIG_PATH.name + ".tmp")
|
||||
|
||||
Reference in New Issue
Block a user