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 0000000000..71b5035067 Binary files /dev/null and b/browser_tests/assets/workflowInMedia/workflow_prompt_parameters.png differ diff --git a/browser_tests/tests/loadWorkflowInMedia.spec.ts b/browser_tests/tests/loadWorkflowInMedia.spec.ts index f091058d24..3a7f7a71a6 100644 --- a/browser_tests/tests/loadWorkflowInMedia.spec.ts +++ b/browser_tests/tests/loadWorkflowInMedia.spec.ts @@ -12,6 +12,7 @@ test.describe('Load Workflow in Media', () => { '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 0000000000..5688c3547f Binary files /dev/null and b/browser_tests/tests/loadWorkflowInMedia.spec.ts-snapshots/workflow-prompt-parameters-png-chromium-linux.png differ diff --git a/src/scripts/app.ts b/src/scripts/app.ts index 7201fb68ca..473c32fb41 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) {