diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildChatGPT4oGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildChatGPT4oGraph.ts index 4ff09fb2e2..622c802bc2 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildChatGPT4oGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildChatGPT4oGraph.ts @@ -17,13 +17,13 @@ import { assert } from 'tsafe'; const log = logger('system'); export const buildChatGPT4oGraph = async (arg: GraphBuilderArg): Promise => { - const { generationMode, state } = arg; + const { generationMode, state, manager } = arg; if (generationMode !== 'txt2img' && generationMode !== 'img2img') { throw new UnsupportedGenerationModeError(t('toast.chatGPT4oIncompatibleGenerationMode')); } - log.debug({ generationMode }, 'Building GPT Image graph'); + log.debug({ generationMode, manager: manager?.id }, 'Building ChatGPT 4o graph'); const model = selectMainModelConfig(state); @@ -80,8 +80,9 @@ export const buildChatGPT4oGraph = async (arg: GraphBuilderArg): Promise => { - const { generationMode, state } = arg; - log.debug({ generationMode }, 'Building CogView4 graph'); + const { generationMode, state, manager } = arg; + log.debug({ generationMode, manager: manager?.id }, 'Building CogView4 graph'); const params = selectParamsSlice(state); const canvas = selectCanvasSlice(state); @@ -104,9 +104,10 @@ export const buildCogView4Graph = async (arg: GraphBuilderArg): Promise => { - const { generationMode, state } = arg; - log.debug({ generationMode }, 'Building FLUX graph'); + const { generationMode, state, manager } = arg; + log.debug({ generationMode, manager: manager?.id }, 'Building FLUX graph'); const params = selectParamsSlice(state); const canvas = selectCanvasSlice(state); @@ -164,10 +164,11 @@ export const buildFLUXGraph = async (arg: GraphBuilderArg): Promise = l2i; if (isFLUXFill && (generationMode === 'inpaint' || generationMode === 'outpaint')) { + assert(manager !== null); canvasOutput = await addFLUXFill({ state, g, - manager: arg.canvasManager, + manager, l2i, denoise, originalSize, @@ -177,9 +178,10 @@ export const buildFLUXGraph = async (arg: GraphBuilderArg): Promise>(false); } - if (generationMode === 'img2img' || generationMode === 'inpaint' || generationMode === 'outpaint') { + if (manager !== null) { const controlNetCollector = g.addNode({ type: 'collect', id: getPrefixedId('control_net_collector'), }); const controlNetResult = await addControlNets({ - manager: arg.canvasManager, + manager, entities: canvas.controlLayers.entities, g, rect: canvas.bbox.rect, @@ -249,7 +253,7 @@ export const buildFLUXGraph = async (arg: GraphBuilderArg): Promise { - const { generationMode, state } = arg; + const { generationMode, state, manager } = arg; if (generationMode !== 'txt2img') { throw new UnsupportedGenerationModeError(t('toast.imagenIncompatibleGenerationMode', { model: 'FLUX Kontext' })); } - log.debug({ generationMode }, 'Building Flux Kontext graph'); + log.debug({ generationMode, manager: manager?.id }, 'Building FLUX Kontext graph'); const model = selectMainModelConfig(state); diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildImagen3Graph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildImagen3Graph.ts index 95daa1118d..13998f9792 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildImagen3Graph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildImagen3Graph.ts @@ -14,13 +14,13 @@ import { assert } from 'tsafe'; const log = logger('system'); export const buildImagen3Graph = (arg: GraphBuilderArg): GraphBuilderReturn => { - const { generationMode, state } = arg; + const { generationMode, state, manager } = arg; if (generationMode !== 'txt2img') { throw new UnsupportedGenerationModeError(t('toast.imagenIncompatibleGenerationMode', { model: 'Imagen3' })); } - log.debug({ generationMode }, 'Building Imagen3 graph'); + log.debug({ generationMode, manager: manager?.id }, 'Building Imagen3 graph'); const canvas = selectCanvasSlice(state); diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildImagen4Graph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildImagen4Graph.ts index c97faf29b4..4b7b0a6d77 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildImagen4Graph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildImagen4Graph.ts @@ -14,13 +14,13 @@ import { assert } from 'tsafe'; const log = logger('system'); export const buildImagen4Graph = (arg: GraphBuilderArg): GraphBuilderReturn => { - const { generationMode, state } = arg; + const { generationMode, state, manager } = arg; if (generationMode !== 'txt2img') { throw new UnsupportedGenerationModeError(t('toast.imagenIncompatibleGenerationMode', { model: 'Imagen4' })); } - log.debug({ generationMode }, 'Building Imagen4 graph'); + log.debug({ generationMode, manager: manager?.id }, 'Building Imagen4 graph'); const canvas = selectCanvasSlice(state); diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSD1Graph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSD1Graph.ts index 6d5113f1b5..fd1f9505a5 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSD1Graph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSD1Graph.ts @@ -30,8 +30,8 @@ import { addRegions } from './addRegions'; const log = logger('system'); export const buildSD1Graph = async (arg: GraphBuilderArg): Promise => { - const { generationMode, state } = arg; - log.debug({ generationMode }, 'Building SD1/SD2 graph'); + const { generationMode, state, manager } = arg; + log.debug({ generationMode, manager: manager?.id }, 'Building SD1/SD2 graph'); const params = selectParamsSlice(state); const canvas = selectCanvasSlice(state); @@ -166,9 +166,10 @@ export const buildSD1Graph = async (arg: GraphBuilderArg): Promise>(false); } - if (generationMode === 'img2img' || generationMode === 'inpaint' || generationMode === 'outpaint') { + if (manager !== null) { const controlNetCollector = g.addNode({ type: 'collect', id: getPrefixedId('control_net_collector'), }); const controlNetResult = await addControlNets({ - manager: arg.canvasManager, + manager, entities: canvas.controlLayers.entities, g, rect: canvas.bbox.rect, @@ -242,7 +245,7 @@ export const buildSD1Graph = async (arg: GraphBuilderArg): Promise => { - const { generationMode, state } = arg; - log.debug({ generationMode }, 'Building SD3 graph'); + const { generationMode, state, manager } = arg; + log.debug({ generationMode, manager: manager?.id }, 'Building SD3 graph'); const model = selectMainModelConfig(state); assert(model, 'No model found in state'); @@ -128,9 +128,10 @@ export const buildSD3Graph = async (arg: GraphBuilderArg): Promise => { - const { generationMode, state } = arg; - log.debug({ generationMode }, 'Building SDXL graph'); + const { generationMode, state, manager } = arg; + log.debug({ generationMode, manager: manager?.id }, 'Building SDXL graph'); const model = selectMainModelConfig(state); assert(model, 'No model found in state'); @@ -173,9 +173,10 @@ export const buildSDXLGraph = async (arg: GraphBuilderArg): Promise>(false); } - if (generationMode === 'img2img' || generationMode === 'inpaint' || generationMode === 'outpaint') { + if (manager !== null) { const controlNetCollector = g.addNode({ type: 'collect', id: getPrefixedId('control_net_collector'), }); const controlNetResult = await addControlNets({ - manager: arg.canvasManager, + manager, entities: canvas.controlLayers.entities, g, rect: canvas.bbox.rect, @@ -249,7 +252,7 @@ export const buildSDXLGraph = async (arg: GraphBuilderArg): Promise nodeId.split(':')[0] === export const isCanvasOutputEvent = (data: S['InvocationCompleteEvent']) => { return isCanvasOutputNodeId(data.invocation_source_id); }; - -export const getGraphBuilderArg = async ( - state: RootState, - canvasManager: CanvasManager | null -): Promise => { - const tab = selectActiveTab(state); - if (tab === 'generate') { - return { generationMode: 'txt2img', state }; - } else if (tab === 'canvas') { - assert(canvasManager !== null, 'CanvasManager should not be null in canvas tab'); - const generationMode = await canvasManager.compositor.getGenerationMode(); - return { generationMode, state, canvasManager }; - } else { - assert(false, `Unknown tab: ${tab}`); - } -}; diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/types.ts b/invokeai/frontend/web/src/features/nodes/util/graph/types.ts index 03af86f64e..0a3c97483f 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/types.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/types.ts @@ -30,16 +30,11 @@ export type MainModelLoaderNodes = export type VaeSourceNodes = 'seamless' | 'vae_loader'; -export type GraphBuilderArg = - | { - generationMode: Extract; - state: RootState; - } - | { - generationMode: Exclude; - state: RootState; - canvasManager: CanvasManager; - }; +export type GraphBuilderArg = { + generationMode: GenerationMode; + state: RootState; + manager: CanvasManager | null; +}; export type GraphBuilderReturn = { g: Graph; diff --git a/invokeai/frontend/web/src/features/queue/hooks/useEnqueueCanvas.ts b/invokeai/frontend/web/src/features/queue/hooks/useEnqueueCanvas.ts index c54ab3e137..da6e3a3aec 100644 --- a/invokeai/frontend/web/src/features/queue/hooks/useEnqueueCanvas.ts +++ b/invokeai/frontend/web/src/features/queue/hooks/useEnqueueCanvas.ts @@ -49,7 +49,7 @@ const enqueueCanvas = async (store: AppStore, canvasManager: CanvasManager, prep const base = model.base; const generationMode = await canvasManager.compositor.getGenerationMode(); - const graphBuilderArg: GraphBuilderArg = { generationMode, state, canvasManager }; + const graphBuilderArg: GraphBuilderArg = { generationMode, state, manager: canvasManager }; switch (base) { case 'sdxl': diff --git a/invokeai/frontend/web/src/features/queue/hooks/useEnqueueGenerate.ts b/invokeai/frontend/web/src/features/queue/hooks/useEnqueueGenerate.ts index ab6172c828..7b419f769c 100644 --- a/invokeai/frontend/web/src/features/queue/hooks/useEnqueueGenerate.ts +++ b/invokeai/frontend/web/src/features/queue/hooks/useEnqueueGenerate.ts @@ -47,7 +47,7 @@ const enqueueGenerate = async (store: AppStore, prepend: boolean) => { assert(model, 'No model found in state'); const base = model.base; - const graphBuilderArg: GraphBuilderArg = { generationMode: 'txt2img', state }; + const graphBuilderArg: GraphBuilderArg = { generationMode: 'txt2img', state, manager: null }; switch (base) { case 'sdxl':