/* Static showcase: renders precomputed decision data (data/demo.json). No model runs here. */
const state = { data: null, active: 0 };
async function boot() {
const demo = document.getElementById("demo");
try {
const res = await fetch("data/demo.json", { cache: "no-cache" });
if (!res.ok) throw new Error(`HTTP ${res.status}`);
state.data = await res.json();
} catch (err) {
demo.innerHTML = `
Could not load data/demo.json (${err.message}).
` +
`If you are viewing this from the filesystem, run a local server first: python -m http.server
`;
return;
}
document.getElementById("model-name").textContent = state.data.model;
renderTabs();
render(0);
}
function renderTabs() {
const tabs = document.getElementById("preset-tabs");
tabs.innerHTML = "";
state.data.presets.forEach((preset, i) => {
const b = document.createElement("button");
b.className = "tab" + (i === state.active ? " active" : "");
b.setAttribute("role", "tab");
b.textContent = `${preset.title} (${preset.num_fields} fields)`;
b.addEventListener("click", () => render(i));
tabs.appendChild(b);
});
}
function fmtMs(ms) {
return ms >= 1000 ? `${(ms / 1000).toFixed(2)} s` : `${Math.round(ms)} ms`;
}
function confColor(p) {
if (p >= 0.9) return "var(--green)";
if (p >= 0.7) return "var(--amber)";
return "var(--red)";
}
function esc(s) {
return String(s).replace(/[&<>"]/g, (c) => ({ "&": "&", "<": "<", ">": ">", '"': """ }[c]));
}
function render(index) {
state.active = index;
renderTabs();
const preset = state.data.presets[index];
const p = preset.parallel;
const n = preset.naive;
const fieldRows = p.fields.map((f) => {
const top = f.top.slice(1, 3).map((t) => `${esc(t.choice)} ${(t.p * 100).toFixed(1)}%`).join(" · ");
return `
| ${esc(f.name)} ${esc(f.type)} |
${esc(f.value)} |
${(f.confidence * 100).toFixed(1)}%
${top ? `runners-up: ${top} ` : ""}
|
`;
}).join("");
const jsonStr = esc(JSON.stringify(p.json, null, 2));
const naiveOk = n.schema_match;
const naiveBadge = naiveOk
? `valid JSON`
: `malformed / incomplete JSON`;
document.getElementById("demo").innerHTML = `
parallel ${fmtMs(p.elapsed_ms)} (prefill ${fmtMs(p.prefill_ms)} + batched pass ${fmtMs(p.suffix_eval_ms)})
naive ${fmtMs(n.elapsed_ms)} · ${n.total_tokens} tokens · ${n.tokens_per_second} tok/s
${naiveBadge}
parallel: schema-valid
Show the input context (${preset.context.length} chars)
${esc(preset.context)}
| field | decision | confidence |
${fieldRows}
Assembled JSON — never generated, so never malformed
${jsonStr}
Naive baseline — same model, writes the JSON itself
${esc(n.raw_text)}
`;
const btn = document.getElementById("copy-json");
if (btn) {
btn.addEventListener("click", async () => {
try {
await navigator.clipboard.writeText(JSON.stringify(p.json, null, 2));
btn.textContent = "copied";
setTimeout(() => (btn.textContent = "copy"), 1400);
} catch {
btn.textContent = "copy failed";
}
});
}
}
boot();