diff --git a/studio/frontend/src/features/images/diffusion-train-dialog.tsx b/studio/frontend/src/features/images/diffusion-train-dialog.tsx index 17d6dc8193..016dc3770f 100644 --- a/studio/frontend/src/features/images/diffusion-train-dialog.tsx +++ b/studio/frontend/src/features/images/diffusion-train-dialog.tsx @@ -344,7 +344,7 @@ export function DiffusionTrainDialog({ {uploading ? "Uploading..." : "Upload"} -
+
10-50 images work well. Optional captions: a .txt per image (same filename) or a metadata.jsonl; without them the trigger prompt below captions every image. You can upload more into the same name later. @@ -352,7 +352,7 @@ export function DiffusionTrainDialog({ )} {selectedDataset && selectedDataset.caption_count === 0 && ( -
+
No caption files in this dataset - the trigger prompt below will be used as the caption for every image.
@@ -480,7 +480,7 @@ export function DiffusionTrainDialog({ : status.message} {status.loss != null && !completed && <> · loss {status.loss.toFixed(4)}>} {status.lora_path && ( -{desc}
} + {desc &&{desc}
} ); } @@ -949,7 +949,7 @@ function RecipePopover({Generation settings
-{formatTimestamp(image.created_at)}
+{formatTimestamp(image.created_at)}
{error}
; + return{error}
; } if (records === null) { return ( @@ -224,7 +224,7 @@ export function DatasetLabelingGrid({ ); } if (records.length === 0) { - returnThis dataset has no images yet.
; + returnThis dataset has no images yet.
; } const uncaptioned = records.filter((r) => !r.caption || r.caption.trim() === "").length; @@ -236,7 +236,7 @@ export function DatasetLabelingGrid({ return (+
Per-step loss is noisy by design: every step samples a random noise level. Watch the smoothed line for the trend, not the raw jitter.
diff --git a/studio/frontend/src/features/images/train/diffusion-train-panel.tsx b/studio/frontend/src/features/images/train/diffusion-train-panel.tsx index 53b5aecaa0..d2081f7bd7 100644 --- a/studio/frontend/src/features/images/train/diffusion-train-panel.tsx +++ b/studio/frontend/src/features/images/train/diffusion-train-panel.tsx @@ -910,7 +910,7 @@ export function DiffusionTrainPanel({+
Constant is fine for most runs.
+
Less VRAM, slightly slower steps.
+
{familyUntrainable ? (
// The reason itself (the backend's bf16-preflight text) already shows in
// the family picker's vram_note line above.
@@ -995,7 +995,7 @@ export function DiffusionTrainPanel({
+
bf16 is right for modern GPUs.
+
Slower first step, faster after.
+
Teach a model a style or subject from your own images.
{family.vram_note}
+{family.vram_note}
)}+
Importing {examples.find((e) => e.id === importingId)?.label ?? "example"}...
)} @@ -1170,7 +1170,7 @@ export function DiffusionTrainPanel({ {/* Count and Upload appear only once files are picked. */} {pickedFileCount > 0 && ( <> - + {pickedFileCount} file{pickedFileCount === 1 ? "" : "s"} selected )}+
10-50 images is plenty. Captions are optional.
+
No captions yet, so the trigger prompt describes every image.
)} @@ -1232,7 +1232,7 @@ export function DiffusionTrainPanel({ {/* Trigger + adapter name (trigger first: it describes the dataset, the name just labels the output) */} {fullyCaptioned ? ( -+
All {selectedDataset?.image_count} images have captions, so no trigger prompt is needed.
@@ -1245,7 +1245,7 @@ export function DiffusionTrainPanel({ onChange={(e) => setInstancePrompt(e.target.value)} className="h-8 text-xs" /> -+
The words you will use later to get this style back.
+
Its name in the Create tab's picker.
@@ -1323,7 +1323,7 @@ export function DiffusionTrainPanel({ } /> -+
{viewRun.family ? `${viewRun.family} - ` : ""} {viewRun.base_model || ""} {viewRun.ended_at @@ -1367,7 +1367,7 @@ export function DiffusionTrainPanel({
+
Progress and charts take over here once training starts.
@@ -1394,14 +1394,14 @@ export function DiffusionTrainPanel({ {r.saved && ( - + adapter saved )} - + {r.status} - + {r.ended_at ? new Date(r.ended_at * 1000).toLocaleString() : ""} @@ -1457,7 +1457,7 @@ export function DiffusionTrainPanel({ /> {status?.message && ( -{status.message}
+{status.message}
)} {running && ( -+
{completed ? "Trained" : "Stopped early; the adapter as of the last finished step was saved"} @@ -1556,7 +1556,7 @@ export function DiffusionTrainPanel({ function Stat({ label, value }: { label: string; value: string }) { return (
+
{ex.description}
{/* The card's action, so: bottom right, on the thumbnail row. */} diff --git a/studio/frontend/src/features/video/video-page.tsx b/studio/frontend/src/features/video/video-page.tsx index f50dcb5b04..2efa7fde6d 100644 --- a/studio/frontend/src/features/video/video-page.tsx +++ b/studio/frontend/src/features/video/video-page.tsx @@ -344,7 +344,7 @@ function ResolvedBadge({ const resolved = status?.resolved?.[controlKey]; if (!resolved || resolved.source !== "auto") return null; const badge = ( - + Auto: {formatResolvedValue(resolved.value)} ); @@ -435,7 +435,7 @@ function RecipePopover({Generation settings
-{formatTimestamp(video.created_at)}
+{formatTimestamp(video.created_at)}