Show Flux and Krea as Image v2 engine cards, and run Krea on edit, compose, and refine.

Krea image-to-image uses encode plus denoise graphs, not Klein reference latents, and still fails closed if the Krea models are missing.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Towsty
2026-08-29 07:29:31 -05:00
co-authored by Cursor
parent ab5477c999
commit 5fe91e6bae
12 changed files with 608 additions and 119 deletions
+8 -1
View File
@@ -56,6 +56,8 @@ export const IMAGE_V2_GENERATE_SNOFS = { snofsModel: 0.65, snofsClip: 0.35 }
export const IMAGE_V2_KREA_STEPS = 8
export const IMAGE_V2_KREA_CFG = 1
export const IMAGE_V2_KREA_EDIT_DENOISE = 0.75
export const IMAGE_V2_KREA_COMPOSE_DENOISE = 0.7
export const IMAGE_V2_KREA_CLIP = 'qwen3vl_4b_fp8_scaled.safetensors'
export const IMAGE_V2_KREA_CLIP_TYPE = 'krea2'
export const IMAGE_V2_KREA_VAE = 'qwen_image_vae.safetensors'
@@ -88,7 +90,12 @@ export function parseImageV2Engine(raw: unknown, fallback: ImageV2Engine = 'flux
}
export function imageV2WorkflowFile(mode: ImageV2Mode, engine: ImageV2Engine = 'flux') {
if (mode === 'generate' && engine === 'krea') return 'krea_v2_generate.json'
if (engine === 'krea') {
if (mode === 'generate') return 'krea_v2_generate.json'
if (mode === 'refine') return 'krea_v2_refine.json'
if (mode === 'compose') return 'krea_v2_compose.json'
return 'krea_v2_edit.json'
}
if (mode === 'generate') return 'klein_v2_generate.json'
if (mode === 'refine') return 'klein_v2_refine.json'
if (mode === 'compose') return 'klein_v2_compose.json'
+3 -3
View File
@@ -130,8 +130,8 @@ export function stillModeLabel(still: { filename?: string; settings?: StillGener
? 'Refine'
: 'Edit'
const task = settings.mode === 'compose' ? composeTaskLabel(settings.task) : ''
const engine = settings.mode === 'generate' && settings.engine === 'krea' ? 'Krea' : ''
return [mode === 'Generate' && engine ? `Image v2 · ${mode} · ${engine}` : `Image v2 · ${mode}`, task].filter(Boolean).join(' · ')
const engine = settings.engine === 'krea' ? 'Krea' : settings.engine === 'flux' ? 'Flux' : ''
return [engine ? `Image v2 · ${mode} · ${engine}` : `Image v2 · ${mode}`, task].filter(Boolean).join(' · ')
}
if (settings?.kind === 'image') return 'Image edit'
if (/aigen_v2_/i.test(String(still.filename || ''))) return 'Image v2'
@@ -151,7 +151,7 @@ export function stillSettingsRows(still: { width?: number; height?: number; sett
} else if (still.width && still.height) {
rows.push({ label: 'Output', value: `${still.width}×${still.height}` })
}
if (settings.mode === 'generate' && settings.engine) {
if (settings.engine) {
rows.push({ label: 'Engine', value: settings.engine === 'krea' ? 'Krea' : 'Flux' })
}
if (isXaigenStudio() && (settings.snofsModel != null || settings.snofsClip != null)) {