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<