fix+feat: offene Punkte abgeschlossen

Kontext in Connect-Snippet:
- ConnectPanel: max_tokens nutzt jetzt den echten konfigurierten Kontext
  des Modells (m.meta.ctx) statt hartkodiertem 32768 -> Zed sieht 128k

Phase D - 'Immer aktiv halten' Toggle:
- models.py: UpdateReq bekommt optionales ttl-Feld
- update_model: setzt TTL wenn angegeben (ctx und ttl unabhaengig)
- ModelsPanel: Checkbox 'Immer aktiv halten' im Konfig-Modal
  (TTL=99999 = nie entladen, TTL=300 = Standard 5min)

MoE tps-Schaetzung:
- hw_math.py: extract_active_params_b() erkennt A3B-Suffix
- estimate_speed(): moe_active_ratio-Parameter, sqrt-Boost fuer MoE
- evaluate_fit(): name-Parameter (optional) fuer automatische MoE-Erkennung
- cookbook.py: alle evaluate_fit-Aufrufe mit name= versehen

Cleanup:
- static/js/panels/*.js + static/js/main.js geloescht (Dead Code)
- wird-Datei (versehentlich committet) geloescht
- CLAUDE.md: KISS-Statement auf Vite+Svelte-Stand aktualisiert

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-06-22 22:21:15 +02:00
parent 5e9471a778
commit d8fe1f8097
17 changed files with 91 additions and 2192 deletions
+2 -1
View File
@@ -26,7 +26,8 @@
const ms = ids.length ? allModels.filter((m: any) => ids.includes(m.name)) : (allModels.length ? allModels : [{ name: 'coder', meta: {} }])
const entries = ms.map((m: any) => {
const img = (m.meta?.caps || []).some((c: string) => /Bild|Vision/i.test(c))
return ` { "name": "${m.name}", "display_name": "${m.name}", "max_tokens": 32768${img ? `, "capabilities": { "tools": true, "images": true }` : ''} }`
const ctx = m.meta?.ctx || 131072 // nutze konfigurierten Kontext des Modells (Standard: 128k)
return ` { "name": "${m.name}", "display_name": "${m.name}", "max_tokens": ${ctx}${img ? `, "capabilities": { "tools": true, "images": true }` : ''} }`
}).join(',\n')
return `"language_models": {\n "openai_compatible": {\n "bosgame": {\n "api_url": "${url}",\n "available_models": [\n${entries}\n ]\n }\n }\n}`
}
+20 -1
View File
@@ -35,20 +35,25 @@
chatLoading = false; refresh()
}
const DEFAULT_TTL = 300
// ---- Config Modal ----
let cfgOpen = $state(false)
let cfgModel = $state<any>(null)
let cfgCtx = $state(8192)
let cfgAlwaysActive = $state(false)
function openConfig(name: string) {
cfgModel = allModels.find((m: any) => m.name === name)
if (!cfgModel) return
cfgCtx = cfgModel.meta?.ctx || 8192
cfgAlwaysActive = (cfgModel.ttl ?? DEFAULT_TTL) >= 99999
cfgOpen = true
}
async function saveConfig() {
const ttl = cfgAlwaysActive ? 99999 : DEFAULT_TTL
try {
await api('/api/update_model', { method: 'POST', body: JSON.stringify({ alias: cfgModel.name, ctx: cfgCtx }) })
await api('/api/update_model', { method: 'POST', body: JSON.stringify({ alias: cfgModel.name, ctx: cfgCtx, ttl }) })
toast('Gespeichert — aktiv beim nächsten Modell-Start.')
cfgOpen = false; refresh()
} catch (e: any) { toast(e.message, true) }
@@ -218,6 +223,20 @@
</div>
{/if}
<div class="hint" style="margin-bottom:14px">Es läuft immer nur <b>ein</b> Modell gleichzeitig — ein größerer Kontext hier beeinflusst deine anderen Modelle nicht.</div>
<div class="tile" style="display:flex;justify-content:space-between;align-items:center;margin:0 0 14px">
<div style="flex:1">
<div style="font-size:13px;font-weight:500">Immer aktiv halten</div>
<div class="hint" style="margin:3px 0 0">Modell bleibt dauerhaft im RAM — nie automatisch entladen. Ideal für den kleinen Scout (~5 GB), der immer schnell antworten soll.</div>
</div>
<label style="display:flex;align-items:center;gap:8px;margin:0;cursor:pointer;flex:0 0 auto">
<input type="checkbox" bind:checked={cfgAlwaysActive} style="width:18px;height:18px;accent-color:var(--accent);cursor:pointer">
<span class="mono-sm" style="color:{cfgAlwaysActive ? 'var(--accent)' : 'var(--mut)'}">
{cfgAlwaysActive ? 'An (TTL = ∞)' : 'Aus (TTL = 5 min)'}
</span>
</label>
</div>
<button class="primary" style="width:100%;margin-top:6px" onclick={saveConfig}>Speichern</button>
</div>
</div>