Drop the unused Klein branch from image-edit prompts and show the real Comfy error.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Towsty
2026-08-27 09:20:34 -05:00
co-authored by Cursor
parent 13ecec949c
commit f88dfa1146
2 changed files with 37 additions and 15 deletions
+29 -4
View File
@@ -204,16 +204,31 @@ export async function downloadEditedImage(image: { filename: string; subfolder:
} }
function historyError(history: Record<string, unknown> | null, promptId: string) { function historyError(history: Record<string, unknown> | null, promptId: string) {
const entry = history?.[promptId] as { status?: { status_str?: string; completed?: boolean } } | undefined const entry = history?.[promptId] as {
status?: {
status_str?: string
completed?: boolean
messages?: Array<[string, Record<string, unknown>]>
}
} | undefined
const status = entry?.status?.status_str const status = entry?.status?.status_str
const fromMessages = formatExecutionError(entry?.status?.messages?.find(([type]) => type === 'execution_error')?.[1])
if (status === 'interrupted') return 'Job interrupted.' if (status === 'interrupted') return 'Job interrupted.'
if (status === 'error') return 'Image ComfyUI reported an execution error' if (status === 'error') return fromMessages || 'Image ComfyUI reported an execution error'
if (entry?.status?.completed && !extractEditedImage(history, promptId)) { if (entry?.status?.completed && !extractEditedImage(history, promptId)) {
return 'Image ComfyUI finished without an output still' return 'Image ComfyUI finished without an output still'
} }
return null return null
} }
function formatExecutionError(data?: Record<string, unknown> | null) {
if (!data) return ''
const node = String(data.node_type || data.node_id || '').trim()
const message = String(data.exception_message || data.message || '').trim()
if (node && message) return `${node}: ${message}`
return message
}
export async function waitForImageEdit(opts: { export async function waitForImageEdit(opts: {
promptId: string promptId: string
clientId: string clientId: string
@@ -240,7 +255,17 @@ export async function waitForImageEdit(opts: {
ws.addEventListener('message', (event) => { ws.addEventListener('message', (event) => {
const payload = JSON.parse(String(event.data || '{}')) as { const payload = JSON.parse(String(event.data || '{}')) as {
type?: string type?: string
data?: { value?: number; max?: number; node?: string | null; prompt_id?: string } data?: {
value?: number
max?: number
node?: string | null
prompt_id?: string
exception_message?: string
exception_type?: string
node_id?: string
node_type?: string
message?: string
}
} }
if (payload.type === 'progress' && payload.data) { if (payload.type === 'progress' && payload.data) {
const max = Math.max(1, Number(payload.data.max || 4)) const max = Math.max(1, Number(payload.data.max || 4))
@@ -261,7 +286,7 @@ export async function waitForImageEdit(opts: {
}) })
} }
if (payload.type === 'execution_error') { if (payload.type === 'execution_error') {
finish(null, 'Image ComfyUI reported an execution error') finish(null, formatExecutionError(payload.data) || 'Image ComfyUI reported an execution error')
} }
}) })
} catch { } catch {
+7 -10
View File
@@ -1,6 +1,5 @@
import template from '../assets/workflow_flux2_klein_edit.json' import template from '../assets/workflow_flux2_klein_edit.json'
const BYPASS = 4
const IMAGE1 = '76' const IMAGE1 = '76'
const IMAGE2 = '81' const IMAGE2 = '81'
const SINGLE_SAVE = '9' const SINGLE_SAVE = '9'
@@ -16,7 +15,7 @@ const DUAL_NOISE = '92:105'
const DUAL_SCHEDULER = '92:115' const DUAL_SCHEDULER = '92:115'
const DUAL_CFG = '92:114' const DUAL_CFG = '92:114'
type WorkflowNode = { class_type: string; inputs: Record<string, unknown>; mode?: number; _meta?: { title?: string } } type WorkflowNode = { class_type: string; inputs: Record<string, unknown>; _meta?: { title?: string } }
type WorkflowGraph = Record<string, WorkflowNode> type WorkflowGraph = Record<string, WorkflowNode>
export interface EditParams { export interface EditParams {
@@ -38,7 +37,6 @@ export function buildEditWorkflow(params: EditParams) {
const prefix = params.filenamePrefix || 'aigen-edit' const prefix = params.filenamePrefix || 'aigen-edit'
setImage(graph, IMAGE1, params.imageName) setImage(graph, IMAGE1, params.imageName)
setImage(graph, IMAGE2, params.referenceImageName || '')
setText(graph, SINGLE_PROMPT, prompt) setText(graph, SINGLE_PROMPT, prompt)
setText(graph, DUAL_PROMPT, prompt) setText(graph, DUAL_PROMPT, prompt)
setText(graph, SINGLE_NEGATIVE, negative) setText(graph, SINGLE_NEGATIVE, negative)
@@ -52,16 +50,15 @@ export function buildEditWorkflow(params: EditParams) {
setInput(graph, SINGLE_SAVE, 'filename_prefix', prefix) setInput(graph, SINGLE_SAVE, 'filename_prefix', prefix)
setInput(graph, DUAL_SAVE, 'filename_prefix', prefix) setInput(graph, DUAL_SAVE, 'filename_prefix', prefix)
for (const [id, node] of Object.entries(graph)) { if (dual) {
if (!node) continue setImage(graph, IMAGE2, params.referenceImageName || '')
if (id === IMAGE1) {
delete node.mode
continue
} }
for (const id of Object.keys(graph)) {
if (id === IMAGE1) continue
const dualNode = id === IMAGE2 || id === DUAL_SAVE || id.startsWith('92:') const dualNode = id === IMAGE2 || id === DUAL_SAVE || id.startsWith('92:')
const singleNode = id === SINGLE_SAVE || id.startsWith('75:') const singleNode = id === SINGLE_SAVE || id.startsWith('75:')
if (dual ? singleNode : dualNode) node.mode = BYPASS if (dual ? singleNode : dualNode) delete graph[id]
else delete node.mode
} }
return graph return graph