Spaces:
Paused
Paused
Commit ·
ad0cfad
1
Parent(s): 5f8ad9f
Show per-model running state during prediction
Browse files- web/static/index.html +25 -6
web/static/index.html
CHANGED
|
@@ -477,15 +477,22 @@ Medical VQA web demo for six-model comparison.
|
|
| 477 |
const res = byVariant[variant];
|
| 478 |
const status = res ? res.status : "not requested";
|
| 479 |
const ok = res && res.status === "ok";
|
|
|
|
| 480 |
const answer = res ? (res.prediction || res.status) : "Not requested";
|
| 481 |
-
const cardTone = ok
|
| 482 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 483 |
return `
|
| 484 |
<article class="tilt-card bg-paper-white border ${cardTone} p-5 md:p-6 flex flex-col gap-4 relative overflow-hidden">
|
| 485 |
<div class="absolute inset-x-0 top-0 h-1 bg-gradient-to-r from-transparent via-imperial-red to-transparent ${ok ? 'opacity-100' : 'opacity-45'}"></div>
|
| 486 |
<div class="flex items-center justify-between gap-4">
|
| 487 |
<div class="flex items-center gap-3">
|
| 488 |
-
<div class="size-11 rounded-full border flex items-center justify-center ${ok ? 'bg-emerald-50 text-emerald-700 border-emerald-200' : res ? 'bg-rose-50 text-rose-700 border-rose-200' : 'bg-amber-50 text-amber-700 border-amber-200'}
|
| 489 |
<span class="material-symbols-outlined text-[22px]">${meta.icon}</span>
|
| 490 |
</div>
|
| 491 |
<div>
|
|
@@ -494,13 +501,13 @@ Medical VQA web demo for six-model comparison.
|
|
| 494 |
</div>
|
| 495 |
</div>
|
| 496 |
<span class="text-[11px] uppercase tracking-[0.18em] font-bold ${ok ? 'text-emerald-700' : res ? 'text-rose-700' : 'text-amber-700'}">
|
| 497 |
-
${res ? (ok ? "Output" : "Error") : "Idle"}
|
| 498 |
</span>
|
| 499 |
</div>
|
| 500 |
|
| 501 |
<div class="min-h-[120px] rounded-none border border-china-gold/20 bg-[#FAF7F0] p-5 flex items-center">
|
| 502 |
<p class="text-[18px] md:text-[20px] leading-relaxed font-serif ${answerTone}">
|
| 503 |
-
${escapeHtml(answer)}
|
| 504 |
</p>
|
| 505 |
</div>
|
| 506 |
|
|
@@ -513,6 +520,16 @@ Medical VQA web demo for six-model comparison.
|
|
| 513 |
}).join("");
|
| 514 |
}
|
| 515 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 516 |
function updateModelChips() {
|
| 517 |
document.querySelectorAll(".model-chip").forEach((chip) => {
|
| 518 |
const variant = chip.dataset.model;
|
|
@@ -622,6 +639,8 @@ Medical VQA web demo for six-model comparison.
|
|
| 622 |
el.runBtn.disabled = true;
|
| 623 |
el.runBtn.querySelector("span").textContent = "Running...";
|
| 624 |
setStatus("Running all selected models...");
|
|
|
|
|
|
|
| 625 |
|
| 626 |
try {
|
| 627 |
const formData = new FormData();
|
|
@@ -634,7 +653,7 @@ Medical VQA web demo for six-model comparison.
|
|
| 634 |
if (!res.ok) {
|
| 635 |
throw new Error(data?.detail || "Prediction failed");
|
| 636 |
}
|
| 637 |
-
renderModelGrid(data.results || []
|
| 638 |
applyTiltEffect(".tilt-card", 5);
|
| 639 |
setStatus(`Done. ${data.summary?.success_count ?? 0} models succeeded.`);
|
| 640 |
} catch (err) {
|
|
|
|
| 477 |
const res = byVariant[variant];
|
| 478 |
const status = res ? res.status : "not requested";
|
| 479 |
const ok = res && res.status === "ok";
|
| 480 |
+
const running = res && res.status === "running";
|
| 481 |
const answer = res ? (res.prediction || res.status) : "Not requested";
|
| 482 |
+
const cardTone = ok
|
| 483 |
+
? "border-emerald-200/70 shadow-[0_18px_40px_rgba(16,185,129,0.10)]"
|
| 484 |
+
: running
|
| 485 |
+
? "border-china-gold/50 shadow-[0_18px_40px_rgba(168,24,27,0.12)]"
|
| 486 |
+
: res
|
| 487 |
+
? "border-rose-200/70 shadow-[0_18px_40px_rgba(244,63,94,0.08)]"
|
| 488 |
+
: "border-china-gold/25 shadow-sm";
|
| 489 |
+
const answerTone = ok ? "text-ink-black" : running ? "text-china-gold" : res ? "text-rose-700" : "text-amber-700";
|
| 490 |
return `
|
| 491 |
<article class="tilt-card bg-paper-white border ${cardTone} p-5 md:p-6 flex flex-col gap-4 relative overflow-hidden">
|
| 492 |
<div class="absolute inset-x-0 top-0 h-1 bg-gradient-to-r from-transparent via-imperial-red to-transparent ${ok ? 'opacity-100' : 'opacity-45'}"></div>
|
| 493 |
<div class="flex items-center justify-between gap-4">
|
| 494 |
<div class="flex items-center gap-3">
|
| 495 |
+
<div class="size-11 rounded-full border flex items-center justify-center ${ok ? 'bg-emerald-50 text-emerald-700 border-emerald-200' : running ? 'bg-amber-50 text-amber-700 border-amber-200 pulse-ring' : res ? 'bg-rose-50 text-rose-700 border-rose-200' : 'bg-amber-50 text-amber-700 border-amber-200'}">
|
| 496 |
<span class="material-symbols-outlined text-[22px]">${meta.icon}</span>
|
| 497 |
</div>
|
| 498 |
<div>
|
|
|
|
| 501 |
</div>
|
| 502 |
</div>
|
| 503 |
<span class="text-[11px] uppercase tracking-[0.18em] font-bold ${ok ? 'text-emerald-700' : res ? 'text-rose-700' : 'text-amber-700'}">
|
| 504 |
+
${running ? "Running" : res ? (ok ? "Output" : "Error") : "Idle"}
|
| 505 |
</span>
|
| 506 |
</div>
|
| 507 |
|
| 508 |
<div class="min-h-[120px] rounded-none border border-china-gold/20 bg-[#FAF7F0] p-5 flex items-center">
|
| 509 |
<p class="text-[18px] md:text-[20px] leading-relaxed font-serif ${answerTone}">
|
| 510 |
+
${running ? "Predicting..." : escapeHtml(answer)}
|
| 511 |
</p>
|
| 512 |
</div>
|
| 513 |
|
|
|
|
| 520 |
}).join("");
|
| 521 |
}
|
| 522 |
|
| 523 |
+
function renderRunningModelGrid() {
|
| 524 |
+
const runningResults = Array.from(selectedModels).map((variant) => ({
|
| 525 |
+
variant,
|
| 526 |
+
status: "running",
|
| 527 |
+
prediction: "",
|
| 528 |
+
prediction_raw: "",
|
| 529 |
+
}));
|
| 530 |
+
renderModelGrid(runningResults);
|
| 531 |
+
}
|
| 532 |
+
|
| 533 |
function updateModelChips() {
|
| 534 |
document.querySelectorAll(".model-chip").forEach((chip) => {
|
| 535 |
const variant = chip.dataset.model;
|
|
|
|
| 639 |
el.runBtn.disabled = true;
|
| 640 |
el.runBtn.querySelector("span").textContent = "Running...";
|
| 641 |
setStatus("Running all selected models...");
|
| 642 |
+
renderRunningModelGrid();
|
| 643 |
+
applyTiltEffect(".tilt-card", 5);
|
| 644 |
|
| 645 |
try {
|
| 646 |
const formData = new FormData();
|
|
|
|
| 653 |
if (!res.ok) {
|
| 654 |
throw new Error(data?.detail || "Prediction failed");
|
| 655 |
}
|
| 656 |
+
renderModelGrid(data.results || []);
|
| 657 |
applyTiltEffect(".tilt-card", 5);
|
| 658 |
setStatus(`Done. ${data.summary?.success_count ?? 0} models succeeded.`);
|
| 659 |
} catch (err) {
|