From 46777cb99aa7c93db5300e4ef53463418f22bea6 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Sat, 27 Jun 2026 03:05:24 +0200 Subject: [PATCH] Fix: Footprint-Schaetzung robust (max aus Name+Dateigroesse) fuer Split-GGUFs heavy ist Split-GGUF (size_bytes = nur erster Teil) -> aus Namen (122B); coder ohne Groesse im Namen -> aus Dateigroesse (~84B). max() deckt beide Faelle ab. Co-Authored-By: Claude Opus 4.8 --- backend/services/agent.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/backend/services/agent.py b/backend/services/agent.py index 9f33a67..b5413e4 100644 --- a/backend/services/agent.py +++ b/backend/services/agent.py @@ -101,20 +101,18 @@ def hermes_brain_info() -> dict: persist.update(g.get("members") or []) def _foot(m: dict) -> float: - """Loaded-Footprint: echte Datei­größe als Gewichte (genauer als Namens- - Schätzung) + kalibrierter KV-Anteil. Params aus Größe ableiten, falls der - Name keine Größe hergibt (z.B. 'Qwen3-Coder-Next').""" + """Loaded-Footprint = Gewichte + kalibrierter KV-Anteil. Params robust aus dem + MAXIMUM von Namens-Schätzung und Dateigröße (deckt beides ab: 'Coder-Next' ohne + Größe im Namen → aus Datei; Split-GGUFs wie heavy → aus Namen, da size_bytes nur + den ersten Teil zählt).""" caps = m.get("capabilities") or {} quant = m.get("quant") or "Q4_K_M" ctx = int(m.get("ctx") or 32768) bpp = QUANT_BYTES_PER_PARAM.get(quant.upper(), 0.55) - sz = m.get("size_bytes") - if sz: - weights = sz / (1024 ** 3) - pb = float(caps.get("params_b") or 0) or (weights / bpp) - else: - pb = float(caps.get("params_b") or 7.0) - weights = pb * bpp + size_gb = (m.get("size_bytes") or 0) / (1024 ** 3) + pb_size = (size_gb / bpp) if size_gb > 1.0 else 0.0 # Split-Teil → ignoriert + pb = max(float(caps.get("params_b") or 0), pb_size, 7.0) + weights = max(pb * bpp, size_gb) kv = estimate_memory_gb(pb, quant, ctx) - pb * bpp return weights + max(kv, 0.0)