import type { LoraTrainingStatus } from "../types"; interface LoraTrainingCardProps { training: LoraTrainingStatus | null; } function formatNumber(value?: number | null, digits = 2): string { if (typeof value !== "number" || Number.isNaN(value)) return "--"; return value.toFixed(digits); } export function LoraTrainingCard({ training }: LoraTrainingCardProps) { if (!training || training.status === "missing_log") return null; const progress = training.progress_percent ?? 0; const progressWidth = `${Math.max(2, Math.min(100, progress))}%`; const statusLabel = training.status === "training" ? "Training" : training.status; return (
LoRA Training · {statusLabel}

{training.job_name || "Active LoRA job"}

Step {training.current_step} / {training.total_steps} {training.eta ? ` · ETA ${training.eta}` : ""}

Loss

{formatNumber(training.loss, 4)}

GPU

{formatNumber(training.gpu_util, 0)}%

VRAM

{formatNumber(training.vram_percent, 0)}%

Step Time

{formatNumber(training.seconds_per_step, 2)}s

{formatNumber(progress, 1)}% lr {training.lr ? training.lr.toExponential(1) : "--"}
); }