Fix: KV-Schaetzung kalibriert + Brain-Fit-Check brain-spezifisch

- fit.estimate_memory_gb: KV-Cache jetzt sqrt-skaliert (nicht linear mit Gesamt-Params),
  kalibriert an Hermes-14B@128K ~19GB KV -> realistische Footprints (vorher massive Ueberschaetzung).
- agent.hermes_brain_info Budget: prueft jetzt Brain (immer resident) + groesstes on-demand-Modell
  <= GTT-Budget (fast/vision duerfen verdraengt werden) -> brain-spezifische, aussagekraeftige Warnung.
- Cockpit: Budget-Zeile + Confirm-Warnung entsprechend ("Brain ~X GB + groesstes on-demand ~Y GB").

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-06-27 03:01:07 +02:00
parent 5b699aaa79
commit 43880b1965
6 changed files with 47 additions and 38 deletions
+5 -4
View File
@@ -317,10 +317,11 @@ export interface HermesBrainCandidate {
export interface HermesBrainBudget {
gtt_gb: number
warm_projected_gb: number // Always-On-Footprint mit dem empfohlenen Brain
free_after_gb: number
largest_ondemand_gb: number // größtes on-demand-Modell (z.B. heavy)
fits: boolean // passt das größte on-demand daneben?
brain_gb: number // Footprint des (empfohlenen) Brains, das immer resident bleibt
warm_projected_gb: number // alle persist-Modelle warm (Info)
free_after_gb: number // frei nach Brain + größtem on-demand
largest_ondemand_gb: number // größtes on-demand-Modell (z.B. heavy/coder)
fits: boolean // passt Brain + größtes on-demand zusammen ins Budget?
}
export interface HermesBrainResp {
+5 -5
View File
@@ -179,7 +179,7 @@ export function Cockpit() {
async function handleBrainUpdate(repo: string) {
const b = brain?.budget
const warn = b && !b.fits
? `\n\n⚠ Speicher-Warnung: Als Always-On würde dieses Brain ~${b.warm_projected_gb} GB belegen (Budget ${b.gtt_gb} GB) → nur ${b.free_after_gb} GB frei. Das größte on-demand-Modell (~${b.largest_ondemand_gb} GB) passt dann NICHT mehr gleichzeitig daneben. Erwäge ein kleineres Brain oder weniger Kontext.`
? `\n\n⚠ Speicher-Warnung: Dieses Brain (~${b.brain_gb} GB) muss immer resident sein. Zusammen mit dem größten on-demand-Modell (~${b.largest_ondemand_gb} GB) sprengt das das Budget (${b.gtt_gb} GB) → heavy/coder würden das Brain verdrängen. Erwäge ein kleineres Brain oder weniger Kontext.`
: ""
showConfirm(
"Agent-Hirn aktualisieren?",
@@ -709,11 +709,11 @@ export function Cockpit() {
brain.budget.fits ? "text-muted-foreground/80" : "text-red-400 font-semibold")}>
<HardDrive className="h-3 w-3 shrink-0 mt-0.5" />
<span>
{brain.update_available ? "Mit diesem Brain als Always-On: " : "Always-On-Budget: "}
~{brain.budget.warm_projected_gb} / {brain.budget.gtt_gb} GB belegt {brain.budget.free_after_gb} GB frei
Always-On-Brain ~{brain.budget.brain_gb} GB + größtes on-demand (~{brain.budget.largest_ondemand_gb} GB)
= {(brain.budget.brain_gb + brain.budget.largest_ondemand_gb).toFixed(1)} / {brain.budget.gtt_gb} GB
{brain.budget.fits
? ` · größtes on-demand-Modell (~${brain.budget.largest_ondemand_gb} GB) passt daneben ✓`
: ` · größtes on-demand-Modell (~${brain.budget.largest_ondemand_gb} GB) passt NICHT mehr daneben ⚠ — kleineres Brain/weniger Kontext`}
? " · passt gleichzeitig ✓"
: " · passt NICHT gleichzeitig ⚠ — heavy/coder würden das Brain verdrängen. Kleineres Brain oder weniger Kontext."}
</span>
</div>
)}