From 75a1be4a71e295b3302dc8982bc4371dcceaccef Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Sat, 27 Jun 2026 03:03:51 +0200 Subject: [PATCH] Fix: Brain-Budget nutzt echte Dateigroesse fuer Footprint (statt Namens-Schaetzung) _foot() rechnet Gewichte aus size_bytes (genau) + kalibrierten KV-Anteil; Params werden aus der Dateigroesse abgeleitet, wenn der Name keine Groesse hergibt (z.B. Qwen3-Coder-Next, 46GB -> ~84B). Damit ist das groesste on-demand-Modell im Budget realistisch. Co-Authored-By: Claude Opus 4.8 --- backend/services/agent.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/backend/services/agent.py b/backend/services/agent.py index ba8d28b..9f33a67 100644 --- a/backend/services/agent.py +++ b/backend/services/agent.py @@ -93,7 +93,7 @@ def hermes_brain_info() -> dict: # größte on-demand-Modell daneben lädt? (Brain muss immer resident sein.) budget = None try: - from services.fit import estimate_memory_gb + from services.fit import QUANT_BYTES_PER_PARAM, estimate_memory_gb groups = llamaswap.list_groups() persist = set() for g in groups.values(): @@ -101,9 +101,22 @@ 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').""" caps = m.get("capabilities") or {} - return estimate_memory_gb(float(caps.get("params_b") or 7.0), - m.get("quant") or "Q4_K_M", int(m.get("ctx") or 32768)) + 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 + kv = estimate_memory_gb(pb, quant, ctx) - pb * bpp + return weights + max(kv, 0.0) cur_name = cur["name"] if cur else None brain_ctx = int((cur.get("ctx") if cur else None) or 32768)