Add Krea as a second Image v2 Generate engine beside Flux.

Generate can queue krea_v2_generate.json without sharing Klein encoders or falling back if Krea assets are missing.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Towsty
2026-08-29 07:05:01 -05:00
co-authored by Cursor
parent be5211f488
commit f6663444f5
11 changed files with 567 additions and 108 deletions
+10 -3
View File
@@ -1,5 +1,5 @@
import { loraDisplayName, normalizeLoraStack, type LoraStackItem } from '~/utils/loras'
import type { ImageV2Mode, ImageV2Task } from '~/utils/imageV2'
import type { ImageV2Engine, ImageV2Mode, ImageV2Task } from '~/utils/imageV2'
import type { VideoWorkflowId } from '~/utils/videoModels'
export type StillGenerationKind = 'image' | 'imagev2'
@@ -7,6 +7,7 @@ export type StillGenerationKind = 'image' | 'imagev2'
export type StillGenerationSettings = {
kind: StillGenerationKind
mode?: ImageV2Mode
engine?: ImageV2Engine
task?: ImageV2Task
negative?: string
snofsModel?: number
@@ -64,6 +65,7 @@ export function normalizeStillSettings(raw: unknown): StillGenerationSettings |
const mode = value.mode === 'compose' || value.mode === 'refine' || value.mode === 'generate' || value.mode === 'edit'
? value.mode
: undefined
const engine = value.engine === 'krea' || value.engine === 'flux' ? value.engine : undefined
const kind: StillGenerationKind | undefined = value.kind === 'imagev2' || mode
? 'imagev2'
: value.kind === 'image'
@@ -77,6 +79,7 @@ export function normalizeStillSettings(raw: unknown): StillGenerationSettings |
return {
kind,
mode,
engine,
task,
negative: typeof value.negative === 'string' ? value.negative : undefined,
snofsModel: finiteNumber(value.snofsModel),
@@ -127,7 +130,8 @@ export function stillModeLabel(still: { filename?: string; settings?: StillGener
? 'Refine'
: 'Edit'
const task = settings.mode === 'compose' ? composeTaskLabel(settings.task) : ''
return task ? `Image v2 · ${mode} · ${task}` : `Image v2 · ${mode}`
const engine = settings.mode === 'generate' && settings.engine === 'krea' ? 'Krea' : ''
return [mode === 'Generate' && 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'
@@ -147,8 +151,11 @@ 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) {
rows.push({ label: 'Engine', value: settings.engine === 'krea' ? 'Krea' : 'Flux' })
}
if (settings.snofsModel != null || settings.snofsClip != null) {
rows.push({ label: 'SNOFS', value: formatPair(settings.snofsModel, settings.snofsClip) })
rows.push({ label: 'Concept LoRA', value: formatPair(settings.snofsModel, settings.snofsClip) })
}
if (settings.mode !== 'generate' && (settings.consistencyModel != null || settings.consistencyClip != null)) {
rows.push({ label: 'Consistency', value: formatPair(settings.consistencyModel, settings.consistencyClip) })