{{ t.heroEyebrow }}
{{ t.heroTitle }}
{{ t.heroLead }}
{{ heroItem.title }}
{{ k.value }}
{{ k.label }}
{{ k.sub }}
{{ t.whyTitle }}
| ComfyUI | {{ t.comfyN }} | NebulaFlow | |
|---|---|---|---|
| {{ row[0] }} | {{ c[0] }}{{ c.slice(1) }}{{ c }} |
{{ t.matrixNote }}
{{ t.featuresTitle }}
{{ f.title }}
{{ f.body }}
- {{ b }}
{{ t.archTitle }}
{{ t.comfyTitle }}
{{ t.comfyLead }}
{{ t['vs_' + hd.id][0] }}
{{ fmt(hd.ratio, 2) }}×p50 {{ fmt(hd.aside.ratio, 2) }}× · {{ fmt(hd.aside.comfy, 0) }} s → {{ fmt(hd.aside.ours, 0) }} s
{{ t['vs_' + hd.id][1] }}
{{ t['vs_' + hd.id][2] }}
{{ raceTitle }}
{{ t.raceSub.replace('{g}', race.gpus || 2) }}
{{ fmtClock(raceT) }}
{{ racePlaying ? '⏸ ' + t.racePause : (raceT >= raceEnd ? '↺ ' + t.raceReplay : '▶ ' + t.racePlay) }}
{{ k === 'ours' ? 'NebulaFlow' : t.raceBase }}
{{ t.raceDone }} {{ raceDoneCount(k) }}/{{ race[k].rows.length }}
{{ t.raceMerges.replace('{n}', raceMergeCount) }}
{{ raceRoles }}
✓ {{ fmtClock(race[k].makespan) }}
▼{{ t.raceArrive }}
{{ t['race_' + kd] }}
{{ t.raceMergeLegend }}
{{ t.raceVerdict.replace('{n}', race.users).replace('{ours}', fmtClock(race.ours.makespan)).replace('{base}', fmtClock(race.serial.makespan)).replace('{x}', race.speedup).replace('{lo}', fmtClock(race.ours.lat_mean || 0)).replace('{lb}', fmtClock(race.serial.lat_mean || 0)) }}
{{ t.comfyNote }} {{ t.benchDl }}{{ t.benchBurst }} · {{ t.benchDense }}
{{ t.extTitle }}
{{ t.extLead }}
{{ m.tag }}{{ m.stateText }}
{{ m.name }}
{{ m.desc }}
{{ m.adapter }}
⇢
{{ t.extCore }}
✓ {{ c }}
{{ i + 1 }}
{{ st[0] }}
{{ st[1] }}
{{ t.futureTitle }}
BoNsai
{{ t.futureBody }}
- {{ b }}
{{ t.futureNote }}
{{ fc.title }}
{{ fc.body }}
- {{ b }}
{{ fc.note }}
▶ NebulaFlow
{{ t.adminOnly }}
{{ mode === 'online' ? t.onlineHint : t.batchHint }}
{{ w.label[lang] }}
{{ t.yamlTitle }}
🚧 {{ t.n8nNotice }}
{{ t.yamlDesc }}
{{ yamlWf.result.ok ? '✓ ' + t.yamlOk : '✗ ' + t.yamlBad }}
· {{ yamlWf.result.name }}
· {{ yamlWf.result.summary.stages }} {{ t.yamlStages }}({{ t.yamlGpu }} {{ yamlWf.result.summary.gpu }} / {{ t.yamlLocal }} {{ yamlWf.result.summary.local }})
{{ m }}
- {{ e }}
- {{ t.yamlWarn }}:{{ w }}
{{ wf.desc[lang] }}
{{ t.myJobs }}
{{ terminal(row.status) ? '—' : '···' }}
{{ cleanPrompt(row.first_prompt) }}
{{ jobSummary.total }}{{ t.totalTime }}
{{ jobSummary.gpus }}{{ t.gpusUsed }}
{{ jobSummary.gpuTime }}{{ t.gpuTime }}
{{ jobSummary.parallel }}{{ t.parallelism }}
{{ job.outputs.length }}{{ t.outputs }}
{{ t.waterfall }} {{ t.waterfallHint }}
{{ t.outputs }}
{{ terminal(job.status) ? t.noOutputs : t.waitingOutputs }}
{{ t.tasks }}
{{ t.promptsTitle }}
- {{ p }}
{{ t.engineStats }}
{{ JSON.stringify(job.stats, null, 1) }}
{{ sysOnline }}/{{ (sys.gpus || []).length }}
{{ t.gpusOnline }}
{{ sysBusy }}
{{ t.workersBusy }}
{{ (sys.task_counts || {}).PENDING || 0 }}
{{ t.queued }}
{{ (sys.task_counts || {}).DISPATCHED || 0 }}
{{ t.running }}
{{ (sys.task_counts || {}).DONE || 0 }}
{{ t.done }}
{{ (sys.task_counts || {}).FAILED || 0 }}
{{ t.failed }}
{{ t.gpuPool }}
GPU {{ row.gpu.index }}{{ row.gpu.name }}
{{ workerState(row) }}
{{ t.util }}{{ fmt(row.gpu.util_pct, 0) }}%
{{ t.mem }}{{ fmt(row.gpu.mem_used_mib / 1024, 0) }}/{{ fmt(row.gpu.mem_total_mib / 1024, 0) }} GB
{{ t.worker }} {{ row.worker.id }} · {{ row.worker.alias }}
{{ t.noWorker }}
▶ {{ taskOwner[tk.task_id].tenant }} · {{ wfLabel(taskOwner[tk.task_id].workflow) }}{{ tk.task_id.slice(0, 13) }} · {{ dur(tk.started_ts, null) }}
{{ t.stop }}
{{ t.cached }}: {{ row.worker.cached_models.join(', ') }}
{{ t.remoteWorkers }}
{{ t.timeline }} {{ t.timelineHint }}
{{ t.tenants }}
{{ t.recentTasks }}
{{ t.showcaseEmpty }}
{{ scItem.title }}
{{ f.value }}{{ f.label }}
{{ t.prompt }}
{{ scItem.prompt }}
{{ k }}: {{ v }}
{{ scItem.note }}