diff --git a/invokeai/app/invocations/metadata.py b/invokeai/app/invocations/metadata.py
index 39fa3beba0..ac3310736b 100644
--- a/invokeai/app/invocations/metadata.py
+++ b/invokeai/app/invocations/metadata.py
@@ -45,6 +45,9 @@ class CoreMetadata(BaseModelExcludeNull):
clip_skip: int = Field(
description="The number of skipped CLIP layers",
)
+ clip2_skip: int = Field(
+ description="The number of skipped CLIP2 layers",
+ )
model: MainModelField = Field(description="The main model used for inference")
controlnets: list[ControlField] = Field(description="The ControlNets used for inference")
loras: list[LoRAMetadataField] = Field(description="The LoRAs used for inference")
@@ -119,6 +122,9 @@ class MetadataAccumulatorInvocation(BaseInvocation):
clip_skip: int = InputField(
description="The number of skipped CLIP layers",
)
+ clip2_skip: int = InputField(
+ description="The number of skipped CLIP2 layers",
+ )
model: MainModelField = InputField(description="The main model used for inference")
controlnets: list[ControlField] = InputField(description="The ControlNets used for inference")
loras: list[LoRAMetadataField] = InputField(description="The LoRAs used for inference")
diff --git a/invokeai/frontend/web/public/locales/en.json b/invokeai/frontend/web/public/locales/en.json
index c309e4de50..c971e55ca9 100644
--- a/invokeai/frontend/web/public/locales/en.json
+++ b/invokeai/frontend/web/public/locales/en.json
@@ -885,7 +885,9 @@
},
"cfgScale": "CFG Scale",
"clipSkip": "CLIP Skip",
+ "clip2Skip": "CLIP2 Skip",
"clipSkipWithLayerCount": "CLIP Skip {{layerCount}}",
+ "clip12SkipWithLayerCount": "CLIP Skip {{clipLayerCount}}/{{clip2LayerCount}}",
"closeViewer": "Close Viewer",
"codeformerFidelity": "Fidelity",
"coherenceMode": "Mode",
diff --git a/invokeai/frontend/web/src/features/nodes/types/types.ts b/invokeai/frontend/web/src/features/nodes/types/types.ts
index 2a3e5a762b..5f5f8f83cf 100644
--- a/invokeai/frontend/web/src/features/nodes/types/types.ts
+++ b/invokeai/frontend/web/src/features/nodes/types/types.ts
@@ -1133,6 +1133,7 @@ export const zCoreMetadata = z
steps: z.number().int().nullish().catch(null),
scheduler: z.string().nullish().catch(null),
clip_skip: z.number().int().nullish().catch(null),
+ clip2_skip: z.number().int().nullish().catch(null),
model: z
.union([zMainModel.deepPartial(), zOnnxModel.deepPartial()])
.nullish()
diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLImageToImageGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLImageToImageGraph.ts
index 36fc66e559..9e2155d3bc 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLImageToImageGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLImageToImageGraph.ts
@@ -13,6 +13,8 @@ import { addVAEToGraph } from './addVAEToGraph';
import { addWatermarkerToGraph } from './addWatermarkerToGraph';
import {
CANVAS_OUTPUT,
+ CLIP2_SKIP,
+ CLIP_SKIP,
IMAGE_TO_LATENTS,
IMG2IMG_RESIZE,
LATENTS_TO_IMAGE,
@@ -41,11 +43,12 @@ export const buildCanvasSDXLImageToImageGraph = (
negativePrompt,
model,
cfgScale: cfg_scale,
+ clipSkip,
+ clip2Skip,
scheduler,
seed,
steps,
vaePrecision,
- clipSkip,
shouldUseCpuNoise,
seamlessXAxis,
seamlessYAxis,
@@ -100,6 +103,18 @@ export const buildCanvasSDXLImageToImageGraph = (
id: modelLoaderNodeId,
model,
},
+ [CLIP_SKIP]: {
+ type: 'clip_skip',
+ id: CLIP_SKIP,
+ skipped_layers: clipSkip,
+ is_intermediate,
+ },
+ [CLIP2_SKIP]: {
+ type: 'clip_skip',
+ id: CLIP2_SKIP,
+ skipped_layers: clip2Skip,
+ is_intermediate,
+ },
[POSITIVE_CONDITIONING]: {
type: 'sdxl_compel_prompt',
id: POSITIVE_CONDITIONING,
@@ -162,7 +177,7 @@ export const buildCanvasSDXLImageToImageGraph = (
field: 'clip',
},
destination: {
- node_id: POSITIVE_CONDITIONING,
+ node_id: CLIP_SKIP,
field: 'clip',
},
},
@@ -171,6 +186,26 @@ export const buildCanvasSDXLImageToImageGraph = (
node_id: modelLoaderNodeId,
field: 'clip2',
},
+ destination: {
+ node_id: CLIP2_SKIP,
+ field: 'clip',
+ },
+ },
+ {
+ source: {
+ node_id: CLIP_SKIP,
+ field: 'clip',
+ },
+ destination: {
+ node_id: POSITIVE_CONDITIONING,
+ field: 'clip',
+ },
+ },
+ {
+ source: {
+ node_id: CLIP2_SKIP,
+ field: 'clip',
+ },
destination: {
node_id: POSITIVE_CONDITIONING,
field: 'clip2',
@@ -178,7 +213,7 @@ export const buildCanvasSDXLImageToImageGraph = (
},
{
source: {
- node_id: modelLoaderNodeId,
+ node_id: CLIP_SKIP,
field: 'clip',
},
destination: {
@@ -188,8 +223,8 @@ export const buildCanvasSDXLImageToImageGraph = (
},
{
source: {
- node_id: modelLoaderNodeId,
- field: 'clip2',
+ node_id: CLIP2_SKIP,
+ field: 'clip',
},
destination: {
node_id: NEGATIVE_CONDITIONING,
@@ -340,6 +375,7 @@ export const buildCanvasSDXLImageToImageGraph = (
controlnets: [], // populated in addControlNetToLinearGraph
loras: [], // populated in addLoRAsToGraph
clip_skip: clipSkip,
+ clip2_skip: clip2Skip,
strength,
init_image: initialImage.image_name,
};
diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLInpaintGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLInpaintGraph.ts
index 389d510ac7..d02a6d8d83 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLInpaintGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLInpaintGraph.ts
@@ -25,6 +25,8 @@ import {
CANVAS_COHERENCE_NOISE,
CANVAS_COHERENCE_NOISE_INCREMENT,
CANVAS_OUTPUT,
+ CLIP2_SKIP,
+ CLIP_SKIP,
INPAINT_CREATE_MASK,
INPAINT_IMAGE,
INPAINT_IMAGE_RESIZE_DOWN,
@@ -58,6 +60,8 @@ export const buildCanvasSDXLInpaintGraph = (
negativePrompt,
model,
cfgScale: cfg_scale,
+ clipSkip,
+ clip2Skip,
scheduler,
steps,
seed,
@@ -111,6 +115,18 @@ export const buildCanvasSDXLInpaintGraph = (
id: modelLoaderNodeId,
model,
},
+ [CLIP_SKIP]: {
+ type: 'clip_skip',
+ id: CLIP_SKIP,
+ skipped_layers: clipSkip,
+ is_intermediate,
+ },
+ [CLIP2_SKIP]: {
+ type: 'clip_skip',
+ id: CLIP2_SKIP,
+ skipped_layers: clip2Skip,
+ is_intermediate,
+ },
[POSITIVE_CONDITIONING]: {
type: 'sdxl_compel_prompt',
id: POSITIVE_CONDITIONING,
@@ -215,7 +231,7 @@ export const buildCanvasSDXLInpaintGraph = (
field: 'clip',
},
destination: {
- node_id: POSITIVE_CONDITIONING,
+ node_id: CLIP_SKIP,
field: 'clip',
},
},
@@ -224,6 +240,26 @@ export const buildCanvasSDXLInpaintGraph = (
node_id: modelLoaderNodeId,
field: 'clip2',
},
+ destination: {
+ node_id: CLIP2_SKIP,
+ field: 'clip2',
+ },
+ },
+ {
+ source: {
+ node_id: CLIP_SKIP,
+ field: 'clip',
+ },
+ destination: {
+ node_id: POSITIVE_CONDITIONING,
+ field: 'clip',
+ },
+ },
+ {
+ source: {
+ node_id: CLIP2_SKIP,
+ field: 'clip',
+ },
destination: {
node_id: POSITIVE_CONDITIONING,
field: 'clip2',
@@ -231,7 +267,7 @@ export const buildCanvasSDXLInpaintGraph = (
},
{
source: {
- node_id: modelLoaderNodeId,
+ node_id: CLIP_SKIP,
field: 'clip',
},
destination: {
@@ -241,7 +277,7 @@ export const buildCanvasSDXLInpaintGraph = (
},
{
source: {
- node_id: modelLoaderNodeId,
+ node_id: CLIP2_SKIP,
field: 'clip2',
},
destination: {
diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLOutpaintGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLOutpaintGraph.ts
index c913492335..80c5d7d89e 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLOutpaintGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLOutpaintGraph.ts
@@ -24,6 +24,8 @@ import {
CANVAS_COHERENCE_NOISE,
CANVAS_COHERENCE_NOISE_INCREMENT,
CANVAS_OUTPUT,
+ CLIP2_SKIP,
+ CLIP_SKIP,
INPAINT_CREATE_MASK,
INPAINT_IMAGE,
INPAINT_IMAGE_RESIZE_DOWN,
@@ -60,6 +62,8 @@ export const buildCanvasSDXLOutpaintGraph = (
negativePrompt,
model,
cfgScale: cfg_scale,
+ clipSkip,
+ clip2Skip,
scheduler,
steps,
seed,
@@ -115,6 +119,18 @@ export const buildCanvasSDXLOutpaintGraph = (
id: SDXL_MODEL_LOADER,
model,
},
+ [CLIP_SKIP]: {
+ type: 'clip_skip',
+ id: CLIP_SKIP,
+ skipped_layers: clipSkip,
+ is_intermediate,
+ },
+ [CLIP2_SKIP]: {
+ type: 'clip_skip',
+ id: CLIP2_SKIP,
+ skipped_layers: clip2Skip,
+ is_intermediate,
+ },
[POSITIVE_CONDITIONING]: {
type: 'sdxl_compel_prompt',
id: POSITIVE_CONDITIONING,
@@ -223,7 +239,7 @@ export const buildCanvasSDXLOutpaintGraph = (
field: 'clip',
},
destination: {
- node_id: POSITIVE_CONDITIONING,
+ node_id: CLIP_SKIP,
field: 'clip',
},
},
@@ -232,6 +248,26 @@ export const buildCanvasSDXLOutpaintGraph = (
node_id: SDXL_MODEL_LOADER,
field: 'clip2',
},
+ destination: {
+ node_id: CLIP2_SKIP,
+ field: 'clip2',
+ },
+ },
+ {
+ source: {
+ node_id: CLIP_SKIP,
+ field: 'clip',
+ },
+ destination: {
+ node_id: POSITIVE_CONDITIONING,
+ field: 'clip',
+ },
+ },
+ {
+ source: {
+ node_id: CLIP2_SKIP,
+ field: 'clip',
+ },
destination: {
node_id: POSITIVE_CONDITIONING,
field: 'clip2',
@@ -239,7 +275,7 @@ export const buildCanvasSDXLOutpaintGraph = (
},
{
source: {
- node_id: SDXL_MODEL_LOADER,
+ node_id: CLIP_SKIP,
field: 'clip',
},
destination: {
@@ -249,7 +285,7 @@ export const buildCanvasSDXLOutpaintGraph = (
},
{
source: {
- node_id: SDXL_MODEL_LOADER,
+ node_id: CLIP2_SKIP,
field: 'clip2',
},
destination: {
diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLTextToImageGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLTextToImageGraph.ts
index 37245d7b6a..eccc22e1a3 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLTextToImageGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLTextToImageGraph.ts
@@ -16,6 +16,8 @@ import { addVAEToGraph } from './addVAEToGraph';
import { addWatermarkerToGraph } from './addWatermarkerToGraph';
import {
CANVAS_OUTPUT,
+ CLIP2_SKIP,
+ CLIP_SKIP,
LATENTS_TO_IMAGE,
METADATA_ACCUMULATOR,
NEGATIVE_CONDITIONING,
@@ -47,6 +49,7 @@ export const buildCanvasSDXLTextToImageGraph = (
steps,
vaePrecision,
clipSkip,
+ clip2Skip,
shouldUseCpuNoise,
seamlessXAxis,
seamlessYAxis,
@@ -127,6 +130,18 @@ export const buildCanvasSDXLTextToImageGraph = (
is_intermediate,
model,
},
+ [CLIP_SKIP]: {
+ type: 'clip_skip',
+ id: CLIP_SKIP,
+ skipped_layers: clipSkip,
+ is_intermediate,
+ },
+ [CLIP2_SKIP]: {
+ type: 'clip_skip',
+ id: CLIP2_SKIP,
+ skipped_layers: clip2Skip,
+ is_intermediate,
+ },
[POSITIVE_CONDITIONING]: {
type: isUsingOnnxModel ? 'prompt_onnx' : 'sdxl_compel_prompt',
id: POSITIVE_CONDITIONING,
@@ -174,7 +189,7 @@ export const buildCanvasSDXLTextToImageGraph = (
field: 'clip',
},
destination: {
- node_id: POSITIVE_CONDITIONING,
+ node_id: CLIP_SKIP,
field: 'clip',
},
},
@@ -183,6 +198,26 @@ export const buildCanvasSDXLTextToImageGraph = (
node_id: modelLoaderNodeId,
field: 'clip2',
},
+ destination: {
+ node_id: CLIP2_SKIP,
+ field: 'clip',
+ },
+ },
+ {
+ source: {
+ node_id: CLIP_SKIP,
+ field: 'clip',
+ },
+ destination: {
+ node_id: POSITIVE_CONDITIONING,
+ field: 'clip',
+ },
+ },
+ {
+ source: {
+ node_id: CLIP2_SKIP,
+ field: 'clip',
+ },
destination: {
node_id: POSITIVE_CONDITIONING,
field: 'clip2',
@@ -190,7 +225,7 @@ export const buildCanvasSDXLTextToImageGraph = (
},
{
source: {
- node_id: modelLoaderNodeId,
+ node_id: CLIP_SKIP,
field: 'clip',
},
destination: {
@@ -200,8 +235,8 @@ export const buildCanvasSDXLTextToImageGraph = (
},
{
source: {
- node_id: modelLoaderNodeId,
- field: 'clip2',
+ node_id: CLIP2_SKIP,
+ field: 'clip',
},
destination: {
node_id: NEGATIVE_CONDITIONING,
@@ -322,6 +357,7 @@ export const buildCanvasSDXLTextToImageGraph = (
controlnets: [], // populated in addControlNetToLinearGraph
loras: [], // populated in addLoRAsToGraph
clip_skip: clipSkip,
+ clip2_skip: clip2Skip,
};
graph.edges.push({
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 b10f4c5542..44416ddf3b 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearSDXLImageToImageGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearSDXLImageToImageGraph.ts
@@ -15,6 +15,8 @@ import { addSeamlessToLinearGraph } from './addSeamlessToLinearGraph';
import { addVAEToGraph } from './addVAEToGraph';
import { addWatermarkerToGraph } from './addWatermarkerToGraph';
import {
+ CLIP2_SKIP,
+ CLIP_SKIP,
IMAGE_TO_LATENTS,
LATENTS_TO_IMAGE,
METADATA_ACCUMULATOR,
@@ -50,6 +52,7 @@ export const buildLinearSDXLImageToImageGraph = (
width,
height,
clipSkip,
+ clip2Skip,
shouldUseCpuNoise,
vaePrecision,
seamlessXAxis,
@@ -105,6 +108,18 @@ export const buildLinearSDXLImageToImageGraph = (
model,
is_intermediate,
},
+ [CLIP_SKIP]: {
+ type: 'clip_skip',
+ id: CLIP_SKIP,
+ skipped_layers: clipSkip,
+ is_intermediate,
+ },
+ [CLIP2_SKIP]: {
+ type: 'clip_skip',
+ id: CLIP2_SKIP,
+ skipped_layers: clip2Skip,
+ is_intermediate,
+ },
[POSITIVE_CONDITIONING]: {
type: 'sdxl_compel_prompt',
id: POSITIVE_CONDITIONING,
@@ -173,7 +188,7 @@ export const buildLinearSDXLImageToImageGraph = (
field: 'clip',
},
destination: {
- node_id: POSITIVE_CONDITIONING,
+ node_id: CLIP_SKIP,
field: 'clip',
},
},
@@ -182,6 +197,26 @@ export const buildLinearSDXLImageToImageGraph = (
node_id: modelLoaderNodeId,
field: 'clip2',
},
+ destination: {
+ node_id: CLIP2_SKIP,
+ field: 'clip2',
+ },
+ },
+ {
+ source: {
+ node_id: CLIP_SKIP,
+ field: 'clip',
+ },
+ destination: {
+ node_id: POSITIVE_CONDITIONING,
+ field: 'clip',
+ },
+ },
+ {
+ source: {
+ node_id: CLIP2_SKIP,
+ field: 'clip',
+ },
destination: {
node_id: POSITIVE_CONDITIONING,
field: 'clip2',
@@ -189,7 +224,7 @@ export const buildLinearSDXLImageToImageGraph = (
},
{
source: {
- node_id: modelLoaderNodeId,
+ node_id: CLIP_SKIP,
field: 'clip',
},
destination: {
@@ -199,7 +234,7 @@ export const buildLinearSDXLImageToImageGraph = (
},
{
source: {
- node_id: modelLoaderNodeId,
+ node_id: CLIP2_SKIP,
field: 'clip2',
},
destination: {
@@ -350,6 +385,7 @@ export const buildLinearSDXLImageToImageGraph = (
controlnets: [],
loras: [],
clip_skip: clipSkip,
+ clip2_skip: clip2Skip,
strength: strength,
init_image: initialImage.imageName,
positive_style_prompt: positiveStylePrompt,
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 73c831081d..15382311af 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearSDXLTextToImageGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearSDXLTextToImageGraph.ts
@@ -11,6 +11,8 @@ import { addSeamlessToLinearGraph } from './addSeamlessToLinearGraph';
import { addVAEToGraph } from './addVAEToGraph';
import { addWatermarkerToGraph } from './addWatermarkerToGraph';
import {
+ CLIP2_SKIP,
+ CLIP_SKIP,
LATENTS_TO_IMAGE,
METADATA_ACCUMULATOR,
NEGATIVE_CONDITIONING,
@@ -39,6 +41,7 @@ export const buildLinearSDXLTextToImageGraph = (
width,
height,
clipSkip,
+ clip2Skip,
shouldUseCpuNoise,
vaePrecision,
seamlessXAxis,
@@ -88,6 +91,18 @@ export const buildLinearSDXLTextToImageGraph = (
model,
is_intermediate,
},
+ [CLIP_SKIP]: {
+ type: 'clip_skip',
+ id: CLIP_SKIP,
+ skipped_layers: clipSkip,
+ is_intermediate,
+ },
+ [CLIP2_SKIP]: {
+ type: 'clip_skip',
+ id: CLIP2_SKIP,
+ skipped_layers: clip2Skip,
+ is_intermediate,
+ },
[POSITIVE_CONDITIONING]: {
type: 'sdxl_compel_prompt',
id: POSITIVE_CONDITIONING,
@@ -146,7 +161,7 @@ export const buildLinearSDXLTextToImageGraph = (
field: 'clip',
},
destination: {
- node_id: POSITIVE_CONDITIONING,
+ node_id: CLIP_SKIP,
field: 'clip',
},
},
@@ -155,6 +170,26 @@ export const buildLinearSDXLTextToImageGraph = (
node_id: modelLoaderNodeId,
field: 'clip2',
},
+ destination: {
+ node_id: CLIP2_SKIP,
+ field: 'clip',
+ },
+ },
+ {
+ source: {
+ node_id: CLIP_SKIP,
+ field: 'clip',
+ },
+ destination: {
+ node_id: POSITIVE_CONDITIONING,
+ field: 'clip',
+ },
+ },
+ {
+ source: {
+ node_id: CLIP2_SKIP,
+ field: 'clip',
+ },
destination: {
node_id: POSITIVE_CONDITIONING,
field: 'clip2',
@@ -162,7 +197,7 @@ export const buildLinearSDXLTextToImageGraph = (
},
{
source: {
- node_id: modelLoaderNodeId,
+ node_id: CLIP_SKIP,
field: 'clip',
},
destination: {
@@ -172,8 +207,8 @@ export const buildLinearSDXLTextToImageGraph = (
},
{
source: {
- node_id: modelLoaderNodeId,
- field: 'clip2',
+ node_id: CLIP2_SKIP,
+ field: 'clip',
},
destination: {
node_id: NEGATIVE_CONDITIONING,
@@ -244,6 +279,7 @@ export const buildLinearSDXLTextToImageGraph = (
controlnets: [],
loras: [],
clip_skip: clipSkip,
+ clip2_skip: clipSkip,
positive_style_prompt: positiveStylePrompt,
negative_style_prompt: negativeStylePrompt,
};
diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/constants.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/constants.ts
index 32c46944c7..9c7672fec8 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/constants.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/constants.ts
@@ -15,6 +15,7 @@ export const ONNX_MODEL_LOADER = 'onnx_model_loader';
export const VAE_LOADER = 'vae_loader';
export const LORA_LOADER = 'lora_loader';
export const CLIP_SKIP = 'clip_skip';
+export const CLIP2_SKIP = 'clip2_skip';
export const IMAGE_TO_LATENTS = 'image_to_latents';
export const LATENTS_TO_LATENTS = 'latents_to_latents';
export const RESIZE = 'resize_image';
diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Advanced/ParamAdvancedCollapse.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Advanced/ParamAdvancedCollapse.tsx
index dea4bb7b3d..be9c40795a 100644
--- a/invokeai/frontend/web/src/features/parameters/components/Parameters/Advanced/ParamAdvancedCollapse.tsx
+++ b/invokeai/frontend/web/src/features/parameters/components/Parameters/Advanced/ParamAdvancedCollapse.tsx
@@ -9,21 +9,41 @@ import { useTranslation } from 'react-i18next';
import { ParamCpuNoiseToggle } from '../Noise/ParamCpuNoise';
import ParamSeamless from '../Seamless/ParamSeamless';
import ParamClipSkip from './ParamClipSkip';
+import ParamClip2Skip from './ParamClip2Skip';
const selector = createSelector(
stateSelector,
(state: RootState) => {
- const { clipSkip, seamlessXAxis, seamlessYAxis, shouldUseCpuNoise } =
- state.generation;
+ const {
+ clipSkip,
+ clip2Skip,
+ seamlessXAxis,
+ seamlessYAxis,
+ shouldUseCpuNoise,
+ model,
+ } = state.generation;
- return { clipSkip, seamlessXAxis, seamlessYAxis, shouldUseCpuNoise };
+ return {
+ clipSkip,
+ clip2Skip,
+ seamlessXAxis,
+ seamlessYAxis,
+ shouldUseCpuNoise,
+ shouldShowClip2Skip: model?.base_model === 'sdxl',
+ };
},
defaultSelectorOptions
);
export default function ParamAdvancedCollapse() {
- const { clipSkip, seamlessXAxis, seamlessYAxis, shouldUseCpuNoise } =
- useAppSelector(selector);
+ const {
+ clipSkip,
+ clip2Skip,
+ seamlessXAxis,
+ seamlessYAxis,
+ shouldUseCpuNoise,
+ shouldShowClip2Skip,
+ } = useAppSelector(selector);
const { t } = useTranslation();
const activeLabel = useMemo(() => {
const activeLabel: string[] = [];
@@ -34,7 +54,14 @@ export default function ParamAdvancedCollapse() {
activeLabel.push(t('parameters.gpuNoise'));
}
- if (clipSkip > 0) {
+ if ((clipSkip > 0 || clip2Skip > 0) && shouldShowClip2Skip) {
+ activeLabel.push(
+ t('parameters.clip12SkipWithLayerCount', {
+ clipLayerCount: clipSkip,
+ clip2LayerCount: clip2Skip,
+ })
+ );
+ } else if (clipSkip > 0) {
activeLabel.push(
t('parameters.clipSkipWithLayerCount', { layerCount: clipSkip })
);
@@ -49,7 +76,15 @@ export default function ParamAdvancedCollapse() {
}
return activeLabel.join(', ');
- }, [clipSkip, seamlessXAxis, seamlessYAxis, shouldUseCpuNoise, t]);
+ }, [
+ clip2Skip,
+ clipSkip,
+ seamlessXAxis,
+ seamlessYAxis,
+ shouldShowClip2Skip,
+ shouldUseCpuNoise,
+ t,
+ ]);
return (
@@ -58,6 +93,13 @@ export default function ParamAdvancedCollapse() {
+ {shouldShowClip2Skip && (
+ <>
+
+
+ >
+ )}
+
diff --git a/invokeai/frontend/web/src/features/parameters/components/Parameters/Advanced/ParamClip2Skip.tsx b/invokeai/frontend/web/src/features/parameters/components/Parameters/Advanced/ParamClip2Skip.tsx
new file mode 100644
index 0000000000..8644863cd1
--- /dev/null
+++ b/invokeai/frontend/web/src/features/parameters/components/Parameters/Advanced/ParamClip2Skip.tsx
@@ -0,0 +1,71 @@
+import { createSelector } from '@reduxjs/toolkit';
+import { stateSelector } from 'app/store/store';
+import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
+import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions';
+import IAIInformationalPopover from 'common/components/IAIInformationalPopover';
+import IAISlider from 'common/components/IAISlider';
+import { setClip2Skip } from 'features/parameters/store/generationSlice';
+import { clipSkipMap } from 'features/parameters/types/constants';
+import { memo, useCallback, useMemo } from 'react';
+import { useTranslation } from 'react-i18next';
+
+const selector = createSelector(
+ stateSelector,
+ ({ generation }) => {
+ const { model, clip2Skip } = generation;
+ return { model, clip2Skip };
+ },
+ defaultSelectorOptions
+);
+
+const ParamClip2Skip = () => {
+ const { model, clip2Skip } = useAppSelector(selector);
+ const dispatch = useAppDispatch();
+ const { t } = useTranslation();
+
+ const handleClipSkipChange = useCallback(
+ (v: number) => {
+ dispatch(setClip2Skip(v));
+ },
+ [dispatch]
+ );
+
+ const handleClipSkipReset = useCallback(() => {
+ dispatch(setClip2Skip(0));
+ }, [dispatch]);
+
+ const max = useMemo(() => {
+ if (!model) {
+ return clipSkipMap['sd-1'].maxClip;
+ }
+ return clipSkipMap[model.base_model].maxClip;
+ }, [model]);
+
+ const sliderMarks = useMemo(() => {
+ if (!model) {
+ return clipSkipMap['sd-1'].markers;
+ }
+ return clipSkipMap[model.base_model].markers;
+ }, [model]);
+
+ return (
+
+
+
+ );
+};
+
+export default memo(ParamClip2Skip);
diff --git a/invokeai/frontend/web/src/features/parameters/store/generationSlice.ts b/invokeai/frontend/web/src/features/parameters/store/generationSlice.ts
index ea6aaf28ca..8dee39937d 100644
--- a/invokeai/frontend/web/src/features/parameters/store/generationSlice.ts
+++ b/invokeai/frontend/web/src/features/parameters/store/generationSlice.ts
@@ -61,6 +61,7 @@ export interface GenerationState {
seamlessXAxis: boolean;
seamlessYAxis: boolean;
clipSkip: number;
+ clip2Skip: number;
shouldUseCpuNoise: boolean;
shouldShowAdvancedOptions: boolean;
aspectRatio: number | null;
@@ -102,6 +103,7 @@ export const initialGenerationState: GenerationState = {
seamlessXAxis: false,
seamlessYAxis: false,
clipSkip: 0,
+ clip2Skip: 0,
shouldUseCpuNoise: true,
shouldShowAdvancedOptions: false,
aspectRatio: null,
@@ -270,6 +272,9 @@ export const generationSlice = createSlice({
setClipSkip: (state, action: PayloadAction) => {
state.clipSkip = action.payload;
},
+ setClip2Skip: (state, action: PayloadAction) => {
+ state.clip2Skip = action.payload;
+ },
shouldUseCpuNoiseChanged: (state, action: PayloadAction) => {
state.shouldUseCpuNoise = action.payload;
},
@@ -345,6 +350,7 @@ export const {
setSeamlessXAxis,
setSeamlessYAxis,
setClipSkip,
+ setClip2Skip,
shouldUseCpuNoiseChanged,
setAspectRatio,
setShouldLockAspectRatio,
diff --git a/invokeai/frontend/web/src/services/api/schema.d.ts b/invokeai/frontend/web/src/services/api/schema.d.ts
index 26cb798594..0b5d419f2f 100644
--- a/invokeai/frontend/web/src/services/api/schema.d.ts
+++ b/invokeai/frontend/web/src/services/api/schema.d.ts
@@ -317,6 +317,13 @@ export type paths = {
*/
post: operations["set_log_level"];
};
+ "/api/v1/app/invocation_cache": {
+ /**
+ * Clear Invocation Cache
+ * @description Clears the invocation cache
+ */
+ delete: operations["clear_invocation_cache"];
+ };
"/api/v1/queue/{queue_id}/enqueue_graph": {
/**
* Enqueue Graph
@@ -2021,6 +2028,11 @@ export type components = {
* @description The number of skipped CLIP layers
*/
clip_skip: number;
+ /**
+ * Clip2 Skip
+ * @description The number of skipped CLIP2 layers
+ */
+ clip2_skip: number;
/**
* Model
* @description The main model used for inference
@@ -2309,10 +2321,7 @@ export type components = {
* @enum {string}
*/
scheduler?: "ddim" | "ddpm" | "deis" | "lms" | "lms_k" | "pndm" | "heun" | "heun_k" | "euler" | "euler_k" | "euler_a" | "kdpm_2" | "kdpm_2_a" | "dpmpp_2s" | "dpmpp_2s_k" | "dpmpp_2m" | "dpmpp_2m_k" | "dpmpp_2m_sde" | "dpmpp_2m_sde_k" | "dpmpp_sde" | "dpmpp_sde_k" | "unipc";
- /**
- * Control
- * @description ControlNet(s) to apply
- */
+ /** Control */
control?: components["schemas"]["ControlField"] | components["schemas"]["ControlField"][];
/**
* IP-Adapter
@@ -5690,6 +5699,11 @@ export type components = {
* @description The number of skipped CLIP layers
*/
clip_skip?: number;
+ /**
+ * Clip2 Skip
+ * @description The number of skipped CLIP2 layers
+ */
+ clip2_skip?: number;
/**
* Model
* @description The main model used for inference
@@ -9042,6 +9056,18 @@ export type components = {
/** Ui Order */
ui_order?: number;
};
+ /**
+ * CLIPVisionModelFormat
+ * @description An enumeration.
+ * @enum {string}
+ */
+ CLIPVisionModelFormat: "diffusers";
+ /**
+ * StableDiffusionXLModelFormat
+ * @description An enumeration.
+ * @enum {string}
+ */
+ StableDiffusionXLModelFormat: "checkpoint" | "diffusers";
/**
* IPAdapterModelFormat
* @description An enumeration.
@@ -9049,11 +9075,11 @@ export type components = {
*/
IPAdapterModelFormat: "invokeai";
/**
- * ControlNetModelFormat
+ * StableDiffusion1ModelFormat
* @description An enumeration.
* @enum {string}
*/
- ControlNetModelFormat: "checkpoint" | "diffusers";
+ StableDiffusion1ModelFormat: "checkpoint" | "diffusers";
/**
* StableDiffusionOnnxModelFormat
* @description An enumeration.
@@ -9067,23 +9093,11 @@ export type components = {
*/
StableDiffusion2ModelFormat: "checkpoint" | "diffusers";
/**
- * StableDiffusion1ModelFormat
+ * ControlNetModelFormat
* @description An enumeration.
* @enum {string}
*/
- StableDiffusion1ModelFormat: "checkpoint" | "diffusers";
- /**
- * CLIPVisionModelFormat
- * @description An enumeration.
- * @enum {string}
- */
- CLIPVisionModelFormat: "diffusers";
- /**
- * StableDiffusionXLModelFormat
- * @description An enumeration.
- * @enum {string}
- */
- StableDiffusionXLModelFormat: "checkpoint" | "diffusers";
+ ControlNetModelFormat: "checkpoint" | "diffusers";
};
responses: never;
parameters: never;
@@ -10505,6 +10519,20 @@ export type operations = {
};
};
};
+ /**
+ * Clear Invocation Cache
+ * @description Clears the invocation cache
+ */
+ clear_invocation_cache: {
+ responses: {
+ /** @description The operation was successful */
+ 200: {
+ content: {
+ "application/json": unknown;
+ };
+ };
+ };
+ };
/**
* Enqueue Graph
* @description Enqueues a graph for single execution.