From b2b586093d59dc0a0df6d1ad5ce35076d57e7a72 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Sat, 20 Jun 2026 23:48:28 +0200 Subject: [PATCH] feat: Cookbook Search Results UI & Lazy Metrics --- static/js/panels/cookbook.js | 64 +++++++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 5 deletions(-) diff --git a/static/js/panels/cookbook.js b/static/js/panels/cookbook.js index 48414f6..85afbaa 100644 --- a/static/js/panels/cookbook.js +++ b/static/js/panels/cookbook.js @@ -229,15 +229,69 @@ function renderResults(results) { grid.innerHTML = results.map((m, i) => `
-

${esc(m.id.split('/').pop())}

-
${esc(m.author)}
+
+
+

${esc(m.id.split('/').pop())}

+
${esc(m.author)}
+
+ Analysiere... +
-
- GGUF - ⬇ ${(m.downloads||0).toLocaleString()} +
+ Berechne Hardware-Fit... + + ⬇ ${(m.downloads||0).toLocaleString()} + GGUF +
`).join(""); + + // Lade Metriken im Hintergrund + results.forEach((m, i) => fetchAnalysisForCard(i, m.id)); +} + +async function fetchAnalysisForCard(index, repo_id) { + try { + const res = await api("/api/cookbook/analyze", { + method: "POST", body: JSON.stringify({ repo_id, ctx: 8192 }) + }); + + const badgeEl = document.getElementById(`cb-s-badge-${index}`); + const metricsEl = document.getElementById(`cb-s-metrics-${index}`); + const quantEl = document.getElementById(`cb-s-quant-${index}`); + + if (!badgeEl || !metricsEl || !quantEl) return; // card might be gone + + if (!res.files || res.files.length === 0) { + badgeEl.className = "badge b-err"; + badgeEl.textContent = "Keine GGUFs"; + metricsEl.textContent = "Keine Dateien gefunden"; + return; + } + + let best = res.files.find(f => f.quant && f.quant.includes("Q4_K_M")); + if (!best) best = res.files[0]; + + const fit = best.fit; + const cls = fit.level === "perfect" ? "b-run" : (fit.level === "marginal" ? "b-load" : "b-err"); + + badgeEl.className = `badge ${cls}`; + badgeEl.textContent = fit.text; + metricsEl.innerHTML = `~${fit.req_gb.toFixed(1)} GB RAM/VRAM · ~${Math.round(fit.tps)} t/s`; + quantEl.textContent = best.quant || "GGUF"; + + } catch(e) { + const badgeEl = document.getElementById(`cb-s-badge-${index}`); + const metricsEl = document.getElementById(`cb-s-metrics-${index}`); + if (badgeEl) { + badgeEl.className = "badge b-err"; + badgeEl.textContent = "Fehler"; + } + if (metricsEl) { + metricsEl.textContent = "Metriken konnten nicht geladen werden"; + } + } } // Global hook for inline onclick