mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-02-10 01:50:08 +00:00
fix: loading api-format workflow that contains "parameters" string (#7411)
## Summary This change extends https://github.com/Comfy-Org/ComfyUI_frontend/pull/7154 by making sure the `prompt` metadata tag is parsed before the legacy A1111 fallback when files are dropped onto the canvas. ComfyUI embeds two structured payloads into every first-class export format we support (PNG, WEBP, WEBM, MP4/MOV/M4V, GLB, SVG, MP3, OGG/FLAC, etc.): `workflow`, which is the full editor JSON with layout state, and `prompt`, which is the API graph sent to `/prompt`. During import we try format-specific decoders first and only as a last resort look for an A1111 file by scanning text chunks for a `parameters` entry. That compatibility path was always meant to be a best-effort option, but when we refactored the loader it accidentally enforced the order `workflow → parameters → prompt`. As soon as a dropped asset contained a `parameters` chunk—something Image Saver’s “A1111 compatibility” mode always adds—the A1111 converter activated and blocked the subsequent `prompt` loading logic. PR #7154 already lifted `workflow` ahead of the fallback, yet any file lacking the `workflow` chunk but holding both `prompt` and `parameters` still regressed. Reordering to `workflow → prompt → parameters` preserves the compatibility shim for genuine A1111 exports while guaranteeing native Comfy metadata always wins, eliminating the entire class of failures triggered merely by the presence of the word `parameters` in an unrelated metadata chunk. Fixes https://github.com/Comfy-Org/ComfyUI_frontend/issues/7096, fixes https://github.com/Comfy-Org/ComfyUI_frontend/issues/6988 ## Related (fixed by https://github.com/Comfy-Org/ComfyUI_frontend/pull/7154) - https://github.com/Comfy-Org/ComfyUI_frontend/issues/6633 - https://github.com/Comfy-Org/ComfyUI_frontend/issues/6561 --------- Co-authored-by: github-actions <github-actions@github.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
This commit is contained in:
@@ -1468,7 +1468,21 @@ export class ComfyApp {
|
||||
}
|
||||
}
|
||||
|
||||
// Use parameters as fallback when no workflow exists
|
||||
if (prompt) {
|
||||
try {
|
||||
const promptObj =
|
||||
typeof prompt === 'string' ? JSON.parse(prompt) : prompt
|
||||
if (this.isApiJson(promptObj)) {
|
||||
this.loadApiJson(promptObj, fileName)
|
||||
return
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Failed to parse prompt:', err)
|
||||
}
|
||||
// Fall through to parameters as a last resort
|
||||
}
|
||||
|
||||
// Use parameters strictly as the final fallback
|
||||
if (parameters) {
|
||||
// Note: Not putting this in `importA1111` as it is mostly not used
|
||||
// by external callers, and `importA1111` has no access to `app`.
|
||||
@@ -1481,18 +1495,25 @@ export class ComfyApp {
|
||||
return
|
||||
}
|
||||
|
||||
if (prompt) {
|
||||
const promptObj = typeof prompt === 'string' ? JSON.parse(prompt) : prompt
|
||||
this.loadApiJson(promptObj, fileName)
|
||||
return
|
||||
}
|
||||
|
||||
this.showErrorOnFileLoad(file)
|
||||
}
|
||||
|
||||
// @deprecated
|
||||
isApiJson(data: unknown) {
|
||||
return _.isObject(data) && Object.values(data).every((v) => v.class_type)
|
||||
isApiJson(data: unknown): data is ComfyApiWorkflow {
|
||||
if (!_.isObject(data) || Array.isArray(data)) {
|
||||
return false
|
||||
}
|
||||
if (Object.keys(data).length === 0) return false
|
||||
|
||||
return Object.values(data).every((node) => {
|
||||
if (!node || typeof node !== 'object' || Array.isArray(node)) {
|
||||
return false
|
||||
}
|
||||
|
||||
const { class_type: classType, inputs } = node as Record<string, unknown>
|
||||
const inputsIsRecord = _.isObject(inputs) && !Array.isArray(inputs)
|
||||
return typeof classType === 'string' && inputsIsRecord
|
||||
})
|
||||
}
|
||||
|
||||
loadApiJson(apiData: ComfyApiWorkflow, fileName: string) {
|
||||
|
||||
Reference in New Issue
Block a user