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