diff --git a/invokeai/frontend/web/src/features/workflowLibrary/hooks/useLoadWorkflowFromFile.tsx b/invokeai/frontend/web/src/features/workflowLibrary/hooks/useLoadWorkflowFromFile.tsx index 1fb59009a5..c3c0849ed1 100644 --- a/invokeai/frontend/web/src/features/workflowLibrary/hooks/useLoadWorkflowFromFile.tsx +++ b/invokeai/frontend/web/src/features/workflowLibrary/hooks/useLoadWorkflowFromFile.tsx @@ -29,7 +29,7 @@ export const useLoadWorkflowFromFile = () => { const { onSuccess, onError, onCompleted } = options; try { const unvalidatedWorkflow = JSON.parse(rawJSON as string); - const validatedWorkflow = await validatedAndLoadWorkflow(unvalidatedWorkflow); + const validatedWorkflow = await validatedAndLoadWorkflow(unvalidatedWorkflow, 'file'); if (!validatedWorkflow) { reader.abort(); diff --git a/invokeai/frontend/web/src/features/workflowLibrary/hooks/useLoadWorkflowFromImage.ts b/invokeai/frontend/web/src/features/workflowLibrary/hooks/useLoadWorkflowFromImage.ts index 448275c785..8825f2ec35 100644 --- a/invokeai/frontend/web/src/features/workflowLibrary/hooks/useLoadWorkflowFromImage.ts +++ b/invokeai/frontend/web/src/features/workflowLibrary/hooks/useLoadWorkflowFromImage.ts @@ -41,7 +41,7 @@ export const useLoadWorkflowFromImage = () => { assert(unvalidatedWorkflow !== null, 'No workflow or graph provided'); - const validatedWorkflow = await validateAndLoadWorkflow(unvalidatedWorkflow); + const validatedWorkflow = await validateAndLoadWorkflow(unvalidatedWorkflow, 'image'); if (!validatedWorkflow) { onError?.(); diff --git a/invokeai/frontend/web/src/features/workflowLibrary/hooks/useLoadWorkflowFromLibrary.ts b/invokeai/frontend/web/src/features/workflowLibrary/hooks/useLoadWorkflowFromLibrary.ts index 81fad78872..c096cc8e60 100644 --- a/invokeai/frontend/web/src/features/workflowLibrary/hooks/useLoadWorkflowFromLibrary.ts +++ b/invokeai/frontend/web/src/features/workflowLibrary/hooks/useLoadWorkflowFromLibrary.ts @@ -30,7 +30,7 @@ export const useLoadWorkflowFromLibrary = () => { try { const res = await getWorkflow(workflowId).unwrap(); - const validatedWorkflow = await validateAndLoadWorkflow(res.workflow); + const validatedWorkflow = await validateAndLoadWorkflow(res.workflow, 'library'); if (!validatedWorkflow) { onError?.(); diff --git a/invokeai/frontend/web/src/features/workflowLibrary/hooks/useLoadWorkflowFromObject.ts b/invokeai/frontend/web/src/features/workflowLibrary/hooks/useLoadWorkflowFromObject.ts index b185182d30..ff4809a405 100644 --- a/invokeai/frontend/web/src/features/workflowLibrary/hooks/useLoadWorkflowFromObject.ts +++ b/invokeai/frontend/web/src/features/workflowLibrary/hooks/useLoadWorkflowFromObject.ts @@ -21,7 +21,7 @@ export const useLoadWorkflowFromObject = () => { ) => { const { onSuccess, onError, onCompleted } = options; try { - const validatedWorkflow = await validateAndLoadWorkflow(unvalidatedWorkflow); + const validatedWorkflow = await validateAndLoadWorkflow(unvalidatedWorkflow, 'object'); if (!validatedWorkflow) { onError?.(); diff --git a/invokeai/frontend/web/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts b/invokeai/frontend/web/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts index de0cd927d8..31dec46ba8 100644 --- a/invokeai/frontend/web/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts +++ b/invokeai/frontend/web/src/features/workflowLibrary/hooks/useValidateAndLoadWorkflow.ts @@ -43,7 +43,10 @@ export const useValidateAndLoadWorkflow = () => { * * This function catches all errors. It toasts and logs on success and error. */ - async (unvalidatedWorkflow: unknown): Promise => { + async ( + unvalidatedWorkflow: unknown, + origin: 'file' | 'image' | 'object' | 'library' + ): Promise => { try { const templates = $templates.get(); const { workflow, warnings } = await validateWorkflow({ @@ -54,6 +57,13 @@ export const useValidateAndLoadWorkflow = () => { checkModelAccess, }); + if (origin !== 'library') { + // Workflow IDs should always map directly to the workflow in the library. If the workflow is loaded from + // some other source, and has an ID, we should remove it to ensure the app does not treat it as a library workflow. + // For example, when saving a workflow, we might accidentally attempt to save instead of save-as. + delete workflow.id; + } + $nodeExecutionStates.set({}); dispatch(workflowLoaded(workflow)); if (!warnings.length) {