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 <cursoragent@cursor.com>
This commit is contained in:
Towsty
2026-08-25 22:55:06 -05:00
co-authored by Cursor
parent a7a810a7b3
commit dbe45fd2ff
9 changed files with 388 additions and 174 deletions
+37 -2
View File
@@ -30,6 +30,10 @@ export interface LibraryClip {
hideThumbnail: boolean
createdAt: number
comfyFilename?: string
cfg?: number
fps?: number
samplerName?: string
scheduler?: string
}
export interface LibraryStill {
@@ -71,6 +75,10 @@ export interface RetryDraft {
sound: boolean
hideInput?: boolean
stillFilename?: string
cfg?: number
fps?: number
samplerName?: string
scheduler?: string
}
interface Catalog {
@@ -662,6 +670,10 @@ export async function saveRetryDraft(params: {
hideThumbnail: boolean
sound: boolean
hideInput?: boolean
cfg?: number
fps?: number
samplerName?: string
scheduler?: string
}) {
return mutate(params.ownerKey, (catalog) => {
const existing = params.id ? catalog.drafts.find(item => item.id === params.id) : undefined
@@ -682,7 +694,11 @@ export async function saveRetryDraft(params: {
duration: params.duration,
hideThumbnail: params.hideThumbnail,
sound: params.sound,
hideInput: params.hideInput === true
hideInput: params.hideInput === true,
cfg: params.cfg,
fps: params.fps,
samplerName: params.samplerName,
scheduler: params.scheduler
}
catalog.drafts = [draft, ...catalog.drafts.filter(item => item.id !== draft.id)].slice(0, 20)
return draft
@@ -743,6 +759,10 @@ export async function saveClip(params: {
video: Buffer
thumb?: Buffer | null
comfyFilename?: string
cfg?: number
fps?: number
samplerName?: string
scheduler?: string
}) {
const catalog = readCatalog(params.ownerKey)
const folder = catalog.folders.find(item => item.id === params.folderId) || catalog.folders[0]
@@ -760,7 +780,11 @@ export async function saveClip(params: {
seed: params.seed,
hideThumbnail: params.hideThumbnail,
createdAt: Date.now(),
comfyFilename: params.comfyFilename
comfyFilename: params.comfyFilename,
cfg: params.cfg,
fps: params.fps,
samplerName: params.samplerName,
scheduler: params.scheduler
}
mkdirSync(clipDir(params.ownerKey, clip.id), { recursive: true })
writeFileSync(clipVideoPath(params.ownerKey, clip.id), params.video)
@@ -813,6 +837,17 @@ export function moveClip(owner: string, id: string, folderId: string) {
})
}
export function renameClip(owner: string, id: string, name: string) {
const trimmed = name.trim().slice(0, 80)
if (!trimmed) throw createError({ statusCode: 400, statusMessage: 'A name is required' })
return mutate(owner, (catalog) => {
const clip = catalog.clips.find(item => item.id === id)
if (!clip) throw createError({ statusCode: 404, statusMessage: 'Clip not found' })
clip.name = trimmed
return clip
})
}
export async function downloadComfyVideo(video: { filename: string; subfolder: string; type: string }) {
const subfolders = [...new Set([video.subfolder, 'video', ''])]
let lastStatus = 0