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 7c6b0fa76d..e6a4791587 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 @@ -9,7 +9,7 @@ import { getGlobalReferenceImageWarnings } from 'features/controlLayers/store/va import { type ImageField, zModelIdentifierField } from 'features/nodes/types/common'; import { getGenerationMode } from 'features/nodes/util/graph/generation/getGenerationMode'; import { Graph } from 'features/nodes/util/graph/generation/Graph'; -import { CANVAS_OUTPUT_PREFIX, selectPresetModifiedPrompts } from 'features/nodes/util/graph/graphBuilderUtils'; +import { selectCanvasOutputFields, selectPresetModifiedPrompts } from 'features/nodes/util/graph/graphBuilderUtils'; import { type GraphBuilderReturn, UnsupportedGenerationModeError } from 'features/nodes/util/graph/types'; import { t } from 'i18next'; import type { Equals } from 'tsafe'; @@ -64,14 +64,11 @@ export const buildChatGPT4oGraph = async ( const gptImage = g.addNode({ // @ts-expect-error: These nodes are not available in the OSS application type: 'chatgpt_4o_generate_image', - id: getPrefixedId(CANVAS_OUTPUT_PREFIX), model: zModelIdentifierField.parse(model), positive_prompt: positivePrompt, aspect_ratio: bbox.aspectRatio.id, reference_images, - use_cache: false, - is_intermediate: true, - board: undefined, + ...selectCanvasOutputFields(state), }); g.upsertMetadata({ positive_prompt: positivePrompt, @@ -96,15 +93,12 @@ export const buildChatGPT4oGraph = async ( const gptImage = g.addNode({ // @ts-expect-error: These nodes are not available in the OSS application type: 'chatgpt_4o_edit_image', - id: getPrefixedId(CANVAS_OUTPUT_PREFIX), model: zModelIdentifierField.parse(model), positive_prompt: positivePrompt, aspect_ratio: bbox.aspectRatio.id, base_image: { image_name }, reference_images, - use_cache: false, - is_intermediate: true, - board: undefined, + ...selectCanvasOutputFields(state), }); g.upsertMetadata({ positive_prompt: positivePrompt, diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildCogView4Graph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildCogView4Graph.ts index 7b94605d9f..4e369bc3bf 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildCogView4Graph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildCogView4Graph.ts @@ -14,8 +14,8 @@ import { addWatermarker } from 'features/nodes/util/graph/generation/addWatermar import { getGenerationMode } from 'features/nodes/util/graph/generation/getGenerationMode'; import { Graph } from 'features/nodes/util/graph/generation/Graph'; import { - CANVAS_OUTPUT_PREFIX, getSizes, + selectCanvasOutputFields, selectPresetModifiedPrompts, } from 'features/nodes/util/graph/graphBuilderUtils'; import type { GraphBuilderReturn, ImageOutputNodes } from 'features/nodes/util/graph/types'; @@ -175,12 +175,7 @@ export const buildCogView4Graph = async ( g.upsertMetadata(selectCanvasMetadata(state)); - g.updateNode(canvasOutput, { - id: getPrefixedId(CANVAS_OUTPUT_PREFIX), - is_intermediate: true, - use_cache: false, - board: undefined, - }); + g.updateNode(canvasOutput, selectCanvasOutputFields(state)); g.setMetadataReceivingNode(canvasOutput); return { diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts index e024f852ed..2bbfe1d37e 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts @@ -17,8 +17,8 @@ import { addWatermarker } from 'features/nodes/util/graph/generation/addWatermar import { getGenerationMode } from 'features/nodes/util/graph/generation/getGenerationMode'; import { Graph } from 'features/nodes/util/graph/generation/Graph'; import { - CANVAS_OUTPUT_PREFIX, getSizes, + selectCanvasOutputFields, selectPresetModifiedPrompts, } from 'features/nodes/util/graph/graphBuilderUtils'; import { @@ -334,12 +334,7 @@ export const buildFLUXGraph = async (state: RootState, manager?: CanvasManager | g.upsertMetadata(selectCanvasMetadata(state)); - g.updateNode(canvasOutput, { - id: getPrefixedId(CANVAS_OUTPUT_PREFIX), - is_intermediate: true, - use_cache: false, - board: undefined, - }); + g.updateNode(canvasOutput, selectCanvasOutputFields(state)); g.setMetadataReceivingNode(canvasOutput); return { 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 ce1ecac591..b200d6b915 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 @@ -8,7 +8,7 @@ import { isImagenAspectRatioID } from 'features/controlLayers/store/types'; import { zModelIdentifierField } from 'features/nodes/types/common'; import { getGenerationMode } from 'features/nodes/util/graph/generation/getGenerationMode'; import { Graph } from 'features/nodes/util/graph/generation/Graph'; -import { CANVAS_OUTPUT_PREFIX, selectPresetModifiedPrompts } from 'features/nodes/util/graph/graphBuilderUtils'; +import { selectCanvasOutputFields, selectPresetModifiedPrompts } from 'features/nodes/util/graph/graphBuilderUtils'; import { type GraphBuilderReturn, UnsupportedGenerationModeError } from 'features/nodes/util/graph/types'; import { t } from 'i18next'; import type { Equals } from 'tsafe'; @@ -44,16 +44,13 @@ export const buildImagen3Graph = async ( const imagen3 = g.addNode({ // @ts-expect-error: These nodes are not available in the OSS application type: 'google_imagen3_generate_image', - id: getPrefixedId(CANVAS_OUTPUT_PREFIX), model: zModelIdentifierField.parse(model), positive_prompt: positivePrompt, negative_prompt: negativePrompt, aspect_ratio: bbox.aspectRatio.id, - enhance_prompt: true, // When enhance_prompt is true, Imagen3 will return a new image every time, ignoring the seed. - use_cache: false, - is_intermediate: true, - board: undefined, + enhance_prompt: true, + ...selectCanvasOutputFields(state), }); g.upsertMetadata({ positive_prompt: positivePrompt, 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 ee499da7f8..5138041c9e 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 @@ -8,7 +8,7 @@ import { isImagenAspectRatioID } from 'features/controlLayers/store/types'; import { zModelIdentifierField } from 'features/nodes/types/common'; import { getGenerationMode } from 'features/nodes/util/graph/generation/getGenerationMode'; import { Graph } from 'features/nodes/util/graph/generation/Graph'; -import { CANVAS_OUTPUT_PREFIX, selectPresetModifiedPrompts } from 'features/nodes/util/graph/graphBuilderUtils'; +import { selectCanvasOutputFields, selectPresetModifiedPrompts } from 'features/nodes/util/graph/graphBuilderUtils'; import { type GraphBuilderReturn, UnsupportedGenerationModeError } from 'features/nodes/util/graph/types'; import { t } from 'i18next'; import type { Equals } from 'tsafe'; @@ -44,16 +44,13 @@ export const buildImagen4Graph = async ( const imagen4 = g.addNode({ // @ts-expect-error: These nodes are not available in the OSS application type: 'google_imagen4_generate_image', - id: getPrefixedId(CANVAS_OUTPUT_PREFIX), model: zModelIdentifierField.parse(model), positive_prompt: positivePrompt, negative_prompt: negativePrompt, aspect_ratio: bbox.aspectRatio.id, - enhance_prompt: true, // When enhance_prompt is true, Imagen4 will return a new image every time, ignoring the seed. - use_cache: false, - is_intermediate: true, - board: undefined, + enhance_prompt: true, + ...selectCanvasOutputFields(state), }); g.upsertMetadata({ positive_prompt: positivePrompt, 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 fa1a85778c..0bf32670b4 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 @@ -18,8 +18,8 @@ import { addWatermarker } from 'features/nodes/util/graph/generation/addWatermar import { getGenerationMode } from 'features/nodes/util/graph/generation/getGenerationMode'; import { Graph } from 'features/nodes/util/graph/generation/Graph'; import { - CANVAS_OUTPUT_PREFIX, getSizes, + selectCanvasOutputFields, selectPresetModifiedPrompts, } from 'features/nodes/util/graph/graphBuilderUtils'; import type { GraphBuilderReturn, ImageOutputNodes } from 'features/nodes/util/graph/types'; @@ -306,12 +306,7 @@ export const buildSD1Graph = async (state: RootState, manager?: CanvasManager | g.upsertMetadata(selectCanvasMetadata(state)); - g.updateNode(canvasOutput, { - id: getPrefixedId(CANVAS_OUTPUT_PREFIX), - is_intermediate: true, - use_cache: false, - board: undefined, - }); + g.updateNode(canvasOutput, selectCanvasOutputFields(state)); g.setMetadataReceivingNode(canvasOutput); return { diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSD3Graph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSD3Graph.ts index f6ba0fae60..3230d7132c 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSD3Graph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSD3Graph.ts @@ -13,8 +13,8 @@ import { addWatermarker } from 'features/nodes/util/graph/generation/addWatermar import { getGenerationMode } from 'features/nodes/util/graph/generation/getGenerationMode'; import { Graph } from 'features/nodes/util/graph/generation/Graph'; import { - CANVAS_OUTPUT_PREFIX, getSizes, + selectCanvasOutputFields, selectPresetModifiedPrompts, } from 'features/nodes/util/graph/graphBuilderUtils'; import type { GraphBuilderReturn, ImageOutputNodes } from 'features/nodes/util/graph/types'; @@ -196,12 +196,7 @@ export const buildSD3Graph = async (state: RootState, manager?: CanvasManager | g.upsertMetadata(selectCanvasMetadata(state)); - g.updateNode(canvasOutput, { - id: getPrefixedId(CANVAS_OUTPUT_PREFIX), - is_intermediate: true, - use_cache: false, - board: undefined, - }); + g.updateNode(canvasOutput, selectCanvasOutputFields(state)); g.setMetadataReceivingNode(canvasOutput); return { diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSDXLGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSDXLGraph.ts index 9aaf3960c7..1960b6ab8b 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSDXLGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSDXLGraph.ts @@ -18,8 +18,8 @@ import { addWatermarker } from 'features/nodes/util/graph/generation/addWatermar import { getGenerationMode } from 'features/nodes/util/graph/generation/getGenerationMode'; import { Graph } from 'features/nodes/util/graph/generation/Graph'; import { - CANVAS_OUTPUT_PREFIX, getSizes, + selectCanvasOutputFields, selectPresetModifiedPrompts, } from 'features/nodes/util/graph/graphBuilderUtils'; import type { GraphBuilderReturn, ImageOutputNodes } from 'features/nodes/util/graph/types'; @@ -312,12 +312,7 @@ export const buildSDXLGraph = async (state: RootState, manager?: CanvasManager | g.upsertMetadata(selectCanvasMetadata(state)); - g.updateNode(canvasOutput, { - id: getPrefixedId(CANVAS_OUTPUT_PREFIX), - is_intermediate: true, - use_cache: false, - board: undefined, - }); + g.updateNode(canvasOutput, selectCanvasOutputFields(state)); g.setMetadataReceivingNode(canvasOutput); return { diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/graphBuilderUtils.ts b/invokeai/frontend/web/src/features/nodes/util/graph/graphBuilderUtils.ts index 1163c462ad..dcce4be8b2 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/graphBuilderUtils.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/graphBuilderUtils.ts @@ -1,5 +1,7 @@ import { createSelector } from '@reduxjs/toolkit'; import type { RootState } from 'app/store/store'; +import { getPrefixedId } from 'features/controlLayers/konva/util'; +import { selectCanvasSessionType } from 'features/controlLayers/store/canvasStagingAreaSlice'; import { selectParamsSlice } from 'features/controlLayers/store/paramsSlice'; import type { CanvasState, ParamsState } from 'features/controlLayers/store/types'; import type { BoardField } from 'features/nodes/types/common'; @@ -24,6 +26,28 @@ export const getBoardField = (state: RootState): BoardField | undefined => { return { board_id: autoAddBoardId }; }; +/** + * Builds the common fields for canvas output: + * - id + * - use_cache + * - is_intermediate + * - board + */ +export const selectCanvasOutputFields = (state: RootState) => { + // Advanced session means working on canvas - images are not saved to gallery or added to a board. + // Simple session means working in YOLO mode - images are saved to gallery & board. + const sessionType = selectCanvasSessionType(state); + const is_intermediate = sessionType === 'advanced'; + const board = sessionType === 'advanced' ? undefined : getBoardField(state); + + return { + is_intermediate, + board, + use_cache: false, + id: getPrefixedId(CANVAS_OUTPUT_PREFIX), + }; +}; + /** * Gets the prompts, modified for the active style preset. */