fix: 500er bei register/update_model/install-recipe, Download & favicon

- write_config schreibt atomar (tmp + os.replace) -> llama-swap (-watch-config)
  sieht nie eine halb geschriebene config.yaml; PermissionError wird in eine
  klare Klartext-Meldung uebersetzt (Hinweis auf chown)
- generischer Exception-Handler: unerwartete Fehler kommen als lesbare JSON-
  Meldung im UI an statt als nackter 500 (Anfaenger-Diagnose)
- Download: nutzt die `hf`-CLI aus dem venv (Dienst-PATH kennt venv/bin nicht)
  + HF_HUB_DISABLE_XET=1 statt HF_XET_HIGH_PERFORMANCE (XET-Haenger bei ~6 MB)
- huggingface_hub als Dependency ergaenzt (liefert `hf`)
- favicon.ico: themed SVG (Link-Tag + Route) -> kein 404 mehr

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-06-21 17:53:49 +02:00
parent 3a4de152b0
commit f07a8440b2
5 changed files with 51 additions and 6 deletions
+16 -3
View File
@@ -6,6 +6,8 @@ Helfer rund um llama-swap und dessen config.yaml.
sodass Kommentare und Quotes erhalten bleiben.
"""
import os
import httpx
from config import CONFIG_PATH, LLAMA_SWAP_URL, yaml
@@ -29,6 +31,17 @@ def read_config() -> dict:
def write_config(cfg: dict) -> None:
CONFIG_PATH.parent.mkdir(parents=True, exist_ok=True)
with CONFIG_PATH.open("w", encoding="utf-8") as f:
yaml.dump(cfg, f)
"""Schreibt die config.yaml atomar (tmp-Datei + os.replace), damit llama-swap
mit -watch-config nie eine halb geschriebene Datei sieht. Fehlende Schreibrechte
werden in eine klare Meldung uebersetzt statt als roher Traceback zu landen."""
try:
CONFIG_PATH.parent.mkdir(parents=True, exist_ok=True)
tmp = CONFIG_PATH.with_name(CONFIG_PATH.name + ".tmp")
with tmp.open("w", encoding="utf-8") as f:
yaml.dump(cfg, f)
os.replace(tmp, CONFIG_PATH)
except PermissionError as exc:
raise PermissionError(
f"Mission Control darf '{CONFIG_PATH}' nicht schreiben. "
f"Einmalig Besitz uebergeben: sudo chown -R hitonabi:hitonabi {CONFIG_PATH.parent}"
) from exc