diff --git a/invokeai/app/invocations/latent.py b/invokeai/app/invocations/latent.py
index a94b209ce40..80988f3c717 100644
--- a/invokeai/app/invocations/latent.py
+++ b/invokeai/app/invocations/latent.py
@@ -34,6 +34,7 @@
from invokeai.backend.model_management.models import ModelType, SilenceWarnings
from ...backend.model_management.lora import ModelPatcher
+from ...backend.model_management.seamless import set_seamless
from ...backend.model_management.models import BaseModelType
from ...backend.stable_diffusion import PipelineIntermediateState
from ...backend.stable_diffusion.diffusers_pipeline import (
@@ -456,7 +457,7 @@ def _lora_loader():
)
with ExitStack() as exit_stack, ModelPatcher.apply_lora_unet(
unet_info.context.model, _lora_loader()
- ), unet_info as unet:
+ ), set_seamless(unet_info.context.model, self.unet.seamless_axes), unet_info as unet:
latents = latents.to(device=unet.device, dtype=unet.dtype)
if noise is not None:
noise = noise.to(device=unet.device, dtype=unet.dtype)
@@ -549,7 +550,7 @@ def invoke(self, context: InvocationContext) -> ImageOutput:
context=context,
)
- with vae_info as vae:
+ with set_seamless(vae_info.context.model, self.vae.seamless_axes), vae_info as vae:
latents = latents.to(vae.device)
if self.fp32:
vae.to(dtype=torch.float32)
diff --git a/invokeai/app/invocations/model.py b/invokeai/app/invocations/model.py
index 3cae4b3383c..31d04cfd37f 100644
--- a/invokeai/app/invocations/model.py
+++ b/invokeai/app/invocations/model.py
@@ -8,8 +8,8 @@
BaseInvocation,
BaseInvocationOutput,
FieldDescriptions,
- InputField,
Input,
+ InputField,
InvocationContext,
OutputField,
UIType,
@@ -33,6 +33,7 @@ class UNetField(BaseModel):
unet: ModelInfo = Field(description="Info to load unet submodel")
scheduler: ModelInfo = Field(description="Info to load scheduler submodel")
loras: List[LoraInfo] = Field(description="Loras to apply on model loading")
+ seamless_axes: List[str] = Field(default_factory=list, description='Axes("x" and "y") to which apply seamless')
class ClipField(BaseModel):
@@ -45,6 +46,7 @@ class ClipField(BaseModel):
class VaeField(BaseModel):
# TODO: better naming?
vae: ModelInfo = Field(description="Info to load vae submodel")
+ seamless_axes: List[str] = Field(default_factory=list, description='Axes("x" and "y") to which apply seamless')
class ModelLoaderOutput(BaseInvocationOutput):
@@ -388,3 +390,50 @@ def invoke(self, context: InvocationContext) -> VaeLoaderOutput:
)
)
)
+
+
+class SeamlessModeOutput(BaseInvocationOutput):
+ """Modified Seamless Model output"""
+
+ type: Literal["seamless_output"] = "seamless_output"
+
+ # Outputs
+ unet: Optional[UNetField] = OutputField(description=FieldDescriptions.unet, title="UNet")
+ vae: Optional[VaeField] = OutputField(description=FieldDescriptions.vae, title="VAE")
+
+
+@title("Seamless")
+@tags("seamless", "model")
+class SeamlessModeInvocation(BaseInvocation):
+ """Applies the seamless transformation to the Model UNet and VAE."""
+
+ type: Literal["seamless"] = "seamless"
+
+ # Inputs
+ unet: Optional[UNetField] = InputField(
+ default=None, description=FieldDescriptions.unet, input=Input.Connection, title="UNet"
+ )
+ vae: Optional[VaeField] = InputField(
+ default=None, description=FieldDescriptions.vae_model, input=Input.Connection, title="VAE"
+ )
+ seamless_y: bool = InputField(default=True, input=Input.Any, description="Specify whether Y axis is seamless")
+ seamless_x: bool = InputField(default=True, input=Input.Any, description="Specify whether X axis is seamless")
+
+ def invoke(self, context: InvocationContext) -> SeamlessModeOutput:
+ # Conditionally append 'x' and 'y' based on seamless_x and seamless_y
+ unet = copy.deepcopy(self.unet)
+ vae = copy.deepcopy(self.vae)
+
+ seamless_axes_list = []
+
+ if self.seamless_x:
+ seamless_axes_list.append("x")
+ if self.seamless_y:
+ seamless_axes_list.append("y")
+
+ if unet is not None:
+ unet.seamless_axes = seamless_axes_list
+ if vae is not None:
+ vae.seamless_axes = seamless_axes_list
+
+ return SeamlessModeOutput(unet=unet, vae=vae)
diff --git a/invokeai/backend/image_util/seamless.py b/invokeai/backend/image_util/seamless.py
index 6fb26179010..8a2580bfcc4 100644
--- a/invokeai/backend/image_util/seamless.py
+++ b/invokeai/backend/image_util/seamless.py
@@ -20,7 +20,8 @@ def _conv_forward_asymmetric(self, input, weight, bias):
def configure_model_padding(model, seamless, seamless_axes):
"""
- Modifies the 2D convolution layers to use a circular padding mode based on the `seamless` and `seamless_axes` options.
+ Modifies the 2D convolution layers to use a circular padding mode based on
+ the `seamless` and `seamless_axes` options.
"""
# TODO: get an explicit interface for this in diffusers: https://github.com/huggingface/diffusers/issues/556
for m in model.modules():
diff --git a/invokeai/backend/model_management/seamless.py b/invokeai/backend/model_management/seamless.py
new file mode 100644
index 00000000000..997ff3563fa
--- /dev/null
+++ b/invokeai/backend/model_management/seamless.py
@@ -0,0 +1,62 @@
+from __future__ import annotations
+
+from contextlib import contextmanager
+from typing import List, Union
+
+import torch.nn as nn
+from diffusers.models import AutoencoderKL, UNet2DModel
+
+
+def _conv_forward_asymmetric(self, input, weight, bias):
+ """
+ Patch for Conv2d._conv_forward that supports asymmetric padding
+ """
+ working = nn.functional.pad(input, self.asymmetric_padding["x"], mode=self.asymmetric_padding_mode["x"])
+ working = nn.functional.pad(working, self.asymmetric_padding["y"], mode=self.asymmetric_padding_mode["y"])
+ return nn.functional.conv2d(
+ working,
+ weight,
+ bias,
+ self.stride,
+ nn.modules.utils._pair(0),
+ self.dilation,
+ self.groups,
+ )
+
+
+@contextmanager
+def set_seamless(model: Union[UNet2DModel, AutoencoderKL], seamless_axes: List[str]):
+ try:
+ to_restore = []
+
+ for m in model.modules():
+ if isinstance(m, (nn.Conv2d, nn.ConvTranspose2d)):
+ m.asymmetric_padding_mode = {}
+ m.asymmetric_padding = {}
+ m.asymmetric_padding_mode["x"] = "circular" if ("x" in seamless_axes) else "constant"
+ m.asymmetric_padding["x"] = (
+ m._reversed_padding_repeated_twice[0],
+ m._reversed_padding_repeated_twice[1],
+ 0,
+ 0,
+ )
+ m.asymmetric_padding_mode["y"] = "circular" if ("y" in seamless_axes) else "constant"
+ m.asymmetric_padding["y"] = (
+ 0,
+ 0,
+ m._reversed_padding_repeated_twice[2],
+ m._reversed_padding_repeated_twice[3],
+ )
+
+ to_restore.append((m, m._conv_forward))
+ m._conv_forward = _conv_forward_asymmetric.__get__(m, nn.Conv2d)
+
+ yield
+
+ finally:
+ for module, orig_conv_forward in to_restore:
+ module._conv_forward = orig_conv_forward
+ if hasattr(m, "asymmetric_padding_mode"):
+ del m.asymmetric_padding_mode
+ if hasattr(m, "asymmetric_padding"):
+ del m.asymmetric_padding
diff --git a/invokeai/backend/util/hotfixes.py b/invokeai/backend/util/hotfixes.py
index 3d7f278f864..3d64d8a42c8 100644
--- a/invokeai/backend/util/hotfixes.py
+++ b/invokeai/backend/util/hotfixes.py
@@ -761,3 +761,18 @@ def forward(
diffusers.ControlNetModel = ControlNetModel
diffusers.models.controlnet.ControlNetModel = ControlNetModel
+
+
+# patch LoRACompatibleConv to use original Conv2D forward function
+# this needed to make work seamless patch
+# NOTE: with this patch, torch.compile crashes on 2.0 torch(already fixed in nightly)
+# https://github.com/huggingface/diffusers/pull/4315
+# https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/lora.py#L96C18-L96C18
+def new_LoRACompatibleConv_forward(self, x):
+ if self.lora_layer is None:
+ return super(diffusers.models.lora.LoRACompatibleConv, self).forward(x)
+ else:
+ return super(diffusers.models.lora.LoRACompatibleConv, self).forward(x) + self.lora_layer(x)
+
+
+diffusers.models.lora.LoRACompatibleConv.forward = new_LoRACompatibleConv_forward
diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageGrid/GalleryImage.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageGrid/GalleryImage.tsx
index 40af91d53af..35d6cc33611 100644
--- a/invokeai/frontend/web/src/features/gallery/components/ImageGrid/GalleryImage.tsx
+++ b/invokeai/frontend/web/src/features/gallery/components/ImageGrid/GalleryImage.tsx
@@ -8,7 +8,7 @@ import {
ImageDraggableData,
TypesafeDraggableData,
} from 'features/dnd/types';
-import { useMultiselect } from 'features/gallery/hooks/useMultiselect.ts';
+import { useMultiselect } from 'features/gallery/hooks/useMultiselect';
import { MouseEvent, memo, useCallback, useMemo, useState } from 'react';
import { FaTrash } from 'react-icons/fa';
import { MdStar, MdStarBorder } from 'react-icons/md';
diff --git a/invokeai/frontend/web/src/features/gallery/hooks/useMultiselect.ts.ts b/invokeai/frontend/web/src/features/gallery/hooks/useMultiselect.ts
similarity index 100%
rename from invokeai/frontend/web/src/features/gallery/hooks/useMultiselect.ts.ts
rename to invokeai/frontend/web/src/features/gallery/hooks/useMultiselect.ts
diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addDynamicPromptsToGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addDynamicPromptsToGraph.ts
index 9c71de55168..acb091a06bb 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addDynamicPromptsToGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addDynamicPromptsToGraph.ts
@@ -63,7 +63,7 @@ export const addDynamicPromptsToGraph = (
{
source: {
node_id: DYNAMIC_PROMPT,
- field: 'prompt_collection',
+ field: 'collection',
},
destination: {
node_id: ITERATE,
diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addSDXLLoRAstoGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addSDXLLoRAstoGraph.ts
index a52264ca8ea..61562534a5b 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addSDXLLoRAstoGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addSDXLLoRAstoGraph.ts
@@ -11,9 +11,11 @@ import {
METADATA_ACCUMULATOR,
NEGATIVE_CONDITIONING,
POSITIVE_CONDITIONING,
+ REFINER_SEAMLESS,
SDXL_CANVAS_INPAINT_GRAPH,
SDXL_CANVAS_OUTPAINT_GRAPH,
SDXL_MODEL_LOADER,
+ SEAMLESS,
} from './constants';
export const addSDXLLoRAsToGraph = (
@@ -36,20 +38,25 @@ export const addSDXLLoRAsToGraph = (
| MetadataAccumulatorInvocation
| undefined;
+ // Handle Seamless Plugs
+ const unetLoaderId = modelLoaderNodeId;
+ let clipLoaderId = modelLoaderNodeId;
+ if ([SEAMLESS, REFINER_SEAMLESS].includes(modelLoaderNodeId)) {
+ clipLoaderId = SDXL_MODEL_LOADER;
+ }
+
if (loraCount > 0) {
// Remove modelLoaderNodeId unet/clip/clip2 connections to feed it to LoRAs
graph.edges = graph.edges.filter(
(e) =>
!(
- e.source.node_id === modelLoaderNodeId &&
- ['unet'].includes(e.source.field)
+ e.source.node_id === unetLoaderId && ['unet'].includes(e.source.field)
) &&
!(
- e.source.node_id === modelLoaderNodeId &&
- ['clip'].includes(e.source.field)
+ e.source.node_id === clipLoaderId && ['clip'].includes(e.source.field)
) &&
!(
- e.source.node_id === modelLoaderNodeId &&
+ e.source.node_id === clipLoaderId &&
['clip2'].includes(e.source.field)
)
);
@@ -88,7 +95,7 @@ export const addSDXLLoRAsToGraph = (
// first lora = start the lora chain, attach directly to model loader
graph.edges.push({
source: {
- node_id: modelLoaderNodeId,
+ node_id: unetLoaderId,
field: 'unet',
},
destination: {
@@ -99,7 +106,7 @@ export const addSDXLLoRAsToGraph = (
graph.edges.push({
source: {
- node_id: modelLoaderNodeId,
+ node_id: clipLoaderId,
field: 'clip',
},
destination: {
@@ -110,7 +117,7 @@ export const addSDXLLoRAsToGraph = (
graph.edges.push({
source: {
- node_id: modelLoaderNodeId,
+ node_id: clipLoaderId,
field: 'clip2',
},
destination: {
diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addSDXLRefinerToGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addSDXLRefinerToGraph.ts
index 3edea0b3c0f..9474a8df4e6 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addSDXLRefinerToGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addSDXLRefinerToGraph.ts
@@ -1,11 +1,15 @@
import { RootState } from 'app/store/store';
-import { MetadataAccumulatorInvocation } from 'services/api/types';
+import {
+ MetadataAccumulatorInvocation,
+ SeamlessModeInvocation,
+} from 'services/api/types';
import { NonNullableGraph } from '../../types/types';
import {
CANVAS_OUTPUT,
LATENTS_TO_IMAGE,
MASK_BLUR,
METADATA_ACCUMULATOR,
+ REFINER_SEAMLESS,
SDXL_CANVAS_IMAGE_TO_IMAGE_GRAPH,
SDXL_CANVAS_INPAINT_GRAPH,
SDXL_CANVAS_OUTPAINT_GRAPH,
@@ -21,7 +25,8 @@ import { craftSDXLStylePrompt } from './helpers/craftSDXLStylePrompt';
export const addSDXLRefinerToGraph = (
state: RootState,
graph: NonNullableGraph,
- baseNodeId: string
+ baseNodeId: string,
+ modelLoaderNodeId?: string
): void => {
const {
refinerModel,
@@ -33,6 +38,8 @@ export const addSDXLRefinerToGraph = (
refinerStart,
} = state.sdxl;
+ const { seamlessXAxis, seamlessYAxis } = state.generation;
+
if (!refinerModel) {
return;
}
@@ -53,6 +60,10 @@ export const addSDXLRefinerToGraph = (
metadataAccumulator.refiner_steps = refinerSteps;
}
+ const modelLoaderId = modelLoaderNodeId
+ ? modelLoaderNodeId
+ : SDXL_MODEL_LOADER;
+
// Construct Style Prompt
const { craftedPositiveStylePrompt, craftedNegativeStylePrompt } =
craftSDXLStylePrompt(state, true);
@@ -65,10 +76,7 @@ export const addSDXLRefinerToGraph = (
graph.edges = graph.edges.filter(
(e) =>
- !(
- e.source.node_id === SDXL_MODEL_LOADER &&
- ['vae'].includes(e.source.field)
- )
+ !(e.source.node_id === modelLoaderId && ['vae'].includes(e.source.field))
);
graph.nodes[SDXL_REFINER_MODEL_LOADER] = {
@@ -98,8 +106,39 @@ export const addSDXLRefinerToGraph = (
denoising_end: 1,
};
- graph.edges.push(
- {
+ // Add Seamless To Refiner
+ if (seamlessXAxis || seamlessYAxis) {
+ graph.nodes[REFINER_SEAMLESS] = {
+ id: REFINER_SEAMLESS,
+ type: 'seamless',
+ seamless_x: seamlessXAxis,
+ seamless_y: seamlessYAxis,
+ } as SeamlessModeInvocation;
+
+ graph.edges.push(
+ {
+ source: {
+ node_id: SDXL_REFINER_MODEL_LOADER,
+ field: 'unet',
+ },
+ destination: {
+ node_id: REFINER_SEAMLESS,
+ field: 'unet',
+ },
+ },
+ {
+ source: {
+ node_id: REFINER_SEAMLESS,
+ field: 'unet',
+ },
+ destination: {
+ node_id: SDXL_REFINER_DENOISE_LATENTS,
+ field: 'unet',
+ },
+ }
+ );
+ } else {
+ graph.edges.push({
source: {
node_id: SDXL_REFINER_MODEL_LOADER,
field: 'unet',
@@ -108,7 +147,10 @@ export const addSDXLRefinerToGraph = (
node_id: SDXL_REFINER_DENOISE_LATENTS,
field: 'unet',
},
- },
+ });
+ }
+
+ graph.edges.push(
{
source: {
node_id: SDXL_REFINER_MODEL_LOADER,
diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addSeamlessToLinearGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addSeamlessToLinearGraph.ts
new file mode 100644
index 00000000000..bdbaacd3843
--- /dev/null
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/addSeamlessToLinearGraph.ts
@@ -0,0 +1,109 @@
+import { RootState } from 'app/store/store';
+import { SeamlessModeInvocation } from 'services/api/types';
+import { NonNullableGraph } from '../../types/types';
+import {
+ CANVAS_COHERENCE_DENOISE_LATENTS,
+ CANVAS_INPAINT_GRAPH,
+ CANVAS_OUTPAINT_GRAPH,
+ DENOISE_LATENTS,
+ SDXL_CANVAS_IMAGE_TO_IMAGE_GRAPH,
+ SDXL_CANVAS_INPAINT_GRAPH,
+ SDXL_CANVAS_OUTPAINT_GRAPH,
+ SDXL_CANVAS_TEXT_TO_IMAGE_GRAPH,
+ SDXL_DENOISE_LATENTS,
+ SDXL_IMAGE_TO_IMAGE_GRAPH,
+ SDXL_TEXT_TO_IMAGE_GRAPH,
+ SEAMLESS,
+} from './constants';
+
+export const addSeamlessToLinearGraph = (
+ state: RootState,
+ graph: NonNullableGraph,
+ modelLoaderNodeId: string
+): void => {
+ // Remove Existing UNet Connections
+ const { seamlessXAxis, seamlessYAxis } = state.generation;
+
+ graph.nodes[SEAMLESS] = {
+ id: SEAMLESS,
+ type: 'seamless',
+ seamless_x: seamlessXAxis,
+ seamless_y: seamlessYAxis,
+ } as SeamlessModeInvocation;
+
+ let denoisingNodeId = DENOISE_LATENTS;
+
+ if (
+ graph.id === SDXL_TEXT_TO_IMAGE_GRAPH ||
+ graph.id === SDXL_IMAGE_TO_IMAGE_GRAPH ||
+ graph.id === SDXL_CANVAS_TEXT_TO_IMAGE_GRAPH ||
+ graph.id === SDXL_CANVAS_IMAGE_TO_IMAGE_GRAPH ||
+ graph.id === SDXL_CANVAS_INPAINT_GRAPH ||
+ graph.id === SDXL_CANVAS_OUTPAINT_GRAPH
+ ) {
+ denoisingNodeId = SDXL_DENOISE_LATENTS;
+ }
+
+ graph.edges = graph.edges.filter(
+ (e) =>
+ !(
+ e.source.node_id === modelLoaderNodeId &&
+ ['unet'].includes(e.source.field)
+ ) &&
+ !(
+ e.source.node_id === modelLoaderNodeId &&
+ ['vae'].includes(e.source.field)
+ )
+ );
+
+ graph.edges.push(
+ {
+ source: {
+ node_id: modelLoaderNodeId,
+ field: 'unet',
+ },
+ destination: {
+ node_id: SEAMLESS,
+ field: 'unet',
+ },
+ },
+ {
+ source: {
+ node_id: modelLoaderNodeId,
+ field: 'vae',
+ },
+ destination: {
+ node_id: SEAMLESS,
+ field: 'vae',
+ },
+ },
+ {
+ source: {
+ node_id: SEAMLESS,
+ field: 'unet',
+ },
+ destination: {
+ node_id: denoisingNodeId,
+ field: 'unet',
+ },
+ }
+ );
+
+ if (
+ graph.id == CANVAS_INPAINT_GRAPH ||
+ graph.id === CANVAS_OUTPAINT_GRAPH ||
+ graph.id === SDXL_CANVAS_INPAINT_GRAPH ||
+ graph.id === SDXL_CANVAS_OUTPAINT_GRAPH
+ ) {
+ graph.edges.push({
+ source: {
+ node_id: SEAMLESS,
+ field: 'unet',
+ },
+ destination: {
+ node_id: CANVAS_COHERENCE_DENOISE_LATENTS,
+ field: 'unet',
+ },
+ });
+ }
+};
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 d3334d31c32..63a7eac56b6 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasImageToImageGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasImageToImageGraph.ts
@@ -7,6 +7,7 @@ import { addControlNetToLinearGraph } from './addControlNetToLinearGraph';
import { addDynamicPromptsToGraph } from './addDynamicPromptsToGraph';
import { addLoRAsToGraph } from './addLoRAsToGraph';
import { addNSFWCheckerToGraph } from './addNSFWCheckerToGraph';
+import { addSeamlessToLinearGraph } from './addSeamlessToLinearGraph';
import { addVAEToGraph } from './addVAEToGraph';
import { addWatermarkerToGraph } from './addWatermarkerToGraph';
import {
@@ -22,6 +23,7 @@ import {
NEGATIVE_CONDITIONING,
NOISE,
POSITIVE_CONDITIONING,
+ SEAMLESS,
} from './constants';
/**
@@ -44,6 +46,8 @@ export const buildCanvasImageToImageGraph = (
clipSkip,
shouldUseCpuNoise,
shouldUseNoiseSettings,
+ seamlessXAxis,
+ seamlessYAxis,
} = state.generation;
// The bounding box determines width and height, not the width and height params
@@ -64,6 +68,8 @@ export const buildCanvasImageToImageGraph = (
throw new Error('No model found in state');
}
+ let modelLoaderNodeId = MAIN_MODEL_LOADER;
+
const use_cpu = shouldUseNoiseSettings
? shouldUseCpuNoise
: initialGenerationState.shouldUseCpuNoise;
@@ -81,9 +87,9 @@ export const buildCanvasImageToImageGraph = (
const graph: NonNullableGraph = {
id: CANVAS_IMAGE_TO_IMAGE_GRAPH,
nodes: {
- [MAIN_MODEL_LOADER]: {
+ [modelLoaderNodeId]: {
type: 'main_model_loader',
- id: MAIN_MODEL_LOADER,
+ id: modelLoaderNodeId,
is_intermediate: true,
model,
},
@@ -142,7 +148,7 @@ export const buildCanvasImageToImageGraph = (
// Connect Model Loader to CLIP Skip and UNet
{
source: {
- node_id: MAIN_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'unet',
},
destination: {
@@ -152,7 +158,7 @@ export const buildCanvasImageToImageGraph = (
},
{
source: {
- node_id: MAIN_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'clip',
},
destination: {
@@ -340,11 +346,17 @@ export const buildCanvasImageToImageGraph = (
},
});
+ // Add Seamless To Graph
+ if (seamlessXAxis || seamlessYAxis) {
+ addSeamlessToLinearGraph(state, graph, modelLoaderNodeId);
+ modelLoaderNodeId = SEAMLESS;
+ }
+
// add LoRA support
addLoRAsToGraph(state, graph, DENOISE_LATENTS);
// optionally add custom VAE
- addVAEToGraph(state, graph, MAIN_MODEL_LOADER);
+ addVAEToGraph(state, graph, modelLoaderNodeId);
// add dynamic prompts - also sets up core iteration and seed
addDynamicPromptsToGraph(state, 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 b4e974dadd2..6eafd1fc06d 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasInpaintGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasInpaintGraph.ts
@@ -13,6 +13,7 @@ import {
import { addControlNetToLinearGraph } from './addControlNetToLinearGraph';
import { addLoRAsToGraph } from './addLoRAsToGraph';
import { addNSFWCheckerToGraph } from './addNSFWCheckerToGraph';
+import { addSeamlessToLinearGraph } from './addSeamlessToLinearGraph';
import { addVAEToGraph } from './addVAEToGraph';
import { addWatermarkerToGraph } from './addWatermarkerToGraph';
import {
@@ -38,6 +39,7 @@ import {
POSITIVE_CONDITIONING,
RANDOM_INT,
RANGE_OF_SIZE,
+ SEAMLESS,
} from './constants';
/**
@@ -68,6 +70,8 @@ export const buildCanvasInpaintGraph = (
canvasCoherenceSteps,
canvasCoherenceStrength,
clipSkip,
+ seamlessXAxis,
+ seamlessYAxis,
} = state.generation;
if (!model) {
@@ -85,6 +89,8 @@ export const buildCanvasInpaintGraph = (
shouldAutoSave,
} = state.canvas;
+ let modelLoaderNodeId = MAIN_MODEL_LOADER;
+
const use_cpu = shouldUseNoiseSettings
? shouldUseCpuNoise
: shouldUseCpuNoise;
@@ -92,9 +98,9 @@ export const buildCanvasInpaintGraph = (
const graph: NonNullableGraph = {
id: CANVAS_INPAINT_GRAPH,
nodes: {
- [MAIN_MODEL_LOADER]: {
+ [modelLoaderNodeId]: {
type: 'main_model_loader',
- id: MAIN_MODEL_LOADER,
+ id: modelLoaderNodeId,
is_intermediate: true,
model,
},
@@ -204,7 +210,7 @@ export const buildCanvasInpaintGraph = (
// Connect Model Loader to CLIP Skip and UNet
{
source: {
- node_id: MAIN_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'unet',
},
destination: {
@@ -214,7 +220,7 @@ export const buildCanvasInpaintGraph = (
},
{
source: {
- node_id: MAIN_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'clip',
},
destination: {
@@ -349,7 +355,7 @@ export const buildCanvasInpaintGraph = (
},
{
source: {
- node_id: MAIN_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'unet',
},
destination: {
@@ -595,11 +601,17 @@ export const buildCanvasInpaintGraph = (
(graph.nodes[RANGE_OF_SIZE] as RangeOfSizeInvocation).start = seed;
}
+ // Add Seamless To Graph
+ if (seamlessXAxis || seamlessYAxis) {
+ addSeamlessToLinearGraph(state, graph, modelLoaderNodeId);
+ modelLoaderNodeId = SEAMLESS;
+ }
+
// Add VAE
- addVAEToGraph(state, graph, MAIN_MODEL_LOADER);
+ addVAEToGraph(state, graph, modelLoaderNodeId);
// add LoRA support
- addLoRAsToGraph(state, graph, DENOISE_LATENTS, MAIN_MODEL_LOADER);
+ addLoRAsToGraph(state, graph, DENOISE_LATENTS, modelLoaderNodeId);
// add controlnet, mutating `graph`
addControlNetToLinearGraph(state, graph, DENOISE_LATENTS);
diff --git a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasOutpaintGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasOutpaintGraph.ts
index 8916dd0652f..aec9d1c0357 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasOutpaintGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasOutpaintGraph.ts
@@ -14,6 +14,7 @@ import {
import { addControlNetToLinearGraph } from './addControlNetToLinearGraph';
import { addLoRAsToGraph } from './addLoRAsToGraph';
import { addNSFWCheckerToGraph } from './addNSFWCheckerToGraph';
+import { addSeamlessToLinearGraph } from './addSeamlessToLinearGraph';
import { addVAEToGraph } from './addVAEToGraph';
import { addWatermarkerToGraph } from './addWatermarkerToGraph';
import {
@@ -43,6 +44,7 @@ import {
POSITIVE_CONDITIONING,
RANDOM_INT,
RANGE_OF_SIZE,
+ SEAMLESS,
} from './constants';
/**
@@ -75,6 +77,8 @@ export const buildCanvasOutpaintGraph = (
tileSize,
infillMethod,
clipSkip,
+ seamlessXAxis,
+ seamlessYAxis,
} = state.generation;
if (!model) {
@@ -92,6 +96,8 @@ export const buildCanvasOutpaintGraph = (
shouldAutoSave,
} = state.canvas;
+ let modelLoaderNodeId = MAIN_MODEL_LOADER;
+
const use_cpu = shouldUseNoiseSettings
? shouldUseCpuNoise
: shouldUseCpuNoise;
@@ -99,9 +105,9 @@ export const buildCanvasOutpaintGraph = (
const graph: NonNullableGraph = {
id: CANVAS_OUTPAINT_GRAPH,
nodes: {
- [MAIN_MODEL_LOADER]: {
+ [modelLoaderNodeId]: {
type: 'main_model_loader',
- id: MAIN_MODEL_LOADER,
+ id: modelLoaderNodeId,
is_intermediate: true,
model,
},
@@ -222,7 +228,7 @@ export const buildCanvasOutpaintGraph = (
// Connect Model Loader To UNet & Clip Skip
{
source: {
- node_id: MAIN_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'unet',
},
destination: {
@@ -232,7 +238,7 @@ export const buildCanvasOutpaintGraph = (
},
{
source: {
- node_id: MAIN_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'clip',
},
destination: {
@@ -389,7 +395,7 @@ export const buildCanvasOutpaintGraph = (
},
{
source: {
- node_id: MAIN_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'unet',
},
destination: {
@@ -732,11 +738,17 @@ export const buildCanvasOutpaintGraph = (
(graph.nodes[RANGE_OF_SIZE] as RangeOfSizeInvocation).start = seed;
}
+ // Add Seamless To Graph
+ if (seamlessXAxis || seamlessYAxis) {
+ addSeamlessToLinearGraph(state, graph, modelLoaderNodeId);
+ modelLoaderNodeId = SEAMLESS;
+ }
+
// Add VAE
- addVAEToGraph(state, graph, MAIN_MODEL_LOADER);
+ addVAEToGraph(state, graph, modelLoaderNodeId);
// add LoRA support
- addLoRAsToGraph(state, graph, DENOISE_LATENTS, MAIN_MODEL_LOADER);
+ addLoRAsToGraph(state, graph, DENOISE_LATENTS, modelLoaderNodeId);
// add controlnet, mutating `graph`
addControlNetToLinearGraph(state, graph, DENOISE_LATENTS);
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 ea46e8a956e..e5a14c3f8ad 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLImageToImageGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLImageToImageGraph.ts
@@ -8,6 +8,7 @@ import { addDynamicPromptsToGraph } from './addDynamicPromptsToGraph';
import { addNSFWCheckerToGraph } from './addNSFWCheckerToGraph';
import { addSDXLLoRAsToGraph } from './addSDXLLoRAstoGraph';
import { addSDXLRefinerToGraph } from './addSDXLRefinerToGraph';
+import { addSeamlessToLinearGraph } from './addSeamlessToLinearGraph';
import { addVAEToGraph } from './addVAEToGraph';
import { addWatermarkerToGraph } from './addWatermarkerToGraph';
import {
@@ -19,9 +20,11 @@ import {
NEGATIVE_CONDITIONING,
NOISE,
POSITIVE_CONDITIONING,
+ REFINER_SEAMLESS,
SDXL_CANVAS_IMAGE_TO_IMAGE_GRAPH,
SDXL_DENOISE_LATENTS,
SDXL_MODEL_LOADER,
+ SEAMLESS,
} from './constants';
import { craftSDXLStylePrompt } from './helpers/craftSDXLStylePrompt';
@@ -44,6 +47,8 @@ export const buildCanvasSDXLImageToImageGraph = (
clipSkip,
shouldUseCpuNoise,
shouldUseNoiseSettings,
+ seamlessXAxis,
+ seamlessYAxis,
} = state.generation;
const {
@@ -71,6 +76,9 @@ export const buildCanvasSDXLImageToImageGraph = (
throw new Error('No model found in state');
}
+ // Model Loader ID
+ let modelLoaderNodeId = SDXL_MODEL_LOADER;
+
const use_cpu = shouldUseNoiseSettings
? shouldUseCpuNoise
: initialGenerationState.shouldUseCpuNoise;
@@ -92,9 +100,9 @@ export const buildCanvasSDXLImageToImageGraph = (
const graph: NonNullableGraph = {
id: SDXL_CANVAS_IMAGE_TO_IMAGE_GRAPH,
nodes: {
- [SDXL_MODEL_LOADER]: {
+ [modelLoaderNodeId]: {
type: 'sdxl_model_loader',
- id: SDXL_MODEL_LOADER,
+ id: modelLoaderNodeId,
model,
},
[POSITIVE_CONDITIONING]: {
@@ -144,7 +152,7 @@ export const buildCanvasSDXLImageToImageGraph = (
// Connect Model Loader To UNet & CLIP
{
source: {
- node_id: SDXL_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'unet',
},
destination: {
@@ -154,7 +162,7 @@ export const buildCanvasSDXLImageToImageGraph = (
},
{
source: {
- node_id: SDXL_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'clip',
},
destination: {
@@ -164,7 +172,7 @@ export const buildCanvasSDXLImageToImageGraph = (
},
{
source: {
- node_id: SDXL_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'clip2',
},
destination: {
@@ -174,7 +182,7 @@ export const buildCanvasSDXLImageToImageGraph = (
},
{
source: {
- node_id: SDXL_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'clip',
},
destination: {
@@ -184,7 +192,7 @@ export const buildCanvasSDXLImageToImageGraph = (
},
{
source: {
- node_id: SDXL_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'clip2',
},
destination: {
@@ -351,16 +359,23 @@ export const buildCanvasSDXLImageToImageGraph = (
},
});
- // add LoRA support
- addSDXLLoRAsToGraph(state, graph, SDXL_DENOISE_LATENTS, SDXL_MODEL_LOADER);
+ // Add Seamless To Graph
+ if (seamlessXAxis || seamlessYAxis) {
+ addSeamlessToLinearGraph(state, graph, modelLoaderNodeId);
+ modelLoaderNodeId = SEAMLESS;
+ }
// Add Refiner if enabled
if (shouldUseSDXLRefiner) {
addSDXLRefinerToGraph(state, graph, SDXL_DENOISE_LATENTS);
+ modelLoaderNodeId = REFINER_SEAMLESS;
}
// optionally add custom VAE
- addVAEToGraph(state, graph, SDXL_MODEL_LOADER);
+ addVAEToGraph(state, graph, modelLoaderNodeId);
+
+ // add LoRA support
+ addSDXLLoRAsToGraph(state, graph, SDXL_DENOISE_LATENTS, modelLoaderNodeId);
// add dynamic prompts - also sets up core iteration and seed
addDynamicPromptsToGraph(state, graph);
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 f51c2444d40..4b2ffdb7ca6 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLInpaintGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLInpaintGraph.ts
@@ -14,6 +14,7 @@ import { addControlNetToLinearGraph } from './addControlNetToLinearGraph';
import { addNSFWCheckerToGraph } from './addNSFWCheckerToGraph';
import { addSDXLLoRAsToGraph } from './addSDXLLoRAstoGraph';
import { addSDXLRefinerToGraph } from './addSDXLRefinerToGraph';
+import { addSeamlessToLinearGraph } from './addSeamlessToLinearGraph';
import { addVAEToGraph } from './addVAEToGraph';
import { addWatermarkerToGraph } from './addWatermarkerToGraph';
import {
@@ -35,9 +36,11 @@ import {
POSITIVE_CONDITIONING,
RANDOM_INT,
RANGE_OF_SIZE,
+ REFINER_SEAMLESS,
SDXL_CANVAS_INPAINT_GRAPH,
SDXL_DENOISE_LATENTS,
SDXL_MODEL_LOADER,
+ SEAMLESS,
} from './constants';
import { craftSDXLStylePrompt } from './helpers/craftSDXLStylePrompt';
@@ -67,6 +70,8 @@ export const buildCanvasSDXLInpaintGraph = (
maskBlurMethod,
canvasCoherenceSteps,
canvasCoherenceStrength,
+ seamlessXAxis,
+ seamlessYAxis,
} = state.generation;
const {
@@ -91,6 +96,8 @@ export const buildCanvasSDXLInpaintGraph = (
shouldAutoSave,
} = state.canvas;
+ let modelLoaderNodeId = SDXL_MODEL_LOADER;
+
const use_cpu = shouldUseNoiseSettings
? shouldUseCpuNoise
: shouldUseCpuNoise;
@@ -102,9 +109,9 @@ export const buildCanvasSDXLInpaintGraph = (
const graph: NonNullableGraph = {
id: SDXL_CANVAS_INPAINT_GRAPH,
nodes: {
- [SDXL_MODEL_LOADER]: {
+ [modelLoaderNodeId]: {
type: 'sdxl_model_loader',
- id: SDXL_MODEL_LOADER,
+ id: modelLoaderNodeId,
model,
},
[POSITIVE_CONDITIONING]: {
@@ -209,7 +216,7 @@ export const buildCanvasSDXLInpaintGraph = (
// Connect Model Loader to UNet and CLIP
{
source: {
- node_id: SDXL_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'unet',
},
destination: {
@@ -219,7 +226,7 @@ export const buildCanvasSDXLInpaintGraph = (
},
{
source: {
- node_id: SDXL_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'clip',
},
destination: {
@@ -229,7 +236,7 @@ export const buildCanvasSDXLInpaintGraph = (
},
{
source: {
- node_id: SDXL_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'clip2',
},
destination: {
@@ -239,7 +246,7 @@ export const buildCanvasSDXLInpaintGraph = (
},
{
source: {
- node_id: SDXL_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'clip',
},
destination: {
@@ -249,7 +256,7 @@ export const buildCanvasSDXLInpaintGraph = (
},
{
source: {
- node_id: SDXL_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'clip2',
},
destination: {
@@ -363,7 +370,7 @@ export const buildCanvasSDXLInpaintGraph = (
},
{
source: {
- node_id: SDXL_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'unet',
},
destination: {
@@ -609,16 +616,28 @@ export const buildCanvasSDXLInpaintGraph = (
(graph.nodes[RANGE_OF_SIZE] as RangeOfSizeInvocation).start = seed;
}
+ // Add Seamless To Graph
+ if (seamlessXAxis || seamlessYAxis) {
+ addSeamlessToLinearGraph(state, graph, modelLoaderNodeId);
+ modelLoaderNodeId = SEAMLESS;
+ }
+
// Add Refiner if enabled
if (shouldUseSDXLRefiner) {
- addSDXLRefinerToGraph(state, graph, CANVAS_COHERENCE_DENOISE_LATENTS);
+ addSDXLRefinerToGraph(
+ state,
+ graph,
+ CANVAS_COHERENCE_DENOISE_LATENTS,
+ modelLoaderNodeId
+ );
+ modelLoaderNodeId = REFINER_SEAMLESS;
}
// optionally add custom VAE
- addVAEToGraph(state, graph, SDXL_MODEL_LOADER);
+ addVAEToGraph(state, graph, modelLoaderNodeId);
// add LoRA support
- addSDXLLoRAsToGraph(state, graph, SDXL_DENOISE_LATENTS, SDXL_MODEL_LOADER);
+ addSDXLLoRAsToGraph(state, graph, SDXL_DENOISE_LATENTS, modelLoaderNodeId);
// add controlnet, mutating `graph`
addControlNetToLinearGraph(state, graph, SDXL_DENOISE_LATENTS);
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 05432f0274a..0c075beb4a3 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLOutpaintGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLOutpaintGraph.ts
@@ -15,6 +15,7 @@ import { addControlNetToLinearGraph } from './addControlNetToLinearGraph';
import { addNSFWCheckerToGraph } from './addNSFWCheckerToGraph';
import { addSDXLLoRAsToGraph } from './addSDXLLoRAstoGraph';
import { addSDXLRefinerToGraph } from './addSDXLRefinerToGraph';
+import { addSeamlessToLinearGraph } from './addSeamlessToLinearGraph';
import { addVAEToGraph } from './addVAEToGraph';
import { addWatermarkerToGraph } from './addWatermarkerToGraph';
import {
@@ -40,9 +41,11 @@ import {
POSITIVE_CONDITIONING,
RANDOM_INT,
RANGE_OF_SIZE,
+ REFINER_SEAMLESS,
SDXL_CANVAS_OUTPAINT_GRAPH,
SDXL_DENOISE_LATENTS,
SDXL_MODEL_LOADER,
+ SEAMLESS,
} from './constants';
import { craftSDXLStylePrompt } from './helpers/craftSDXLStylePrompt';
@@ -74,6 +77,8 @@ export const buildCanvasSDXLOutpaintGraph = (
canvasCoherenceStrength,
tileSize,
infillMethod,
+ seamlessXAxis,
+ seamlessYAxis,
} = state.generation;
const {
@@ -98,6 +103,8 @@ export const buildCanvasSDXLOutpaintGraph = (
shouldAutoSave,
} = state.canvas;
+ let modelLoaderNodeId = SDXL_MODEL_LOADER;
+
const use_cpu = shouldUseNoiseSettings
? shouldUseCpuNoise
: shouldUseCpuNoise;
@@ -747,16 +754,28 @@ export const buildCanvasSDXLOutpaintGraph = (
(graph.nodes[RANGE_OF_SIZE] as RangeOfSizeInvocation).start = seed;
}
+ // Add Seamless To Graph
+ if (seamlessXAxis || seamlessYAxis) {
+ addSeamlessToLinearGraph(state, graph, modelLoaderNodeId);
+ modelLoaderNodeId = SEAMLESS;
+ }
+
// Add Refiner if enabled
if (shouldUseSDXLRefiner) {
- addSDXLRefinerToGraph(state, graph, CANVAS_COHERENCE_DENOISE_LATENTS);
+ addSDXLRefinerToGraph(
+ state,
+ graph,
+ CANVAS_COHERENCE_DENOISE_LATENTS,
+ modelLoaderNodeId
+ );
+ modelLoaderNodeId = REFINER_SEAMLESS;
}
// optionally add custom VAE
- addVAEToGraph(state, graph, SDXL_MODEL_LOADER);
+ addVAEToGraph(state, graph, modelLoaderNodeId);
// add LoRA support
- addSDXLLoRAsToGraph(state, graph, SDXL_DENOISE_LATENTS, SDXL_MODEL_LOADER);
+ addSDXLLoRAsToGraph(state, graph, SDXL_DENOISE_LATENTS, modelLoaderNodeId);
// add controlnet, mutating `graph`
addControlNetToLinearGraph(state, graph, SDXL_DENOISE_LATENTS);
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 bdfc60fe005..afefa536453 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLTextToImageGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasSDXLTextToImageGraph.ts
@@ -11,6 +11,7 @@ import { addDynamicPromptsToGraph } from './addDynamicPromptsToGraph';
import { addNSFWCheckerToGraph } from './addNSFWCheckerToGraph';
import { addSDXLLoRAsToGraph } from './addSDXLLoRAstoGraph';
import { addSDXLRefinerToGraph } from './addSDXLRefinerToGraph';
+import { addSeamlessToLinearGraph } from './addSeamlessToLinearGraph';
import { addVAEToGraph } from './addVAEToGraph';
import { addWatermarkerToGraph } from './addWatermarkerToGraph';
import {
@@ -21,9 +22,11 @@ import {
NOISE,
ONNX_MODEL_LOADER,
POSITIVE_CONDITIONING,
+ REFINER_SEAMLESS,
SDXL_CANVAS_TEXT_TO_IMAGE_GRAPH,
SDXL_DENOISE_LATENTS,
SDXL_MODEL_LOADER,
+ SEAMLESS,
} from './constants';
import { craftSDXLStylePrompt } from './helpers/craftSDXLStylePrompt';
@@ -45,6 +48,8 @@ export const buildCanvasSDXLTextToImageGraph = (
clipSkip,
shouldUseCpuNoise,
shouldUseNoiseSettings,
+ seamlessXAxis,
+ seamlessYAxis,
} = state.generation;
// The bounding box determines width and height, not the width and height params
@@ -74,7 +79,7 @@ export const buildCanvasSDXLTextToImageGraph = (
const isUsingOnnxModel = model.model_type === 'onnx';
- const modelLoaderNodeId = isUsingOnnxModel
+ let modelLoaderNodeId = isUsingOnnxModel
? ONNX_MODEL_LOADER
: SDXL_MODEL_LOADER;
@@ -334,9 +339,16 @@ export const buildCanvasSDXLTextToImageGraph = (
},
});
+ // Add Seamless To Graph
+ if (seamlessXAxis || seamlessYAxis) {
+ addSeamlessToLinearGraph(state, graph, modelLoaderNodeId);
+ modelLoaderNodeId = SEAMLESS;
+ }
+
// Add Refiner if enabled
if (shouldUseSDXLRefiner) {
addSDXLRefinerToGraph(state, graph, SDXL_DENOISE_LATENTS);
+ modelLoaderNodeId = REFINER_SEAMLESS;
}
// add LoRA support
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 1ceb23b71ed..b25c266d668 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasTextToImageGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildCanvasTextToImageGraph.ts
@@ -10,6 +10,7 @@ import { addControlNetToLinearGraph } from './addControlNetToLinearGraph';
import { addDynamicPromptsToGraph } from './addDynamicPromptsToGraph';
import { addLoRAsToGraph } from './addLoRAsToGraph';
import { addNSFWCheckerToGraph } from './addNSFWCheckerToGraph';
+import { addSeamlessToLinearGraph } from './addSeamlessToLinearGraph';
import { addVAEToGraph } from './addVAEToGraph';
import { addWatermarkerToGraph } from './addWatermarkerToGraph';
import {
@@ -24,6 +25,7 @@ import {
NOISE,
ONNX_MODEL_LOADER,
POSITIVE_CONDITIONING,
+ SEAMLESS,
} from './constants';
/**
@@ -44,6 +46,8 @@ export const buildCanvasTextToImageGraph = (
clipSkip,
shouldUseCpuNoise,
shouldUseNoiseSettings,
+ seamlessXAxis,
+ seamlessYAxis,
} = state.generation;
// The bounding box determines width and height, not the width and height params
@@ -70,7 +74,7 @@ export const buildCanvasTextToImageGraph = (
const isUsingOnnxModel = model.model_type === 'onnx';
- const modelLoaderNodeId = isUsingOnnxModel
+ let modelLoaderNodeId = isUsingOnnxModel
? ONNX_MODEL_LOADER
: MAIN_MODEL_LOADER;
@@ -321,6 +325,12 @@ export const buildCanvasTextToImageGraph = (
},
});
+ // Add Seamless To Graph
+ if (seamlessXAxis || seamlessYAxis) {
+ addSeamlessToLinearGraph(state, graph, modelLoaderNodeId);
+ modelLoaderNodeId = SEAMLESS;
+ }
+
// optionally add custom VAE
addVAEToGraph(state, graph, modelLoaderNodeId);
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 982a09357f8..7c1764ae65b 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearImageToImageGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearImageToImageGraph.ts
@@ -10,6 +10,7 @@ import { addControlNetToLinearGraph } from './addControlNetToLinearGraph';
import { addDynamicPromptsToGraph } from './addDynamicPromptsToGraph';
import { addLoRAsToGraph } from './addLoRAsToGraph';
import { addNSFWCheckerToGraph } from './addNSFWCheckerToGraph';
+import { addSeamlessToLinearGraph } from './addSeamlessToLinearGraph';
import { addVAEToGraph } from './addVAEToGraph';
import { addWatermarkerToGraph } from './addWatermarkerToGraph';
import {
@@ -24,6 +25,7 @@ import {
NOISE,
POSITIVE_CONDITIONING,
RESIZE,
+ SEAMLESS,
} from './constants';
/**
@@ -49,6 +51,8 @@ export const buildLinearImageToImageGraph = (
shouldUseCpuNoise,
shouldUseNoiseSettings,
vaePrecision,
+ seamlessXAxis,
+ seamlessYAxis,
} = state.generation;
// TODO: add batch functionality
@@ -80,6 +84,8 @@ export const buildLinearImageToImageGraph = (
throw new Error('No model found in state');
}
+ let modelLoaderNodeId = MAIN_MODEL_LOADER;
+
const use_cpu = shouldUseNoiseSettings
? shouldUseCpuNoise
: initialGenerationState.shouldUseCpuNoise;
@@ -88,9 +94,9 @@ export const buildLinearImageToImageGraph = (
const graph: NonNullableGraph = {
id: IMAGE_TO_IMAGE_GRAPH,
nodes: {
- [MAIN_MODEL_LOADER]: {
+ [modelLoaderNodeId]: {
type: 'main_model_loader',
- id: MAIN_MODEL_LOADER,
+ id: modelLoaderNodeId,
model,
},
[CLIP_SKIP]: {
@@ -141,7 +147,7 @@ export const buildLinearImageToImageGraph = (
// Connect Model Loader to UNet and CLIP Skip
{
source: {
- node_id: MAIN_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'unet',
},
destination: {
@@ -151,7 +157,7 @@ export const buildLinearImageToImageGraph = (
},
{
source: {
- node_id: MAIN_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'clip',
},
destination: {
@@ -338,11 +344,17 @@ export const buildLinearImageToImageGraph = (
},
});
+ // Add Seamless To Graph
+ if (seamlessXAxis || seamlessYAxis) {
+ addSeamlessToLinearGraph(state, graph, modelLoaderNodeId);
+ modelLoaderNodeId = SEAMLESS;
+ }
+
// optionally add custom VAE
- addVAEToGraph(state, graph, MAIN_MODEL_LOADER);
+ addVAEToGraph(state, graph, modelLoaderNodeId);
// add LoRA support
- addLoRAsToGraph(state, graph, DENOISE_LATENTS);
+ addLoRAsToGraph(state, graph, DENOISE_LATENTS, modelLoaderNodeId);
// add dynamic prompts - also sets up core iteration and seed
addDynamicPromptsToGraph(state, 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 42ea07c9231..17f10523846 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearSDXLImageToImageGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearSDXLImageToImageGraph.ts
@@ -11,6 +11,7 @@ import { addDynamicPromptsToGraph } from './addDynamicPromptsToGraph';
import { addNSFWCheckerToGraph } from './addNSFWCheckerToGraph';
import { addSDXLLoRAsToGraph } from './addSDXLLoRAstoGraph';
import { addSDXLRefinerToGraph } from './addSDXLRefinerToGraph';
+import { addSeamlessToLinearGraph } from './addSeamlessToLinearGraph';
import { addVAEToGraph } from './addVAEToGraph';
import { addWatermarkerToGraph } from './addWatermarkerToGraph';
import {
@@ -20,10 +21,12 @@ import {
NEGATIVE_CONDITIONING,
NOISE,
POSITIVE_CONDITIONING,
+ REFINER_SEAMLESS,
RESIZE,
SDXL_DENOISE_LATENTS,
SDXL_IMAGE_TO_IMAGE_GRAPH,
SDXL_MODEL_LOADER,
+ SEAMLESS,
} from './constants';
import { craftSDXLStylePrompt } from './helpers/craftSDXLStylePrompt';
@@ -49,6 +52,8 @@ export const buildLinearSDXLImageToImageGraph = (
shouldUseCpuNoise,
shouldUseNoiseSettings,
vaePrecision,
+ seamlessXAxis,
+ seamlessYAxis,
} = state.generation;
const {
@@ -79,6 +84,9 @@ export const buildLinearSDXLImageToImageGraph = (
throw new Error('No model found in state');
}
+ // Model Loader ID
+ let modelLoaderNodeId = SDXL_MODEL_LOADER;
+
const use_cpu = shouldUseNoiseSettings
? shouldUseCpuNoise
: initialGenerationState.shouldUseCpuNoise;
@@ -91,9 +99,9 @@ export const buildLinearSDXLImageToImageGraph = (
const graph: NonNullableGraph = {
id: SDXL_IMAGE_TO_IMAGE_GRAPH,
nodes: {
- [SDXL_MODEL_LOADER]: {
+ [modelLoaderNodeId]: {
type: 'sdxl_model_loader',
- id: SDXL_MODEL_LOADER,
+ id: modelLoaderNodeId,
model,
},
[POSITIVE_CONDITIONING]: {
@@ -143,7 +151,7 @@ export const buildLinearSDXLImageToImageGraph = (
// Connect Model Loader to UNet, CLIP & VAE
{
source: {
- node_id: SDXL_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'unet',
},
destination: {
@@ -153,7 +161,7 @@ export const buildLinearSDXLImageToImageGraph = (
},
{
source: {
- node_id: SDXL_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'clip',
},
destination: {
@@ -163,7 +171,7 @@ export const buildLinearSDXLImageToImageGraph = (
},
{
source: {
- node_id: SDXL_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'clip2',
},
destination: {
@@ -173,7 +181,7 @@ export const buildLinearSDXLImageToImageGraph = (
},
{
source: {
- node_id: SDXL_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'clip',
},
destination: {
@@ -183,7 +191,7 @@ export const buildLinearSDXLImageToImageGraph = (
},
{
source: {
- node_id: SDXL_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'clip2',
},
destination: {
@@ -351,15 +359,23 @@ export const buildLinearSDXLImageToImageGraph = (
},
});
- addSDXLLoRAsToGraph(state, graph, SDXL_DENOISE_LATENTS, SDXL_MODEL_LOADER);
+ // Add Seamless To Graph
+ if (seamlessXAxis || seamlessYAxis) {
+ addSeamlessToLinearGraph(state, graph, modelLoaderNodeId);
+ modelLoaderNodeId = SEAMLESS;
+ }
// Add Refiner if enabled
if (shouldUseSDXLRefiner) {
addSDXLRefinerToGraph(state, graph, SDXL_DENOISE_LATENTS);
+ modelLoaderNodeId = REFINER_SEAMLESS;
}
// optionally add custom VAE
- addVAEToGraph(state, graph, SDXL_MODEL_LOADER);
+ addVAEToGraph(state, graph, modelLoaderNodeId);
+
+ // Add LoRA Support
+ addSDXLLoRAsToGraph(state, graph, SDXL_DENOISE_LATENTS, modelLoaderNodeId);
// add controlnet, mutating `graph`
addControlNetToLinearGraph(state, graph, SDXL_DENOISE_LATENTS);
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 a74884f23be..2af37fd905f 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearSDXLTextToImageGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearSDXLTextToImageGraph.ts
@@ -7,6 +7,7 @@ import { addDynamicPromptsToGraph } from './addDynamicPromptsToGraph';
import { addNSFWCheckerToGraph } from './addNSFWCheckerToGraph';
import { addSDXLLoRAsToGraph } from './addSDXLLoRAstoGraph';
import { addSDXLRefinerToGraph } from './addSDXLRefinerToGraph';
+import { addSeamlessToLinearGraph } from './addSeamlessToLinearGraph';
import { addVAEToGraph } from './addVAEToGraph';
import { addWatermarkerToGraph } from './addWatermarkerToGraph';
import {
@@ -15,9 +16,11 @@ import {
NEGATIVE_CONDITIONING,
NOISE,
POSITIVE_CONDITIONING,
+ REFINER_SEAMLESS,
SDXL_DENOISE_LATENTS,
SDXL_MODEL_LOADER,
SDXL_TEXT_TO_IMAGE_GRAPH,
+ SEAMLESS,
} from './constants';
import { craftSDXLStylePrompt } from './helpers/craftSDXLStylePrompt';
@@ -38,6 +41,8 @@ export const buildLinearSDXLTextToImageGraph = (
shouldUseCpuNoise,
shouldUseNoiseSettings,
vaePrecision,
+ seamlessXAxis,
+ seamlessYAxis,
} = state.generation;
const {
@@ -61,6 +66,9 @@ export const buildLinearSDXLTextToImageGraph = (
const { craftedPositiveStylePrompt, craftedNegativeStylePrompt } =
craftSDXLStylePrompt(state, shouldConcatSDXLStylePrompt);
+ // Model Loader ID
+ let modelLoaderNodeId = SDXL_MODEL_LOADER;
+
/**
* The easiest way to build linear graphs is to do it in the node editor, then copy and paste the
* full graph here as a template. Then use the parameters from app state and set friendlier node
@@ -74,9 +82,9 @@ export const buildLinearSDXLTextToImageGraph = (
const graph: NonNullableGraph = {
id: SDXL_TEXT_TO_IMAGE_GRAPH,
nodes: {
- [SDXL_MODEL_LOADER]: {
+ [modelLoaderNodeId]: {
type: 'sdxl_model_loader',
- id: SDXL_MODEL_LOADER,
+ id: modelLoaderNodeId,
model,
},
[POSITIVE_CONDITIONING]: {
@@ -117,7 +125,7 @@ export const buildLinearSDXLTextToImageGraph = (
// Connect Model Loader to UNet, VAE & CLIP
{
source: {
- node_id: SDXL_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'unet',
},
destination: {
@@ -127,7 +135,7 @@ export const buildLinearSDXLTextToImageGraph = (
},
{
source: {
- node_id: SDXL_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'clip',
},
destination: {
@@ -137,7 +145,7 @@ export const buildLinearSDXLTextToImageGraph = (
},
{
source: {
- node_id: SDXL_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'clip2',
},
destination: {
@@ -147,7 +155,7 @@ export const buildLinearSDXLTextToImageGraph = (
},
{
source: {
- node_id: SDXL_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'clip',
},
destination: {
@@ -157,7 +165,7 @@ export const buildLinearSDXLTextToImageGraph = (
},
{
source: {
- node_id: SDXL_MODEL_LOADER,
+ node_id: modelLoaderNodeId,
field: 'clip2',
},
destination: {
@@ -244,16 +252,23 @@ export const buildLinearSDXLTextToImageGraph = (
},
});
+ // Add Seamless To Graph
+ if (seamlessXAxis || seamlessYAxis) {
+ addSeamlessToLinearGraph(state, graph, modelLoaderNodeId);
+ modelLoaderNodeId = SEAMLESS;
+ }
+
// Add Refiner if enabled
if (shouldUseSDXLRefiner) {
addSDXLRefinerToGraph(state, graph, SDXL_DENOISE_LATENTS);
+ modelLoaderNodeId = REFINER_SEAMLESS;
}
// optionally add custom VAE
- addVAEToGraph(state, graph, SDXL_MODEL_LOADER);
+ addVAEToGraph(state, graph, modelLoaderNodeId);
// add LoRA support
- addSDXLLoRAsToGraph(state, graph, SDXL_DENOISE_LATENTS, SDXL_MODEL_LOADER);
+ addSDXLLoRAsToGraph(state, graph, SDXL_DENOISE_LATENTS, modelLoaderNodeId);
// add controlnet, mutating `graph`
addControlNetToLinearGraph(state, graph, SDXL_DENOISE_LATENTS);
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 99a1ec7420b..d07534bdd9a 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearTextToImageGraph.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/buildLinearTextToImageGraph.ts
@@ -10,6 +10,7 @@ import { addControlNetToLinearGraph } from './addControlNetToLinearGraph';
import { addDynamicPromptsToGraph } from './addDynamicPromptsToGraph';
import { addLoRAsToGraph } from './addLoRAsToGraph';
import { addNSFWCheckerToGraph } from './addNSFWCheckerToGraph';
+import { addSeamlessToLinearGraph } from './addSeamlessToLinearGraph';
import { addVAEToGraph } from './addVAEToGraph';
import { addWatermarkerToGraph } from './addWatermarkerToGraph';
import {
@@ -22,6 +23,7 @@ import {
NOISE,
ONNX_MODEL_LOADER,
POSITIVE_CONDITIONING,
+ SEAMLESS,
TEXT_TO_IMAGE_GRAPH,
} from './constants';
@@ -42,6 +44,8 @@ export const buildLinearTextToImageGraph = (
shouldUseCpuNoise,
shouldUseNoiseSettings,
vaePrecision,
+ seamlessXAxis,
+ seamlessYAxis,
} = state.generation;
const use_cpu = shouldUseNoiseSettings
@@ -55,7 +59,7 @@ export const buildLinearTextToImageGraph = (
const isUsingOnnxModel = model.model_type === 'onnx';
- const modelLoaderNodeId = isUsingOnnxModel
+ let modelLoaderNodeId = isUsingOnnxModel
? ONNX_MODEL_LOADER
: MAIN_MODEL_LOADER;
@@ -258,6 +262,12 @@ export const buildLinearTextToImageGraph = (
},
});
+ // Add Seamless To Graph
+ if (seamlessXAxis || seamlessYAxis) {
+ addSeamlessToLinearGraph(state, graph, modelLoaderNodeId);
+ modelLoaderNodeId = SEAMLESS;
+ }
+
// optionally add custom VAE
addVAEToGraph(state, graph, modelLoaderNodeId);
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 c701386898e..8ada7393dd0 100644
--- a/invokeai/frontend/web/src/features/nodes/util/graphBuilders/constants.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/graphBuilders/constants.ts
@@ -56,6 +56,8 @@ export const SDXL_REFINER_POSITIVE_CONDITIONING =
export const SDXL_REFINER_NEGATIVE_CONDITIONING =
'sdxl_refiner_negative_conditioning';
export const SDXL_REFINER_DENOISE_LATENTS = 'sdxl_refiner_denoise_latents';
+export const SEAMLESS = 'seamless';
+export const REFINER_SEAMLESS = 'refiner_seamless';
// friendly graph ids
export const TEXT_TO_IMAGE_GRAPH = 'text_to_image_graph';
diff --git a/invokeai/frontend/web/src/features/sdxl/components/SDXLImageToImageTabParameters.tsx b/invokeai/frontend/web/src/features/sdxl/components/SDXLImageToImageTabParameters.tsx
index 4667ca63c01..2b40eca3826 100644
--- a/invokeai/frontend/web/src/features/sdxl/components/SDXLImageToImageTabParameters.tsx
+++ b/invokeai/frontend/web/src/features/sdxl/components/SDXLImageToImageTabParameters.tsx
@@ -2,6 +2,7 @@ import ParamDynamicPromptsCollapse from 'features/dynamicPrompts/components/Para
import ParamLoraCollapse from 'features/lora/components/ParamLoraCollapse';
import ParamControlNetCollapse from 'features/parameters/components/Parameters/ControlNet/ParamControlNetCollapse';
import ParamNoiseCollapse from 'features/parameters/components/Parameters/Noise/ParamNoiseCollapse';
+import ParamSeamlessCollapse from 'features/parameters/components/Parameters/Seamless/ParamSeamlessCollapse';
import { memo } from 'react';
import ParamSDXLPromptArea from './ParamSDXLPromptArea';
import ParamSDXLRefinerCollapse from './ParamSDXLRefinerCollapse';
@@ -17,6 +18,7 @@ const SDXLImageToImageTabParameters = () => {
+
>
);
};
diff --git a/invokeai/frontend/web/src/features/sdxl/components/SDXLTextToImageTabParameters.tsx b/invokeai/frontend/web/src/features/sdxl/components/SDXLTextToImageTabParameters.tsx
index 084c12af61e..ff47a422077 100644
--- a/invokeai/frontend/web/src/features/sdxl/components/SDXLTextToImageTabParameters.tsx
+++ b/invokeai/frontend/web/src/features/sdxl/components/SDXLTextToImageTabParameters.tsx
@@ -2,6 +2,7 @@ import ParamDynamicPromptsCollapse from 'features/dynamicPrompts/components/Para
import ParamLoraCollapse from 'features/lora/components/ParamLoraCollapse';
import ParamControlNetCollapse from 'features/parameters/components/Parameters/ControlNet/ParamControlNetCollapse';
import ParamNoiseCollapse from 'features/parameters/components/Parameters/Noise/ParamNoiseCollapse';
+import ParamSeamlessCollapse from 'features/parameters/components/Parameters/Seamless/ParamSeamlessCollapse';
import TextToImageTabCoreParameters from 'features/ui/components/tabs/TextToImage/TextToImageTabCoreParameters';
import { memo } from 'react';
import ParamSDXLPromptArea from './ParamSDXLPromptArea';
@@ -17,6 +18,7 @@ const SDXLTextToImageTabParameters = () => {
+
>
);
};
diff --git a/invokeai/frontend/web/src/features/sdxl/components/SDXLUnifiedCanvasTabParameters.tsx b/invokeai/frontend/web/src/features/sdxl/components/SDXLUnifiedCanvasTabParameters.tsx
index 00432bcec8b..8fc4a3181ca 100644
--- a/invokeai/frontend/web/src/features/sdxl/components/SDXLUnifiedCanvasTabParameters.tsx
+++ b/invokeai/frontend/web/src/features/sdxl/components/SDXLUnifiedCanvasTabParameters.tsx
@@ -5,6 +5,7 @@ import ParamMaskAdjustmentCollapse from 'features/parameters/components/Paramete
import ParamCanvasCoherencePassCollapse from 'features/parameters/components/Parameters/Canvas/SeamPainting/ParamCanvasCoherencePassCollapse';
import ParamControlNetCollapse from 'features/parameters/components/Parameters/ControlNet/ParamControlNetCollapse';
import ParamNoiseCollapse from 'features/parameters/components/Parameters/Noise/ParamNoiseCollapse';
+import ParamSeamlessCollapse from 'features/parameters/components/Parameters/Seamless/ParamSeamlessCollapse';
import ParamSDXLPromptArea from './ParamSDXLPromptArea';
import ParamSDXLRefinerCollapse from './ParamSDXLRefinerCollapse';
import SDXLUnifiedCanvasTabCoreParameters from './SDXLUnifiedCanvasTabCoreParameters';
@@ -22,6 +23,7 @@ export default function SDXLUnifiedCanvasTabParameters() {
+
>
);
}
diff --git a/invokeai/frontend/web/src/features/system/store/configSlice.ts b/invokeai/frontend/web/src/features/system/store/configSlice.ts
index 6cff92a1363..9bdc16ce77c 100644
--- a/invokeai/frontend/web/src/features/system/store/configSlice.ts
+++ b/invokeai/frontend/web/src/features/system/store/configSlice.ts
@@ -9,7 +9,6 @@ export const initialConfigState: AppConfig = {
disabledFeatures: ['lightbox', 'faceRestore', 'batches'],
disabledSDFeatures: [
'variation',
- 'seamless',
'symmetry',
'hires',
'perlinNoise',
diff --git a/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasParameters.tsx b/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasParameters.tsx
index 1c3d3cd2706..a640e1bae4a 100644
--- a/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasParameters.tsx
+++ b/invokeai/frontend/web/src/features/ui/components/tabs/UnifiedCanvas/UnifiedCanvasParameters.tsx
@@ -6,6 +6,7 @@ import ParamMaskAdjustmentCollapse from 'features/parameters/components/Paramete
import ParamCanvasCoherencePassCollapse from 'features/parameters/components/Parameters/Canvas/SeamPainting/ParamCanvasCoherencePassCollapse';
import ParamControlNetCollapse from 'features/parameters/components/Parameters/ControlNet/ParamControlNetCollapse';
import ParamPromptArea from 'features/parameters/components/Parameters/Prompt/ParamPromptArea';
+import ParamSeamlessCollapse from 'features/parameters/components/Parameters/Seamless/ParamSeamlessCollapse';
import ParamSymmetryCollapse from 'features/parameters/components/Parameters/Symmetry/ParamSymmetryCollapse';
import { memo } from 'react';
import UnifiedCanvasCoreParameters from './UnifiedCanvasCoreParameters';
@@ -22,6 +23,7 @@ const UnifiedCanvasParameters = () => {
+
>
);
diff --git a/invokeai/frontend/web/src/services/api/schema.d.ts b/invokeai/frontend/web/src/services/api/schema.d.ts
index c0897987218..6dee0fdaa26 100644
--- a/invokeai/frontend/web/src/services/api/schema.d.ts
+++ b/invokeai/frontend/web/src/services/api/schema.d.ts
@@ -2092,7 +2092,7 @@ export type components = {
* @description The nodes in this graph
*/
nodes?: {
- [key: string]: components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["ImageProcessorInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["LoraLoaderInvocation"] | components["schemas"]["SDXLLoraLoaderInvocation"] | components["schemas"]["VaeLoaderInvocation"] | components["schemas"]["MetadataAccumulatorInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["ClipSkipInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["BlankImageInvocation"] | 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"]["MaskEdgeInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageLuminosityAdjustmentInvocation"] | components["schemas"]["ImageSaturationAdjustmentInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["AddInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["ONNXPromptInvocation"] | components["schemas"]["ONNXTextToLatentsInvocation"] | components["schemas"]["ONNXLatentsToImageInvocation"] | components["schemas"]["OnnxModelLoaderInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["StepParamEasingInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["ESRGANInvocation"] | 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"];
+ [key: string]: components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["ImageProcessorInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["LoraLoaderInvocation"] | components["schemas"]["SDXLLoraLoaderInvocation"] | components["schemas"]["VaeLoaderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["MetadataAccumulatorInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["ClipSkipInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["BlankImageInvocation"] | 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"]["MaskEdgeInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageLuminosityAdjustmentInvocation"] | components["schemas"]["ImageSaturationAdjustmentInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["AddInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["ONNXPromptInvocation"] | components["schemas"]["ONNXTextToLatentsInvocation"] | components["schemas"]["ONNXLatentsToImageInvocation"] | components["schemas"]["OnnxModelLoaderInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["StepParamEasingInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["ESRGANInvocation"] | 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"];
};
/**
* Edges
@@ -2135,7 +2135,7 @@ export type components = {
* @description The results of node executions
*/
results: {
- [key: string]: components["schemas"]["BooleanOutput"] | components["schemas"]["BooleanCollectionOutput"] | components["schemas"]["IntegerOutput"] | components["schemas"]["IntegerCollectionOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["StringOutput"] | components["schemas"]["StringCollectionOutput"] | components["schemas"]["ImageOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["LatentsCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ColorCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["LoraLoaderOutput"] | components["schemas"]["SDXLLoraLoaderOutput"] | components["schemas"]["VaeLoaderOutput"] | components["schemas"]["MetadataAccumulatorOutput"] | components["schemas"]["ClipSkipInvocationOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["ONNXModelLoaderOutput"] | components["schemas"]["SDXLModelLoaderOutput"] | components["schemas"]["SDXLRefinerModelLoaderOutput"] | components["schemas"]["GraphInvocationOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["CollectInvocationOutput"];
+ [key: string]: components["schemas"]["BooleanOutput"] | components["schemas"]["BooleanCollectionOutput"] | components["schemas"]["IntegerOutput"] | components["schemas"]["IntegerCollectionOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["StringOutput"] | components["schemas"]["StringCollectionOutput"] | components["schemas"]["ImageOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["LatentsCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ColorCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["LoraLoaderOutput"] | components["schemas"]["SDXLLoraLoaderOutput"] | components["schemas"]["VaeLoaderOutput"] | components["schemas"]["SeamlessModeOutput"] | components["schemas"]["MetadataAccumulatorOutput"] | components["schemas"]["ClipSkipInvocationOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["ONNXModelLoaderOutput"] | components["schemas"]["SDXLModelLoaderOutput"] | components["schemas"]["SDXLRefinerModelLoaderOutput"] | components["schemas"]["GraphInvocationOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["CollectInvocationOutput"];
};
/**
* Errors
@@ -5707,6 +5707,73 @@ export type components = {
* @enum {string}
*/
SchedulerPredictionType: "epsilon" | "v_prediction" | "sample";
+ /**
+ * Seamless
+ * @description Applies the seamless transformation to the Model UNet and VAE.
+ */
+ SeamlessModeInvocation: {
+ /**
+ * Id
+ * @description The id of this node. Must be unique among all nodes.
+ */
+ id: string;
+ /**
+ * Is Intermediate
+ * @description Whether or not this node is an intermediate node.
+ * @default false
+ */
+ is_intermediate?: boolean;
+ /**
+ * Type
+ * @default seamless
+ * @enum {string}
+ */
+ type: "seamless";
+ /**
+ * UNet
+ * @description UNet (scheduler, LoRAs)
+ */
+ unet?: components["schemas"]["UNetField"];
+ /**
+ * VAE
+ * @description VAE model to load
+ */
+ vae?: components["schemas"]["VaeField"];
+ /**
+ * Seamless Y
+ * @description Specify whether Y axis is seamless
+ * @default true
+ */
+ seamless_y?: boolean;
+ /**
+ * Seamless X
+ * @description Specify whether X axis is seamless
+ * @default true
+ */
+ seamless_x?: boolean;
+ };
+ /**
+ * SeamlessModeOutput
+ * @description Modified Seamless Model output
+ */
+ SeamlessModeOutput: {
+ /**
+ * Type
+ * @default seamless_output
+ * @enum {string}
+ */
+ type: "seamless_output";
+ /**
+ * UNet
+ * @description UNet (scheduler, LoRAs)
+ */
+ unet?: components["schemas"]["UNetField"];
+ /**
+ * VAE
+ * @description VAE
+ */
+ vae?: components["schemas"]["VaeField"];
+ };
/**
* Segment Anything Processor
* @description Applies segment anything processing to image
@@ -6196,6 +6263,11 @@ export type components = {
* @description Loras to apply on model loading
*/
loras: components["schemas"]["LoraInfo"][];
+ /**
+ * Seamless Axes
+ * @description Axes("x" and "y") to which apply seamless
+ */
+ seamless_axes?: string[];
};
/** Upscaler */
Upscaler: {
@@ -6230,6 +6302,11 @@ export type components = {
* @description Info to load vae submodel
*/
vae: components["schemas"]["ModelInfo"];
+ /**
+ * Seamless Axes
+ * @description Axes("x" and "y") to which apply seamless
+ */
+ seamless_axes?: string[];
};
/**
* VAE
@@ -6413,29 +6490,29 @@ export type components = {
*/
StableDiffusionOnnxModelFormat: "olive" | "onnx";
/**
- * ControlNetModelFormat
+ * StableDiffusionXLModelFormat
* @description An enumeration.
* @enum {string}
*/
- ControlNetModelFormat: "checkpoint" | "diffusers";
+ StableDiffusionXLModelFormat: "checkpoint" | "diffusers";
/**
- * StableDiffusion2ModelFormat
+ * StableDiffusion1ModelFormat
* @description An enumeration.
* @enum {string}
*/
- StableDiffusion2ModelFormat: "checkpoint" | "diffusers";
+ StableDiffusion1ModelFormat: "checkpoint" | "diffusers";
/**
- * StableDiffusionXLModelFormat
+ * ControlNetModelFormat
* @description An enumeration.
* @enum {string}
*/
- StableDiffusionXLModelFormat: "checkpoint" | "diffusers";
+ ControlNetModelFormat: "checkpoint" | "diffusers";
/**
- * StableDiffusion1ModelFormat
+ * StableDiffusion2ModelFormat
* @description An enumeration.
* @enum {string}
*/
- StableDiffusion1ModelFormat: "checkpoint" | "diffusers";
+ StableDiffusion2ModelFormat: "checkpoint" | "diffusers";
};
responses: never;
parameters: never;
@@ -6552,7 +6629,7 @@ export type operations = {
};
requestBody: {
content: {
- "application/json": components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["ImageProcessorInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["LoraLoaderInvocation"] | components["schemas"]["SDXLLoraLoaderInvocation"] | components["schemas"]["VaeLoaderInvocation"] | components["schemas"]["MetadataAccumulatorInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["ClipSkipInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["BlankImageInvocation"] | 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"]["MaskEdgeInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageLuminosityAdjustmentInvocation"] | components["schemas"]["ImageSaturationAdjustmentInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["AddInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["ONNXPromptInvocation"] | components["schemas"]["ONNXTextToLatentsInvocation"] | components["schemas"]["ONNXLatentsToImageInvocation"] | components["schemas"]["OnnxModelLoaderInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["StepParamEasingInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["ESRGANInvocation"] | 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"];
+ "application/json": components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["ImageProcessorInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["LoraLoaderInvocation"] | components["schemas"]["SDXLLoraLoaderInvocation"] | components["schemas"]["VaeLoaderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["MetadataAccumulatorInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["ClipSkipInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["BlankImageInvocation"] | 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"]["MaskEdgeInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageLuminosityAdjustmentInvocation"] | components["schemas"]["ImageSaturationAdjustmentInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["AddInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["ONNXPromptInvocation"] | components["schemas"]["ONNXTextToLatentsInvocation"] | components["schemas"]["ONNXLatentsToImageInvocation"] | components["schemas"]["OnnxModelLoaderInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["StepParamEasingInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["ESRGANInvocation"] | 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"];
};
};
responses: {
@@ -6593,7 +6670,7 @@ export type operations = {
};
requestBody: {
content: {
- "application/json": components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["ImageProcessorInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["LoraLoaderInvocation"] | components["schemas"]["SDXLLoraLoaderInvocation"] | components["schemas"]["VaeLoaderInvocation"] | components["schemas"]["MetadataAccumulatorInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["ClipSkipInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["BlankImageInvocation"] | 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"]["MaskEdgeInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageLuminosityAdjustmentInvocation"] | components["schemas"]["ImageSaturationAdjustmentInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["AddInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["ONNXPromptInvocation"] | components["schemas"]["ONNXTextToLatentsInvocation"] | components["schemas"]["ONNXLatentsToImageInvocation"] | components["schemas"]["OnnxModelLoaderInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["StepParamEasingInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["ESRGANInvocation"] | 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"];
+ "application/json": components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["ImageProcessorInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["LoraLoaderInvocation"] | components["schemas"]["SDXLLoraLoaderInvocation"] | components["schemas"]["VaeLoaderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["MetadataAccumulatorInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["ClipSkipInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["BlankImageInvocation"] | 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"]["MaskEdgeInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageLuminosityAdjustmentInvocation"] | components["schemas"]["ImageSaturationAdjustmentInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["AddInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["ONNXPromptInvocation"] | components["schemas"]["ONNXTextToLatentsInvocation"] | components["schemas"]["ONNXLatentsToImageInvocation"] | components["schemas"]["OnnxModelLoaderInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["StepParamEasingInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["ESRGANInvocation"] | 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"];
};
};
responses: {
diff --git a/invokeai/frontend/web/src/services/api/types.ts b/invokeai/frontend/web/src/services/api/types.ts
index 6b064edab35..51e2459b7f7 100644
--- a/invokeai/frontend/web/src/services/api/types.ts
+++ b/invokeai/frontend/web/src/services/api/types.ts
@@ -130,6 +130,7 @@ export type ESRGANInvocation = s['ESRGANInvocation'];
export type DivideInvocation = s['DivideInvocation'];
export type ImageNSFWBlurInvocation = s['ImageNSFWBlurInvocation'];
export type ImageWatermarkInvocation = s['ImageWatermarkInvocation'];
+export type SeamlessModeInvocation = s['SeamlessModeInvocation'];
// ControlNet Nodes
export type ControlNetInvocation = s['ControlNetInvocation'];