From 418ad0de38e6ba03ca79c22f20302d9b6063597c Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Thu, 26 Jun 2025 20:06:26 +1000 Subject: [PATCH] fix(ui): rebase conflicts --- .../src/features/controlLayers/store/types.ts | 2 +- .../graph/generation/buildFluxKontextGraph.ts | 45 +++++++++---------- 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/invokeai/frontend/web/src/features/controlLayers/store/types.ts b/invokeai/frontend/web/src/features/controlLayers/store/types.ts index 8566808b6a..abb22cb4ea 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/types.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/types.ts @@ -321,7 +321,7 @@ export const isChatGPT4oReferenceImageConfig = ( config: RefImageState['config'] ): config is ChatGPT4oReferenceImageConfig => config.type === 'chatgpt_4o_reference_image'; export const isFluxKontextReferenceImageConfig = ( - config: CanvasReferenceImageState['ipAdapter'] + config: RefImageState['config'] ): config is FluxKontextReferenceImageConfig => config.type === 'flux_kontext_reference_image'; const zFillStyle = z.enum(['solid', 'grid', 'crosshatch', 'diagonal', 'horizontal', 'vertical']); diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFluxKontextGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFluxKontextGraph.ts index a1da6df12b..70ea82b346 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFluxKontextGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFluxKontextGraph.ts @@ -2,31 +2,34 @@ import { logger } from 'app/logging/logger'; import type { RootState } from 'app/store/store'; import type { CanvasManager } from 'features/controlLayers/konva/CanvasManager'; import { getPrefixedId } from 'features/controlLayers/konva/util'; -import { selectCanvasSettingsSlice } from 'features/controlLayers/store/canvasSettingsSlice'; +import { selectMainModelConfig } from 'features/controlLayers/store/paramsSlice'; +import { selectRefImagesSlice } from 'features/controlLayers/store/refImagesSlice'; import { selectCanvasSlice } from 'features/controlLayers/store/selectors'; import { isFluxKontextReferenceImageConfig } from 'features/controlLayers/store/types'; import { getGlobalReferenceImageWarnings } from 'features/controlLayers/store/validators'; import type { ImageField } from 'features/nodes/types/common'; import { zModelIdentifierField } from 'features/nodes/types/common'; import { Graph } from 'features/nodes/util/graph/generation/Graph'; -import { - CANVAS_OUTPUT_PREFIX, - getBoardField, - 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 { selectActiveTab } from 'features/ui/store/uiSelectors'; import { t } from 'i18next'; -import { selectMainModelConfig } from 'services/api/endpoints/models'; import type { Equals } from 'tsafe'; import { assert } from 'tsafe'; +import { getGenerationMode } from './getGenerationMode'; + const log = logger('system'); -export const buildFluxKontextGraph = async (state: RootState, manager: CanvasManager): Promise => { - const generationMode = await manager.compositor.getGenerationMode(); +export const buildFluxKontextGraph = async ( + state: RootState, + manager: CanvasManager | null +): Promise => { + const tab = selectActiveTab(state); + const generationMode = await getGenerationMode(manager, tab); if (generationMode !== 'txt2img') { - throw new UnsupportedGenerationModeError(t('toast.fluxKontextIncompatibleGenerationMode')); + throw new UnsupportedGenerationModeError(t('toast.imagenIncompatibleGenerationMode', { model: 'FLUX Kontext' })); } log.debug({ generationMode }, 'Building Flux Kontext graph'); @@ -34,7 +37,7 @@ export const buildFluxKontextGraph = async (state: RootState, manager: CanvasMan const model = selectMainModelConfig(state); const canvas = selectCanvasSlice(state); - const canvasSettings = selectCanvasSettingsSlice(state); + const refImages = selectRefImagesSlice(state); const { bbox } = canvas; const { positivePrompt } = selectPresetModifiedPrompts(state); @@ -42,22 +45,19 @@ export const buildFluxKontextGraph = async (state: RootState, manager: CanvasMan assert(model, 'No model found in state'); assert(model.base === 'flux-kontext', 'Model is not a Flux Kontext model'); - const is_intermediate = canvasSettings.sendToCanvas; - const board = canvasSettings.sendToCanvas ? undefined : getBoardField(state); - - const validRefImages = canvas.referenceImages.entities - .filter((entity) => entity.isEnabled) - .filter((entity) => isFluxKontextReferenceImageConfig(entity.ipAdapter)) - .filter((entity) => getGlobalReferenceImageWarnings(entity, model).length === 0); + const validRefImages = refImages.entities + .filter((entity) => isFluxKontextReferenceImageConfig(entity.config)) + .filter((entity) => getGlobalReferenceImageWarnings(entity, model).length === 0) + .toReversed(); // sends them in order they are displayed in the list let input_image: ImageField | undefined = undefined; if (validRefImages[0]) { assert(validRefImages.length === 1, 'Flux Kontext can have at most one reference image'); - assert(validRefImages[0].ipAdapter.image, 'Image is required for reference image'); + assert(validRefImages[0].config.image, 'Image is required for reference image'); input_image = { - image_name: validRefImages[0].ipAdapter.image.image_name, + image_name: validRefImages[0].config.image.image_name, }; } @@ -66,15 +66,12 @@ export const buildFluxKontextGraph = async (state: RootState, manager: CanvasMan const fluxKontextImage = g.addNode({ // @ts-expect-error: These nodes are not available in the OSS application type: input_image ? 'flux_kontext_edit_image' : 'flux_kontext_generate_image', - id: getPrefixedId(CANVAS_OUTPUT_PREFIX), model: zModelIdentifierField.parse(model), positive_prompt: positivePrompt, aspect_ratio: bbox.aspectRatio.id, - use_cache: false, - is_intermediate, - board, input_image, prompt_upsampling: true, + ...selectCanvasOutputFields(state), }); g.upsertMetadata({ positive_prompt: positivePrompt,