From dbe45fd2ff9362afa81d480a070f2db755b4244f Mon Sep 17 00:00:00 2001 From: Towsty Date: Tue, 25 Aug 2026 22:55:06 -0500 Subject: [PATCH] Add generation quality controls and bind them to the MiniMax workflow. Expose aspect, CFG, FPS, sampler, and scheduler in Generation settings, persist them on clips and held jobs, and inject those values into the Comfy graph. Keep the image picker stills-only and allow renaming library clips. Co-authored-by: Cursor --- components/ImagePickerModal.vue | 91 +------- pages/index.vue | 281 +++++++++++++++++++------ server/api/generate.post.ts | 63 +++++- server/api/library/clips/[id].patch.ts | 14 +- server/utils/jobs.ts | 4 + server/utils/library.ts | 39 +++- server/utils/resolution.ts | 14 +- server/utils/watch.ts | 6 +- server/utils/workflow.ts | 50 +++++ 9 files changed, 388 insertions(+), 174 deletions(-) diff --git a/components/ImagePickerModal.vue b/components/ImagePickerModal.vue index 8cff0a1..dd6bb00 100644 --- a/components/ImagePickerModal.vue +++ b/components/ImagePickerModal.vue @@ -65,8 +65,8 @@ @@ -199,19 +142,9 @@ export interface PickerStill { hideInput?: boolean } -export interface PickerClip { - id: string - folderId: string - hideThumbnail: boolean - hasThumbnail?: boolean - name?: string - prompt: string -} - const props = defineProps<{ folders: PickerFolder[] stills: PickerStill[] - clips: PickerClip[] folderId: string hideInputPreview?: boolean }>() @@ -245,10 +178,7 @@ watch(() => props.folderId, (id) => { const current = computed(() => props.folders.find(folder => folder.id === activeFolderId.value) || props.folders[0]) const visibleStills = computed(() => props.stills.filter(still => still.folderId === (current.value?.id || activeFolderId.value))) -const visibleClipThumbs = computed(() => props.clips.filter(clip => clip.folderId === (current.value?.id || activeFolderId.value))) -const hasHiddenItems = computed(() => { - return visibleStills.value.some(still => stillHidden(still)) || visibleClipThumbs.value.some(clip => clip.hideThumbnail) -}) +const hasHiddenItems = computed(() => visibleStills.value.some(still => stillHidden(still))) function stillHidden(still: PickerStill) { return still.hideInput === true || props.hideInputPreview === true @@ -272,10 +202,7 @@ function toggleReveal(id: string) { } function visibleHiddenIds() { - return [ - ...visibleStills.value.filter(still => stillHidden(still)).map(still => still.id), - ...visibleClipThumbs.value.filter(clip => clip.hideThumbnail).map(clip => 'clip-' + clip.id) - ] + return visibleStills.value.filter(still => stillHidden(still)).map(still => still.id) } function toggleRevealAll() { @@ -321,16 +248,6 @@ function onDrop(event: DragEvent) { if (next) void ingest(next) } -async function pickClip(clip: PickerClip) { - try { - const blob = await $fetch(`/api/library/clips/${clip.id}/thumb`, { responseType: 'blob' }) - const file = new File([blob], `${clip.id}.png`, { type: blob.type || 'image/png' }) - emit('select', file, clip.hideThumbnail === true) - } catch (error: any) { - emit('error', error?.data?.statusMessage || 'Could not load that still') - } -} - async function pickStill(still: PickerStill) { try { const blob = await $fetch(`/api/library/stills/${still.id}`, { responseType: 'blob' }) diff --git a/pages/index.vue b/pages/index.vue index 085e7f2..1cfa1e4 100644 --- a/pages/index.vue +++ b/pages/index.vue @@ -67,24 +67,6 @@ /> -
-

Aspect ratio / quality

-
- -
-

Output {{ outputSize.width }} × {{ outputSize.height }}{{ aspect === 'auto' ? ' · matching the still' : ' · override' }}

-
-

Save to library

@@ -143,6 +125,23 @@
Generation settings
+
+

Aspect ratio / resolution

+
+ +
+

Output {{ outputSize.width }} × {{ outputSize.height }}

+

Steps

@@ -150,7 +149,42 @@
+
+ CFG / Guidance scale +
+ + +
+

{{ turbo ? 'Default 1.5 with Turbo LoRA' : 'Default 4.0 with High-Fidelity' }}

+
+
Duration
@@ -182,10 +216,31 @@ >

Type any length, use the slider, or drag up/down in the box.

- +
+ +
+

Sampler & scheduler

+
+ + +
@@ -342,7 +397,17 @@
-

{{ item.name || item.prompt }}

+ +

{{ item.name || item.prompt }}

+