From d21ea0f65b5839897b0d7077898f989ccb04d14f Mon Sep 17 00:00:00 2001 From: Christian Byrne Date: Fri, 12 Dec 2025 20:39:30 -0800 Subject: [PATCH] fix: loading api-format workflow that contains "parameters" string (#7411) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 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 Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .../workflow_prompt_parameters.png | Bin 0 -> 422 bytes .../tests/loadWorkflowInMedia.spec.ts | 1 + ...w-prompt-parameters-png-chromium-linux.png | Bin 0 -> 44976 bytes src/scripts/app.ts | 39 ++++++++++++++---- 4 files changed, 31 insertions(+), 9 deletions(-) create mode 100644 browser_tests/assets/workflowInMedia/workflow_prompt_parameters.png create mode 100644 browser_tests/tests/loadWorkflowInMedia.spec.ts-snapshots/workflow-prompt-parameters-png-chromium-linux.png diff --git a/browser_tests/assets/workflowInMedia/workflow_prompt_parameters.png b/browser_tests/assets/workflowInMedia/workflow_prompt_parameters.png new file mode 100644 index 0000000000000000000000000000000000000000..71b50350677d9faf7d8f1ce0a06bf94bf262625a GIT binary patch literal 422 zcmXX>yH3ME5VR-|SPB&t)#^GVBjG&ZI!H{2fCxyC5KVHiH?f5sTfWPSC=Fd`Xep?u z5kjdb^B++16;!N~6nAsGGds64y{wi~`i`z?TB>qdx+dI6&c+(uXTk0d!BkndDvHA( zQrej9Gd^ZsH|i;wyat}5T*h-|+F&kv9apW2mQc3aklq6_ZcYql`$Ecw8bwqyi@ZkX zLSa``0?|QcuttDNB#z2cexkWt{0IvvEVXPhnY_=wftLDOEG1$=V;D { 'edited_workflow.webp', 'no_workflow.webp', 'large_workflow.webp', + 'workflow_prompt_parameters.png', 'workflow.webm', // Skipped due to 3d widget unstable visual result. // 3d widget shows grid after fully loaded. diff --git a/browser_tests/tests/loadWorkflowInMedia.spec.ts-snapshots/workflow-prompt-parameters-png-chromium-linux.png b/browser_tests/tests/loadWorkflowInMedia.spec.ts-snapshots/workflow-prompt-parameters-png-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..5688c3547f8eca67b8e7f0423bc8cb5e02fef2be GIT binary patch literal 44976 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 XnZy!M-&BsP%kaw{RfTwYgY*9jgjM-9 literal 0 HcmV?d00001 diff --git a/src/scripts/app.ts b/src/scripts/app.ts index 7201fb68c..473c32fb4 100644 --- a/src/scripts/app.ts +++ b/src/scripts/app.ts @@ -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 + const inputsIsRecord = _.isObject(inputs) && !Array.isArray(inputs) + return typeof classType === 'string' && inputsIsRecord + }) } loadApiJson(apiData: ComfyApiWorkflow, fileName: string) {