Flatten image edit controls and let CFG/steps be typed past the old slider caps.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+3
-14
@@ -2,18 +2,7 @@ import { addStudioJob, kickStudioQueue, listStudioJobs } from '~/server/utils/st
|
||||
import { parsePostedLoraStack, listStudioLoras, persistLoraFields } from '~/server/utils/loras'
|
||||
import { comfyConfigured } from '~/server/utils/comfy'
|
||||
import { imageDimensions } from '~/server/utils/resolution'
|
||||
|
||||
function parseSteps(raw: unknown) {
|
||||
const value = Number(raw)
|
||||
if (!Number.isFinite(value)) return 20
|
||||
return Math.min(40, Math.max(1, Math.round(value)))
|
||||
}
|
||||
|
||||
function parseCfg(raw: unknown) {
|
||||
const value = Number(raw)
|
||||
if (!Number.isFinite(value)) return 1
|
||||
return Math.min(8, Math.max(0.5, Math.round(value * 10) / 10))
|
||||
}
|
||||
import { clampImageCfg, clampImageSteps } from '~/utils/generationPresets'
|
||||
|
||||
function parsePasses(raw: string | undefined) {
|
||||
if (!raw) return [] as { prompt: string }[]
|
||||
@@ -75,8 +64,8 @@ export default defineEventHandler(async (event) => {
|
||||
const folderLocked = Boolean(destFolder?.protected && !destFolder.unlocked)
|
||||
const hideInput = fields.hideInput === 'true'
|
||||
const hideThumbnail = fields.hideThumbnail === 'true'
|
||||
const steps = parseSteps(fields.steps)
|
||||
const cfg = parseCfg(fields.cfg)
|
||||
const steps = clampImageSteps(fields.steps)
|
||||
const cfg = clampImageCfg(fields.cfg)
|
||||
const seed = fields.seed && fields.seed !== 'random'
|
||||
? Number(fields.seed)
|
||||
: Math.floor(Math.random() * 2_147_483_647)
|
||||
|
||||
@@ -3,6 +3,7 @@ import { join } from 'node:path'
|
||||
import { composeShotPrompt } from '~/utils/globalLocks'
|
||||
import { parsePostedLoraStack, listStudioLoras, persistLoraFields } from '~/server/utils/loras'
|
||||
import { readLoraStack } from '~/utils/loras'
|
||||
import { clampVideoCfg } from '~/utils/generationPresets'
|
||||
import { defaultVideoSteps, isLtxWorkflow, LTX_DISABLED_MESSAGE, ltxWorkflowEnabled, parseVideoWorkflow } from '~/utils/videoModels'
|
||||
|
||||
const SAMPLERS = new Set(['res_multistep', 'euler', 'dpmpp_2m'])
|
||||
@@ -24,11 +25,7 @@ function parseFps(raw: unknown) {
|
||||
}
|
||||
|
||||
function parseCfg(raw: unknown, turbo: boolean) {
|
||||
const fallback = turbo ? 1.5 : 4
|
||||
const value = Number(raw)
|
||||
if (!Number.isFinite(value)) return fallback
|
||||
const snapped = Math.round(value * 2) / 2
|
||||
return Math.min(10, Math.max(1, snapped))
|
||||
return clampVideoCfg(raw, turbo ? 1.5 : 4)
|
||||
}
|
||||
|
||||
function parseSampler(raw: unknown) {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { addStudioJob, kickStudioQueue, listStudioJobs } from '~/server/utils/studioQueue'
|
||||
import { listStudioLoras, parsePostedLoraStack, parseShotLoraStacks, persistLoraFields } from '~/server/utils/loras'
|
||||
import type { LoraStackItem } from '~/utils/loras'
|
||||
import { clampVideoCfg } from '~/utils/generationPresets'
|
||||
import { defaultVideoSteps, isLtxWorkflow, isTextToVideo, LTX_DISABLED_MESSAGE, ltxWorkflowEnabled, parseVideoWorkflow } from '~/utils/videoModels'
|
||||
import { allowIdentityRefs, normalizePermanenceRefs, resolveGlobalLocks, type PermanenceRef } from '~/utils/globalLocks'
|
||||
|
||||
@@ -66,10 +67,7 @@ function parseFps(raw: string | undefined) {
|
||||
|
||||
function parseCfg(raw: string | undefined, turbo: boolean, ltx = false) {
|
||||
const fallback = ltx ? 3.5 : (turbo ? 1.5 : 4)
|
||||
const value = Number(raw)
|
||||
if (!Number.isFinite(value)) return fallback
|
||||
const snapped = Math.round(value * 2) / 2
|
||||
return Math.min(10, Math.max(1, snapped))
|
||||
return clampVideoCfg(raw, fallback)
|
||||
}
|
||||
|
||||
function parseSampler(raw: string | undefined, ltx = false) {
|
||||
|
||||
@@ -3,6 +3,9 @@ import { join } from 'node:path'
|
||||
import { ownerRoot } from '~/server/utils/library'
|
||||
import { filterLoraStackForStudio, normalizeLoraStack } from '~/utils/loras'
|
||||
import {
|
||||
clampImageCfg,
|
||||
clampImageSteps,
|
||||
clampVideoCfg,
|
||||
normalizePresetName,
|
||||
parseGenerationPresetKind,
|
||||
type GenerationPreset,
|
||||
@@ -54,12 +57,6 @@ function mutate<T>(owner: string, fn: (presets: GenerationPreset[]) => T): Promi
|
||||
return run
|
||||
}
|
||||
|
||||
function clampInt(raw: unknown, fallback: number, min: number, max: number) {
|
||||
const value = Number(raw)
|
||||
if (!Number.isFinite(value)) return fallback
|
||||
return Math.min(max, Math.max(min, Math.round(value)))
|
||||
}
|
||||
|
||||
function clampNum(raw: unknown, fallback: number, min: number, max: number, step = 0.1) {
|
||||
const value = Number(raw)
|
||||
if (!Number.isFinite(value)) return fallback
|
||||
@@ -77,7 +74,7 @@ function sanitizeVideoSettings(raw: unknown): VideoPresetSettings {
|
||||
return {
|
||||
workflow,
|
||||
turbo,
|
||||
cfg: clampNum(rec.cfg, turbo ? 1.5 : 4, 1, 10, 0.5),
|
||||
cfg: clampVideoCfg(rec.cfg, turbo ? 1.5 : 4),
|
||||
fps: rec.fps === 12 || rec.fps === 30 || rec.fps === 24 ? Number(rec.fps) : 24,
|
||||
samplerName: sampler === 'euler' || sampler === 'dpmpp_2m' || sampler === 'res_multistep' ? sampler : 'res_multistep',
|
||||
scheduler: scheduler === 'ddim_uniform' || scheduler === 'sgm_uniform' || scheduler === 'simple' ? scheduler : 'simple',
|
||||
@@ -90,8 +87,8 @@ function sanitizeVideoSettings(raw: unknown): VideoPresetSettings {
|
||||
function sanitizeImageSettings(raw: unknown): ImagePresetSettings {
|
||||
const rec = raw && typeof raw === 'object' ? raw as Record<string, unknown> : {}
|
||||
return {
|
||||
steps: clampInt(rec.steps, 20, 1, 40),
|
||||
cfg: clampNum(rec.cfg, 1, 0.5, 4, 0.1),
|
||||
steps: clampImageSteps(rec.steps),
|
||||
cfg: clampImageCfg(rec.cfg),
|
||||
negative: String(rec.negative || '').slice(0, 2000)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user