diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/appConfigReceived.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/appConfigReceived.ts index 68148a192f..ef81377f99 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/appConfigReceived.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/appConfigReceived.ts @@ -1,4 +1,8 @@ import { setInfillMethod } from 'features/parameters/store/generationSlice'; +import { + shouldUseNSFWCheckerChanged, + shouldUseWatermarkerChanged, +} from 'features/system/store/systemSlice'; import { appInfoApi } from 'services/api/endpoints/appInfo'; import { startAppListening } from '..'; @@ -6,12 +10,21 @@ export const addAppConfigReceivedListener = () => { startAppListening({ matcher: appInfoApi.endpoints.getAppConfig.matchFulfilled, effect: async (action, { getState, dispatch }) => { - const { infill_methods } = action.payload; + const { infill_methods, nsfw_methods, watermarking_methods } = + action.payload; const infillMethod = getState().generation.infillMethod; if (!infill_methods.includes(infillMethod)) { dispatch(setInfillMethod(infill_methods[0])); } + + if (!nsfw_methods.includes('nsfw_checker')) { + dispatch(shouldUseNSFWCheckerChanged(false)); + } + + if (!watermarking_methods.includes('invisible_watermark')) { + dispatch(shouldUseWatermarkerChanged(false)); + } }, }); }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketConnected.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketConnected.ts index ec310eac4c..32a6cce203 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketConnected.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketConnected.ts @@ -1,13 +1,10 @@ import { logger } from 'app/logging/logger'; +import { LIST_TAG } from 'services/api'; +import { appInfoApi } from 'services/api/endpoints/appInfo'; import { modelsApi } from 'services/api/endpoints/models'; import { receivedOpenAPISchema } from 'services/api/thunks/schema'; import { appSocketConnected, socketConnected } from 'services/events/actions'; import { startAppListening } from '../..'; -import { - ALL_BASE_MODELS, - NON_REFINER_BASE_MODELS, - REFINER_BASE_MODELS, -} from 'services/api/constants'; export const addSocketConnectedEventListener = () => { startAppListening({ @@ -29,15 +26,18 @@ export const addSocketConnectedEventListener = () => { dispatch(appSocketConnected(action.payload)); // update all server state - dispatch(modelsApi.endpoints.getMainModels.initiate(REFINER_BASE_MODELS)); dispatch( - modelsApi.endpoints.getMainModels.initiate(NON_REFINER_BASE_MODELS) + modelsApi.util.invalidateTags([ + { type: 'MainModel', id: LIST_TAG }, + { type: 'SDXLRefinerModel', id: LIST_TAG }, + { type: 'LoRAModel', id: LIST_TAG }, + { type: 'ControlNetModel', id: LIST_TAG }, + { type: 'VaeModel', id: LIST_TAG }, + { type: 'TextualInversionModel', id: LIST_TAG }, + { type: 'ScannedModels', id: LIST_TAG }, + ]) ); - dispatch(modelsApi.endpoints.getMainModels.initiate(ALL_BASE_MODELS)); - dispatch(modelsApi.endpoints.getControlNetModels.initiate()); - dispatch(modelsApi.endpoints.getLoRAModels.initiate()); - dispatch(modelsApi.endpoints.getTextualInversionModels.initiate()); - dispatch(modelsApi.endpoints.getVaeModels.initiate()); + dispatch(appInfoApi.util.invalidateTags(['AppConfig', 'AppVersion'])); }, }); }; diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addNSFWCheckerToGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addNSFWCheckerToGraph.ts new file mode 100644 index 0000000000..35e7f3ac38 --- /dev/null +++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addNSFWCheckerToGraph.ts @@ -0,0 +1,70 @@ +import { RootState } from 'app/store/store'; +import { NonNullableGraph } from 'features/nodes/types/types'; +import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; +import { + ImageNSFWBlurInvocation, + LatentsToImageInvocation, + MetadataAccumulatorInvocation, +} from 'services/api/types'; +import { + LATENTS_TO_IMAGE, + METADATA_ACCUMULATOR, + NSFW_CHECKER, +} from './constants'; + +export const addNSFWCheckerToGraph = ( + state: RootState, + graph: NonNullableGraph, + nodeIdToAddTo = LATENTS_TO_IMAGE +): void => { + const activeTabName = activeTabNameSelector(state); + + const is_intermediate = + activeTabName === 'unifiedCanvas' ? !state.canvas.shouldAutoSave : false; + + const nodeToAddTo = graph.nodes[nodeIdToAddTo] as + | LatentsToImageInvocation + | undefined; + + const metadataAccumulator = graph.nodes[METADATA_ACCUMULATOR] as + | MetadataAccumulatorInvocation + | undefined; + + if (!nodeToAddTo) { + // something has gone terribly awry + return; + } + + nodeToAddTo.is_intermediate = true; + + const nsfwCheckerNode: ImageNSFWBlurInvocation = { + id: NSFW_CHECKER, + type: 'img_nsfw', + is_intermediate, + }; + + graph.nodes[NSFW_CHECKER] = nsfwCheckerNode; + graph.edges.push({ + source: { + node_id: nodeIdToAddTo, + field: 'image', + }, + destination: { + node_id: NSFW_CHECKER, + field: 'image', + }, + }); + + if (metadataAccumulator) { + graph.edges.push({ + source: { + node_id: METADATA_ACCUMULATOR, + field: 'metadata', + }, + destination: { + node_id: NSFW_CHECKER, + field: 'metadata', + }, + }); + } +}; diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addWatermarkerToGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addWatermarkerToGraph.ts new file mode 100644 index 0000000000..f2e8a0aeca --- /dev/null +++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addWatermarkerToGraph.ts @@ -0,0 +1,95 @@ +import { RootState } from 'app/store/store'; +import { NonNullableGraph } from 'features/nodes/types/types'; +import { activeTabNameSelector } from 'features/ui/store/uiSelectors'; +import { + ImageNSFWBlurInvocation, + ImageWatermarkInvocation, + LatentsToImageInvocation, + MetadataAccumulatorInvocation, +} from 'services/api/types'; +import { + LATENTS_TO_IMAGE, + METADATA_ACCUMULATOR, + NSFW_CHECKER, + WATERMARKER, +} from './constants'; + +export const addWatermarkerToGraph = ( + state: RootState, + graph: NonNullableGraph, + nodeIdToAddTo = LATENTS_TO_IMAGE +): void => { + const activeTabName = activeTabNameSelector(state); + + const is_intermediate = + activeTabName === 'unifiedCanvas' ? !state.canvas.shouldAutoSave : false; + + const nodeToAddTo = graph.nodes[nodeIdToAddTo] as + | LatentsToImageInvocation + | undefined; + + const nsfwCheckerNode = graph.nodes[NSFW_CHECKER] as + | ImageNSFWBlurInvocation + | undefined; + + const metadataAccumulator = graph.nodes[METADATA_ACCUMULATOR] as + | MetadataAccumulatorInvocation + | undefined; + + if (!nodeToAddTo) { + // something has gone terribly awry + return; + } + + const watermarkerNode: ImageWatermarkInvocation = { + id: WATERMARKER, + type: 'img_watermark', + is_intermediate, + }; + + graph.nodes[WATERMARKER] = watermarkerNode; + + // no matter the situation, we want the l2i node to be intermediate + nodeToAddTo.is_intermediate = true; + + if (nsfwCheckerNode) { + // if we are using NSFW checker, we need to "disable" it output by marking it intermediate, + // then connect it to the watermark node + nsfwCheckerNode.is_intermediate = true; + graph.edges.push({ + source: { + node_id: NSFW_CHECKER, + field: 'image', + }, + destination: { + node_id: WATERMARKER, + field: 'image', + }, + }); + } else { + // otherwise we just connect to the watermark node + graph.edges.push({ + source: { + node_id: nodeIdToAddTo, + field: 'image', + }, + destination: { + node_id: WATERMARKER, + field: 'image', + }, + }); + } + + if (metadataAccumulator) { + graph.edges.push({ + source: { + node_id: METADATA_ACCUMULATOR, + field: 'metadata', + }, + destination: { + node_id: WATERMARKER, + field: 'metadata', + }, + }); + } +}; diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasImageToImageGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasImageToImageGraph.ts index 7920d2638a..81e99e0dd0 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasImageToImageGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasImageToImageGraph.ts @@ -10,7 +10,9 @@ import { import { addControlNetToLinearGraph } from './addControlNetToLinearGraph'; import { addDynamicPromptsToGraph } from './addDynamicPromptsToGraph'; import { addLoRAsToGraph } from './addLoRAsToGraph'; +import { addNSFWCheckerToGraph } from './addNSFWCheckerToGraph'; import { addVAEToGraph } from './addVAEToGraph'; +import { addWatermarkerToGraph } from './addWatermarkerToGraph'; import { CLIP_SKIP, IMAGE_TO_IMAGE_GRAPH, @@ -23,8 +25,6 @@ import { NOISE, POSITIVE_CONDITIONING, RESIZE, - NSFW_CHECKER, - WATERMARKER, } from './constants'; /** @@ -105,11 +105,6 @@ export const buildCanvasImageToImageGraph = ( is_intermediate: true, skipped_layers: clipSkip, }, - [LATENTS_TO_IMAGE]: { - type: 'l2i', - id: LATENTS_TO_IMAGE, - is_intermediate: true, - }, [LATENTS_TO_LATENTS]: { type: 'l2l', id: LATENTS_TO_LATENTS, @@ -128,15 +123,10 @@ export const buildCanvasImageToImageGraph = ( // image_name: initialImage.image_name, // }, }, - [NSFW_CHECKER]: { - type: 'img_nsfw', - id: NSFW_CHECKER, - is_intermediate: true, - }, - [WATERMARKER]: { + [LATENTS_TO_IMAGE]: { + type: 'l2i', + id: LATENTS_TO_IMAGE, is_intermediate: !shouldAutoSave, - type: 'img_watermark', - id: WATERMARKER, }, }, edges: [ @@ -180,26 +170,6 @@ export const buildCanvasImageToImageGraph = ( field: 'latents', }, }, - { - source: { - node_id: LATENTS_TO_IMAGE, - field: 'image', - }, - destination: { - node_id: NSFW_CHECKER, - field: 'image', - }, - }, - { - source: { - node_id: NSFW_CHECKER, - field: 'image', - }, - destination: { - node_id: WATERMARKER, - field: 'image', - }, - }, { source: { node_id: IMAGE_TO_LATENTS, @@ -342,17 +312,6 @@ export const buildCanvasImageToImageGraph = ( init_image: initialImage.image_name, }; - graph.edges.push({ - source: { - node_id: METADATA_ACCUMULATOR, - field: 'metadata', - }, - destination: { - node_id: WATERMARKER, - field: 'metadata', - }, - }); - // add LoRA support addLoRAsToGraph(state, graph, LATENTS_TO_LATENTS); @@ -365,5 +324,16 @@ export const buildCanvasImageToImageGraph = ( // add controlnet, mutating `graph` addControlNetToLinearGraph(state, graph, LATENTS_TO_LATENTS); + // NSFW & watermark - must be last thing added to graph + if (state.system.shouldUseNSFWChecker) { + // must add before watermarker! + addNSFWCheckerToGraph(state, graph); + } + + if (state.system.shouldUseWatermarker) { + // must add after nsfw checker! + addWatermarkerToGraph(state, graph); + } + return graph; }; diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasInpaintGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasInpaintGraph.ts index fa6e20aaa4..4154c1b5eb 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasInpaintGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasInpaintGraph.ts @@ -20,6 +20,8 @@ import { RANDOM_INT, RANGE_OF_SIZE, } from './constants'; +import { addNSFWCheckerToGraph } from './addNSFWCheckerToGraph'; +import { addWatermarkerToGraph } from './addWatermarkerToGraph'; /** * Builds the Canvas tab's Inpaint graph. @@ -249,5 +251,16 @@ export const buildCanvasInpaintGraph = ( (graph.nodes[RANGE_OF_SIZE] as RangeOfSizeInvocation).start = seed; } + // NSFW & watermark - must be last thing added to graph + if (state.system.shouldUseNSFWChecker) { + // must add before watermarker! + addNSFWCheckerToGraph(state, graph, INPAINT); + } + + if (state.system.shouldUseWatermarker) { + // must add after nsfw checker! + addWatermarkerToGraph(state, graph, INPAINT); + } + return graph; }; diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasTextToImageGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasTextToImageGraph.ts index 88e2f5e70b..597a643367 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasTextToImageGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasTextToImageGraph.ts @@ -5,7 +5,9 @@ import { initialGenerationState } from 'features/parameters/store/generationSlic import { addControlNetToLinearGraph } from './addControlNetToLinearGraph'; import { addDynamicPromptsToGraph } from './addDynamicPromptsToGraph'; import { addLoRAsToGraph } from './addLoRAsToGraph'; +import { addNSFWCheckerToGraph } from './addNSFWCheckerToGraph'; import { addVAEToGraph } from './addVAEToGraph'; +import { addWatermarkerToGraph } from './addWatermarkerToGraph'; import { CLIP_SKIP, LATENTS_TO_IMAGE, @@ -16,8 +18,6 @@ import { POSITIVE_CONDITIONING, TEXT_TO_IMAGE_GRAPH, TEXT_TO_LATENTS, - NSFW_CHECKER, - WATERMARKER, } from './constants'; /** @@ -109,16 +109,6 @@ export const buildCanvasTextToImageGraph = ( [LATENTS_TO_IMAGE]: { type: 'l2i', id: LATENTS_TO_IMAGE, - is_intermediate: true, - }, - [NSFW_CHECKER]: { - type: 'img_nsfw', - id: NSFW_CHECKER, - is_intermediate: true, - }, - [WATERMARKER]: { - type: 'img_watermark', - id: WATERMARKER, is_intermediate: !shouldAutoSave, }, }, @@ -193,26 +183,6 @@ export const buildCanvasTextToImageGraph = ( field: 'latents', }, }, - { - source: { - node_id: LATENTS_TO_IMAGE, - field: 'image', - }, - destination: { - node_id: NSFW_CHECKER, - field: 'image', - }, - }, - { - source: { - node_id: NSFW_CHECKER, - field: 'image', - }, - destination: { - node_id: WATERMARKER, - field: 'image', - }, - }, { source: { node_id: NOISE, @@ -247,17 +217,6 @@ export const buildCanvasTextToImageGraph = ( clip_skip: clipSkip, }; - graph.edges.push({ - source: { - node_id: METADATA_ACCUMULATOR, - field: 'metadata', - }, - destination: { - node_id: WATERMARKER, - field: 'metadata', - }, - }); - // add LoRA support addLoRAsToGraph(state, graph, TEXT_TO_LATENTS); @@ -270,5 +229,16 @@ export const buildCanvasTextToImageGraph = ( // add controlnet, mutating `graph` addControlNetToLinearGraph(state, graph, TEXT_TO_LATENTS); + // NSFW & watermark - must be last thing added to graph + if (state.system.shouldUseNSFWChecker) { + // must add before watermarker! + addNSFWCheckerToGraph(state, graph); + } + + if (state.system.shouldUseWatermarker) { + // must add after nsfw checker! + addWatermarkerToGraph(state, graph); + } + return graph; }; diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearImageToImageGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearImageToImageGraph.ts index c8df39a4d8..d78e2e1356 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearImageToImageGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearImageToImageGraph.ts @@ -9,7 +9,9 @@ import { import { addControlNetToLinearGraph } from './addControlNetToLinearGraph'; import { addDynamicPromptsToGraph } from './addDynamicPromptsToGraph'; import { addLoRAsToGraph } from './addLoRAsToGraph'; +import { addNSFWCheckerToGraph } from './addNSFWCheckerToGraph'; import { addVAEToGraph } from './addVAEToGraph'; +import { addWatermarkerToGraph } from './addWatermarkerToGraph'; import { CLIP_SKIP, IMAGE_TO_IMAGE_GRAPH, @@ -22,8 +24,6 @@ import { NOISE, POSITIVE_CONDITIONING, RESIZE, - NSFW_CHECKER, - WATERMARKER, } from './constants'; /** @@ -187,26 +187,6 @@ export const buildLinearImageToImageGraph = ( field: 'latents', }, }, - { - source: { - node_id: LATENTS_TO_IMAGE, - field: 'image', - }, - destination: { - node_id: NSFW_CHECKER, - field: 'image', - }, - }, - { - source: { - node_id: NSFW_CHECKER, - field: 'image', - }, - destination: { - node_id: WATERMARKER, - field: 'image', - }, - }, { source: { node_id: IMAGE_TO_LATENTS, @@ -319,42 +299,6 @@ export const buildLinearImageToImageGraph = ( }); } - // TODO: add batch functionality - // if (isBatchEnabled && asInitialImage && batchImageNames.length > 0) { - // // we are going to connect an iterate up to the init image - // delete (graph.nodes[IMAGE_TO_LATENTS] as ImageToLatentsInvocation).image; - - // const imageCollection: ImageCollectionInvocation = { - // id: IMAGE_COLLECTION, - // type: 'image_collection', - // images: batchImageNames.map((image_name) => ({ image_name })), - // }; - - // const imageCollectionIterate: IterateInvocation = { - // id: IMAGE_COLLECTION_ITERATE, - // type: 'iterate', - // }; - - // graph.nodes[IMAGE_COLLECTION] = imageCollection; - // graph.nodes[IMAGE_COLLECTION_ITERATE] = imageCollectionIterate; - - // graph.edges.push({ - // source: { node_id: IMAGE_COLLECTION, field: 'collection' }, - // destination: { - // node_id: IMAGE_COLLECTION_ITERATE, - // field: 'collection', - // }, - // }); - - // graph.edges.push({ - // source: { node_id: IMAGE_COLLECTION_ITERATE, field: 'item' }, - // destination: { - // node_id: IMAGE_TO_LATENTS, - // field: 'image', - // }, - // }); - // } - // add metadata accumulator, which is only mostly populated - some fields are added later graph.nodes[METADATA_ACCUMULATOR] = { id: METADATA_ACCUMULATOR, @@ -378,17 +322,6 @@ export const buildLinearImageToImageGraph = ( init_image: initialImage.imageName, }; - graph.edges.push({ - source: { - node_id: METADATA_ACCUMULATOR, - field: 'metadata', - }, - destination: { - node_id: WATERMARKER, - field: 'metadata', - }, - }); - // add LoRA support addLoRAsToGraph(state, graph, LATENTS_TO_LATENTS); @@ -401,5 +334,16 @@ export const buildLinearImageToImageGraph = ( // add controlnet, mutating `graph` addControlNetToLinearGraph(state, graph, LATENTS_TO_LATENTS); + // NSFW & watermark - must be last thing added to graph + if (state.system.shouldUseNSFWChecker) { + // must add before watermarker! + addNSFWCheckerToGraph(state, graph); + } + + if (state.system.shouldUseWatermarker) { + // must add after nsfw checker! + addWatermarkerToGraph(state, graph); + } + return graph; }; diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearSDXLImageToImageGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearSDXLImageToImageGraph.ts index e80821e060..8c82002b2e 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearSDXLImageToImageGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearSDXLImageToImageGraph.ts @@ -20,6 +20,8 @@ import { SDXL_LATENTS_TO_LATENTS, SDXL_MODEL_LOADER, } from './constants'; +import { addNSFWCheckerToGraph } from './addNSFWCheckerToGraph'; +import { addWatermarkerToGraph } from './addWatermarkerToGraph'; /** * Builds the Image to Image tab graph. @@ -365,5 +367,16 @@ export const buildLinearSDXLImageToImageGraph = ( // add dynamic prompts - also sets up core iteration and seed addDynamicPromptsToGraph(state, graph); + // NSFW & watermark - must be last thing added to graph + if (state.system.shouldUseNSFWChecker) { + // must add before watermarker! + addNSFWCheckerToGraph(state, graph); + } + + if (state.system.shouldUseWatermarker) { + // must add after nsfw checker! + addWatermarkerToGraph(state, graph); + } + return graph; }; diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearSDXLTextToImageGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearSDXLTextToImageGraph.ts index 8efcbf8876..36f35a90de 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearSDXLTextToImageGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearSDXLTextToImageGraph.ts @@ -14,6 +14,8 @@ import { SDXL_TEXT_TO_IMAGE_GRAPH, SDXL_TEXT_TO_LATENTS, } from './constants'; +import { addNSFWCheckerToGraph } from './addNSFWCheckerToGraph'; +import { addWatermarkerToGraph } from './addWatermarkerToGraph'; export const buildLinearSDXLTextToImageGraph = ( state: RootState @@ -247,5 +249,16 @@ export const buildLinearSDXLTextToImageGraph = ( // add dynamic prompts - also sets up core iteration and seed addDynamicPromptsToGraph(state, graph); + // NSFW & watermark - must be last thing added to graph + if (state.system.shouldUseNSFWChecker) { + // must add before watermarker! + addNSFWCheckerToGraph(state, graph); + } + + if (state.system.shouldUseWatermarker) { + // must add after nsfw checker! + addWatermarkerToGraph(state, graph); + } + return graph; }; diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearTextToImageGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearTextToImageGraph.ts index cfcb1a98c7..94f35feba0 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearTextToImageGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearTextToImageGraph.ts @@ -5,7 +5,9 @@ import { initialGenerationState } from 'features/parameters/store/generationSlic import { addControlNetToLinearGraph } from './addControlNetToLinearGraph'; import { addDynamicPromptsToGraph } from './addDynamicPromptsToGraph'; import { addLoRAsToGraph } from './addLoRAsToGraph'; +import { addNSFWCheckerToGraph } from './addNSFWCheckerToGraph'; import { addVAEToGraph } from './addVAEToGraph'; +import { addWatermarkerToGraph } from './addWatermarkerToGraph'; import { CLIP_SKIP, LATENTS_TO_IMAGE, @@ -16,8 +18,6 @@ import { POSITIVE_CONDITIONING, TEXT_TO_IMAGE_GRAPH, TEXT_TO_LATENTS, - NSFW_CHECKER, - WATERMARKER, } from './constants'; export const buildLinearTextToImageGraph = ( @@ -182,26 +182,6 @@ export const buildLinearTextToImageGraph = ( field: 'noise', }, }, - { - source: { - node_id: LATENTS_TO_IMAGE, - field: 'image', - }, - destination: { - node_id: NSFW_CHECKER, - field: 'image', - }, - }, - { - source: { - node_id: NSFW_CHECKER, - field: 'image', - }, - destination: { - node_id: WATERMARKER, - field: 'image', - }, - }, ], }; @@ -226,17 +206,6 @@ export const buildLinearTextToImageGraph = ( clip_skip: clipSkip, }; - graph.edges.push({ - source: { - node_id: METADATA_ACCUMULATOR, - field: 'metadata', - }, - destination: { - node_id: WATERMARKER, - field: 'metadata', - }, - }); - // add LoRA support addLoRAsToGraph(state, graph, TEXT_TO_LATENTS); @@ -249,5 +218,16 @@ export const buildLinearTextToImageGraph = ( // add controlnet, mutating `graph` addControlNetToLinearGraph(state, graph, TEXT_TO_LATENTS); + // NSFW & watermark - must be last thing added to graph + if (state.system.shouldUseNSFWChecker) { + // must add before watermarker! + addNSFWCheckerToGraph(state, graph); + } + + if (state.system.shouldUseWatermarker) { + // must add after nsfw checker! + addWatermarkerToGraph(state, graph); + } + return graph; }; diff --git a/invokeai/frontend/web/src/features/system/components/SettingsModal/SettingsModal.tsx b/invokeai/frontend/web/src/features/system/components/SettingsModal/SettingsModal.tsx index 2deccfa46d..49102a5bbd 100644 --- a/invokeai/frontend/web/src/features/system/components/SettingsModal/SettingsModal.tsx +++ b/invokeai/frontend/web/src/features/system/components/SettingsModal/SettingsModal.tsx @@ -26,6 +26,8 @@ import { setShouldConfirmOnDelete, shouldAntialiasProgressImageChanged, shouldLogToConsoleChanged, + shouldUseNSFWCheckerChanged, + shouldUseWatermarkerChanged, } from 'features/system/store/systemSlice'; import { setShouldShowProgressInViewer, @@ -42,6 +44,7 @@ import { } from 'react'; import { useTranslation } from 'react-i18next'; import { LogLevelName } from 'roarr'; +import { useGetAppConfigQuery } from 'services/api/endpoints/appInfo'; import SettingSwitch from './SettingSwitch'; import SettingsClearIntermediates from './SettingsClearIntermediates'; import SettingsSchedulers from './SettingsSchedulers'; @@ -57,6 +60,8 @@ const selector = createSelector( shouldLogToConsole, shouldAntialiasProgressImage, isNodesEnabled, + shouldUseNSFWChecker, + shouldUseWatermarker, } = system; const { @@ -78,6 +83,8 @@ const selector = createSelector( shouldAntialiasProgressImage, shouldShowAdvancedOptions, isNodesEnabled, + shouldUseNSFWChecker, + shouldUseWatermarker, }; }, { @@ -120,6 +127,16 @@ const SettingsModal = ({ children, config }: SettingsModalProps) => { } }, [shouldShowDeveloperSettings, dispatch]); + const { isNSFWCheckerAvailable, isWatermarkerAvailable } = + useGetAppConfigQuery(undefined, { + selectFromResult: ({ data }) => ({ + isNSFWCheckerAvailable: + data?.nsfw_methods.includes('nsfw_checker') ?? false, + isWatermarkerAvailable: + data?.watermarking_methods.includes('invisible_watermark') ?? false, + }), + }); + const { isOpen: isSettingsModalOpen, onOpen: onSettingsModalOpen, @@ -143,6 +160,8 @@ const SettingsModal = ({ children, config }: SettingsModalProps) => { shouldAntialiasProgressImage, shouldShowAdvancedOptions, isNodesEnabled, + shouldUseNSFWChecker, + shouldUseWatermarker, } = useAppSelector(selector); const handleClickResetWebUI = useCallback(() => { @@ -221,6 +240,22 @@ const SettingsModal = ({ children, config }: SettingsModalProps) => { {t('settings.generation')} + ) => + dispatch(shouldUseNSFWCheckerChanged(e.target.checked)) + } + /> + ) => + dispatch(shouldUseWatermarkerChanged(e.target.checked)) + } + /> diff --git a/invokeai/frontend/web/src/features/system/store/systemSlice.ts b/invokeai/frontend/web/src/features/system/store/systemSlice.ts index b7a5e606e2..7189058632 100644 --- a/invokeai/frontend/web/src/features/system/store/systemSlice.ts +++ b/invokeai/frontend/web/src/features/system/store/systemSlice.ts @@ -87,6 +87,8 @@ export interface SystemState { language: keyof typeof LANGUAGES; isUploading: boolean; isNodesEnabled: boolean; + shouldUseNSFWChecker: boolean; + shouldUseWatermarker: boolean; } export const initialSystemState: SystemState = { @@ -119,6 +121,8 @@ export const initialSystemState: SystemState = { language: 'en', isUploading: false, isNodesEnabled: false, + shouldUseNSFWChecker: true, + shouldUseWatermarker: true, }; export const systemSlice = createSlice({ @@ -194,6 +198,12 @@ export const systemSlice = createSlice({ setIsNodesEnabled(state, action: PayloadAction) { state.isNodesEnabled = action.payload; }, + shouldUseNSFWCheckerChanged(state, action: PayloadAction) { + state.shouldUseNSFWChecker = action.payload; + }, + shouldUseWatermarkerChanged(state, action: PayloadAction) { + state.shouldUseWatermarker = action.payload; + }, }, extraReducers(builder) { /** @@ -409,6 +419,8 @@ export const { languageChanged, progressImageSet, setIsNodesEnabled, + shouldUseNSFWCheckerChanged, + shouldUseWatermarkerChanged, } = systemSlice.actions; export default systemSlice.reducer; diff --git a/invokeai/frontend/web/src/services/api/endpoints/appInfo.ts b/invokeai/frontend/web/src/services/api/endpoints/appInfo.ts index f76b56761c..2d3537998d 100644 --- a/invokeai/frontend/web/src/services/api/endpoints/appInfo.ts +++ b/invokeai/frontend/web/src/services/api/endpoints/appInfo.ts @@ -8,6 +8,7 @@ export const appInfoApi = api.injectEndpoints({ url: `app/version`, method: 'GET', }), + providesTags: ['AppVersion'], keepUnusedDataFor: 86400000, // 1 day }), getAppConfig: build.query({ @@ -15,6 +16,7 @@ export const appInfoApi = api.injectEndpoints({ url: `app/config`, method: 'GET', }), + providesTags: ['AppConfig'], keepUnusedDataFor: 86400000, // 1 day }), }), diff --git a/invokeai/frontend/web/src/services/api/schema.d.ts b/invokeai/frontend/web/src/services/api/schema.d.ts index 56952f2766..c8e87ef8c5 100644 --- a/invokeai/frontend/web/src/services/api/schema.d.ts +++ b/invokeai/frontend/web/src/services/api/schema.d.ts @@ -318,6 +318,21 @@ export type components = { * @description List of available infill methods */ infill_methods: (string)[]; + /** + * Upscaling Methods + * @description List of upscaling methods + */ + upscaling_methods: (components["schemas"]["Upscaler"])[]; + /** + * Nsfw Methods + * @description List of NSFW checking methods + */ + nsfw_methods: (string)[]; + /** + * Watermarking Methods + * @description List of invisible watermark methods + */ + watermarking_methods: (string)[]; }; /** * AppVersion @@ -1345,7 +1360,7 @@ export type components = { * @description The nodes in this graph */ nodes?: { - [key: string]: (components["schemas"]["ControlNetInvocation"] | components["schemas"]["ImageProcessorInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["LoraLoaderInvocation"] | components["schemas"]["VaeLoaderInvocation"] | components["schemas"]["MetadataAccumulatorInvocation"] | components["schemas"]["LoadImageInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRawPromptInvocation"] | components["schemas"]["SDXLRefinerRawPromptInvocation"] | components["schemas"]["ClipSkipInvocation"] | components["schemas"]["TextToLatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["InpaintInvocation"] | components["schemas"]["AddInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["ParamIntInvocation"] | components["schemas"]["ParamFloatInvocation"] | components["schemas"]["ParamStringInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SDXLTextToLatentsInvocation"] | components["schemas"]["SDXLLatentsToLatentsInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["StepParamEasingInvocation"] | components["schemas"]["GraphInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CannyImageProcessorInvocation"] | components["schemas"]["HedImageProcessorInvocation"] | components["schemas"]["LineartImageProcessorInvocation"] | components["schemas"]["LineartAnimeImageProcessorInvocation"] | components["schemas"]["OpenposeImageProcessorInvocation"] | components["schemas"]["MidasDepthImageProcessorInvocation"] | components["schemas"]["NormalbaeImageProcessorInvocation"] | components["schemas"]["MlsdImageProcessorInvocation"] | components["schemas"]["PidiImageProcessorInvocation"] | components["schemas"]["ContentShuffleImageProcessorInvocation"] | components["schemas"]["ZoeDepthImageProcessorInvocation"] | components["schemas"]["MediapipeFaceProcessorInvocation"] | components["schemas"]["LeresImageProcessorInvocation"] | components["schemas"]["TileResamplerProcessorInvocation"] | components["schemas"]["SegmentAnythingProcessorInvocation"] | components["schemas"]["LatentsToLatentsInvocation"]) | undefined; + [key: string]: (components["schemas"]["ControlNetInvocation"] | components["schemas"]["ImageProcessorInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["LoraLoaderInvocation"] | components["schemas"]["VaeLoaderInvocation"] | components["schemas"]["MetadataAccumulatorInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRawPromptInvocation"] | components["schemas"]["SDXLRefinerRawPromptInvocation"] | components["schemas"]["ClipSkipInvocation"] | components["schemas"]["LoadImageInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["TextToLatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SDXLTextToLatentsInvocation"] | components["schemas"]["SDXLLatentsToLatentsInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["AddInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["ParamIntInvocation"] | components["schemas"]["ParamFloatInvocation"] | components["schemas"]["ParamStringInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["StepParamEasingInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["InpaintInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["GraphInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CannyImageProcessorInvocation"] | components["schemas"]["HedImageProcessorInvocation"] | components["schemas"]["LineartImageProcessorInvocation"] | components["schemas"]["LineartAnimeImageProcessorInvocation"] | components["schemas"]["OpenposeImageProcessorInvocation"] | components["schemas"]["MidasDepthImageProcessorInvocation"] | components["schemas"]["NormalbaeImageProcessorInvocation"] | components["schemas"]["MlsdImageProcessorInvocation"] | components["schemas"]["PidiImageProcessorInvocation"] | components["schemas"]["ContentShuffleImageProcessorInvocation"] | components["schemas"]["ZoeDepthImageProcessorInvocation"] | components["schemas"]["MediapipeFaceProcessorInvocation"] | components["schemas"]["LeresImageProcessorInvocation"] | components["schemas"]["TileResamplerProcessorInvocation"] | components["schemas"]["SegmentAnythingProcessorInvocation"] | components["schemas"]["LatentsToLatentsInvocation"]) | undefined; }; /** * Edges @@ -1388,7 +1403,7 @@ export type components = { * @description The results of node executions */ results: { - [key: string]: (components["schemas"]["ImageOutput"] | components["schemas"]["MaskOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["LoraLoaderOutput"] | components["schemas"]["VaeLoaderOutput"] | components["schemas"]["MetadataAccumulatorOutput"] | components["schemas"]["CompelOutput"] | components["schemas"]["ClipSkipInvocationOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["IntOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["StringOutput"] | components["schemas"]["IntCollectionOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["PromptOutput"] | components["schemas"]["PromptCollectionOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["SDXLModelLoaderOutput"] | components["schemas"]["SDXLRefinerModelLoaderOutput"] | components["schemas"]["GraphInvocationOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["CollectInvocationOutput"]) | undefined; + [key: string]: (components["schemas"]["ImageOutput"] | components["schemas"]["MaskOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["LoraLoaderOutput"] | components["schemas"]["VaeLoaderOutput"] | components["schemas"]["MetadataAccumulatorOutput"] | components["schemas"]["CompelOutput"] | components["schemas"]["ClipSkipInvocationOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["SDXLModelLoaderOutput"] | components["schemas"]["SDXLRefinerModelLoaderOutput"] | components["schemas"]["PromptOutput"] | components["schemas"]["PromptCollectionOutput"] | components["schemas"]["IntOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["StringOutput"] | components["schemas"]["IntCollectionOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["GraphInvocationOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["CollectInvocationOutput"]) | undefined; }; /** * Errors @@ -1962,22 +1977,11 @@ export type components = { * @description The image to check */ image?: components["schemas"]["ImageField"]; - /** - * Enabled - * @description Whether the NSFW checker is enabled - * @default false - */ - enabled?: boolean; /** * Metadata * @description Optional core metadata to be written to the image */ metadata?: components["schemas"]["CoreMetadata"]; - /** - * Default Enabled - * @default false - */ - DEFAULT_ENABLED?: boolean; }; /** * ImageOutput @@ -2292,22 +2296,11 @@ export type components = { * @default InvokeAI */ text?: string; - /** - * Enabled - * @description Whether the invisible watermark is enabled - * @default true - */ - enabled?: boolean; /** * Metadata * @description Optional core metadata to be written to the image */ metadata?: components["schemas"]["CoreMetadata"]; - /** - * Default Enabled - * @default true - */ - DEFAULT_ENABLED?: boolean; }; /** * InfillColorInvocation @@ -5403,6 +5396,19 @@ export type components = { */ loras: (components["schemas"]["LoraInfo"])[]; }; + /** Upscaler */ + Upscaler: { + /** + * Upscaling Method + * @description Name of upscaling method + */ + upscaling_method: string; + /** + * Upscaling Models + * @description List of upscaling models for this method + */ + upscaling_models: (string)[]; + }; /** * VAEModelField * @description Vae model field @@ -5529,6 +5535,12 @@ export type components = { */ image?: components["schemas"]["ImageField"]; }; + /** + * StableDiffusion1ModelFormat + * @description An enumeration. + * @enum {string} + */ + StableDiffusion1ModelFormat: "checkpoint" | "diffusers"; /** * StableDiffusion2ModelFormat * @description An enumeration. @@ -5541,12 +5553,6 @@ export type components = { * @enum {string} */ StableDiffusionXLModelFormat: "checkpoint" | "diffusers"; - /** - * StableDiffusion1ModelFormat - * @description An enumeration. - * @enum {string} - */ - StableDiffusion1ModelFormat: "checkpoint" | "diffusers"; }; responses: never; parameters: never; @@ -5657,7 +5663,7 @@ export type operations = { }; requestBody: { content: { - "application/json": components["schemas"]["ControlNetInvocation"] | components["schemas"]["ImageProcessorInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["LoraLoaderInvocation"] | components["schemas"]["VaeLoaderInvocation"] | components["schemas"]["MetadataAccumulatorInvocation"] | components["schemas"]["LoadImageInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRawPromptInvocation"] | components["schemas"]["SDXLRefinerRawPromptInvocation"] | components["schemas"]["ClipSkipInvocation"] | components["schemas"]["TextToLatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["InpaintInvocation"] | components["schemas"]["AddInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["ParamIntInvocation"] | components["schemas"]["ParamFloatInvocation"] | components["schemas"]["ParamStringInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SDXLTextToLatentsInvocation"] | components["schemas"]["SDXLLatentsToLatentsInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["StepParamEasingInvocation"] | components["schemas"]["GraphInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CannyImageProcessorInvocation"] | components["schemas"]["HedImageProcessorInvocation"] | components["schemas"]["LineartImageProcessorInvocation"] | components["schemas"]["LineartAnimeImageProcessorInvocation"] | components["schemas"]["OpenposeImageProcessorInvocation"] | components["schemas"]["MidasDepthImageProcessorInvocation"] | components["schemas"]["NormalbaeImageProcessorInvocation"] | components["schemas"]["MlsdImageProcessorInvocation"] | components["schemas"]["PidiImageProcessorInvocation"] | components["schemas"]["ContentShuffleImageProcessorInvocation"] | components["schemas"]["ZoeDepthImageProcessorInvocation"] | components["schemas"]["MediapipeFaceProcessorInvocation"] | components["schemas"]["LeresImageProcessorInvocation"] | components["schemas"]["TileResamplerProcessorInvocation"] | components["schemas"]["SegmentAnythingProcessorInvocation"] | components["schemas"]["LatentsToLatentsInvocation"]; + "application/json": components["schemas"]["ControlNetInvocation"] | components["schemas"]["ImageProcessorInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["LoraLoaderInvocation"] | components["schemas"]["VaeLoaderInvocation"] | components["schemas"]["MetadataAccumulatorInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRawPromptInvocation"] | components["schemas"]["SDXLRefinerRawPromptInvocation"] | components["schemas"]["ClipSkipInvocation"] | components["schemas"]["LoadImageInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["TextToLatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SDXLTextToLatentsInvocation"] | components["schemas"]["SDXLLatentsToLatentsInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["AddInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["ParamIntInvocation"] | components["schemas"]["ParamFloatInvocation"] | components["schemas"]["ParamStringInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["StepParamEasingInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["InpaintInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["GraphInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CannyImageProcessorInvocation"] | components["schemas"]["HedImageProcessorInvocation"] | components["schemas"]["LineartImageProcessorInvocation"] | components["schemas"]["LineartAnimeImageProcessorInvocation"] | components["schemas"]["OpenposeImageProcessorInvocation"] | components["schemas"]["MidasDepthImageProcessorInvocation"] | components["schemas"]["NormalbaeImageProcessorInvocation"] | components["schemas"]["MlsdImageProcessorInvocation"] | components["schemas"]["PidiImageProcessorInvocation"] | components["schemas"]["ContentShuffleImageProcessorInvocation"] | components["schemas"]["ZoeDepthImageProcessorInvocation"] | components["schemas"]["MediapipeFaceProcessorInvocation"] | components["schemas"]["LeresImageProcessorInvocation"] | components["schemas"]["TileResamplerProcessorInvocation"] | components["schemas"]["SegmentAnythingProcessorInvocation"] | components["schemas"]["LatentsToLatentsInvocation"]; }; }; responses: { @@ -5694,7 +5700,7 @@ export type operations = { }; requestBody: { content: { - "application/json": components["schemas"]["ControlNetInvocation"] | components["schemas"]["ImageProcessorInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["LoraLoaderInvocation"] | components["schemas"]["VaeLoaderInvocation"] | components["schemas"]["MetadataAccumulatorInvocation"] | components["schemas"]["LoadImageInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRawPromptInvocation"] | components["schemas"]["SDXLRefinerRawPromptInvocation"] | components["schemas"]["ClipSkipInvocation"] | components["schemas"]["TextToLatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["InpaintInvocation"] | components["schemas"]["AddInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["ParamIntInvocation"] | components["schemas"]["ParamFloatInvocation"] | components["schemas"]["ParamStringInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SDXLTextToLatentsInvocation"] | components["schemas"]["SDXLLatentsToLatentsInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["StepParamEasingInvocation"] | components["schemas"]["GraphInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CannyImageProcessorInvocation"] | components["schemas"]["HedImageProcessorInvocation"] | components["schemas"]["LineartImageProcessorInvocation"] | components["schemas"]["LineartAnimeImageProcessorInvocation"] | components["schemas"]["OpenposeImageProcessorInvocation"] | components["schemas"]["MidasDepthImageProcessorInvocation"] | components["schemas"]["NormalbaeImageProcessorInvocation"] | components["schemas"]["MlsdImageProcessorInvocation"] | components["schemas"]["PidiImageProcessorInvocation"] | components["schemas"]["ContentShuffleImageProcessorInvocation"] | components["schemas"]["ZoeDepthImageProcessorInvocation"] | components["schemas"]["MediapipeFaceProcessorInvocation"] | components["schemas"]["LeresImageProcessorInvocation"] | components["schemas"]["TileResamplerProcessorInvocation"] | components["schemas"]["SegmentAnythingProcessorInvocation"] | components["schemas"]["LatentsToLatentsInvocation"]; + "application/json": components["schemas"]["ControlNetInvocation"] | components["schemas"]["ImageProcessorInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["LoraLoaderInvocation"] | components["schemas"]["VaeLoaderInvocation"] | components["schemas"]["MetadataAccumulatorInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRawPromptInvocation"] | components["schemas"]["SDXLRefinerRawPromptInvocation"] | components["schemas"]["ClipSkipInvocation"] | components["schemas"]["LoadImageInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["TextToLatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SDXLTextToLatentsInvocation"] | components["schemas"]["SDXLLatentsToLatentsInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["AddInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["ParamIntInvocation"] | components["schemas"]["ParamFloatInvocation"] | components["schemas"]["ParamStringInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["StepParamEasingInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["InpaintInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["GraphInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CannyImageProcessorInvocation"] | components["schemas"]["HedImageProcessorInvocation"] | components["schemas"]["LineartImageProcessorInvocation"] | components["schemas"]["LineartAnimeImageProcessorInvocation"] | components["schemas"]["OpenposeImageProcessorInvocation"] | components["schemas"]["MidasDepthImageProcessorInvocation"] | components["schemas"]["NormalbaeImageProcessorInvocation"] | components["schemas"]["MlsdImageProcessorInvocation"] | components["schemas"]["PidiImageProcessorInvocation"] | components["schemas"]["ContentShuffleImageProcessorInvocation"] | components["schemas"]["ZoeDepthImageProcessorInvocation"] | components["schemas"]["MediapipeFaceProcessorInvocation"] | components["schemas"]["LeresImageProcessorInvocation"] | components["schemas"]["TileResamplerProcessorInvocation"] | components["schemas"]["SegmentAnythingProcessorInvocation"] | components["schemas"]["LatentsToLatentsInvocation"]; }; }; responses: { diff --git a/invokeai/frontend/web/src/services/api/types.d.ts b/invokeai/frontend/web/src/services/api/types.d.ts index 3e945691f1..7d9040321c 100644 --- a/invokeai/frontend/web/src/services/api/types.d.ts +++ b/invokeai/frontend/web/src/services/api/types.d.ts @@ -134,6 +134,12 @@ export type ESRGANInvocation = TypeReq< export type DivideInvocation = TypeReq< components['schemas']['DivideInvocation'] >; +export type ImageNSFWBlurInvocation = TypeReq< + components['schemas']['ImageNSFWBlurInvocation'] +>; +export type ImageWatermarkInvocation = TypeReq< + components['schemas']['ImageWatermarkInvocation'] +>; // ControlNet Nodes export type ControlNetInvocation = TypeReq<