From f74b90ea369fa43411999317a393014bdf517dbe Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Sun, 18 Oct 2026 10:09:19 +0200 Subject: [PATCH 1/3] feat(controlnet): add Qwen Image Fun-ControlNet-Union with canvas control layers Add alibaba-pai's VACE-style control branch for Qwen-Image: identification, loader, the qwen_image_control node and control/inpaint conditioning in the denoise, injected through forward hooks on the diffusers transformer. The canvas gets a Qwen Image ControlNet layer kind with inpaint/outpaint feeding and a grayscale filter; the denoise now reserves working memory for its activations. --- .../03.Models/03.model-format-support.mdx | 4 +- .../03.Models/Local Models/qwen-image.mdx | 36 +- .../Users Guide/07.Canvas/02.canvas-guide.mdx | 4 +- .../Optimization/low-vram-mode.mdx | 4 +- .../qwen_image/qwen_image_control.py | 118 ++ .../qwen_image/qwen_image_denoise.py | 213 ++- .../backend/architectures/defs/qwen_image.py | 1 + .../backend/architectures/facets/features.py | 6 +- invokeai/backend/fun_controlnet/__init__.py | 8 + invokeai/backend/fun_controlnet/branch.py | 84 ++ .../backend/fun_controlnet/conditioning.py | 61 + invokeai/backend/fun_controlnet/hooks.py | 110 ++ invokeai/backend/fun_controlnet/qwen_image.py | 157 +++ .../model_manager/configs/controlnet.py | 48 + .../backend/model_manager/configs/factory.py | 2 + .../load/model_loaders/fun_controlnet.py | 44 + .../model_manager/starter_models/__init__.py | 3 + .../starter_models/qwen_image.py | 10 + invokeai/frontend/api/openapi.json | 534 +++++++- invokeai/frontend/api/schema.ts | 293 ++++- .../frontend/webv2/public/locales/en.json | 4 + .../architectureCapabilities.json | 4 +- .../__snapshots__/generateGraphNodeTypes.json | 3 +- .../qwenImageControlCanvasGraphs.json | 1160 +++++++++++++++++ .../core/architectureCapabilities.test.ts | 1 + .../core/canvas/addControlLayers.test.ts | 128 ++ .../core/canvas/addControlLayers.ts | 60 +- .../core/canvas/compileCanvasGraph.test.ts | 151 +++ .../core/canvas/compileCanvasGraph.ts | 47 +- .../core/canvas/controlValidation.test.ts | 45 + .../core/canvas/controlValidation.ts | 35 +- .../features/generation/core/graph.test.ts | 7 + .../src/features/generation/core/graph.ts | 2 + .../webv2/src/features/generation/graph.ts | 1 + .../src/workbench/canvas-engine/contracts.ts | 2 +- .../canvas-operations/filterGraphs.test.ts | 55 +- .../canvas-operations/filterGraphs.ts | 27 +- .../src/workbench/canvasMigration.test.ts | 24 + .../webv2/src/workbench/canvasMigration.ts | 12 +- .../src/workbench/controlAdapters.test.ts | 35 + .../webv2/src/workbench/controlAdapters.ts | 17 +- .../src/workbench/controlLayerChecks.test.ts | 33 +- .../webv2/src/workbench/controlLayerChecks.ts | 6 +- .../invoke/prepareCanvasInvocation.test.ts | 97 ++ .../ControlLayerSettings.browser.test.tsx | 77 +- .../widgets/layers/ControlLayerSettings.tsx | 3 +- .../layers/ControlLayerWarningIcon.tsx | 2 +- .../layers/controlModelOptions.test.ts | 27 + .../workbench/widgets/layers/layerOps.test.ts | 7 + ...test_frontend_qwen_image_control_graphs.py | 210 +++ .../invocations/test_qwen_image_control.py | 504 +++++++ .../test_qwen_image_packed_models.py | 11 +- tests/backend/architectures/test_features.py | 1 + tests/backend/fun_controlnet/conftest.py | 50 + .../test_qwen_image_control_conditioning.py | 145 +++ .../test_qwen_image_fun_control.py | 276 ++++ .../test_qwen_image_fun_controlnet_config.py | 172 +++ .../qwen_image_fun_controlnet_keys.py | 193 +++ .../qwen_image_instantx_controlnet_keys.py | 63 + .../model_manager/load/test_fp8_capability.py | 1 + .../load/test_fun_controlnet_loader.py | 98 ++ ...2512-Fun-Controlnet-Union-2602.safetensors | 3 + .../__test_metadata__.json | 3 + 63 files changed, 5424 insertions(+), 118 deletions(-) create mode 100644 invokeai/app/invocations/qwen_image/qwen_image_control.py create mode 100644 invokeai/backend/fun_controlnet/__init__.py create mode 100644 invokeai/backend/fun_controlnet/branch.py create mode 100644 invokeai/backend/fun_controlnet/conditioning.py create mode 100644 invokeai/backend/fun_controlnet/hooks.py create mode 100644 invokeai/backend/fun_controlnet/qwen_image.py create mode 100644 invokeai/backend/model_manager/load/model_loaders/fun_controlnet.py create mode 100644 invokeai/frontend/webv2/src/features/generation/core/__snapshots__/qwenImageControlCanvasGraphs.json create mode 100644 tests/app/invocations/test_frontend_qwen_image_control_graphs.py create mode 100644 tests/app/invocations/test_qwen_image_control.py create mode 100644 tests/backend/fun_controlnet/conftest.py create mode 100644 tests/backend/fun_controlnet/test_qwen_image_control_conditioning.py create mode 100644 tests/backend/fun_controlnet/test_qwen_image_fun_control.py create mode 100644 tests/backend/model_manager/configs/test_qwen_image_fun_controlnet_config.py create mode 100644 tests/backend/model_manager/load/state_dicts/qwen_image_fun_controlnet_keys.py create mode 100644 tests/backend/model_manager/load/state_dicts/qwen_image_instantx_controlnet_keys.py create mode 100644 tests/backend/model_manager/load/test_fun_controlnet_loader.py create mode 100644 tests/model_identification/stripped_models/779c26bd-e559-4958-80ce-69a551931a26/Qwen-Image-2512-Fun-Controlnet-Union-2602.safetensors create mode 100644 tests/model_identification/stripped_models/779c26bd-e559-4958-80ce-69a551931a26/__test_metadata__.json diff --git a/docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx b/docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx index 7279c395b1a..a878bc8e832 100644 --- a/docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx +++ b/docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx @@ -1,7 +1,7 @@ --- title: Model Format Support description: Which file formats and quantizations InvokeAI loads for every model family, text encoder, VAE and adapter. -lastUpdated: 2026-10-16 +lastUpdated: 2026-10-18 sidebar: order: 3 --- @@ -102,7 +102,7 @@ not check, so a quantized file there fails with an unclear error or decodes inco | SDXL | ✓ (LyCORIS, Diffusers, OMI) | ✓ | IP-Adapter, T2I-Adapter, textual inversion | | FLUX.1 | ✓ (LyCORIS, Diffusers, OMI) | ✓ | Control LoRA, IP-Adapter, Redux | | FLUX.2, Z-Image | ✓ (LyCORIS, Diffusers) | Z-Image only | | -| Qwen-Image, Krea-2, Wan 2.2, Anima | ✓ (LyCORIS/kohya, including LoKR where noted on the family page) | Anima (ControlNet-LLLite) | | +| Qwen-Image, Krea-2, Wan 2.2, Anima | ✓ (LyCORIS/kohya, including LoKR where noted on the family page) | Qwen-Image (single-file checkpoint), Anima (ControlNet-LLLite) | | | LTX-2, MiniMax H3 | ✓ (plain low-rank; LoKR, LoHA and DoRA are refused) | ✗ | | | SD 3, CogView4, Ideogram 4, ERNIE-Image, Qwen-Image-2.1 | ✗ | ✗ | | diff --git a/docs/src/content/docs/Users Guide/03.Models/Local Models/qwen-image.mdx b/docs/src/content/docs/Users Guide/03.Models/Local Models/qwen-image.mdx index a682e1011b5..a67f0d8f342 100644 --- a/docs/src/content/docs/Users Guide/03.Models/Local Models/qwen-image.mdx +++ b/docs/src/content/docs/Users Guide/03.Models/Local Models/qwen-image.mdx @@ -1,7 +1,7 @@ --- title: Qwen Image -description: Generate and edit images with the Qwen Image 2512 text-to-image model and the Qwen Image Edit 2511 reference-image editing model, including GGUF installs and the Lightning LoRAs. -lastUpdated: 2026-09-30 +description: Generate and edit images with the Qwen Image 2512 text-to-image model and the Qwen Image Edit 2511 reference-image editing model, including GGUF installs, the Lightning LoRAs and the Fun-ControlNet-Union. +lastUpdated: 2026-10-18 sidebar: order: 8 --- @@ -17,11 +17,13 @@ variants: person in image 2"). The variant is detected automatically on install. Both variants can also run text-to-image, -image-to-image, inpainting and outpainting on the Canvas; only the Edit variant accepts reference images. +image-to-image, inpainting and outpainting on the Canvas; only the Edit variant accepts reference images, +and only the text-to-image variant takes a [ControlNet](#controlnet). ## License -Qwen Image 2512, Qwen Image Edit 2511, the Lightning LoRAs and the Qwen2.5-VL text encoder are released under **Apache 2.0**, which allows commercial use. None of the downloads is gated. +Qwen Image 2512, Qwen Image Edit 2511, the Lightning LoRAs, the Qwen2.5-VL text encoder and the Qwen Image +ControlNet Union are released under **Apache 2.0**, which allows commercial use. None of the downloads is gated. This is a summary, not legal advice. Read the full license on the model's HuggingFace page before using a model commercially. @@ -125,6 +127,29 @@ Image**; connect an **Image to Latents - Qwen Image** node to the **Reference La Qwen Image LoRAs (diffusers PEFT, Kohya and LoKR formats) are supported and apply to the transformer. In the workflow editor use **Apply LoRA - Qwen Image** or **Apply LoRA Collection - Qwen Image**. +## ControlNet + +The **Qwen Image ControlNet Union** starter model is alibaba-pai's *Fun-ControlNet-Union* for Qwen Image 2512 +(~3.5 GB, Apache 2.0). One model handles every condition: **Canny**, **HED**, **Depth**, **Pose**, **MLSD**, +**Scribble** and **Gray** control images, plus **inpainting**. It is trained for the text-to-image transformer: +with a Qwen Image Edit model selected, a control layer's settings and the **Invoke** button say that the +ControlNet is not compatible, and nothing is generated until the layer is disabled or the model changed. + +On the Canvas, add a **Control Layer** while a Qwen Image model is selected. Its adapter type is **Qwen Image +ControlNet** and its pixels are the control image; the layer's **Filter** turns a raster into one of the +conditions (Canny, HED, Depth Anything, DW Openpose, MLSD, Scribble or Grayscale). The layer's **Weight** is +the model's control scale: it ranges from `0` to `2`, starts at `0.85`, and `0.70` to `0.95` is the +recommended range. **Only one** Qwen Image control layer can be used per generation. + +When the Canvas inpaints or outpaints with a control layer present, the ControlNet also receives the image being +regenerated and the mask of the region as its inpainting condition. Without a control layer, inpainting and +outpainting work as before. + +In the workflow editor, the same thing is the **Qwen Image ControlNet** node feeding the **Control** input of +**Denoise - Qwen Image**. Give it a control **Image**, an **Inpaint Image** together with its **Inpaint Mask** +(white is regenerated), or both. **Denoise - Qwen Image** then also needs its **VAE** input connected, which it +uses to encode these images. + ## PiD super-resolution decode Qwen Image works with [PiD Decode](/users-guide/image-generation/advanced-topics/pid-decode/), which replaces the VAE @@ -137,7 +162,8 @@ Decoder Qwen-Image (2K to 4K)* decoders (including an int8 build of the latter) | ------------------------------------------- | ------------------------------------------------------------------- | | **Main Model - Qwen Image** | Loads the transformer, VAE and Qwen VL encoder (or a component source) | | **Prompt - Qwen Image** | Encodes the prompt and any reference images | -| **Denoise - Qwen Image** | Runs sampling; accepts reference latents, img2img latents and masks | +| **Denoise - Qwen Image** | Runs sampling; accepts reference latents, img2img latents, masks and a ControlNet | +| **Qwen Image ControlNet** | Configures the ControlNet Union: control image and/or inpaint image with mask, scale, step range | | **Image to Latents - Qwen Image** | VAE encode | | **Latents to Image - Qwen Image** | VAE decode | | **Latents to Image - Qwen-Image + PiD (4x SR)** | PiD super-resolution decode | diff --git a/docs/src/content/docs/Users Guide/07.Canvas/02.canvas-guide.mdx b/docs/src/content/docs/Users Guide/07.Canvas/02.canvas-guide.mdx index 01246c552ef..34b59a91a07 100644 --- a/docs/src/content/docs/Users Guide/07.Canvas/02.canvas-guide.mdx +++ b/docs/src/content/docs/Users Guide/07.Canvas/02.canvas-guide.mdx @@ -1,7 +1,7 @@ --- title: Canvas guide description: A detailed guide to the Canvas — its tools and their options, navigation, the header buttons, the generation frame, selections, transform, filters, the staging area, menus, settings and keyboard shortcuts. -lastUpdated: 2026-10-05 +lastUpdated: 2026-10-18 --- import { Image } from 'astro:assets'; @@ -117,7 +117,7 @@ To crop a layer to the generation frame, choose **Crop layer to bbox** from its * **Edge detection** — Canny, HED, Lineart, Lineart Anime, MLSD, PiDiNet and Scribble. * **Depth & normal** — Depth Anything and Normal map. * **Pose & face** — DW Openpose and Mediapipe Face. -* **Color & tone** — Color map and Adjust image. +* **Color & tone** — Color map, Adjust image and Grayscale. * **Blur & noise** — Content shuffle, Blur and Noise. * **Upscale** — an upscaling model. diff --git a/docs/src/content/docs/configuration/Optimization/low-vram-mode.mdx b/docs/src/content/docs/configuration/Optimization/low-vram-mode.mdx index 408b8ce1b1e..c7127113da8 100644 --- a/docs/src/content/docs/configuration/Optimization/low-vram-mode.mdx +++ b/docs/src/content/docs/configuration/Optimization/low-vram-mode.mdx @@ -210,8 +210,8 @@ To always decode untiled unless you ask for tiling, turn this off. A decode too auto_tiled_decode: false ``` -- **Always tile:** set `force_tiled_decode: true` in `invokeai.yaml`. It covers the VAE decode and encode for SD1.5/SDXL, FLUX.1, FLUX.2, Z-Image, Qwen-Image and Qwen-Image-2.1, the Anima encode, the control image of a Z-Image ControlNet, and the Krea-2 style reference. Other model families (for example SD3, Wan and LTX-2) ignore it. -- **Per node:** the SD, FLUX.1, FLUX.2, Z-Image, Qwen-Image and Qwen-Image-2.1 **Latents to Image** and **Image to Latents** nodes, and **Image to Latents - Anima**, have **Tiled** and **Tile Size** fields for workflows. So does the **Z-Image ControlNet** node, for the control image the denoise encodes. The [Upscale panel](/users-guide/image-generation/upscale/) turns tiling on by itself. +- **Always tile:** set `force_tiled_decode: true` in `invokeai.yaml`. It covers the VAE decode and encode for SD1.5/SDXL, FLUX.1, FLUX.2, Z-Image, Qwen-Image and Qwen-Image-2.1, the Anima encode, the control image of a Z-Image ControlNet, the control and inpaint images of a Qwen Image ControlNet, and the Krea-2 style reference. Other model families (for example SD3, Wan and LTX-2) ignore it. +- **Per node:** the SD, FLUX.1, FLUX.2, Z-Image, Qwen-Image and Qwen-Image-2.1 **Latents to Image** and **Image to Latents** nodes, and **Image to Latents - Anima**, have **Tiled** and **Tile Size** fields for workflows. So do the **Z-Image ControlNet** and **Qwen Image ControlNet** nodes, for the images the denoise encodes. The [Upscale panel](/users-guide/image-generation/upscale/) turns tiling on by itself. - **Automatic retry:** if a FLUX.1, FLUX.2, Z-Image or Anima decode, or a FLUX.1 or FLUX.2 encode, runs out of memory, InvokeAI retries it once with tiling and logs that it did. A tiled decode is not pixel-identical to a single-pass one. The VAE looks at the whole image at once, so the difference is spread over the image rather than limited to the tile seams; it is small (for a 1024x1024 FLUX.2 Klein image, 5.6 of 255 per pixel value on average, with no visible seams), but the same seed will not reproduce an untiled result exactly. diff --git a/invokeai/app/invocations/qwen_image/qwen_image_control.py b/invokeai/app/invocations/qwen_image/qwen_image_control.py new file mode 100644 index 00000000000..86404e17962 --- /dev/null +++ b/invokeai/app/invocations/qwen_image/qwen_image_control.py @@ -0,0 +1,118 @@ +"""Qwen Image ControlNet: the alibaba-pai Fun-ControlNet-Union for spatial control and inpainting.""" + +from typing import Optional + +from pydantic import BaseModel, Field, model_validator + +from invokeai.app.invocations.baseinvocation import ( + BaseInvocation, + BaseInvocationOutput, + Classification, + invocation, + invocation_output, +) +from invokeai.app.invocations.fields import FieldDescriptions, ImageField, InputField, OutputField +from invokeai.app.invocations.model import ModelIdentifierField +from invokeai.app.invocations.util import validate_begin_end_step +from invokeai.app.services.shared.invocation_context import InvocationContext +from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType +from invokeai.backend.util.qwen_image_vae import QWEN_IMAGE_VAE_MIN_TILE_SIZE + +_CONTROL_SCALE_DESCRIPTION = "Strength of the control signal. Recommended range: 0.70-0.95." +_BEGIN_DESCRIPTION = "When the control is first applied (% of total steps)" +_END_DESCRIPTION = "When the control is last applied (% of total steps)" +_TILE_SIZE_DESCRIPTION = ( + f"{FieldDescriptions.vae_tile_size} Values between 1 and {QWEN_IMAGE_VAE_MIN_TILE_SIZE} are raised to " + f"{QWEN_IMAGE_VAE_MIN_TILE_SIZE}." +) + + +class QwenImageControlField(BaseModel): + """Qwen Image Fun-ControlNet conditioning: a control image, an inpaint image with its mask, or both.""" + + image_name: str | None = Field(default=None, description="The preprocessed control image (Canny, depth, pose, ...)") + inpaint_image_name: str | None = Field(default=None, description="The image to inpaint") + inpaint_mask_name: str | None = Field(default=None, description="The inpaint mask; white is regenerated") + control_model: ModelIdentifierField = Field(description="The Qwen Image ControlNet model") + control_context_scale: float = Field(default=0.85, ge=0.0, le=2.0, description=_CONTROL_SCALE_DESCRIPTION) + begin_step_percent: float = Field(default=0.0, ge=0.0, le=1.0, description=_BEGIN_DESCRIPTION) + end_step_percent: float = Field(default=1.0, ge=0.0, le=1.0, description=_END_DESCRIPTION) + tiled: bool = Field( + default=False, + description="Encode the control images in tiles. The denoise encodes them at generation size, which for an " + "upscale is the enlarged frame -- too large for an untiled encode on consumer hardware.", + ) + tile_size: int = Field(default=0, ge=0, multiple_of=8, description=_TILE_SIZE_DESCRIPTION) + + +@invocation_output("qwen_image_control_output") +class QwenImageControlOutput(BaseInvocationOutput): + """Qwen Image Control output containing control configuration.""" + + control: QwenImageControlField = OutputField(description="Qwen Image control conditioning") + + +@invocation( + "qwen_image_control", + title="Qwen Image ControlNet", + tags=["image", "qwen_image", "control", "controlnet", "inpaint"], + category="conditioning", + version="1.0.0", + classification=Classification.Prototype, +) +class QwenImageControlInvocation(BaseInvocation): + """Configure the Qwen Image Fun-ControlNet-Union for spatial control, inpainting, or both. + + Takes a preprocessed control image (Canny, HED, depth, pose, MLSD, ...) and/or an image to inpaint with its mask + (white is regenerated), plus the Qwen Image ControlNet model. Recommended control scale: 0.70-0.95. + """ + + image: Optional[ImageField] = InputField( + default=None, description="The preprocessed control image (Canny, HED, depth, pose, MLSD, ...)" + ) + inpaint_image: Optional[ImageField] = InputField( + default=None, description="The image to inpaint. Goes together with the inpaint mask." + ) + inpaint_mask: Optional[ImageField] = InputField( + default=None, + description="The inpaint mask: white is regenerated, black is kept. Goes together with the inpaint image.", + ) + control_model: ModelIdentifierField = InputField( + description=FieldDescriptions.controlnet_model, + title="Control Model", + ui_model_base=BaseModelType.QwenImage, + ui_model_type=ModelType.ControlNet, + ) + control_context_scale: float = InputField( + default=0.85, ge=0.0, le=2.0, description=_CONTROL_SCALE_DESCRIPTION, title="Control Scale" + ) + begin_step_percent: float = InputField(default=0.0, ge=0.0, le=1.0, description=_BEGIN_DESCRIPTION) + end_step_percent: float = InputField(default=1.0, ge=0.0, le=1.0, description=_END_DESCRIPTION) + tiled: bool = InputField(default=False, description=FieldDescriptions.tiled) + # NOTE: tile_size = 0 is a special value, as on the Qwen Image VAE nodes: the workflow UI cannot set None. + tile_size: int = InputField(default=0, ge=0, multiple_of=8, description=_TILE_SIZE_DESCRIPTION) + + @model_validator(mode="after") + def validate_begin_end_step_percent(self): + validate_begin_end_step(self.begin_step_percent, self.end_step_percent) + return self + + def invoke(self, context: InvocationContext) -> QwenImageControlOutput: + # Checked here rather than by a validator: connected inputs are filled in at execution time. + if (self.inpaint_image is None) != (self.inpaint_mask is None): + raise ValueError("The inpaint image and the inpaint mask go together: connect both or neither.") + if self.image is None and self.inpaint_image is None: + raise ValueError("Connect a control image, an inpaint image with its mask, or both.") + return QwenImageControlOutput( + control=QwenImageControlField( + image_name=self.image.image_name if self.image is not None else None, + inpaint_image_name=self.inpaint_image.image_name if self.inpaint_image is not None else None, + inpaint_mask_name=self.inpaint_mask.image_name if self.inpaint_mask is not None else None, + control_model=self.control_model, + control_context_scale=self.control_context_scale, + begin_step_percent=self.begin_step_percent, + end_step_percent=self.end_step_percent, + tiled=self.tiled, + tile_size=self.tile_size, + ) + ) diff --git a/invokeai/app/invocations/qwen_image/qwen_image_denoise.py b/invokeai/app/invocations/qwen_image/qwen_image_denoise.py index 2f63e215783..046e4a7b4de 100644 --- a/invokeai/app/invocations/qwen_image/qwen_image_denoise.py +++ b/invokeai/app/invocations/qwen_image/qwen_image_denoise.py @@ -5,6 +5,7 @@ import torch import torchvision.transforms as tv_transforms from diffusers.models.transformers.transformer_qwenimage import QwenImageTransformer2DModel +from PIL import Image from torchvision.transforms.functional import resize as tv_resize from tqdm import tqdm @@ -20,9 +21,15 @@ WithBoard, WithMetadata, ) -from invokeai.app.invocations.model import TransformerField +from invokeai.app.invocations.model import TransformerField, VAEField from invokeai.app.invocations.primitives import LatentsOutput +from invokeai.app.invocations.qwen_image.qwen_image_control import QwenImageControlField +from invokeai.app.invocations.vae.qwen_image_image_to_latents import QwenImageImageToLatentsInvocation from invokeai.app.services.shared.invocation_context import InvocationContext +from invokeai.backend.fun_controlnet.conditioning import build_qwen_image_control_context +from invokeai.backend.fun_controlnet.hooks import FunControlHooks, install_fun_control, should_apply +from invokeai.backend.fun_controlnet.qwen_image import QwenImageFunControlBranch +from invokeai.backend.model_manager.load.load_base import LoadedModel from invokeai.backend.model_manager.taxonomy import BaseModelType from invokeai.backend.patches.layer_patcher import LayerPatcher, PatchSpec from invokeai.backend.patches.lora_conversions.qwen_image_lora_constants import ( @@ -31,8 +38,12 @@ from invokeai.backend.patches.model_patch_raw import ModelPatchRaw from invokeai.backend.quantization.dequantizing_linear import peak_dequant_transient_bytes, requires_sidecar_patching from invokeai.backend.rectified_flow.rectified_flow_inpaint_extension import RectifiedFlowInpaintExtension -from invokeai.backend.stable_diffusion.diffusers_pipeline import PipelineIntermediateState +from invokeai.backend.stable_diffusion.diffusers_pipeline import ( + PipelineIntermediateState, + image_resized_to_grid_as_tensor, +) from invokeai.backend.stable_diffusion.diffusion.conditioning_data import QwenImageConditioningInfo +from invokeai.backend.util.attention import sdpa_score_matrix_bytes from invokeai.backend.util.devices import TorchDevice from invokeai.backend.util.sage_attention import sage_attention_scope @@ -42,7 +53,7 @@ title="Denoise - Qwen Image", tags=["image", "qwen_image"], category="image", - version="1.0.0", + version="1.1.0", classification=Classification.Prototype, ) class QwenImageDenoiseInvocation(BaseInvocation, WithMetadata, WithBoard): @@ -84,6 +95,16 @@ class QwenImageDenoiseInvocation(BaseInvocation, WithMetadata, WithBoard): "When set, uses a fixed shift (e.g. 3.0 for Lightning LoRAs) instead of the default dynamic shifting. " "Leave unset for the base model's default schedule.", ) + control: Optional[QwenImageControlField] = InputField( + default=None, + description="Qwen Image ControlNet conditioning: spatial control (Canny, depth, pose, ...) and/or inpainting.", + input=Input.Connection, + ) + vae: Optional[VAEField] = InputField( + default=None, + description=FieldDescriptions.vae + " Required for control conditioning.", + input=Input.Connection, + ) @torch.no_grad() def invoke(self, context: InvocationContext) -> LatentsOutput: @@ -251,6 +272,11 @@ def _run_diffusion(self, context: InvocationContext): transformer_info = context.models.load(self.transformer.transformer) assert isinstance(transformer_info.model, QwenImageTransformer2DModel) + has_zero_cond_t = bool( + getattr(transformer_info.model, "zero_cond_t", False) + or getattr(transformer_info.model.config, "zero_cond_t", False) + ) + control_branch_info = self._load_control_branch(context, has_zero_cond_t) # Load conditioning pos_prompt_embeds, pos_prompt_mask = self._load_text_conditioning( @@ -392,12 +418,8 @@ def _run_diffusion(self, context: InvocationContext): # Pack latents into 2x2 patches: (B, C, H, W) -> (B, H/2*W/2, C*4) latents = self._pack_latents(latents, 1, out_channels, latent_height, latent_width) - # Determine whether the model uses reference latent conditioning (zero_cond_t). # Edit models (zero_cond_t=True) expect [noisy_patches ; ref_patches] in the sequence. # Txt2img models (zero_cond_t=False) only take noisy patches. - has_zero_cond_t = getattr(transformer_info.model, "zero_cond_t", False) or getattr( - transformer_info.model.config, "zero_cond_t", False - ) use_ref_latents = has_zero_cond_t ref_latents_packed = None @@ -457,19 +479,71 @@ def _run_diffusion(self, context: InvocationContext): ) noisy_seq_len = latents.shape[1] + model_input_seq_len = noisy_seq_len + (ref_latents_packed.shape[1] if ref_latents_packed is not None else 0) transformer_config = context.models.get_config(self.transformer.transformer) - # An nvfp4 or GGUF build dequantizes each packed Linear per forward, a transient its resident size does not - # cover. The cache holds back the larger of this and its default working memory, not their sum: this node has - # no activation estimate to add it to. Read from the unlocked model, before the lock; zero for every other - # build. - dequant_bytes = peak_dequant_transient_bytes(transformer_info.model, inference_dtype) + num_control_blocks = 0 + control_hidden_size = 0 + if control_branch_info is not None: + assert isinstance(control_branch_info.model, QwenImageFunControlBranch) + num_control_blocks = len(control_branch_info.model.control_blocks) + control_hidden_size = control_branch_info.model.hidden_size + # The forward's activations, which the cache keeps free by offloading as much of the transformer as that + # takes, plus the per-forward dequantization transient of an nvfp4 or GGUF build, alive alongside them and + # invisible to the estimate. All read from the unlocked model, before the lock; the transient is zero for a + # dense build. + text_seq_len = max( + pos_prompt_embeds.shape[1], neg_prompt_embeds.shape[1] if neg_prompt_embeds is not None else 0 + ) + working_mem_bytes = self._estimate_working_memory( + image_seq_len=model_input_seq_len, + text_seq_len=text_seq_len, + element_size=inference_dtype.itemsize, + num_control_blocks=num_control_blocks, + control_hidden_size=control_hidden_size, + ) + # Where SDPA has no fused kernel for the joint [text ; image] sequence (ROCm on Windows, MPS) it materializes + # the score matrices, which the linear term above was not priced for: 24 heads x 4608^2 scores is ~1 GB at + # 1024px with a 512-token prompt. A text mask, when the encoder emits one, narrows which fused kernels apply. + working_mem_bytes += self._attention_score_bytes( + transformer_info.model, + seq_len=model_input_seq_len + text_seq_len, + device=device, + dtype=inference_dtype, + has_attention_mask=pos_prompt_mask is not None or neg_prompt_mask is not None, + ) + working_mem_bytes += peak_dequant_transient_bytes(transformer_info.model, inference_dtype) + + # Encoded ahead of the transformer's lock, so the VAE does not have to fit beside it. + control_context: torch.Tensor | None = None + if control_branch_info is not None: + control_context = self._build_control_context(context, latent_height, latent_width) + control_context = control_context.to(device=device, dtype=inference_dtype) with ExitStack() as exit_stack: (cached_weights, transformer) = exit_stack.enter_context( - transformer_info.model_on_device(working_mem_bytes=dequant_bytes) + transformer_info.model_on_device(working_mem_bytes=working_mem_bytes) ) assert isinstance(transformer, QwenImageTransformer2DModel) + control_hooks: FunControlHooks | None = None + if control_branch_info is not None: + assert self.control is not None and control_context is not None + # Locked with the same working memory: the transformer can no longer be offloaded, so a branch placed + # with only the default reservation would fill the room kept for the forward. + (_, control_branch) = exit_stack.enter_context( + control_branch_info.model_on_device(working_mem_bytes=working_mem_bytes) + ) + assert isinstance(control_branch, QwenImageFunControlBranch) + # Dtype invariant: the loader cast the branch to the device's bfloat16-safe dtype, the policy the + # transformer loaders follow, which is `inference_dtype` wherever this node runs. Should the safe + # dtype ever be another one, the branch still runs its chain in its own dtype and casts every tensor + # on the way in and the hint on the way out (`QwenImageFunControlBranch.block_runner` / `add_hint`), + # so no cache-managed module is cast here. + control_hooks = exit_stack.enter_context( + install_fun_control( + transformer, control_branch, control_context, scale=self.control.control_context_scale + ) + ) # Quantized weights (packed nvfp4 Linears, GGUF, SDNQ) cannot take a direct patch, so their LoRAs ride as # sidecars. Asked of the loaded module tree: a `checkpoint` build may hold packed Linears. model_is_quantized = requires_sidecar_patching(transformer, transformer_config.format) @@ -489,6 +563,13 @@ def _run_diffusion(self, context: InvocationContext): exit_stack.enter_context(sage_attention_scope()) for step_idx, t in enumerate(tqdm(timesteps_sched)): + if control_hooks is not None: + assert self.control is not None + # One gate per step: both guidance branches run with the control, or neither does. + control_hooks.active = should_apply( + step_idx, total_steps, self.control.begin_step_percent, self.control.end_step_percent + ) + # The pipeline passes timestep / 1000 to the transformer timestep = t.expand(latents.shape[0]).to(inference_dtype) @@ -553,6 +634,112 @@ def _run_diffusion(self, context: InvocationContext): latents = latents.unsqueeze(2) return latents + def _load_control_branch(self, context: InvocationContext, has_zero_cond_t: bool) -> LoadedModel | None: + """The control branch in RAM, ahead of the transformer's lock so the reservation can size its hints.""" + if self.control is None: + return None + if self.vae is None: + raise ValueError( + "Qwen Image ControlNet needs the VAE that encodes its images: connect one to the 'vae' input." + ) + if self.reference_latents is not None: + raise ValueError("Qwen Image ControlNet cannot be combined with reference latents.") + # The Fun branch was trained beside the generation transformer. An Edit transformer takes a + # [noisy ; reference] sequence and modulates the two apart (zero_cond_t), a layout the branch never saw. + if has_zero_cond_t: + raise ValueError( + "Qwen Image ControlNet applies to the Qwen Image generation transformer, not to an Edit transformer." + ) + control_branch_info = context.models.load(self.control.control_model) + if not isinstance(control_branch_info.model, QwenImageFunControlBranch): + raise TypeError( + f"Expected a Qwen Image ControlNet for '{self.control.control_model.name}', " + f"got {type(control_branch_info.model).__name__}." + ) + return control_branch_info + + @staticmethod + def _estimate_working_memory( + image_seq_len: int, + text_seq_len: int, + element_size: int, + *, + num_control_blocks: int = 0, + control_hidden_size: int = 0, + ) -> int: + """Peak transformer activations, in bytes, for the model cache to keep free. + + Estimates pending calibration on this transformer. 0.25 MiB per token plus a 1 GiB base are the figures the + Qwen-Image-2.1 node reserves, measured there at 0.14 MiB per token in bf16 on an RTX 4090, with the margin + for the allocator. The per-token term is a bf16 figure and scales with `element_size`, the compute dtype's + width. The guidance branches run one after the other, so CFG adds nothing to the peak. + + A control branch runs its blocks over the image sequence and keeps one hint per block alive until the last + listed base layer has consumed it. `num_control_blocks + 4` hint-sized tensors is what Z-Image measured for + its adapter over the plain forward (`z_image_denoise.py`), pending the same measurement here. + """ + mib, gib = 1024**2, 1024**3 + width = element_size / 2 + estimated = int((image_seq_len + text_seq_len) * 0.25 * mib * width) + gib + if num_control_blocks: + estimated += (num_control_blocks + 4) * image_seq_len * control_hidden_size * element_size + return estimated + + @staticmethod + def _attention_score_bytes( + transformer: object, *, seq_len: int, device: torch.device, dtype: torch.dtype, has_attention_mask: bool + ) -> int: + """The score matrix attention materializes on a build without a fused kernel for it (0 where it has one). + + Every block attends the joint [text ; image] sequence once per forward through diffusers' attention dispatch; + the padding mask, when the encoder emits one, reaches the kernel as an additive mask. + """ + config = getattr(transformer, "config", None) + num_heads = getattr(config, "num_attention_heads", None) + head_dim = getattr(config, "attention_head_dim", None) + if not isinstance(num_heads, int) or not isinstance(head_dim, int): + return 0 + return sdpa_score_matrix_bytes( + device=device, + dtype=dtype, + num_heads=num_heads, + head_dim=head_dim, + seq_len=seq_len, + has_attn_mask=has_attention_mask, + via_diffusers_dispatch=True, + ) + + def _build_control_context(self, context: InvocationContext, latent_height: int, latent_width: int) -> torch.Tensor: + """The packed ``(1, S_img, 132)`` control context at the generation size, from the control field's images.""" + assert self.control is not None and self.vae is not None + control = self.control + vae_info = context.models.load(self.vae.vae) + tiled = control.tiled or context.config.get().force_tiled_decode + + def encode(pixels: torch.Tensor) -> torch.Tensor: + latents = QwenImageImageToLatentsInvocation.vae_encode( + vae_info=vae_info, image_tensor=pixels, tiled=tiled, tile_size=control.tile_size + ) + # The video-style VAE returns (B, C, 1, h, w); the context is one frame. + return latents.squeeze(2) + + def pixels(image_name: str, mode: str) -> torch.Tensor: + image = context.images.get_pil(image_name).convert(mode) + resample = Image.Resampling.LANCZOS if mode == "RGB" else Image.Resampling.BILINEAR + image = image.resize((self.width, self.height), resample) + # (1, C, H, W): pixels in [-1, 1], a mask in [0, 1]. + return image_resized_to_grid_as_tensor(image, normalize=mode == "RGB", multiple_of=16).unsqueeze(0) + + context_4d = build_qwen_image_control_context( + encode=encode, + control_image=pixels(control.image_name, "RGB") if control.image_name is not None else None, + inpaint_image=( + pixels(control.inpaint_image_name, "RGB") if control.inpaint_image_name is not None else None + ), + inpaint_mask=pixels(control.inpaint_mask_name, "L") if control.inpaint_mask_name is not None else None, + ) + return self._pack_latents(context_4d, 1, context_4d.shape[1], latent_height, latent_width) + def _build_step_callback(self, context: InvocationContext) -> Callable[[PipelineIntermediateState], None]: def step_callback(state: PipelineIntermediateState) -> None: context.util.sd_step_callback(state, BaseModelType.QwenImage) diff --git a/invokeai/backend/architectures/defs/qwen_image.py b/invokeai/backend/architectures/defs/qwen_image.py index 6f1f3758834..44dd5d5de88 100644 --- a/invokeai/backend/architectures/defs/qwen_image.py +++ b/invokeai/backend/architectures/defs/qwen_image.py @@ -31,6 +31,7 @@ dimension_grid=16, guidance_label="CFG", scheduler_set="standard", + control_kinds=frozenset({"qwen_image_control"}), max_reference_images=5, reference_images_require_variant="edit", ), diff --git a/invokeai/backend/architectures/facets/features.py b/invokeai/backend/architectures/facets/features.py index 0cae3669ef3..4c12a4b90f1 100644 --- a/invokeai/backend/architectures/facets/features.py +++ b/invokeai/backend/architectures/facets/features.py @@ -20,7 +20,11 @@ NegativePromptUsage = Literal["always", "cfg-gated", "never"] """`cfg-gated` means the field exists but only does anything above CFG 1 — the distilled models.""" -ControlKind = Literal["controlnet", "t2i_adapter", "control_lora", "z_image_control", "anima_lllite"] +ControlKind = Literal[ + "controlnet", "t2i_adapter", "control_lora", "z_image_control", "anima_lllite", "qwen_image_control" +] +"""A kind names the graph node webv2 compiles a control layer to, so an architecture with its own control node +is its own kind -- the Z-Image and Qwen-Image Fun branches are the same design and still two kinds.""" SchedulerSet = Literal["standard", "flow", "flow-no-lcm", "anima"] """Which family of schedulers to offer. `None` means the architecture drives its own and offers no diff --git a/invokeai/backend/fun_controlnet/__init__.py b/invokeai/backend/fun_controlnet/__init__.py new file mode 100644 index 00000000000..357a39cd731 --- /dev/null +++ b/invokeai/backend/fun_controlnet/__init__.py @@ -0,0 +1,8 @@ +"""Fun-style control branches (alibaba-pai VideoX-Fun), run beside a base transformer through forward hooks. + +Every Fun control model follows one recipe: the control context is projected to the block width, runs through a short +chain of blocks that are the base transformer's block plus two projections, and each block's ``after_proj`` output is +added to the base image stream after a listed base layer. ``branch.py`` holds the recipe and the seams a family fills +in, ``hooks.py`` attaches a branch to a transformer without touching its forward, and a module per family +(``qwen_image.py``) supplies the block class, the layer map and the calling convention. +""" diff --git a/invokeai/backend/fun_controlnet/branch.py b/invokeai/backend/fun_controlnet/branch.py new file mode 100644 index 00000000000..8717ad6d3c4 --- /dev/null +++ b/invokeai/backend/fun_controlnet/branch.py @@ -0,0 +1,84 @@ +from abc import ABC, abstractmethod +from collections.abc import Callable, Mapping, Sequence +from typing import Any + +import torch +from torch import nn + +BlockRunner = Callable[[nn.Module, torch.Tensor], torch.Tensor] +"""Runs one control block on the control image stream and returns the stream it produced. Whatever else the block +takes and updates (its own text stream, modulation, RoPE) the family closes over.""" + + +class FunControlBranch(nn.Module, ABC): + """``control_img_in`` and ``control_blocks``, with the base layers their hints land on. + + ``control_layers[k]`` is the index of the base block after whose output ``control_blocks[k]``'s hint is added. + Block 0 carries ``before_proj`` and every block ``after_proj``, both ``Linear(hidden, hidden)``; the family's block + class adds them to the base block it subclasses, and keeps that block's ``forward``. + + The abstract methods are the family seams the hooks go through: which base blocks to hook, how to read the base + image stream from block 0's arguments, how to call a control block with them, and where in a block's output the hint + goes. + """ + + def __init__( + self, control_img_in: nn.Linear, control_blocks: Sequence[nn.Module], control_layers: Sequence[int] + ) -> None: + super().__init__() + layers = tuple(control_layers) + if len(control_blocks) != len(layers) or not layers: + raise ValueError(f"{len(control_blocks)} control blocks for base layers {layers}: one block per layer.") + # The hooks drop the hints once the last listed layer has taken its share, which needs the layers in order. + if layers[0] < 0 or any(later <= earlier for earlier, later in zip(layers, layers[1:], strict=False)): + raise ValueError(f"Control layers must be non-negative and strictly increasing, got {layers}.") + self.control_img_in = control_img_in + self.control_blocks = nn.ModuleList(control_blocks) + self.control_layers = layers + + @property + def hidden_size(self) -> int: + return self.control_img_in.out_features + + @property + def control_in_dim(self) -> int: + return self.control_img_in.in_features + + @property + def dtype(self) -> torch.dtype: + return self.control_img_in.weight.dtype + + def compute_hints( + self, control_context: torch.Tensor, x: torch.Tensor, run_block: BlockRunner + ) -> list[torch.Tensor]: + """One hint per control block, from the control context and the base image stream ``x`` as it enters base + block 0. The chain runs in the branch's dtype; ``add_hint`` casts back.""" + c = self.control_img_in(control_context.to(self.dtype)) + hints: list[torch.Tensor] = [] + for index, block in enumerate(self.control_blocks): + if index == 0: + c = block.before_proj(c) + x.to(c.dtype) + c = run_block(block, c) + hints.append(block.after_proj(c)) + return hints + + @abstractmethod + def base_blocks(self, transformer: nn.Module) -> Sequence[nn.Module]: + """The base transformer's blocks, indexed as ``control_layers`` are.""" + + @abstractmethod + def base_hidden_size(self, transformer: nn.Module) -> int: + """The width of the base image stream the hints are added to.""" + + @abstractmethod + def image_stream(self, block_inputs: Mapping[str, Any]) -> torch.Tensor: + """The base image stream among base block 0's bound forward arguments.""" + + @abstractmethod + def block_runner(self, block_inputs: Mapping[str, Any]) -> BlockRunner: + """A runner that calls a control block the way the base called its block 0, threading the branch's own copy of + whatever else the block updates from call to call.""" + + @abstractmethod + def add_hint(self, output: Any, hint: torch.Tensor, scale: float) -> Any: + """A base block's ``output`` with ``hint * scale`` added to its image stream and nothing else touched.""" diff --git a/invokeai/backend/fun_controlnet/conditioning.py b/invokeai/backend/fun_controlnet/conditioning.py new file mode 100644 index 00000000000..73e9ae9d226 --- /dev/null +++ b/invokeai/backend/fun_controlnet/conditioning.py @@ -0,0 +1,61 @@ +from collections.abc import Callable + +import torch +import torch.nn.functional as F + +Encoder = Callable[[torch.Tensor], torch.Tensor] +"""Encodes pixels ``(1, 3, H, W)`` in [-1, 1] to the normalized latents ``(1, C, H/8, W/8)`` the denoise works in.""" + + +def build_qwen_image_control_context( + *, + encode: Encoder, + control_image: torch.Tensor | None = None, + inpaint_image: torch.Tensor | None = None, + inpaint_mask: torch.Tensor | None = None, +) -> torch.Tensor: + """The latent-space control context ``(1, 2C + 1, h, w)``: ``[control latents | keep mask | masked-image latents]``. + + VideoX-Fun ``pipeline_qwenimage_control.py``: the control image is encoded like the generation latents; the inpaint + mask ``(1, 1, H, W)`` in [0, 1] is thresholded at 0.5 (white is regenerated) and its complement nearest-sampled to + latent resolution as the keep mask, so the channel is exactly 0 or 1 even for a blurred mask; the inpaint image is + encoded with the regenerated pixels zeroed. Pure control leaves the inpaint channels at zero, pure inpaint the + control latents; the union checkpoint reads both. The denoise packs the result 2x2 the way it packs its latents. + """ + if (inpaint_image is None) != (inpaint_mask is None): + raise ValueError("An inpaint image and its mask go together.") + if control_image is None and inpaint_image is None: + raise ValueError("A control context needs a control image, an inpaint image with its mask, or both.") + + control_latents = encode(control_image) if control_image is not None else None + masked_latents = keep_mask = None + if inpaint_image is not None and inpaint_mask is not None: + if inpaint_mask.shape[-2:] != inpaint_image.shape[-2:]: + raise ValueError( + f"The inpaint mask {tuple(inpaint_mask.shape[-2:])} must be the size of the inpaint image " + f"{tuple(inpaint_image.shape[-2:])}." + ) + regenerate = inpaint_mask >= 0.5 + masked_latents = encode(inpaint_image * (~regenerate).to(inpaint_image.dtype)) + keep_mask = F.interpolate( + (~regenerate).to(device=masked_latents.device, dtype=masked_latents.dtype), + size=masked_latents.shape[-2:], + mode="nearest", + ) + if control_latents is not None and masked_latents is not None and control_latents.shape != masked_latents.shape: + raise ValueError( + f"The control image encodes to {tuple(control_latents.shape)} and the inpaint image to " + f"{tuple(masked_latents.shape)}; both must be the generation size." + ) + + reference = control_latents if control_latents is not None else masked_latents + assert reference is not None + batch, channels, height, width = reference.shape + return torch.cat( + [ + control_latents if control_latents is not None else reference.new_zeros((batch, channels, height, width)), + keep_mask if keep_mask is not None else reference.new_zeros((batch, 1, height, width)), + masked_latents if masked_latents is not None else reference.new_zeros((batch, channels, height, width)), + ], + dim=1, + ) diff --git a/invokeai/backend/fun_controlnet/hooks.py b/invokeai/backend/fun_controlnet/hooks.py new file mode 100644 index 00000000000..0f18378f414 --- /dev/null +++ b/invokeai/backend/fun_controlnet/hooks.py @@ -0,0 +1,110 @@ +import inspect +from collections.abc import Callable, Iterator, Sequence +from contextlib import contextmanager +from typing import Any + +import torch +from torch import nn +from torch.utils.hooks import RemovableHandle + +from invokeai.backend.fun_controlnet.branch import FunControlBranch + + +def should_apply(step_index: int, total_steps: int, begin_step_percent: float, end_step_percent: float) -> bool: + """Whether the control applies at a step: ``begin <= step_index / total_steps <= end``, both ends included, as the + Z-Image control extension counts.""" + if total_steps <= 0: + return True + return begin_step_percent <= step_index / total_steps <= end_step_percent + + +class FunControlHooks: + """The hooks a branch is installed with. ``active`` gates the forwards that follow without re-installing. + + Base block 0's pre-hook computes the hints from that forward's real arguments; the post-hook of each listed base + block adds its hint and the last one drops them, so no hint of one forward reaches the next and nothing stays alive + through the layers that come after the last listed one. + """ + + def __init__( + self, branch: FunControlBranch, blocks: Sequence[nn.Module], control_context: torch.Tensor, scale: float + ) -> None: + self.active = True + self._branch = branch + self._control_context = control_context + self._scale = scale + self._hints: list[torch.Tensor] | None = None + # Bound once: the base calls its blocks by keyword, a checkpointing caller by position, and the family reads + # the arguments by name either way. + self._signature = inspect.signature(blocks[0].forward) + last_layer = branch.control_layers[-1] + self._handles: list[RemovableHandle] = [ + blocks[0].register_forward_pre_hook(self._compute_hints, with_kwargs=True) + ] + for position, layer in enumerate(branch.control_layers): + self._handles.append( + blocks[layer].register_forward_hook(self._hint_adder(position, clear=layer == last_layer)) + ) + + def _compute_hints(self, _module: nn.Module, args: tuple[Any, ...], kwargs: dict[str, Any]) -> None: + # Block 0 runs first in every forward: whatever a previous forward left behind is stale here. + self._hints = None + if not self.active: + return None + bound = self._signature.bind(*args, **kwargs) + bound.apply_defaults() + inputs = bound.arguments + self._hints = self._branch.compute_hints( + self._control_context, self._branch.image_stream(inputs), self._branch.block_runner(inputs) + ) + return None + + def _hint_adder(self, position: int, clear: bool) -> Callable[[nn.Module, tuple[Any, ...], Any], Any]: + def add_hint(_module: nn.Module, _args: tuple[Any, ...], output: Any) -> Any: + if self._hints is None: + return None + hint = self._hints[position] + if clear: + self._hints = None + return self._branch.add_hint(output, hint, self._scale) + + return add_hint + + def remove(self) -> None: + for handle in self._handles: + handle.remove() + self._handles.clear() + self._hints = None + + +@contextmanager +def install_fun_control( + transformer: nn.Module, branch: FunControlBranch, control_context: torch.Tensor, *, scale: float +) -> Iterator[FunControlHooks]: + """Run ``transformer`` with ``branch``'s hints for the duration of the context. + + The hints are recomputed on every forward (each denoising step, each guidance branch) from the control context, + which is the same for both guidance branches. The hooks come off on exit however the body ends: the blocks belong to + the model cache and outlive this call. + """ + blocks = branch.base_blocks(transformer) + base_hidden_size = branch.base_hidden_size(transformer) + if base_hidden_size != branch.hidden_size: + raise ValueError( + f"The control branch is {branch.hidden_size} wide and the transformer {base_hidden_size}: " + "this is not a control model for this transformer." + ) + if len(blocks) <= branch.control_layers[-1]: + raise ValueError( + f"The control branch adds hints after base layers {branch.control_layers}; " + f"this transformer has {len(blocks)} blocks." + ) + if control_context.dim() != 3 or control_context.shape[-1] != branch.control_in_dim: + raise ValueError( + f"The control context must be (batch, tokens, {branch.control_in_dim}), got {tuple(control_context.shape)}." + ) + hooks = FunControlHooks(branch, blocks, control_context, scale) + try: + yield hooks + finally: + hooks.remove() diff --git a/invokeai/backend/fun_controlnet/qwen_image.py b/invokeai/backend/fun_controlnet/qwen_image.py new file mode 100644 index 00000000000..df8d5685a1b --- /dev/null +++ b/invokeai/backend/fun_controlnet/qwen_image.py @@ -0,0 +1,157 @@ +"""Qwen-Image Fun-ControlNet-Union: the control branch alibaba-pai trained for the Qwen-Image generation transformer. + +Reference: VideoX-Fun ``videox_fun/models/qwenimage_transformer2d_control.py`` and +``pipeline_qwenimage_control.py``; ComfyUI mirrors it in ``comfy/ldm/qwen_image/controlnet.py``. +""" + +from collections.abc import Mapping, Sequence +from typing import Any + +import accelerate +import torch +from diffusers.models.transformers.transformer_qwenimage import QwenImageTransformerBlock +from torch import nn + +from invokeai.backend.fun_controlnet.branch import BlockRunner, FunControlBranch + +# VideoX-Fun `config/qwenimage/qwenimage_control.yaml`: five control blocks, their hints added after these base +# blocks. The checkpoint carries no config, so the map is a constant of the family. +QWEN_IMAGE_FUN_CONTROL_LAYERS: tuple[int, ...] = (0, 12, 24, 36, 48) +# 33 latent channels -- control latents (16), inpaint keep mask (1), masked-image latents (16) -- packed 2x2. +QWEN_IMAGE_FUN_CONTROL_IN_DIM = 132 +# Qwen-Image attention heads are 128 wide. The checkpoint does not say, so the head count follows from the width. +QWEN_IMAGE_ATTENTION_HEAD_DIM = 128 + +_IMAGE_STREAM = "hidden_states" +_TEXT_STREAM = "encoder_hidden_states" + + +class QwenImageFunControlBlock(QwenImageTransformerBlock): + """A Qwen-Image block plus the two projections of the control recipe; ``forward`` is the base block's.""" + + def __init__(self, *, dim: int, num_attention_heads: int, attention_head_dim: int, first: bool) -> None: + super().__init__(dim=dim, num_attention_heads=num_attention_heads, attention_head_dim=attention_head_dim) + if first: + self.before_proj = nn.Linear(dim, dim) + self.after_proj = nn.Linear(dim, dim) + + +class QwenImageFunControlBranch(FunControlBranch): + """The branch for ``QwenImageTransformer2DModel``: control blocks thread their own text stream beside the base's. + + The hint is added to the image stream only. ``modulate_index`` and ``zero_cond_t`` belong to the Edit transformer, + which the checkpoint was not trained on; the denoise refuses that pairing before anything is installed. + """ + + def __init__( + self, + *, + hidden_size: int, + num_attention_heads: int, + attention_head_dim: int, + control_in_dim: int = QWEN_IMAGE_FUN_CONTROL_IN_DIM, + control_layers: Sequence[int] = QWEN_IMAGE_FUN_CONTROL_LAYERS, + ) -> None: + blocks = [ + QwenImageFunControlBlock( + dim=hidden_size, + num_attention_heads=num_attention_heads, + attention_head_dim=attention_head_dim, + first=index == 0, + ) + for index in range(len(control_layers)) + ] + super().__init__(nn.Linear(control_in_dim, hidden_size), blocks, control_layers) + + @classmethod + def from_state_dict( + cls, + sd: Mapping[str, torch.Tensor], + *, + dtype: torch.dtype, + control_layers: Sequence[int] = QWEN_IMAGE_FUN_CONTROL_LAYERS, + attention_head_dim: int = QWEN_IMAGE_ATTENTION_HEAD_DIM, + ) -> "QwenImageFunControlBranch": + """Build the branch the checkpoint describes and load it, cast to ``dtype``. + + The geometry is read off the tensors: the width and input features from ``control_img_in.weight``, the block + count from the highest ``control_blocks.N`` index. Anything that is not the Qwen-Image recipe is refused by + name rather than loaded into a branch that would run and produce noise. + """ + weight = sd.get("control_img_in.weight") + if weight is None or weight.dim() != 2: + raise ValueError("Not a Qwen Image Fun-ControlNet checkpoint: `control_img_in.weight` is missing.") + hidden_size, control_in_dim = weight.shape + if control_in_dim != QWEN_IMAGE_FUN_CONTROL_IN_DIM: + raise ValueError( + f"Qwen Image Fun-ControlNet takes {QWEN_IMAGE_FUN_CONTROL_IN_DIM} control features per token (33 latent " + f"channels packed 2x2); this checkpoint's `control_img_in` takes {control_in_dim}." + ) + if hidden_size % attention_head_dim: + raise ValueError( + f"A {hidden_size}-wide branch cannot be split into {attention_head_dim}-wide attention heads." + ) + layers = tuple(control_layers) + block_indices = { + int(parts[1]) + for key in sd + if (parts := key.split(".")) and parts[0] == "control_blocks" and parts[1].isdigit() + } + num_blocks = max(block_indices, default=-1) + 1 + if num_blocks != len(layers): + raise ValueError( + f"This checkpoint has {num_blocks} control blocks; the Qwen Image recipe places {len(layers)} after base " + f"layers {layers}." + ) + + with accelerate.init_empty_weights(): + branch = cls( + hidden_size=hidden_size, + num_attention_heads=hidden_size // attention_head_dim, + attention_head_dim=attention_head_dim, + control_in_dim=control_in_dim, + control_layers=layers, + ) + missing, unexpected = branch.load_state_dict(dict(sd), strict=False, assign=True) + if missing or unexpected: + raise ValueError( + "This checkpoint does not match the Qwen Image control block layout: " + f"missing {sorted(missing)[:5]}, unexpected {sorted(unexpected)[:5]}." + ) + return branch.to(dtype=dtype).eval() + + def base_blocks(self, transformer: nn.Module) -> Sequence[nn.Module]: + return transformer.transformer_blocks + + def base_hidden_size(self, transformer: nn.Module) -> int: + return transformer.inner_dim + + def image_stream(self, block_inputs: Mapping[str, Any]) -> torch.Tensor: + return block_inputs[_IMAGE_STREAM] + + def block_runner(self, block_inputs: Mapping[str, Any]) -> BlockRunner: + # Mask, modulation input, RoPE, attention kwargs: the control blocks take exactly what the base block took. + # VideoX-Fun hands the base's `encoder_hidden_states_mask` to the control blocks; ComfyUI's mirror forces it to + # None. Both agree whenever every text token is valid, which is when Invoke's encoder passes None, so the + # VideoX reading is kept here -- do not "fix" it toward ComfyUI. + # The chain runs in the branch's dtype end to end: the floating inputs (the modulation input) are cast on the + # way in, like `c` and the text stream, and the hint on the way out (`add_hint`). RoPE is complex and the mask + # boolean; neither is touched. + passthrough = { + name: value.to(self.dtype) if isinstance(value, torch.Tensor) and value.is_floating_point() else value + for name, value in block_inputs.items() + if name not in (_IMAGE_STREAM, _TEXT_STREAM) + } + # The chain starts from the base's text stream as it enters block 0 and carries its own copy from then on. + text_stream = block_inputs[_TEXT_STREAM].to(self.dtype) + + def run(block: nn.Module, c: torch.Tensor) -> torch.Tensor: + nonlocal text_stream + text_stream, c = block(hidden_states=c, encoder_hidden_states=text_stream, **passthrough) + return c + + return run + + def add_hint(self, output: Any, hint: torch.Tensor, scale: float) -> Any: + encoder_hidden_states, hidden_states = output + return encoder_hidden_states, hidden_states + (hint * scale).to(hidden_states.dtype) diff --git a/invokeai/backend/model_manager/configs/controlnet.py b/invokeai/backend/model_manager/configs/controlnet.py index 890172e00fb..2a3ab146b16 100644 --- a/invokeai/backend/model_manager/configs/controlnet.py +++ b/invokeai/backend/model_manager/configs/controlnet.py @@ -280,6 +280,54 @@ def _validate_looks_like_z_image_control(cls, mod: ModelOnDisk) -> None: raise NotAMatchError("state dict does not look like a Z-Image Control model") +# `control_img_in` takes 132 packed channels into Qwen-Image's 3072-wide stream. The Qwen-Image-2.1 Fun branch +# takes 129 into 4096 and the FLUX.2 one 260 into 6144, so the shape alone tells the three apart. +_QWEN_IMAGE_FUN_CONTROL_IMG_IN_SHAPE = (3072, 132) + + +def _has_qwen_image_fun_control_keys(state_dict: dict) -> bool: + """Check if state dict is a Qwen-Image Fun-ControlNet branch (alibaba-pai's VACE-style union adapter). + + The branch is `control_img_in` plus `control_blocks.N`, copies of Qwen-Image's dual-stream + `QwenImageTransformerBlock` with `before_proj`/`after_proj` taps. Its siblings reuse the naming, so the + fingerprint is the projection shape and the dual-stream `img_mod`, which the single-stream Qwen-Image-2.1 + branch lacks. + """ + control_img_in = state_dict.get("control_img_in.weight") + shape = getattr(control_img_in, "shape", None) + if shape is None or tuple(shape) != _QWEN_IMAGE_FUN_CONTROL_IMG_IN_SHAPE: + return False + return "control_blocks.0.img_mod.1.weight" in state_dict + + +class ControlNet_Checkpoint_QwenImage_Config(Checkpoint_Config_Base, Config_Base): + """Model config for Qwen-Image Fun-ControlNet adapter models (Safetensors checkpoint). + + Qwen-Image Fun-ControlNets are standalone adapters containing only the control branch + (control_img_in, control_blocks) that extends the base Qwen-Image transformer with spatial + conditioning capabilities. + + Supports: Canny, HED, Depth, Pose, MLSD, Scribble, Gray, inpainting. + Recommended control_context_scale: 0.70-0.95. + """ + + type: Literal[ModelType.ControlNet] = Field(default=ModelType.ControlNet) + format: Literal[ModelFormat.Checkpoint] = Field(default=ModelFormat.Checkpoint) + base: Literal[BaseModelType.QwenImage] = Field(default=BaseModelType.QwenImage) + default_settings: ControlAdapterDefaultSettings | None = Field(None) + + @classmethod + def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) -> Self: + raise_if_not_file(mod) + + raise_for_override_fields(cls, override_fields) + + if not _has_qwen_image_fun_control_keys(mod.load_state_dict()): + raise NotAMatchError("state dict does not look like a Qwen-Image Fun-ControlNet") + + return cls(**override_fields) + + def _has_anima_lllite_keys(state_dict: dict) -> bool: """Check if state dict contains Anima ControlNet-LLLite specific keys. diff --git a/invokeai/backend/model_manager/configs/factory.py b/invokeai/backend/model_manager/configs/factory.py index 27553c2200c..d42fbb1ff08 100644 --- a/invokeai/backend/model_manager/configs/factory.py +++ b/invokeai/backend/model_manager/configs/factory.py @@ -26,6 +26,7 @@ ControlAdapterDefaultSettings, ControlNet_Checkpoint_Anima_Config, ControlNet_Checkpoint_FLUX_Config, + ControlNet_Checkpoint_QwenImage_Config, ControlNet_Checkpoint_SD1_Config, ControlNet_Checkpoint_SD2_Config, ControlNet_Checkpoint_SDXL_Config, @@ -493,6 +494,7 @@ def has_model_export(module: Any, name: Any, expected_bases: tuple[type, ...]) - Annotated[ControlNet_Checkpoint_FLUX_Config, ControlNet_Checkpoint_FLUX_Config.get_tag()], Annotated[ControlNet_Checkpoint_ZImage_Config, ControlNet_Checkpoint_ZImage_Config.get_tag()], Annotated[ControlNet_Checkpoint_Anima_Config, ControlNet_Checkpoint_Anima_Config.get_tag()], + Annotated[ControlNet_Checkpoint_QwenImage_Config, ControlNet_Checkpoint_QwenImage_Config.get_tag()], # ControlNet - diffusers format Annotated[ControlNet_Diffusers_SD1_Config, ControlNet_Diffusers_SD1_Config.get_tag()], Annotated[ControlNet_Diffusers_SD2_Config, ControlNet_Diffusers_SD2_Config.get_tag()], diff --git a/invokeai/backend/model_manager/load/model_loaders/fun_controlnet.py b/invokeai/backend/model_manager/load/model_loaders/fun_controlnet.py new file mode 100644 index 00000000000..da58d7b2521 --- /dev/null +++ b/invokeai/backend/model_manager/load/model_loaders/fun_controlnet.py @@ -0,0 +1,44 @@ +"""Loaders for Fun-ControlNet branches (alibaba-pai VideoX-Fun); today the Qwen-Image Fun-ControlNet-Union.""" + +from pathlib import Path +from typing import Optional + +from safetensors.torch import load_file + +from invokeai.backend.fun_controlnet.qwen_image import QwenImageFunControlBranch +from invokeai.backend.model_manager.configs.base import Checkpoint_Config_Base +from invokeai.backend.model_manager.configs.factory import AnyModelConfig +from invokeai.backend.model_manager.load.fp8_capability import Unimplemented +from invokeai.backend.model_manager.load.load_default import ModelLoader +from invokeai.backend.model_manager.load.model_loader_registry import ModelLoaderRegistry +from invokeai.backend.model_manager.taxonomy import AnyModel, BaseModelType, ModelFormat, ModelType, SubModelType +from invokeai.backend.quantization.fp8_scaled import reject_quantized_side_channel +from invokeai.backend.util.devices import TorchDevice + + +@ModelLoaderRegistry.register( + base=BaseModelType.QwenImage, + type=ModelType.ControlNet, + format=ModelFormat.Checkpoint, + fp8_storage=Unimplemented( + "the branch is cast to the compute dtype at load and runs as its own module tree, so the layerwise cast would " + "fit; at 3.5 GB in bf16 it is worth closing" + ), +) +class QwenImageFunControlNetLoader(ModelLoader): + """Loads the Qwen-Image Fun-ControlNet-Union branch from its safetensors file. + + The file carries no config: the branch's geometry is read off its tensors and the base-layer map is the family's + constant (`QWEN_IMAGE_FUN_CONTROL_LAYERS`). + """ + + def _load_model(self, config: AnyModelConfig, submodel_type: Optional[SubModelType] = None) -> AnyModel: + path = Path(config.path) + if not isinstance(config, Checkpoint_Config_Base): + raise ValueError("Only checkpoint configs are supported here.") + sd = load_file(path) + # Before the geometry probe: the shapes it reads mean nothing on a packed weight, and no scale is folded here. + reject_quantized_side_channel(sd, f"Qwen Image ControlNet checkpoint {path.name}") + return QwenImageFunControlBranch.from_state_dict( + sd, dtype=TorchDevice.choose_bfloat16_safe_dtype(self._torch_device) + ) diff --git a/invokeai/backend/model_manager/starter_models/__init__.py b/invokeai/backend/model_manager/starter_models/__init__.py index a7b2a814a04..866181eb078 100644 --- a/invokeai/backend/model_manager/starter_models/__init__.py +++ b/invokeai/backend/model_manager/starter_models/__init__.py @@ -208,6 +208,7 @@ qwen_image_edit_gguf_q8_0, qwen_image_edit_lightning_4step, qwen_image_edit_lightning_8step, + qwen_image_fun_controlnet_union, qwen_image_gguf_q2_k, qwen_image_gguf_q4_k_m, qwen_image_gguf_q6_k, @@ -461,6 +462,7 @@ qwen_image_gguf_q8_0, qwen_image_lightning_4step, qwen_image_lightning_8step, + qwen_image_fun_controlnet_union, flux_krea, flux_krea_quantized, z_image_turbo, @@ -681,6 +683,7 @@ qwen_image_gguf_q8_0, qwen_image_lightning_4step, qwen_image_lightning_8step, + qwen_image_fun_controlnet_union, ] anima_bundle: list[StarterModel] = [ diff --git a/invokeai/backend/model_manager/starter_models/qwen_image.py b/invokeai/backend/model_manager/starter_models/qwen_image.py index fcdbab05aca..028be0b828c 100644 --- a/invokeai/backend/model_manager/starter_models/qwen_image.py +++ b/invokeai/backend/model_manager/starter_models/qwen_image.py @@ -196,3 +196,13 @@ "Settings: Steps=8, CFG=1, Shift Override=3.", type=ModelType.LoRA, ) + +# region Qwen Image ControlNet +qwen_image_fun_controlnet_union = StarterModel( + name="Qwen Image ControlNet Union", + base=BaseModelType.QwenImage, + source="https://huggingface.co/alibaba-pai/Qwen-Image-2512-Fun-Controlnet-Union/resolve/main/Qwen-Image-2512-Fun-Controlnet-Union-2602.safetensors", + description="Unified ControlNet for Qwen Image 2512 supporting Canny, HED, Depth, Pose, MLSD, Scribble and Gray " + "control images, plus inpainting. Works best at weights 0.70-0.95. Apache-2.0. ~3.5GB", + type=ModelType.ControlNet, +) diff --git a/invokeai/frontend/api/openapi.json b/invokeai/frontend/api/openapi.json index 683424ebbfb..c929139d5cb 100644 --- a/invokeai/frontend/api/openapi.json +++ b/invokeai/frontend/api/openapi.json @@ -1601,6 +1601,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -2098,6 +2101,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -2595,6 +2601,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -3137,6 +3146,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -3706,6 +3718,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -5147,6 +5162,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -19832,6 +19850,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -20413,7 +20434,14 @@ "control_kinds": { "items": { "type": "string", - "enum": ["controlnet", "t2i_adapter", "control_lora", "z_image_control", "anima_lllite"] + "enum": [ + "controlnet", + "t2i_adapter", + "control_lora", + "z_image_control", + "anima_lllite", + "qwen_image_control" + ] }, "type": "array", "title": "Control Kinds", @@ -27678,6 +27706,153 @@ ], "title": "ControlNet_Checkpoint_FLUX_Config" }, + "ControlNet_Checkpoint_QwenImage_Config": { + "properties": { + "key": { + "type": "string", + "title": "Key", + "description": "A unique key for this model." + }, + "hash": { + "type": "string", + "title": "Hash", + "description": "The hash of the model file(s)." + }, + "path": { + "type": "string", + "title": "Path", + "description": "Path to the model on the filesystem. Relative paths are relative to the Invoke root directory." + }, + "file_size": { + "type": "integer", + "title": "File Size", + "description": "The size of the model in bytes." + }, + "name": { + "type": "string", + "title": "Name", + "description": "Name of the model." + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description", + "description": "Model description" + }, + "source": { + "type": "string", + "title": "Source", + "description": "The original source of the model (path, URL or repo_id)." + }, + "source_type": { + "$ref": "#/components/schemas/ModelSourceType", + "description": "The type of source" + }, + "source_api_response": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Source Api Response", + "description": "The original API response from the source, as stringified JSON." + }, + "source_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Source Url", + "description": "Optional URL for the model (e.g. download page or model page)." + }, + "cover_image": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Cover Image", + "description": "Url for image to preview model" + }, + "config_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Config Path", + "description": "Path to the config for this model, if any." + }, + "type": { + "type": "string", + "const": "controlnet", + "title": "Type", + "default": "controlnet" + }, + "format": { + "type": "string", + "const": "checkpoint", + "title": "Format", + "default": "checkpoint" + }, + "base": { + "type": "string", + "const": "qwen-image", + "title": "Base", + "default": "qwen-image" + }, + "default_settings": { + "anyOf": [ + { + "$ref": "#/components/schemas/ControlAdapterDefaultSettings" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": [ + "key", + "hash", + "path", + "file_size", + "name", + "description", + "source", + "source_type", + "source_api_response", + "source_url", + "cover_image", + "config_path", + "type", + "format", + "base", + "default_settings" + ], + "title": "ControlNet_Checkpoint_QwenImage_Config", + "description": "Model config for Qwen-Image Fun-ControlNet adapter models (Safetensors checkpoint).\n\nQwen-Image Fun-ControlNets are standalone adapters containing only the control branch\n(control_img_in, control_blocks) that extends the base Qwen-Image transformer with spatial\nconditioning capabilities.\n\nSupports: Canny, HED, Depth, Pose, MLSD, Scribble, Gray, inpainting.\nRecommended control_context_scale: 0.70-0.95." + }, "ControlNet_Checkpoint_SD1_Config": { "properties": { "key": { @@ -43685,6 +43860,9 @@ { "$ref": "#/components/schemas/QwenImage21TextEncoderInvocation" }, + { + "$ref": "#/components/schemas/QwenImageControlInvocation" + }, { "$ref": "#/components/schemas/QwenImageDenoiseInvocation" }, @@ -44342,6 +44520,9 @@ { "$ref": "#/components/schemas/QwenImageConditioningOutput" }, + { + "$ref": "#/components/schemas/QwenImageControlOutput" + }, { "$ref": "#/components/schemas/QwenImageLoRALoaderOutput" }, @@ -53985,6 +54166,9 @@ { "$ref": "#/components/schemas/QwenImage21TextEncoderInvocation" }, + { + "$ref": "#/components/schemas/QwenImageControlInvocation" + }, { "$ref": "#/components/schemas/QwenImageDenoiseInvocation" }, @@ -54638,6 +54822,9 @@ { "$ref": "#/components/schemas/QwenImageConditioningOutput" }, + { + "$ref": "#/components/schemas/QwenImageControlOutput" + }, { "$ref": "#/components/schemas/QwenImageLoRALoaderOutput" }, @@ -55600,6 +55787,9 @@ { "$ref": "#/components/schemas/QwenImage21TextEncoderInvocation" }, + { + "$ref": "#/components/schemas/QwenImageControlInvocation" + }, { "$ref": "#/components/schemas/QwenImageDenoiseInvocation" }, @@ -56737,6 +56927,9 @@ "qwen_image_2_1_text_encoder": { "$ref": "#/components/schemas/QwenImage21ConditioningOutput" }, + "qwen_image_control": { + "$ref": "#/components/schemas/QwenImageControlOutput" + }, "qwen_image_denoise": { "$ref": "#/components/schemas/LatentsOutput" }, @@ -57270,6 +57463,7 @@ "qwen_image_2_1_l2i", "qwen_image_2_1_model_loader", "qwen_image_2_1_text_encoder", + "qwen_image_control", "qwen_image_denoise", "qwen_image_i2l", "qwen_image_l2i", @@ -58211,6 +58405,9 @@ { "$ref": "#/components/schemas/QwenImage21TextEncoderInvocation" }, + { + "$ref": "#/components/schemas/QwenImageControlInvocation" + }, { "$ref": "#/components/schemas/QwenImageDenoiseInvocation" }, @@ -59456,6 +59653,9 @@ { "$ref": "#/components/schemas/QwenImage21TextEncoderInvocation" }, + { + "$ref": "#/components/schemas/QwenImageControlInvocation" + }, { "$ref": "#/components/schemas/QwenImageDenoiseInvocation" }, @@ -86411,6 +86611,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -87154,6 +87357,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -87782,6 +87988,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -88266,6 +88475,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -89243,6 +89455,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -95593,6 +95808,289 @@ "title": "QwenImageConditioningOutput", "type": "object" }, + "QwenImageControlField": { + "description": "Qwen Image Fun-ControlNet conditioning: a control image, an inpaint image with its mask, or both.", + "properties": { + "image_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The preprocessed control image (Canny, depth, pose, ...)", + "title": "Image Name" + }, + "inpaint_image_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The image to inpaint", + "title": "Inpaint Image Name" + }, + "inpaint_mask_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The inpaint mask; white is regenerated", + "title": "Inpaint Mask Name" + }, + "control_model": { + "$ref": "#/components/schemas/ModelIdentifierField", + "description": "The Qwen Image ControlNet model" + }, + "control_context_scale": { + "default": 0.85, + "description": "Strength of the control signal. Recommended range: 0.70-0.95.", + "maximum": 2.0, + "minimum": 0.0, + "title": "Control Context Scale", + "type": "number" + }, + "begin_step_percent": { + "default": 0.0, + "description": "When the control is first applied (% of total steps)", + "maximum": 1.0, + "minimum": 0.0, + "title": "Begin Step Percent", + "type": "number" + }, + "end_step_percent": { + "default": 1.0, + "description": "When the control is last applied (% of total steps)", + "maximum": 1.0, + "minimum": 0.0, + "title": "End Step Percent", + "type": "number" + }, + "tiled": { + "default": false, + "description": "Encode the control images in tiles. The denoise encodes them at generation size, which for an upscale is the enlarged frame -- too large for an untiled encode on consumer hardware.", + "title": "Tiled", + "type": "boolean" + }, + "tile_size": { + "default": 0, + "description": "The tile size for VAE tiling in pixels (image space). If set to 0, the default tile size for the model will be used. Larger tile sizes generally produce better results at the cost of higher memory usage. Values between 1 and 64 are raised to 64.", + "minimum": 0, + "multipleOf": 8, + "title": "Tile Size", + "type": "integer" + } + }, + "required": ["control_model"], + "title": "QwenImageControlField", + "type": "object" + }, + "QwenImageControlInvocation": { + "category": "conditioning", + "class": "invocation", + "classification": "prototype", + "description": "Configure the Qwen Image Fun-ControlNet-Union for spatial control, inpainting, or both.\n\nTakes a preprocessed control image (Canny, HED, depth, pose, MLSD, ...) and/or an image to inpaint with its mask\n(white is regenerated), plus the Qwen Image ControlNet model. Recommended control scale: 0.70-0.95.", + "node_pack": "invokeai", + "properties": { + "id": { + "description": "The id of this instance of an invocation. Must be unique among all instances of invocations.", + "field_kind": "node_attribute", + "title": "Id", + "type": "string" + }, + "is_intermediate": { + "default": false, + "description": "Whether or not this is an intermediate invocation.", + "field_kind": "node_attribute", + "input": "direct", + "orig_required": true, + "title": "Is Intermediate", + "type": "boolean", + "ui_hidden": false, + "ui_type": "IsIntermediate" + }, + "use_cache": { + "default": true, + "description": "Whether or not to use the cache", + "field_kind": "node_attribute", + "title": "Use Cache", + "type": "boolean" + }, + "image": { + "anyOf": [ + { + "$ref": "#/components/schemas/ImageField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The preprocessed control image (Canny, HED, depth, pose, MLSD, ...)", + "field_kind": "input", + "input": "any", + "orig_default": null, + "orig_required": false + }, + "inpaint_image": { + "anyOf": [ + { + "$ref": "#/components/schemas/ImageField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The image to inpaint. Goes together with the inpaint mask.", + "field_kind": "input", + "input": "any", + "orig_default": null, + "orig_required": false + }, + "inpaint_mask": { + "anyOf": [ + { + "$ref": "#/components/schemas/ImageField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The inpaint mask: white is regenerated, black is kept. Goes together with the inpaint image.", + "field_kind": "input", + "input": "any", + "orig_default": null, + "orig_required": false + }, + "control_model": { + "anyOf": [ + { + "$ref": "#/components/schemas/ModelIdentifierField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "ControlNet model to load", + "field_kind": "input", + "input": "any", + "orig_required": true, + "title": "Control Model", + "ui_model_base": ["qwen-image"], + "ui_model_type": ["controlnet"] + }, + "control_context_scale": { + "default": 0.85, + "description": "Strength of the control signal. Recommended range: 0.70-0.95.", + "field_kind": "input", + "input": "any", + "maximum": 2.0, + "minimum": 0.0, + "orig_default": 0.85, + "orig_required": false, + "title": "Control Scale", + "type": "number" + }, + "begin_step_percent": { + "default": 0.0, + "description": "When the control is first applied (% of total steps)", + "field_kind": "input", + "input": "any", + "maximum": 1.0, + "minimum": 0.0, + "orig_default": 0.0, + "orig_required": false, + "title": "Begin Step Percent", + "type": "number" + }, + "end_step_percent": { + "default": 1.0, + "description": "When the control is last applied (% of total steps)", + "field_kind": "input", + "input": "any", + "maximum": 1.0, + "minimum": 0.0, + "orig_default": 1.0, + "orig_required": false, + "title": "End Step Percent", + "type": "number" + }, + "tiled": { + "default": false, + "description": "Processing using overlapping tiles (reduce memory consumption)", + "field_kind": "input", + "input": "any", + "orig_default": false, + "orig_required": false, + "title": "Tiled", + "type": "boolean" + }, + "tile_size": { + "default": 0, + "description": "The tile size for VAE tiling in pixels (image space). If set to 0, the default tile size for the model will be used. Larger tile sizes generally produce better results at the cost of higher memory usage. Values between 1 and 64 are raised to 64.", + "field_kind": "input", + "input": "any", + "minimum": 0, + "multipleOf": 8, + "orig_default": 0, + "orig_required": false, + "title": "Tile Size", + "type": "integer" + }, + "type": { + "const": "qwen_image_control", + "default": "qwen_image_control", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["type", "id"], + "tags": ["image", "qwen_image", "control", "controlnet", "inpaint"], + "title": "Qwen Image ControlNet", + "type": "object", + "version": "1.0.0", + "output": { + "$ref": "#/components/schemas/QwenImageControlOutput" + } + }, + "QwenImageControlOutput": { + "class": "output", + "description": "Qwen Image Control output containing control configuration.", + "properties": { + "control": { + "$ref": "#/components/schemas/QwenImageControlField", + "description": "Qwen Image control conditioning", + "field_kind": "output", + "ui_hidden": false + }, + "type": { + "const": "qwen_image_control_output", + "default": "qwen_image_control_output", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["output_meta", "control", "type", "type"], + "title": "QwenImageControlOutput", + "type": "object" + }, "QwenImageDenoiseInvocation": { "category": "image", "class": "invocation", @@ -95855,6 +96353,38 @@ "orig_required": false, "title": "Shift" }, + "control": { + "anyOf": [ + { + "$ref": "#/components/schemas/QwenImageControlField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Qwen Image ControlNet conditioning: spatial control (Canny, depth, pose, ...) and/or inpainting.", + "field_kind": "input", + "input": "connection", + "orig_default": null, + "orig_required": false + }, + "vae": { + "anyOf": [ + { + "$ref": "#/components/schemas/VAEField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "VAE Required for control conditioning.", + "field_kind": "input", + "input": "connection", + "orig_default": null, + "orig_required": false + }, "type": { "const": "qwen_image_denoise", "default": "qwen_image_denoise", @@ -95867,7 +96397,7 @@ "tags": ["image", "qwen_image"], "title": "Denoise - Qwen Image", "type": "object", - "version": "1.0.0", + "version": "1.1.0", "output": { "$ref": "#/components/schemas/LatentsOutput" } diff --git a/invokeai/frontend/api/schema.ts b/invokeai/frontend/api/schema.ts index 5e8cb075413..036c3893488 100644 --- a/invokeai/frontend/api/schema.ts +++ b/invokeai/frontend/api/schema.ts @@ -5535,7 +5535,7 @@ export type components = { * @enum {string} */ AnimaVariantType: "anima_qwen3" | "anima_qwen35"; - AnyModelConfig: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + AnyModelConfig: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; /** * AppVersion * @description App Version Response @@ -5717,7 +5717,7 @@ export type components = { * Control Kinds * @description Sorted. */ - control_kinds?: ("controlnet" | "t2i_adapter" | "control_lora" | "z_image_control" | "anima_lllite")[]; + control_kinds?: ("controlnet" | "t2i_adapter" | "control_lora" | "z_image_control" | "anima_lllite" | "qwen_image_control")[]; /** * Max Reference Images * @default 0 @@ -9736,6 +9736,95 @@ export type components = { */ base: "flux"; }; + /** + * ControlNet_Checkpoint_QwenImage_Config + * @description Model config for Qwen-Image Fun-ControlNet adapter models (Safetensors checkpoint). + * + * Qwen-Image Fun-ControlNets are standalone adapters containing only the control branch + * (control_img_in, control_blocks) that extends the base Qwen-Image transformer with spatial + * conditioning capabilities. + * + * Supports: Canny, HED, Depth, Pose, MLSD, Scribble, Gray, inpainting. + * Recommended control_context_scale: 0.70-0.95. + */ + ControlNet_Checkpoint_QwenImage_Config: { + /** + * Key + * @description A unique key for this model. + */ + key: string; + /** + * Hash + * @description The hash of the model file(s). + */ + hash: string; + /** + * Path + * @description Path to the model on the filesystem. Relative paths are relative to the Invoke root directory. + */ + path: string; + /** + * File Size + * @description The size of the model in bytes. + */ + file_size: number; + /** + * Name + * @description Name of the model. + */ + name: string; + /** + * Description + * @description Model description + */ + description: string | null; + /** + * Source + * @description The original source of the model (path, URL or repo_id). + */ + source: string; + /** @description The type of source */ + source_type: components["schemas"]["ModelSourceType"]; + /** + * Source Api Response + * @description The original API response from the source, as stringified JSON. + */ + source_api_response: string | null; + /** + * Source Url + * @description Optional URL for the model (e.g. download page or model page). + */ + source_url: string | null; + /** + * Cover Image + * @description Url for image to preview model + */ + cover_image: string | null; + /** + * Config Path + * @description Path to the config for this model, if any. + */ + config_path: string | null; + /** + * Type + * @default controlnet + * @constant + */ + type: "controlnet"; + /** + * Format + * @default checkpoint + * @constant + */ + format: "checkpoint"; + /** + * Base + * @default qwen-image + * @constant + */ + base: "qwen-image"; + default_settings: components["schemas"]["ControlAdapterDefaultSettings"] | null; + }; /** ControlNet_Checkpoint_SD1_Config */ ControlNet_Checkpoint_SD1_Config: { /** @@ -17331,7 +17420,7 @@ export type components = { * @description The nodes in this graph */ nodes?: { - [key: string]: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaDenoiseMetaInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLLLiteInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["AtlasCloudImageGenerationInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanLogicInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CollectionCartesianInvocation"] | components["schemas"]["CollectionConcatInvocation"] | components["schemas"]["CollectionZipInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["ForInvocation"] | components["schemas"]["ForReturnInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2StyleReferenceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LTX2AudioConditioningInvocation"] | components["schemas"]["LTX2DenoiseInvocation"] | components["schemas"]["LTX2DurationInvocation"] | components["schemas"]["LTX2ExtendConditioningInvocation"] | components["schemas"]["LTX2IdealDimensionsInvocation"] | components["schemas"]["LTX2ImageConditioningInvocation"] | components["schemas"]["LTX2LatentUpsampleInvocation"] | components["schemas"]["LTX2LatentsToVideoInvocation"] | components["schemas"]["LTX2LoRACollectionLoader"] | components["schemas"]["LTX2LoRALoaderInvocation"] | components["schemas"]["LTX2ModelLoaderInvocation"] | components["schemas"]["LTX2TextEncoderInvocation"] | components["schemas"]["LTX2VideoConditioningInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3HybridOverlayInvocation"] | components["schemas"]["MiniMaxH3IdealDimensionsInvocation"] | components["schemas"]["MiniMaxH3ImageReferenceInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3LoRACollectionLoader"] | components["schemas"]["MiniMaxH3LoRALoaderInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3ReferenceConditioningInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["MiniMaxH3VideoReferenceInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImage21DenoiseInvocation"] | components["schemas"]["QwenImage21ImageToLatentsInvocation"] | components["schemas"]["QwenImage21LatentsToImageInvocation"] | components["schemas"]["QwenImage21ModelLoaderInvocation"] | components["schemas"]["QwenImage21TextEncoderInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StateEmptyInvocation"] | components["schemas"]["StateGetInvocation"] | components["schemas"]["StateMergeInvocation"] | components["schemas"]["StateSetInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + [key: string]: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaDenoiseMetaInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLLLiteInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["AtlasCloudImageGenerationInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanLogicInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CollectionCartesianInvocation"] | components["schemas"]["CollectionConcatInvocation"] | components["schemas"]["CollectionZipInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["ForInvocation"] | components["schemas"]["ForReturnInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2StyleReferenceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LTX2AudioConditioningInvocation"] | components["schemas"]["LTX2DenoiseInvocation"] | components["schemas"]["LTX2DurationInvocation"] | components["schemas"]["LTX2ExtendConditioningInvocation"] | components["schemas"]["LTX2IdealDimensionsInvocation"] | components["schemas"]["LTX2ImageConditioningInvocation"] | components["schemas"]["LTX2LatentUpsampleInvocation"] | components["schemas"]["LTX2LatentsToVideoInvocation"] | components["schemas"]["LTX2LoRACollectionLoader"] | components["schemas"]["LTX2LoRALoaderInvocation"] | components["schemas"]["LTX2ModelLoaderInvocation"] | components["schemas"]["LTX2TextEncoderInvocation"] | components["schemas"]["LTX2VideoConditioningInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3HybridOverlayInvocation"] | components["schemas"]["MiniMaxH3IdealDimensionsInvocation"] | components["schemas"]["MiniMaxH3ImageReferenceInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3LoRACollectionLoader"] | components["schemas"]["MiniMaxH3LoRALoaderInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3ReferenceConditioningInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["MiniMaxH3VideoReferenceInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImage21DenoiseInvocation"] | components["schemas"]["QwenImage21ImageToLatentsInvocation"] | components["schemas"]["QwenImage21LatentsToImageInvocation"] | components["schemas"]["QwenImage21ModelLoaderInvocation"] | components["schemas"]["QwenImage21TextEncoderInvocation"] | components["schemas"]["QwenImageControlInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StateEmptyInvocation"] | components["schemas"]["StateGetInvocation"] | components["schemas"]["StateMergeInvocation"] | components["schemas"]["StateSetInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; }; /** * Edges @@ -17368,7 +17457,7 @@ export type components = { * @description The results of node executions */ results: { - [key: string]: components["schemas"]["AnimaConditioningOutput"] | components["schemas"]["AnimaLLLiteOutput"] | components["schemas"]["AnimaLoRALoaderOutput"] | components["schemas"]["AnimaModelLoaderOutput"] | components["schemas"]["BooleanCollectionOutput"] | components["schemas"]["BooleanOutput"] | components["schemas"]["BoundingBoxCollectionOutput"] | components["schemas"]["BoundingBoxOutput"] | components["schemas"]["CLIPOutput"] | components["schemas"]["CLIPSkipInvocationOutput"] | components["schemas"]["CalculateImageTilesOutput"] | components["schemas"]["CogView4ConditioningOutput"] | components["schemas"]["CogView4ModelLoaderOutput"] | components["schemas"]["CollectInvocationOutput"] | components["schemas"]["CollectionCartesianInvocationOutput"] | components["schemas"]["CollectionConcatInvocationOutput"] | components["schemas"]["CollectionZipInvocationOutput"] | components["schemas"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["ErnieImageConditioningOutput"] | components["schemas"]["ErnieImageModelLoaderOutput"] | components["schemas"]["ExtractVideoRangeOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["Flux2DevLoRALoaderOutput"] | components["schemas"]["Flux2DevModelLoaderOutput"] | components["schemas"]["Flux2KleinLoRALoaderOutput"] | components["schemas"]["Flux2KleinModelLoaderOutput"] | components["schemas"]["FluxConditioningCollectionOutput"] | components["schemas"]["FluxConditioningOutput"] | components["schemas"]["FluxControlLoRALoaderOutput"] | components["schemas"]["FluxControlNetOutput"] | components["schemas"]["FluxFillOutput"] | components["schemas"]["FluxKontextOutput"] | components["schemas"]["FluxLoRALoaderOutput"] | components["schemas"]["FluxModelLoaderOutput"] | components["schemas"]["FluxReduxOutput"] | components["schemas"]["ForInvocationOutput"] | components["schemas"]["ForReturnInvocationOutput"] | components["schemas"]["Gemma2EncoderOutput"] | components["schemas"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | components["schemas"]["Ideogram4ConditioningOutput"] | components["schemas"]["Ideogram4ModelLoaderOutput"] | components["schemas"]["IfInvocationOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["ImageGeneratorOutput"] | components["schemas"]["ImageOutput"] | components["schemas"]["ImagePanelCoordinateOutput"] | components["schemas"]["IntegerCollectionOutput"] | components["schemas"]["IntegerGeneratorOutput"] | components["schemas"]["IntegerOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["Krea2ConditioningOutput"] | components["schemas"]["Krea2LoRALoaderOutput"] | components["schemas"]["Krea2ModelLoaderOutput"] | components["schemas"]["Krea2StyleReferenceOutput"] | components["schemas"]["LTX2AudioConditioningOutput"] | components["schemas"]["LTX2DenoiseOutput"] | components["schemas"]["LTX2DurationOutput"] | components["schemas"]["LTX2ExtendConditioningOutput"] | components["schemas"]["LTX2IdealDimensionsOutput"] | components["schemas"]["LTX2ImageConditioningOutput"] | components["schemas"]["LTX2LatentUpsampleOutput"] | components["schemas"]["LTX2LoRACollectionLoaderOutput"] | components["schemas"]["LTX2LoRALoaderOutput"] | components["schemas"]["LTX2ModelLoaderOutput"] | components["schemas"]["LTX2TextEncoderOutput"] | components["schemas"]["LTX2VideoConditioningOutput"] | components["schemas"]["LatentsCollectionOutput"] | components["schemas"]["LatentsMetaOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["LoRALoaderOutput"] | components["schemas"]["LoRASelectorOutput"] | components["schemas"]["LoopStateOutput"] | components["schemas"]["LoopStateValueOutput"] | components["schemas"]["MDControlListOutput"] | components["schemas"]["MDIPAdapterListOutput"] | components["schemas"]["MDT2IAdapterListOutput"] | components["schemas"]["MaskOutput"] | components["schemas"]["MetadataItemOutput"] | components["schemas"]["MetadataOutput"] | components["schemas"]["MetadataToLorasCollectionOutput"] | components["schemas"]["MetadataToModelOutput"] | components["schemas"]["MetadataToSDXLModelOutput"] | components["schemas"]["MiniMaxH3ConditioningOutput"] | components["schemas"]["MiniMaxH3DenoiseOutput"] | components["schemas"]["MiniMaxH3FrameConditioningOutput"] | components["schemas"]["MiniMaxH3HybridOverlayOutput"] | components["schemas"]["MiniMaxH3LoRACollectionLoaderOutput"] | components["schemas"]["MiniMaxH3LoRALoaderOutput"] | components["schemas"]["MiniMaxH3ModelLoaderOutput"] | components["schemas"]["MiniMaxH3ReferenceConditioningOutput"] | components["schemas"]["MiniMaxH3ReferenceMediaOutput"] | components["schemas"]["ModelIdentifierOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["PBRMapsOutput"] | components["schemas"]["PairTileImageOutput"] | components["schemas"]["PiDDecoderOutput"] | components["schemas"]["PromptTemplateOutput"] | components["schemas"]["QwenImage21ConditioningOutput"] | components["schemas"]["QwenImage21ModelLoaderOutput"] | components["schemas"]["QwenImageConditioningOutput"] | components["schemas"]["QwenImageLoRALoaderOutput"] | components["schemas"]["QwenImageModelLoaderOutput"] | components["schemas"]["SD3ConditioningOutput"] | components["schemas"]["SDXLLoRALoaderOutput"] | components["schemas"]["SDXLModelLoaderOutput"] | components["schemas"]["SDXLRefinerModelLoaderOutput"] | components["schemas"]["SchedulerOutput"] | components["schemas"]["Sd3ModelLoaderOutput"] | components["schemas"]["SeamlessModeOutput"] | components["schemas"]["String2Output"] | components["schemas"]["StringCollectionOutput"] | components["schemas"]["StringGeneratorOutput"] | components["schemas"]["StringOutput"] | components["schemas"]["StringPosNegOutput"] | components["schemas"]["T2IAdapterOutput"] | components["schemas"]["TileToPropertiesOutput"] | components["schemas"]["UNetOutput"] | components["schemas"]["VAEOutput"] | components["schemas"]["VideoOutput"] | components["schemas"]["WanConditioningOutput"] | components["schemas"]["WanLoRALoaderOutput"] | components["schemas"]["WanModelLoaderOutput"] | components["schemas"]["WanRefImageOutput"] | components["schemas"]["WorkflowReturnGetOutput"] | components["schemas"]["WorkflowReturnOutput"] | components["schemas"]["WorkflowReturnValueOutput"] | components["schemas"]["ZImageConditioningOutput"] | components["schemas"]["ZImageControlOutput"] | components["schemas"]["ZImageLoRALoaderOutput"] | components["schemas"]["ZImageModelLoaderOutput"]; + [key: string]: components["schemas"]["AnimaConditioningOutput"] | components["schemas"]["AnimaLLLiteOutput"] | components["schemas"]["AnimaLoRALoaderOutput"] | components["schemas"]["AnimaModelLoaderOutput"] | components["schemas"]["BooleanCollectionOutput"] | components["schemas"]["BooleanOutput"] | components["schemas"]["BoundingBoxCollectionOutput"] | components["schemas"]["BoundingBoxOutput"] | components["schemas"]["CLIPOutput"] | components["schemas"]["CLIPSkipInvocationOutput"] | components["schemas"]["CalculateImageTilesOutput"] | components["schemas"]["CogView4ConditioningOutput"] | components["schemas"]["CogView4ModelLoaderOutput"] | components["schemas"]["CollectInvocationOutput"] | components["schemas"]["CollectionCartesianInvocationOutput"] | components["schemas"]["CollectionConcatInvocationOutput"] | components["schemas"]["CollectionZipInvocationOutput"] | components["schemas"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["ErnieImageConditioningOutput"] | components["schemas"]["ErnieImageModelLoaderOutput"] | components["schemas"]["ExtractVideoRangeOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["Flux2DevLoRALoaderOutput"] | components["schemas"]["Flux2DevModelLoaderOutput"] | components["schemas"]["Flux2KleinLoRALoaderOutput"] | components["schemas"]["Flux2KleinModelLoaderOutput"] | components["schemas"]["FluxConditioningCollectionOutput"] | components["schemas"]["FluxConditioningOutput"] | components["schemas"]["FluxControlLoRALoaderOutput"] | components["schemas"]["FluxControlNetOutput"] | components["schemas"]["FluxFillOutput"] | components["schemas"]["FluxKontextOutput"] | components["schemas"]["FluxLoRALoaderOutput"] | components["schemas"]["FluxModelLoaderOutput"] | components["schemas"]["FluxReduxOutput"] | components["schemas"]["ForInvocationOutput"] | components["schemas"]["ForReturnInvocationOutput"] | components["schemas"]["Gemma2EncoderOutput"] | components["schemas"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | components["schemas"]["Ideogram4ConditioningOutput"] | components["schemas"]["Ideogram4ModelLoaderOutput"] | components["schemas"]["IfInvocationOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["ImageGeneratorOutput"] | components["schemas"]["ImageOutput"] | components["schemas"]["ImagePanelCoordinateOutput"] | components["schemas"]["IntegerCollectionOutput"] | components["schemas"]["IntegerGeneratorOutput"] | components["schemas"]["IntegerOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["Krea2ConditioningOutput"] | components["schemas"]["Krea2LoRALoaderOutput"] | components["schemas"]["Krea2ModelLoaderOutput"] | components["schemas"]["Krea2StyleReferenceOutput"] | components["schemas"]["LTX2AudioConditioningOutput"] | components["schemas"]["LTX2DenoiseOutput"] | components["schemas"]["LTX2DurationOutput"] | components["schemas"]["LTX2ExtendConditioningOutput"] | components["schemas"]["LTX2IdealDimensionsOutput"] | components["schemas"]["LTX2ImageConditioningOutput"] | components["schemas"]["LTX2LatentUpsampleOutput"] | components["schemas"]["LTX2LoRACollectionLoaderOutput"] | components["schemas"]["LTX2LoRALoaderOutput"] | components["schemas"]["LTX2ModelLoaderOutput"] | components["schemas"]["LTX2TextEncoderOutput"] | components["schemas"]["LTX2VideoConditioningOutput"] | components["schemas"]["LatentsCollectionOutput"] | components["schemas"]["LatentsMetaOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["LoRALoaderOutput"] | components["schemas"]["LoRASelectorOutput"] | components["schemas"]["LoopStateOutput"] | components["schemas"]["LoopStateValueOutput"] | components["schemas"]["MDControlListOutput"] | components["schemas"]["MDIPAdapterListOutput"] | components["schemas"]["MDT2IAdapterListOutput"] | components["schemas"]["MaskOutput"] | components["schemas"]["MetadataItemOutput"] | components["schemas"]["MetadataOutput"] | components["schemas"]["MetadataToLorasCollectionOutput"] | components["schemas"]["MetadataToModelOutput"] | components["schemas"]["MetadataToSDXLModelOutput"] | components["schemas"]["MiniMaxH3ConditioningOutput"] | components["schemas"]["MiniMaxH3DenoiseOutput"] | components["schemas"]["MiniMaxH3FrameConditioningOutput"] | components["schemas"]["MiniMaxH3HybridOverlayOutput"] | components["schemas"]["MiniMaxH3LoRACollectionLoaderOutput"] | components["schemas"]["MiniMaxH3LoRALoaderOutput"] | components["schemas"]["MiniMaxH3ModelLoaderOutput"] | components["schemas"]["MiniMaxH3ReferenceConditioningOutput"] | components["schemas"]["MiniMaxH3ReferenceMediaOutput"] | components["schemas"]["ModelIdentifierOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["PBRMapsOutput"] | components["schemas"]["PairTileImageOutput"] | components["schemas"]["PiDDecoderOutput"] | components["schemas"]["PromptTemplateOutput"] | components["schemas"]["QwenImage21ConditioningOutput"] | components["schemas"]["QwenImage21ModelLoaderOutput"] | components["schemas"]["QwenImageConditioningOutput"] | components["schemas"]["QwenImageControlOutput"] | components["schemas"]["QwenImageLoRALoaderOutput"] | components["schemas"]["QwenImageModelLoaderOutput"] | components["schemas"]["SD3ConditioningOutput"] | components["schemas"]["SDXLLoRALoaderOutput"] | components["schemas"]["SDXLModelLoaderOutput"] | components["schemas"]["SDXLRefinerModelLoaderOutput"] | components["schemas"]["SchedulerOutput"] | components["schemas"]["Sd3ModelLoaderOutput"] | components["schemas"]["SeamlessModeOutput"] | components["schemas"]["String2Output"] | components["schemas"]["StringCollectionOutput"] | components["schemas"]["StringGeneratorOutput"] | components["schemas"]["StringOutput"] | components["schemas"]["StringPosNegOutput"] | components["schemas"]["T2IAdapterOutput"] | components["schemas"]["TileToPropertiesOutput"] | components["schemas"]["UNetOutput"] | components["schemas"]["VAEOutput"] | components["schemas"]["VideoOutput"] | components["schemas"]["WanConditioningOutput"] | components["schemas"]["WanLoRALoaderOutput"] | components["schemas"]["WanModelLoaderOutput"] | components["schemas"]["WanRefImageOutput"] | components["schemas"]["WorkflowReturnGetOutput"] | components["schemas"]["WorkflowReturnOutput"] | components["schemas"]["WorkflowReturnValueOutput"] | components["schemas"]["ZImageConditioningOutput"] | components["schemas"]["ZImageControlOutput"] | components["schemas"]["ZImageLoRALoaderOutput"] | components["schemas"]["ZImageModelLoaderOutput"]; }; /** * Errors @@ -22178,7 +22267,7 @@ export type components = { * Invocation * @description The ID of the invocation */ - invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaDenoiseMetaInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLLLiteInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["AtlasCloudImageGenerationInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanLogicInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CollectionCartesianInvocation"] | components["schemas"]["CollectionConcatInvocation"] | components["schemas"]["CollectionZipInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["ForInvocation"] | components["schemas"]["ForReturnInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2StyleReferenceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LTX2AudioConditioningInvocation"] | components["schemas"]["LTX2DenoiseInvocation"] | components["schemas"]["LTX2DurationInvocation"] | components["schemas"]["LTX2ExtendConditioningInvocation"] | components["schemas"]["LTX2IdealDimensionsInvocation"] | components["schemas"]["LTX2ImageConditioningInvocation"] | components["schemas"]["LTX2LatentUpsampleInvocation"] | components["schemas"]["LTX2LatentsToVideoInvocation"] | components["schemas"]["LTX2LoRACollectionLoader"] | components["schemas"]["LTX2LoRALoaderInvocation"] | components["schemas"]["LTX2ModelLoaderInvocation"] | components["schemas"]["LTX2TextEncoderInvocation"] | components["schemas"]["LTX2VideoConditioningInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3HybridOverlayInvocation"] | components["schemas"]["MiniMaxH3IdealDimensionsInvocation"] | components["schemas"]["MiniMaxH3ImageReferenceInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3LoRACollectionLoader"] | components["schemas"]["MiniMaxH3LoRALoaderInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3ReferenceConditioningInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["MiniMaxH3VideoReferenceInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImage21DenoiseInvocation"] | components["schemas"]["QwenImage21ImageToLatentsInvocation"] | components["schemas"]["QwenImage21LatentsToImageInvocation"] | components["schemas"]["QwenImage21ModelLoaderInvocation"] | components["schemas"]["QwenImage21TextEncoderInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StateEmptyInvocation"] | components["schemas"]["StateGetInvocation"] | components["schemas"]["StateMergeInvocation"] | components["schemas"]["StateSetInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaDenoiseMetaInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLLLiteInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["AtlasCloudImageGenerationInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanLogicInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CollectionCartesianInvocation"] | components["schemas"]["CollectionConcatInvocation"] | components["schemas"]["CollectionZipInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["ForInvocation"] | components["schemas"]["ForReturnInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2StyleReferenceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LTX2AudioConditioningInvocation"] | components["schemas"]["LTX2DenoiseInvocation"] | components["schemas"]["LTX2DurationInvocation"] | components["schemas"]["LTX2ExtendConditioningInvocation"] | components["schemas"]["LTX2IdealDimensionsInvocation"] | components["schemas"]["LTX2ImageConditioningInvocation"] | components["schemas"]["LTX2LatentUpsampleInvocation"] | components["schemas"]["LTX2LatentsToVideoInvocation"] | components["schemas"]["LTX2LoRACollectionLoader"] | components["schemas"]["LTX2LoRALoaderInvocation"] | components["schemas"]["LTX2ModelLoaderInvocation"] | components["schemas"]["LTX2TextEncoderInvocation"] | components["schemas"]["LTX2VideoConditioningInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3HybridOverlayInvocation"] | components["schemas"]["MiniMaxH3IdealDimensionsInvocation"] | components["schemas"]["MiniMaxH3ImageReferenceInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3LoRACollectionLoader"] | components["schemas"]["MiniMaxH3LoRALoaderInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3ReferenceConditioningInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["MiniMaxH3VideoReferenceInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImage21DenoiseInvocation"] | components["schemas"]["QwenImage21ImageToLatentsInvocation"] | components["schemas"]["QwenImage21LatentsToImageInvocation"] | components["schemas"]["QwenImage21ModelLoaderInvocation"] | components["schemas"]["QwenImage21TextEncoderInvocation"] | components["schemas"]["QwenImageControlInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StateEmptyInvocation"] | components["schemas"]["StateGetInvocation"] | components["schemas"]["StateMergeInvocation"] | components["schemas"]["StateSetInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -22206,7 +22295,7 @@ export type components = { * Result * @description The result of the invocation */ - result: components["schemas"]["AnimaConditioningOutput"] | components["schemas"]["AnimaLLLiteOutput"] | components["schemas"]["AnimaLoRALoaderOutput"] | components["schemas"]["AnimaModelLoaderOutput"] | components["schemas"]["BooleanCollectionOutput"] | components["schemas"]["BooleanOutput"] | components["schemas"]["BoundingBoxCollectionOutput"] | components["schemas"]["BoundingBoxOutput"] | components["schemas"]["CLIPOutput"] | components["schemas"]["CLIPSkipInvocationOutput"] | components["schemas"]["CalculateImageTilesOutput"] | components["schemas"]["CogView4ConditioningOutput"] | components["schemas"]["CogView4ModelLoaderOutput"] | components["schemas"]["CollectInvocationOutput"] | components["schemas"]["CollectionCartesianInvocationOutput"] | components["schemas"]["CollectionConcatInvocationOutput"] | components["schemas"]["CollectionZipInvocationOutput"] | components["schemas"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["ErnieImageConditioningOutput"] | components["schemas"]["ErnieImageModelLoaderOutput"] | components["schemas"]["ExtractVideoRangeOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["Flux2DevLoRALoaderOutput"] | components["schemas"]["Flux2DevModelLoaderOutput"] | components["schemas"]["Flux2KleinLoRALoaderOutput"] | components["schemas"]["Flux2KleinModelLoaderOutput"] | components["schemas"]["FluxConditioningCollectionOutput"] | components["schemas"]["FluxConditioningOutput"] | components["schemas"]["FluxControlLoRALoaderOutput"] | components["schemas"]["FluxControlNetOutput"] | components["schemas"]["FluxFillOutput"] | components["schemas"]["FluxKontextOutput"] | components["schemas"]["FluxLoRALoaderOutput"] | components["schemas"]["FluxModelLoaderOutput"] | components["schemas"]["FluxReduxOutput"] | components["schemas"]["ForInvocationOutput"] | components["schemas"]["ForReturnInvocationOutput"] | components["schemas"]["Gemma2EncoderOutput"] | components["schemas"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | components["schemas"]["Ideogram4ConditioningOutput"] | components["schemas"]["Ideogram4ModelLoaderOutput"] | components["schemas"]["IfInvocationOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["ImageGeneratorOutput"] | components["schemas"]["ImageOutput"] | components["schemas"]["ImagePanelCoordinateOutput"] | components["schemas"]["IntegerCollectionOutput"] | components["schemas"]["IntegerGeneratorOutput"] | components["schemas"]["IntegerOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["Krea2ConditioningOutput"] | components["schemas"]["Krea2LoRALoaderOutput"] | components["schemas"]["Krea2ModelLoaderOutput"] | components["schemas"]["Krea2StyleReferenceOutput"] | components["schemas"]["LTX2AudioConditioningOutput"] | components["schemas"]["LTX2DenoiseOutput"] | components["schemas"]["LTX2DurationOutput"] | components["schemas"]["LTX2ExtendConditioningOutput"] | components["schemas"]["LTX2IdealDimensionsOutput"] | components["schemas"]["LTX2ImageConditioningOutput"] | components["schemas"]["LTX2LatentUpsampleOutput"] | components["schemas"]["LTX2LoRACollectionLoaderOutput"] | components["schemas"]["LTX2LoRALoaderOutput"] | components["schemas"]["LTX2ModelLoaderOutput"] | components["schemas"]["LTX2TextEncoderOutput"] | components["schemas"]["LTX2VideoConditioningOutput"] | components["schemas"]["LatentsCollectionOutput"] | components["schemas"]["LatentsMetaOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["LoRALoaderOutput"] | components["schemas"]["LoRASelectorOutput"] | components["schemas"]["LoopStateOutput"] | components["schemas"]["LoopStateValueOutput"] | components["schemas"]["MDControlListOutput"] | components["schemas"]["MDIPAdapterListOutput"] | components["schemas"]["MDT2IAdapterListOutput"] | components["schemas"]["MaskOutput"] | components["schemas"]["MetadataItemOutput"] | components["schemas"]["MetadataOutput"] | components["schemas"]["MetadataToLorasCollectionOutput"] | components["schemas"]["MetadataToModelOutput"] | components["schemas"]["MetadataToSDXLModelOutput"] | components["schemas"]["MiniMaxH3ConditioningOutput"] | components["schemas"]["MiniMaxH3DenoiseOutput"] | components["schemas"]["MiniMaxH3FrameConditioningOutput"] | components["schemas"]["MiniMaxH3HybridOverlayOutput"] | components["schemas"]["MiniMaxH3LoRACollectionLoaderOutput"] | components["schemas"]["MiniMaxH3LoRALoaderOutput"] | components["schemas"]["MiniMaxH3ModelLoaderOutput"] | components["schemas"]["MiniMaxH3ReferenceConditioningOutput"] | components["schemas"]["MiniMaxH3ReferenceMediaOutput"] | components["schemas"]["ModelIdentifierOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["PBRMapsOutput"] | components["schemas"]["PairTileImageOutput"] | components["schemas"]["PiDDecoderOutput"] | components["schemas"]["PromptTemplateOutput"] | components["schemas"]["QwenImage21ConditioningOutput"] | components["schemas"]["QwenImage21ModelLoaderOutput"] | components["schemas"]["QwenImageConditioningOutput"] | components["schemas"]["QwenImageLoRALoaderOutput"] | components["schemas"]["QwenImageModelLoaderOutput"] | components["schemas"]["SD3ConditioningOutput"] | components["schemas"]["SDXLLoRALoaderOutput"] | components["schemas"]["SDXLModelLoaderOutput"] | components["schemas"]["SDXLRefinerModelLoaderOutput"] | components["schemas"]["SchedulerOutput"] | components["schemas"]["Sd3ModelLoaderOutput"] | components["schemas"]["SeamlessModeOutput"] | components["schemas"]["String2Output"] | components["schemas"]["StringCollectionOutput"] | components["schemas"]["StringGeneratorOutput"] | components["schemas"]["StringOutput"] | components["schemas"]["StringPosNegOutput"] | components["schemas"]["T2IAdapterOutput"] | components["schemas"]["TileToPropertiesOutput"] | components["schemas"]["UNetOutput"] | components["schemas"]["VAEOutput"] | components["schemas"]["VideoOutput"] | components["schemas"]["WanConditioningOutput"] | components["schemas"]["WanLoRALoaderOutput"] | components["schemas"]["WanModelLoaderOutput"] | components["schemas"]["WanRefImageOutput"] | components["schemas"]["WorkflowReturnGetOutput"] | components["schemas"]["WorkflowReturnOutput"] | components["schemas"]["WorkflowReturnValueOutput"] | components["schemas"]["ZImageConditioningOutput"] | components["schemas"]["ZImageControlOutput"] | components["schemas"]["ZImageLoRALoaderOutput"] | components["schemas"]["ZImageModelLoaderOutput"]; + result: components["schemas"]["AnimaConditioningOutput"] | components["schemas"]["AnimaLLLiteOutput"] | components["schemas"]["AnimaLoRALoaderOutput"] | components["schemas"]["AnimaModelLoaderOutput"] | components["schemas"]["BooleanCollectionOutput"] | components["schemas"]["BooleanOutput"] | components["schemas"]["BoundingBoxCollectionOutput"] | components["schemas"]["BoundingBoxOutput"] | components["schemas"]["CLIPOutput"] | components["schemas"]["CLIPSkipInvocationOutput"] | components["schemas"]["CalculateImageTilesOutput"] | components["schemas"]["CogView4ConditioningOutput"] | components["schemas"]["CogView4ModelLoaderOutput"] | components["schemas"]["CollectInvocationOutput"] | components["schemas"]["CollectionCartesianInvocationOutput"] | components["schemas"]["CollectionConcatInvocationOutput"] | components["schemas"]["CollectionZipInvocationOutput"] | components["schemas"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["ErnieImageConditioningOutput"] | components["schemas"]["ErnieImageModelLoaderOutput"] | components["schemas"]["ExtractVideoRangeOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["Flux2DevLoRALoaderOutput"] | components["schemas"]["Flux2DevModelLoaderOutput"] | components["schemas"]["Flux2KleinLoRALoaderOutput"] | components["schemas"]["Flux2KleinModelLoaderOutput"] | components["schemas"]["FluxConditioningCollectionOutput"] | components["schemas"]["FluxConditioningOutput"] | components["schemas"]["FluxControlLoRALoaderOutput"] | components["schemas"]["FluxControlNetOutput"] | components["schemas"]["FluxFillOutput"] | components["schemas"]["FluxKontextOutput"] | components["schemas"]["FluxLoRALoaderOutput"] | components["schemas"]["FluxModelLoaderOutput"] | components["schemas"]["FluxReduxOutput"] | components["schemas"]["ForInvocationOutput"] | components["schemas"]["ForReturnInvocationOutput"] | components["schemas"]["Gemma2EncoderOutput"] | components["schemas"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | components["schemas"]["Ideogram4ConditioningOutput"] | components["schemas"]["Ideogram4ModelLoaderOutput"] | components["schemas"]["IfInvocationOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["ImageGeneratorOutput"] | components["schemas"]["ImageOutput"] | components["schemas"]["ImagePanelCoordinateOutput"] | components["schemas"]["IntegerCollectionOutput"] | components["schemas"]["IntegerGeneratorOutput"] | components["schemas"]["IntegerOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["Krea2ConditioningOutput"] | components["schemas"]["Krea2LoRALoaderOutput"] | components["schemas"]["Krea2ModelLoaderOutput"] | components["schemas"]["Krea2StyleReferenceOutput"] | components["schemas"]["LTX2AudioConditioningOutput"] | components["schemas"]["LTX2DenoiseOutput"] | components["schemas"]["LTX2DurationOutput"] | components["schemas"]["LTX2ExtendConditioningOutput"] | components["schemas"]["LTX2IdealDimensionsOutput"] | components["schemas"]["LTX2ImageConditioningOutput"] | components["schemas"]["LTX2LatentUpsampleOutput"] | components["schemas"]["LTX2LoRACollectionLoaderOutput"] | components["schemas"]["LTX2LoRALoaderOutput"] | components["schemas"]["LTX2ModelLoaderOutput"] | components["schemas"]["LTX2TextEncoderOutput"] | components["schemas"]["LTX2VideoConditioningOutput"] | components["schemas"]["LatentsCollectionOutput"] | components["schemas"]["LatentsMetaOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["LoRALoaderOutput"] | components["schemas"]["LoRASelectorOutput"] | components["schemas"]["LoopStateOutput"] | components["schemas"]["LoopStateValueOutput"] | components["schemas"]["MDControlListOutput"] | components["schemas"]["MDIPAdapterListOutput"] | components["schemas"]["MDT2IAdapterListOutput"] | components["schemas"]["MaskOutput"] | components["schemas"]["MetadataItemOutput"] | components["schemas"]["MetadataOutput"] | components["schemas"]["MetadataToLorasCollectionOutput"] | components["schemas"]["MetadataToModelOutput"] | components["schemas"]["MetadataToSDXLModelOutput"] | components["schemas"]["MiniMaxH3ConditioningOutput"] | components["schemas"]["MiniMaxH3DenoiseOutput"] | components["schemas"]["MiniMaxH3FrameConditioningOutput"] | components["schemas"]["MiniMaxH3HybridOverlayOutput"] | components["schemas"]["MiniMaxH3LoRACollectionLoaderOutput"] | components["schemas"]["MiniMaxH3LoRALoaderOutput"] | components["schemas"]["MiniMaxH3ModelLoaderOutput"] | components["schemas"]["MiniMaxH3ReferenceConditioningOutput"] | components["schemas"]["MiniMaxH3ReferenceMediaOutput"] | components["schemas"]["ModelIdentifierOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["PBRMapsOutput"] | components["schemas"]["PairTileImageOutput"] | components["schemas"]["PiDDecoderOutput"] | components["schemas"]["PromptTemplateOutput"] | components["schemas"]["QwenImage21ConditioningOutput"] | components["schemas"]["QwenImage21ModelLoaderOutput"] | components["schemas"]["QwenImageConditioningOutput"] | components["schemas"]["QwenImageControlOutput"] | components["schemas"]["QwenImageLoRALoaderOutput"] | components["schemas"]["QwenImageModelLoaderOutput"] | components["schemas"]["SD3ConditioningOutput"] | components["schemas"]["SDXLLoRALoaderOutput"] | components["schemas"]["SDXLModelLoaderOutput"] | components["schemas"]["SDXLRefinerModelLoaderOutput"] | components["schemas"]["SchedulerOutput"] | components["schemas"]["Sd3ModelLoaderOutput"] | components["schemas"]["SeamlessModeOutput"] | components["schemas"]["String2Output"] | components["schemas"]["StringCollectionOutput"] | components["schemas"]["StringGeneratorOutput"] | components["schemas"]["StringOutput"] | components["schemas"]["StringPosNegOutput"] | components["schemas"]["T2IAdapterOutput"] | components["schemas"]["TileToPropertiesOutput"] | components["schemas"]["UNetOutput"] | components["schemas"]["VAEOutput"] | components["schemas"]["VideoOutput"] | components["schemas"]["WanConditioningOutput"] | components["schemas"]["WanLoRALoaderOutput"] | components["schemas"]["WanModelLoaderOutput"] | components["schemas"]["WanRefImageOutput"] | components["schemas"]["WorkflowReturnGetOutput"] | components["schemas"]["WorkflowReturnOutput"] | components["schemas"]["WorkflowReturnValueOutput"] | components["schemas"]["ZImageConditioningOutput"] | components["schemas"]["ZImageControlOutput"] | components["schemas"]["ZImageLoRALoaderOutput"] | components["schemas"]["ZImageModelLoaderOutput"]; }; /** * InvocationErrorEvent @@ -22260,7 +22349,7 @@ export type components = { * Invocation * @description The ID of the invocation */ - invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaDenoiseMetaInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLLLiteInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["AtlasCloudImageGenerationInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanLogicInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CollectionCartesianInvocation"] | components["schemas"]["CollectionConcatInvocation"] | components["schemas"]["CollectionZipInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["ForInvocation"] | components["schemas"]["ForReturnInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2StyleReferenceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LTX2AudioConditioningInvocation"] | components["schemas"]["LTX2DenoiseInvocation"] | components["schemas"]["LTX2DurationInvocation"] | components["schemas"]["LTX2ExtendConditioningInvocation"] | components["schemas"]["LTX2IdealDimensionsInvocation"] | components["schemas"]["LTX2ImageConditioningInvocation"] | components["schemas"]["LTX2LatentUpsampleInvocation"] | components["schemas"]["LTX2LatentsToVideoInvocation"] | components["schemas"]["LTX2LoRACollectionLoader"] | components["schemas"]["LTX2LoRALoaderInvocation"] | components["schemas"]["LTX2ModelLoaderInvocation"] | components["schemas"]["LTX2TextEncoderInvocation"] | components["schemas"]["LTX2VideoConditioningInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3HybridOverlayInvocation"] | components["schemas"]["MiniMaxH3IdealDimensionsInvocation"] | components["schemas"]["MiniMaxH3ImageReferenceInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3LoRACollectionLoader"] | components["schemas"]["MiniMaxH3LoRALoaderInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3ReferenceConditioningInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["MiniMaxH3VideoReferenceInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImage21DenoiseInvocation"] | components["schemas"]["QwenImage21ImageToLatentsInvocation"] | components["schemas"]["QwenImage21LatentsToImageInvocation"] | components["schemas"]["QwenImage21ModelLoaderInvocation"] | components["schemas"]["QwenImage21TextEncoderInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StateEmptyInvocation"] | components["schemas"]["StateGetInvocation"] | components["schemas"]["StateMergeInvocation"] | components["schemas"]["StateSetInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaDenoiseMetaInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLLLiteInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["AtlasCloudImageGenerationInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanLogicInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CollectionCartesianInvocation"] | components["schemas"]["CollectionConcatInvocation"] | components["schemas"]["CollectionZipInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["ForInvocation"] | components["schemas"]["ForReturnInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2StyleReferenceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LTX2AudioConditioningInvocation"] | components["schemas"]["LTX2DenoiseInvocation"] | components["schemas"]["LTX2DurationInvocation"] | components["schemas"]["LTX2ExtendConditioningInvocation"] | components["schemas"]["LTX2IdealDimensionsInvocation"] | components["schemas"]["LTX2ImageConditioningInvocation"] | components["schemas"]["LTX2LatentUpsampleInvocation"] | components["schemas"]["LTX2LatentsToVideoInvocation"] | components["schemas"]["LTX2LoRACollectionLoader"] | components["schemas"]["LTX2LoRALoaderInvocation"] | components["schemas"]["LTX2ModelLoaderInvocation"] | components["schemas"]["LTX2TextEncoderInvocation"] | components["schemas"]["LTX2VideoConditioningInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3HybridOverlayInvocation"] | components["schemas"]["MiniMaxH3IdealDimensionsInvocation"] | components["schemas"]["MiniMaxH3ImageReferenceInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3LoRACollectionLoader"] | components["schemas"]["MiniMaxH3LoRALoaderInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3ReferenceConditioningInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["MiniMaxH3VideoReferenceInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImage21DenoiseInvocation"] | components["schemas"]["QwenImage21ImageToLatentsInvocation"] | components["schemas"]["QwenImage21LatentsToImageInvocation"] | components["schemas"]["QwenImage21ModelLoaderInvocation"] | components["schemas"]["QwenImage21TextEncoderInvocation"] | components["schemas"]["QwenImageControlInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StateEmptyInvocation"] | components["schemas"]["StateGetInvocation"] | components["schemas"]["StateMergeInvocation"] | components["schemas"]["StateSetInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -22562,6 +22651,7 @@ export type components = { qwen_image_2_1_l2i: components["schemas"]["ImageOutput"]; qwen_image_2_1_model_loader: components["schemas"]["QwenImage21ModelLoaderOutput"]; qwen_image_2_1_text_encoder: components["schemas"]["QwenImage21ConditioningOutput"]; + qwen_image_control: components["schemas"]["QwenImageControlOutput"]; qwen_image_denoise: components["schemas"]["LatentsOutput"]; qwen_image_i2l: components["schemas"]["LatentsOutput"]; qwen_image_l2i: components["schemas"]["ImageOutput"]; @@ -22705,7 +22795,7 @@ export type components = { * Invocation * @description The ID of the invocation */ - invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaDenoiseMetaInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLLLiteInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["AtlasCloudImageGenerationInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanLogicInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CollectionCartesianInvocation"] | components["schemas"]["CollectionConcatInvocation"] | components["schemas"]["CollectionZipInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["ForInvocation"] | components["schemas"]["ForReturnInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2StyleReferenceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LTX2AudioConditioningInvocation"] | components["schemas"]["LTX2DenoiseInvocation"] | components["schemas"]["LTX2DurationInvocation"] | components["schemas"]["LTX2ExtendConditioningInvocation"] | components["schemas"]["LTX2IdealDimensionsInvocation"] | components["schemas"]["LTX2ImageConditioningInvocation"] | components["schemas"]["LTX2LatentUpsampleInvocation"] | components["schemas"]["LTX2LatentsToVideoInvocation"] | components["schemas"]["LTX2LoRACollectionLoader"] | components["schemas"]["LTX2LoRALoaderInvocation"] | components["schemas"]["LTX2ModelLoaderInvocation"] | components["schemas"]["LTX2TextEncoderInvocation"] | components["schemas"]["LTX2VideoConditioningInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3HybridOverlayInvocation"] | components["schemas"]["MiniMaxH3IdealDimensionsInvocation"] | components["schemas"]["MiniMaxH3ImageReferenceInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3LoRACollectionLoader"] | components["schemas"]["MiniMaxH3LoRALoaderInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3ReferenceConditioningInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["MiniMaxH3VideoReferenceInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImage21DenoiseInvocation"] | components["schemas"]["QwenImage21ImageToLatentsInvocation"] | components["schemas"]["QwenImage21LatentsToImageInvocation"] | components["schemas"]["QwenImage21ModelLoaderInvocation"] | components["schemas"]["QwenImage21TextEncoderInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StateEmptyInvocation"] | components["schemas"]["StateGetInvocation"] | components["schemas"]["StateMergeInvocation"] | components["schemas"]["StateSetInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaDenoiseMetaInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLLLiteInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["AtlasCloudImageGenerationInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanLogicInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CollectionCartesianInvocation"] | components["schemas"]["CollectionConcatInvocation"] | components["schemas"]["CollectionZipInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["ForInvocation"] | components["schemas"]["ForReturnInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2StyleReferenceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LTX2AudioConditioningInvocation"] | components["schemas"]["LTX2DenoiseInvocation"] | components["schemas"]["LTX2DurationInvocation"] | components["schemas"]["LTX2ExtendConditioningInvocation"] | components["schemas"]["LTX2IdealDimensionsInvocation"] | components["schemas"]["LTX2ImageConditioningInvocation"] | components["schemas"]["LTX2LatentUpsampleInvocation"] | components["schemas"]["LTX2LatentsToVideoInvocation"] | components["schemas"]["LTX2LoRACollectionLoader"] | components["schemas"]["LTX2LoRALoaderInvocation"] | components["schemas"]["LTX2ModelLoaderInvocation"] | components["schemas"]["LTX2TextEncoderInvocation"] | components["schemas"]["LTX2VideoConditioningInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3HybridOverlayInvocation"] | components["schemas"]["MiniMaxH3IdealDimensionsInvocation"] | components["schemas"]["MiniMaxH3ImageReferenceInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3LoRACollectionLoader"] | components["schemas"]["MiniMaxH3LoRALoaderInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3ReferenceConditioningInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["MiniMaxH3VideoReferenceInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImage21DenoiseInvocation"] | components["schemas"]["QwenImage21ImageToLatentsInvocation"] | components["schemas"]["QwenImage21LatentsToImageInvocation"] | components["schemas"]["QwenImage21ModelLoaderInvocation"] | components["schemas"]["QwenImage21TextEncoderInvocation"] | components["schemas"]["QwenImageControlInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StateEmptyInvocation"] | components["schemas"]["StateGetInvocation"] | components["schemas"]["StateMergeInvocation"] | components["schemas"]["StateSetInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -22810,7 +22900,7 @@ export type components = { * Invocation * @description The ID of the invocation */ - invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaDenoiseMetaInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLLLiteInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["AtlasCloudImageGenerationInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanLogicInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CollectionCartesianInvocation"] | components["schemas"]["CollectionConcatInvocation"] | components["schemas"]["CollectionZipInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["ForInvocation"] | components["schemas"]["ForReturnInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2StyleReferenceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LTX2AudioConditioningInvocation"] | components["schemas"]["LTX2DenoiseInvocation"] | components["schemas"]["LTX2DurationInvocation"] | components["schemas"]["LTX2ExtendConditioningInvocation"] | components["schemas"]["LTX2IdealDimensionsInvocation"] | components["schemas"]["LTX2ImageConditioningInvocation"] | components["schemas"]["LTX2LatentUpsampleInvocation"] | components["schemas"]["LTX2LatentsToVideoInvocation"] | components["schemas"]["LTX2LoRACollectionLoader"] | components["schemas"]["LTX2LoRALoaderInvocation"] | components["schemas"]["LTX2ModelLoaderInvocation"] | components["schemas"]["LTX2TextEncoderInvocation"] | components["schemas"]["LTX2VideoConditioningInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3HybridOverlayInvocation"] | components["schemas"]["MiniMaxH3IdealDimensionsInvocation"] | components["schemas"]["MiniMaxH3ImageReferenceInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3LoRACollectionLoader"] | components["schemas"]["MiniMaxH3LoRALoaderInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3ReferenceConditioningInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["MiniMaxH3VideoReferenceInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImage21DenoiseInvocation"] | components["schemas"]["QwenImage21ImageToLatentsInvocation"] | components["schemas"]["QwenImage21LatentsToImageInvocation"] | components["schemas"]["QwenImage21ModelLoaderInvocation"] | components["schemas"]["QwenImage21TextEncoderInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StateEmptyInvocation"] | components["schemas"]["StateGetInvocation"] | components["schemas"]["StateMergeInvocation"] | components["schemas"]["StateSetInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaDenoiseMetaInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLLLiteInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["AtlasCloudImageGenerationInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanLogicInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CollectionCartesianInvocation"] | components["schemas"]["CollectionConcatInvocation"] | components["schemas"]["CollectionZipInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["ForInvocation"] | components["schemas"]["ForReturnInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2StyleReferenceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LTX2AudioConditioningInvocation"] | components["schemas"]["LTX2DenoiseInvocation"] | components["schemas"]["LTX2DurationInvocation"] | components["schemas"]["LTX2ExtendConditioningInvocation"] | components["schemas"]["LTX2IdealDimensionsInvocation"] | components["schemas"]["LTX2ImageConditioningInvocation"] | components["schemas"]["LTX2LatentUpsampleInvocation"] | components["schemas"]["LTX2LatentsToVideoInvocation"] | components["schemas"]["LTX2LoRACollectionLoader"] | components["schemas"]["LTX2LoRALoaderInvocation"] | components["schemas"]["LTX2ModelLoaderInvocation"] | components["schemas"]["LTX2TextEncoderInvocation"] | components["schemas"]["LTX2VideoConditioningInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3HybridOverlayInvocation"] | components["schemas"]["MiniMaxH3IdealDimensionsInvocation"] | components["schemas"]["MiniMaxH3ImageReferenceInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3LoRACollectionLoader"] | components["schemas"]["MiniMaxH3LoRALoaderInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3ReferenceConditioningInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["MiniMaxH3VideoReferenceInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImage21DenoiseInvocation"] | components["schemas"]["QwenImage21ImageToLatentsInvocation"] | components["schemas"]["QwenImage21LatentsToImageInvocation"] | components["schemas"]["QwenImage21ModelLoaderInvocation"] | components["schemas"]["QwenImage21TextEncoderInvocation"] | components["schemas"]["QwenImageControlInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StateEmptyInvocation"] | components["schemas"]["StateGetInvocation"] | components["schemas"]["StateMergeInvocation"] | components["schemas"]["StateSetInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -37271,7 +37361,7 @@ export type components = { * Config * @description The installed model's config */ - config: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + config: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; /** * ModelInstallDownloadProgressEvent @@ -37437,7 +37527,7 @@ export type components = { * Config Out * @description After successful installation, this will hold the configuration object. */ - config_out?: (components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]) | null; + config_out?: (components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]) | null; /** * Inplace * @description Leave model in its current location; otherwise install under models directory @@ -37523,7 +37613,7 @@ export type components = { * Config * @description The model's config */ - config: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + config: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; /** * @description The submodel type, if any * @default null @@ -37550,7 +37640,7 @@ export type components = { * Config * @description The model's config */ - config: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + config: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; /** * @description The submodel type, if any * @default null @@ -37777,7 +37867,7 @@ export type components = { */ ModelsList: { /** Models */ - models: (components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"])[]; + models: (components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"])[]; }; /** * Multiply Integers @@ -41338,6 +41428,159 @@ export type components = { */ type: "qwen_image_conditioning_output"; }; + /** + * QwenImageControlField + * @description Qwen Image Fun-ControlNet conditioning: a control image, an inpaint image with its mask, or both. + */ + QwenImageControlField: { + /** + * Image Name + * @description The preprocessed control image (Canny, depth, pose, ...) + * @default null + */ + image_name?: string | null; + /** + * Inpaint Image Name + * @description The image to inpaint + * @default null + */ + inpaint_image_name?: string | null; + /** + * Inpaint Mask Name + * @description The inpaint mask; white is regenerated + * @default null + */ + inpaint_mask_name?: string | null; + /** @description The Qwen Image ControlNet model */ + control_model: components["schemas"]["ModelIdentifierField"]; + /** + * Control Context Scale + * @description Strength of the control signal. Recommended range: 0.70-0.95. + * @default 0.85 + */ + control_context_scale?: number; + /** + * Begin Step Percent + * @description When the control is first applied (% of total steps) + * @default 0 + */ + begin_step_percent?: number; + /** + * End Step Percent + * @description When the control is last applied (% of total steps) + * @default 1 + */ + end_step_percent?: number; + /** + * Tiled + * @description Encode the control images in tiles. The denoise encodes them at generation size, which for an upscale is the enlarged frame -- too large for an untiled encode on consumer hardware. + * @default false + */ + tiled?: boolean; + /** + * Tile Size + * @description The tile size for VAE tiling in pixels (image space). If set to 0, the default tile size for the model will be used. Larger tile sizes generally produce better results at the cost of higher memory usage. Values between 1 and 64 are raised to 64. + * @default 0 + */ + tile_size?: number; + }; + /** + * Qwen Image ControlNet + * @description Configure the Qwen Image Fun-ControlNet-Union for spatial control, inpainting, or both. + * + * Takes a preprocessed control image (Canny, HED, depth, pose, MLSD, ...) and/or an image to inpaint with its mask + * (white is regenerated), plus the Qwen Image ControlNet model. Recommended control scale: 0.70-0.95. + */ + QwenImageControlInvocation: { + /** + * Id + * @description The id of this instance of an invocation. Must be unique among all instances of invocations. + */ + id: string; + /** + * Is Intermediate + * @description Whether or not this is an intermediate invocation. + * @default false + */ + is_intermediate?: boolean; + /** + * Use Cache + * @description Whether or not to use the cache + * @default true + */ + use_cache?: boolean; + /** + * @description The preprocessed control image (Canny, HED, depth, pose, MLSD, ...) + * @default null + */ + image?: components["schemas"]["ImageField"] | null; + /** + * @description The image to inpaint. Goes together with the inpaint mask. + * @default null + */ + inpaint_image?: components["schemas"]["ImageField"] | null; + /** + * @description The inpaint mask: white is regenerated, black is kept. Goes together with the inpaint image. + * @default null + */ + inpaint_mask?: components["schemas"]["ImageField"] | null; + /** + * Control Model + * @description ControlNet model to load + * @default null + */ + control_model?: components["schemas"]["ModelIdentifierField"] | null; + /** + * Control Scale + * @description Strength of the control signal. Recommended range: 0.70-0.95. + * @default 0.85 + */ + control_context_scale?: number; + /** + * Begin Step Percent + * @description When the control is first applied (% of total steps) + * @default 0 + */ + begin_step_percent?: number; + /** + * End Step Percent + * @description When the control is last applied (% of total steps) + * @default 1 + */ + end_step_percent?: number; + /** + * Tiled + * @description Processing using overlapping tiles (reduce memory consumption) + * @default false + */ + tiled?: boolean; + /** + * Tile Size + * @description The tile size for VAE tiling in pixels (image space). If set to 0, the default tile size for the model will be used. Larger tile sizes generally produce better results at the cost of higher memory usage. Values between 1 and 64 are raised to 64. + * @default 0 + */ + tile_size?: number; + /** + * type + * @default qwen_image_control + * @constant + */ + type: "qwen_image_control"; + }; + /** + * QwenImageControlOutput + * @description Qwen Image Control output containing control configuration. + */ + QwenImageControlOutput: { + /** @description Qwen Image control conditioning */ + control: components["schemas"]["QwenImageControlField"]; + /** + * type + * @default qwen_image_control_output + * @constant + */ + type: "qwen_image_control_output"; + }; /** * Denoise - Qwen Image * @description Run the denoising process with a Qwen Image model. @@ -41449,6 +41692,16 @@ export type components = { * @default null */ shift?: number | null; + /** + * @description Qwen Image ControlNet conditioning: spatial control (Canny, depth, pose, ...) and/or inpainting. + * @default null + */ + control?: components["schemas"]["QwenImageControlField"] | null; + /** + * @description VAE Required for control conditioning. + * @default null + */ + vae?: components["schemas"]["VAEField"] | null; /** * type * @default qwen_image_denoise @@ -54329,7 +54582,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; }; /** @description Validation Error */ @@ -54361,7 +54614,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; }; /** @description Validation Error */ @@ -54413,7 +54666,7 @@ export interface operations { * "upcast_attention": false * } */ - "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; }; /** @description Bad request */ @@ -54527,7 +54780,7 @@ export interface operations { * "upcast_attention": false * } */ - "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; }; /** @description Bad request */ @@ -54600,7 +54853,7 @@ export interface operations { * "upcast_attention": false * } */ - "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; }; /** @description Bad request */ @@ -55401,7 +55654,7 @@ export interface operations { * "upcast_attention": false * } */ - "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; }; /** @description Bad request */ diff --git a/invokeai/frontend/webv2/public/locales/en.json b/invokeai/frontend/webv2/public/locales/en.json index 5ed4de02fc2..553dc2c6815 100644 --- a/invokeai/frontend/webv2/public/locales/en.json +++ b/invokeai/frontend/webv2/public/locales/en.json @@ -3747,6 +3747,7 @@ "content_shuffle": "Content shuffle", "depth_anything_depth_estimation": "Depth Anything", "dw_openpose_detection": "DW Openpose", + "grayscale": "Grayscale", "hed_edge_detection": "HED", "img_blur": "Blur", "img_noise": "Noise", @@ -3769,6 +3770,7 @@ "anima_lllite": "Anima ControlNet-LLLite", "control_lora": "Control LoRA", "controlnet": "ControlNet", + "qwen_image_control": "Qwen Image ControlNet", "t2i_adapter": "T2I Adapter", "z_image_control": "Z-Image ControlNet" }, @@ -3797,6 +3799,8 @@ "lllite_channels_unknown": "This ControlNet-LLLite model's adapter type is unknown. Re-identify it in the Model Manager.", "lllite_inpaint_adapter": "This is an inpainting ControlNet-LLLite adapter; a control layer needs a control adapter.", "missing_model": "Select a control model before generating.", + "qwen_image_control_limit": "Only one Qwen Image ControlNet can be used at a time.", + "qwen_image_edit_control": "Qwen Image ControlNet is not compatible with Qwen Image Edit models.", "switch_adapter_kind": "Switch the adapter type to {{kind}} to use this layer with the selected model.", "unsupported_adapter": "This control adapter is not supported by the selected base model.", "z_image_control_limit": "Only one Z-Image control can be used at a time." diff --git a/invokeai/frontend/webv2/src/features/generation/core/__fixtures__/architectureCapabilities.json b/invokeai/frontend/webv2/src/features/generation/core/__fixtures__/architectureCapabilities.json index 005e93e4968..89bbf689e3c 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/__fixtures__/architectureCapabilities.json +++ b/invokeai/frontend/webv2/src/features/generation/core/__fixtures__/architectureCapabilities.json @@ -789,7 +789,9 @@ "guidance_max": null, "scheduler_set": "standard", "scheduler_applies_to_graph": false, - "control_kinds": [], + "control_kinds": [ + "qwen_image_control" + ], "max_reference_images": 5, "reference_images_require_variant": "edit", "supports_regional_guidance": false, diff --git a/invokeai/frontend/webv2/src/features/generation/core/__snapshots__/generateGraphNodeTypes.json b/invokeai/frontend/webv2/src/features/generation/core/__snapshots__/generateGraphNodeTypes.json index 61bcecb9982..e1a76961741 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/__snapshots__/generateGraphNodeTypes.json +++ b/invokeai/frontend/webv2/src/features/generation/core/__snapshots__/generateGraphNodeTypes.json @@ -1523,7 +1523,8 @@ "negative_conditioning", "positive_conditioning", "seed", - "transformer" + "transformer", + "vae" ], "literalInputs": { "cfg_scale": [ diff --git a/invokeai/frontend/webv2/src/features/generation/core/__snapshots__/qwenImageControlCanvasGraphs.json b/invokeai/frontend/webv2/src/features/generation/core/__snapshots__/qwenImageControlCanvasGraphs.json new file mode 100644 index 00000000000..19fd1898747 --- /dev/null +++ b/invokeai/frontend/webv2/src/features/generation/core/__snapshots__/qwenImageControlCanvasGraphs.json @@ -0,0 +1,1160 @@ +{ + "_comment": "Generated by compileCanvasGraph.test.ts; regenerate with `vitest -u`. Consumed by tests/app/invocations/test_frontend_qwen_image_control_graphs.py, which validates the graphs against the backend invocations.", + "inpaint_control_layer": { + "edges": [ + { + "destination": { + "field": "vae", + "node_id": "canvas_l2i" + }, + "source": { + "field": "vae", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "latents", + "node_id": "canvas_l2i" + }, + "source": { + "field": "latents", + "node_id": "denoise_latents" + } + }, + { + "destination": { + "field": "transformer", + "node_id": "denoise_latents" + }, + "source": { + "field": "transformer", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "vae", + "node_id": "denoise_latents" + }, + "source": { + "field": "vae", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "qwen_vl_encoder", + "node_id": "pos_cond" + }, + "source": { + "field": "qwen_vl_encoder", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "prompt", + "node_id": "pos_cond" + }, + "source": { + "field": "value", + "node_id": "positive_prompt" + } + }, + { + "destination": { + "field": "positive_conditioning", + "node_id": "denoise_latents" + }, + "source": { + "field": "conditioning", + "node_id": "pos_cond" + } + }, + { + "destination": { + "field": "qwen_vl_encoder", + "node_id": "neg_cond" + }, + "source": { + "field": "qwen_vl_encoder", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "prompt", + "node_id": "neg_cond" + }, + "source": { + "field": "value", + "node_id": "negative_prompt" + } + }, + { + "destination": { + "field": "negative_conditioning", + "node_id": "denoise_latents" + }, + "source": { + "field": "conditioning", + "node_id": "neg_cond" + } + }, + { + "destination": { + "field": "seed", + "node_id": "denoise_latents" + }, + "source": { + "field": "value", + "node_id": "seed" + } + }, + { + "destination": { + "field": "seed", + "node_id": "core_metadata_0_i" + }, + "source": { + "field": "value", + "node_id": "seed" + } + }, + { + "destination": { + "field": "positive_prompt", + "node_id": "core_metadata_0_i" + }, + "source": { + "field": "value", + "node_id": "positive_prompt" + } + }, + { + "destination": { + "field": "negative_prompt", + "node_id": "core_metadata_0_i" + }, + "source": { + "field": "value", + "node_id": "negative_prompt" + } + }, + { + "destination": { + "field": "metadata", + "node_id": "canvas_output" + }, + "source": { + "field": "metadata", + "node_id": "core_metadata_0_i" + } + }, + { + "destination": { + "field": "vae", + "node_id": "canvas_i2l" + }, + "source": { + "field": "vae", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "latents", + "node_id": "denoise_latents" + }, + "source": { + "field": "latents", + "node_id": "canvas_i2l" + } + }, + { + "destination": { + "field": "vae", + "node_id": "create_gradient_mask" + }, + "source": { + "field": "vae", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "denoise_mask", + "node_id": "denoise_latents" + }, + "source": { + "field": "denoise_mask", + "node_id": "create_gradient_mask" + } + }, + { + "destination": { + "field": "mask", + "node_id": "expand_mask" + }, + "source": { + "field": "expanded_mask_area", + "node_id": "create_gradient_mask" + } + }, + { + "destination": { + "field": "layer_upper", + "node_id": "canvas_output" + }, + "source": { + "field": "image", + "node_id": "canvas_l2i" + } + }, + { + "destination": { + "field": "mask", + "node_id": "canvas_output" + }, + "source": { + "field": "image", + "node_id": "expand_mask" + } + }, + { + "destination": { + "field": "inpaint_mask", + "node_id": "qwen_image_control_q-control" + }, + "source": { + "field": "image", + "node_id": "qwen_image_control_mask_q-control" + } + }, + { + "destination": { + "field": "control", + "node_id": "denoise_latents" + }, + "source": { + "field": "control", + "node_id": "qwen_image_control_q-control" + } + } + ], + "id": "qwen_image_control_canvas_inpaint", + "nodes": { + "negative_prompt": { + "is_intermediate": true, + "use_cache": true, + "id": "negative_prompt", + "type": "string" + }, + "positive_prompt": { + "is_intermediate": true, + "use_cache": true, + "id": "positive_prompt", + "type": "string" + }, + "seed": { + "is_intermediate": true, + "use_cache": true, + "id": "seed", + "type": "integer" + }, + "model_loader": { + "is_intermediate": true, + "use_cache": true, + "id": "model_loader", + "model": { + "base": "qwen-image", + "format": "diffusers", + "key": "qwen-model", + "name": "Qwen Image", + "type": "main", + "hash": "blake3:qwen" + }, + "type": "qwen_image_model_loader" + }, + "pos_cond": { + "is_intermediate": true, + "use_cache": true, + "id": "pos_cond", + "type": "qwen_image_text_encoder" + }, + "neg_cond": { + "is_intermediate": true, + "use_cache": true, + "id": "neg_cond", + "type": "qwen_image_text_encoder" + }, + "denoise_latents": { + "is_intermediate": true, + "use_cache": true, + "cfg_scale": 4, + "height": 1024, + "id": "denoise_latents", + "steps": 40, + "type": "qwen_image_denoise", + "width": 768, + "denoising_start": 0.4, + "denoising_end": 1 + }, + "core_metadata_0_i": { + "is_intermediate": true, + "use_cache": true, + "cfg_scale": 4, + "cfg_rescale_multiplier": 0, + "generation_mode": "qwen_image_inpaint", + "height": 1024, + "id": "core_metadata_0_i", + "model": { + "base": "qwen-image", + "format": "diffusers", + "key": "qwen-model", + "name": "Qwen Image", + "type": "main", + "hash": "blake3:qwen" + }, + "rand_device": "cpu", + "seamless_x": false, + "seamless_y": false, + "steps": 40, + "type": "core_metadata", + "width": 768, + "qwen_image_quantization": "none", + "qwen_image_shift": "auto", + "clip_skip": 0, + "strength": 0.6 + }, + "canvas_i2l": { + "is_intermediate": true, + "use_cache": true, + "id": "canvas_i2l", + "type": "qwen_image_i2l", + "image": { + "image_name": "canvas-composite.png" + } + }, + "create_gradient_mask": { + "is_intermediate": true, + "use_cache": true, + "coherence_mode": "Gaussian Blur", + "edge_radius": 16, + "fp32": false, + "id": "create_gradient_mask", + "image": { + "image_name": "canvas-composite.png" + }, + "minimum_denoise": 0, + "type": "create_gradient_mask", + "mask": { + "image_name": "canvas-mask.png" + } + }, + "expand_mask": { + "is_intermediate": true, + "use_cache": true, + "fade_size_px": 16, + "id": "expand_mask", + "type": "expand_mask_with_fade" + }, + "canvas_l2i": { + "is_intermediate": true, + "use_cache": false, + "id": "canvas_l2i", + "type": "qwen_image_l2i" + }, + "canvas_output": { + "is_intermediate": true, + "use_cache": false, + "layer_base": { + "image_name": "canvas-composite.png" + }, + "type": "invokeai_img_blend", + "id": "canvas_output" + }, + "qwen_image_control_q-control": { + "is_intermediate": true, + "use_cache": true, + "begin_step_percent": 0, + "control_context_scale": 0.85, + "control_model": { + "base": "qwen-image", + "key": "qwen-union", + "name": "Qwen Image ControlNet Union", + "type": "controlnet", + "hash": "blake3:union" + }, + "end_step_percent": 1, + "id": "qwen_image_control_q-control", + "image": { + "image_name": "q-control.png" + }, + "type": "qwen_image_control", + "inpaint_image": { + "image_name": "canvas-composite.png" + } + }, + "qwen_image_control_mask_q-control": { + "is_intermediate": true, + "use_cache": true, + "id": "qwen_image_control_mask_q-control", + "max": 0, + "min": 255, + "type": "img_lerp", + "image": { + "image_name": "canvas-mask.png" + } + } + } + }, + "outpaint_control_layer": { + "edges": [ + { + "destination": { + "field": "vae", + "node_id": "canvas_l2i" + }, + "source": { + "field": "vae", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "latents", + "node_id": "canvas_l2i" + }, + "source": { + "field": "latents", + "node_id": "denoise_latents" + } + }, + { + "destination": { + "field": "transformer", + "node_id": "denoise_latents" + }, + "source": { + "field": "transformer", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "vae", + "node_id": "denoise_latents" + }, + "source": { + "field": "vae", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "qwen_vl_encoder", + "node_id": "pos_cond" + }, + "source": { + "field": "qwen_vl_encoder", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "prompt", + "node_id": "pos_cond" + }, + "source": { + "field": "value", + "node_id": "positive_prompt" + } + }, + { + "destination": { + "field": "positive_conditioning", + "node_id": "denoise_latents" + }, + "source": { + "field": "conditioning", + "node_id": "pos_cond" + } + }, + { + "destination": { + "field": "qwen_vl_encoder", + "node_id": "neg_cond" + }, + "source": { + "field": "qwen_vl_encoder", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "prompt", + "node_id": "neg_cond" + }, + "source": { + "field": "value", + "node_id": "negative_prompt" + } + }, + { + "destination": { + "field": "negative_conditioning", + "node_id": "denoise_latents" + }, + "source": { + "field": "conditioning", + "node_id": "neg_cond" + } + }, + { + "destination": { + "field": "seed", + "node_id": "denoise_latents" + }, + "source": { + "field": "value", + "node_id": "seed" + } + }, + { + "destination": { + "field": "seed", + "node_id": "core_metadata_0_i" + }, + "source": { + "field": "value", + "node_id": "seed" + } + }, + { + "destination": { + "field": "positive_prompt", + "node_id": "core_metadata_0_i" + }, + "source": { + "field": "value", + "node_id": "positive_prompt" + } + }, + { + "destination": { + "field": "negative_prompt", + "node_id": "core_metadata_0_i" + }, + "source": { + "field": "value", + "node_id": "negative_prompt" + } + }, + { + "destination": { + "field": "metadata", + "node_id": "canvas_output" + }, + "source": { + "field": "metadata", + "node_id": "core_metadata_0_i" + } + }, + { + "destination": { + "field": "mask2", + "node_id": "mask_combine" + }, + "source": { + "field": "image", + "node_id": "image_alpha_to_mask" + } + }, + { + "destination": { + "field": "image", + "node_id": "canvas_i2l" + }, + "source": { + "field": "image", + "node_id": "infill" + } + }, + { + "destination": { + "field": "vae", + "node_id": "canvas_i2l" + }, + "source": { + "field": "vae", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "latents", + "node_id": "denoise_latents" + }, + "source": { + "field": "latents", + "node_id": "canvas_i2l" + } + }, + { + "destination": { + "field": "mask", + "node_id": "create_gradient_mask" + }, + "source": { + "field": "image", + "node_id": "mask_combine" + } + }, + { + "destination": { + "field": "vae", + "node_id": "create_gradient_mask" + }, + "source": { + "field": "vae", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "denoise_mask", + "node_id": "denoise_latents" + }, + "source": { + "field": "denoise_mask", + "node_id": "create_gradient_mask" + } + }, + { + "destination": { + "field": "mask", + "node_id": "expand_mask" + }, + "source": { + "field": "expanded_mask_area", + "node_id": "create_gradient_mask" + } + }, + { + "destination": { + "field": "layer_upper", + "node_id": "canvas_output" + }, + "source": { + "field": "image", + "node_id": "canvas_l2i" + } + }, + { + "destination": { + "field": "mask", + "node_id": "canvas_output" + }, + "source": { + "field": "image", + "node_id": "expand_mask" + } + }, + { + "destination": { + "field": "image", + "node_id": "qwen_image_control_mask_q-control" + }, + "source": { + "field": "image", + "node_id": "mask_combine" + } + }, + { + "destination": { + "field": "inpaint_image", + "node_id": "qwen_image_control_q-control" + }, + "source": { + "field": "image", + "node_id": "infill" + } + }, + { + "destination": { + "field": "inpaint_mask", + "node_id": "qwen_image_control_q-control" + }, + "source": { + "field": "image", + "node_id": "qwen_image_control_mask_q-control" + } + }, + { + "destination": { + "field": "control", + "node_id": "denoise_latents" + }, + "source": { + "field": "control", + "node_id": "qwen_image_control_q-control" + } + } + ], + "id": "qwen_image_control_canvas_outpaint", + "nodes": { + "negative_prompt": { + "is_intermediate": true, + "use_cache": true, + "id": "negative_prompt", + "type": "string" + }, + "positive_prompt": { + "is_intermediate": true, + "use_cache": true, + "id": "positive_prompt", + "type": "string" + }, + "seed": { + "is_intermediate": true, + "use_cache": true, + "id": "seed", + "type": "integer" + }, + "model_loader": { + "is_intermediate": true, + "use_cache": true, + "id": "model_loader", + "model": { + "base": "qwen-image", + "format": "diffusers", + "key": "qwen-model", + "name": "Qwen Image", + "type": "main", + "hash": "blake3:qwen" + }, + "type": "qwen_image_model_loader" + }, + "pos_cond": { + "is_intermediate": true, + "use_cache": true, + "id": "pos_cond", + "type": "qwen_image_text_encoder" + }, + "neg_cond": { + "is_intermediate": true, + "use_cache": true, + "id": "neg_cond", + "type": "qwen_image_text_encoder" + }, + "denoise_latents": { + "is_intermediate": true, + "use_cache": true, + "cfg_scale": 4, + "height": 1024, + "id": "denoise_latents", + "steps": 40, + "type": "qwen_image_denoise", + "width": 768, + "denoising_start": 0.4, + "denoising_end": 1 + }, + "core_metadata_0_i": { + "is_intermediate": true, + "use_cache": true, + "cfg_scale": 4, + "cfg_rescale_multiplier": 0, + "generation_mode": "qwen_image_outpaint", + "height": 1024, + "id": "core_metadata_0_i", + "model": { + "base": "qwen-image", + "format": "diffusers", + "key": "qwen-model", + "name": "Qwen Image", + "type": "main", + "hash": "blake3:qwen" + }, + "rand_device": "cpu", + "seamless_x": false, + "seamless_y": false, + "steps": 40, + "type": "core_metadata", + "width": 768, + "qwen_image_quantization": "none", + "qwen_image_shift": "auto", + "clip_skip": 0, + "strength": 0.6 + }, + "infill": { + "is_intermediate": true, + "use_cache": true, + "id": "infill", + "type": "infill_lama", + "image": { + "image_name": "canvas-composite.png" + } + }, + "image_alpha_to_mask": { + "is_intermediate": true, + "use_cache": true, + "id": "image_alpha_to_mask", + "image": { + "image_name": "canvas-composite.png" + }, + "type": "tomask" + }, + "mask_combine": { + "is_intermediate": true, + "use_cache": true, + "id": "mask_combine", + "mask1": { + "image_name": "canvas-mask.png" + }, + "type": "mask_combine" + }, + "canvas_i2l": { + "is_intermediate": true, + "use_cache": true, + "id": "canvas_i2l", + "type": "qwen_image_i2l" + }, + "create_gradient_mask": { + "is_intermediate": true, + "use_cache": true, + "coherence_mode": "Gaussian Blur", + "edge_radius": 16, + "fp32": false, + "id": "create_gradient_mask", + "image": { + "image_name": "canvas-composite.png" + }, + "minimum_denoise": 0, + "type": "create_gradient_mask" + }, + "expand_mask": { + "is_intermediate": true, + "use_cache": true, + "fade_size_px": 16, + "id": "expand_mask", + "type": "expand_mask_with_fade" + }, + "canvas_l2i": { + "is_intermediate": true, + "use_cache": false, + "id": "canvas_l2i", + "type": "qwen_image_l2i" + }, + "canvas_output": { + "is_intermediate": true, + "use_cache": false, + "layer_base": { + "image_name": "canvas-composite.png" + }, + "type": "invokeai_img_blend", + "id": "canvas_output" + }, + "qwen_image_control_q-control": { + "is_intermediate": true, + "use_cache": true, + "begin_step_percent": 0, + "control_context_scale": 0.85, + "control_model": { + "base": "qwen-image", + "key": "qwen-union", + "name": "Qwen Image ControlNet Union", + "type": "controlnet", + "hash": "blake3:union" + }, + "end_step_percent": 1, + "id": "qwen_image_control_q-control", + "image": { + "image_name": "q-control.png" + }, + "type": "qwen_image_control" + }, + "qwen_image_control_mask_q-control": { + "is_intermediate": true, + "use_cache": true, + "id": "qwen_image_control_mask_q-control", + "max": 0, + "min": 255, + "type": "img_lerp" + } + } + }, + "txt2img_control_layer": { + "edges": [ + { + "destination": { + "field": "vae", + "node_id": "canvas_output" + }, + "source": { + "field": "vae", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "latents", + "node_id": "canvas_output" + }, + "source": { + "field": "latents", + "node_id": "denoise_latents" + } + }, + { + "destination": { + "field": "transformer", + "node_id": "denoise_latents" + }, + "source": { + "field": "transformer", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "vae", + "node_id": "denoise_latents" + }, + "source": { + "field": "vae", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "qwen_vl_encoder", + "node_id": "pos_cond" + }, + "source": { + "field": "qwen_vl_encoder", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "prompt", + "node_id": "pos_cond" + }, + "source": { + "field": "value", + "node_id": "positive_prompt" + } + }, + { + "destination": { + "field": "positive_conditioning", + "node_id": "denoise_latents" + }, + "source": { + "field": "conditioning", + "node_id": "pos_cond" + } + }, + { + "destination": { + "field": "qwen_vl_encoder", + "node_id": "neg_cond" + }, + "source": { + "field": "qwen_vl_encoder", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "prompt", + "node_id": "neg_cond" + }, + "source": { + "field": "value", + "node_id": "negative_prompt" + } + }, + { + "destination": { + "field": "negative_conditioning", + "node_id": "denoise_latents" + }, + "source": { + "field": "conditioning", + "node_id": "neg_cond" + } + }, + { + "destination": { + "field": "seed", + "node_id": "denoise_latents" + }, + "source": { + "field": "value", + "node_id": "seed" + } + }, + { + "destination": { + "field": "seed", + "node_id": "core_metadata_0_i" + }, + "source": { + "field": "value", + "node_id": "seed" + } + }, + { + "destination": { + "field": "positive_prompt", + "node_id": "core_metadata_0_i" + }, + "source": { + "field": "value", + "node_id": "positive_prompt" + } + }, + { + "destination": { + "field": "negative_prompt", + "node_id": "core_metadata_0_i" + }, + "source": { + "field": "value", + "node_id": "negative_prompt" + } + }, + { + "destination": { + "field": "metadata", + "node_id": "canvas_output" + }, + "source": { + "field": "metadata", + "node_id": "core_metadata_0_i" + } + }, + { + "destination": { + "field": "control", + "node_id": "denoise_latents" + }, + "source": { + "field": "control", + "node_id": "qwen_image_control_q-control" + } + } + ], + "id": "qwen_image_control_canvas_txt2img", + "nodes": { + "negative_prompt": { + "is_intermediate": true, + "use_cache": true, + "id": "negative_prompt", + "type": "string" + }, + "positive_prompt": { + "is_intermediate": true, + "use_cache": true, + "id": "positive_prompt", + "type": "string" + }, + "seed": { + "is_intermediate": true, + "use_cache": true, + "id": "seed", + "type": "integer" + }, + "model_loader": { + "is_intermediate": true, + "use_cache": true, + "id": "model_loader", + "model": { + "base": "qwen-image", + "format": "diffusers", + "key": "qwen-model", + "name": "Qwen Image", + "type": "main", + "hash": "blake3:qwen" + }, + "type": "qwen_image_model_loader" + }, + "pos_cond": { + "is_intermediate": true, + "use_cache": true, + "id": "pos_cond", + "type": "qwen_image_text_encoder" + }, + "neg_cond": { + "is_intermediate": true, + "use_cache": true, + "id": "neg_cond", + "type": "qwen_image_text_encoder" + }, + "denoise_latents": { + "is_intermediate": true, + "use_cache": true, + "cfg_scale": 4, + "height": 1024, + "id": "denoise_latents", + "steps": 40, + "type": "qwen_image_denoise", + "width": 768 + }, + "canvas_output": { + "is_intermediate": true, + "use_cache": false, + "id": "canvas_output", + "type": "qwen_image_l2i" + }, + "core_metadata_0_i": { + "is_intermediate": true, + "use_cache": true, + "cfg_scale": 4, + "cfg_rescale_multiplier": 0, + "generation_mode": "qwen_image_txt2img", + "height": 1024, + "id": "core_metadata_0_i", + "model": { + "base": "qwen-image", + "format": "diffusers", + "key": "qwen-model", + "name": "Qwen Image", + "type": "main", + "hash": "blake3:qwen" + }, + "rand_device": "cpu", + "seamless_x": false, + "seamless_y": false, + "steps": 40, + "type": "core_metadata", + "width": 768, + "qwen_image_quantization": "none", + "qwen_image_shift": "auto", + "clip_skip": 0 + }, + "qwen_image_control_q-control": { + "is_intermediate": true, + "use_cache": true, + "begin_step_percent": 0, + "control_context_scale": 0.85, + "control_model": { + "base": "qwen-image", + "key": "qwen-union", + "name": "Qwen Image ControlNet Union", + "type": "controlnet", + "hash": "blake3:union" + }, + "end_step_percent": 1, + "id": "qwen_image_control_q-control", + "image": { + "image_name": "q-control.png" + }, + "type": "qwen_image_control" + } + } + } +} diff --git a/invokeai/frontend/webv2/src/features/generation/core/architectureCapabilities.test.ts b/invokeai/frontend/webv2/src/features/generation/core/architectureCapabilities.test.ts index 4a6bacb466d..d04352ee1c4 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/architectureCapabilities.test.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/architectureCapabilities.test.ts @@ -117,6 +117,7 @@ describe('the registry', () => { expect(getArchitectureFeatures('sd-1')?.control_kinds).toEqual(['controlnet', 't2i_adapter']); expect(getArchitectureFeatures('z-image')?.control_kinds).toEqual(['z_image_control']); + expect(getArchitectureFeatures('qwen-image')?.control_kinds).toEqual(['qwen_image_control']); expect(getArchitectureFeatures('made-up')).toBeUndefined(); }); diff --git a/invokeai/frontend/webv2/src/features/generation/core/canvas/addControlLayers.test.ts b/invokeai/frontend/webv2/src/features/generation/core/canvas/addControlLayers.test.ts index 13b19bb86d3..82caeb025d7 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/canvas/addControlLayers.test.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/canvas/addControlLayers.test.ts @@ -76,6 +76,13 @@ describe('isControlKindSupportedForBase', () => { expect(isControlKindSupportedForBase('anima', 'controlnet')).toBe(false); }); + it('qwen_image_control is supported on qwen-image only, which supports nothing else', () => { + expect(isControlKindSupportedForBase('qwen-image', 'qwen_image_control')).toBe(true); + expect(isControlKindSupportedForBase('z-image', 'qwen_image_control')).toBe(false); + expect(isControlKindSupportedForBase('qwen-image', 'controlnet')).toBe(false); + expect(isControlKindSupportedForBase('qwen-image', 'z_image_control')).toBe(false); + }); + it('control_lora is supported on flux only', () => { expect(isControlKindSupportedForBase('flux', 'control_lora')).toBe(true); expect(isControlKindSupportedForBase('sd-1', 'control_lora')).toBe(false); @@ -348,6 +355,127 @@ describe('addControlLayers — Z-Image control', () => { }); }); +describe('addControlLayers — Qwen-Image control', () => { + const union = model('qwen-image', 'controlnet'); + const qwenLayer = (id: string, overrides: Partial = {}) => + layer({ + beginEndStepPct: [0, 1], + controlMode: null, + id, + imageName: `${id}.png`, + kind: 'qwen_image_control', + model: union, + weight: 0.85, + ...overrides, + }); + const inpaint = { image: { image_name: 'composite.png' }, mask: { image_name: 'canvas-mask.png' } }; + + it('creates the exact backend node and connects it directly to the Qwen-Image denoise', () => { + const graph = run({ + base: 'qwen-image', + layers: [qwenLayer('Q1', { beginEndStepPct: [0.2, 0.9], imageName: 'canny.png', weight: 0.7 })], + }); + + expect(graph.nodes.qwen_image_control_Q1).toEqual({ + begin_step_percent: 0.2, + control_context_scale: 0.7, + control_model: union, + end_step_percent: 0.9, + id: 'qwen_image_control_Q1', + image: { image_name: 'canny.png' }, + is_intermediate: true, + type: 'qwen_image_control', + use_cache: true, + }); + expect(graph.edges).toEqual([ + { + destination: { field: 'control', node_id: 'denoise_latents' }, + source: { field: 'control', node_id: 'qwen_image_control_Q1' }, + }, + ]); + // Without inpaint inputs the control image is all the node gets: no collector, no mask node. + expect(Object.keys(graph.nodes)).toEqual(['denoise_latents', 'qwen_image_control_Q1']); + }); + + it('feeds the inpaint image and the inverted canvas mask from fixed image fields', () => { + const graph = run({ base: 'qwen-image', inpaint, layers: [qwenLayer('Q1')] }); + + expect(graph.nodes.qwen_image_control_Q1).toMatchObject({ inpaint_image: { image_name: 'composite.png' } }); + // The canvas mask is white = keep; the node regenerates white, so 255 → 0 inverts it. + expect(graph.nodes.qwen_image_control_mask_Q1).toEqual({ + id: 'qwen_image_control_mask_Q1', + image: { image_name: 'canvas-mask.png' }, + is_intermediate: true, + max: 0, + min: 255, + type: 'img_lerp', + use_cache: true, + }); + expect(edgesTo(graph, 'qwen_image_control_Q1', 'inpaint_mask').map((edge) => edge.source)).toEqual([ + { field: 'image', node_id: 'qwen_image_control_mask_Q1' }, + ]); + expect(edgesTo(graph, 'qwen_image_control_Q1', 'inpaint_image')).toEqual([]); + }); + + it('feeds the inpaint image and mask through edges when nodes produce them', () => { + const graph = baseGraph(); + const resize = { id: 'resize', type: 'img_resize' }; + const combine = { id: 'combine', type: 'mask_combine' }; + graph.nodes.resize = resize; + graph.nodes.combine = combine; + addControlLayers(graph as never, { + base: 'qwen-image', + inpaint: { image: { field: 'image', node: resize }, mask: { field: 'image', node: combine } }, + layers: [qwenLayer('Q1')], + }); + + expect(graph.nodes.qwen_image_control_Q1).not.toHaveProperty('inpaint_image'); + expect(graph.nodes.qwen_image_control_mask_Q1).not.toHaveProperty('image'); + expect(edgesTo(graph, 'qwen_image_control_Q1', 'inpaint_image').map((edge) => edge.source)).toEqual([ + { field: 'image', node_id: 'resize' }, + ]); + expect(edgesTo(graph, 'qwen_image_control_mask_Q1', 'image').map((edge) => edge.source)).toEqual([ + { field: 'image', node_id: 'combine' }, + ]); + expect(edgesTo(graph, 'qwen_image_control_Q1', 'inpaint_mask').map((edge) => edge.source)).toEqual([ + { field: 'image', node_id: 'qwen_image_control_mask_Q1' }, + ]); + }); + + it('leaves the inpaint inputs to the kinds that condition on the region', () => { + const graph = run({ + base: 'z-image', + inpaint, + layers: [layer({ id: 'Z1', kind: 'z_image_control', model: model('z-image', 'controlnet') })], + }); + + expect(graph.nodes.z_image_control_Z1).not.toHaveProperty('inpaint_image'); + expect(Object.values(graph.nodes).some((node) => node.type === 'img_lerp')).toBe(false); + }); + + it('rejects a second Qwen-Image control because denoise accepts a single field', () => { + expect(() => run({ base: 'qwen-image', layers: [qwenLayer('Q1'), qwenLayer('Q2')] })).toThrow( + /qwen_image_control_limit/ + ); + }); + + it('rejects the control on the Edit variant, whose transformer the denoise refuses to control', () => { + expect(() => run({ base: 'qwen-image', layers: [qwenLayer('Q1')], modelVariant: 'edit' })).toThrow( + /qwen_image_edit_control/ + ); + }); + + it.each([ + [{ weight: -0.01 }, /invalid_adapter_values/], + [{ weight: 2.01 }, /invalid_adapter_values/], + [{ model: model('z-image', 'controlnet') }, /incompatible_base/], + [{ model: model('qwen-image', 'lora') }, /incompatible_adapter/], + [{ kind: 'controlnet' as const }, /switch_adapter_kind/], + ])('rejects %o', (overrides, reason) => { + expect(() => run({ base: 'qwen-image', layers: [qwenLayer('Q1', overrides)] })).toThrow(reason); + }); +}); + describe('addControlLayers — Anima ControlNet-LLLite', () => { const lllite = (key: string): ControlModelIdentifier => ({ base: 'anima', diff --git a/invokeai/frontend/webv2/src/features/generation/core/canvas/addControlLayers.ts b/invokeai/frontend/webv2/src/features/generation/core/canvas/addControlLayers.ts index 4f7b689f1c1..9ed4549d6dd 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/canvas/addControlLayers.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/canvas/addControlLayers.ts @@ -45,14 +45,45 @@ export interface ControlLayerGraphInput { /** Kind support is separate from control-mode/model compatibility. */ export { isControlKindSupportedForBase } from './controlValidation'; +/** A node feeding an image input through an edge, or a fixed image field when no node produces it. */ +export type ImageSource = { node: BackendInvocationContract; field: string } | { image_name: string }; + +/** + * What the canvas inpaint and outpaint graphs regenerate: the image the denoise encodes, at processing size, and + * the canvas mask as uploaded (white = keep). Adapters that condition on the region read both. + */ +export interface CanvasInpaintSources { + image: ImageSource; + mask: ImageSource; +} + +/** Feeds `field` of `node` from `source`: an edge from the producing node, or the fixed image field. */ +const feedImage = ( + graph: BackendGraphContract, + node: BackendInvocationContract, + field: string, + source: ImageSource +): void => { + if ('node' in source) { + addEdge(graph, source.node, source.field, node, field); + } else { + node[field] = source; + } +}; + /** Options for {@link addControlLayers}. */ export interface AddControlLayersOptions { /** The main model base — selects the adapter nodes and support. */ base: SupportedGenerateBase; - /** The main model variant (a FLUX `dev_fill` blocks Control LoRA). */ + /** The main model variant (a FLUX `dev_fill` blocks Control LoRA; a Qwen-Image `edit` blocks its control). */ modelVariant?: string; /** The valid, resolved control layers to graft (in document order). */ layers: readonly ControlLayerGraphInput[]; + /** + * Present when the canvas compiles in inpaint or outpaint mode. The Qwen-Image control node also conditions on + * the inpainted region and takes them; the other kinds ignore them. + */ + inpaint?: CanvasInpaintSources; } /** @@ -77,7 +108,7 @@ const controlNetNodeType = (base: string): string => (base === 'flux' ? 'flux_co /** Validate defensively through the shared policy before graph wiring. */ export const addControlLayers = (graph: BackendGraphContract, options: AddControlLayersOptions): void => { - const { base, layers, modelVariant } = options; + const { base, inpaint, layers, modelVariant } = options; const denoise = graph.nodes[CONTROL_DENOISE_NODE_ID]; if (!denoise) { throw new Error('addControlLayers: base graph is missing the denoise node.'); @@ -161,6 +192,31 @@ export const addControlLayers = (graph: BackendGraphContract, options: AddContro weight: layer.weight, }); addEdge(graph, node, 'control', getOrAddLliteCollector(graph, denoise), 'item'); + } else if (layer.kind === 'qwen_image_control') { + // One field on the denoise, no collector: validation admits a single Qwen-Image control per generation. + const node = addNode(graph, { + begin_step_percent: layer.beginEndStepPct[0], + control_context_scale: layer.weight, + control_model: layer.model, + end_step_percent: layer.beginEndStepPct[1], + id: `qwen_image_control_${layer.id}`, + image: { image_name: layer.imageName }, + type: 'qwen_image_control', + }); + if (inpaint) { + // The union's inpainting condition. The canvas mask is white = keep and the node wants white = regenerate, + // so `img_lerp` 255 → 0 inverts it first, as the Anima inpaint adapter does. + const invertMask = addNode(graph, { + id: `qwen_image_control_mask_${layer.id}`, + max: 0, + min: 255, + type: 'img_lerp', + }); + feedImage(graph, invertMask, 'image', inpaint.mask); + feedImage(graph, node, 'inpaint_image', inpaint.image); + addEdge(graph, invertMask, 'image', node, 'inpaint_mask'); + } + addEdge(graph, node, 'control', denoise, 'control'); } else { const node = addNode(graph, { begin_step_percent: layer.beginEndStepPct[0], diff --git a/invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.test.ts b/invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.test.ts index 433f8e0fe94..11218061889 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.test.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.test.ts @@ -930,6 +930,157 @@ describe('compileCanvasGraph — control layers (integration)', () => { }); }); +describe('compileCanvasGraph — Qwen-Image ControlNet (integration)', () => { + const layer: ControlLayerGraphInput = { + beginEndStepPct: [0, 1], + controlMode: null, + id: 'q-control', + imageName: 'q-control.png', + kind: 'qwen_image_control', + model: { base: 'qwen-image', key: 'qwen-union', name: 'Qwen Image ControlNet Union', type: 'controlnet' }, + weight: 0.85, + }; + const CONTROL = 'qwen_image_control_q-control'; + const MASK = 'qwen_image_control_mask_q-control'; + const edgesInto = (graph: BackendGraphContract, nodeId: string) => + graph.edges + .filter((edge) => edge.destination.node_id === nodeId) + .map((edge) => [edge.destination.field, edge.source]); + + it('grafts the control into the Qwen-Image base graph, whose denoise holds the VAE that encodes its images', () => { + const { backendGraph } = compile(qwenImageModel, 'txt2img', { controlLayers: [layer] }); + + expect(backendGraph.nodes.denoise_latents?.type).toBe('qwen_image_denoise'); + expect(backendGraph.nodes[CONTROL]).toMatchObject({ + begin_step_percent: 0, + control_context_scale: 0.85, + control_model: layer.model, + end_step_percent: 1, + image: { image_name: 'q-control.png' }, + type: 'qwen_image_control', + }); + expect(getEdge(backendGraph, 'denoise_latents', 'control')?.source).toEqual({ field: 'control', node_id: CONTROL }); + expect(getEdge(backendGraph, 'denoise_latents', 'vae')?.source).toEqual({ field: 'vae', node_id: 'model_loader' }); + }); + + it.each(['txt2img', 'img2img'] as const)('sends only the control image in %s', (mode) => { + const { backendGraph } = compile(qwenImageModel, mode, { controlLayers: [layer] }); + + expect(backendGraph.nodes[CONTROL]).not.toHaveProperty('inpaint_image'); + expect(edgesInto(backendGraph, CONTROL)).toEqual([]); + expect(backendGraph.nodes[MASK]).toBeUndefined(); + }); + + it('inpaint: the control also reads the composite and the inverted canvas mask the denoise is limited to', () => { + const { backendGraph } = compile(qwenImageModel, 'inpaint', { controlLayers: [layer] }); + + expect(backendGraph.nodes[CONTROL]).toMatchObject({ inpaint_image: { image_name: 'canvas-composite.png' } }); + // The canvas mask is white = keep; img_lerp 255 → 0 makes it white = regenerate for the control. + expect(backendGraph.nodes[MASK]).toEqual({ + id: MASK, + image: { image_name: 'canvas-mask.png' }, + is_intermediate: true, + max: 0, + min: 255, + type: 'img_lerp', + use_cache: true, + }); + expect(edgesInto(backendGraph, CONTROL)).toEqual([['inpaint_mask', { field: 'image', node_id: MASK }]]); + // The denoise mask is untouched: the gradient mask still reads the uploaded canvas mask as is. + expect(backendGraph.nodes.create_gradient_mask?.mask).toEqual({ image_name: 'canvas-mask.png' }); + expect(getEdge(backendGraph, 'denoise_latents', 'denoise_mask')?.source.node_id).toBe('create_gradient_mask'); + }); + + it('inpaint with Scale Before Processing: the control reads the resized composite and mask', () => { + const { backendGraph } = compile(qwenImageModel, 'inpaint', { + bbox: { height: 888, width: 1025, x: 0, y: 0 }, + controlLayers: [layer], + }); + + expect(backendGraph.nodes[CONTROL]).not.toHaveProperty('inpaint_image'); + expect(backendGraph.nodes[MASK]).not.toHaveProperty('image'); + expect(getEdge(backendGraph, CONTROL, 'inpaint_image')?.source.node_id).toBe('canvas_resize_initial_to_processing'); + expect(getEdge(backendGraph, MASK, 'image')?.source.node_id).toBe('canvas_resize_mask_to_processing'); + }); + + it('inpaint with a noise mask: the control reads the image before noise is added', () => { + const { backendGraph } = compile(qwenImageModel, 'inpaint', { + controlLayers: [layer], + noiseMaskImageName: 'noise.png', + }); + + expect(getEdge(backendGraph, 'canvas_i2l', 'image')?.source.node_id).toBe('add_inpaint_noise'); + expect(backendGraph.nodes[CONTROL]).toMatchObject({ inpaint_image: { image_name: 'canvas-composite.png' } }); + }); + + it('outpaint: the control reads the infilled image and the alpha-derived or combined mask', () => { + const alphaOnly = compile(qwenImageModel, 'outpaint', { controlLayers: [layer], maskImageName: null }).backendGraph; + expect(getEdge(alphaOnly, CONTROL, 'inpaint_image')?.source.node_id).toBe('infill'); + expect(getEdge(alphaOnly, MASK, 'image')?.source.node_id).toBe('image_alpha_to_mask'); + expect(getEdge(alphaOnly, CONTROL, 'inpaint_mask')?.source.node_id).toBe(MASK); + + const combined = compile(qwenImageModel, 'outpaint', { + controlLayers: [layer], + maskImageName: 'canvas-mask.png', + }).backendGraph; + expect(getEdge(combined, MASK, 'image')?.source.node_id).toBe('mask_combine'); + + const scaled = compile(qwenImageModel, 'outpaint', { + bbox: { height: 888, width: 1025, x: 0, y: 0 }, + controlLayers: [layer], + maskImageName: null, + }).backendGraph; + expect(getEdge(scaled, MASK, 'image')?.source.node_id).toBe('canvas_resize_outpaint_mask_to_processing'); + expect(getEdge(scaled, CONTROL, 'inpaint_image')?.source.node_id).toBe('infill'); + }); + + it('rejects the control on a Qwen Image Edit model, as the denoise does', () => { + expect(() => compile({ ...qwenImageModel, variant: 'edit' }, 'inpaint', { controlLayers: [layer] })).toThrow( + /qwen_image_edit_control/ + ); + }); + + it('leaves inpainting without a control layer as it was', () => { + const { backendGraph } = compile(qwenImageModel, 'inpaint'); + + expect(Object.values(backendGraph.nodes).map((node) => node.type)).not.toContain('img_lerp'); + expect(Object.values(backendGraph.nodes).map((node) => node.type)).not.toContain('qwen_image_control'); + }); + + it('writes the graphs the backend validates against its invocations', async () => { + // Ids minted from the clock and Math.random are pinned so the fixture changes only when the graph does. + const clock = vi.spyOn(Date, 'now').mockReturnValue(0); + const random = vi.spyOn(Math, 'random').mockReturnValue(0.5); + // Installed models always carry a hash, which the backend's model identifier requires. + const hashed = (config: T, hash: string): T => ({ ...config, hash }); + const model = hashed(qwenImageModel, 'blake3:qwen'); + const controlLayers = [{ ...layer, model: hashed(layer.model, 'blake3:union') }]; + let txt2img: BackendGraphContract; + let inpaint: BackendGraphContract; + let outpaint: BackendGraphContract; + try { + txt2img = compile(model, 'txt2img', { controlLayers }).backendGraph; + // Without Scale Before Processing the control reads the canvas uploads as fixed image fields. + inpaint = compile(model, 'inpaint', { controlLayers }).backendGraph; + // The infilled image and the combined mask reach the control through edges. + outpaint = compile(model, 'outpaint', { controlLayers, maskImageName: 'canvas-mask.png' }).backendGraph; + } finally { + clock.mockRestore(); + random.mockRestore(); + } + const fixture = { + _comment: + 'Generated by compileCanvasGraph.test.ts; regenerate with `vitest -u`. Consumed by tests/app/invocations/test_frontend_qwen_image_control_graphs.py, which validates the graphs against the backend invocations.', + inpaint_control_layer: { ...inpaint, id: 'qwen_image_control_canvas_inpaint' }, + outpaint_control_layer: { ...outpaint, id: 'qwen_image_control_canvas_outpaint' }, + txt2img_control_layer: { ...txt2img, id: 'qwen_image_control_canvas_txt2img' }, + }; + await expect(`${JSON.stringify(fixture, null, 2)}\n`).toMatchFileSnapshot( + '../__snapshots__/qwenImageControlCanvasGraphs.json' + ); + }); +}); + describe('compileCanvasGraph — Anima ControlNet-LLLite (integration)', () => { const lliteLayer = (id: string, key: string, weight = 1): ControlLayerGraphInput => ({ beginEndStepPct: [0, 0.9], diff --git a/invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.ts b/invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.ts index 4260197de7f..5422069aff1 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.ts @@ -21,6 +21,7 @@ import { getIsPidActive } from '@features/generation/core/pid'; import { shouldUsePidDecode } from '@features/generation/core/pidGraph'; import { MAX_ANIMA_INPAINT_ADAPTER_WEIGHT, MIN_ANIMA_INPAINT_ADAPTER_WEIGHT } from '@features/generation/core/settings'; +import type { CanvasInpaintSources } from './addControlLayers'; import type { CanvasCompositingSettings, CanvasInfillMethod, @@ -67,9 +68,6 @@ const isImageMode = (mode: CompileCanvasGraphInput['mode']): boolean => mode !== const sizesMatch = (left: CanvasSize, right: CanvasSize): boolean => left.width === right.width && left.height === right.height; -/** A node feeding an input through an edge, or a fixed image field when no node produces it. */ -type ImageSource = { node: BackendInvocationContract; field: string } | { image_name: string }; - /** Whether an Anima inpaint/outpaint graph gets the adapter: it is picked, and the base is Anima. */ const hasAnimaInpaintAdapter = (model: GenerateModelConfig, settings: GenerateSettings): boolean => model.base === 'anima' && settings.animaInpaintAdapterModel !== null; @@ -370,13 +368,13 @@ const addAnimaInpaintAdapter = ( graph: BackendGraphContract, args: { denoise: BackendInvocationContract; - image: ImageSource; - mask: ImageSource; + inpaint: CanvasInpaintSources; model: ComponentModelConfig; weight: number; } ): void => { - const { denoise, image, mask, model, weight } = args; + const { denoise, inpaint, model, weight } = args; + const { image, mask } = inpaint; const invertMask = addNode(graph, { id: 'invert_anima_inpaint_adapter_mask', ...('image_name' in mask ? { image: mask } : {}), @@ -408,7 +406,10 @@ const addAnimaInpaintAdapter = ( } }; -/** outputOnlyMaskedRegions selects transparent output versus compositing with the original. */ +/** + * outputOnlyMaskedRegions selects transparent output versus compositing with the original. Returns what the + * inpaint-conditioned adapters read. + */ const graftMaskTail = ( graph: BackendGraphContract, args: { @@ -426,10 +427,10 @@ const graftMaskTail = ( /** Either a fixed mask image field or an edge-fed source node. */ gradientMaskImage?: { image_name: string }; gradientMaskEdge?: { node: BackendInvocationContract; field: string }; - /** The raster image the Anima inpaint adapter conditions on; the composite itself when absent. */ + /** The raster image the inpaint-conditioned adapters read; the composite itself when absent. */ adapterImageEdge?: { node: BackendInvocationContract; field: string }; } -): void => { +): CanvasInpaintSources => { const { compositing, denoise, destination, i2lType, initialImageName, model, settings, vaeSource } = args; const needsResize = !sizesMatch(args.bbox, args.processingSize); @@ -464,11 +465,15 @@ const graftMaskTail = ( } addEdge(graph, gradientMask, 'denoise_mask', denoise, 'denoise_mask'); + // The image before any noise is added, and the mask the denoise limits itself to, both at processing size. + const inpaint: CanvasInpaintSources = { + image: args.adapterImageEdge ?? { image_name: initialImageName }, + mask: args.gradientMaskEdge ?? (args.gradientMaskImage as { image_name: string }), + }; if (hasAnimaInpaintAdapter(model, settings)) { addAnimaInpaintAdapter(graph, { denoise, - image: args.adapterImageEdge ?? { image_name: initialImageName }, - mask: args.gradientMaskEdge ?? (args.gradientMaskImage as { image_name: string }), + inpaint, model: settings.animaInpaintAdapterModel as ComponentModelConfig, weight: settings.animaInpaintAdapterWeight, }); @@ -522,6 +527,7 @@ const graftMaskTail = ( ); addEdge(graph, generatedImageSource, 'image', output, compositing.outputOnlyMaskedRegions ? 'image' : 'layer_upper'); addEdge(graph, outputMaskSource, 'image', output, 'mask'); + return inpaint; }; /** Optionally inserts an `img_noise` node before encode; returns the node feeding `i2l.image`. */ @@ -561,7 +567,7 @@ const graftInpaint = ( input: CompileCanvasGraphInput, compositing: CanvasCompositingSettings, processingSize: CanvasSize -): void => { +): CanvasInpaintSources => { const { model } = input; const i2lType = requireI2lType(model); const denoise = requireDenoise(graph); @@ -601,7 +607,7 @@ const graftInpaint = ( addEdge(graph, vaeSource.node, vaeSource.field, encode, 'vae'); addEdge(graph, encode, 'latents', denoise, 'latents'); - graftMaskTail(graph, { + const inpaint = graftMaskTail(graph, { ...(initialResize ? { adapterImageEdge: { field: 'image', node: initialResize } } : {}), bbox: input.bbox, compositing, @@ -620,6 +626,7 @@ const graftInpaint = ( }); setMetadataMode(graph, 'inpaint', strength); + return inpaint; }; /** Grafts the outpaint pipeline (bbox extends past content / has transparent holes). */ @@ -628,7 +635,7 @@ const graftOutpaint = ( input: CompileCanvasGraphInput, compositing: CanvasCompositingSettings, processingSize: CanvasSize -): void => { +): CanvasInpaintSources => { const { model } = input; const i2lType = requireI2lType(model); const denoise = requireDenoise(graph); @@ -697,7 +704,7 @@ const graftOutpaint = ( addEdge(graph, vaeSource.node, vaeSource.field, encode, 'vae'); addEdge(graph, encode, 'latents', denoise, 'latents'); - graftMaskTail(graph, { + const inpaint = graftMaskTail(graph, { adapterImageEdge: { field: 'image', node: infill }, bbox: input.bbox, compositing, @@ -714,6 +721,7 @@ const graftOutpaint = ( }); setMetadataMode(graph, 'outpaint', strength); + return inpaint; }; /** Throw the first validation reason. */ @@ -747,18 +755,21 @@ export const compileCanvasGraph = (input: CompileCanvasGraphInput): CompiledCanv const { compositing } = input; // Validation above guarantees the composite/mask images required per mode. + let inpaint: CanvasInpaintSources | undefined; if (mode === 'img2img') { graftImageToImage(backendGraph, model, settings, compositeImageName as string, strength, bbox); } else if (mode === 'inpaint') { - graftInpaint(backendGraph, input, compositing, processingSize); + inpaint = graftInpaint(backendGraph, input, compositing, processingSize); } else if (mode === 'outpaint') { - graftOutpaint(backendGraph, input, compositing, processingSize); + inpaint = graftOutpaint(backendGraph, input, compositing, processingSize); } - // Every mode accepts already-resolved, separately uploaded control inputs. + // Every mode accepts already-resolved, separately uploaded control inputs; inpaint and outpaint also hand the + // adapters what they regenerate. if (input.controlLayers && input.controlLayers.length > 0) { addControlLayers(backendGraph, { base: model.base as SupportedGenerateBase, + inpaint, layers: input.controlLayers, modelVariant: model.variant ?? undefined, }); diff --git a/invokeai/frontend/webv2/src/features/generation/core/canvas/controlValidation.test.ts b/invokeai/frontend/webv2/src/features/generation/core/canvas/controlValidation.test.ts index a337ed16150..c8b915a92b7 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/canvas/controlValidation.test.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/canvas/controlValidation.test.ts @@ -95,6 +95,33 @@ describe('getControlValidationReason', () => { ).toBe('z_image_control_limit'); }); + it('accepts only a Qwen-Image ControlNet model on a Qwen-Image generation model', () => { + const qwen = { + adapterModel: { base: 'qwen-image', type: 'controlnet' }, + beginEndStepPct: [0, 1] as [number, number], + controlLoraIndex: 0, + kind: 'qwen_image_control' as const, + mainBase: 'qwen-image', + weight: 0.85, + }; + expect(getControlValidationReason(qwen)).toBeNull(); + expect(getControlValidationReason({ ...qwen, mainVariant: 'edit' })).toBe('qwen_image_edit_control'); + expect(getControlValidationReason({ ...qwen, qwenImageControlIndex: 1 })).toBe('qwen_image_control_limit'); + expect(getControlValidationReason({ ...qwen, mainBase: 'z-image' })).toBe('switch_adapter_kind'); + expect(getControlValidationReason({ ...qwen, kind: 'controlnet' })).toBe('switch_adapter_kind'); + expect(getControlValidationReason({ ...qwen, adapterModel: { base: 'z-image', type: 'controlnet' } })).toBe( + 'incompatible_base' + ); + expect(getControlValidationReason({ ...qwen, adapterModel: { base: 'qwen-image', type: 'lora' } })).toBe( + 'incompatible_adapter' + ); + // The node's context scale is 0..2; the legacy -1 floor does not apply. + expect(getControlValidationReason({ ...qwen, weight: 0 })).toBeNull(); + expect(getControlValidationReason({ ...qwen, weight: 2 })).toBeNull(); + expect(getControlValidationReason({ ...qwen, weight: -0.01 })).toBe('invalid_adapter_values'); + expect(getControlValidationReason({ ...qwen, weight: 2.01 })).toBe('invalid_adapter_values'); + }); + it.each([ { beginEndStepPct: [0, 1] as [number, number], kind: 'controlnet' as const, weight: Number.NaN }, { beginEndStepPct: [0, 1] as [number, number], kind: 'controlnet' as const, weight: Number.POSITIVE_INFINITY }, @@ -172,6 +199,7 @@ describe('Anima ControlNet-LLLite validation', () => { it('suggests the kind each base runs, preferring ControlNet, and none where control layers are unsupported', () => { expect(getSuggestedControlKind('anima')).toBe('anima_lllite'); expect(getSuggestedControlKind('z-image')).toBe('z_image_control'); + expect(getSuggestedControlKind('qwen-image')).toBe('qwen_image_control'); expect(getSuggestedControlKind('flux')).toBe('controlnet'); expect(getSuggestedControlKind('sd-2')).toBeNull(); expect(getControlValidationReason({ ...lllite, mainBase: 'sd-2' })).toBe('unsupported_adapter'); @@ -253,4 +281,21 @@ describe('createControlValidationSequence', () => { }) ).toBe('flux_fill_control_lora'); }); + + it('lets one Qwen-Image control through per generation, and none on an Edit model', () => { + const qwen = { + adapterModel: { base: 'qwen-image', key: 'union', type: 'controlnet' }, + beginEndStepPct: [0, 1] as [number, number], + kind: 'qwen_image_control' as const, + weight: 0.85, + }; + const generate = createControlValidationSequence({ base: 'qwen-image' }); + expect(generate(qwen)).toBeNull(); + expect(generate(qwen)).toBe('qwen_image_control_limit'); + + // A refused layer claims no slot, so every layer on an Edit model reports the same reason. + const edit = createControlValidationSequence({ base: 'qwen-image', variant: 'edit' }); + expect(edit(qwen)).toBe('qwen_image_edit_control'); + expect(edit(qwen)).toBe('qwen_image_edit_control'); + }); }); diff --git a/invokeai/frontend/webv2/src/features/generation/core/canvas/controlValidation.ts b/invokeai/frontend/webv2/src/features/generation/core/canvas/controlValidation.ts index 95957ea238d..90088e0761e 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/canvas/controlValidation.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/canvas/controlValidation.ts @@ -10,6 +10,7 @@ export const CONTROL_ADAPTER_KINDS = [ 'control_lora', 'z_image_control', 'anima_lllite', + 'qwen_image_control', ] as const; export type ControlAdapterKind = (typeof CONTROL_ADAPTER_KINDS)[number]; @@ -26,8 +27,10 @@ export const CONTROL_VALIDATION_REASONS = [ 'invalid_adapter_values', 'control_lora_limit', 'z_image_control_limit', + 'qwen_image_control_limit', 'duplicate_lllite_model', 'flux_fill_control_lora', + 'qwen_image_edit_control', ] as const; export type ControlValidationReason = (typeof CONTROL_VALIDATION_REASONS)[number]; @@ -39,9 +42,16 @@ export interface ControlAdapterModelFacts { cond_in_channels?: number | null; } -/** Z-Image control and Anima ControlNet-LLLite models install with the `controlnet` model type. */ +/** Z-Image control, Anima ControlNet-LLLite and Qwen-Image control models install with the `controlnet` model type. */ const getControlAdapterModelType = (kind: ControlAdapterKind): string => - kind === 'z_image_control' || kind === 'anima_lllite' ? 'controlnet' : kind; + kind === 'z_image_control' || kind === 'anima_lllite' || kind === 'qwen_image_control' ? 'controlnet' : kind; + +/** + * The lowest weight a kind accepts: the Z-Image and Qwen-Image control nodes take a 0..2 context scale, the other + * adapters keep the legacy -1 floor. Validation, persisted-value repair and the weight input share it. + */ +export const getControlAdapterMinWeight = (kind: ControlAdapterKind): number => + kind === 'z_image_control' || kind === 'qwen_image_control' ? 0 : -1; /** The backend owns kind support; count and Fill constraints are frontend policy. */ export const isControlKindSupportedForBase = (base: string, kind: ControlAdapterKind): boolean => @@ -98,6 +108,7 @@ export const getControlValidationReason = (params: { mainVariant?: string; weight: number; zImageControlIndex?: number; + qwenImageControlIndex?: number; /** An earlier contributing Anima LLLite layer already applies this model; the denoiser applies each once. */ lliteModelInUse?: boolean; }): ControlValidationReason | null => { @@ -109,6 +120,7 @@ export const getControlValidationReason = (params: { lliteModelInUse = false, mainBase, mainVariant, + qwenImageControlIndex = 0, weight, zImageControlIndex = 0, } = params; @@ -141,22 +153,32 @@ export const getControlValidationReason = (params: { if (kind === 'z_image_control' && zImageControlIndex > 0) { return 'z_image_control_limit'; } + if (kind === 'qwen_image_control' && qwenImageControlIndex > 0) { + return 'qwen_image_control_limit'; + } if (kind === 'anima_lllite' && lliteModelInUse) { return 'duplicate_lllite_model'; } if (kind === 'control_lora' && mainBase === 'flux' && mainVariant === 'dev_fill') { return 'flux_fill_control_lora'; } + if (kind === 'qwen_image_control' && mainBase === 'qwen-image' && mainVariant === 'edit') { + // The Fun-ControlNet branch was trained beside the generation transformer; `qwen_image_denoise` refuses it on + // an Edit transformer. + return 'qwen_image_edit_control'; + } return null; }; /** - * Validates control layers in generation order. Per-generation limits (one Control LoRA, one Z-Image control, each - * LLLite model once) count only layers that passed, so an invalid layer never consumes a later layer's slot. + * Validates control layers in generation order. Per-generation limits (one Control LoRA, one Z-Image control, one + * Qwen-Image control, each LLLite model once) count only layers that passed, so an invalid layer never consumes a + * later layer's slot. */ export const createControlValidationSequence = (main: { base: string; variant?: string | null }) => { let controlLoraCount = 0; let zImageControlCount = 0; + let qwenImageControlCount = 0; const lliteModelKeys = new Set(); return (layer: { @@ -174,6 +196,7 @@ export const createControlValidationSequence = (main: { base: string; variant?: lliteModelInUse: kind === 'anima_lllite' && adapterModel !== null && lliteModelKeys.has(adapterModel.key), mainBase: main.base, mainVariant: main.variant ?? undefined, + qwenImageControlIndex: kind === 'qwen_image_control' ? qwenImageControlCount : 0, weight: layer.weight, zImageControlIndex: kind === 'z_image_control' ? zImageControlCount : 0, }); @@ -184,6 +207,8 @@ export const createControlValidationSequence = (main: { base: string; variant?: controlLoraCount += 1; } else if (kind === 'z_image_control') { zImageControlCount += 1; + } else if (kind === 'qwen_image_control') { + qwenImageControlCount += 1; } else if (kind === 'anima_lllite' && adapterModel) { lliteModelKeys.add(adapterModel.key); } @@ -197,7 +222,7 @@ export const areControlAdapterValuesValid = ( weight: unknown, beginEndStepPct: unknown ): beginEndStepPct is [number, number] => { - const minWeight = kind === 'z_image_control' ? 0 : -1; + const minWeight = getControlAdapterMinWeight(kind); if (typeof weight !== 'number' || !Number.isFinite(weight) || weight < minWeight || weight > 2) { return false; } diff --git a/invokeai/frontend/webv2/src/features/generation/core/graph.test.ts b/invokeai/frontend/webv2/src/features/generation/core/graph.test.ts index 4a97ab2594f..3416d582ba3 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/graph.test.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/graph.test.ts @@ -448,6 +448,13 @@ describe('compileGenerateGraph', () => { expect(compile(zImageModel).nodes.model_loader?.type).toBe('z_image_model_loader'); }); + it('hands the Qwen Image denoise the loader VAE its ControlNet encodes with', () => { + expect(getEdge(compile(qwenImageModel), 'denoise_latents', 'vae')?.source).toEqual({ + field: 'vae', + node_id: 'model_loader', + }); + }); + it('builds complete SDNQ pipeline graphs without standalone component overrides', () => { const flux = compile({ ...fluxModel, diff --git a/invokeai/frontend/webv2/src/features/generation/core/graph.ts b/invokeai/frontend/webv2/src/features/generation/core/graph.ts index 13009af1045..5916142ad1e 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/graph.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/graph.ts @@ -1016,6 +1016,8 @@ const buildQwenImageGraph = ( }); addEdge(graph, loraSource, 'transformer', denoise, 'transformer'); + // The denoise encodes a ControlNet's control and inpaint images with this VAE; without one the input is idle. + addEdge(graph, modelLoader, 'vae', denoise, 'vae'); addEdge(graph, modelLoader, 'qwen_vl_encoder', posCond, 'qwen_vl_encoder'); addEdge(graph, positivePrompt, 'value', posCond, 'prompt'); addEdge(graph, posCond, 'conditioning', denoise, 'positive_conditioning'); diff --git a/invokeai/frontend/webv2/src/features/generation/graph.ts b/invokeai/frontend/webv2/src/features/generation/graph.ts index b29991d4d7a..c09d5da43e6 100644 --- a/invokeai/frontend/webv2/src/features/generation/graph.ts +++ b/invokeai/frontend/webv2/src/features/generation/graph.ts @@ -22,6 +22,7 @@ export { type ControlAdapterKind, type ControlValidationReason, createControlValidationSequence, + getControlAdapterMinWeight, getControlModelUnusableReason, getControlValidationReason, getSuggestedControlKind, diff --git a/invokeai/frontend/webv2/src/workbench/canvas-engine/contracts.ts b/invokeai/frontend/webv2/src/workbench/canvas-engine/contracts.ts index 1b6ffd010d5..c85511d5ae5 100644 --- a/invokeai/frontend/webv2/src/workbench/canvas-engine/contracts.ts +++ b/invokeai/frontend/webv2/src/workbench/canvas-engine/contracts.ts @@ -234,7 +234,7 @@ export type CanvasAdjustmentEntry = export type CanvasAdjustmentsContract = readonly CanvasAdjustmentEntry[]; export interface CanvasControlAdapterContract { - kind: 'controlnet' | 't2i_adapter' | 'control_lora' | 'z_image_control' | 'anima_lllite'; + kind: 'controlnet' | 't2i_adapter' | 'control_lora' | 'z_image_control' | 'anima_lllite' | 'qwen_image_control'; model: string | null; weight: number; beginEndStepPct: [number, number]; diff --git a/invokeai/frontend/webv2/src/workbench/canvas-operations/filterGraphs.test.ts b/invokeai/frontend/webv2/src/workbench/canvas-operations/filterGraphs.test.ts index cc368657eee..6664e2703fd 100644 --- a/invokeai/frontend/webv2/src/workbench/canvas-operations/filterGraphs.test.ts +++ b/invokeai/frontend/webv2/src/workbench/canvas-operations/filterGraphs.test.ts @@ -31,6 +31,7 @@ const EXPECTED_DEFAULTS: Record> = { spandrel_filter: { model: null, autoScale: true, scale: 1 }, img_blur: { blur_type: 'gaussian', radius: 8 }, img_noise: { noise_type: 'gaussian', amount: 0.3, noise_color: true, size: 1 }, + grayscale: {}, }; const EXPECTED_TYPES = Object.keys(EXPECTED_DEFAULTS); @@ -43,10 +44,10 @@ const SPANDREL_MODEL = { }; describe('CONTROL_FILTERS registry', () => { - it('contains the legacy filters plus the Scribble preset', () => { + it('contains the legacy filters plus the Scribble preset and Grayscale', () => { const types = CONTROL_FILTERS.map((definition) => definition.type); - expect(types).toHaveLength(17); - expect(new Set(types).size).toBe(17); + expect(types).toHaveLength(18); + expect(new Set(types).size).toBe(18); expect(types).toEqual(EXPECTED_TYPES); }); @@ -145,7 +146,10 @@ describe('buildFilterGraph', () => { it('builds the direct legacy filter nodes with default params', () => { const directTypes = EXPECTED_TYPES.filter( - (type) => !['adjust_image', 'spandrel_filter', 'img_blur', 'img_noise', 'scribble_edge_detection'].includes(type) + (type) => + !['adjust_image', 'spandrel_filter', 'img_blur', 'img_noise', 'scribble_edge_detection', 'grayscale'].includes( + type + ) ); for (const type of directTypes) { const { graph, outputNodeId } = buildFilterGraph(type, imageName); @@ -183,6 +187,49 @@ describe('buildFilterGraph', () => { expect(outputNodeId).toBe(FILTER_NODE_ID); }); + it('builds Grayscale as a mode round trip, so the layer stays RGB', () => { + const { graph, outputNodeId } = buildFilterGraph('grayscale', imageName); + + expect(graph.nodes[FILTER_NODE_ID]).toMatchObject({ + image: { image_name: imageName }, + mode: 'L', + type: 'img_conv', + }); + expect(graph.nodes.control_filter_rgb).toEqual({ + id: 'control_filter_rgb', + is_intermediate: true, + mode: 'RGB', + type: 'img_conv', + use_cache: true, + }); + expect(graph.edges).toEqual([ + { + destination: { field: 'image', node_id: 'control_filter_rgb' }, + source: { field: 'image', node_id: FILTER_NODE_ID }, + }, + ]); + expect(outputNodeId).toBe('control_filter_rgb'); + }); + + it('restores the source alpha onto the Grayscale result, not onto the intermediate L image', () => { + const { graph, outputNodeId } = buildFilterGraph('grayscale', imageName, undefined, { + height: 8, + preserveTransparency: true, + width: 8, + }); + + expect(graph.nodes[FILTER_NODE_ID]).not.toHaveProperty('image'); + expect(graph.edges).toContainEqual({ + destination: { field: 'image', node_id: FILTER_NODE_ID }, + source: { field: 'image', node_id: 'control_filter_flatten' }, + }); + expect(graph.edges).toContainEqual({ + destination: { field: 'image', node_id: 'control_filter_restore_alpha' }, + source: { field: 'image', node_id: 'control_filter_rgb' }, + }); + expect(outputNodeId).toBe('control_filter_restore_alpha'); + }); + it('flattens transparent control inputs over white before processing and reapplies their alpha', () => { const { graph, outputNodeId } = buildFilterGraph('canny_edge_detection', imageName, undefined, { height: 80, diff --git a/invokeai/frontend/webv2/src/workbench/canvas-operations/filterGraphs.ts b/invokeai/frontend/webv2/src/workbench/canvas-operations/filterGraphs.ts index d9dfa0187cf..863dfbb17a8 100644 --- a/invokeai/frontend/webv2/src/workbench/canvas-operations/filterGraphs.ts +++ b/invokeai/frontend/webv2/src/workbench/canvas-operations/filterGraphs.ts @@ -221,6 +221,13 @@ export const CONTROL_FILTERS: readonly FilterDefinition[] = [ category: 'noise', type: 'img_noise', }, + { + // The Qwen-Image Fun-ControlNet-Union's "Gray" condition: `img_conv` to L and back, so the layer stays RGB. + category: 'color', + nodeType: 'img_conv', + params: [], + type: 'grayscale', + }, ]; const FILTERS_BY_TYPE: ReadonlyMap = new Map( @@ -354,6 +361,8 @@ export const buildFilterGraph = ( source: { field: sourceField, node_id: sourceId }, }); }; + // The node whose image is the filter's result; a multi-node filter moves it past the filter node. + let outputNodeId: string = FILTER_NODE_ID; if (filterType === 'scribble_edge_detection') { graph.nodes[FILTER_NODE_ID] = { ...node, scribble: true }; @@ -434,6 +443,17 @@ export const buildFilterGraph = ( use_cache: false, }; edge('control_filter_seed', 'value', FILTER_NODE_ID, 'seed'); + } else if (filterType === 'grayscale') { + graph.nodes[FILTER_NODE_ID] = { ...node, mode: 'L' }; + graph.nodes.control_filter_rgb = { + id: 'control_filter_rgb', + is_intermediate: true, + mode: 'RGB', + type: 'img_conv', + use_cache: true, + }; + edge(FILTER_NODE_ID, 'image', 'control_filter_rgb', 'image'); + outputNodeId = 'control_filter_rgb'; } const canRestoreSourceAlpha = @@ -482,13 +502,10 @@ export const buildFilterGraph = ( }; edge('control_filter_background', 'image', 'control_filter_flatten', 'base_image'); edge('control_filter_flatten', 'image', FILTER_NODE_ID, 'image'); - edge(FILTER_NODE_ID, 'image', 'control_filter_restore_alpha', 'image'); + edge(outputNodeId, 'image', 'control_filter_restore_alpha', 'image'); edge('control_filter_source_alpha', 'image', 'control_filter_restore_alpha', 'mask'); return { graph, outputNodeId: 'control_filter_restore_alpha' }; } - return { - graph, - outputNodeId: FILTER_NODE_ID, - }; + return { graph, outputNodeId }; }; diff --git a/invokeai/frontend/webv2/src/workbench/canvasMigration.test.ts b/invokeai/frontend/webv2/src/workbench/canvasMigration.test.ts index 9d888c0fb8e..41e84632f65 100644 --- a/invokeai/frontend/webv2/src/workbench/canvasMigration.test.ts +++ b/invokeai/frontend/webv2/src/workbench/canvasMigration.test.ts @@ -74,6 +74,7 @@ describe('loadCanvasState', () => { { beginEndStepPct: [0, 1], controlMode: null, kind: 'control_lora', model: 'flux-control', weight: 0.75 }, { beginEndStepPct: [0.2, 0.9], controlMode: null, kind: 'z_image_control', model: 'z-control', weight: 0.7 }, { beginEndStepPct: [0, 0.8], controlMode: null, kind: 'anima_lllite', model: 'anima-sketch', weight: 1.2 }, + { beginEndStepPct: [0, 1], controlMode: null, kind: 'qwen_image_control', model: 'qwen-union', weight: 0.85 }, ] as const; const layers = adapters.map((adapter, index) => ({ ...createControlLayer(`Control ${index}`, `control-${index}`), @@ -139,6 +140,29 @@ describe('loadCanvasState', () => { }); }); + it('repairs a persisted Qwen-Image control weight below the node floor with the kind default', () => { + const loaded = load( + withNodes( + [ + { + ...createControlLayer('Q Control', 'q-control'), + adapter: { kind: 'qwen_image_control', model: 'qwen-union', weight: -0.5 }, + }, + ], + 'control' + ) + ); + const layer = loaded.document.stacks.control[0]; + + expect(layer?.type === 'control' ? layer.adapter : null).toEqual({ + beginEndStepPct: [0, 1], + controlMode: null, + kind: 'qwen_image_control', + model: 'qwen-union', + weight: 0.85, + }); + }); + it('round-trips a layer regenerate region and drops a malformed one without failing the layer', () => { const inpaint = { fill: { color: '#e07575', style: 'diagonal' }, diff --git a/invokeai/frontend/webv2/src/workbench/canvasMigration.ts b/invokeai/frontend/webv2/src/workbench/canvasMigration.ts index d6ee177e59f..04a27ff9ef4 100644 --- a/invokeai/frontend/webv2/src/workbench/canvasMigration.ts +++ b/invokeai/frontend/webv2/src/workbench/canvasMigration.ts @@ -12,6 +12,7 @@ import type { LayerStackKind, } from '@workbench/canvas-engine/api'; +import { getControlAdapterMinWeight } from '@features/generation/graph'; import { CANVAS_MAX_NODE_COUNT, CANVAS_MAX_NODE_DEPTH, LAYER_STACK_ORDER } from '@workbench/canvas-engine/api'; import { repairSelectedLayerId } from '@workbench/canvas-engine/document/selectionRepair'; import { z } from 'zod'; @@ -131,7 +132,14 @@ const zControlAdapter = z beginEndStepPct: z.tuple([zFiniteNumber, zFiniteNumber]), controlMode: z.enum(['balanced', 'more_prompt', 'more_control', 'unbalanced']).nullable(), // An unknown kind refuses the document: this build cannot apply it, and rewriting it would lose it on save. - kind: z.enum(['controlnet', 't2i_adapter', 'control_lora', 'z_image_control', 'anima_lllite']), + kind: z.enum([ + 'controlnet', + 't2i_adapter', + 'control_lora', + 'z_image_control', + 'anima_lllite', + 'qwen_image_control', + ]), model: z.string().nullable(), weight: zFiniteNumber, }) @@ -139,7 +147,7 @@ const zControlAdapter = z const [begin, end] = beginEndStepPct; return begin >= 0 && end <= 1 && begin < end; }) - .refine(({ kind, weight }) => weight >= (kind === 'z_image_control' ? 0 : -1) && weight <= 2); + .refine(({ kind, weight }) => weight >= getControlAdapterMinWeight(kind) && weight <= 2); const zMaskFill = z.object({ color: z.string(), style: z.enum(['solid', 'grid', 'crosshatch', 'diagonal', 'horizontal', 'vertical']), diff --git a/invokeai/frontend/webv2/src/workbench/controlAdapters.test.ts b/invokeai/frontend/webv2/src/workbench/controlAdapters.test.ts index f1f63a99663..3bbb9dfc91f 100644 --- a/invokeai/frontend/webv2/src/workbench/controlAdapters.test.ts +++ b/invokeai/frontend/webv2/src/workbench/controlAdapters.test.ts @@ -14,6 +14,7 @@ describe('normalizeControlAdapter', () => { ['control_lora', -1, [0, 1]], ['z_image_control', 0, [0.1, 0.9]], ['anima_lllite', -1, [0.1, 0.9]], + ['qwen_image_control', 0, [0.1, 0.9]], ] as const)('preserves valid %s numeric values', (kind, weight, beginEndStepPct) => { const adapter = { ...CONTROL_ADAPTER_DEFAULTS[kind], beginEndStepPct, weight }; expect(normalizeControlAdapter(adapter)).toEqual(adapter); @@ -27,11 +28,34 @@ describe('normalizeControlAdapter', () => { ['z_image_control', -0.01], ['z_image_control', 2.01], ['anima_lllite', 2.01], + ['qwen_image_control', -0.01], + ['qwen_image_control', 2.01], ] as const)('repairs invalid %s weight %s with its default', (kind, weight) => { const adapter = { ...CONTROL_ADAPTER_DEFAULTS[kind], weight }; expect(normalizeControlAdapter(adapter)).toMatchObject({ kind, weight: CONTROL_ADAPTER_DEFAULTS[kind].weight }); }); + it.each(['z_image_control', 'qwen_image_control'] as const)( + 'rebuilds a %s adapter from the contract fields', + (kind) => { + const persisted = { + beginEndStepPct: [0.1, 0.9], + controlMode: 'balanced', + extra: true, + kind, + model: 'm', + weight: 1.5, + }; + expect(normalizeControlAdapter(persisted)).toEqual({ + beginEndStepPct: [0.1, 0.9], + controlMode: null, + kind, + model: 'm', + weight: 1.5, + }); + } + ); + it.each([ [Number.NaN, 1], [0, Number.POSITIVE_INFINITY], @@ -49,10 +73,21 @@ describe('default control adapters', () => { it('starts each base on the one kind it accepts', () => { expect(getDefaultControlAdapterKind('anima')).toBe('anima_lllite'); expect(getDefaultControlAdapterKind('z-image')).toBe('z_image_control'); + expect(getDefaultControlAdapterKind('qwen-image')).toBe('qwen_image_control'); expect(getDefaultControlAdapterKind('sdxl')).toBe('controlnet'); expect(getDefaultControlAdapterKind(null)).toBe('controlnet'); }); + it('starts a Qwen-Image control at the union model card recommendation', () => { + expect(createDefaultControlAdapter('qwen-image', 'union')).toEqual({ + beginEndStepPct: [0, 1], + controlMode: null, + kind: 'qwen_image_control', + model: 'union', + weight: 0.85, + }); + }); + it('hands out a step range the caller may mutate without touching the defaults', () => { const adapter = createDefaultControlAdapter('anima'); adapter.beginEndStepPct[0] = 0.5; diff --git a/invokeai/frontend/webv2/src/workbench/controlAdapters.ts b/invokeai/frontend/webv2/src/workbench/controlAdapters.ts index 42eb62e61f0..8963492f277 100644 --- a/invokeai/frontend/webv2/src/workbench/controlAdapters.ts +++ b/invokeai/frontend/webv2/src/workbench/controlAdapters.ts @@ -1,6 +1,6 @@ import type { CanvasControlAdapterContract } from '@workbench/canvas-engine/api'; -import { areControlAdapterValuesValid } from '@features/generation/graph'; +import { areControlAdapterValuesValid, getControlAdapterMinWeight } from '@features/generation/graph'; export const CONTROL_ADAPTER_DEFAULTS: Readonly< Record @@ -26,6 +26,14 @@ export const CONTROL_ADAPTER_DEFAULTS: Readonly< model: null, weight: 0.75, }, + // The Fun-ControlNet-Union's recommended 0.70–0.95 context scale, centred. + qwen_image_control: { + beginEndStepPct: [0, 1], + controlMode: null, + kind: 'qwen_image_control', + model: null, + weight: 0.85, + }, t2i_adapter: { beginEndStepPct: [0, 1], controlMode: null, @@ -45,6 +53,7 @@ export const CONTROL_ADAPTER_DEFAULTS: Readonly< /** Kinds that exist for exactly one main-model base. Every other kind is offered wherever capabilities allow it. */ export const CONTROL_KIND_BASE: Readonly>> = { anima_lllite: 'anima', + qwen_image_control: 'qwen-image', z_image_control: 'z-image', }; @@ -77,7 +86,7 @@ export const normalizeControlAdapter = (value: unknown): unknown => { return value; } const defaults = CONTROL_ADAPTER_DEFAULTS[value.kind]; - const minWeight = value.kind === 'z_image_control' ? 0 : -1; + const minWeight = getControlAdapterMinWeight(value.kind); const weight = typeof value.weight === 'number' && Number.isFinite(value.weight) && value.weight >= minWeight && value.weight <= 2 ? value.weight @@ -86,13 +95,13 @@ export const normalizeControlAdapter = (value: unknown): unknown => { ? [value.beginEndStepPct[0], value.beginEndStepPct[1]] : [defaults.beginEndStepPct[0], defaults.beginEndStepPct[1]]; - if (value.kind !== 'z_image_control') { + if (value.kind !== 'z_image_control' && value.kind !== 'qwen_image_control') { return { ...defaults, ...value, beginEndStepPct, weight } satisfies CanvasControlAdapterContract; } return { beginEndStepPct, controlMode: null, - kind: 'z_image_control', + kind: value.kind, model: typeof value.model === 'string' ? value.model : null, weight, } satisfies CanvasControlAdapterContract; diff --git a/invokeai/frontend/webv2/src/workbench/controlLayerChecks.test.ts b/invokeai/frontend/webv2/src/workbench/controlLayerChecks.test.ts index 8d62b11da6d..67c3c49d2af 100644 --- a/invokeai/frontend/webv2/src/workbench/controlLayerChecks.test.ts +++ b/invokeai/frontend/webv2/src/workbench/controlLayerChecks.test.ts @@ -152,6 +152,25 @@ describe('getBlockingControlLayerIssues', () => { ]); }); + it('lets one Qwen-Image control through, and none on an Edit model', () => { + const qwenModels = [model('qwen-union', 'qwen-image', 'controlnet')]; + const layers = [ + controlLayer('first', { kind: 'qwen_image_control', model: 'qwen-union', weight: 0.85 }), + controlLayer('second', { kind: 'qwen_image_control', model: 'qwen-union', weight: 0.85 }), + ]; + const codes = (mainModel: { base: string; variant?: string }) => + getBlockingControlLayerIssues({ layers, mainModel, models: qwenModels }).map(({ code, layerId }) => [ + layerId, + code, + ]); + + expect(codes({ base: 'qwen-image' })).toEqual([['second', 'qwen_image_control_limit']]); + expect(codes({ base: 'qwen-image', variant: 'edit' })).toEqual([ + ['first', 'qwen_image_edit_control'], + ['second', 'qwen_image_edit_control'], + ]); + }); + it('reports issues in document order', () => { const issues = getBlockingControlLayerIssues({ layers: [controlLayer('top'), controlLayer('bottom')], @@ -167,11 +186,21 @@ describe('getControlLayerAttentionReason', () => { it('warns about a missing model even without content', () => { const layer = controlLayer('fresh', { source: { bitmap: null, type: 'paint' } }); - expect(getControlLayerAttentionReason(layer, 'sdxl', models)).toBe('missing_model'); + expect(getControlLayerAttentionReason(layer, sdxl, models)).toBe('missing_model'); }); it('returns null for a healthy layer and ignores per-kind limits', () => { - expect(getControlLayerAttentionReason(controlLayer('ok', { model: 'sdxl-control' }), 'sdxl', models)).toBeNull(); + expect(getControlLayerAttentionReason(controlLayer('ok', { model: 'sdxl-control' }), sdxl, models)).toBeNull(); + }); + + it('warns that an Edit model cannot run the Qwen-Image control', () => { + const qwenModels = [model('qwen-union', 'qwen-image', 'controlnet')]; + const layer = controlLayer('qwen', { kind: 'qwen_image_control', model: 'qwen-union', weight: 0.85 }); + + expect(getControlLayerAttentionReason(layer, { base: 'qwen-image' }, qwenModels)).toBeNull(); + expect(getControlLayerAttentionReason(layer, { base: 'qwen-image', variant: 'edit' }, qwenModels)).toBe( + 'qwen_image_edit_control' + ); }); }); diff --git a/invokeai/frontend/webv2/src/workbench/controlLayerChecks.ts b/invokeai/frontend/webv2/src/workbench/controlLayerChecks.ts index 55f4d669533..e6e0541ba32 100644 --- a/invokeai/frontend/webv2/src/workbench/controlLayerChecks.ts +++ b/invokeai/frontend/webv2/src/workbench/controlLayerChecks.ts @@ -88,7 +88,7 @@ export const getControlLayerReasonInSequence = (params: { /** Ambient warnings include empty layers but omit per-kind limits, which belong in the Invoke tooltip. */ export const getControlLayerAttentionReason = ( layer: CanvasControlLayerContract, - mainBase: string, + mainModel: MainModel, models: readonly ModelConfig[] ): ControlValidationReason | null => getControlValidationReason({ @@ -96,7 +96,9 @@ export const getControlLayerAttentionReason = ( beginEndStepPct: layer.adapter.beginEndStepPct, controlLoraIndex: 0, kind: layer.adapter.kind, - mainBase, + mainBase: mainModel.base, + mainVariant: mainModel.variant ?? undefined, + qwenImageControlIndex: 0, weight: layer.adapter.weight, zImageControlIndex: 0, }); diff --git a/invokeai/frontend/webv2/src/workbench/widgets/canvas/invoke/prepareCanvasInvocation.test.ts b/invokeai/frontend/webv2/src/workbench/widgets/canvas/invoke/prepareCanvasInvocation.test.ts index 9c8bf377fcd..e311bf6ed42 100644 --- a/invokeai/frontend/webv2/src/workbench/widgets/canvas/invoke/prepareCanvasInvocation.test.ts +++ b/invokeai/frontend/webv2/src/workbench/widgets/canvas/invoke/prepareCanvasInvocation.test.ts @@ -1002,6 +1002,103 @@ describe('runCanvasInvocation', () => { expect(harness.notices()[0]?.message).toBe('second: z_image_control_limit'); }); + describe('Qwen Image ControlNet', () => { + const qwenImage = { + ...sd1Model, + base: 'qwen-image' as const, + format: 'diffusers' as const, + key: 'qwen-image', + name: 'Qwen Image', + }; + const union = { + base: 'qwen-image', + file_size: 1, + format: 'checkpoint', + hash: 'qwen-union-hash', + key: 'qwen-union', + name: 'Qwen Image ControlNet Union', + path: 'qwen-union', + source: 'qwen-union', + source_type: 'path' as const, + type: 'controlnet', + }; + const qwenLayer = (id: string, values: Partial = {}) => + controlLayer(id, { controlMode: null, kind: 'qwen_image_control', model: union.key, weight: 0.85, ...values }); + + it('prepares the control with the adapter values and the installed model', async () => { + const harness = makeHarness({ + document: docWithLayers([qwenLayer('q-layer', { beginEndStepPct: [0.1, 0.9], weight: 0.7 })]), + model: qwenImage, + models: [union], + }); + + await runCanvasInvocation(harness.deps); + + expect(harness.notices()).toHaveLength(0); + expect(harness.submittedGraphs()[0]?.graph.backendGraph?.nodes['qwen_image_control_q-layer']).toMatchObject({ + begin_step_percent: 0.1, + control_context_scale: 0.7, + control_model: { + base: 'qwen-image', + hash: 'qwen-union-hash', + key: 'qwen-union', + name: 'Qwen Image ControlNet Union', + type: 'controlnet', + }, + end_step_percent: 0.9, + type: 'qwen_image_control', + }); + expect(harness.surfaceIds).toEqual(['q-layer']); + }); + + it('hands the control the uploads the inpaint graph itself reads when the canvas inpaints', async () => { + const harness = makeHarness({ + document: docWithLayers([rasterLayer('base'), qwenLayer('q-layer'), inpaintMaskLayer('mask')]), + model: qwenImage, + models: [union], + }); + + await runCanvasInvocation(harness.deps); + + const submitted = harness.submittedGraphs(); + expect(submitted[0]?.graph.label).toBe('Qwen Image inpaint'); + const nodes = submitted[0]!.graph.backendGraph!.nodes; + expect(nodes['qwen_image_control_q-layer']?.inpaint_image).toEqual(nodes.create_gradient_mask?.image); + expect(nodes['qwen_image_control_mask_q-layer']).toMatchObject({ + image: nodes.create_gradient_mask?.mask, + max: 0, + min: 255, + type: 'img_lerp', + }); + }); + + it('blocks a second enabled nonempty control', async () => { + const harness = makeHarness({ + document: docWithLayers([qwenLayer('first'), qwenLayer('second')]), + model: qwenImage, + models: [union], + }); + + await runCanvasInvocation(harness.deps); + + expect(harness.submittedGraphs()).toHaveLength(0); + expect(harness.notices()[0]?.message).toBe('second: qwen_image_control_limit'); + }); + + it('blocks the control on a Qwen Image Edit model', async () => { + const harness = makeHarness({ + document: docWithLayers([qwenLayer('layer')]), + model: { ...qwenImage, variant: 'edit' }, + models: [union], + }); + + await runCanvasInvocation(harness.deps); + + expect(harness.submittedGraphs()).toHaveLength(0); + expect(harness.notices()[0]?.message).toBe('layer: qwen_image_edit_control'); + }); + }); + describe('Anima ControlNet-LLLite', () => { const anima = { ...sd1Model, base: 'anima' as const, key: 'anima', name: 'Anima' }; const installed = (key: string, base: string, type: string, extra: Record = {}) => ({ diff --git a/invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.browser.test.tsx b/invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.browser.test.tsx index f92f7435123..e91b2716b1c 100644 --- a/invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.browser.test.tsx +++ b/invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.browser.test.tsx @@ -181,6 +181,25 @@ const offersKind = (kind: string) => host!.querySelector(`option[value="${kind}" const textOf = (role: 'alert' | 'status') => [...host!.querySelectorAll(`[role="${role}"]`)].map((element) => element.textContent).join(' '); const retryButton = () => [...host!.querySelectorAll('button')].find((button) => button.textContent === 'common.retry'); +/** The model Select's hidden native options, as the kind ones are read. */ +const offeredModels = () => + [...host!.querySelectorAll('select')] + .flatMap((select) => [...select.options].map((option) => option.value)) + .filter((value) => catalog.models.some((model) => model.key === value)); + +/** Renders `layers.at(-1)` as the selected layer of a document holding all of them, each with content. */ +const renderWith = async ( + mainModel: Record | null, + models: Record[], + ...layers: CanvasControlLayerContract[] +) => { + catalog.mainModel = mainModel as Record; + catalog.models = models; + commits.length = 0; + getArchitectureCapabilities.mockResolvedValueOnce(architectureCapabilitiesFixture); + await settle(ensureArchitectureCapabilitiesLoaded); + await render(layers.at(-1), engineWith(layers)); +}; afterEach(async () => { await act(() => root?.unmount()); @@ -298,11 +317,6 @@ describe('ControlLayerSettings on an Anima main model', () => { adapter: { ...base.adapter, ...values, kind: kind as CanvasControlLayerContract['adapter']['kind'] }, }; }; - /** The model Select's hidden native options, as the kind ones are read. */ - const offeredModels = () => - [...host!.querySelectorAll('select')] - .flatMap((select) => [...select.options].map((option) => option.value)) - .filter((value) => catalog.models.some((model) => model.key === value)); const button = (name: string) => [...host!.querySelectorAll('button')].find((b) => b.textContent === name); /** The adapter each commit wrote, read from the prepared edit's forward patch. */ const committedAdapters = () => @@ -313,19 +327,6 @@ describe('ControlLayerSettings on an Anima main model', () => { return match ? (JSON.parse(match[1]!) as Record) : null; }); - /** Renders `layers.at(-1)` as the selected layer of a document holding all of them, each with content. */ - const renderWith = async ( - mainModel: Record | null, - models: Record[], - ...layers: CanvasControlLayerContract[] - ) => { - catalog.mainModel = mainModel as Record; - catalog.models = models; - commits.length = 0; - getArchitectureCapabilities.mockResolvedValueOnce(architectureCapabilitiesFixture); - await settle(ensureArchitectureCapabilitiesLoaded); - await render(layers.at(-1), engineWith(layers)); - }; const ANIMA_MAIN = { base: 'anima', key: 'anima-main', name: 'Anima', type: 'main' }; const renderAnima = (...layers: CanvasControlLayerContract[]) => renderWith(ANIMA_MAIN, ANIMA_MODELS, ...layers); @@ -425,6 +426,46 @@ describe('ControlLayerSettings on an Anima main model', () => { }); }); +describe('ControlLayerSettings on a Qwen Image main model', () => { + const QWEN_MAIN = { base: 'qwen-image', key: 'qwen-main', name: 'Qwen Image 2512', type: 'main' }; + const QWEN_EDIT_MAIN = { ...QWEN_MAIN, key: 'qwen-edit', name: 'Qwen Image Edit 2511', variant: 'edit' }; + const QWEN_MODELS = [ + { base: 'qwen-image', key: 'qwen-union', name: 'Qwen Image ControlNet Union', type: 'controlnet' }, + { base: 'z-image', key: 'z-union', name: 'Z-Image ControlNet Union', type: 'controlnet' }, + ]; + /** A layer as the Layers panel creates it under a Qwen Image main model. */ + const qwenLayer = (id: string) => createControlLayer(id, id, 'qwen-image', 'qwen-union'); + + it('offers the Qwen Image ControlNet kind and its models, and accepts one without a warning', async () => { + await renderWith(QWEN_MAIN, QWEN_MODELS, qwenLayer('control-1')); + + expect(offersKind('qwen_image_control')).toBe(true); + expect(offersKind('controlnet')).toBe(false); + expect(offersKind('z_image_control')).toBe(false); + expect(offeredModels()).toEqual(['qwen-union']); + expect(host!.textContent).toContain('Qwen Image ControlNet Union'); + expect(textOf('alert')).toBe(''); + }); + + it('says the control cannot run on a Qwen Image Edit model', async () => { + await renderWith(QWEN_EDIT_MAIN, QWEN_MODELS, qwenLayer('control-1')); + + expect(textOf('alert')).toBe('widgets.layers.control.validation.qwen_image_edit_control'); + }); + + it('flags the second of two controls, but not the first', async () => { + const first = qwenLayer('first'); + const second = qwenLayer('second'); + await renderWith(QWEN_MAIN, QWEN_MODELS, first, second); + expect(textOf('alert')).toBe('widgets.layers.control.validation.qwen_image_control_limit'); + + await act(() => root?.unmount()); + host?.remove(); + await render(first, engineWith([first, second])); + expect(textOf('alert')).toBe(''); + }); +}); + describe('ControlLayerSettings weight', () => { // A full document layer (the panel reads its leaf), weighted 1 so a drag can move either way. const weighted = ((): CanvasControlLayerContract => { diff --git a/invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx b/invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx index a3f590d48c6..96a90a967e3 100644 --- a/invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx +++ b/invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx @@ -11,6 +11,7 @@ import type { CanvasStructuralEngine } from '@workbench/widgets/layers/layerOps' import { createListCollection, HStack, Stack, Switch, Text } from '@chakra-ui/react'; import { CONTROL_ADAPTER_KINDS, + getControlAdapterMinWeight, getControlModelUnusableReason, getSuggestedControlKind, isControlKindSupportedForBase, @@ -74,7 +75,7 @@ export const ControlLayerSettings = ({ engine, layer, onOperationStarted }: Cont const mainModel = useSelectedMainModel(); const base = mainModel?.base ?? null; const { adapter } = layer; - const weightInputMin = adapter.kind === 'z_image_control' ? 0 : CONTROL_WEIGHT_BOUNDS.inputMin; + const weightInputMin = getControlAdapterMinWeight(adapter.kind); // A previewed gesture records from where its preview started; any other change from the live adapter. const commitAdapter = useCallback( diff --git a/invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerWarningIcon.tsx b/invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerWarningIcon.tsx index b95fff467ea..cecc57a1b28 100644 --- a/invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerWarningIcon.tsx +++ b/invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerWarningIcon.tsx @@ -40,7 +40,7 @@ export const ControlLayerWarningIcon = ({ useCallback( () => layer.type === 'control' && contributing && mainModel - ? getControlLayerAttentionReason(layer, mainModel.base, models) + ? getControlLayerAttentionReason(layer, mainModel, models) : null, [contributing, layer, mainModel, models] ) diff --git a/invokeai/frontend/webv2/src/workbench/widgets/layers/controlModelOptions.test.ts b/invokeai/frontend/webv2/src/workbench/widgets/layers/controlModelOptions.test.ts index 51528e7caf0..e181f62f71a 100644 --- a/invokeai/frontend/webv2/src/workbench/widgets/layers/controlModelOptions.test.ts +++ b/invokeai/frontend/webv2/src/workbench/widgets/layers/controlModelOptions.test.ts @@ -27,6 +27,20 @@ describe('getCompatibleControlModels', () => { expect(getCompatibleControlModels(models, 'sd-1', 'z_image_control')).toEqual([]); }); + it('returns only Qwen-Image ControlNet models for qwen_image_control', () => { + const models = [ + model('qwen-union', 'qwen-image', 'controlnet'), + model('z-control', 'z-image', 'controlnet'), + model('qwen-lora', 'qwen-image', 'lora'), + ]; + + expect( + getCompatibleControlModels(models, 'qwen-image', 'qwen_image_control').map((candidate) => candidate.key) + ).toEqual(['qwen-union']); + expect(getCompatibleControlModels(models, 'z-image', 'qwen_image_control')).toEqual([]); + expect(getCompatibleControlModels(models, null, 'qwen_image_control')).toEqual([]); + }); + it('keeps existing adapter filtering unchanged', () => { const models = [model('sd-control', 'sd-1', 'controlnet'), model('flux-lora', 'flux', 'control_lora')]; expect(getCompatibleControlModels(models, 'sd-1', 'controlnet').map((candidate) => candidate.key)).toEqual([ @@ -88,6 +102,10 @@ describe('switchControlAdapterKind', () => { beginEndStepPct: [0, 0.75], weight: CONTROL_ADAPTER_DEFAULTS.z_image_control.weight, }); + expect(switchControlAdapterKind(negative, 'qwen_image_control', [], 'qwen-image')).toMatchObject({ + beginEndStepPct: [0, 0.75], + weight: CONTROL_ADAPTER_DEFAULTS.qwen_image_control.weight, + }); const unordered = { ...savedAsControlNet('sketch'), beginEndStepPct: [0.6, 0.2] as [number, number] }; expect(switchControlAdapterKind(unordered, 'anima_lllite', [sketch], 'anima')).toMatchObject({ beginEndStepPct: CONTROL_ADAPTER_DEFAULTS.anima_lllite.beginEndStepPct, @@ -135,4 +153,13 @@ describe('resolveDefaultControlModelForBase', () => { expect(resolveDefaultControlModelForBase(models, 'sd-1')).toBe('sd-control'); expect(resolveDefaultControlModelForBase(models, 'sd-2')).toBeNull(); }); + + it('starts a Qwen-Image control layer on the union ControlNet', () => { + const models = [ + model('qwen-canny', 'qwen-image', 'controlnet'), + { ...model('qwen-union', 'qwen-image', 'controlnet'), name: 'Qwen Image ControlNet Union' } as ModelConfig, + ]; + + expect(resolveDefaultControlModelForBase(models, 'qwen-image')).toBe('qwen-union'); + }); }); diff --git a/invokeai/frontend/webv2/src/workbench/widgets/layers/layerOps.test.ts b/invokeai/frontend/webv2/src/workbench/widgets/layers/layerOps.test.ts index 9dc55151f8b..bd6d288d61a 100644 --- a/invokeai/frontend/webv2/src/workbench/widgets/layers/layerOps.test.ts +++ b/invokeai/frontend/webv2/src/workbench/widgets/layers/layerOps.test.ts @@ -279,6 +279,13 @@ describe('createControlLayer', () => { model: null, weight: 0.75, }, + qwen_image_control: { + beginEndStepPct: [0, 1], + controlMode: null, + kind: 'qwen_image_control', + model: null, + weight: 0.85, + }, t2i_adapter: { beginEndStepPct: [0, 1], controlMode: null, kind: 't2i_adapter', model: null, weight: 1 }, z_image_control: { beginEndStepPct: [0, 1], diff --git a/tests/app/invocations/test_frontend_qwen_image_control_graphs.py b/tests/app/invocations/test_frontend_qwen_image_control_graphs.py new file mode 100644 index 00000000000..214bd29f208 --- /dev/null +++ b/tests/app/invocations/test_frontend_qwen_image_control_graphs.py @@ -0,0 +1,210 @@ +"""The Qwen Image ControlNet canvas graphs webv2 compiles are graphs this backend accepts. + +`qwenImageControlCanvasGraphs.json` is written by webv2's `compileCanvasGraph.test.ts` (regenerate with +`vitest -u`) from the real canvas compiler: a text-to-image submission with one control layer, an inpainting +submission where that layer also hands the control the canvas composite and the inverted canvas mask, and an +outpainting submission where it hands over the infilled image and the combined mask through edges. This module +checks more than names: pydantic validates every node against its invocation (bounds such as +`qwen_image_control.control_context_scale` in [0, 2] included), `Graph.validate_self` checks every edge type into +`qwen_image_denoise.control` and `.vae`, the control node's own `invoke` runs on the fields it would receive, and +`core_metadata` is serialised the way the gallery persists it. No model is loaded. +""" + +import json +from pathlib import Path +from typing import Any + +import pytest + +from invokeai.app.invocations.fields import ImageField +from invokeai.app.invocations.image import ImageLerpInvocation +from invokeai.app.invocations.metadata import CoreMetadataInvocation +from invokeai.app.invocations.qwen_image.qwen_image_control import QwenImageControlField, QwenImageControlInvocation +from invokeai.app.invocations.qwen_image.qwen_image_denoise import QwenImageDenoiseInvocation +from invokeai.app.invocations.sd.create_gradient_mask import CreateGradientMaskInvocation +from invokeai.app.services.shared.graph import Graph + +FIXTURE_PATH = ( + Path(__file__).parents[3] + / "invokeai" + / "frontend" + / "webv2" + / "src" + / "features" + / "generation" + / "core" + / "__snapshots__" + / "qwenImageControlCanvasGraphs.json" +) + +GRAPHS: dict[str, Any] = { + name: graph for name, graph in json.loads(FIXTURE_PATH.read_text(encoding="utf-8")).items() if name != "_comment" +} + + +@pytest.fixture(params=sorted(GRAPHS), ids=str) +def graph(request: pytest.FixtureRequest) -> Graph: + graph = Graph.model_validate(GRAPHS[request.param]) + graph.validate_self() + return graph + + +def _control_node(graph: Graph) -> QwenImageControlInvocation: + nodes = [node for node in graph.nodes.values() if isinstance(node, QwenImageControlInvocation)] + assert len(nodes) == 1 + return nodes[0] + + +def _denoise_node(graph: Graph) -> QwenImageDenoiseInvocation: + nodes = [node for node in graph.nodes.values() if isinstance(node, QwenImageDenoiseInvocation)] + assert len(nodes) == 1 + return nodes[0] + + +def _inputs(graph: Graph, node_id: str) -> dict[str, Any]: + """A node's edge-fed inputs, by destination field.""" + return {e.destination.field: e.source for e in graph.edges if e.destination.node_id == node_id} + + +def _control_field(graph: Graph, node: QwenImageControlInvocation) -> QwenImageControlField: + """The field the node would emit. `invoke` only repackages the node's own fields, so an image that an edge + supplies at run time stands in as the image its source node would produce.""" + runtime = node.model_copy( + update={ + field: ImageField(image_name=f"{node.id}.{field}") + for field in _inputs(graph, node.id) + if field in {"image", "inpaint_image", "inpaint_mask"} + } + ) + return runtime.invoke(None).control # type: ignore[arg-type] + + +def test_the_fixtures_cover_every_canvas_mode_with_one_control_layer() -> None: + assert sorted(GRAPHS) == ["inpaint_control_layer", "outpaint_control_layer", "txt2img_control_layer"] + for name, raw in GRAPHS.items(): + types = [node["type"] for node in raw["nodes"].values()] + assert types.count("qwen_image_control") == 1, name + assert types.count("qwen_image_denoise") == 1, name + + +@pytest.mark.parametrize("name", sorted(GRAPHS)) +def test_every_field_the_frontend_writes_is_one_the_invocation_declares(name: str) -> None: + """Pydantic ignores an unknown key, so a misnamed field (`weight` for `control_context_scale`) would validate + and run at its default. Values must also survive validation unchanged rather than being coerced.""" + graph = Graph.model_validate(GRAPHS[name]) + for node_id, raw in GRAPHS[name]["nodes"].items(): + node = graph.nodes[node_id] + if type(node).model_config.get("extra") == "allow": + # `core_metadata` records whatever the graph gives it, feature fields included, and persists the extras. + continue + unknown = set(raw) - set(type(node).model_fields) + assert unknown == set(), f"{raw['type']} has no field(s) {sorted(unknown)}" + if isinstance(node, QwenImageControlInvocation): + written = { + field: raw[field] for field in ("control_context_scale", "begin_step_percent", "end_step_percent") + } + assert {field: getattr(node, field) for field in written} == written + + +def test_the_control_reaches_the_denoise_directly_beside_the_vae_it_needs(graph: Graph) -> None: + """`qwen_image_denoise.control` is one field, not a collection, and the denoise refuses a control unless the + VAE that encodes its images is connected too.""" + control = _control_node(graph) + denoise = _denoise_node(graph) + inputs = _inputs(graph, denoise.id) + + assert (inputs["control"].node_id, inputs["control"].field) == (control.id, "control") + assert graph.nodes[inputs["vae"].node_id].get_type() == "qwen_image_model_loader" + assert inputs["vae"].field == "vae" + assert not any(node.get_type() == "collect" for node in graph.nodes.values()) + assert control.control_model.base.value == "qwen-image" + assert control.control_model.type.value == "controlnet" + assert control.control_context_scale == 0.85 + assert (control.begin_step_percent, control.end_step_percent) == (0.0, 1.0) + + +def test_text_to_image_sends_the_control_image_alone() -> None: + graph = Graph.model_validate(GRAPHS["txt2img_control_layer"]) + control = _control_node(graph) + + assert control.image is not None and control.image.image_name == "q-control.png" + assert control.inpaint_image is None and control.inpaint_mask is None + assert _inputs(graph, control.id) == {} + assert not any(isinstance(node, ImageLerpInvocation) for node in graph.nodes.values()) + field = _control_field(graph, control) + assert field.image_name == "q-control.png" + assert field.inpaint_image_name is None and field.inpaint_mask_name is None + + +def test_inpainting_adds_the_composite_and_the_inverted_uploaded_mask() -> None: + """Without Scale Before Processing the canvas uploads are read as fixed image fields, not through resize nodes. + The canvas mask is white = keep; the control regenerates white, so an `img_lerp` 255 -> 0 feeds its mask.""" + graph = Graph.model_validate(GRAPHS["inpaint_control_layer"]) + graph.validate_self() + control = _control_node(graph) + + assert control.image is not None and control.image.image_name == "q-control.png" + assert control.inpaint_image is not None and control.inpaint_image.image_name == "canvas-composite.png" + inputs = _inputs(graph, control.id) + assert set(inputs) == {"inpaint_mask"} + invert = graph.nodes[inputs["inpaint_mask"].node_id] + assert isinstance(invert, ImageLerpInvocation) + assert (invert.min, invert.max) == (255, 0) + assert invert.image.image_name == "canvas-mask.png" + assert inputs["inpaint_mask"].field == "image" + assert _inputs(graph, invert.id) == {} + # The denoise mask is the uploaded canvas mask as is; only the control gets the inverted copy. + gradient_mask = graph.nodes[_inputs(graph, _denoise_node(graph).id)["denoise_mask"].node_id] + assert isinstance(gradient_mask, CreateGradientMaskInvocation) + assert gradient_mask.mask.image_name == "canvas-mask.png" + field = _control_field(graph, control) + assert (field.image_name, field.inpaint_image_name) == ("q-control.png", "canvas-composite.png") + assert field.inpaint_mask_name == f"{control.id}.inpaint_mask" + + +def test_outpainting_adds_the_infilled_image_and_the_inverted_combined_mask() -> None: + graph = Graph.model_validate(GRAPHS["outpaint_control_layer"]) + graph.validate_self() + control = _control_node(graph) + + inputs = _inputs(graph, control.id) + assert set(inputs) == {"inpaint_image", "inpaint_mask"} + assert graph.nodes[inputs["inpaint_image"].node_id].get_type() == "infill_lama" + assert inputs["inpaint_image"].field == "image" + invert = graph.nodes[inputs["inpaint_mask"].node_id] + assert isinstance(invert, ImageLerpInvocation) + assert (invert.min, invert.max) == (255, 0) + assert inputs["inpaint_mask"].field == "image" + assert graph.nodes[_inputs(graph, invert.id)["image"].node_id].get_type() == "mask_combine" + # The control reads the same infilled image the encode the denoise starts from reads. + assert _inputs(graph, "canvas_i2l")["image"].node_id == inputs["inpaint_image"].node_id + field = _control_field(graph, control) + assert field.image_name == "q-control.png" + assert field.inpaint_image_name is not None and field.inpaint_mask_name is not None + + +def test_the_control_node_refuses_the_half_pair_the_frontend_never_sends() -> None: + """The frontend sends the inpaint image and mask together or not at all; pin the node constraint it mirrors.""" + graph = Graph.model_validate(GRAPHS["inpaint_control_layer"]) + control = _control_node(graph) + half = control.model_copy(update={"inpaint_mask": None}) + + with pytest.raises(ValueError, match="go together"): + half.invoke(None) # type: ignore[arg-type] + + +@pytest.mark.parametrize( + ("name", "mode"), + [ + ("txt2img_control_layer", "qwen_image_txt2img"), + ("inpaint_control_layer", "qwen_image_inpaint"), + ("outpaint_control_layer", "qwen_image_outpaint"), + ], +) +def test_persisted_metadata_records_the_canvas_mode(name: str, mode: str) -> None: + graph = Graph.model_validate(GRAPHS[name]) + metadata = next(node for node in graph.nodes.values() if isinstance(node, CoreMetadataInvocation)) + + persisted = metadata.invoke(None).metadata.root # type: ignore[arg-type] + + assert persisted["generation_mode"] == mode diff --git a/tests/app/invocations/test_qwen_image_control.py b/tests/app/invocations/test_qwen_image_control.py new file mode 100644 index 00000000000..d711745d87c --- /dev/null +++ b/tests/app/invocations/test_qwen_image_control.py @@ -0,0 +1,504 @@ +"""The Qwen Image ControlNet node, and what the denoise does with its field: refuses the pairings the branch was not +trained for, reserves the hints and the score matrices beside the activations, locks the branch with the same +reservation inside the exit stack, gates it per step, and builds the packed control context from the field's images +the way it packs its latents. + +The denoise runs its transformer in bfloat16, which the CPU test fleet cannot matmul, so every run here stops at the +transformer's lock or at the LoRA patcher, or runs the loop with the transformer's forward stood in. The forward with +the hooks is covered in `tests/backend/fun_controlnet`. +""" + +from contextlib import contextmanager, nullcontext +from types import SimpleNamespace +from unittest.mock import MagicMock + +import pytest +import torch +from diffusers.models.autoencoders.autoencoder_kl_qwenimage import AutoencoderKLQwenImage +from diffusers.models.transformers.transformer_qwenimage import QwenImageTransformer2DModel +from PIL import Image +from pydantic import ValidationError + +from invokeai.app.invocations.fields import ImageField +from invokeai.app.invocations.model import ModelIdentifierField, VAEField +from invokeai.app.invocations.qwen_image import qwen_image_denoise +from invokeai.app.invocations.qwen_image.qwen_image_control import QwenImageControlField, QwenImageControlInvocation +from invokeai.app.invocations.qwen_image.qwen_image_denoise import QwenImageDenoiseInvocation +from invokeai.app.invocations.vae.qwen_image_image_to_latents import QwenImageImageToLatentsInvocation +from invokeai.backend.fun_controlnet.hooks import FunControlHooks +from invokeai.backend.fun_controlnet.qwen_image import QwenImageFunControlBranch +from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelFormat, ModelType +from invokeai.backend.patches.layer_patcher import LayerPatcher +from invokeai.backend.stable_diffusion.diffusers_pipeline import image_resized_to_grid_as_tensor +from invokeai.backend.stable_diffusion.diffusion.conditioning_data import ( + ConditioningFieldData, + QwenImageConditioningInfo, +) +from invokeai.backend.util import attention +from invokeai.backend.util.attention import SDPA_MATH_BYTES_PER_SCORE_ELEMENT +from invokeai.backend.util.devices import TorchDevice + +SIDE = 64 # an 8x8 latent: 16 image tokens +LATENT_SIDE = SIDE // 8 +TEXT_TOKENS = 4 +CONTROL_LAYERS = (0, 2) +HIDDEN = 16 + + +class _Stop(Exception): + """Raised where the node has made the decision a test looks at.""" + + +def _model(type_: ModelType) -> ModelIdentifierField: + return ModelIdentifierField( + key=f"{type_.value}", hash="hash", name=type_.value, base=BaseModelType.QwenImage, type=type_ + ) + + +# --- the node --- + + +def test_the_node_hands_its_images_and_settings_to_the_field() -> None: + node = QwenImageControlInvocation( + id="control", + control_model=_model(ModelType.ControlNet), + image=ImageField(image_name="canny"), + inpaint_image=ImageField(image_name="photo"), + inpaint_mask=ImageField(image_name="mask"), + control_context_scale=0.7, + begin_step_percent=0.1, + end_step_percent=0.9, + tiled=True, + tile_size=512, + ) + + assert node.invoke(MagicMock()).control == QwenImageControlField( + image_name="canny", + inpaint_image_name="photo", + inpaint_mask_name="mask", + control_model=_model(ModelType.ControlNet), + control_context_scale=0.7, + begin_step_percent=0.1, + end_step_percent=0.9, + tiled=True, + tile_size=512, + ) + + +@pytest.mark.parametrize( + "images", + [ + {"image": ImageField(image_name="canny")}, + {"inpaint_image": ImageField(image_name="photo"), "inpaint_mask": ImageField(image_name="mask")}, + ], + ids=["control-alone", "inpaint-alone"], +) +def test_a_control_image_alone_or_an_inpaint_pair_alone_is_enough(images) -> None: + node = QwenImageControlInvocation(id="control", control_model=_model(ModelType.ControlNet), **images) + field = node.invoke(MagicMock()).control + assert (field.image_name, field.inpaint_image_name, field.inpaint_mask_name) == ( + "canny" if "image" in images else None, + "photo" if "inpaint_image" in images else None, + "mask" if "inpaint_mask" in images else None, + ) + + +@pytest.mark.parametrize( + ("images", "message"), + [ + ({}, "control image"), + ({"inpaint_mask": ImageField(image_name="mask")}, "go together"), + ({"inpaint_image": ImageField(image_name="photo")}, "go together"), + ], + ids=["nothing", "mask-alone", "image-alone"], +) +def test_the_node_refuses_to_run_without_a_complete_input(images, message) -> None: + node = QwenImageControlInvocation(id="control", control_model=_model(ModelType.ControlNet), **images) + with pytest.raises(ValueError, match=message): + node.invoke(MagicMock()) + + +def test_a_begin_after_the_end_is_refused_when_the_node_is_built() -> None: + with pytest.raises(ValidationError, match="Begin step percent"): + QwenImageControlInvocation( + id="control", control_model=_model(ModelType.ControlNet), begin_step_percent=0.8, end_step_percent=0.2 + ) + + +# --- the denoise --- + + +@pytest.fixture(autouse=True) +def cpu(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setattr(TorchDevice, "choose_torch_device", lambda: torch.device("cpu")) + + +@pytest.fixture(autouse=True) +def fused_sdpa(monkeypatch: pytest.MonkeyPatch) -> None: + """Answer the dispatch questions `sdpa_score_matrix_bytes` asks, so no test depends on the torch build of the + machine it runs on: fused, unless a test says otherwise.""" + monkeypatch.setattr(attention, "_diffusers_attention_dispatch", lambda: attention._DISPATCH_TORCH) + monkeypatch.setattr(attention, "rocm_sdpa_uses_math_kernel", lambda *_args: False) + monkeypatch.setattr(attention, "_torch_sdpa_materializes_score_matrix", lambda *_args: False) + + +def _tiny_transformer(zero_cond_t: bool = False) -> QwenImageTransformer2DModel: + return QwenImageTransformer2DModel( + patch_size=2, + in_channels=64, + out_channels=16, + num_layers=4, + attention_head_dim=8, + num_attention_heads=2, + joint_attention_dim=8, + axes_dims_rope=(2, 4, 2), + zero_cond_t=zero_cond_t, + ).eval() + + +def _tiny_branch() -> QwenImageFunControlBranch: + return QwenImageFunControlBranch( + hidden_size=HIDDEN, num_attention_heads=2, attention_head_dim=8, control_layers=CONTROL_LAYERS + ).eval() + + +def _tiny_vae() -> AutoencoderKLQwenImage: + # The smallest configuration that keeps the real 8x spatial compression and 16 latent channels. + return AutoencoderKLQwenImage( + base_dim=4, + z_dim=16, + dim_mult=[1, 1, 1, 1], + num_res_blocks=1, + attn_scales=[], + temperal_downsample=[False, True, True], + ).eval() + + +def _loaded(model, lock) -> MagicMock: + """A `LoadedModel` stand-in: `model` unlocked, `model_on_device` as `lock` says (a context or a raise).""" + info = MagicMock() + info.model = model + info.compute_device = torch.device("cpu") + info.model_on_device = MagicMock(side_effect=lock) + return info + + +def _yielding(model): + return lambda working_mem_bytes=None: nullcontext((None, model)) + + +def _stopping(working_mem_bytes=None): + raise _Stop + + +def _control_field(**overrides) -> QwenImageControlField: + field = { + "image_name": "canny", + "inpaint_image_name": "photo", + "inpaint_mask_name": "mask", + "control_model": _model(ModelType.ControlNet), + } + field.update(overrides) + return QwenImageControlField(**field) + + +def _denoise(**overrides) -> QwenImageDenoiseInvocation: + fields = { + "latents": None, + "reference_latents": None, + "denoise_mask": None, + "denoising_start": 0.0, + "denoising_end": 1.0, + "transformer": SimpleNamespace(transformer=_model(ModelType.Main), loras=[]), + "positive_conditioning": SimpleNamespace(conditioning_name="pos"), + "negative_conditioning": SimpleNamespace(conditioning_name="neg"), + "cfg_scale": 4.0, + "width": SIDE, + "height": SIDE, + "steps": 2, + "seed": 0, + "shift": None, + "control": _control_field(), + "vae": VAEField(vae=_model(ModelType.VAE)), + } + fields.update(overrides) + return QwenImageDenoiseInvocation.model_construct(**fields) + + +def _control_image() -> Image.Image: + return Image.linear_gradient("L").resize((SIDE // 2, SIDE // 2)).convert("RGB") + + +def _inpaint_image() -> Image.Image: + return Image.linear_gradient("L").rotate(90).resize((SIDE, SIDE)).convert("RGB") + + +def _inpaint_mask() -> Image.Image: + """White (regenerate) in the top-left quarter.""" + mask = Image.new("L", (SIDE, SIDE), 0) + mask.paste(255, (0, 0, SIDE // 2, SIDE // 2)) + return mask + + +def _context(tmp_path, transformer_info=None, control_info=None, vae_info=None, masked_prompt=False) -> MagicMock: + infos = {ModelType.Main: transformer_info, ModelType.ControlNet: control_info, ModelType.VAE: vae_info} + context = MagicMock() + context.models.load.side_effect = lambda identifier: infos[identifier.type] + context.models.get_config.return_value = SimpleNamespace( + base=BaseModelType.QwenImage, type=ModelType.Main, format=ModelFormat.Checkpoint + ) + # No `scheduler/` beside it: the node falls back to the Qwen-Image schedule defaults. + context.models.get_absolute_path.return_value = tmp_path / "qwen_image.safetensors" + prompt_mask = torch.ones(1, TEXT_TOKENS, dtype=torch.bool) if masked_prompt else None + context.conditioning.load.side_effect = lambda name: ConditioningFieldData( + conditionings=[ + QwenImageConditioningInfo(prompt_embeds=torch.zeros(1, TEXT_TOKENS, 8), prompt_embeds_mask=prompt_mask) + ] + ) + images = {"canny": _control_image(), "photo": _inpaint_image(), "mask": _inpaint_mask()} + context.images.get_pil.side_effect = lambda name: images[name] + context.config.get.return_value.force_tiled_decode = False + return context + + +def _hook_count(transformer) -> int: + return sum(len(block._forward_hooks) + len(block._forward_pre_hooks) for block in transformer.transformer_blocks) + + +@pytest.mark.parametrize( + ("overrides", "message"), + [ + ({"vae": None}, "needs the VAE"), + ({"reference_latents": SimpleNamespace(latents_name="reference")}, "reference latents"), + ], + ids=["no-vae", "reference-latents"], +) +def test_control_is_refused_without_its_vae_or_beside_reference_latents(tmp_path, overrides, message) -> None: + context = _context(tmp_path, transformer_info=_loaded(_tiny_transformer(), _stopping)) + + with pytest.raises(ValueError, match=message): + _denoise(**overrides)._run_diffusion(context) + + # Only the transformer was loaded: nothing else is fetched for a run that cannot happen. + assert context.models.load.call_count == 1 + + +def test_control_is_refused_on_an_edit_transformer(tmp_path) -> None: + context = _context(tmp_path, transformer_info=_loaded(_tiny_transformer(zero_cond_t=True), _stopping)) + + with pytest.raises(ValueError, match="Edit transformer"): + _denoise()._run_diffusion(context) + + assert context.models.load.call_count == 1 + + +def test_without_control_the_lock_reserves_the_activations_alone(tmp_path) -> None: + transformer_info = _loaded(_tiny_transformer(), _stopping) + context = _context(tmp_path, transformer_info=transformer_info) + + with pytest.raises(_Stop): + _denoise(control=None, vae=None)._run_diffusion(context) + + expected = QwenImageDenoiseInvocation._estimate_working_memory( + image_seq_len=16, text_seq_len=TEXT_TOKENS, element_size=torch.bfloat16.itemsize + ) + assert transformer_info.model_on_device.call_args.kwargs["working_mem_bytes"] == expected + + +def test_with_control_the_lock_reserves_the_hints_too_and_the_images_are_encoded_first(tmp_path) -> None: + transformer_info = _loaded(_tiny_transformer(), _stopping) + branch, vae = _tiny_branch(), _tiny_vae() + vae_info = _loaded(vae, _yielding(vae)) + context = _context(tmp_path, transformer_info, _loaded(branch, _yielding(branch)), vae_info) + + with pytest.raises(_Stop): + _denoise()._run_diffusion(context) + + expected = QwenImageDenoiseInvocation._estimate_working_memory( + image_seq_len=16, + text_seq_len=TEXT_TOKENS, + element_size=torch.bfloat16.itemsize, + num_control_blocks=len(CONTROL_LAYERS), + control_hidden_size=HIDDEN, + ) + assert transformer_info.model_on_device.call_args.kwargs["working_mem_bytes"] == expected + # The control image and the masked inpaint image went through the VAE before the transformer was locked. + assert vae_info.model_on_device.call_count == 2 + + +def test_a_build_that_materializes_the_scores_reserves_them_too(tmp_path, monkeypatch: pytest.MonkeyPatch) -> None: + """ROCm on Windows and MPS have no fused kernel for the joint sequence; the 1 GiB base does not cover 24 heads of + 4608^2 scores, so the probe's answer has to reach the reservation.""" + monkeypatch.setattr(attention, "_torch_sdpa_materializes_score_matrix", lambda *_args: True) + transformer_info = _loaded(_tiny_transformer(), _stopping) + context = _context(tmp_path, transformer_info=transformer_info) + + with pytest.raises(_Stop): + _denoise(control=None, vae=None)._run_diffusion(context) + + activations = QwenImageDenoiseInvocation._estimate_working_memory( + image_seq_len=16, text_seq_len=TEXT_TOKENS, element_size=torch.bfloat16.itemsize + ) + # The tiny transformer's two heads over the 16 + 4 token joint sequence. + scores = 2 * (16 + TEXT_TOKENS) ** 2 * SDPA_MATH_BYTES_PER_SCORE_ELEMENT + assert transformer_info.model_on_device.call_args.kwargs["working_mem_bytes"] == activations + scores + + +@pytest.mark.parametrize("masked_prompt", [False, True], ids=["no-mask", "mask"]) +def test_the_prompt_mask_reaches_the_attention_probe(tmp_path, monkeypatch: pytest.MonkeyPatch, masked_prompt) -> None: + """A mask narrows which fused kernels a build can use, so the probe is told whether the encoder emitted one.""" + asked_with: list[bool] = [] + monkeypatch.setattr( + attention, "_torch_sdpa_materializes_score_matrix", lambda *args: asked_with.append(args[-1]) or False + ) + context = _context(tmp_path, transformer_info=_loaded(_tiny_transformer(), _stopping), masked_prompt=masked_prompt) + + with pytest.raises(_Stop): + _denoise(control=None, vae=None)._run_diffusion(context) + + assert asked_with == [masked_prompt] + + +def test_the_branch_is_locked_with_the_same_reservation_and_hooked_inside_the_exit_stack( + tmp_path, monkeypatch: pytest.MonkeyPatch +) -> None: + transformer, branch, vae = _tiny_transformer(), _tiny_branch(), _tiny_vae() + transformer_info = _loaded(transformer, _yielding(transformer)) + control_info = _loaded(branch, _yielding(branch)) + context = _context(tmp_path, transformer_info, control_info, _loaded(vae, _yielding(vae))) + hooks_at_patching: list[int] = [] + + def stop(**_kwargs): + hooks_at_patching.append(_hook_count(transformer)) + raise _Stop + + monkeypatch.setattr(LayerPatcher, "apply_smart_model_patches", stop) + + with pytest.raises(_Stop): + _denoise()._run_diffusion(context) + + reserved = transformer_info.model_on_device.call_args.kwargs["working_mem_bytes"] + assert control_info.model_on_device.call_args.kwargs["working_mem_bytes"] == reserved + assert hooks_at_patching == [1 + len(CONTROL_LAYERS)] + assert _hook_count(transformer) == 0 + + +class _GateRecordingTransformer(QwenImageTransformer2DModel): + """The real class, so the node's isinstance checks hold and the real hooks land on its blocks, with the forward + replaced: no bfloat16 matmul on the CPU, and a record of the control gate at every call.""" + + def __init__(self) -> None: + super().__init__( + patch_size=2, + in_channels=64, + out_channels=16, + num_layers=4, + attention_head_dim=8, + num_attention_heads=2, + joint_attention_dim=8, + axes_dims_rope=(2, 4, 2), + ) + self.hooks: FunControlHooks | None = None + self.gates: list[bool] = [] + + def forward(self, hidden_states: torch.Tensor, *_args, **_kwargs): + assert self.hooks is not None + self.gates.append(self.hooks.active) + return (torch.zeros(*hidden_states.shape[:2], 4 * self.out_channels, dtype=hidden_states.dtype),) + + +@pytest.mark.parametrize( + ("begin", "end", "expected_gates"), + [ + (0.5, 1.0, [False] * 4 + [True] * 4), + (0.0, 0.5, [True] * 6 + [False] * 2), + ], + ids=["second-half", "first-half"], +) +def test_the_gate_is_set_once_per_step_for_both_guidance_branches( + tmp_path, monkeypatch: pytest.MonkeyPatch, begin, end, expected_gates +) -> None: + """Four steps with CFG are eight forwards: the gate follows `step_index / total_steps` with both ends included, + is re-evaluated every step, and the positive and the negative forward of a step see the same one.""" + transformer, branch, vae = _GateRecordingTransformer(), _tiny_branch(), _tiny_vae() + install = qwen_image_denoise.install_fun_control + + @contextmanager + def capturing_install(*args, **kwargs): + with install(*args, **kwargs) as hooks: + transformer.hooks = hooks + yield hooks + + monkeypatch.setattr(qwen_image_denoise, "install_fun_control", capturing_install) + context = _context( + tmp_path, + _loaded(transformer, _yielding(transformer)), + _loaded(branch, _yielding(branch)), + _loaded(vae, _yielding(vae)), + ) + + _denoise(steps=4, control=_control_field(begin_step_percent=begin, end_step_percent=end))._run_diffusion(context) + + assert transformer.gates == expected_gates + + +@pytest.mark.parametrize( + ("tiled", "tile_size", "force_tiled_decode", "expected_tiled"), + [(False, 0, False, False), (True, 512, False, True), (False, 0, True, True)], + ids=["untiled", "field", "forced"], +) +def test_the_control_images_are_encoded_with_the_fields_tiling( + tmp_path, monkeypatch: pytest.MonkeyPatch, tiled, tile_size, force_tiled_decode, expected_tiled +) -> None: + vae = _tiny_vae() + context = _context(tmp_path, vae_info=_loaded(vae, _yielding(vae))) + context.config.get.return_value.force_tiled_decode = force_tiled_decode + encode = QwenImageImageToLatentsInvocation.vae_encode + encoded_with: list[tuple[bool, int]] = [] + + def recording(**kwargs): + encoded_with.append((kwargs["tiled"], kwargs["tile_size"])) + return encode(**kwargs) + + monkeypatch.setattr(QwenImageImageToLatentsInvocation, "vae_encode", staticmethod(recording)) + + _denoise(control=_control_field(tiled=tiled, tile_size=tile_size))._build_control_context( + context, LATENT_SIDE, LATENT_SIDE + ) + + # Once for the control image, once for the masked inpaint image, both with the field's tiling. + assert encoded_with == [(expected_tiled, tile_size)] * 2 + + +def _as_denoise_input(image: Image.Image, mode: str) -> torch.Tensor: + """What the node feeds the VAE: the image at generation size, pixels in [-1, 1], a mask in [0, 1].""" + resample = Image.Resampling.LANCZOS if mode == "RGB" else Image.Resampling.BILINEAR + resized = image.convert(mode).resize((SIDE, SIDE), resample) + return image_resized_to_grid_as_tensor(resized, normalize=mode == "RGB", multiple_of=16).unsqueeze(0) + + +def test_the_control_context_is_the_encoded_images_packed_like_the_latents(tmp_path) -> None: + vae = _tiny_vae() + vae_info = _loaded(vae, _yielding(vae)) + context = _context(tmp_path, vae_info=vae_info) + + packed = _denoise()._build_control_context(context, LATENT_SIDE, LATENT_SIDE) + + assert packed.shape == (1, (LATENT_SIDE // 2) ** 2, 33 * 4) + # Channel-major within a token: feature c * 4 + dy * 2 + dx of token (i, j) is channel c at (2i + dy, 2j + dx). + context_4d = QwenImageDenoiseInvocation._unpack_latents(packed, LATENT_SIDE, LATENT_SIDE) + assert context_4d.shape == (1, 33, LATENT_SIDE, LATENT_SIDE) + for channel, i, j, dy, dx in [(0, 0, 0, 0, 0), (16, 1, 2, 1, 0), (32, 3, 3, 1, 1), (7, 2, 1, 0, 1)]: + token = i * (LATENT_SIDE // 2) + j + assert packed[0, token, channel * 4 + dy * 2 + dx] == context_4d[0, channel, 2 * i + dy, 2 * j + dx] + + def encode(pixels: torch.Tensor) -> torch.Tensor: + return QwenImageImageToLatentsInvocation.vae_encode(vae_info, pixels).squeeze(2) + + assert torch.equal(context_4d[:, :16], encode(_as_denoise_input(_control_image(), "RGB"))) + expected_keep = torch.ones(LATENT_SIDE, LATENT_SIDE) + expected_keep[: LATENT_SIDE // 2, : LATENT_SIDE // 2] = 0.0 + assert torch.equal(context_4d[0, 16], expected_keep) + masked = _as_denoise_input(_inpaint_image(), "RGB") + masked[..., : SIDE // 2, : SIDE // 2] = 0.0 + assert torch.equal(context_4d[:, 17:], encode(masked)) diff --git a/tests/app/invocations/test_qwen_image_packed_models.py b/tests/app/invocations/test_qwen_image_packed_models.py index 73273ec1483..37e77671a01 100644 --- a/tests/app/invocations/test_qwen_image_packed_models.py +++ b/tests/app/invocations/test_qwen_image_packed_models.py @@ -1,8 +1,9 @@ """The Qwen-Image nodes have to treat a packed nvfp4 model like the other nodes treat one. -The denoise node reserves the per-forward dequantization transient of packed Linears and applies LoRA to them as -sidecars, which it used to decide from the format alone -- GGUF only -- so a `checkpoint` build holding packed Linears -would have been patched directly. The text encoder node reserves the same transient. +The denoise node reserves the per-forward dequantization transient of packed Linears on top of its activation +estimate and applies LoRA to them as sidecars, which it used to decide from the format alone -- GGUF only -- so a +`checkpoint` build holding packed Linears would have been patched directly. The text encoder node reserves the same +transient. """ from contextlib import contextmanager, nullcontext @@ -108,7 +109,9 @@ def stop(**kwargs): with pytest.raises(_Stop): _denoise_node()._run_diffusion(context) - assert loaded.model_on_device.call_args.kwargs["working_mem_bytes"] == transient + # 64x64 is 16 image tokens; the stubbed conditioning is 4 text tokens, in bf16. + activations = QwenImageDenoiseInvocation._estimate_working_memory(image_seq_len=16, text_seq_len=4, element_size=2) + assert loaded.model_on_device.call_args.kwargs["working_mem_bytes"] == activations + transient assert patching["force_sidecar_patching"] is sidecar diff --git a/tests/backend/architectures/test_features.py b/tests/backend/architectures/test_features.py index 5b8aa98956e..94970513b58 100644 --- a/tests/backend/architectures/test_features.py +++ b/tests/backend/architectures/test_features.py @@ -70,6 +70,7 @@ def test_the_sd_family_grid_is_the_vae_compression() -> None: ("control_lora", {"flux"}), ("z_image_control", {"z-image"}), ("anima_lllite", {"anima"}), + ("qwen_image_control", {"qwen-image"}), ], ) def test_control_kinds_match_the_frontend_policy(kind: ControlKind, expected: set[str]) -> None: diff --git a/tests/backend/fun_controlnet/conftest.py b/tests/backend/fun_controlnet/conftest.py new file mode 100644 index 00000000000..fa75d8e1c4c --- /dev/null +++ b/tests/backend/fun_controlnet/conftest.py @@ -0,0 +1,50 @@ +import pytest +import torch +from diffusers.models.transformers.transformer_qwenimage import QwenImageTransformer2DModel + +from invokeai.backend.fun_controlnet.qwen_image import QwenImageFunControlBranch + +TINY_HIDDEN = 16 +TINY_HEADS = 2 +TINY_HEAD_DIM = 8 +TINY_LAYERS = 4 +TINY_TEXT_DIM = 24 +TINY_CONTROL_LAYERS = (0, 2) + + +@pytest.fixture +def tiny_qwen_image_transformer() -> QwenImageTransformer2DModel: + """The real Qwen-Image transformer at toy width (16, two heads of 8), four blocks, in float32 on the CPU. + + Every parameter is drawn from N(0, 0.1): the default init leaves the modulation gates near zero, which would hide + a hint a test is looking for. + """ + torch.manual_seed(0) + model = QwenImageTransformer2DModel( + patch_size=2, + in_channels=64, + out_channels=16, + num_layers=TINY_LAYERS, + attention_head_dim=TINY_HEAD_DIM, + num_attention_heads=TINY_HEADS, + joint_attention_dim=TINY_TEXT_DIM, + axes_dims_rope=(2, 4, 2), + ).eval() + for param in model.parameters(): + torch.nn.init.normal_(param, std=0.1) + return model + + +@pytest.fixture +def tiny_branch() -> QwenImageFunControlBranch: + """Two control blocks for the tiny transformer, their hints landing after base blocks 0 and 2.""" + torch.manual_seed(1) + branch = QwenImageFunControlBranch( + hidden_size=TINY_HIDDEN, + num_attention_heads=TINY_HEADS, + attention_head_dim=TINY_HEAD_DIM, + control_layers=TINY_CONTROL_LAYERS, + ).eval() + for param in branch.parameters(): + torch.nn.init.normal_(param, std=0.1) + return branch diff --git a/tests/backend/fun_controlnet/test_qwen_image_control_conditioning.py b/tests/backend/fun_controlnet/test_qwen_image_control_conditioning.py new file mode 100644 index 00000000000..139d54f29f4 --- /dev/null +++ b/tests/backend/fun_controlnet/test_qwen_image_control_conditioning.py @@ -0,0 +1,145 @@ +"""The Qwen-Image Fun control context: which channel carries what, and what the inpaint mask does to each. + +Expected values are built here from the recipe (VideoX-Fun `pipeline_qwenimage_control.py`), not read back from the +function: the keep mask is `1 - mask` nearest-sampled to latent size, and the masked image has every pixel the mask +marks (>= 0.5) zeroed before it is encoded. +""" + +import pytest +import torch +import torch.nn.functional as F + +from invokeai.backend.fun_controlnet.conditioning import build_qwen_image_control_context + +SIDE = 32 +LATENT_SIDE = SIDE // 8 +LATENT_CHANNELS = 16 + + +class _Encoder: + """Stands in for the VAE: an 8x average pool spread over 16 channels, deterministic and shape-faithful. Records + what it was asked to encode, which is where the masked image is checked.""" + + def __init__(self) -> None: + self.inputs: list[torch.Tensor] = [] + + def __call__(self, pixels: torch.Tensor) -> torch.Tensor: + self.inputs.append(pixels.clone()) + pooled = F.avg_pool2d(pixels, 8) + return torch.cat([pooled] * 5 + [pooled[:, :1]], dim=1) + + +def _image(seed: int) -> torch.Tensor: + return torch.rand(1, 3, SIDE, SIDE, generator=torch.Generator().manual_seed(seed)) * 2 - 1 + + +def _quadrant_mask() -> torch.Tensor: + """White (regenerate) in the top-left quarter, black (keep) elsewhere.""" + mask = torch.zeros(1, 1, SIDE, SIDE) + mask[..., : SIDE // 2, : SIDE // 2] = 1.0 + return mask + + +def test_pure_control_fills_the_control_channels_and_leaves_the_inpaint_channels_at_zero() -> None: + encode = _Encoder() + control_image = _image(0) + + context = build_qwen_image_control_context(encode=encode, control_image=control_image) + + assert context.shape == (1, 2 * LATENT_CHANNELS + 1, LATENT_SIDE, LATENT_SIDE) + assert torch.equal(context[:, :LATENT_CHANNELS], _Encoder()(control_image)) + assert torch.equal(context[:, LATENT_CHANNELS:], torch.zeros(1, LATENT_CHANNELS + 1, LATENT_SIDE, LATENT_SIDE)) + assert len(encode.inputs) == 1 and torch.equal(encode.inputs[0], control_image) + + +def test_pure_inpaint_carries_the_keep_mask_and_the_masked_image_and_no_control() -> None: + encode = _Encoder() + inpaint_image = _image(1) + mask = _quadrant_mask() + + context = build_qwen_image_control_context(encode=encode, inpaint_image=inpaint_image, inpaint_mask=mask) + + assert torch.equal(context[:, :LATENT_CHANNELS], torch.zeros(1, LATENT_CHANNELS, LATENT_SIDE, LATENT_SIDE)) + expected_keep = torch.ones(1, 1, LATENT_SIDE, LATENT_SIDE) + expected_keep[..., : LATENT_SIDE // 2, : LATENT_SIDE // 2] = 0.0 + assert torch.equal(context[:, LATENT_CHANNELS : LATENT_CHANNELS + 1], expected_keep) + # The encoder saw the inpaint image with the regenerated quarter zeroed and nothing else changed. + (encoded,) = encode.inputs + assert torch.equal(encoded[..., : SIDE // 2, : SIDE // 2], torch.zeros(1, 3, SIDE // 2, SIDE // 2)) + assert torch.equal(encoded[..., SIDE // 2 :, :], inpaint_image[..., SIDE // 2 :, :]) + assert torch.equal(encoded[..., :, SIDE // 2 :], inpaint_image[..., :, SIDE // 2 :]) + assert torch.equal(context[:, LATENT_CHANNELS + 1 :], _Encoder()(encoded)) + + +def test_control_and_inpaint_together_fill_both_halves() -> None: + encode = _Encoder() + control_image, inpaint_image = _image(2), _image(3) + + context = build_qwen_image_control_context( + encode=encode, control_image=control_image, inpaint_image=inpaint_image, inpaint_mask=_quadrant_mask() + ) + + assert torch.equal(context[:, :LATENT_CHANNELS], _Encoder()(control_image)) + assert context[:, LATENT_CHANNELS].sum() == LATENT_SIDE * LATENT_SIDE * 3 / 4 + assert torch.equal(context[:, LATENT_CHANNELS + 1 :], _Encoder()(encode.inputs[1])) + + +def test_a_soft_mask_is_thresholded_before_it_becomes_the_keep_channel() -> None: + """A blurred mask (0.5, 0.3, 0.9 bands) must give a 0/1 keep channel that agrees with the zeroed pixels: exactly + the pixels at or above 0.5 are regenerated and read 0 in the channel, the rest are kept and read 1.""" + encode = _Encoder() + inpaint_image = torch.ones(1, 3, SIDE, SIDE) + mask = torch.zeros(1, 1, SIDE, SIDE) + mask[..., :8, :] = 0.5 + mask[..., 8:16, :] = 0.3 + mask[..., 16:24, :] = 0.9 + + context = build_qwen_image_control_context(encode=encode, inpaint_image=inpaint_image, inpaint_mask=mask) + + (encoded,) = encode.inputs + regenerated_rows = torch.zeros(1, 3, 8, SIDE) + kept_rows = torch.ones(1, 3, 8, SIDE) + assert torch.equal(encoded[..., :8, :], regenerated_rows) + assert torch.equal(encoded[..., 8:16, :], kept_rows) + assert torch.equal(encoded[..., 16:24, :], regenerated_rows) + assert torch.equal(encoded[..., 24:, :], kept_rows) + keep = context[0, LATENT_CHANNELS] + assert set(keep.unique().tolist()) <= {0.0, 1.0} + assert torch.equal(keep, torch.tensor([[0.0], [1.0], [0.0], [1.0]]).expand(LATENT_SIDE, LATENT_SIDE)) + + +def test_the_keep_mask_is_sampled_nearest_not_averaged() -> None: + """A one-pixel-wide white line must not smear into a grey band at latent resolution.""" + encode = _Encoder() + mask = torch.zeros(1, 1, SIDE, SIDE) + mask[..., 8, :] = 1.0 + + context = build_qwen_image_control_context(encode=encode, inpaint_image=_image(4), inpaint_mask=mask) + + keep = context[0, LATENT_CHANNELS] + assert set(keep.unique().tolist()) <= {0.0, 1.0} + assert torch.equal(keep[1], torch.zeros(LATENT_SIDE)) + assert keep.sum() == LATENT_SIDE * (LATENT_SIDE - 1) + + +@pytest.mark.parametrize( + ("kwargs", "message"), + [ + ({}, "control image, an inpaint image"), + ({"inpaint_mask": _quadrant_mask()}, "go together"), + ({"inpaint_image": _image(5)}, "go together"), + ({"inpaint_image": _image(5), "inpaint_mask": torch.zeros(1, 1, SIDE, SIDE // 2)}, "size of the inpaint image"), + ( + { + "control_image": _image(6), + "inpaint_image": _image(7)[..., : SIDE // 2], + "inpaint_mask": _quadrant_mask()[..., : SIDE // 2], + }, + "generation size", + ), + ], + ids=["nothing", "mask-alone", "image-alone", "mask-size", "frame-mismatch"], +) +def test_incomplete_or_mismatched_inputs_are_refused(kwargs, message) -> None: + with pytest.raises(ValueError, match=message): + build_qwen_image_control_context(encode=_Encoder(), **kwargs) diff --git a/tests/backend/fun_controlnet/test_qwen_image_fun_control.py b/tests/backend/fun_controlnet/test_qwen_image_fun_control.py new file mode 100644 index 00000000000..78de91abeb4 --- /dev/null +++ b/tests/backend/fun_controlnet/test_qwen_image_fun_control.py @@ -0,0 +1,276 @@ +"""The Qwen-Image Fun control branch, hooked into the real transformer, computes what VideoX-Fun's formulation does. + +`_videox_forward` is the recipe written out: the base preamble, the control chain threading its own text stream from +the base's, and an explicit loop over the base blocks adding each hint after its listed layer. It shares nothing with +the hooks beyond the modules' own forwards. Everything runs in float32 on the CPU. +""" + +import accelerate +import pytest +import torch +from diffusers.models.transformers.transformer_qwenimage import compute_text_seq_len_from_mask + +from invokeai.backend.fun_controlnet.hooks import install_fun_control, should_apply +from invokeai.backend.fun_controlnet.qwen_image import QWEN_IMAGE_FUN_CONTROL_IN_DIM, QwenImageFunControlBranch +from tests.backend.model_manager.load.state_dicts.qwen_image_fun_controlnet_keys import state_dict_keys + +LATENT_SIDE = 8 # 16 image tokens once packed 2x2 +IMAGE_TOKENS = (LATENT_SIDE // 2) ** 2 +TEXT_TOKENS = 6 +SCALE = 0.85 + + +@pytest.fixture +def inputs(tiny_qwen_image_transformer) -> dict: + """One forward's arguments, with two padded text tokens so the mask is threaded too.""" + torch.manual_seed(2) + config = tiny_qwen_image_transformer.config + mask = torch.ones(1, TEXT_TOKENS, dtype=torch.bool) + mask[0, -2:] = False + return { + "hidden_states": torch.randn(1, IMAGE_TOKENS, config.in_channels), + "encoder_hidden_states": torch.randn(1, TEXT_TOKENS, config.joint_attention_dim), + "encoder_hidden_states_mask": mask, + "timestep": torch.tensor([0.5]), + "img_shapes": [[(1, LATENT_SIDE // 2, LATENT_SIDE // 2)]], + } + + +@pytest.fixture +def control_context() -> torch.Tensor: + torch.manual_seed(3) + return torch.randn(1, IMAGE_TOKENS, QWEN_IMAGE_FUN_CONTROL_IN_DIM) + + +def _videox_forward(model, branch, control_context, scale, **inputs) -> tuple[torch.Tensor, list[torch.Tensor]]: + hidden = model.img_in(inputs["hidden_states"]) + timestep = inputs["timestep"].to(hidden.dtype) + text = model.txt_in(model.txt_norm(inputs["encoder_hidden_states"])) + text_seq_len, _, mask = compute_text_seq_len_from_mask(text, inputs["encoder_hidden_states_mask"]) + temb = model.time_text_embed(timestep, hidden) + rope = model.pos_embed(inputs["img_shapes"], max_txt_seq_len=text_seq_len, device=hidden.device) + shared = {"encoder_hidden_states_mask": mask, "temb": temb, "image_rotary_emb": rope} + + c = branch.control_img_in(control_context) + control_text = text + hints = [] + for index, block in enumerate(branch.control_blocks): + if index == 0: + c = block.before_proj(c) + hidden + control_text, c = block(hidden_states=c, encoder_hidden_states=control_text, **shared) + hints.append(block.after_proj(c)) + + for index, block in enumerate(model.transformer_blocks): + text, hidden = block(hidden_states=hidden, encoder_hidden_states=text, **shared) + if index in branch.control_layers: + hidden = hidden + hints[branch.control_layers.index(index)] * scale + return model.proj_out(model.norm_out(hidden, temb)), hints + + +def _forward(model, inputs) -> torch.Tensor: + return model(**inputs, return_dict=False)[0] + + +def _hook_count(model) -> int: + return sum(len(block._forward_hooks) + len(block._forward_pre_hooks) for block in model.transformer_blocks) + + +@torch.no_grad() +def test_the_hooked_forward_computes_the_videox_formulation( + tiny_qwen_image_transformer, tiny_branch, inputs, control_context +) -> None: + model, branch = tiny_qwen_image_transformer, tiny_branch + expected, _ = _videox_forward(model, branch, control_context, SCALE, **inputs) + plain = _forward(model, inputs) + + with install_fun_control(model, branch, control_context, scale=SCALE): + hooked = _forward(model, inputs) + + assert torch.equal(hooked, expected) + assert not torch.equal(hooked, plain) + + +@torch.no_grad() +def test_hints_land_on_the_image_stream_of_the_listed_layers_only( + tiny_qwen_image_transformer, tiny_branch, inputs, control_context +) -> None: + """Each base block's output is recorded before the hint hook sees it and after: the text stream comes through + untouched everywhere, and the image stream moves by exactly the scaled hint at the listed layers.""" + model, branch = tiny_qwen_image_transformer, tiny_branch + _, hints = _videox_forward(model, branch, control_context, SCALE, **inputs) + before: dict[int, tuple] = {} + after: dict[int, tuple] = {} + blocks = list(model.transformer_blocks) + handles = [ + block.register_forward_hook(lambda _m, _a, out, i=i: before.__setitem__(i, out)) + for i, block in enumerate(blocks) + ] + try: + with install_fun_control(model, branch, control_context, scale=SCALE): + handles += [ + block.register_forward_hook(lambda _m, _a, out, i=i: after.__setitem__(i, out)) + for i, block in enumerate(blocks) + ] + _forward(model, inputs) + finally: + for handle in handles: + handle.remove() + + for index in range(len(blocks)): + text_before, image_before = before[index] + text_after, image_after = after[index] + assert text_after is text_before + if index in branch.control_layers: + assert torch.equal(image_after, image_before + hints[branch.control_layers.index(index)] * SCALE) + else: + assert image_after is image_before + + +@torch.no_grad() +def test_scale_zero_and_an_inactive_handle_leave_the_forward_untouched( + tiny_qwen_image_transformer, tiny_branch, inputs, control_context +) -> None: + model, branch = tiny_qwen_image_transformer, tiny_branch + plain = _forward(model, inputs) + + with install_fun_control(model, branch, control_context, scale=0.0): + assert torch.equal(_forward(model, inputs), plain) + + with install_fun_control(model, branch, control_context, scale=SCALE) as hooks: + hooks.active = False + assert torch.equal(_forward(model, inputs), plain) + hooks.active = True + assert not torch.equal(_forward(model, inputs), plain) + hooks.active = False + # Nothing of the active forward is left for the inactive one. + assert torch.equal(_forward(model, inputs), plain) + + +@torch.no_grad() +def test_the_hooks_come_off_on_exit_and_when_the_body_raises( + tiny_qwen_image_transformer, tiny_branch, inputs, control_context +) -> None: + model, branch = tiny_qwen_image_transformer, tiny_branch + plain = _forward(model, inputs) + + with install_fun_control(model, branch, control_context, scale=SCALE): + assert _hook_count(model) == 1 + len(branch.control_layers) + assert _hook_count(model) == 0 + + with pytest.raises(RuntimeError, match="mid-step"): + with install_fun_control(model, branch, control_context, scale=SCALE): + _forward(model, inputs) + raise RuntimeError("mid-step") + assert _hook_count(model) == 0 + assert torch.equal(_forward(model, inputs), plain) + + +def test_a_branch_for_another_transformer_is_refused_at_install( + tiny_qwen_image_transformer, tiny_branch, control_context +) -> None: + model = tiny_qwen_image_transformer + wider = QwenImageFunControlBranch( + hidden_size=32, num_attention_heads=4, attention_head_dim=8, control_layers=(0, 2) + ) + deeper = QwenImageFunControlBranch( + hidden_size=16, num_attention_heads=2, attention_head_dim=8, control_layers=(0, 4) + ) + + with pytest.raises(ValueError, match="32 wide"), install_fun_control(model, wider, control_context, scale=1.0): + pass + with pytest.raises(ValueError, match="4 blocks"), install_fun_control(model, deeper, control_context, scale=1.0): + pass + with ( + pytest.raises(ValueError, match="132"), + install_fun_control(model, tiny_branch, control_context[..., :64], scale=1.0), + ): + pass + assert _hook_count(model) == 0 + + +def test_should_apply_counts_steps_inclusively_at_both_ends() -> None: + assert [should_apply(step, 10, 0.3, 0.8) for step in range(10)] == [False] * 3 + [True] * 6 + [False] + assert all(should_apply(step, 4, 0.0, 1.0) for step in range(4)) + + +def test_the_branch_names_and_shapes_its_tensors_as_the_checkpoint_does() -> None: + """Against the header of alibaba-pai's file: 174 tensors, `before_proj` on block 0 only. Built on the meta device, + so nothing of the 3.5 GB is allocated.""" + with accelerate.init_empty_weights(): + branch = QwenImageFunControlBranch(hidden_size=3072, num_attention_heads=24, attention_head_dim=128) + + assert {name: list(tensor.shape) for name, tensor in branch.state_dict().items()} == { + name: shape for name, (shape, _dtype) in state_dict_keys.items() + } + + +@torch.no_grad() +def test_from_state_dict_rebuilds_the_branch_that_wrote_it( + tiny_qwen_image_transformer, tiny_branch, inputs, control_context +) -> None: + model = tiny_qwen_image_transformer + state_dict = {name: tensor.clone() for name, tensor in tiny_branch.state_dict().items()} + + loaded = QwenImageFunControlBranch.from_state_dict( + state_dict, dtype=torch.float32, control_layers=(0, 2), attention_head_dim=8 + ) + + assert loaded.control_layers == (0, 2) + assert (loaded.hidden_size, loaded.control_in_dim, loaded.control_blocks[0].attn.heads) == (16, 132, 2) + assert not loaded.training + with install_fun_control(model, tiny_branch, control_context, scale=SCALE): + expected = _forward(model, inputs) + with install_fun_control(model, loaded, control_context, scale=SCALE): + assert torch.equal(_forward(model, inputs), expected) + + +@torch.no_grad() +def test_the_chain_runs_in_the_branch_dtype_and_hands_hints_back_in_the_base_dtype( + tiny_qwen_image_transformer, tiny_branch, inputs, control_context +) -> None: + """The loader follows the device's bfloat16-safe dtype while the node runs bfloat16, so a branch may be loaded in + another dtype than the activations it meets. Everything crossing into the chain is cast to the branch's dtype and + the hint back, or a modulation Linear would see a foreign dtype. Checked with a float64 branch against the float32 + base: the same arithmetic in a dtype every CPU has a GEMM for.""" + model = tiny_qwen_image_transformer + with install_fun_control(model, tiny_branch, control_context, scale=SCALE): + expected = _forward(model, inputs) + wider = QwenImageFunControlBranch.from_state_dict( + tiny_branch.state_dict(), dtype=torch.float64, control_layers=(0, 2), attention_head_dim=8 + ) + + with install_fun_control(model, wider, control_context, scale=SCALE): + hooked = _forward(model, inputs) + + assert hooked.dtype == torch.float32 + assert torch.allclose(hooked, expected, atol=1e-4, rtol=1e-4) + + +def test_from_state_dict_casts_to_the_requested_dtype(tiny_branch) -> None: + loaded = QwenImageFunControlBranch.from_state_dict( + tiny_branch.state_dict(), dtype=torch.float16, control_layers=(0, 2), attention_head_dim=8 + ) + assert {parameter.dtype for parameter in loaded.parameters()} == {torch.float16} + + +def _without(state_dict: dict, prefix: str) -> dict: + return {name: tensor for name, tensor in state_dict.items() if not name.startswith(prefix)} + + +@pytest.mark.parametrize( + ("rewrite", "message"), + [ + (lambda sd: _without(sd, "control_blocks.1."), "1 control blocks"), + (lambda sd: {**sd, "control_img_in.weight": torch.zeros(16, 64)}, "takes 64"), + (lambda sd: _without(sd, "control_img_in."), "control_img_in.weight"), + (lambda sd: _without(sd, "control_blocks.1.after_proj."), "missing"), + (lambda sd: {**sd, "control_blocks.1.before_proj.weight": torch.zeros(16, 16)}, "unexpected"), + ], + ids=["block-count", "in-dim", "no-projection", "missing-key", "stray-key"], +) +def test_from_state_dict_refuses_what_is_not_the_qwen_image_recipe(tiny_branch, rewrite, message) -> None: + state_dict = rewrite(dict(tiny_branch.state_dict())) + with pytest.raises(ValueError, match=message): + QwenImageFunControlBranch.from_state_dict( + state_dict, dtype=torch.float32, control_layers=(0, 2), attention_head_dim=8 + ) diff --git a/tests/backend/model_manager/configs/test_qwen_image_fun_controlnet_config.py b/tests/backend/model_manager/configs/test_qwen_image_fun_controlnet_config.py new file mode 100644 index 00000000000..ccf0a3bb650 --- /dev/null +++ b/tests/backend/model_manager/configs/test_qwen_image_fun_controlnet_config.py @@ -0,0 +1,172 @@ +"""Identification of alibaba-pai's Qwen-Image Fun-ControlNet-Union, through the config factory. + +The adapter is a VACE-style control branch: `control_img_in` projects 132 packed channels into Qwen-Image's +3072-wide stream, and five `control_blocks` copy the dual-stream `QwenImageTransformerBlock` with +`before_proj`/`after_proj` taps. Its siblings reuse the naming -- the Qwen-Image-2.1 branch is single-stream at +4096 wide, FLUX.2's keeps `control_transformer_blocks` at 6144 -- and the other Qwen-Image ControlNet designs +(InstantX, DiffSynth) share key families with FLUX ControlNets. So every case is a header written back without its +data: identification reads nothing else, and each config sees the real key names, shapes and dtypes. +""" + +from pathlib import Path + +import pytest +from pydantic import TypeAdapter + +from invokeai.backend.model_manager.configs.controlnet import ControlNet_Checkpoint_QwenImage_Config +from invokeai.backend.model_manager.configs.factory import AnyModelConfig, ModelConfigFactory +from invokeai.backend.model_manager.configs.identification_utils import NotAMatchError +from invokeai.backend.model_manager.model_on_disk import ModelOnDisk +from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelFormat, ModelType +from tests.backend.model_manager.load.state_dicts import ( + qwen_image_fun_controlnet_keys, + qwen_image_instantx_controlnet_keys, +) +from tests.backend.model_manager.load.state_dicts.utils import write_header_only_safetensors + +Keys = dict[str, tuple[list[int], str]] + +FUN_FILE_NAME = "Qwen-Image-2512-Fun-Controlnet-Union-2602.safetensors" + +_OVERRIDE_FIELDS: dict[str, object] = { + "hash": "blake3:fakehash", + "path": "/fake/models/controlnet.safetensors", + "file_size": 1000, + "name": "controlnet", + "description": "test", + "source": "test", + "source_type": "path", + "key": "test-key", +} + + +def _fun_keys() -> Keys: + return dict(qwen_image_fun_controlnet_keys.state_dict_keys) + + +def _bf16(shapes: dict[str, list[int]]) -> Keys: + return {key: (shape, "BF16") for key, shape in shapes.items()} + + +# Sibling layouts with no captured header, reduced to the keys the probes read. +QWEN_IMAGE_2_1_FUN_KEYS = _bf16( + { + "control_img_in.weight": [4096, 129], + "control_img_in.bias": [4096], + "control_blocks.0.before_proj.weight": [4096, 4096], + "control_blocks.0.after_proj.weight": [4096, 4096], + "control_blocks.0.attn.to_q.weight": [4096, 4096], + "control_blocks.0.img_mlp.gate_layer.weight": [12288, 4096], + "control_blocks.0.img_mlp.proj.weight": [12288, 4096], + "control_blocks.0.img_mlp.out.weight": [4096, 12288], + "control_blocks.15.after_proj.weight": [4096, 4096], + } +) +FLUX2_FUN_KEYS = _bf16( + { + "control_img_in.weight": [6144, 260], + "control_img_in.bias": [6144], + "control_transformer_blocks.0.attn.to_q.weight": [6144, 6144], + "control_transformer_blocks.0.after_proj.weight": [6144, 6144], + } +) +Z_IMAGE_FUN_KEYS = _bf16( + { + "control_layers.0.attention.qkv.weight": [11520, 3840], + "control_layers.0.attention.out.weight": [3840, 3840], + "control_all_x_embedder.2-1.weight": [3840, 64], + "control_noise_refiner.0.attention.qkv.weight": [11520, 3840], + } +) +DIFFSYNTH_KEYS = _bf16( + { + "img_in.weight": [3072, 64], + "controlnet_blocks.0.input_proj.weight": [3072, 3072], + "controlnet_blocks.0.output_proj.weight": [3072, 3072], + "controlnet_blocks.0.x_rms.weight": [3072], + "controlnet_blocks.0.y_rms.weight": [3072], + } +) + + +def _write(tmp_path: Path, name: str, keys: Keys) -> Path: + return write_header_only_safetensors(tmp_path / name, keys) + + +def test_the_released_file_is_a_qwen_image_controlnet_and_nothing_else(tmp_path: Path) -> None: + result = ModelConfigFactory.from_model_on_disk(_write(tmp_path, FUN_FILE_NAME, _fun_keys()), allow_unknown=False) + + assert type(result.config) is ControlNet_Checkpoint_QwenImage_Config, result.details + assert result.match_count == 1, result.details + assert result.config.base is BaseModelType.QwenImage + assert result.config.type is ModelType.ControlNet + assert result.config.format is ModelFormat.Checkpoint + + +@pytest.mark.parametrize( + ("name", "preprocessor"), + [(FUN_FILE_NAME, None), ("Qwen-Image-Fun-Controlnet-Depth.safetensors", "depth_anything_image_processor")], + ids=["union", "depth"], +) +def test_the_preprocessor_is_chosen_from_the_name_as_for_every_controlnet( + tmp_path: Path, name: str, preprocessor: str | None +) -> None: + """A union adapter takes any control image, so none is pre-selected; a single-condition build picks its own.""" + config = ModelConfigFactory.from_model_on_disk(_write(tmp_path, name, _fun_keys()), allow_unknown=False).config + + assert isinstance(config, ControlNet_Checkpoint_QwenImage_Config) + assert config.default_settings is not None + assert config.default_settings.preprocessor == preprocessor + + +def test_a_stored_record_reads_back_as_a_qwen_image_controlnet(tmp_path: Path) -> None: + """The record crosses the database and the API as a plain dict, so the config has to be a member of + `AnyModelConfig` under a discriminator of its own.""" + stored = ModelConfigFactory.from_model_on_disk( + _write(tmp_path, FUN_FILE_NAME, _fun_keys()), allow_unknown=False + ).config.model_dump(mode="json") + + restored = TypeAdapter(AnyModelConfig).validate_python(stored) + + assert type(restored) is ControlNet_Checkpoint_QwenImage_Config + assert restored.base is BaseModelType.QwenImage + + +@pytest.mark.parametrize( + ("name", "keys"), + [ + ("Qwen-Image-2.1-Fun-Controlnet-Union.safetensors", QWEN_IMAGE_2_1_FUN_KEYS), + ("FLUX.2-dev-Fun-Controlnet-Union.safetensors", FLUX2_FUN_KEYS), + ("Z-Image-Turbo-Fun-Controlnet-Union.safetensors", Z_IMAGE_FUN_KEYS), + ("Qwen-Image-InstantX-ControlNet-Union.safetensors", dict(qwen_image_instantx_controlnet_keys.state_dict_keys)), + ("Qwen-Image-DiffSynth-Controlnet.safetensors", DIFFSYNTH_KEYS), + ], + ids=["qwen_image_2_1_fun", "flux2_fun", "z_image_fun", "instantx", "diffsynth"], +) +def test_the_other_control_designs_are_refused(tmp_path: Path, name: str, keys: Keys) -> None: + mod = ModelOnDisk(_write(tmp_path, name, keys)) + + with pytest.raises(NotAMatchError): + ControlNet_Checkpoint_QwenImage_Config.from_model_on_disk(mod, dict(_OVERRIDE_FIELDS)) + + +def _without_img_mod(keys: Keys) -> Keys: + return {key: value for key, value in keys.items() if ".img_mod." not in key} + + +def _with_control_img_in(keys: Keys, shape: list[int]) -> Keys: + return {**keys, "control_img_in.weight": (shape, "BF16")} + + +@pytest.mark.parametrize( + "keys", + [_without_img_mod(_fun_keys()), _with_control_img_in(_fun_keys(), [4096, 129])], + ids=["single_stream_blocks", "wider_projection"], +) +def test_a_branch_with_the_names_but_not_the_fingerprint_is_refused(tmp_path: Path, keys: Keys) -> None: + """Both halves of the fingerprint carry weight: `control_blocks` at Qwen-Image's width without `img_mod` + would be a single-stream branch, and `img_mod` behind a wider projection a branch for a wider base.""" + mod = ModelOnDisk(_write(tmp_path, FUN_FILE_NAME, keys)) + + with pytest.raises(NotAMatchError): + ControlNet_Checkpoint_QwenImage_Config.from_model_on_disk(mod, dict(_OVERRIDE_FIELDS)) diff --git a/tests/backend/model_manager/load/state_dicts/qwen_image_fun_controlnet_keys.py b/tests/backend/model_manager/load/state_dicts/qwen_image_fun_controlnet_keys.py new file mode 100644 index 00000000000..27cead31d21 --- /dev/null +++ b/tests/backend/model_manager/load/state_dicts/qwen_image_fun_controlnet_keys.py @@ -0,0 +1,193 @@ +"""Key layout of alibaba-pai's Qwen-Image Fun-ControlNet-Union (2602 build), the VACE-style control branch. + +Captured on 2026-10-18 with `scripts/capture_state_dict_fixture.py`, +which reads the header only, from +`alibaba-pai/Qwen-Image-2512-Fun-Controlnet-Union/Qwen-Image-2512-Fun-Controlnet-Union-2602.safetensors`. + +Subsetting rule: none -- every key in the file. Values are `(shape, dtype)`. + +The whole branch is 174 bf16 tensors: `control_img_in` projects 132 packed channels into Qwen-Image's +3072-wide stream, and `control_blocks.0..4` are copies of diffusers' dual-stream `QwenImageTransformerBlock` +(`img_mod`/`txt_mod`, `img_mlp.net`/`txt_mlp.net`, joint attention with `add_*_proj`) with an `after_proj` +tap on every block and a `before_proj` on block 0 only. Identification keys on the projection shape and on +`img_mod`: the Qwen-Image-2.1 branch reuses the names with 129 channels into 4096 and single-stream blocks, +FLUX.2's with 260 into 6144 under `control_transformer_blocks`. The build without `-2602` in its name has +the identical layout. +""" + +state_dict_keys: dict[str, tuple[list[int], str]] = { + "control_blocks.0.after_proj.bias": ([3072], "BF16"), + "control_blocks.0.after_proj.weight": ([3072, 3072], "BF16"), + "control_blocks.0.attn.add_k_proj.bias": ([3072], "BF16"), + "control_blocks.0.attn.add_k_proj.weight": ([3072, 3072], "BF16"), + "control_blocks.0.attn.add_q_proj.bias": ([3072], "BF16"), + "control_blocks.0.attn.add_q_proj.weight": ([3072, 3072], "BF16"), + "control_blocks.0.attn.add_v_proj.bias": ([3072], "BF16"), + "control_blocks.0.attn.add_v_proj.weight": ([3072, 3072], "BF16"), + "control_blocks.0.attn.norm_added_k.weight": ([128], "BF16"), + "control_blocks.0.attn.norm_added_q.weight": ([128], "BF16"), + "control_blocks.0.attn.norm_k.weight": ([128], "BF16"), + "control_blocks.0.attn.norm_q.weight": ([128], "BF16"), + "control_blocks.0.attn.to_add_out.bias": ([3072], "BF16"), + "control_blocks.0.attn.to_add_out.weight": ([3072, 3072], "BF16"), + "control_blocks.0.attn.to_k.bias": ([3072], "BF16"), + "control_blocks.0.attn.to_k.weight": ([3072, 3072], "BF16"), + "control_blocks.0.attn.to_out.0.bias": ([3072], "BF16"), + "control_blocks.0.attn.to_out.0.weight": ([3072, 3072], "BF16"), + "control_blocks.0.attn.to_q.bias": ([3072], "BF16"), + "control_blocks.0.attn.to_q.weight": ([3072, 3072], "BF16"), + "control_blocks.0.attn.to_v.bias": ([3072], "BF16"), + "control_blocks.0.attn.to_v.weight": ([3072, 3072], "BF16"), + "control_blocks.0.before_proj.bias": ([3072], "BF16"), + "control_blocks.0.before_proj.weight": ([3072, 3072], "BF16"), + "control_blocks.0.img_mlp.net.0.proj.bias": ([12288], "BF16"), + "control_blocks.0.img_mlp.net.0.proj.weight": ([12288, 3072], "BF16"), + "control_blocks.0.img_mlp.net.2.bias": ([3072], "BF16"), + "control_blocks.0.img_mlp.net.2.weight": ([3072, 12288], "BF16"), + "control_blocks.0.img_mod.1.bias": ([18432], "BF16"), + "control_blocks.0.img_mod.1.weight": ([18432, 3072], "BF16"), + "control_blocks.0.txt_mlp.net.0.proj.bias": ([12288], "BF16"), + "control_blocks.0.txt_mlp.net.0.proj.weight": ([12288, 3072], "BF16"), + "control_blocks.0.txt_mlp.net.2.bias": ([3072], "BF16"), + "control_blocks.0.txt_mlp.net.2.weight": ([3072, 12288], "BF16"), + "control_blocks.0.txt_mod.1.bias": ([18432], "BF16"), + "control_blocks.0.txt_mod.1.weight": ([18432, 3072], "BF16"), + "control_blocks.1.after_proj.bias": ([3072], "BF16"), + "control_blocks.1.after_proj.weight": ([3072, 3072], "BF16"), + "control_blocks.1.attn.add_k_proj.bias": ([3072], "BF16"), + "control_blocks.1.attn.add_k_proj.weight": ([3072, 3072], "BF16"), + "control_blocks.1.attn.add_q_proj.bias": ([3072], "BF16"), + "control_blocks.1.attn.add_q_proj.weight": ([3072, 3072], "BF16"), + "control_blocks.1.attn.add_v_proj.bias": ([3072], "BF16"), + "control_blocks.1.attn.add_v_proj.weight": ([3072, 3072], "BF16"), + "control_blocks.1.attn.norm_added_k.weight": ([128], "BF16"), + "control_blocks.1.attn.norm_added_q.weight": ([128], "BF16"), + "control_blocks.1.attn.norm_k.weight": ([128], "BF16"), + "control_blocks.1.attn.norm_q.weight": ([128], "BF16"), + "control_blocks.1.attn.to_add_out.bias": ([3072], "BF16"), + "control_blocks.1.attn.to_add_out.weight": ([3072, 3072], "BF16"), + "control_blocks.1.attn.to_k.bias": ([3072], "BF16"), + "control_blocks.1.attn.to_k.weight": ([3072, 3072], "BF16"), + "control_blocks.1.attn.to_out.0.bias": ([3072], "BF16"), + "control_blocks.1.attn.to_out.0.weight": ([3072, 3072], "BF16"), + "control_blocks.1.attn.to_q.bias": ([3072], "BF16"), + "control_blocks.1.attn.to_q.weight": ([3072, 3072], "BF16"), + "control_blocks.1.attn.to_v.bias": ([3072], "BF16"), + "control_blocks.1.attn.to_v.weight": ([3072, 3072], "BF16"), + "control_blocks.1.img_mlp.net.0.proj.bias": ([12288], "BF16"), + "control_blocks.1.img_mlp.net.0.proj.weight": ([12288, 3072], "BF16"), + "control_blocks.1.img_mlp.net.2.bias": ([3072], "BF16"), + "control_blocks.1.img_mlp.net.2.weight": ([3072, 12288], "BF16"), + "control_blocks.1.img_mod.1.bias": ([18432], "BF16"), + "control_blocks.1.img_mod.1.weight": ([18432, 3072], "BF16"), + "control_blocks.1.txt_mlp.net.0.proj.bias": ([12288], "BF16"), + "control_blocks.1.txt_mlp.net.0.proj.weight": ([12288, 3072], "BF16"), + "control_blocks.1.txt_mlp.net.2.bias": ([3072], "BF16"), + "control_blocks.1.txt_mlp.net.2.weight": ([3072, 12288], "BF16"), + "control_blocks.1.txt_mod.1.bias": ([18432], "BF16"), + "control_blocks.1.txt_mod.1.weight": ([18432, 3072], "BF16"), + "control_blocks.2.after_proj.bias": ([3072], "BF16"), + "control_blocks.2.after_proj.weight": ([3072, 3072], "BF16"), + "control_blocks.2.attn.add_k_proj.bias": ([3072], "BF16"), + "control_blocks.2.attn.add_k_proj.weight": ([3072, 3072], "BF16"), + "control_blocks.2.attn.add_q_proj.bias": ([3072], "BF16"), + "control_blocks.2.attn.add_q_proj.weight": ([3072, 3072], "BF16"), + "control_blocks.2.attn.add_v_proj.bias": ([3072], "BF16"), + "control_blocks.2.attn.add_v_proj.weight": ([3072, 3072], "BF16"), + "control_blocks.2.attn.norm_added_k.weight": ([128], "BF16"), + "control_blocks.2.attn.norm_added_q.weight": ([128], "BF16"), + "control_blocks.2.attn.norm_k.weight": ([128], "BF16"), + "control_blocks.2.attn.norm_q.weight": ([128], "BF16"), + "control_blocks.2.attn.to_add_out.bias": ([3072], "BF16"), + "control_blocks.2.attn.to_add_out.weight": ([3072, 3072], "BF16"), + "control_blocks.2.attn.to_k.bias": ([3072], "BF16"), + "control_blocks.2.attn.to_k.weight": ([3072, 3072], "BF16"), + "control_blocks.2.attn.to_out.0.bias": ([3072], "BF16"), + "control_blocks.2.attn.to_out.0.weight": ([3072, 3072], "BF16"), + "control_blocks.2.attn.to_q.bias": ([3072], "BF16"), + "control_blocks.2.attn.to_q.weight": ([3072, 3072], "BF16"), + "control_blocks.2.attn.to_v.bias": ([3072], "BF16"), + "control_blocks.2.attn.to_v.weight": ([3072, 3072], "BF16"), + "control_blocks.2.img_mlp.net.0.proj.bias": ([12288], "BF16"), + "control_blocks.2.img_mlp.net.0.proj.weight": ([12288, 3072], "BF16"), + "control_blocks.2.img_mlp.net.2.bias": ([3072], "BF16"), + "control_blocks.2.img_mlp.net.2.weight": ([3072, 12288], "BF16"), + "control_blocks.2.img_mod.1.bias": ([18432], "BF16"), + "control_blocks.2.img_mod.1.weight": ([18432, 3072], "BF16"), + "control_blocks.2.txt_mlp.net.0.proj.bias": ([12288], "BF16"), + "control_blocks.2.txt_mlp.net.0.proj.weight": ([12288, 3072], "BF16"), + "control_blocks.2.txt_mlp.net.2.bias": ([3072], "BF16"), + "control_blocks.2.txt_mlp.net.2.weight": ([3072, 12288], "BF16"), + "control_blocks.2.txt_mod.1.bias": ([18432], "BF16"), + "control_blocks.2.txt_mod.1.weight": ([18432, 3072], "BF16"), + "control_blocks.3.after_proj.bias": ([3072], "BF16"), + "control_blocks.3.after_proj.weight": ([3072, 3072], "BF16"), + "control_blocks.3.attn.add_k_proj.bias": ([3072], "BF16"), + "control_blocks.3.attn.add_k_proj.weight": ([3072, 3072], "BF16"), + "control_blocks.3.attn.add_q_proj.bias": ([3072], "BF16"), + "control_blocks.3.attn.add_q_proj.weight": ([3072, 3072], "BF16"), + "control_blocks.3.attn.add_v_proj.bias": ([3072], "BF16"), + "control_blocks.3.attn.add_v_proj.weight": ([3072, 3072], "BF16"), + "control_blocks.3.attn.norm_added_k.weight": ([128], "BF16"), + "control_blocks.3.attn.norm_added_q.weight": ([128], "BF16"), + "control_blocks.3.attn.norm_k.weight": ([128], "BF16"), + "control_blocks.3.attn.norm_q.weight": ([128], "BF16"), + "control_blocks.3.attn.to_add_out.bias": ([3072], "BF16"), + "control_blocks.3.attn.to_add_out.weight": ([3072, 3072], "BF16"), + "control_blocks.3.attn.to_k.bias": ([3072], "BF16"), + "control_blocks.3.attn.to_k.weight": ([3072, 3072], "BF16"), + "control_blocks.3.attn.to_out.0.bias": ([3072], "BF16"), + "control_blocks.3.attn.to_out.0.weight": ([3072, 3072], "BF16"), + "control_blocks.3.attn.to_q.bias": ([3072], "BF16"), + "control_blocks.3.attn.to_q.weight": ([3072, 3072], "BF16"), + "control_blocks.3.attn.to_v.bias": ([3072], "BF16"), + "control_blocks.3.attn.to_v.weight": ([3072, 3072], "BF16"), + "control_blocks.3.img_mlp.net.0.proj.bias": ([12288], "BF16"), + "control_blocks.3.img_mlp.net.0.proj.weight": ([12288, 3072], "BF16"), + "control_blocks.3.img_mlp.net.2.bias": ([3072], "BF16"), + "control_blocks.3.img_mlp.net.2.weight": ([3072, 12288], "BF16"), + "control_blocks.3.img_mod.1.bias": ([18432], "BF16"), + "control_blocks.3.img_mod.1.weight": ([18432, 3072], "BF16"), + "control_blocks.3.txt_mlp.net.0.proj.bias": ([12288], "BF16"), + "control_blocks.3.txt_mlp.net.0.proj.weight": ([12288, 3072], "BF16"), + "control_blocks.3.txt_mlp.net.2.bias": ([3072], "BF16"), + "control_blocks.3.txt_mlp.net.2.weight": ([3072, 12288], "BF16"), + "control_blocks.3.txt_mod.1.bias": ([18432], "BF16"), + "control_blocks.3.txt_mod.1.weight": ([18432, 3072], "BF16"), + "control_blocks.4.after_proj.bias": ([3072], "BF16"), + "control_blocks.4.after_proj.weight": ([3072, 3072], "BF16"), + "control_blocks.4.attn.add_k_proj.bias": ([3072], "BF16"), + "control_blocks.4.attn.add_k_proj.weight": ([3072, 3072], "BF16"), + "control_blocks.4.attn.add_q_proj.bias": ([3072], "BF16"), + "control_blocks.4.attn.add_q_proj.weight": ([3072, 3072], "BF16"), + "control_blocks.4.attn.add_v_proj.bias": ([3072], "BF16"), + "control_blocks.4.attn.add_v_proj.weight": ([3072, 3072], "BF16"), + "control_blocks.4.attn.norm_added_k.weight": ([128], "BF16"), + "control_blocks.4.attn.norm_added_q.weight": ([128], "BF16"), + "control_blocks.4.attn.norm_k.weight": ([128], "BF16"), + "control_blocks.4.attn.norm_q.weight": ([128], "BF16"), + "control_blocks.4.attn.to_add_out.bias": ([3072], "BF16"), + "control_blocks.4.attn.to_add_out.weight": ([3072, 3072], "BF16"), + "control_blocks.4.attn.to_k.bias": ([3072], "BF16"), + "control_blocks.4.attn.to_k.weight": ([3072, 3072], "BF16"), + "control_blocks.4.attn.to_out.0.bias": ([3072], "BF16"), + "control_blocks.4.attn.to_out.0.weight": ([3072, 3072], "BF16"), + "control_blocks.4.attn.to_q.bias": ([3072], "BF16"), + "control_blocks.4.attn.to_q.weight": ([3072, 3072], "BF16"), + "control_blocks.4.attn.to_v.bias": ([3072], "BF16"), + "control_blocks.4.attn.to_v.weight": ([3072, 3072], "BF16"), + "control_blocks.4.img_mlp.net.0.proj.bias": ([12288], "BF16"), + "control_blocks.4.img_mlp.net.0.proj.weight": ([12288, 3072], "BF16"), + "control_blocks.4.img_mlp.net.2.bias": ([3072], "BF16"), + "control_blocks.4.img_mlp.net.2.weight": ([3072, 12288], "BF16"), + "control_blocks.4.img_mod.1.bias": ([18432], "BF16"), + "control_blocks.4.img_mod.1.weight": ([18432, 3072], "BF16"), + "control_blocks.4.txt_mlp.net.0.proj.bias": ([12288], "BF16"), + "control_blocks.4.txt_mlp.net.0.proj.weight": ([12288, 3072], "BF16"), + "control_blocks.4.txt_mlp.net.2.bias": ([3072], "BF16"), + "control_blocks.4.txt_mlp.net.2.weight": ([3072, 12288], "BF16"), + "control_blocks.4.txt_mod.1.bias": ([18432], "BF16"), + "control_blocks.4.txt_mod.1.weight": ([18432, 3072], "BF16"), + "control_img_in.bias": ([3072], "BF16"), + "control_img_in.weight": ([3072, 132], "BF16"), +} diff --git a/tests/backend/model_manager/load/state_dicts/qwen_image_instantx_controlnet_keys.py b/tests/backend/model_manager/load/state_dicts/qwen_image_instantx_controlnet_keys.py new file mode 100644 index 00000000000..ac6d5eb68b5 --- /dev/null +++ b/tests/backend/model_manager/load/state_dicts/qwen_image_instantx_controlnet_keys.py @@ -0,0 +1,63 @@ +"""Key layout of Comfy-Org's single-file InstantX Qwen-Image ControlNet-Union. + +Captured on 2026-10-18 with `scripts/capture_state_dict_fixture.py`, +which reads the header only, from +`Comfy-Org/Qwen-Image-InstantX-ControlNets/split_files/controlnet/Qwen-Image-InstantX-ControlNet-Union.safetensors`. + +Subsetting rule: `controlnet_blocks` index 0, `transformer_blocks` index 0, plus every key outside a stack. +Values are `(shape, dtype)`. + +A different design from the Fun branch: a trimmed copy of the Qwen-Image transformer itself (`img_in`, +`txt_in` at Qwen2.5-VL's 3584 width, `txt_norm`, `time_text_embed`, `transformer_blocks.N`) with +`controlnet_x_embedder` for the control latent and one `controlnet_blocks.N` output projection per block -- +the key family InstantX's FLUX ControlNets use. It has no `control_img_in`, which is what keeps it out of +the Qwen-Image Fun config. +""" + +state_dict_keys: dict[str, tuple[list[int], str]] = { + "controlnet_blocks.0.bias": ([3072], "BF16"), + "controlnet_blocks.0.weight": ([3072, 3072], "BF16"), + "controlnet_x_embedder.bias": ([3072], "BF16"), + "controlnet_x_embedder.weight": ([3072, 64], "BF16"), + "img_in.bias": ([3072], "BF16"), + "img_in.weight": ([3072, 64], "BF16"), + "time_text_embed.timestep_embedder.linear_1.bias": ([3072], "BF16"), + "time_text_embed.timestep_embedder.linear_1.weight": ([3072, 256], "BF16"), + "time_text_embed.timestep_embedder.linear_2.bias": ([3072], "BF16"), + "time_text_embed.timestep_embedder.linear_2.weight": ([3072, 3072], "BF16"), + "transformer_blocks.0.attn.add_k_proj.bias": ([3072], "BF16"), + "transformer_blocks.0.attn.add_k_proj.weight": ([3072, 3072], "BF16"), + "transformer_blocks.0.attn.add_q_proj.bias": ([3072], "BF16"), + "transformer_blocks.0.attn.add_q_proj.weight": ([3072, 3072], "BF16"), + "transformer_blocks.0.attn.add_v_proj.bias": ([3072], "BF16"), + "transformer_blocks.0.attn.add_v_proj.weight": ([3072, 3072], "BF16"), + "transformer_blocks.0.attn.norm_added_k.weight": ([128], "BF16"), + "transformer_blocks.0.attn.norm_added_q.weight": ([128], "BF16"), + "transformer_blocks.0.attn.norm_k.weight": ([128], "BF16"), + "transformer_blocks.0.attn.norm_q.weight": ([128], "BF16"), + "transformer_blocks.0.attn.to_add_out.bias": ([3072], "BF16"), + "transformer_blocks.0.attn.to_add_out.weight": ([3072, 3072], "BF16"), + "transformer_blocks.0.attn.to_k.bias": ([3072], "BF16"), + "transformer_blocks.0.attn.to_k.weight": ([3072, 3072], "BF16"), + "transformer_blocks.0.attn.to_out.0.bias": ([3072], "BF16"), + "transformer_blocks.0.attn.to_out.0.weight": ([3072, 3072], "BF16"), + "transformer_blocks.0.attn.to_q.bias": ([3072], "BF16"), + "transformer_blocks.0.attn.to_q.weight": ([3072, 3072], "BF16"), + "transformer_blocks.0.attn.to_v.bias": ([3072], "BF16"), + "transformer_blocks.0.attn.to_v.weight": ([3072, 3072], "BF16"), + "transformer_blocks.0.img_mlp.net.0.proj.bias": ([12288], "BF16"), + "transformer_blocks.0.img_mlp.net.0.proj.weight": ([12288, 3072], "BF16"), + "transformer_blocks.0.img_mlp.net.2.bias": ([3072], "BF16"), + "transformer_blocks.0.img_mlp.net.2.weight": ([3072, 12288], "BF16"), + "transformer_blocks.0.img_mod.1.bias": ([18432], "BF16"), + "transformer_blocks.0.img_mod.1.weight": ([18432, 3072], "BF16"), + "transformer_blocks.0.txt_mlp.net.0.proj.bias": ([12288], "BF16"), + "transformer_blocks.0.txt_mlp.net.0.proj.weight": ([12288, 3072], "BF16"), + "transformer_blocks.0.txt_mlp.net.2.bias": ([3072], "BF16"), + "transformer_blocks.0.txt_mlp.net.2.weight": ([3072, 12288], "BF16"), + "transformer_blocks.0.txt_mod.1.bias": ([18432], "BF16"), + "transformer_blocks.0.txt_mod.1.weight": ([18432, 3072], "BF16"), + "txt_in.bias": ([3072], "BF16"), + "txt_in.weight": ([3072, 3584], "BF16"), + "txt_norm.weight": ([3584], "BF16"), +} diff --git a/tests/backend/model_manager/load/test_fp8_capability.py b/tests/backend/model_manager/load/test_fp8_capability.py index 08be63e0670..750b7d7dcb2 100644 --- a/tests/backend/model_manager/load/test_fp8_capability.py +++ b/tests/backend/model_manager/load/test_fp8_capability.py @@ -229,6 +229,7 @@ def test_the_declarations_are_the_backlog_and_nothing_else(self) -> None: "flux/controlnet/diffusers", "minimax-h3/main/checkpoint", "minimax-h3/main/diffusers", + "qwen-image/controlnet/checkpoint", "z-image/controlnet/checkpoint", ] diff --git a/tests/backend/model_manager/load/test_fun_controlnet_loader.py b/tests/backend/model_manager/load/test_fun_controlnet_loader.py new file mode 100644 index 00000000000..b4e4ac5a731 --- /dev/null +++ b/tests/backend/model_manager/load/test_fun_controlnet_loader.py @@ -0,0 +1,98 @@ +"""What the Qwen-Image Fun-ControlNet loader makes of a checkpoint: the geometry it reads off the tensors, the dtype +it casts to, and the quantized files it refuses rather than loads unscaled. + +Like the Z-Image ControlNet loader it builds under `init_empty_weights` and assigns the file's tensors, so an fp8 +weight with its scale dropped would become the parameter as it is (`test_z_image_control_adapter_loader.py`). No +quantized build of this adapter is published (alibaba-pai ships two dense bf16 files), so refusing costs nothing. +""" + +from pathlib import Path + +import pytest +import torch + +from invokeai.backend.fun_controlnet.qwen_image import QWEN_IMAGE_FUN_CONTROL_LAYERS, QwenImageFunControlBranch +from invokeai.backend.model_manager.configs.controlnet import ControlNet_Checkpoint_QwenImage_Config +from invokeai.backend.model_manager.load.model_loaders import fun_controlnet +from invokeai.backend.model_manager.load.model_loaders.fun_controlnet import QwenImageFunControlNetLoader +from tests.fixtures.loader_seams import Seam, prepare +from tests.fixtures.quantized_payloads import comfy_quant_marker, quantize_convrot, quantize_scaled_fp8 + +# One 128-wide head: the narrowest branch the loader's head rule accepts, with the real five-block layout. +HIDDEN = 128 +QUANTIZED_LAYER = "control_blocks.0.attn.to_q" + +SEAM = Seam( + loader=QwenImageFunControlNetLoader, + module=fun_controlnet, + entry="_load_model", + compute_dtype=torch.bfloat16, + # The loader takes its dtype from the device and never reads `self._torch_dtype`. + patches_device=True, + sets_torch_dtype=False, + casts_fp8_storage=False, +) + + +def _checkpoint() -> dict[str, torch.Tensor]: + """A float32 file with the real layout; the loader has to cast it.""" + torch.manual_seed(0) + branch = QwenImageFunControlBranch(hidden_size=HIDDEN, num_attention_heads=1, attention_head_dim=128) + return {name: tensor.detach().clone() for name, tensor in branch.state_dict().items()} + + +def _driver(monkeypatch: pytest.MonkeyPatch, tmp_path: Path, state_dict: dict[str, torch.Tensor]): + checkpoint = tmp_path / "qwen_image_fun_controlnet.safetensors" + checkpoint.touch() + config = ControlNet_Checkpoint_QwenImage_Config.model_construct(path=str(checkpoint), name="qwen-image-control") + return prepare(SEAM, monkeypatch, state_dict=state_dict), config + + +def test_a_dense_checkpoint_loads_with_its_geometry_in_the_compute_dtype(monkeypatch, tmp_path) -> None: + run, config = _driver(monkeypatch, tmp_path, _checkpoint()) + + model = run.load(config) + + assert isinstance(model, QwenImageFunControlBranch) + assert model.control_layers == QWEN_IMAGE_FUN_CONTROL_LAYERS + assert (model.hidden_size, model.control_in_dim, model.control_blocks[0].attn.heads) == (HIDDEN, 132, 1) + assert {parameter.dtype for parameter in model.parameters()} == {torch.bfloat16} + assert not model.training + + +def test_a_scaled_fp8_checkpoint_is_refused_rather_than_loaded_unscaled(monkeypatch, tmp_path) -> None: + payload = quantize_scaled_fp8(torch.randn(HIDDEN, HIDDEN)) + state_dict = _checkpoint() + state_dict[f"{QUANTIZED_LAYER}.weight"] = payload.codes + state_dict[f"{QUANTIZED_LAYER}.weight_scale"] = payload.scale + run, config = _driver(monkeypatch, tmp_path, state_dict) + + with pytest.raises(ValueError, match="quantization side channel"): + run.load(config) + + +def test_an_int8_checkpoint_is_refused_by_its_marker(monkeypatch, tmp_path) -> None: + codes, scale, _ = quantize_convrot(torch.randn(HIDDEN, 256)) + state_dict = _checkpoint() + state_dict[f"{QUANTIZED_LAYER}.weight"] = codes + state_dict[f"{QUANTIZED_LAYER}.weight_scale"] = scale + state_dict[f"{QUANTIZED_LAYER}.comfy_quant"] = comfy_quant_marker({"format": "int8_tensorwise", "convrot": True}) + run, config = _driver(monkeypatch, tmp_path, state_dict) + + with pytest.raises(ValueError, match="quantization side channel"): + run.load(config) + + +@pytest.mark.parametrize( + ("rewrite", "message"), + [ + (lambda sd: {k: v for k, v in sd.items() if not k.startswith("control_blocks.4.")}, "4 control blocks"), + (lambda sd: {**sd, "control_img_in.weight": torch.zeros(HIDDEN, 64)}, "takes 64"), + ], + ids=["four-blocks", "sixteen-channel-context"], +) +def test_another_recipe_is_refused_by_name(monkeypatch, tmp_path, rewrite, message) -> None: + run, config = _driver(monkeypatch, tmp_path, rewrite(_checkpoint())) + + with pytest.raises(ValueError, match=message): + run.load(config) diff --git a/tests/model_identification/stripped_models/779c26bd-e559-4958-80ce-69a551931a26/Qwen-Image-2512-Fun-Controlnet-Union-2602.safetensors b/tests/model_identification/stripped_models/779c26bd-e559-4958-80ce-69a551931a26/Qwen-Image-2512-Fun-Controlnet-Union-2602.safetensors new file mode 100644 index 00000000000..9e621d9d88d --- /dev/null +++ b/tests/model_identification/stripped_models/779c26bd-e559-4958-80ce-69a551931a26/Qwen-Image-2512-Fun-Controlnet-Union-2602.safetensors @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2fb88d8f2e0f139378043b16e4f255696d0f9a1428cd5e3cd4e4c0b91afa9796 +size 25912 diff --git a/tests/model_identification/stripped_models/779c26bd-e559-4958-80ce-69a551931a26/__test_metadata__.json b/tests/model_identification/stripped_models/779c26bd-e559-4958-80ce-69a551931a26/__test_metadata__.json new file mode 100644 index 00000000000..e61968a705d --- /dev/null +++ b/tests/model_identification/stripped_models/779c26bd-e559-4958-80ce-69a551931a26/__test_metadata__.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e9401079bc6203272867a6d71d8b0e96cc437bc89b226dd291c9225402793df7 +size 557 From 5dd7c75f66c4dbbb1ebcafc4af00dfe51de02f00 Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Sun, 18 Oct 2026 21:50:09 +0200 Subject: [PATCH 2/3] feat(controlnet): add FLUX.2 [dev] Fun-ControlNet-Union with canvas control layers Loads alibaba-pai's FLUX.2-dev union as a FLUX.2 ControlNet, runs its control blocks on the shared hook helper and adds a Canvas control kind with inpaint wiring. The control encodes inside Denoise - FLUX.2 retry tiled after running out of memory, like Image to Latents - FLUX.2. --- .../03.Models/02.model-families.mdx | 4 +- .../03.Models/03.model-format-support.mdx | 2 +- .../03.Models/Local Models/flux-2.mdx | 50 +- .../Optimization/low-vram-mode.mdx | 4 +- .../app/invocations/flux2/flux2_control.py | 119 ++ .../app/invocations/flux2/flux2_denoise.py | 158 ++- .../qwen_image/qwen_image_denoise.py | 4 +- .../app/invocations/vae/flux2_vae_encode.py | 62 +- invokeai/backend/architectures/defs/flux2.py | 2 + .../backend/architectures/facets/features.py | 10 +- invokeai/backend/flux2/denoise.py | 12 + invokeai/backend/fun_controlnet/__init__.py | 3 +- .../backend/fun_controlnet/conditioning.py | 16 +- invokeai/backend/fun_controlnet/flux2.py | 230 ++++ .../model_manager/configs/controlnet.py | 47 + .../backend/model_manager/configs/factory.py | 2 + .../load/model_loaders/fun_controlnet.py | 48 +- .../model_manager/starter_models/__init__.py | 2 + .../model_manager/starter_models/flux2.py | 10 + invokeai/frontend/api/openapi.json | 514 +++++++- invokeai/frontend/api/schema.ts | 295 ++++- .../frontend/webv2/public/locales/en.json | 3 + .../architectureCapabilities.json | 16 +- .../flux2ControlCanvasGraphs.json | 1141 +++++++++++++++++ .../qwenImageControlCanvasGraphs.json | 2 +- .../core/architectureCapabilities.test.ts | 1 + .../core/canvas/addControlLayers.test.ts | 92 ++ .../core/canvas/addControlLayers.ts | 73 +- .../core/canvas/compileCanvasGraph.test.ts | 109 +- .../core/canvas/controlValidation.test.ts | 63 + .../core/canvas/controlValidation.ts | 36 +- .../src/workbench/canvas-engine/contracts.ts | 9 +- .../src/workbench/canvasMigration.test.ts | 1 + .../webv2/src/workbench/canvasMigration.ts | 1 + .../src/workbench/controlAdapters.test.ts | 16 +- .../webv2/src/workbench/controlAdapters.ts | 11 +- .../src/workbench/controlLayerChecks.test.ts | 30 + .../webv2/src/workbench/controlLayerChecks.ts | 1 + .../invoke/prepareCanvasInvocation.test.ts | 90 ++ .../ControlLayerSettings.browser.test.tsx | 37 + .../widgets/layers/ControlLayerSettings.tsx | 8 +- .../layers/controlModelOptions.test.ts | 23 + .../workbench/widgets/layers/layerOps.test.ts | 1 + tests/app/invocations/test_flux2_control.py | 571 +++++++++ ...py => test_frontend_fun_control_graphs.py} | 201 +-- tests/backend/architectures/test_features.py | 1 + .../backend/flux2/test_denoise_before_step.py | 75 ++ .../test_flux2_control_context.py | 111 ++ .../fun_controlnet/test_flux2_fun_control.py | 357 ++++++ .../test_qwen_image_control_conditioning.py | 14 +- .../test_flux2_fun_controlnet_config.py | 99 ++ .../test_qwen_image_fun_controlnet_config.py | 11 +- .../state_dicts/flux2_fun_controlnet_keys.py | 95 ++ .../model_manager/load/test_fp8_capability.py | 1 + .../load/test_fun_controlnet_loader.py | 78 +- ...-dev-Fun-Controlnet-Union-2602.safetensors | 3 + .../__test_metadata__.json | 3 + 57 files changed, 4741 insertions(+), 237 deletions(-) create mode 100644 invokeai/app/invocations/flux2/flux2_control.py create mode 100644 invokeai/backend/fun_controlnet/flux2.py create mode 100644 invokeai/frontend/webv2/src/features/generation/core/__snapshots__/flux2ControlCanvasGraphs.json create mode 100644 tests/app/invocations/test_flux2_control.py rename tests/app/invocations/{test_frontend_qwen_image_control_graphs.py => test_frontend_fun_control_graphs.py} (51%) create mode 100644 tests/backend/flux2/test_denoise_before_step.py create mode 100644 tests/backend/fun_controlnet/test_flux2_control_context.py create mode 100644 tests/backend/fun_controlnet/test_flux2_fun_control.py create mode 100644 tests/backend/model_manager/configs/test_flux2_fun_controlnet_config.py create mode 100644 tests/backend/model_manager/load/state_dicts/flux2_fun_controlnet_keys.py create mode 100644 tests/model_identification/stripped_models/8e61cdfc-d085-4172-9923-8344c62c73a5/FLUX.2-dev-Fun-Controlnet-Union-2602.safetensors create mode 100644 tests/model_identification/stripped_models/8e61cdfc-d085-4172-9923-8344c62c73a5/__test_metadata__.json diff --git a/docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx b/docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx index 757cd7a3545..10d4d5543d0 100644 --- a/docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx +++ b/docs/src/content/docs/Users Guide/03.Models/02.model-families.mdx @@ -1,7 +1,7 @@ --- title: Model Formats and Families description: An overview of the models InvokeAI supports — checkpoint, Diffusers and quantized formats, the components that make up a model, and the model families with their licenses. -lastUpdated: 2026-09-30 +lastUpdated: 2026-10-18 sidebar: order: 2 --- @@ -118,7 +118,7 @@ faster generation. | **SDXL** | Images | Higher-resolution successor to SD 1.5 (1024×1024) with a similarly rich ecosystem of add-ons. An optional refiner model, used in the workflow editor, polishes fine detail. | OpenRAIL++-M; varies by fine-tune | [SDXL](/users-guide/models/local-models/sdxl/) | | **Stable Diffusion 3.5** | Images | Medium and Large transformer models from Stability AI, with three text encoders. | Community, free under $1M revenue | [SD 3.5](/users-guide/models/local-models/sd-3/) | | **FLUX.1** | Images | Dev, Schnell, Kontext (image editing) and Krea variants, plus Fill (inpainting, workflow editor only) and Redux, with ControlNets and IP-Adapters. | schnell: Apache 2.0; others non-commercial | [FLUX.1](/users-guide/models/local-models/flux-1/) | -| **FLUX.2** | Images | Klein 4B and 9B, and the much larger [dev]. Generates and edits images from reference images. | Klein 4B: Apache 2.0; Klein 9B and [dev] non-commercial | [FLUX.2](/users-guide/models/local-models/flux-2/) | +| **FLUX.2** | Images | Klein 4B and 9B, and the much larger [dev]. Generates and edits images from reference images; [dev] also takes a ControlNet. | Klein 4B: Apache 2.0; Klein 9B and [dev] non-commercial | [FLUX.2](/users-guide/models/local-models/flux-2/) | | **CogView4** | Images | THUDM's 6B text-to-image model with a GLM text encoder. Basic support, without LoRAs, ControlNets or reference images. | Apache 2.0 | [CogView4](/users-guide/models/local-models/cogview4/) | | **Z-Image** | Images | 6B model in a fast, few-step Turbo variant and a Base variant. Understands English and Chinese prompts, with ControlNets. | Apache 2.0 | [Z-Image](/users-guide/models/local-models/z-image/) | | **ERNIE-Image** | Images | Baidu's 8B text-to-image model, in standard and distilled Turbo variants. | Apache 2.0 | [ERNIE-Image](/users-guide/models/local-models/ernie-image/) | diff --git a/docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx b/docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx index a878bc8e832..4aeac12cf80 100644 --- a/docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx +++ b/docs/src/content/docs/Users Guide/03.Models/03.model-format-support.mdx @@ -101,7 +101,7 @@ not check, so a quantized file there fails with an unclear error or decodes inco | SD 1.x / 2.x | ✓ (LyCORIS, Diffusers) | ✓ | IP-Adapter, T2I-Adapter (SD 1.x), textual inversion | | SDXL | ✓ (LyCORIS, Diffusers, OMI) | ✓ | IP-Adapter, T2I-Adapter, textual inversion | | FLUX.1 | ✓ (LyCORIS, Diffusers, OMI) | ✓ | Control LoRA, IP-Adapter, Redux | -| FLUX.2, Z-Image | ✓ (LyCORIS, Diffusers) | Z-Image only | | +| FLUX.2, Z-Image | ✓ (LyCORIS, Diffusers) | FLUX.2 [dev] (single-file checkpoint), Z-Image | | | Qwen-Image, Krea-2, Wan 2.2, Anima | ✓ (LyCORIS/kohya, including LoKR where noted on the family page) | Qwen-Image (single-file checkpoint), Anima (ControlNet-LLLite) | | | LTX-2, MiniMax H3 | ✓ (plain low-rank; LoKR, LoHA and DoRA are refused) | ✗ | | | SD 3, CogView4, Ideogram 4, ERNIE-Image, Qwen-Image-2.1 | ✗ | ✗ | | diff --git a/docs/src/content/docs/Users Guide/03.Models/Local Models/flux-2.mdx b/docs/src/content/docs/Users Guide/03.Models/Local Models/flux-2.mdx index 3844e5adab5..453fbc6aba6 100644 --- a/docs/src/content/docs/Users Guide/03.Models/Local Models/flux-2.mdx +++ b/docs/src/content/docs/Users Guide/03.Models/Local Models/flux-2.mdx @@ -1,7 +1,7 @@ --- title: FLUX.2 -description: Generate and edit images with FLUX.2 Klein (4B and 9B, distilled and Base) and FLUX.2 [dev], including multi-reference image editing. -lastUpdated: 2026-10-16 +description: Generate and edit images with FLUX.2 Klein (4B and 9B, distilled and Base) and FLUX.2 [dev], including multi-reference image editing and the FLUX.2 [dev] Fun-ControlNet-Union. +lastUpdated: 2026-10-18 sidebar: order: 5 --- @@ -34,7 +34,7 @@ Base models need 28 steps, distilled ones 4. | FLUX.2 Klein 9B | FLUX Non-Commercial License | The weights may not be used commercially; generated images may, except to train a competing model | Yes, on Black Forest Labs' repositories | | FLUX.2 [dev] | FLUX [dev] Non-Commercial License | As for Klein 9B | Yes, on Black Forest Labs' repositories | -The Qwen3 and Mistral text encoders are Apache 2.0. Some repackaged copies show a different license in their metadata; the original model's license is the one that applies. +The Qwen3 and Mistral text encoders are Apache 2.0. The FLUX.2 [dev] ControlNet Union is released under the FLUX [dev] Non-Commercial License, like FLUX.2 [dev] itself. Some repackaged copies show a different license in their metadata; the original model's license is the one that applies. This is a summary, not legal advice. Read the full license on the model's HuggingFace page before using a model commercially. @@ -98,6 +98,7 @@ fp8 weights instead of expanding them. | FLUX.2 [dev] (Diffusers) | Diffusers pipeline | ~80 GB | | FLUX.2 [dev] (Diffusers, NF4) | NF4-quantized transformer and text encoder | ~18 GB VRAM with offload | | FLUX.2 [dev] Transformer (GGUF Q3_K_M / Q4_K_M / Q5_K_M / Q6_K / Q8_0) | GGUF | ~15.9 / 20 / 24 / 27.9 / 35.5 GB | +| FLUX.2 [dev] ControlNet Union | bf16 single file; see [ControlNet](#controlnet) | ~8.2 GB | The GGUF transformers need a separate Mistral encoder. Q3_K_M and Q4_K_M install the GGUF Q4 encoder, the larger quants the GGUF Q8 encoder. Other encoder starters are the Comfy-Org builds — *FP8* (~18 GB, best @@ -127,8 +128,8 @@ Selecting a FLUX.2 model applies these defaults: - **Size** — width and height must be multiples of 16. - **Negative prompt** — not available in the Generate tab or on the Canvas. -Text-to-image, image-to-image, inpainting and outpainting all work on the Canvas. FLUX.2 has no ControlNet -or IP-Adapter support. +Text-to-image, image-to-image, inpainting and outpainting all work on the Canvas. FLUX.2 [dev] takes a +[ControlNet](#controlnet); Klein models take none, and FLUX.2 has no IP-Adapter support. ## Reference images @@ -138,6 +139,42 @@ Generate tab or the Canvas and describe the result you want in the prompt. No ex In the workflow editor, wrap each image in a **Kontext Conditioning - FLUX** node and connect it (or a collection of them) to the **Reference Images** input of **FLUX2 Denoise**. +## ControlNet + +The **FLUX.2 [dev] ControlNet Union** starter model is alibaba-pai's *Fun-ControlNet-Union* for FLUX.2 [dev] +(~8.2 GB, FLUX [dev] Non-Commercial License). One model handles every condition: **Canny**, **HED**, **Depth**, +**Pose**, **MLSD**, **Scribble** and **Gray** control images, plus **inpainting**. The starter model installs +`FLUX.2-dev-Fun-Controlnet-Union-2602.safetensors`, the build to use: Scribble and Gray exist only in it, and the +repository's earlier file lost FLUX.2 [dev]'s CFG distillation during control training and performs worse, which the +2602 build restores. It works with FLUX.2 [dev] only: +the Klein transformers are narrower than the one it was trained beside. With a Klein model selected, a control +layer's settings and the **Invoke** button say that the ControlNet is not compatible, and nothing is generated until +the layer is disabled or the model changed. + +On the Canvas, add a **Control Layer** while a FLUX.2 [dev] model is selected. Its adapter type is **FLUX.2 [dev] +ControlNet** and its pixels are the control image; the layer's **Filter** turns a raster into one of the conditions +(Canny, HED, Depth Anything, DW Openpose, MLSD, Scribble or Grayscale). The layer's **Weight** is the model's control +scale: it ranges from `0` to `2`, starts at `0.75`, and `0.65` to `0.80` is the recommended range. **Step range** +limits the steps the control applies to. **Only one** FLUX.2 [dev] ControlNet layer can be used per generation, and +it can be combined with reference images. + +When the Canvas inpaints or outpaints with a control layer present, the ControlNet also receives the image being +regenerated and the mask of the region as its inpainting condition. Without a control layer, inpainting and +outpainting are guided by the inpaint mask alone. + +In the workflow editor, the same thing is the **FLUX.2 [dev] ControlNet** node feeding the **Control** input of +**FLUX2 Denoise**. Give it a control **Image**, an **Inpaint Image** together with its **Inpaint Mask** (white is +regenerated), or both. Its **Control Scale**, **Begin Step Percent** and **End Step Percent** are the layer's weight +and step range. The images are resized to the generation size and encoded with the VAE connected to **FLUX2 +Denoise**; **Tiled** and **Tile Size** tile that encode, and an untiled encode that runs out of memory is retried in +tiles. **FLUX2 Denoise** stops with a message when the ControlNet meets a Klein model. + +:::note[Memory] +The ControlNet's 8.2 GB of weights stay loaded beside the [dev] transformer for the whole generation, and its +blocks add activation memory that grows with the image size and the number of reference images. On a GPU that +cannot hold all of it, Invoke keeps part of the models in system RAM, and each step is slower. +::: + ## Regional guidance Regional guidance layers with a prompt are supported on the Canvas. Regional reference images are not. @@ -164,7 +201,8 @@ Decode](/users-guide/image-generation/advanced-topics/pid-decode/). | --- | --- | | **Main Model - Flux2 Klein** / **Main Model - FLUX.2 [dev]** | Loads the transformer, encoder and VAE | | **Prompt - Flux2 Klein** / **Prompt - FLUX.2 [dev]** | Encodes the prompt | -| **FLUX2 Denoise** | Runs the diffusion; takes the VAE and optional reference images | +| **FLUX2 Denoise** | Runs the diffusion; takes the VAE, optional reference images and, for [dev], a ControlNet | +| **FLUX.2 [dev] ControlNet** | Configures the ControlNet Union: control image and/or inpaint image with mask, scale, step range | | **Latents to Image - FLUX2** / **Image to Latents - FLUX2** | VAE decode / encode | **FLUX2 Denoise** also has a **CFG Scale** and a negative conditioning input, which the Generate tab leaves diff --git a/docs/src/content/docs/configuration/Optimization/low-vram-mode.mdx b/docs/src/content/docs/configuration/Optimization/low-vram-mode.mdx index c7127113da8..be330223401 100644 --- a/docs/src/content/docs/configuration/Optimization/low-vram-mode.mdx +++ b/docs/src/content/docs/configuration/Optimization/low-vram-mode.mdx @@ -210,8 +210,8 @@ To always decode untiled unless you ask for tiling, turn this off. A decode too auto_tiled_decode: false ``` -- **Always tile:** set `force_tiled_decode: true` in `invokeai.yaml`. It covers the VAE decode and encode for SD1.5/SDXL, FLUX.1, FLUX.2, Z-Image, Qwen-Image and Qwen-Image-2.1, the Anima encode, the control image of a Z-Image ControlNet, the control and inpaint images of a Qwen Image ControlNet, and the Krea-2 style reference. Other model families (for example SD3, Wan and LTX-2) ignore it. -- **Per node:** the SD, FLUX.1, FLUX.2, Z-Image, Qwen-Image and Qwen-Image-2.1 **Latents to Image** and **Image to Latents** nodes, and **Image to Latents - Anima**, have **Tiled** and **Tile Size** fields for workflows. So do the **Z-Image ControlNet** and **Qwen Image ControlNet** nodes, for the images the denoise encodes. The [Upscale panel](/users-guide/image-generation/upscale/) turns tiling on by itself. +- **Always tile:** set `force_tiled_decode: true` in `invokeai.yaml`. It covers the VAE decode and encode for SD1.5/SDXL, FLUX.1, FLUX.2, Z-Image, Qwen-Image and Qwen-Image-2.1, the Anima encode, the control image of a Z-Image ControlNet, the control and inpaint images of a Qwen Image ControlNet and of a FLUX.2 [dev] ControlNet, and the Krea-2 style reference. Other model families (for example SD3, Wan and LTX-2) ignore it. +- **Per node:** the SD, FLUX.1, FLUX.2, Z-Image, Qwen-Image and Qwen-Image-2.1 **Latents to Image** and **Image to Latents** nodes, and **Image to Latents - Anima**, have **Tiled** and **Tile Size** fields for workflows. So do the **Z-Image ControlNet**, **Qwen Image ControlNet** and **FLUX.2 [dev] ControlNet** nodes, for the images the denoise encodes. The [Upscale panel](/users-guide/image-generation/upscale/) turns tiling on by itself. - **Automatic retry:** if a FLUX.1, FLUX.2, Z-Image or Anima decode, or a FLUX.1 or FLUX.2 encode, runs out of memory, InvokeAI retries it once with tiling and logs that it did. A tiled decode is not pixel-identical to a single-pass one. The VAE looks at the whole image at once, so the difference is spread over the image rather than limited to the tile seams; it is small (for a 1024x1024 FLUX.2 Klein image, 5.6 of 255 per pixel value on average, with no visible seams), but the same seed will not reproduce an untiled result exactly. diff --git a/invokeai/app/invocations/flux2/flux2_control.py b/invokeai/app/invocations/flux2/flux2_control.py new file mode 100644 index 00000000000..acfda065d43 --- /dev/null +++ b/invokeai/app/invocations/flux2/flux2_control.py @@ -0,0 +1,119 @@ +"""FLUX.2 [dev] ControlNet: the alibaba-pai Fun-ControlNet-Union for spatial control and inpainting.""" + +from typing import Optional + +from pydantic import BaseModel, Field, model_validator + +from invokeai.app.invocations.baseinvocation import ( + BaseInvocation, + BaseInvocationOutput, + Classification, + invocation, + invocation_output, +) +from invokeai.app.invocations.fields import FieldDescriptions, ImageField, InputField, OutputField +from invokeai.app.invocations.model import ModelIdentifierField +from invokeai.app.invocations.util import validate_begin_end_step +from invokeai.app.services.shared.invocation_context import InvocationContext +from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType +from invokeai.backend.util.vae_tiling_scope import MIN_TILE_SAMPLE_SIZE + +_CONTROL_SCALE_DESCRIPTION = "Strength of the control signal. Recommended range: 0.65-0.80." +_BEGIN_DESCRIPTION = "When the control is first applied (% of total steps)" +_END_DESCRIPTION = "When the control is last applied (% of total steps)" +_TILE_SIZE_DESCRIPTION = ( + f"{FieldDescriptions.vae_tile_size} Values between 1 and {MIN_TILE_SAMPLE_SIZE} are raised to " + f"{MIN_TILE_SAMPLE_SIZE}." +) + + +class Flux2ControlField(BaseModel): + """FLUX.2 [dev] Fun-ControlNet conditioning: a control image, an inpaint image with its mask, or both.""" + + image_name: str | None = Field(default=None, description="The preprocessed control image (Canny, depth, pose, ...)") + inpaint_image_name: str | None = Field(default=None, description="The image to inpaint") + inpaint_mask_name: str | None = Field(default=None, description="The inpaint mask; white is regenerated") + control_model: ModelIdentifierField = Field(description="The FLUX.2 [dev] ControlNet model") + control_context_scale: float = Field(default=0.75, ge=0.0, le=2.0, description=_CONTROL_SCALE_DESCRIPTION) + begin_step_percent: float = Field(default=0.0, ge=0.0, le=1.0, description=_BEGIN_DESCRIPTION) + end_step_percent: float = Field(default=1.0, ge=0.0, le=1.0, description=_END_DESCRIPTION) + tiled: bool = Field( + default=False, + description="Encode the control images in tiles. The denoise encodes them at generation size, where an " + "untiled FLUX.2 VAE encode takes several GB.", + ) + tile_size: int = Field(default=0, ge=0, multiple_of=8, description=_TILE_SIZE_DESCRIPTION) + + +@invocation_output("flux2_control_output") +class Flux2ControlOutput(BaseInvocationOutput): + """FLUX.2 [dev] ControlNet output containing control configuration.""" + + control: Flux2ControlField = OutputField(description="FLUX.2 [dev] control conditioning") + + +@invocation( + "flux2_control", + title="FLUX.2 [dev] ControlNet", + tags=["image", "flux", "flux2", "control", "controlnet", "inpaint"], + category="conditioning", + version="1.0.0", + classification=Classification.Prototype, +) +class Flux2ControlInvocation(BaseInvocation): + """Configure the FLUX.2 [dev] Fun-ControlNet-Union for spatial control, inpainting, or both. + + Takes a preprocessed control image (Canny, HED, depth, pose, MLSD, ...) and/or an image to inpaint with its mask + (white is regenerated), plus the FLUX.2 [dev] ControlNet model. Applies to FLUX.2 [dev] only, not to Klein. + Recommended control scale: 0.65-0.80. + """ + + image: Optional[ImageField] = InputField( + default=None, description="The preprocessed control image (Canny, HED, depth, pose, MLSD, ...)" + ) + inpaint_image: Optional[ImageField] = InputField( + default=None, description="The image to inpaint. Goes together with the inpaint mask." + ) + inpaint_mask: Optional[ImageField] = InputField( + default=None, + description="The inpaint mask: white is regenerated, black is kept. Goes together with the inpaint image.", + ) + control_model: ModelIdentifierField = InputField( + description=FieldDescriptions.controlnet_model, + title="Control Model", + ui_model_base=BaseModelType.Flux2, + ui_model_type=ModelType.ControlNet, + ) + control_context_scale: float = InputField( + default=0.75, ge=0.0, le=2.0, description=_CONTROL_SCALE_DESCRIPTION, title="Control Scale" + ) + begin_step_percent: float = InputField(default=0.0, ge=0.0, le=1.0, description=_BEGIN_DESCRIPTION) + end_step_percent: float = InputField(default=1.0, ge=0.0, le=1.0, description=_END_DESCRIPTION) + tiled: bool = InputField(default=False, description=FieldDescriptions.tiled) + # NOTE: tile_size = 0 is a special value, as on the FLUX.2 VAE nodes: the workflow UI cannot set None. + tile_size: int = InputField(default=0, ge=0, multiple_of=8, description=_TILE_SIZE_DESCRIPTION) + + @model_validator(mode="after") + def validate_begin_end_step_percent(self): + validate_begin_end_step(self.begin_step_percent, self.end_step_percent) + return self + + def invoke(self, context: InvocationContext) -> Flux2ControlOutput: + # Checked here rather than by a validator: connected inputs are filled in at execution time. + if (self.inpaint_image is None) != (self.inpaint_mask is None): + raise ValueError("The inpaint image and the inpaint mask go together: connect both or neither.") + if self.image is None and self.inpaint_image is None: + raise ValueError("Connect a control image, an inpaint image with its mask, or both.") + return Flux2ControlOutput( + control=Flux2ControlField( + image_name=self.image.image_name if self.image is not None else None, + inpaint_image_name=self.inpaint_image.image_name if self.inpaint_image is not None else None, + inpaint_mask_name=self.inpaint_mask.image_name if self.inpaint_mask is not None else None, + control_model=self.control_model, + control_context_scale=self.control_context_scale, + begin_step_percent=self.begin_step_percent, + end_step_percent=self.end_step_percent, + tiled=self.tiled, + tile_size=self.tile_size, + ) + ) diff --git a/invokeai/app/invocations/flux2/flux2_denoise.py b/invokeai/app/invocations/flux2/flux2_denoise.py index 928d2e1d117..f25583f8e2e 100644 --- a/invokeai/app/invocations/flux2/flux2_denoise.py +++ b/invokeai/app/invocations/flux2/flux2_denoise.py @@ -1,14 +1,16 @@ -"""Flux2 Klein Denoise Invocation. +"""FLUX.2 Denoise Invocation. -Run denoising process with a FLUX.2 Klein transformer model. -Uses Qwen3 conditioning instead of CLIP+T5. +Run denoising process with a FLUX.2 transformer model: Klein (Qwen3 conditioning) or [dev] (Mistral conditioning). """ from contextlib import ExitStack +from functools import partial from typing import Callable, Iterator, Optional, Tuple import torch +import torch.nn.functional as F import torchvision.transforms as tv_transforms +from PIL import Image from torchvision.transforms.functional import resize as tv_resize from invokeai.app.invocations.baseinvocation import BaseInvocation, Classification, invocation @@ -21,9 +23,11 @@ InputField, LatentsField, ) +from invokeai.app.invocations.flux2.flux2_control import Flux2ControlField from invokeai.app.invocations.latent_noise import validate_noise_tensor_shape from invokeai.app.invocations.model import TransformerField, VAEField from invokeai.app.invocations.primitives import LatentsOutput +from invokeai.app.invocations.vae.flux2_vae_encode import Flux2VaeEncodeInvocation from invokeai.app.services.shared.invocation_context import InvocationContext from invokeai.backend.flux.sampling_utils import clip_timestep_schedule_fractional from invokeai.backend.flux.schedulers import FLUX_SCHEDULER_LABELS, FLUX_SCHEDULER_MAP, FLUX_SCHEDULER_NAME_VALUES @@ -42,8 +46,11 @@ unpack_flux2, ) from invokeai.backend.flux2.text_conditioning import Flux2TextConditioning +from invokeai.backend.fun_controlnet.flux2 import Flux2FunControlBranch, build_flux2_control_context +from invokeai.backend.fun_controlnet.hooks import FunControlHooks, install_fun_control, should_apply from invokeai.backend.model_manager.configs.flux2_variant import flux2_hidden_size -from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType +from invokeai.backend.model_manager.load.load_base import LoadedModel +from invokeai.backend.model_manager.taxonomy import BaseModelType, Flux2VariantType, ModelType from invokeai.backend.patches.layer_patcher import LayerPatcher, PatchSpec from invokeai.backend.patches.lora_conversions.flux_bfl_peft_lora_conversion_utils import ( convert_bfl_lora_patch_to_diffusers, @@ -55,7 +62,10 @@ requires_sidecar_patching, ) from invokeai.backend.rectified_flow.rectified_flow_inpaint_extension import RectifiedFlowInpaintExtension -from invokeai.backend.stable_diffusion.diffusers_pipeline import PipelineIntermediateState +from invokeai.backend.stable_diffusion.diffusers_pipeline import ( + PipelineIntermediateState, + image_resized_to_grid_as_tensor, +) from invokeai.backend.stable_diffusion.diffusion.conditioning_data import FLUXConditioningInfo from invokeai.backend.util.attention import sdpa_score_matrix_bytes from invokeai.backend.util.devices import TorchDevice @@ -83,15 +93,15 @@ title="FLUX2 Denoise", tags=["image", "flux", "flux2", "klein", "denoise"], category="latents", - version="1.6.0", + version="1.7.0", classification=Classification.Prototype, ) class Flux2DenoiseInvocation(BaseInvocation): - """Run denoising process with a FLUX.2 Klein transformer model. + """Run denoising process with a FLUX.2 transformer model, Klein or [dev]. - This node is designed for FLUX.2 Klein models which use Qwen3 as the text encoder. Regional prompting is supported via per-conditioning masks (single mask is applied - to every transformer block via `joint_attention_kwargs`). ControlNet and IP-Adapters + to every transformer block via `joint_attention_kwargs`). FLUX.2 [dev] takes the + Fun-ControlNet-Union through `control`; Klein takes no ControlNet, and IP-Adapters are not supported. Regional masking is skipped when reference images are attached. """ @@ -173,6 +183,11 @@ class Flux2DenoiseInvocation(BaseInvocation): input=Input.Connection, title="Reference Images", ) + control: Optional[Flux2ControlField] = InputField( + default=None, + description="FLUX.2 [dev] ControlNet conditioning: spatial control (Canny, depth, pose, ...) and/or inpainting.", + input=Input.Connection, + ) def _get_bn_stats(self, context: InvocationContext) -> Optional[Tuple[torch.Tensor, torch.Tensor]]: """Extract BN statistics from the FLUX.2 VAE. @@ -378,6 +393,7 @@ def _run_diffusion(self, context: InvocationContext) -> torch.Tensor: # Validate transformer config transformer_config = context.models.get_config(self.transformer.transformer) assert transformer_config.base == BaseModelType.Flux2 and transformer_config.type == ModelType.Main + control_branch_info = self._load_control_branch(context, getattr(transformer_config, "variant", None), bn_stats) # Calculate the timestep schedule using FLUX.2 specific schedule # This matches diffusers' Flux2Pipeline implementation @@ -542,6 +558,7 @@ def _run_diffusion(self, context: InvocationContext) -> torch.Tensor: # The additive bias is skipped entirely when reference images are present (see below), so the # mask only costs anything -- storage, and possibly a materialized score matrix -- without them. regional_attn_mask = regional_extension.restricted_attn_mask if ref_image_seq_len == 0 else None + num_control_blocks = len(control_branch_info.model.control_blocks) if control_branch_info is not None else 0 estimated_working_memory = self._estimate_working_memory( image_seq_len=packed_h * packed_w, ref_image_seq_len=ref_image_seq_len, @@ -565,8 +582,17 @@ def _run_diffusion(self, context: InvocationContext) -> torch.Tensor: has_regional_attention_mask=regional_attn_mask is not None, device=device, dtype=inference_dtype, + num_control_blocks=num_control_blocks, ) + # Encoded ahead of the transformer's lock, so the VAE does not have to fit beside it. + control_context: torch.Tensor | None = None + if control_branch_info is not None: + assert bn_mean is not None and bn_std is not None + control_context = self._build_control_context( + context, bn_mean, bn_std, image_seq_len=image_seq_len, ref_image_seq_len=ref_image_seq_len + ).to(device=device, dtype=inference_dtype) + with ExitStack() as exit_stack: transformer_info = context.models.load(self.transformer.transformer) @@ -583,6 +609,24 @@ def _run_diffusion(self, context: InvocationContext) -> torch.Tensor: ) config = transformer_config + control_gate: Callable[[int], None] | None = None + if control_branch_info is not None: + assert self.control is not None and control_context is not None + # Locked with the same working memory: the transformer can no longer be offloaded, so a branch placed + # with only the default reservation would fill the room kept for the forward. The loader built the + # branch in bfloat16, this node's inference dtype; the branch casts what crosses into its chain and + # the hints back (`Flux2FunControlBranch.block_runner` / `add_hint`), so nothing cache-managed is cast. + (_, control_branch) = exit_stack.enter_context( + control_branch_info.model_on_device(working_mem_bytes=estimated_working_memory + dequant_bytes) + ) + assert isinstance(control_branch, Flux2FunControlBranch) + control_hooks = exit_stack.enter_context( + install_fun_control( + transformer, control_branch, control_context, scale=self.control.control_context_scale + ) + ) + control_gate = partial(self._gate_control, control_hooks, num_steps) + # Whether LoRA has to be applied as a sidecar rather than patched into the weights. # Asked of the *model*, not only the format: an `int8_tensorwise` checkpoint carries # `ModelFormat.Checkpoint` like any other single file, but its `Int8ConvrotLinear` @@ -647,6 +691,7 @@ def _run_diffusion(self, context: InvocationContext) -> torch.Tensor: # comes from the global RNG and the same seed gives a different image each run. # XOR keeps the step noise decorrelated from the initial noise (as in ERNIE-Image). generator=torch.Generator(device="cpu").manual_seed(self.seed ^ 0xFFFFFFFF), + before_step=control_gate, ) # Apply BN denormalization if BN stats are available @@ -706,6 +751,7 @@ def _estimate_working_memory( has_regional_attention_mask: bool = False, device: torch.device | None = None, dtype: torch.dtype = torch.bfloat16, + num_control_blocks: int = 0, ) -> int: """Estimate peak transformer activation memory (bytes) so the model cache reserves enough headroom. @@ -750,6 +796,11 @@ def _estimate_working_memory( not scale -- it is about weights, not activations -- and neither does the regional bias, which is built as (1, 1, S, S) and broadcast across the batch. + A ControlNet branch runs its blocks over the whole image stream, reference tokens included, and keeps + one hint per block alive until the last listed base block has consumed it. The term reserves + ``num_control_blocks + 4`` hint-sized tensors (batch x stream x width), the coefficient Z-Image measured + for its adapter over the plain forward (``z_image_denoise.py``). It is not measured for FLUX.2. + The linear model holds only while attention runs on a fused kernel. Regional prompting is where that stops being a given: it hands the transformer a dense additive ``S x S`` bias, which flash attention never accepts, leaving whatever else the build has -- and if that is @@ -781,8 +832,97 @@ def _estimate_working_memory( if num_loras > 0: # A sidecar branch is an activation, so it scales with the batch like the rest of them. estimated += int(0.5 * num_loras * batch_size * GB) + if num_control_blocks > 0: + estimated += ( + (num_control_blocks + 4) + * (image_seq_len + ref_image_seq_len) + * batch_size + * hidden_size + * dtype.itemsize + ) return estimated + def _load_control_branch( + self, + context: InvocationContext, + variant: Flux2VariantType | None, + bn_stats: Optional[Tuple[torch.Tensor, torch.Tensor]], + ) -> LoadedModel | None: + """The control branch in RAM, ahead of the working-memory estimate so the reservation can size its hints.""" + if self.control is None: + return None + # The Fun branch was trained beside FLUX.2 [dev]'s 6144-wide transformer; Klein's are 3072 and 4096 wide. + if variant != Flux2VariantType.Dev: + raise ValueError("FLUX.2 [dev] ControlNet works with FLUX.2 [dev] only, not with FLUX.2 Klein models.") + # The branch was trained on BN-normalized control latents, like the transformer's own. + if bn_stats is None: + raise ValueError( + "The FLUX.2 ControlNet normalizes its images with the VAE's batch-norm statistics, and this VAE " + "exposes none." + ) + control_branch_info = context.models.load(self.control.control_model) + if not isinstance(control_branch_info.model, Flux2FunControlBranch): + raise TypeError( + f"Expected a FLUX.2 ControlNet for '{self.control.control_model.name}', " + f"got {type(control_branch_info.model).__name__}." + ) + return control_branch_info + + def _build_control_context( + self, + context: InvocationContext, + bn_mean: torch.Tensor, + bn_std: torch.Tensor, + *, + image_seq_len: int, + ref_image_seq_len: int, + ) -> torch.Tensor: + """The packed ``(1, S, 260)`` control context at the generation size, from the control field's images. + + ``S`` is the image stream the transformer runs on: the generated tokens, then one zero row per reference-image + token, as VideoX-Fun pads it. + """ + assert self.control is not None + control = self.control + vae_info = context.models.load(self.vae.vae) + tiled = control.tiled or context.config.get().force_tiled_decode + + def encode(pixels: torch.Tensor) -> torch.Tensor: + return Flux2VaeEncodeInvocation.vae_encode( + context=context, vae_info=vae_info, image_tensor=pixels, tiled=tiled, tile_size=control.tile_size + ) + + def pixels(image_name: str, mode: str) -> torch.Tensor: + image = context.images.get_pil(image_name).convert(mode) + resample = Image.Resampling.LANCZOS if mode == "RGB" else Image.Resampling.BILINEAR + image = image.resize((self.width, self.height), resample) + # (1, C, H, W): pixels in [-1, 1], a mask in [0, 1]. + return image_resized_to_grid_as_tensor(image, normalize=mode == "RGB", multiple_of=16).unsqueeze(0) + + packed = build_flux2_control_context( + encode=encode, + bn_mean=bn_mean, + bn_std=bn_std, + control_image=pixels(control.image_name, "RGB") if control.image_name is not None else None, + inpaint_image=( + pixels(control.inpaint_image_name, "RGB") if control.inpaint_image_name is not None else None + ), + inpaint_mask=pixels(control.inpaint_mask_name, "L") if control.inpaint_mask_name is not None else None, + ) + if packed.shape[1] != image_seq_len: + raise ValueError( + f"The control images encode to {packed.shape[1]} tokens at {self.width}x{self.height}, and the " + f"latents being denoised are {image_seq_len}: the init latents must be the generation size." + ) + return F.pad(packed, (0, 0, 0, ref_image_seq_len)) + + def _gate_control(self, hooks: FunControlHooks, total_steps: int, step_index: int) -> None: + # One gate per user step: both guidance branches, and both of Heun's forwards, run with the control or neither. + assert self.control is not None + hooks.active = should_apply( + step_index, total_steps, self.control.begin_step_percent, self.control.end_step_percent + ) + def _load_text_conditioning( self, context: InvocationContext, diff --git a/invokeai/app/invocations/qwen_image/qwen_image_denoise.py b/invokeai/app/invocations/qwen_image/qwen_image_denoise.py index 046e4a7b4de..1ac0393f550 100644 --- a/invokeai/app/invocations/qwen_image/qwen_image_denoise.py +++ b/invokeai/app/invocations/qwen_image/qwen_image_denoise.py @@ -26,7 +26,7 @@ from invokeai.app.invocations.qwen_image.qwen_image_control import QwenImageControlField from invokeai.app.invocations.vae.qwen_image_image_to_latents import QwenImageImageToLatentsInvocation from invokeai.app.services.shared.invocation_context import InvocationContext -from invokeai.backend.fun_controlnet.conditioning import build_qwen_image_control_context +from invokeai.backend.fun_controlnet.conditioning import build_fun_control_context from invokeai.backend.fun_controlnet.hooks import FunControlHooks, install_fun_control, should_apply from invokeai.backend.fun_controlnet.qwen_image import QwenImageFunControlBranch from invokeai.backend.model_manager.load.load_base import LoadedModel @@ -730,7 +730,7 @@ def pixels(image_name: str, mode: str) -> torch.Tensor: # (1, C, H, W): pixels in [-1, 1], a mask in [0, 1]. return image_resized_to_grid_as_tensor(image, normalize=mode == "RGB", multiple_of=16).unsqueeze(0) - context_4d = build_qwen_image_control_context( + context_4d = build_fun_control_context( encode=encode, control_image=pixels(control.image_name, "RGB") if control.image_name is not None else None, inpaint_image=( diff --git a/invokeai/app/invocations/vae/flux2_vae_encode.py b/invokeai/app/invocations/vae/flux2_vae_encode.py index 517364885be..258ec074fd5 100644 --- a/invokeai/app/invocations/vae/flux2_vae_encode.py +++ b/invokeai/app/invocations/vae/flux2_vae_encode.py @@ -51,14 +51,39 @@ class Flux2VaeEncodeInvocation(BaseInvocation): f"{MIN_TILE_SAMPLE_SIZE} are raised to {MIN_TILE_SAMPLE_SIZE}.", ) - def _vae_encode( - self, vae_info: LoadedModel, image_tensor: torch.Tensor, tiled: bool = False, tile_size: int = 0 + @staticmethod + def vae_encode( + context: InvocationContext, + vae_info: LoadedModel, + image_tensor: torch.Tensor, + tiled: bool = False, + tile_size: int = 0, ) -> torch.Tensor: - """Encode image to latents using FLUX.2 VAE. + """Encode image to latents using FLUX.2 VAE: (B, 32, H/8, W/8), not BN-normalized. - The VAE encodes to 32-channel latent space. - Output latents shape: (B, 32, H/8, W/8). + An untiled encode that runs out of memory is retried once in tiles. Also used by `flux2_denoise` for its + ControlNet images. """ + try: + return Flux2VaeEncodeInvocation._encode_once(vae_info, image_tensor, tiled, tile_size) + except RuntimeError as e: + if tiled or not is_oom_error(e): + raise + # An encode that does not fit should become a slower encode, not a failed generation. + context.util.signal_progress("VAE encode ran out of memory, retrying tiled") + context.logger.warning( + "VAE encode ran out of memory; retrying with tiling. The tiled result is not identical to an " + "untiled encode -- the encoder's normalisation and attention are global, so the difference is " + "spread over the latent rather than confined to the seams." + ) + # The traceback pins the failed attempt's activations; see the FLUX.1 decode node. + e.__traceback__ = None + TorchDevice.empty_cache() + # 0, not the caller's `tile_size`: a node field may hold a size left over from a run where `tiled` was off. + return Flux2VaeEncodeInvocation._encode_once(vae_info, image_tensor, True, 0) + + @staticmethod + def _encode_once(vae_info: LoadedModel, image_tensor: torch.Tensor, tiled: bool, tile_size: int) -> torch.Tensor: # See the decode node: FLUX.2 VAE activations are multi-GB, so the cache needs the estimate to # free room rather than discovering the shortfall as an OOM. # Use the VAE's intended compute device for both the probe and the encode, matching the @@ -109,26 +134,13 @@ def invoke(self, context: InvocationContext) -> LatentsOutput: image_tensor = einops.rearrange(image_tensor, "c h w -> 1 c h w") context.util.signal_progress("Running VAE Encode") - use_tiling = self.tiled or context.config.get().force_tiled_decode - try: - latents = self._vae_encode( - vae_info=vae_info, image_tensor=image_tensor, tiled=use_tiling, tile_size=self.tile_size - ) - except RuntimeError as e: - if use_tiling or not is_oom_error(e): - raise - # An encode that does not fit should become a slower encode, not a failed generation. - context.util.signal_progress("VAE encode ran out of memory, retrying tiled") - context.logger.warning( - "VAE encode ran out of memory; retrying with tiling. The tiled result is not identical to an " - "untiled encode -- the encoder's normalisation and attention are global, so the difference is " - "spread over the latent rather than confined to the seams." - ) - # The traceback pins the failed attempt's activations; see the FLUX.1 decode node. - e.__traceback__ = None - TorchDevice.empty_cache() - # 0, not `self.tile_size`: the field may hold a size left over from a run where `tiled` was off. - latents = self._vae_encode(vae_info=vae_info, image_tensor=image_tensor, tiled=True, tile_size=0) + latents = self.vae_encode( + context=context, + vae_info=vae_info, + image_tensor=image_tensor, + tiled=self.tiled or context.config.get().force_tiled_decode, + tile_size=self.tile_size, + ) latents = latents.to("cpu") name = context.tensors.save(tensor=latents) diff --git a/invokeai/backend/architectures/defs/flux2.py b/invokeai/backend/architectures/defs/flux2.py index 4f3fd5ea697..0239667c64d 100644 --- a/invokeai/backend/architectures/defs/flux2.py +++ b/invokeai/backend/architectures/defs/flux2.py @@ -43,6 +43,8 @@ guidance_max=20.0, scheduler_set="flow", scheduler_applies_to_graph=True, + # The Fun-ControlNet-Union is FLUX.2 [dev]'s; `flux2_denoise` refuses it on Klein. + control_kinds=frozenset({"flux2_control"}), max_reference_images=5, supports_regional_guidance=True, ), diff --git a/invokeai/backend/architectures/facets/features.py b/invokeai/backend/architectures/facets/features.py index 4c12a4b90f1..f892306bfa4 100644 --- a/invokeai/backend/architectures/facets/features.py +++ b/invokeai/backend/architectures/facets/features.py @@ -21,10 +21,16 @@ """`cfg-gated` means the field exists but only does anything above CFG 1 — the distilled models.""" ControlKind = Literal[ - "controlnet", "t2i_adapter", "control_lora", "z_image_control", "anima_lllite", "qwen_image_control" + "controlnet", + "t2i_adapter", + "control_lora", + "z_image_control", + "anima_lllite", + "qwen_image_control", + "flux2_control", ] """A kind names the graph node webv2 compiles a control layer to, so an architecture with its own control node -is its own kind -- the Z-Image and Qwen-Image Fun branches are the same design and still two kinds.""" +is its own kind -- the Z-Image, Qwen-Image and FLUX.2 Fun branches are the same design and still three kinds.""" SchedulerSet = Literal["standard", "flow", "flow-no-lcm", "anima"] """Which family of schedulers to offer. `None` means the architecture drives its own and offers no diff --git a/invokeai/backend/flux2/denoise.py b/invokeai/backend/flux2/denoise.py index 3699db70ef3..97aded2f5aa 100644 --- a/invokeai/backend/flux2/denoise.py +++ b/invokeai/backend/flux2/denoise.py @@ -46,6 +46,8 @@ def denoise( pos_joint_attention_kwargs: dict[str, Any] | None = None, # RNG for stochastic schedulers. FlowMatchLCMScheduler.step re-noises the sample every step. generator: torch.Generator | None = None, + # Per-step hook, called with the user step's index before its forward passes; see Args. + before_step: Callable[[int], None] | None = None, ) -> torch.Tensor: """Denoise latents using a FLUX.2 Klein transformer model. @@ -74,6 +76,10 @@ def denoise( scheduler: Optional diffusers scheduler (Euler, Heun, LCM). If None, uses manual Euler. mu: Dynamic shifting parameter computed from image resolution. Required when scheduler has use_dynamic_shifting=True. + before_step: Called with the index of the user step (0 to ``len(timesteps) - 2``) before the + forward passes of every sampler step, positive and negative alike. Heun's two sampler steps + per user step are both called with that user step's index, so a per-step setting -- a + ControlNet's step range, say -- holds for the whole of a step. Returns: Denoised latent tensor. @@ -143,6 +149,9 @@ def denoise( # Track if we're in first or second order step (for Heun) in_first_order = scheduler.state_in_first_order if is_heun else True + if before_step is not None: + before_step(user_step) + # Append the (unchanged) reference conditioning for this forward pass only. img_input = torch.cat([img, img_cond_seq], dim=1) if img_cond_seq is not None else img @@ -248,6 +257,9 @@ def denoise( ): t_vec = torch.full((img.shape[0],), t_curr, dtype=img.dtype, device=img.device) + if before_step is not None: + before_step(step_index) + # Append the (unchanged) reference conditioning for this forward pass only. img_input = torch.cat([img, img_cond_seq], dim=1) if img_cond_seq is not None else img diff --git a/invokeai/backend/fun_controlnet/__init__.py b/invokeai/backend/fun_controlnet/__init__.py index 357a39cd731..239cbac6f91 100644 --- a/invokeai/backend/fun_controlnet/__init__.py +++ b/invokeai/backend/fun_controlnet/__init__.py @@ -4,5 +4,6 @@ chain of blocks that are the base transformer's block plus two projections, and each block's ``after_proj`` output is added to the base image stream after a listed base layer. ``branch.py`` holds the recipe and the seams a family fills in, ``hooks.py`` attaches a branch to a transformer without touching its forward, and a module per family -(``qwen_image.py``) supplies the block class, the layer map and the calling convention. +(``qwen_image.py``, ``flux2.py``) supplies the block class, the layer map and the calling convention. +``conditioning.py`` builds the control context all of them were trained on. """ diff --git a/invokeai/backend/fun_controlnet/conditioning.py b/invokeai/backend/fun_controlnet/conditioning.py index 73e9ae9d226..81940a7f69a 100644 --- a/invokeai/backend/fun_controlnet/conditioning.py +++ b/invokeai/backend/fun_controlnet/conditioning.py @@ -7,7 +7,7 @@ """Encodes pixels ``(1, 3, H, W)`` in [-1, 1] to the normalized latents ``(1, C, H/8, W/8)`` the denoise works in.""" -def build_qwen_image_control_context( +def build_fun_control_context( *, encode: Encoder, control_image: torch.Tensor | None = None, @@ -16,11 +16,15 @@ def build_qwen_image_control_context( ) -> torch.Tensor: """The latent-space control context ``(1, 2C + 1, h, w)``: ``[control latents | keep mask | masked-image latents]``. - VideoX-Fun ``pipeline_qwenimage_control.py``: the control image is encoded like the generation latents; the inpaint - mask ``(1, 1, H, W)`` in [0, 1] is thresholded at 0.5 (white is regenerated) and its complement nearest-sampled to - latent resolution as the keep mask, so the channel is exactly 0 or 1 even for a blurred mask; the inpaint image is - encoded with the regenerated pixels zeroed. Pure control leaves the inpaint channels at zero, pure inpaint the - control latents; the union checkpoint reads both. The denoise packs the result 2x2 the way it packs its latents. + The recipe every Fun union checkpoint was trained on (VideoX-Fun ``pipeline_qwenimage_control.py``, + ``pipeline_flux2_control.py``): the control image is encoded like the generation latents; the inpaint mask + ``(1, 1, H, W)`` in [0, 1] is thresholded at 0.5 (white is regenerated) and its complement nearest-sampled to latent + resolution as the keep mask, so the channel is exactly 0 or 1 even for a blurred mask; the inpaint image is encoded + with the regenerated pixels zeroed. Pure control leaves the inpaint channels at zero, pure inpaint the control + latents; the union checkpoint reads both. Absent parts are zeros, which ``encode``'s normalization never touches. + That is training's dominant case, not its only one: VideoX-Fun's FLUX.2 ``train_control.py`` zeroes the + masked-image latents of 90 % of control-only samples and keeps the normalized encoding of the all-grey masked image + in the rest, the form its inference scripts pass. The denoise packs the result 2x2 the way it packs its latents. """ if (inpaint_image is None) != (inpaint_mask is None): raise ValueError("An inpaint image and its mask go together.") diff --git a/invokeai/backend/fun_controlnet/flux2.py b/invokeai/backend/fun_controlnet/flux2.py new file mode 100644 index 00000000000..9b25b71e8b6 --- /dev/null +++ b/invokeai/backend/fun_controlnet/flux2.py @@ -0,0 +1,230 @@ +"""FLUX.2 [dev] Fun-ControlNet-Union: the control branch alibaba-pai trained for the FLUX.2 [dev] transformer. + +Reference: VideoX-Fun ``videox_fun/models/flux2_transformer2d_control.py``, ``pipeline_flux2_control.py`` and +``config/flux2/flux2_control.yaml``. +""" + +from collections.abc import Mapping, Sequence +from typing import Any + +import accelerate +import torch +from diffusers.models.transformers.transformer_flux2 import Flux2TransformerBlock +from einops import rearrange +from torch import nn + +from invokeai.backend.flux2.sampling_utils import pack_flux2 +from invokeai.backend.fun_controlnet.branch import BlockRunner, FunControlBranch +from invokeai.backend.fun_controlnet.conditioning import Encoder, build_fun_control_context + +# VideoX-Fun `config/flux2/flux2_control.yaml`: four control blocks, their hints added after these double-stream base +# blocks. The checkpoint carries no config, so the map is a constant of the family. +FLUX2_FUN_CONTROL_LAYERS: tuple[int, ...] = (0, 2, 4, 6) +# 65 latent channels -- control latents (32), inpaint keep mask (1), masked-image latents (32) -- packed 2x2. +FLUX2_FUN_CONTROL_IN_DIM = 260 +# FLUX.2 attention heads are 128 wide in every variant. The checkpoint does not say, so the head count follows from +# the width. +FLUX2_ATTENTION_HEAD_DIM = 128 + +# The file names the blocks after VideoX-Fun's attribute; the shared branch calls them `control_blocks`. +_CHECKPOINT_BLOCK_PREFIX = "control_transformer_blocks." +_BRANCH_BLOCK_PREFIX = "control_blocks." + +_IMAGE_STREAM = "hidden_states" +_TEXT_STREAM = "encoder_hidden_states" +_ATTENTION_KWARGS = "joint_attention_kwargs" +# What diffusers adds to the attention kwargs when the transformer runs with its reference KV cache. Invoke never sets +# `kv_cache_mode`; were it set, the control blocks would read or write the base blocks' cache layers. +_KV_CACHE_KWARGS = ("kv_cache", "kv_cache_mode", "num_ref_tokens") + + +class Flux2FunControlBlock(Flux2TransformerBlock): + """A FLUX.2 double-stream block plus the two projections of the control recipe; ``forward`` is the base block's. + + The block has no modulation of its own: FLUX.2 computes it once per forward and hands it to every block, and the + control blocks take the base's. + """ + + def __init__( + self, *, dim: int, num_attention_heads: int, attention_head_dim: int, mlp_ratio: float, first: bool + ) -> None: + super().__init__( + dim=dim, num_attention_heads=num_attention_heads, attention_head_dim=attention_head_dim, mlp_ratio=mlp_ratio + ) + if first: + self.before_proj = nn.Linear(dim, dim) + self.after_proj = nn.Linear(dim, dim) + + +class Flux2FunControlBranch(FunControlBranch): + """The branch for ``Flux2Transformer2DModel``: control blocks thread their own text stream beside the base's. + + The hints land on the double-stream blocks' image stream, all of it: with reference images that stream carries + their tokens after the generated ones, and the denoise pads the control context with zeros for them, as VideoX-Fun + does. + """ + + def __init__( + self, + *, + hidden_size: int, + num_attention_heads: int, + attention_head_dim: int, + mlp_ratio: float = 3.0, + control_in_dim: int = FLUX2_FUN_CONTROL_IN_DIM, + control_layers: Sequence[int] = FLUX2_FUN_CONTROL_LAYERS, + ) -> None: + blocks = [ + Flux2FunControlBlock( + dim=hidden_size, + num_attention_heads=num_attention_heads, + attention_head_dim=attention_head_dim, + mlp_ratio=mlp_ratio, + first=index == 0, + ) + for index in range(len(control_layers)) + ] + super().__init__(nn.Linear(control_in_dim, hidden_size), blocks, control_layers) + + @classmethod + def from_state_dict( + cls, + sd: Mapping[str, torch.Tensor], + *, + dtype: torch.dtype, + control_layers: Sequence[int] = FLUX2_FUN_CONTROL_LAYERS, + attention_head_dim: int = FLUX2_ATTENTION_HEAD_DIM, + ) -> "Flux2FunControlBranch": + """Build the branch the checkpoint describes and load it, cast to ``dtype``. + + The geometry is read off the tensors: the width and input features from ``control_img_in.weight``, the MLP + ratio from block 0's ``ff.linear_in`` (a fused SwiGLU, twice the hidden MLP width), the block count from the + highest block index. Anything that is not the FLUX.2 recipe is refused by name rather than loaded into a branch + that would run and produce noise. + """ + sd = { + _BRANCH_BLOCK_PREFIX + key.removeprefix(_CHECKPOINT_BLOCK_PREFIX) + if key.startswith(_CHECKPOINT_BLOCK_PREFIX) + else key: tensor + for key, tensor in sd.items() + } + weight = sd.get("control_img_in.weight") + if weight is None or weight.dim() != 2: + raise ValueError("Not a FLUX.2 Fun-ControlNet checkpoint: `control_img_in.weight` is missing.") + hidden_size, control_in_dim = weight.shape + if control_in_dim != FLUX2_FUN_CONTROL_IN_DIM: + raise ValueError( + f"FLUX.2 Fun-ControlNet takes {FLUX2_FUN_CONTROL_IN_DIM} control features per token (65 latent channels " + f"packed 2x2); this checkpoint's `control_img_in` takes {control_in_dim}." + ) + if hidden_size % attention_head_dim: + raise ValueError( + f"A {hidden_size}-wide branch cannot be split into {attention_head_dim}-wide attention heads." + ) + linear_in = sd.get(f"{_BRANCH_BLOCK_PREFIX}0.ff.linear_in.weight") + if linear_in is None or linear_in.dim() != 2 or linear_in.shape[0] % 2 or linear_in.shape[1] != hidden_size: + raise ValueError( + "This checkpoint has no FLUX.2 feed-forward in its first control block: " + f"`{_CHECKPOINT_BLOCK_PREFIX}0.ff.linear_in.weight` must be (2 x MLP width, {hidden_size})." + ) + mlp_ratio = linear_in.shape[0] // 2 / hidden_size + layers = tuple(control_layers) + block_indices = { + int(parts[1]) + for key in sd + if (parts := key.split(".")) and parts[0] == _BRANCH_BLOCK_PREFIX[:-1] and parts[1].isdigit() + } + num_blocks = max(block_indices, default=-1) + 1 + if num_blocks != len(layers): + raise ValueError( + f"This checkpoint has {num_blocks} control blocks; the FLUX.2 recipe places {len(layers)} after base " + f"layers {layers}." + ) + + with accelerate.init_empty_weights(): + branch = cls( + hidden_size=hidden_size, + num_attention_heads=hidden_size // attention_head_dim, + attention_head_dim=attention_head_dim, + mlp_ratio=mlp_ratio, + control_in_dim=control_in_dim, + control_layers=layers, + ) + missing, unexpected = branch.load_state_dict(sd, strict=False, assign=True) + if missing or unexpected: + raise ValueError( + "This checkpoint does not match the FLUX.2 control block layout: " + f"missing {sorted(missing)[:5]}, unexpected {sorted(unexpected)[:5]}." + ) + return branch.to(dtype=dtype).eval() + + def base_blocks(self, transformer: nn.Module) -> Sequence[nn.Module]: + return transformer.transformer_blocks + + def base_hidden_size(self, transformer: nn.Module) -> int: + return transformer.inner_dim + + def image_stream(self, block_inputs: Mapping[str, Any]) -> torch.Tensor: + return block_inputs[_IMAGE_STREAM] + + def block_runner(self, block_inputs: Mapping[str, Any]) -> BlockRunner: + attention_kwargs = block_inputs.get(_ATTENTION_KWARGS) or {} + if cache_kwargs := sorted(name for name in _KV_CACHE_KWARGS if name in attention_kwargs): + raise ValueError( + f"The FLUX.2 ControlNet cannot run beside the transformer's reference KV cache ({cache_kwargs}): its " + "blocks would share the base blocks' cache layers." + ) + # Modulation, RoPE, attention kwargs: the control blocks take exactly what the base block took. The chain runs + # in the branch's dtype end to end, so the floating inputs (the two modulations) are cast on the way in, like + # `c` and the text stream, and the hint on the way out (`add_hint`). RoPE is a (cos, sin) pair the attention + # applies in float32 whatever the activations are, and is handed on untouched like the attention kwargs. + passthrough = { + name: value.to(self.dtype) if isinstance(value, torch.Tensor) and value.is_floating_point() else value + for name, value in block_inputs.items() + if name not in (_IMAGE_STREAM, _TEXT_STREAM) + } + # The chain starts from the base's text stream as it enters block 0 and carries its own copy from then on. + text_stream = block_inputs[_TEXT_STREAM].to(self.dtype) + + def run(block: nn.Module, c: torch.Tensor) -> torch.Tensor: + nonlocal text_stream + text_stream, c = block(hidden_states=c, encoder_hidden_states=text_stream, **passthrough) + return c + + return run + + def add_hint(self, output: Any, hint: torch.Tensor, scale: float) -> Any: + encoder_hidden_states, hidden_states = output + return encoder_hidden_states, hidden_states + (hint * scale).to(hidden_states.dtype) + + +def build_flux2_control_context( + *, + encode: Encoder, + bn_mean: torch.Tensor, + bn_std: torch.Tensor, + control_image: torch.Tensor | None = None, + inpaint_image: torch.Tensor | None = None, + inpaint_mask: torch.Tensor | None = None, +) -> torch.Tensor: + """The packed control context ``(1, h/2 * w/2, 260)``: ``[control (128) | keep mask (4) | masked image (128)]``. + + ``encode`` is the FLUX.2 VAE's raw encode, ``(1, 3, H, W)`` in [-1, 1] to the ``mode()`` latents + ``(1, 32, H/8, W/8)``. VideoX-Fun normalizes an encoded image the way the transformer's latents are: patchified + 2x2 to 128 channels and batch-normalized with the VAE's running statistics (``bn_mean``, and ``bn_std`` = + ``sqrt(running_var + eps)``, both ``(128,)``). Here the normalized latents are put back to the 32-channel layout, + a permutation that changes no value, so the shared builder keeps the keep mask at latent resolution; packing then + patchifies all 65 channels in one go, in the order VideoX-Fun concatenates its three patchified parts. + """ + + def encode_normalized(pixels: torch.Tensor) -> torch.Tensor: + latents = encode(pixels) + patches = rearrange(latents, "b c (h ph) (w pw) -> b (c ph pw) h w", ph=2, pw=2) + mean = bn_mean.to(device=patches.device, dtype=patches.dtype).view(1, -1, 1, 1) + std = bn_std.to(device=patches.device, dtype=patches.dtype).view(1, -1, 1, 1) + return rearrange((patches - mean) / std, "b (c ph pw) h w -> b c (h ph) (w pw)", ph=2, pw=2) + + context = build_fun_control_context( + encode=encode_normalized, control_image=control_image, inpaint_image=inpaint_image, inpaint_mask=inpaint_mask + ) + return pack_flux2(context) diff --git a/invokeai/backend/model_manager/configs/controlnet.py b/invokeai/backend/model_manager/configs/controlnet.py index 2a3ab146b16..24faa05a88f 100644 --- a/invokeai/backend/model_manager/configs/controlnet.py +++ b/invokeai/backend/model_manager/configs/controlnet.py @@ -328,6 +328,53 @@ def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) - return cls(**override_fields) +# `control_img_in` takes 260 packed channels into FLUX.2 [dev]'s 6144-wide stream. Klein is 3072 or 4096 wide, so +# no Klein branch could carry this shape. +_FLUX2_FUN_CONTROL_IMG_IN_SHAPE = (6144, 260) + + +def _has_flux2_fun_control_keys(state_dict: dict) -> bool: + """Check if state dict is a FLUX.2 Fun-ControlNet branch (alibaba-pai's VACE-style union adapter). + + The branch is `control_img_in` plus `control_transformer_blocks.N`, copies of FLUX.2's double-stream + `Flux2TransformerBlock` with `before_proj`/`after_proj` taps. The Qwen-Image siblings name their blocks + `control_blocks`, so the fingerprint is the projection shape and block 0's `before_proj` under the FLUX.2 name. + """ + control_img_in = state_dict.get("control_img_in.weight") + shape = getattr(control_img_in, "shape", None) + if shape is None or tuple(shape) != _FLUX2_FUN_CONTROL_IMG_IN_SHAPE: + return False + return "control_transformer_blocks.0.before_proj.weight" in state_dict + + +class ControlNet_Checkpoint_Flux2_Config(Checkpoint_Config_Base, Config_Base): + """Model config for FLUX.2 [dev] Fun-ControlNet adapter models (Safetensors checkpoint). + + FLUX.2 Fun-ControlNets are standalone adapters containing only the control branch + (control_img_in, control_transformer_blocks) that extends the FLUX.2 [dev] transformer with + spatial conditioning capabilities. Klein transformers are narrower and cannot take it. + + Supports: Canny, HED, Depth, Pose, MLSD, Scribble, Gray, inpainting. + Recommended control_context_scale: 0.65-0.80. + """ + + type: Literal[ModelType.ControlNet] = Field(default=ModelType.ControlNet) + format: Literal[ModelFormat.Checkpoint] = Field(default=ModelFormat.Checkpoint) + base: Literal[BaseModelType.Flux2] = Field(default=BaseModelType.Flux2) + default_settings: ControlAdapterDefaultSettings | None = Field(None) + + @classmethod + def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) -> Self: + raise_if_not_file(mod) + + raise_for_override_fields(cls, override_fields) + + if not _has_flux2_fun_control_keys(mod.load_state_dict()): + raise NotAMatchError("state dict does not look like a FLUX.2 Fun-ControlNet") + + return cls(**override_fields) + + def _has_anima_lllite_keys(state_dict: dict) -> bool: """Check if state dict contains Anima ControlNet-LLLite specific keys. diff --git a/invokeai/backend/model_manager/configs/factory.py b/invokeai/backend/model_manager/configs/factory.py index d42fbb1ff08..1f4125632c9 100644 --- a/invokeai/backend/model_manager/configs/factory.py +++ b/invokeai/backend/model_manager/configs/factory.py @@ -25,6 +25,7 @@ from invokeai.backend.model_manager.configs.controlnet import ( ControlAdapterDefaultSettings, ControlNet_Checkpoint_Anima_Config, + ControlNet_Checkpoint_Flux2_Config, ControlNet_Checkpoint_FLUX_Config, ControlNet_Checkpoint_QwenImage_Config, ControlNet_Checkpoint_SD1_Config, @@ -495,6 +496,7 @@ def has_model_export(module: Any, name: Any, expected_bases: tuple[type, ...]) - Annotated[ControlNet_Checkpoint_ZImage_Config, ControlNet_Checkpoint_ZImage_Config.get_tag()], Annotated[ControlNet_Checkpoint_Anima_Config, ControlNet_Checkpoint_Anima_Config.get_tag()], Annotated[ControlNet_Checkpoint_QwenImage_Config, ControlNet_Checkpoint_QwenImage_Config.get_tag()], + Annotated[ControlNet_Checkpoint_Flux2_Config, ControlNet_Checkpoint_Flux2_Config.get_tag()], # ControlNet - diffusers format Annotated[ControlNet_Diffusers_SD1_Config, ControlNet_Diffusers_SD1_Config.get_tag()], Annotated[ControlNet_Diffusers_SD2_Config, ControlNet_Diffusers_SD2_Config.get_tag()], diff --git a/invokeai/backend/model_manager/load/model_loaders/fun_controlnet.py b/invokeai/backend/model_manager/load/model_loaders/fun_controlnet.py index da58d7b2521..fb0a97926e6 100644 --- a/invokeai/backend/model_manager/load/model_loaders/fun_controlnet.py +++ b/invokeai/backend/model_manager/load/model_loaders/fun_controlnet.py @@ -1,10 +1,12 @@ -"""Loaders for Fun-ControlNet branches (alibaba-pai VideoX-Fun); today the Qwen-Image Fun-ControlNet-Union.""" +"""Loaders for Fun-ControlNet branches (alibaba-pai VideoX-Fun): Qwen-Image and FLUX.2 [dev].""" from pathlib import Path from typing import Optional +import torch from safetensors.torch import load_file +from invokeai.backend.fun_controlnet.flux2 import Flux2FunControlBranch from invokeai.backend.fun_controlnet.qwen_image import QwenImageFunControlBranch from invokeai.backend.model_manager.configs.base import Checkpoint_Config_Base from invokeai.backend.model_manager.configs.factory import AnyModelConfig @@ -16,6 +18,20 @@ from invokeai.backend.util.devices import TorchDevice +def _read_dense_checkpoint(config: AnyModelConfig, label: str) -> dict[str, torch.Tensor]: + """The branch's tensors, refused if any carries a quantization side channel. + + Refused before the geometry probe: the shapes it reads mean nothing on a packed weight, and the branches assign the + file's tensors as they are, so no scale would be folded in. alibaba-pai publishes dense bf16 files only. + """ + if not isinstance(config, Checkpoint_Config_Base): + raise ValueError("Only checkpoint configs are supported here.") + path = Path(config.path) + sd = load_file(path) + reject_quantized_side_channel(sd, f"{label} ControlNet checkpoint {path.name}") + return sd + + @ModelLoaderRegistry.register( base=BaseModelType.QwenImage, type=ModelType.ControlNet, @@ -33,12 +49,28 @@ class QwenImageFunControlNetLoader(ModelLoader): """ def _load_model(self, config: AnyModelConfig, submodel_type: Optional[SubModelType] = None) -> AnyModel: - path = Path(config.path) - if not isinstance(config, Checkpoint_Config_Base): - raise ValueError("Only checkpoint configs are supported here.") - sd = load_file(path) - # Before the geometry probe: the shapes it reads mean nothing on a packed weight, and no scale is folded here. - reject_quantized_side_channel(sd, f"Qwen Image ControlNet checkpoint {path.name}") return QwenImageFunControlBranch.from_state_dict( - sd, dtype=TorchDevice.choose_bfloat16_safe_dtype(self._torch_device) + _read_dense_checkpoint(config, "Qwen Image"), + dtype=TorchDevice.choose_bfloat16_safe_dtype(self._torch_device), ) + + +@ModelLoaderRegistry.register( + base=BaseModelType.Flux2, + type=ModelType.ControlNet, + format=ModelFormat.Checkpoint, + fp8_storage=Unimplemented( + "the branch is cast to bfloat16 at load and runs as its own module tree, so the layerwise cast would fit; at " + "8.2 GB in bf16, resident beside a 32B transformer, it is worth closing" + ), +) +class Flux2FunControlNetLoader(ModelLoader): + """Loads the FLUX.2 [dev] Fun-ControlNet-Union branch from its safetensors file. + + The file carries no config: the branch's geometry is read off its tensors and the base-layer map is the family's + constant (`FLUX2_FUN_CONTROL_LAYERS`). Cast to bfloat16, the dtype every FLUX.2 transformer loader forces and + `flux2_denoise` runs in. + """ + + def _load_model(self, config: AnyModelConfig, submodel_type: Optional[SubModelType] = None) -> AnyModel: + return Flux2FunControlBranch.from_state_dict(_read_dense_checkpoint(config, "FLUX.2"), dtype=torch.bfloat16) diff --git a/invokeai/backend/model_manager/starter_models/__init__.py b/invokeai/backend/model_manager/starter_models/__init__.py index 866181eb078..75c721d2f02 100644 --- a/invokeai/backend/model_manager/starter_models/__init__.py +++ b/invokeai/backend/model_manager/starter_models/__init__.py @@ -131,6 +131,7 @@ from invokeai.backend.model_manager.starter_models.flux2 import ( flux2_dev_diffusers, flux2_dev_diffusers_nf4, + flux2_dev_fun_controlnet_union, flux2_dev_gguf_q3_k_m, flux2_dev_gguf_q4_k_m, flux2_dev_gguf_q5_k_m, @@ -443,6 +444,7 @@ flux2_dev_gguf_q5_k_m, flux2_dev_gguf_q6_k, flux2_dev_gguf_q8_0, + flux2_dev_fun_controlnet_union, cogview4, qwen_image_vae, qwen_vl_encoder_fp8, diff --git a/invokeai/backend/model_manager/starter_models/flux2.py b/invokeai/backend/model_manager/starter_models/flux2.py index b4c12584c45..1d8533ca1f1 100644 --- a/invokeai/backend/model_manager/starter_models/flux2.py +++ b/invokeai/backend/model_manager/starter_models/flux2.py @@ -267,3 +267,13 @@ format=ModelFormat.GGUFQuantized, dependencies=[flux2_vae, flux2_dev_cow_mistral_q8], ) + +# region FLUX.2 [dev] ControlNet +flux2_dev_fun_controlnet_union = StarterModel( + name="FLUX.2 [dev] ControlNet Union", + base=BaseModelType.Flux2, + source="https://huggingface.co/alibaba-pai/FLUX.2-dev-Fun-Controlnet-Union/resolve/main/FLUX.2-dev-Fun-Controlnet-Union-2602.safetensors", + description="Unified ControlNet for FLUX.2 [dev] (not Klein) supporting Canny, HED, Depth, Pose, MLSD, Scribble and " + "Gray control images, plus inpainting. Works best at weights 0.65-0.80. FLUX [dev] Non-Commercial License. ~8.2GB", + type=ModelType.ControlNet, +) diff --git a/invokeai/frontend/api/openapi.json b/invokeai/frontend/api/openapi.json index 43d5554f224..c0d1f128d50 100644 --- a/invokeai/frontend/api/openapi.json +++ b/invokeai/frontend/api/openapi.json @@ -1604,6 +1604,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Flux2_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -2104,6 +2107,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Flux2_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -2604,6 +2610,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Flux2_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -3149,6 +3158,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Flux2_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -3721,6 +3733,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Flux2_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -5165,6 +5180,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Flux2_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -19853,6 +19871,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Flux2_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -20440,7 +20461,8 @@ "control_lora", "z_image_control", "anima_lllite", - "qwen_image_control" + "qwen_image_control", + "flux2_control" ] }, "type": "array", @@ -27706,6 +27728,153 @@ ], "title": "ControlNet_Checkpoint_FLUX_Config" }, + "ControlNet_Checkpoint_Flux2_Config": { + "properties": { + "key": { + "type": "string", + "title": "Key", + "description": "A unique key for this model." + }, + "hash": { + "type": "string", + "title": "Hash", + "description": "The hash of the model file(s)." + }, + "path": { + "type": "string", + "title": "Path", + "description": "Path to the model on the filesystem. Relative paths are relative to the Invoke root directory." + }, + "file_size": { + "type": "integer", + "title": "File Size", + "description": "The size of the model in bytes." + }, + "name": { + "type": "string", + "title": "Name", + "description": "Name of the model." + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description", + "description": "Model description" + }, + "source": { + "type": "string", + "title": "Source", + "description": "The original source of the model (path, URL or repo_id)." + }, + "source_type": { + "$ref": "#/components/schemas/ModelSourceType", + "description": "The type of source" + }, + "source_api_response": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Source Api Response", + "description": "The original API response from the source, as stringified JSON." + }, + "source_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Source Url", + "description": "Optional URL for the model (e.g. download page or model page)." + }, + "cover_image": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Cover Image", + "description": "Url for image to preview model" + }, + "config_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Config Path", + "description": "Path to the config for this model, if any." + }, + "type": { + "type": "string", + "const": "controlnet", + "title": "Type", + "default": "controlnet" + }, + "format": { + "type": "string", + "const": "checkpoint", + "title": "Format", + "default": "checkpoint" + }, + "base": { + "type": "string", + "const": "flux2", + "title": "Base", + "default": "flux2" + }, + "default_settings": { + "anyOf": [ + { + "$ref": "#/components/schemas/ControlAdapterDefaultSettings" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": [ + "key", + "hash", + "path", + "file_size", + "name", + "description", + "source", + "source_type", + "source_api_response", + "source_url", + "cover_image", + "config_path", + "type", + "format", + "base", + "default_settings" + ], + "title": "ControlNet_Checkpoint_Flux2_Config", + "description": "Model config for FLUX.2 [dev] Fun-ControlNet adapter models (Safetensors checkpoint).\n\nFLUX.2 Fun-ControlNets are standalone adapters containing only the control branch\n(control_img_in, control_transformer_blocks) that extends the FLUX.2 [dev] transformer with\nspatial conditioning capabilities. Klein transformers are narrower and cannot take it.\n\nSupports: Canny, HED, Depth, Pose, MLSD, Scribble, Gray, inpainting.\nRecommended control_context_scale: 0.65-0.80." + }, "ControlNet_Checkpoint_QwenImage_Config": { "properties": { "key": { @@ -36114,11 +36283,294 @@ "$ref": "#/components/schemas/IntegerOutput" } }, + "Flux2ControlField": { + "description": "FLUX.2 [dev] Fun-ControlNet conditioning: a control image, an inpaint image with its mask, or both.", + "properties": { + "image_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The preprocessed control image (Canny, depth, pose, ...)", + "title": "Image Name" + }, + "inpaint_image_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The image to inpaint", + "title": "Inpaint Image Name" + }, + "inpaint_mask_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The inpaint mask; white is regenerated", + "title": "Inpaint Mask Name" + }, + "control_model": { + "$ref": "#/components/schemas/ModelIdentifierField", + "description": "The FLUX.2 [dev] ControlNet model" + }, + "control_context_scale": { + "default": 0.75, + "description": "Strength of the control signal. Recommended range: 0.65-0.80.", + "maximum": 2.0, + "minimum": 0.0, + "title": "Control Context Scale", + "type": "number" + }, + "begin_step_percent": { + "default": 0.0, + "description": "When the control is first applied (% of total steps)", + "maximum": 1.0, + "minimum": 0.0, + "title": "Begin Step Percent", + "type": "number" + }, + "end_step_percent": { + "default": 1.0, + "description": "When the control is last applied (% of total steps)", + "maximum": 1.0, + "minimum": 0.0, + "title": "End Step Percent", + "type": "number" + }, + "tiled": { + "default": false, + "description": "Encode the control images in tiles. The denoise encodes them at generation size, where an untiled FLUX.2 VAE encode takes several GB.", + "title": "Tiled", + "type": "boolean" + }, + "tile_size": { + "default": 0, + "description": "The tile size for VAE tiling in pixels (image space). If set to 0, the default tile size for the model will be used. Larger tile sizes generally produce better results at the cost of higher memory usage. Values between 1 and 128 are raised to 128.", + "minimum": 0, + "multipleOf": 8, + "title": "Tile Size", + "type": "integer" + } + }, + "required": ["control_model"], + "title": "Flux2ControlField", + "type": "object" + }, + "Flux2ControlInvocation": { + "category": "conditioning", + "class": "invocation", + "classification": "prototype", + "description": "Configure the FLUX.2 [dev] Fun-ControlNet-Union for spatial control, inpainting, or both.\n\nTakes a preprocessed control image (Canny, HED, depth, pose, MLSD, ...) and/or an image to inpaint with its mask\n(white is regenerated), plus the FLUX.2 [dev] ControlNet model. Applies to FLUX.2 [dev] only, not to Klein.\nRecommended control scale: 0.65-0.80.", + "node_pack": "invokeai", + "properties": { + "id": { + "description": "The id of this instance of an invocation. Must be unique among all instances of invocations.", + "field_kind": "node_attribute", + "title": "Id", + "type": "string" + }, + "is_intermediate": { + "default": false, + "description": "Whether or not this is an intermediate invocation.", + "field_kind": "node_attribute", + "input": "direct", + "orig_required": true, + "title": "Is Intermediate", + "type": "boolean", + "ui_hidden": false, + "ui_type": "IsIntermediate" + }, + "use_cache": { + "default": true, + "description": "Whether or not to use the cache", + "field_kind": "node_attribute", + "title": "Use Cache", + "type": "boolean" + }, + "image": { + "anyOf": [ + { + "$ref": "#/components/schemas/ImageField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The preprocessed control image (Canny, HED, depth, pose, MLSD, ...)", + "field_kind": "input", + "input": "any", + "orig_default": null, + "orig_required": false + }, + "inpaint_image": { + "anyOf": [ + { + "$ref": "#/components/schemas/ImageField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The image to inpaint. Goes together with the inpaint mask.", + "field_kind": "input", + "input": "any", + "orig_default": null, + "orig_required": false + }, + "inpaint_mask": { + "anyOf": [ + { + "$ref": "#/components/schemas/ImageField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The inpaint mask: white is regenerated, black is kept. Goes together with the inpaint image.", + "field_kind": "input", + "input": "any", + "orig_default": null, + "orig_required": false + }, + "control_model": { + "anyOf": [ + { + "$ref": "#/components/schemas/ModelIdentifierField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "ControlNet model to load", + "field_kind": "input", + "input": "any", + "orig_required": true, + "title": "Control Model", + "ui_model_base": ["flux2"], + "ui_model_type": ["controlnet"] + }, + "control_context_scale": { + "default": 0.75, + "description": "Strength of the control signal. Recommended range: 0.65-0.80.", + "field_kind": "input", + "input": "any", + "maximum": 2.0, + "minimum": 0.0, + "orig_default": 0.75, + "orig_required": false, + "title": "Control Scale", + "type": "number" + }, + "begin_step_percent": { + "default": 0.0, + "description": "When the control is first applied (% of total steps)", + "field_kind": "input", + "input": "any", + "maximum": 1.0, + "minimum": 0.0, + "orig_default": 0.0, + "orig_required": false, + "title": "Begin Step Percent", + "type": "number" + }, + "end_step_percent": { + "default": 1.0, + "description": "When the control is last applied (% of total steps)", + "field_kind": "input", + "input": "any", + "maximum": 1.0, + "minimum": 0.0, + "orig_default": 1.0, + "orig_required": false, + "title": "End Step Percent", + "type": "number" + }, + "tiled": { + "default": false, + "description": "Processing using overlapping tiles (reduce memory consumption)", + "field_kind": "input", + "input": "any", + "orig_default": false, + "orig_required": false, + "title": "Tiled", + "type": "boolean" + }, + "tile_size": { + "default": 0, + "description": "The tile size for VAE tiling in pixels (image space). If set to 0, the default tile size for the model will be used. Larger tile sizes generally produce better results at the cost of higher memory usage. Values between 1 and 128 are raised to 128.", + "field_kind": "input", + "input": "any", + "minimum": 0, + "multipleOf": 8, + "orig_default": 0, + "orig_required": false, + "title": "Tile Size", + "type": "integer" + }, + "type": { + "const": "flux2_control", + "default": "flux2_control", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["type", "id"], + "tags": ["image", "flux", "flux2", "control", "controlnet", "inpaint"], + "title": "FLUX.2 [dev] ControlNet", + "type": "object", + "version": "1.0.0", + "output": { + "$ref": "#/components/schemas/Flux2ControlOutput" + } + }, + "Flux2ControlOutput": { + "class": "output", + "description": "FLUX.2 [dev] ControlNet output containing control configuration.", + "properties": { + "control": { + "$ref": "#/components/schemas/Flux2ControlField", + "description": "FLUX.2 [dev] control conditioning", + "field_kind": "output", + "ui_hidden": false + }, + "type": { + "const": "flux2_control_output", + "default": "flux2_control_output", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["output_meta", "control", "type", "type"], + "title": "Flux2ControlOutput", + "type": "object" + }, "Flux2DenoiseInvocation": { "category": "latents", "class": "invocation", "classification": "prototype", - "description": "Run denoising process with a FLUX.2 Klein transformer model.\n\nThis node is designed for FLUX.2 Klein models which use Qwen3 as the text encoder.\nRegional prompting is supported via per-conditioning masks (single mask is applied\nto every transformer block via `joint_attention_kwargs`). ControlNet and IP-Adapters\nare not supported. Regional masking is skipped when reference images are attached.", + "description": "Run denoising process with a FLUX.2 transformer model, Klein or [dev].\n\nRegional prompting is supported via per-conditioning masks (single mask is applied\nto every transformer block via `joint_attention_kwargs`). FLUX.2 [dev] takes the\nFun-ControlNet-Union through `control`; Klein takes no ControlNet, and IP-Adapters\nare not supported. Regional masking is skipped when reference images are attached.", "node_pack": "invokeai", "properties": { "id": { @@ -36399,6 +36851,22 @@ "orig_required": false, "title": "Reference Images" }, + "control": { + "anyOf": [ + { + "$ref": "#/components/schemas/Flux2ControlField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "FLUX.2 [dev] ControlNet conditioning: spatial control (Canny, depth, pose, ...) and/or inpainting.", + "field_kind": "input", + "input": "connection", + "orig_default": null, + "orig_required": false + }, "type": { "const": "flux2_denoise", "default": "flux2_denoise", @@ -36411,7 +36879,7 @@ "tags": ["image", "flux", "flux2", "klein", "denoise"], "title": "FLUX2 Denoise", "type": "object", - "version": "1.6.0", + "version": "1.7.0", "output": { "$ref": "#/components/schemas/LatentsOutput" } @@ -43317,6 +43785,9 @@ { "$ref": "#/components/schemas/FloatToIntegerInvocation" }, + { + "$ref": "#/components/schemas/Flux2ControlInvocation" + }, { "$ref": "#/components/schemas/Flux2DenoiseInvocation" }, @@ -44277,6 +44748,9 @@ { "$ref": "#/components/schemas/FloatOutput" }, + { + "$ref": "#/components/schemas/Flux2ControlOutput" + }, { "$ref": "#/components/schemas/Flux2DevLoRALoaderOutput" }, @@ -53623,6 +54097,9 @@ { "$ref": "#/components/schemas/FloatToIntegerInvocation" }, + { + "$ref": "#/components/schemas/Flux2ControlInvocation" + }, { "$ref": "#/components/schemas/Flux2DenoiseInvocation" }, @@ -54579,6 +55056,9 @@ { "$ref": "#/components/schemas/FloatOutput" }, + { + "$ref": "#/components/schemas/Flux2ControlOutput" + }, { "$ref": "#/components/schemas/Flux2DevLoRALoaderOutput" }, @@ -55244,6 +55724,9 @@ { "$ref": "#/components/schemas/FloatToIntegerInvocation" }, + { + "$ref": "#/components/schemas/Flux2ControlInvocation" + }, { "$ref": "#/components/schemas/Flux2DenoiseInvocation" }, @@ -56375,6 +56858,9 @@ "float_to_int": { "$ref": "#/components/schemas/IntegerOutput" }, + "flux2_control": { + "$ref": "#/components/schemas/Flux2ControlOutput" + }, "flux2_denoise": { "$ref": "#/components/schemas/LatentsOutput" }, @@ -57279,6 +57765,7 @@ "float_math", "float_range", "float_to_int", + "flux2_control", "flux2_denoise", "flux2_dev_lora_collection_loader", "flux2_dev_lora_loader", @@ -57862,6 +58349,9 @@ { "$ref": "#/components/schemas/FloatToIntegerInvocation" }, + { + "$ref": "#/components/schemas/Flux2ControlInvocation" + }, { "$ref": "#/components/schemas/Flux2DenoiseInvocation" }, @@ -59110,6 +59600,9 @@ { "$ref": "#/components/schemas/FloatToIntegerInvocation" }, + { + "$ref": "#/components/schemas/Flux2ControlInvocation" + }, { "$ref": "#/components/schemas/Flux2DenoiseInvocation" }, @@ -86614,6 +87107,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Flux2_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -87360,6 +87856,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Flux2_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -87991,6 +88490,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Flux2_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -88478,6 +88980,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Flux2_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -89458,6 +89963,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_QwenImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Flux2_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, diff --git a/invokeai/frontend/api/schema.ts b/invokeai/frontend/api/schema.ts index 67b2dd134a8..b9d9096d81b 100644 --- a/invokeai/frontend/api/schema.ts +++ b/invokeai/frontend/api/schema.ts @@ -5535,7 +5535,7 @@ export type components = { * @enum {string} */ AnimaVariantType: "anima_qwen3" | "anima_qwen35"; - AnyModelConfig: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + AnyModelConfig: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Flux2_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; /** * AppVersion * @description App Version Response @@ -5717,7 +5717,7 @@ export type components = { * Control Kinds * @description Sorted. */ - control_kinds?: ("controlnet" | "t2i_adapter" | "control_lora" | "z_image_control" | "anima_lllite" | "qwen_image_control")[]; + control_kinds?: ("controlnet" | "t2i_adapter" | "control_lora" | "z_image_control" | "anima_lllite" | "qwen_image_control" | "flux2_control")[]; /** * Max Reference Images * @default 0 @@ -9736,6 +9736,95 @@ export type components = { */ base: "flux"; }; + /** + * ControlNet_Checkpoint_Flux2_Config + * @description Model config for FLUX.2 [dev] Fun-ControlNet adapter models (Safetensors checkpoint). + * + * FLUX.2 Fun-ControlNets are standalone adapters containing only the control branch + * (control_img_in, control_transformer_blocks) that extends the FLUX.2 [dev] transformer with + * spatial conditioning capabilities. Klein transformers are narrower and cannot take it. + * + * Supports: Canny, HED, Depth, Pose, MLSD, Scribble, Gray, inpainting. + * Recommended control_context_scale: 0.65-0.80. + */ + ControlNet_Checkpoint_Flux2_Config: { + /** + * Key + * @description A unique key for this model. + */ + key: string; + /** + * Hash + * @description The hash of the model file(s). + */ + hash: string; + /** + * Path + * @description Path to the model on the filesystem. Relative paths are relative to the Invoke root directory. + */ + path: string; + /** + * File Size + * @description The size of the model in bytes. + */ + file_size: number; + /** + * Name + * @description Name of the model. + */ + name: string; + /** + * Description + * @description Model description + */ + description: string | null; + /** + * Source + * @description The original source of the model (path, URL or repo_id). + */ + source: string; + /** @description The type of source */ + source_type: components["schemas"]["ModelSourceType"]; + /** + * Source Api Response + * @description The original API response from the source, as stringified JSON. + */ + source_api_response: string | null; + /** + * Source Url + * @description Optional URL for the model (e.g. download page or model page). + */ + source_url: string | null; + /** + * Cover Image + * @description Url for image to preview model + */ + cover_image: string | null; + /** + * Config Path + * @description Path to the config for this model, if any. + */ + config_path: string | null; + /** + * Type + * @default controlnet + * @constant + */ + type: "controlnet"; + /** + * Format + * @default checkpoint + * @constant + */ + format: "checkpoint"; + /** + * Base + * @default flux2 + * @constant + */ + base: "flux2"; + default_settings: components["schemas"]["ControlAdapterDefaultSettings"] | null; + }; /** * ControlNet_Checkpoint_QwenImage_Config * @description Model config for Qwen-Image Fun-ControlNet adapter models (Safetensors checkpoint). @@ -13930,13 +14019,167 @@ export type components = { */ type: "float_to_int"; }; + /** + * Flux2ControlField + * @description FLUX.2 [dev] Fun-ControlNet conditioning: a control image, an inpaint image with its mask, or both. + */ + Flux2ControlField: { + /** + * Image Name + * @description The preprocessed control image (Canny, depth, pose, ...) + * @default null + */ + image_name?: string | null; + /** + * Inpaint Image Name + * @description The image to inpaint + * @default null + */ + inpaint_image_name?: string | null; + /** + * Inpaint Mask Name + * @description The inpaint mask; white is regenerated + * @default null + */ + inpaint_mask_name?: string | null; + /** @description The FLUX.2 [dev] ControlNet model */ + control_model: components["schemas"]["ModelIdentifierField"]; + /** + * Control Context Scale + * @description Strength of the control signal. Recommended range: 0.65-0.80. + * @default 0.75 + */ + control_context_scale?: number; + /** + * Begin Step Percent + * @description When the control is first applied (% of total steps) + * @default 0 + */ + begin_step_percent?: number; + /** + * End Step Percent + * @description When the control is last applied (% of total steps) + * @default 1 + */ + end_step_percent?: number; + /** + * Tiled + * @description Encode the control images in tiles. The denoise encodes them at generation size, where an untiled FLUX.2 VAE encode takes several GB. + * @default false + */ + tiled?: boolean; + /** + * Tile Size + * @description The tile size for VAE tiling in pixels (image space). If set to 0, the default tile size for the model will be used. Larger tile sizes generally produce better results at the cost of higher memory usage. Values between 1 and 128 are raised to 128. + * @default 0 + */ + tile_size?: number; + }; + /** + * FLUX.2 [dev] ControlNet + * @description Configure the FLUX.2 [dev] Fun-ControlNet-Union for spatial control, inpainting, or both. + * + * Takes a preprocessed control image (Canny, HED, depth, pose, MLSD, ...) and/or an image to inpaint with its mask + * (white is regenerated), plus the FLUX.2 [dev] ControlNet model. Applies to FLUX.2 [dev] only, not to Klein. + * Recommended control scale: 0.65-0.80. + */ + Flux2ControlInvocation: { + /** + * Id + * @description The id of this instance of an invocation. Must be unique among all instances of invocations. + */ + id: string; + /** + * Is Intermediate + * @description Whether or not this is an intermediate invocation. + * @default false + */ + is_intermediate?: boolean; + /** + * Use Cache + * @description Whether or not to use the cache + * @default true + */ + use_cache?: boolean; + /** + * @description The preprocessed control image (Canny, HED, depth, pose, MLSD, ...) + * @default null + */ + image?: components["schemas"]["ImageField"] | null; + /** + * @description The image to inpaint. Goes together with the inpaint mask. + * @default null + */ + inpaint_image?: components["schemas"]["ImageField"] | null; + /** + * @description The inpaint mask: white is regenerated, black is kept. Goes together with the inpaint image. + * @default null + */ + inpaint_mask?: components["schemas"]["ImageField"] | null; + /** + * Control Model + * @description ControlNet model to load + * @default null + */ + control_model?: components["schemas"]["ModelIdentifierField"] | null; + /** + * Control Scale + * @description Strength of the control signal. Recommended range: 0.65-0.80. + * @default 0.75 + */ + control_context_scale?: number; + /** + * Begin Step Percent + * @description When the control is first applied (% of total steps) + * @default 0 + */ + begin_step_percent?: number; + /** + * End Step Percent + * @description When the control is last applied (% of total steps) + * @default 1 + */ + end_step_percent?: number; + /** + * Tiled + * @description Processing using overlapping tiles (reduce memory consumption) + * @default false + */ + tiled?: boolean; + /** + * Tile Size + * @description The tile size for VAE tiling in pixels (image space). If set to 0, the default tile size for the model will be used. Larger tile sizes generally produce better results at the cost of higher memory usage. Values between 1 and 128 are raised to 128. + * @default 0 + */ + tile_size?: number; + /** + * type + * @default flux2_control + * @constant + */ + type: "flux2_control"; + }; + /** + * Flux2ControlOutput + * @description FLUX.2 [dev] ControlNet output containing control configuration. + */ + Flux2ControlOutput: { + /** @description FLUX.2 [dev] control conditioning */ + control: components["schemas"]["Flux2ControlField"]; + /** + * type + * @default flux2_control_output + * @constant + */ + type: "flux2_control_output"; + }; /** * FLUX2 Denoise - * @description Run denoising process with a FLUX.2 Klein transformer model. + * @description Run denoising process with a FLUX.2 transformer model, Klein or [dev]. * - * This node is designed for FLUX.2 Klein models which use Qwen3 as the text encoder. * Regional prompting is supported via per-conditioning masks (single mask is applied - * to every transformer block via `joint_attention_kwargs`). ControlNet and IP-Adapters + * to every transformer block via `joint_attention_kwargs`). FLUX.2 [dev] takes the + * Fun-ControlNet-Union through `control`; Klein takes no ControlNet, and IP-Adapters * are not supported. Regional masking is skipped when reference images are attached. */ Flux2DenoiseInvocation: { @@ -14061,6 +14304,11 @@ export type components = { * @default null */ kontext_conditioning?: components["schemas"]["FluxKontextConditioningField"] | components["schemas"]["FluxKontextConditioningField"][] | null; + /** + * @description FLUX.2 [dev] ControlNet conditioning: spatial control (Canny, depth, pose, ...) and/or inpainting. + * @default null + */ + control?: components["schemas"]["Flux2ControlField"] | null; /** * type * @default flux2_denoise @@ -17420,7 +17668,7 @@ export type components = { * @description The nodes in this graph */ nodes?: { - [key: string]: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaDenoiseMetaInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLLLiteInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["AtlasCloudImageGenerationInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanLogicInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CollectionCartesianInvocation"] | components["schemas"]["CollectionConcatInvocation"] | components["schemas"]["CollectionZipInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["ForInvocation"] | components["schemas"]["ForReturnInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2StyleReferenceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LTX2AudioConditioningInvocation"] | components["schemas"]["LTX2DenoiseInvocation"] | components["schemas"]["LTX2DurationInvocation"] | components["schemas"]["LTX2ExtendConditioningInvocation"] | components["schemas"]["LTX2IdealDimensionsInvocation"] | components["schemas"]["LTX2ImageConditioningInvocation"] | components["schemas"]["LTX2LatentUpsampleInvocation"] | components["schemas"]["LTX2LatentsToVideoInvocation"] | components["schemas"]["LTX2LoRACollectionLoader"] | components["schemas"]["LTX2LoRALoaderInvocation"] | components["schemas"]["LTX2ModelLoaderInvocation"] | components["schemas"]["LTX2TextEncoderInvocation"] | components["schemas"]["LTX2VideoConditioningInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3HybridOverlayInvocation"] | components["schemas"]["MiniMaxH3IdealDimensionsInvocation"] | components["schemas"]["MiniMaxH3ImageReferenceInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3LoRACollectionLoader"] | components["schemas"]["MiniMaxH3LoRALoaderInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3ReferenceConditioningInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["MiniMaxH3VideoReferenceInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImage21DenoiseInvocation"] | components["schemas"]["QwenImage21ImageToLatentsInvocation"] | components["schemas"]["QwenImage21LatentsToImageInvocation"] | components["schemas"]["QwenImage21ModelLoaderInvocation"] | components["schemas"]["QwenImage21TextEncoderInvocation"] | components["schemas"]["QwenImageControlInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StateEmptyInvocation"] | components["schemas"]["StateGetInvocation"] | components["schemas"]["StateMergeInvocation"] | components["schemas"]["StateSetInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + [key: string]: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaDenoiseMetaInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLLLiteInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["AtlasCloudImageGenerationInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanLogicInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CollectionCartesianInvocation"] | components["schemas"]["CollectionConcatInvocation"] | components["schemas"]["CollectionZipInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2ControlInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["ForInvocation"] | components["schemas"]["ForReturnInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2StyleReferenceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LTX2AudioConditioningInvocation"] | components["schemas"]["LTX2DenoiseInvocation"] | components["schemas"]["LTX2DurationInvocation"] | components["schemas"]["LTX2ExtendConditioningInvocation"] | components["schemas"]["LTX2IdealDimensionsInvocation"] | components["schemas"]["LTX2ImageConditioningInvocation"] | components["schemas"]["LTX2LatentUpsampleInvocation"] | components["schemas"]["LTX2LatentsToVideoInvocation"] | components["schemas"]["LTX2LoRACollectionLoader"] | components["schemas"]["LTX2LoRALoaderInvocation"] | components["schemas"]["LTX2ModelLoaderInvocation"] | components["schemas"]["LTX2TextEncoderInvocation"] | components["schemas"]["LTX2VideoConditioningInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3HybridOverlayInvocation"] | components["schemas"]["MiniMaxH3IdealDimensionsInvocation"] | components["schemas"]["MiniMaxH3ImageReferenceInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3LoRACollectionLoader"] | components["schemas"]["MiniMaxH3LoRALoaderInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3ReferenceConditioningInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["MiniMaxH3VideoReferenceInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImage21DenoiseInvocation"] | components["schemas"]["QwenImage21ImageToLatentsInvocation"] | components["schemas"]["QwenImage21LatentsToImageInvocation"] | components["schemas"]["QwenImage21ModelLoaderInvocation"] | components["schemas"]["QwenImage21TextEncoderInvocation"] | components["schemas"]["QwenImageControlInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StateEmptyInvocation"] | components["schemas"]["StateGetInvocation"] | components["schemas"]["StateMergeInvocation"] | components["schemas"]["StateSetInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; }; /** * Edges @@ -17457,7 +17705,7 @@ export type components = { * @description The results of node executions */ results: { - [key: string]: components["schemas"]["AnimaConditioningOutput"] | components["schemas"]["AnimaLLLiteOutput"] | components["schemas"]["AnimaLoRALoaderOutput"] | components["schemas"]["AnimaModelLoaderOutput"] | components["schemas"]["BooleanCollectionOutput"] | components["schemas"]["BooleanOutput"] | components["schemas"]["BoundingBoxCollectionOutput"] | components["schemas"]["BoundingBoxOutput"] | components["schemas"]["CLIPOutput"] | components["schemas"]["CLIPSkipInvocationOutput"] | components["schemas"]["CalculateImageTilesOutput"] | components["schemas"]["CogView4ConditioningOutput"] | components["schemas"]["CogView4ModelLoaderOutput"] | components["schemas"]["CollectInvocationOutput"] | components["schemas"]["CollectionCartesianInvocationOutput"] | components["schemas"]["CollectionConcatInvocationOutput"] | components["schemas"]["CollectionZipInvocationOutput"] | components["schemas"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["ErnieImageConditioningOutput"] | components["schemas"]["ErnieImageModelLoaderOutput"] | components["schemas"]["ExtractVideoRangeOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["Flux2DevLoRALoaderOutput"] | components["schemas"]["Flux2DevModelLoaderOutput"] | components["schemas"]["Flux2KleinLoRALoaderOutput"] | components["schemas"]["Flux2KleinModelLoaderOutput"] | components["schemas"]["FluxConditioningCollectionOutput"] | components["schemas"]["FluxConditioningOutput"] | components["schemas"]["FluxControlLoRALoaderOutput"] | components["schemas"]["FluxControlNetOutput"] | components["schemas"]["FluxFillOutput"] | components["schemas"]["FluxKontextOutput"] | components["schemas"]["FluxLoRALoaderOutput"] | components["schemas"]["FluxModelLoaderOutput"] | components["schemas"]["FluxReduxOutput"] | components["schemas"]["ForInvocationOutput"] | components["schemas"]["ForReturnInvocationOutput"] | components["schemas"]["Gemma2EncoderOutput"] | components["schemas"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | components["schemas"]["Ideogram4ConditioningOutput"] | components["schemas"]["Ideogram4ModelLoaderOutput"] | components["schemas"]["IfInvocationOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["ImageGeneratorOutput"] | components["schemas"]["ImageOutput"] | components["schemas"]["ImagePanelCoordinateOutput"] | components["schemas"]["IntegerCollectionOutput"] | components["schemas"]["IntegerGeneratorOutput"] | components["schemas"]["IntegerOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["Krea2ConditioningOutput"] | components["schemas"]["Krea2LoRALoaderOutput"] | components["schemas"]["Krea2ModelLoaderOutput"] | components["schemas"]["Krea2StyleReferenceOutput"] | components["schemas"]["LTX2AudioConditioningOutput"] | components["schemas"]["LTX2DenoiseOutput"] | components["schemas"]["LTX2DurationOutput"] | components["schemas"]["LTX2ExtendConditioningOutput"] | components["schemas"]["LTX2IdealDimensionsOutput"] | components["schemas"]["LTX2ImageConditioningOutput"] | components["schemas"]["LTX2LatentUpsampleOutput"] | components["schemas"]["LTX2LoRACollectionLoaderOutput"] | components["schemas"]["LTX2LoRALoaderOutput"] | components["schemas"]["LTX2ModelLoaderOutput"] | components["schemas"]["LTX2TextEncoderOutput"] | components["schemas"]["LTX2VideoConditioningOutput"] | components["schemas"]["LatentsCollectionOutput"] | components["schemas"]["LatentsMetaOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["LoRALoaderOutput"] | components["schemas"]["LoRASelectorOutput"] | components["schemas"]["LoopStateOutput"] | components["schemas"]["LoopStateValueOutput"] | components["schemas"]["MDControlListOutput"] | components["schemas"]["MDIPAdapterListOutput"] | components["schemas"]["MDT2IAdapterListOutput"] | components["schemas"]["MaskOutput"] | components["schemas"]["MetadataItemOutput"] | components["schemas"]["MetadataOutput"] | components["schemas"]["MetadataToLorasCollectionOutput"] | components["schemas"]["MetadataToModelOutput"] | components["schemas"]["MetadataToSDXLModelOutput"] | components["schemas"]["MiniMaxH3ConditioningOutput"] | components["schemas"]["MiniMaxH3DenoiseOutput"] | components["schemas"]["MiniMaxH3FrameConditioningOutput"] | components["schemas"]["MiniMaxH3HybridOverlayOutput"] | components["schemas"]["MiniMaxH3LoRACollectionLoaderOutput"] | components["schemas"]["MiniMaxH3LoRALoaderOutput"] | components["schemas"]["MiniMaxH3ModelLoaderOutput"] | components["schemas"]["MiniMaxH3ReferenceConditioningOutput"] | components["schemas"]["MiniMaxH3ReferenceMediaOutput"] | components["schemas"]["ModelIdentifierOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["PBRMapsOutput"] | components["schemas"]["PairTileImageOutput"] | components["schemas"]["PiDDecoderOutput"] | components["schemas"]["PromptTemplateOutput"] | components["schemas"]["QwenImage21ConditioningOutput"] | components["schemas"]["QwenImage21ModelLoaderOutput"] | components["schemas"]["QwenImageConditioningOutput"] | components["schemas"]["QwenImageControlOutput"] | components["schemas"]["QwenImageLoRALoaderOutput"] | components["schemas"]["QwenImageModelLoaderOutput"] | components["schemas"]["SD3ConditioningOutput"] | components["schemas"]["SDXLLoRALoaderOutput"] | components["schemas"]["SDXLModelLoaderOutput"] | components["schemas"]["SDXLRefinerModelLoaderOutput"] | components["schemas"]["SchedulerOutput"] | components["schemas"]["Sd3ModelLoaderOutput"] | components["schemas"]["SeamlessModeOutput"] | components["schemas"]["String2Output"] | components["schemas"]["StringCollectionOutput"] | components["schemas"]["StringGeneratorOutput"] | components["schemas"]["StringOutput"] | components["schemas"]["StringPosNegOutput"] | components["schemas"]["T2IAdapterOutput"] | components["schemas"]["TileToPropertiesOutput"] | components["schemas"]["UNetOutput"] | components["schemas"]["VAEOutput"] | components["schemas"]["VideoOutput"] | components["schemas"]["WanConditioningOutput"] | components["schemas"]["WanLoRALoaderOutput"] | components["schemas"]["WanModelLoaderOutput"] | components["schemas"]["WanRefImageOutput"] | components["schemas"]["WorkflowReturnGetOutput"] | components["schemas"]["WorkflowReturnOutput"] | components["schemas"]["WorkflowReturnValueOutput"] | components["schemas"]["ZImageConditioningOutput"] | components["schemas"]["ZImageControlOutput"] | components["schemas"]["ZImageLoRALoaderOutput"] | components["schemas"]["ZImageModelLoaderOutput"]; + [key: string]: components["schemas"]["AnimaConditioningOutput"] | components["schemas"]["AnimaLLLiteOutput"] | components["schemas"]["AnimaLoRALoaderOutput"] | components["schemas"]["AnimaModelLoaderOutput"] | components["schemas"]["BooleanCollectionOutput"] | components["schemas"]["BooleanOutput"] | components["schemas"]["BoundingBoxCollectionOutput"] | components["schemas"]["BoundingBoxOutput"] | components["schemas"]["CLIPOutput"] | components["schemas"]["CLIPSkipInvocationOutput"] | components["schemas"]["CalculateImageTilesOutput"] | components["schemas"]["CogView4ConditioningOutput"] | components["schemas"]["CogView4ModelLoaderOutput"] | components["schemas"]["CollectInvocationOutput"] | components["schemas"]["CollectionCartesianInvocationOutput"] | components["schemas"]["CollectionConcatInvocationOutput"] | components["schemas"]["CollectionZipInvocationOutput"] | components["schemas"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["ErnieImageConditioningOutput"] | components["schemas"]["ErnieImageModelLoaderOutput"] | components["schemas"]["ExtractVideoRangeOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["Flux2ControlOutput"] | components["schemas"]["Flux2DevLoRALoaderOutput"] | components["schemas"]["Flux2DevModelLoaderOutput"] | components["schemas"]["Flux2KleinLoRALoaderOutput"] | components["schemas"]["Flux2KleinModelLoaderOutput"] | components["schemas"]["FluxConditioningCollectionOutput"] | components["schemas"]["FluxConditioningOutput"] | components["schemas"]["FluxControlLoRALoaderOutput"] | components["schemas"]["FluxControlNetOutput"] | components["schemas"]["FluxFillOutput"] | components["schemas"]["FluxKontextOutput"] | components["schemas"]["FluxLoRALoaderOutput"] | components["schemas"]["FluxModelLoaderOutput"] | components["schemas"]["FluxReduxOutput"] | components["schemas"]["ForInvocationOutput"] | components["schemas"]["ForReturnInvocationOutput"] | components["schemas"]["Gemma2EncoderOutput"] | components["schemas"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | components["schemas"]["Ideogram4ConditioningOutput"] | components["schemas"]["Ideogram4ModelLoaderOutput"] | components["schemas"]["IfInvocationOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["ImageGeneratorOutput"] | components["schemas"]["ImageOutput"] | components["schemas"]["ImagePanelCoordinateOutput"] | components["schemas"]["IntegerCollectionOutput"] | components["schemas"]["IntegerGeneratorOutput"] | components["schemas"]["IntegerOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["Krea2ConditioningOutput"] | components["schemas"]["Krea2LoRALoaderOutput"] | components["schemas"]["Krea2ModelLoaderOutput"] | components["schemas"]["Krea2StyleReferenceOutput"] | components["schemas"]["LTX2AudioConditioningOutput"] | components["schemas"]["LTX2DenoiseOutput"] | components["schemas"]["LTX2DurationOutput"] | components["schemas"]["LTX2ExtendConditioningOutput"] | components["schemas"]["LTX2IdealDimensionsOutput"] | components["schemas"]["LTX2ImageConditioningOutput"] | components["schemas"]["LTX2LatentUpsampleOutput"] | components["schemas"]["LTX2LoRACollectionLoaderOutput"] | components["schemas"]["LTX2LoRALoaderOutput"] | components["schemas"]["LTX2ModelLoaderOutput"] | components["schemas"]["LTX2TextEncoderOutput"] | components["schemas"]["LTX2VideoConditioningOutput"] | components["schemas"]["LatentsCollectionOutput"] | components["schemas"]["LatentsMetaOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["LoRALoaderOutput"] | components["schemas"]["LoRASelectorOutput"] | components["schemas"]["LoopStateOutput"] | components["schemas"]["LoopStateValueOutput"] | components["schemas"]["MDControlListOutput"] | components["schemas"]["MDIPAdapterListOutput"] | components["schemas"]["MDT2IAdapterListOutput"] | components["schemas"]["MaskOutput"] | components["schemas"]["MetadataItemOutput"] | components["schemas"]["MetadataOutput"] | components["schemas"]["MetadataToLorasCollectionOutput"] | components["schemas"]["MetadataToModelOutput"] | components["schemas"]["MetadataToSDXLModelOutput"] | components["schemas"]["MiniMaxH3ConditioningOutput"] | components["schemas"]["MiniMaxH3DenoiseOutput"] | components["schemas"]["MiniMaxH3FrameConditioningOutput"] | components["schemas"]["MiniMaxH3HybridOverlayOutput"] | components["schemas"]["MiniMaxH3LoRACollectionLoaderOutput"] | components["schemas"]["MiniMaxH3LoRALoaderOutput"] | components["schemas"]["MiniMaxH3ModelLoaderOutput"] | components["schemas"]["MiniMaxH3ReferenceConditioningOutput"] | components["schemas"]["MiniMaxH3ReferenceMediaOutput"] | components["schemas"]["ModelIdentifierOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["PBRMapsOutput"] | components["schemas"]["PairTileImageOutput"] | components["schemas"]["PiDDecoderOutput"] | components["schemas"]["PromptTemplateOutput"] | components["schemas"]["QwenImage21ConditioningOutput"] | components["schemas"]["QwenImage21ModelLoaderOutput"] | components["schemas"]["QwenImageConditioningOutput"] | components["schemas"]["QwenImageControlOutput"] | components["schemas"]["QwenImageLoRALoaderOutput"] | components["schemas"]["QwenImageModelLoaderOutput"] | components["schemas"]["SD3ConditioningOutput"] | components["schemas"]["SDXLLoRALoaderOutput"] | components["schemas"]["SDXLModelLoaderOutput"] | components["schemas"]["SDXLRefinerModelLoaderOutput"] | components["schemas"]["SchedulerOutput"] | components["schemas"]["Sd3ModelLoaderOutput"] | components["schemas"]["SeamlessModeOutput"] | components["schemas"]["String2Output"] | components["schemas"]["StringCollectionOutput"] | components["schemas"]["StringGeneratorOutput"] | components["schemas"]["StringOutput"] | components["schemas"]["StringPosNegOutput"] | components["schemas"]["T2IAdapterOutput"] | components["schemas"]["TileToPropertiesOutput"] | components["schemas"]["UNetOutput"] | components["schemas"]["VAEOutput"] | components["schemas"]["VideoOutput"] | components["schemas"]["WanConditioningOutput"] | components["schemas"]["WanLoRALoaderOutput"] | components["schemas"]["WanModelLoaderOutput"] | components["schemas"]["WanRefImageOutput"] | components["schemas"]["WorkflowReturnGetOutput"] | components["schemas"]["WorkflowReturnOutput"] | components["schemas"]["WorkflowReturnValueOutput"] | components["schemas"]["ZImageConditioningOutput"] | components["schemas"]["ZImageControlOutput"] | components["schemas"]["ZImageLoRALoaderOutput"] | components["schemas"]["ZImageModelLoaderOutput"]; }; /** * Errors @@ -22267,7 +22515,7 @@ export type components = { * Invocation * @description The ID of the invocation */ - invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaDenoiseMetaInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLLLiteInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["AtlasCloudImageGenerationInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanLogicInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CollectionCartesianInvocation"] | components["schemas"]["CollectionConcatInvocation"] | components["schemas"]["CollectionZipInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["ForInvocation"] | components["schemas"]["ForReturnInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2StyleReferenceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LTX2AudioConditioningInvocation"] | components["schemas"]["LTX2DenoiseInvocation"] | components["schemas"]["LTX2DurationInvocation"] | components["schemas"]["LTX2ExtendConditioningInvocation"] | components["schemas"]["LTX2IdealDimensionsInvocation"] | components["schemas"]["LTX2ImageConditioningInvocation"] | components["schemas"]["LTX2LatentUpsampleInvocation"] | components["schemas"]["LTX2LatentsToVideoInvocation"] | components["schemas"]["LTX2LoRACollectionLoader"] | components["schemas"]["LTX2LoRALoaderInvocation"] | components["schemas"]["LTX2ModelLoaderInvocation"] | components["schemas"]["LTX2TextEncoderInvocation"] | components["schemas"]["LTX2VideoConditioningInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3HybridOverlayInvocation"] | components["schemas"]["MiniMaxH3IdealDimensionsInvocation"] | components["schemas"]["MiniMaxH3ImageReferenceInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3LoRACollectionLoader"] | components["schemas"]["MiniMaxH3LoRALoaderInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3ReferenceConditioningInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["MiniMaxH3VideoReferenceInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImage21DenoiseInvocation"] | components["schemas"]["QwenImage21ImageToLatentsInvocation"] | components["schemas"]["QwenImage21LatentsToImageInvocation"] | components["schemas"]["QwenImage21ModelLoaderInvocation"] | components["schemas"]["QwenImage21TextEncoderInvocation"] | components["schemas"]["QwenImageControlInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StateEmptyInvocation"] | components["schemas"]["StateGetInvocation"] | components["schemas"]["StateMergeInvocation"] | components["schemas"]["StateSetInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaDenoiseMetaInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLLLiteInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["AtlasCloudImageGenerationInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanLogicInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CollectionCartesianInvocation"] | components["schemas"]["CollectionConcatInvocation"] | components["schemas"]["CollectionZipInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2ControlInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["ForInvocation"] | components["schemas"]["ForReturnInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2StyleReferenceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LTX2AudioConditioningInvocation"] | components["schemas"]["LTX2DenoiseInvocation"] | components["schemas"]["LTX2DurationInvocation"] | components["schemas"]["LTX2ExtendConditioningInvocation"] | components["schemas"]["LTX2IdealDimensionsInvocation"] | components["schemas"]["LTX2ImageConditioningInvocation"] | components["schemas"]["LTX2LatentUpsampleInvocation"] | components["schemas"]["LTX2LatentsToVideoInvocation"] | components["schemas"]["LTX2LoRACollectionLoader"] | components["schemas"]["LTX2LoRALoaderInvocation"] | components["schemas"]["LTX2ModelLoaderInvocation"] | components["schemas"]["LTX2TextEncoderInvocation"] | components["schemas"]["LTX2VideoConditioningInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3HybridOverlayInvocation"] | components["schemas"]["MiniMaxH3IdealDimensionsInvocation"] | components["schemas"]["MiniMaxH3ImageReferenceInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3LoRACollectionLoader"] | components["schemas"]["MiniMaxH3LoRALoaderInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3ReferenceConditioningInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["MiniMaxH3VideoReferenceInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImage21DenoiseInvocation"] | components["schemas"]["QwenImage21ImageToLatentsInvocation"] | components["schemas"]["QwenImage21LatentsToImageInvocation"] | components["schemas"]["QwenImage21ModelLoaderInvocation"] | components["schemas"]["QwenImage21TextEncoderInvocation"] | components["schemas"]["QwenImageControlInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StateEmptyInvocation"] | components["schemas"]["StateGetInvocation"] | components["schemas"]["StateMergeInvocation"] | components["schemas"]["StateSetInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -22295,7 +22543,7 @@ export type components = { * Result * @description The result of the invocation */ - result: components["schemas"]["AnimaConditioningOutput"] | components["schemas"]["AnimaLLLiteOutput"] | components["schemas"]["AnimaLoRALoaderOutput"] | components["schemas"]["AnimaModelLoaderOutput"] | components["schemas"]["BooleanCollectionOutput"] | components["schemas"]["BooleanOutput"] | components["schemas"]["BoundingBoxCollectionOutput"] | components["schemas"]["BoundingBoxOutput"] | components["schemas"]["CLIPOutput"] | components["schemas"]["CLIPSkipInvocationOutput"] | components["schemas"]["CalculateImageTilesOutput"] | components["schemas"]["CogView4ConditioningOutput"] | components["schemas"]["CogView4ModelLoaderOutput"] | components["schemas"]["CollectInvocationOutput"] | components["schemas"]["CollectionCartesianInvocationOutput"] | components["schemas"]["CollectionConcatInvocationOutput"] | components["schemas"]["CollectionZipInvocationOutput"] | components["schemas"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["ErnieImageConditioningOutput"] | components["schemas"]["ErnieImageModelLoaderOutput"] | components["schemas"]["ExtractVideoRangeOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["Flux2DevLoRALoaderOutput"] | components["schemas"]["Flux2DevModelLoaderOutput"] | components["schemas"]["Flux2KleinLoRALoaderOutput"] | components["schemas"]["Flux2KleinModelLoaderOutput"] | components["schemas"]["FluxConditioningCollectionOutput"] | components["schemas"]["FluxConditioningOutput"] | components["schemas"]["FluxControlLoRALoaderOutput"] | components["schemas"]["FluxControlNetOutput"] | components["schemas"]["FluxFillOutput"] | components["schemas"]["FluxKontextOutput"] | components["schemas"]["FluxLoRALoaderOutput"] | components["schemas"]["FluxModelLoaderOutput"] | components["schemas"]["FluxReduxOutput"] | components["schemas"]["ForInvocationOutput"] | components["schemas"]["ForReturnInvocationOutput"] | components["schemas"]["Gemma2EncoderOutput"] | components["schemas"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | components["schemas"]["Ideogram4ConditioningOutput"] | components["schemas"]["Ideogram4ModelLoaderOutput"] | components["schemas"]["IfInvocationOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["ImageGeneratorOutput"] | components["schemas"]["ImageOutput"] | components["schemas"]["ImagePanelCoordinateOutput"] | components["schemas"]["IntegerCollectionOutput"] | components["schemas"]["IntegerGeneratorOutput"] | components["schemas"]["IntegerOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["Krea2ConditioningOutput"] | components["schemas"]["Krea2LoRALoaderOutput"] | components["schemas"]["Krea2ModelLoaderOutput"] | components["schemas"]["Krea2StyleReferenceOutput"] | components["schemas"]["LTX2AudioConditioningOutput"] | components["schemas"]["LTX2DenoiseOutput"] | components["schemas"]["LTX2DurationOutput"] | components["schemas"]["LTX2ExtendConditioningOutput"] | components["schemas"]["LTX2IdealDimensionsOutput"] | components["schemas"]["LTX2ImageConditioningOutput"] | components["schemas"]["LTX2LatentUpsampleOutput"] | components["schemas"]["LTX2LoRACollectionLoaderOutput"] | components["schemas"]["LTX2LoRALoaderOutput"] | components["schemas"]["LTX2ModelLoaderOutput"] | components["schemas"]["LTX2TextEncoderOutput"] | components["schemas"]["LTX2VideoConditioningOutput"] | components["schemas"]["LatentsCollectionOutput"] | components["schemas"]["LatentsMetaOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["LoRALoaderOutput"] | components["schemas"]["LoRASelectorOutput"] | components["schemas"]["LoopStateOutput"] | components["schemas"]["LoopStateValueOutput"] | components["schemas"]["MDControlListOutput"] | components["schemas"]["MDIPAdapterListOutput"] | components["schemas"]["MDT2IAdapterListOutput"] | components["schemas"]["MaskOutput"] | components["schemas"]["MetadataItemOutput"] | components["schemas"]["MetadataOutput"] | components["schemas"]["MetadataToLorasCollectionOutput"] | components["schemas"]["MetadataToModelOutput"] | components["schemas"]["MetadataToSDXLModelOutput"] | components["schemas"]["MiniMaxH3ConditioningOutput"] | components["schemas"]["MiniMaxH3DenoiseOutput"] | components["schemas"]["MiniMaxH3FrameConditioningOutput"] | components["schemas"]["MiniMaxH3HybridOverlayOutput"] | components["schemas"]["MiniMaxH3LoRACollectionLoaderOutput"] | components["schemas"]["MiniMaxH3LoRALoaderOutput"] | components["schemas"]["MiniMaxH3ModelLoaderOutput"] | components["schemas"]["MiniMaxH3ReferenceConditioningOutput"] | components["schemas"]["MiniMaxH3ReferenceMediaOutput"] | components["schemas"]["ModelIdentifierOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["PBRMapsOutput"] | components["schemas"]["PairTileImageOutput"] | components["schemas"]["PiDDecoderOutput"] | components["schemas"]["PromptTemplateOutput"] | components["schemas"]["QwenImage21ConditioningOutput"] | components["schemas"]["QwenImage21ModelLoaderOutput"] | components["schemas"]["QwenImageConditioningOutput"] | components["schemas"]["QwenImageControlOutput"] | components["schemas"]["QwenImageLoRALoaderOutput"] | components["schemas"]["QwenImageModelLoaderOutput"] | components["schemas"]["SD3ConditioningOutput"] | components["schemas"]["SDXLLoRALoaderOutput"] | components["schemas"]["SDXLModelLoaderOutput"] | components["schemas"]["SDXLRefinerModelLoaderOutput"] | components["schemas"]["SchedulerOutput"] | components["schemas"]["Sd3ModelLoaderOutput"] | components["schemas"]["SeamlessModeOutput"] | components["schemas"]["String2Output"] | components["schemas"]["StringCollectionOutput"] | components["schemas"]["StringGeneratorOutput"] | components["schemas"]["StringOutput"] | components["schemas"]["StringPosNegOutput"] | components["schemas"]["T2IAdapterOutput"] | components["schemas"]["TileToPropertiesOutput"] | components["schemas"]["UNetOutput"] | components["schemas"]["VAEOutput"] | components["schemas"]["VideoOutput"] | components["schemas"]["WanConditioningOutput"] | components["schemas"]["WanLoRALoaderOutput"] | components["schemas"]["WanModelLoaderOutput"] | components["schemas"]["WanRefImageOutput"] | components["schemas"]["WorkflowReturnGetOutput"] | components["schemas"]["WorkflowReturnOutput"] | components["schemas"]["WorkflowReturnValueOutput"] | components["schemas"]["ZImageConditioningOutput"] | components["schemas"]["ZImageControlOutput"] | components["schemas"]["ZImageLoRALoaderOutput"] | components["schemas"]["ZImageModelLoaderOutput"]; + result: components["schemas"]["AnimaConditioningOutput"] | components["schemas"]["AnimaLLLiteOutput"] | components["schemas"]["AnimaLoRALoaderOutput"] | components["schemas"]["AnimaModelLoaderOutput"] | components["schemas"]["BooleanCollectionOutput"] | components["schemas"]["BooleanOutput"] | components["schemas"]["BoundingBoxCollectionOutput"] | components["schemas"]["BoundingBoxOutput"] | components["schemas"]["CLIPOutput"] | components["schemas"]["CLIPSkipInvocationOutput"] | components["schemas"]["CalculateImageTilesOutput"] | components["schemas"]["CogView4ConditioningOutput"] | components["schemas"]["CogView4ModelLoaderOutput"] | components["schemas"]["CollectInvocationOutput"] | components["schemas"]["CollectionCartesianInvocationOutput"] | components["schemas"]["CollectionConcatInvocationOutput"] | components["schemas"]["CollectionZipInvocationOutput"] | components["schemas"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["ErnieImageConditioningOutput"] | components["schemas"]["ErnieImageModelLoaderOutput"] | components["schemas"]["ExtractVideoRangeOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["Flux2ControlOutput"] | components["schemas"]["Flux2DevLoRALoaderOutput"] | components["schemas"]["Flux2DevModelLoaderOutput"] | components["schemas"]["Flux2KleinLoRALoaderOutput"] | components["schemas"]["Flux2KleinModelLoaderOutput"] | components["schemas"]["FluxConditioningCollectionOutput"] | components["schemas"]["FluxConditioningOutput"] | components["schemas"]["FluxControlLoRALoaderOutput"] | components["schemas"]["FluxControlNetOutput"] | components["schemas"]["FluxFillOutput"] | components["schemas"]["FluxKontextOutput"] | components["schemas"]["FluxLoRALoaderOutput"] | components["schemas"]["FluxModelLoaderOutput"] | components["schemas"]["FluxReduxOutput"] | components["schemas"]["ForInvocationOutput"] | components["schemas"]["ForReturnInvocationOutput"] | components["schemas"]["Gemma2EncoderOutput"] | components["schemas"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | components["schemas"]["Ideogram4ConditioningOutput"] | components["schemas"]["Ideogram4ModelLoaderOutput"] | components["schemas"]["IfInvocationOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["ImageGeneratorOutput"] | components["schemas"]["ImageOutput"] | components["schemas"]["ImagePanelCoordinateOutput"] | components["schemas"]["IntegerCollectionOutput"] | components["schemas"]["IntegerGeneratorOutput"] | components["schemas"]["IntegerOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["Krea2ConditioningOutput"] | components["schemas"]["Krea2LoRALoaderOutput"] | components["schemas"]["Krea2ModelLoaderOutput"] | components["schemas"]["Krea2StyleReferenceOutput"] | components["schemas"]["LTX2AudioConditioningOutput"] | components["schemas"]["LTX2DenoiseOutput"] | components["schemas"]["LTX2DurationOutput"] | components["schemas"]["LTX2ExtendConditioningOutput"] | components["schemas"]["LTX2IdealDimensionsOutput"] | components["schemas"]["LTX2ImageConditioningOutput"] | components["schemas"]["LTX2LatentUpsampleOutput"] | components["schemas"]["LTX2LoRACollectionLoaderOutput"] | components["schemas"]["LTX2LoRALoaderOutput"] | components["schemas"]["LTX2ModelLoaderOutput"] | components["schemas"]["LTX2TextEncoderOutput"] | components["schemas"]["LTX2VideoConditioningOutput"] | components["schemas"]["LatentsCollectionOutput"] | components["schemas"]["LatentsMetaOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["LoRALoaderOutput"] | components["schemas"]["LoRASelectorOutput"] | components["schemas"]["LoopStateOutput"] | components["schemas"]["LoopStateValueOutput"] | components["schemas"]["MDControlListOutput"] | components["schemas"]["MDIPAdapterListOutput"] | components["schemas"]["MDT2IAdapterListOutput"] | components["schemas"]["MaskOutput"] | components["schemas"]["MetadataItemOutput"] | components["schemas"]["MetadataOutput"] | components["schemas"]["MetadataToLorasCollectionOutput"] | components["schemas"]["MetadataToModelOutput"] | components["schemas"]["MetadataToSDXLModelOutput"] | components["schemas"]["MiniMaxH3ConditioningOutput"] | components["schemas"]["MiniMaxH3DenoiseOutput"] | components["schemas"]["MiniMaxH3FrameConditioningOutput"] | components["schemas"]["MiniMaxH3HybridOverlayOutput"] | components["schemas"]["MiniMaxH3LoRACollectionLoaderOutput"] | components["schemas"]["MiniMaxH3LoRALoaderOutput"] | components["schemas"]["MiniMaxH3ModelLoaderOutput"] | components["schemas"]["MiniMaxH3ReferenceConditioningOutput"] | components["schemas"]["MiniMaxH3ReferenceMediaOutput"] | components["schemas"]["ModelIdentifierOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["PBRMapsOutput"] | components["schemas"]["PairTileImageOutput"] | components["schemas"]["PiDDecoderOutput"] | components["schemas"]["PromptTemplateOutput"] | components["schemas"]["QwenImage21ConditioningOutput"] | components["schemas"]["QwenImage21ModelLoaderOutput"] | components["schemas"]["QwenImageConditioningOutput"] | components["schemas"]["QwenImageControlOutput"] | components["schemas"]["QwenImageLoRALoaderOutput"] | components["schemas"]["QwenImageModelLoaderOutput"] | components["schemas"]["SD3ConditioningOutput"] | components["schemas"]["SDXLLoRALoaderOutput"] | components["schemas"]["SDXLModelLoaderOutput"] | components["schemas"]["SDXLRefinerModelLoaderOutput"] | components["schemas"]["SchedulerOutput"] | components["schemas"]["Sd3ModelLoaderOutput"] | components["schemas"]["SeamlessModeOutput"] | components["schemas"]["String2Output"] | components["schemas"]["StringCollectionOutput"] | components["schemas"]["StringGeneratorOutput"] | components["schemas"]["StringOutput"] | components["schemas"]["StringPosNegOutput"] | components["schemas"]["T2IAdapterOutput"] | components["schemas"]["TileToPropertiesOutput"] | components["schemas"]["UNetOutput"] | components["schemas"]["VAEOutput"] | components["schemas"]["VideoOutput"] | components["schemas"]["WanConditioningOutput"] | components["schemas"]["WanLoRALoaderOutput"] | components["schemas"]["WanModelLoaderOutput"] | components["schemas"]["WanRefImageOutput"] | components["schemas"]["WorkflowReturnGetOutput"] | components["schemas"]["WorkflowReturnOutput"] | components["schemas"]["WorkflowReturnValueOutput"] | components["schemas"]["ZImageConditioningOutput"] | components["schemas"]["ZImageControlOutput"] | components["schemas"]["ZImageLoRALoaderOutput"] | components["schemas"]["ZImageModelLoaderOutput"]; }; /** * InvocationErrorEvent @@ -22349,7 +22597,7 @@ export type components = { * Invocation * @description The ID of the invocation */ - invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaDenoiseMetaInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLLLiteInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["AtlasCloudImageGenerationInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanLogicInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CollectionCartesianInvocation"] | components["schemas"]["CollectionConcatInvocation"] | components["schemas"]["CollectionZipInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["ForInvocation"] | components["schemas"]["ForReturnInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2StyleReferenceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LTX2AudioConditioningInvocation"] | components["schemas"]["LTX2DenoiseInvocation"] | components["schemas"]["LTX2DurationInvocation"] | components["schemas"]["LTX2ExtendConditioningInvocation"] | components["schemas"]["LTX2IdealDimensionsInvocation"] | components["schemas"]["LTX2ImageConditioningInvocation"] | components["schemas"]["LTX2LatentUpsampleInvocation"] | components["schemas"]["LTX2LatentsToVideoInvocation"] | components["schemas"]["LTX2LoRACollectionLoader"] | components["schemas"]["LTX2LoRALoaderInvocation"] | components["schemas"]["LTX2ModelLoaderInvocation"] | components["schemas"]["LTX2TextEncoderInvocation"] | components["schemas"]["LTX2VideoConditioningInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3HybridOverlayInvocation"] | components["schemas"]["MiniMaxH3IdealDimensionsInvocation"] | components["schemas"]["MiniMaxH3ImageReferenceInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3LoRACollectionLoader"] | components["schemas"]["MiniMaxH3LoRALoaderInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3ReferenceConditioningInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["MiniMaxH3VideoReferenceInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImage21DenoiseInvocation"] | components["schemas"]["QwenImage21ImageToLatentsInvocation"] | components["schemas"]["QwenImage21LatentsToImageInvocation"] | components["schemas"]["QwenImage21ModelLoaderInvocation"] | components["schemas"]["QwenImage21TextEncoderInvocation"] | components["schemas"]["QwenImageControlInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StateEmptyInvocation"] | components["schemas"]["StateGetInvocation"] | components["schemas"]["StateMergeInvocation"] | components["schemas"]["StateSetInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaDenoiseMetaInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLLLiteInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["AtlasCloudImageGenerationInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanLogicInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CollectionCartesianInvocation"] | components["schemas"]["CollectionConcatInvocation"] | components["schemas"]["CollectionZipInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2ControlInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["ForInvocation"] | components["schemas"]["ForReturnInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2StyleReferenceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LTX2AudioConditioningInvocation"] | components["schemas"]["LTX2DenoiseInvocation"] | components["schemas"]["LTX2DurationInvocation"] | components["schemas"]["LTX2ExtendConditioningInvocation"] | components["schemas"]["LTX2IdealDimensionsInvocation"] | components["schemas"]["LTX2ImageConditioningInvocation"] | components["schemas"]["LTX2LatentUpsampleInvocation"] | components["schemas"]["LTX2LatentsToVideoInvocation"] | components["schemas"]["LTX2LoRACollectionLoader"] | components["schemas"]["LTX2LoRALoaderInvocation"] | components["schemas"]["LTX2ModelLoaderInvocation"] | components["schemas"]["LTX2TextEncoderInvocation"] | components["schemas"]["LTX2VideoConditioningInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3HybridOverlayInvocation"] | components["schemas"]["MiniMaxH3IdealDimensionsInvocation"] | components["schemas"]["MiniMaxH3ImageReferenceInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3LoRACollectionLoader"] | components["schemas"]["MiniMaxH3LoRALoaderInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3ReferenceConditioningInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["MiniMaxH3VideoReferenceInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImage21DenoiseInvocation"] | components["schemas"]["QwenImage21ImageToLatentsInvocation"] | components["schemas"]["QwenImage21LatentsToImageInvocation"] | components["schemas"]["QwenImage21ModelLoaderInvocation"] | components["schemas"]["QwenImage21TextEncoderInvocation"] | components["schemas"]["QwenImageControlInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StateEmptyInvocation"] | components["schemas"]["StateGetInvocation"] | components["schemas"]["StateMergeInvocation"] | components["schemas"]["StateSetInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -22467,6 +22715,7 @@ export type components = { float_math: components["schemas"]["FloatOutput"]; float_range: components["schemas"]["FloatCollectionOutput"]; float_to_int: components["schemas"]["IntegerOutput"]; + flux2_control: components["schemas"]["Flux2ControlOutput"]; flux2_denoise: components["schemas"]["LatentsOutput"]; flux2_dev_lora_collection_loader: components["schemas"]["Flux2DevLoRALoaderOutput"]; flux2_dev_lora_loader: components["schemas"]["Flux2DevLoRALoaderOutput"]; @@ -22795,7 +23044,7 @@ export type components = { * Invocation * @description The ID of the invocation */ - invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaDenoiseMetaInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLLLiteInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["AtlasCloudImageGenerationInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanLogicInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CollectionCartesianInvocation"] | components["schemas"]["CollectionConcatInvocation"] | components["schemas"]["CollectionZipInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["ForInvocation"] | components["schemas"]["ForReturnInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2StyleReferenceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LTX2AudioConditioningInvocation"] | components["schemas"]["LTX2DenoiseInvocation"] | components["schemas"]["LTX2DurationInvocation"] | components["schemas"]["LTX2ExtendConditioningInvocation"] | components["schemas"]["LTX2IdealDimensionsInvocation"] | components["schemas"]["LTX2ImageConditioningInvocation"] | components["schemas"]["LTX2LatentUpsampleInvocation"] | components["schemas"]["LTX2LatentsToVideoInvocation"] | components["schemas"]["LTX2LoRACollectionLoader"] | components["schemas"]["LTX2LoRALoaderInvocation"] | components["schemas"]["LTX2ModelLoaderInvocation"] | components["schemas"]["LTX2TextEncoderInvocation"] | components["schemas"]["LTX2VideoConditioningInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3HybridOverlayInvocation"] | components["schemas"]["MiniMaxH3IdealDimensionsInvocation"] | components["schemas"]["MiniMaxH3ImageReferenceInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3LoRACollectionLoader"] | components["schemas"]["MiniMaxH3LoRALoaderInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3ReferenceConditioningInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["MiniMaxH3VideoReferenceInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImage21DenoiseInvocation"] | components["schemas"]["QwenImage21ImageToLatentsInvocation"] | components["schemas"]["QwenImage21LatentsToImageInvocation"] | components["schemas"]["QwenImage21ModelLoaderInvocation"] | components["schemas"]["QwenImage21TextEncoderInvocation"] | components["schemas"]["QwenImageControlInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StateEmptyInvocation"] | components["schemas"]["StateGetInvocation"] | components["schemas"]["StateMergeInvocation"] | components["schemas"]["StateSetInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaDenoiseMetaInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLLLiteInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["AtlasCloudImageGenerationInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanLogicInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CollectionCartesianInvocation"] | components["schemas"]["CollectionConcatInvocation"] | components["schemas"]["CollectionZipInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2ControlInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["ForInvocation"] | components["schemas"]["ForReturnInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2StyleReferenceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LTX2AudioConditioningInvocation"] | components["schemas"]["LTX2DenoiseInvocation"] | components["schemas"]["LTX2DurationInvocation"] | components["schemas"]["LTX2ExtendConditioningInvocation"] | components["schemas"]["LTX2IdealDimensionsInvocation"] | components["schemas"]["LTX2ImageConditioningInvocation"] | components["schemas"]["LTX2LatentUpsampleInvocation"] | components["schemas"]["LTX2LatentsToVideoInvocation"] | components["schemas"]["LTX2LoRACollectionLoader"] | components["schemas"]["LTX2LoRALoaderInvocation"] | components["schemas"]["LTX2ModelLoaderInvocation"] | components["schemas"]["LTX2TextEncoderInvocation"] | components["schemas"]["LTX2VideoConditioningInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3HybridOverlayInvocation"] | components["schemas"]["MiniMaxH3IdealDimensionsInvocation"] | components["schemas"]["MiniMaxH3ImageReferenceInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3LoRACollectionLoader"] | components["schemas"]["MiniMaxH3LoRALoaderInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3ReferenceConditioningInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["MiniMaxH3VideoReferenceInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImage21DenoiseInvocation"] | components["schemas"]["QwenImage21ImageToLatentsInvocation"] | components["schemas"]["QwenImage21LatentsToImageInvocation"] | components["schemas"]["QwenImage21ModelLoaderInvocation"] | components["schemas"]["QwenImage21TextEncoderInvocation"] | components["schemas"]["QwenImageControlInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StateEmptyInvocation"] | components["schemas"]["StateGetInvocation"] | components["schemas"]["StateMergeInvocation"] | components["schemas"]["StateSetInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -22900,7 +23149,7 @@ export type components = { * Invocation * @description The ID of the invocation */ - invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaDenoiseMetaInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLLLiteInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["AtlasCloudImageGenerationInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanLogicInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CollectionCartesianInvocation"] | components["schemas"]["CollectionConcatInvocation"] | components["schemas"]["CollectionZipInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["ForInvocation"] | components["schemas"]["ForReturnInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2StyleReferenceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LTX2AudioConditioningInvocation"] | components["schemas"]["LTX2DenoiseInvocation"] | components["schemas"]["LTX2DurationInvocation"] | components["schemas"]["LTX2ExtendConditioningInvocation"] | components["schemas"]["LTX2IdealDimensionsInvocation"] | components["schemas"]["LTX2ImageConditioningInvocation"] | components["schemas"]["LTX2LatentUpsampleInvocation"] | components["schemas"]["LTX2LatentsToVideoInvocation"] | components["schemas"]["LTX2LoRACollectionLoader"] | components["schemas"]["LTX2LoRALoaderInvocation"] | components["schemas"]["LTX2ModelLoaderInvocation"] | components["schemas"]["LTX2TextEncoderInvocation"] | components["schemas"]["LTX2VideoConditioningInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3HybridOverlayInvocation"] | components["schemas"]["MiniMaxH3IdealDimensionsInvocation"] | components["schemas"]["MiniMaxH3ImageReferenceInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3LoRACollectionLoader"] | components["schemas"]["MiniMaxH3LoRALoaderInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3ReferenceConditioningInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["MiniMaxH3VideoReferenceInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImage21DenoiseInvocation"] | components["schemas"]["QwenImage21ImageToLatentsInvocation"] | components["schemas"]["QwenImage21LatentsToImageInvocation"] | components["schemas"]["QwenImage21ModelLoaderInvocation"] | components["schemas"]["QwenImage21TextEncoderInvocation"] | components["schemas"]["QwenImageControlInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StateEmptyInvocation"] | components["schemas"]["StateGetInvocation"] | components["schemas"]["StateMergeInvocation"] | components["schemas"]["StateSetInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaDenoiseMetaInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLLLiteInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["AtlasCloudImageGenerationInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BooleanLogicInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["CollectionCartesianInvocation"] | components["schemas"]["CollectionConcatInvocation"] | components["schemas"]["CollectionZipInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2ControlInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["ForInvocation"] | components["schemas"]["ForReturnInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2StyleReferenceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LTX2AudioConditioningInvocation"] | components["schemas"]["LTX2DenoiseInvocation"] | components["schemas"]["LTX2DurationInvocation"] | components["schemas"]["LTX2ExtendConditioningInvocation"] | components["schemas"]["LTX2IdealDimensionsInvocation"] | components["schemas"]["LTX2ImageConditioningInvocation"] | components["schemas"]["LTX2LatentUpsampleInvocation"] | components["schemas"]["LTX2LatentsToVideoInvocation"] | components["schemas"]["LTX2LoRACollectionLoader"] | components["schemas"]["LTX2LoRALoaderInvocation"] | components["schemas"]["LTX2ModelLoaderInvocation"] | components["schemas"]["LTX2TextEncoderInvocation"] | components["schemas"]["LTX2VideoConditioningInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3HybridOverlayInvocation"] | components["schemas"]["MiniMaxH3IdealDimensionsInvocation"] | components["schemas"]["MiniMaxH3ImageReferenceInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3LoRACollectionLoader"] | components["schemas"]["MiniMaxH3LoRALoaderInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3ReferenceConditioningInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["MiniMaxH3VideoReferenceInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImage21DenoiseInvocation"] | components["schemas"]["QwenImage21ImageToLatentsInvocation"] | components["schemas"]["QwenImage21LatentsToImageInvocation"] | components["schemas"]["QwenImage21ModelLoaderInvocation"] | components["schemas"]["QwenImage21TextEncoderInvocation"] | components["schemas"]["QwenImageControlInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StateEmptyInvocation"] | components["schemas"]["StateGetInvocation"] | components["schemas"]["StateMergeInvocation"] | components["schemas"]["StateSetInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -37361,7 +37610,7 @@ export type components = { * Config * @description The installed model's config */ - config: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + config: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Flux2_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; /** * ModelInstallDownloadProgressEvent @@ -37527,7 +37776,7 @@ export type components = { * Config Out * @description After successful installation, this will hold the configuration object. */ - config_out?: (components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]) | null; + config_out?: (components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Flux2_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]) | null; /** * Inplace * @description Leave model in its current location; otherwise install under models directory @@ -37613,7 +37862,7 @@ export type components = { * Config * @description The model's config */ - config: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + config: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Flux2_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; /** * @description The submodel type, if any * @default null @@ -37640,7 +37889,7 @@ export type components = { * Config * @description The model's config */ - config: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + config: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Flux2_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; /** * @description The submodel type, if any * @default null @@ -37867,7 +38116,7 @@ export type components = { */ ModelsList: { /** Models */ - models: (components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"])[]; + models: (components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Flux2_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"])[]; }; /** * Multiply Integers @@ -54582,7 +54831,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Flux2_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; }; /** @description Validation Error */ @@ -54614,7 +54863,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Flux2_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; }; /** @description Validation Error */ @@ -54666,7 +54915,7 @@ export interface operations { * "upcast_attention": false * } */ - "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Flux2_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; }; /** @description Bad request */ @@ -54780,7 +55029,7 @@ export interface operations { * "upcast_attention": false * } */ - "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Flux2_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; }; /** @description Bad request */ @@ -54853,7 +55102,7 @@ export interface operations { * "upcast_attention": false * } */ - "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Flux2_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; }; /** @description Bad request */ @@ -55654,7 +55903,7 @@ export interface operations { * "upcast_attention": false * } */ - "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_QwenImage21_Config"] | components["schemas"]["Main_Diffusers_Wan_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Diffusers_ErnieImage_Config"] | components["schemas"]["Main_Diffusers_Ideogram4_Config"] | components["schemas"]["Main_Diffusers_Krea2_Config"] | components["schemas"]["Main_Diffusers_MiniMaxH3_Config"] | components["schemas"]["Main_Diffusers_LTX2_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_QwenImage_Config"] | components["schemas"]["Main_Checkpoint_QwenImage21_Config"] | components["schemas"]["Main_Checkpoint_Wan_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_ErnieImage_Config"] | components["schemas"]["Main_Checkpoint_Ideogram4_Config"] | components["schemas"]["Main_Checkpoint_Krea2_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Main_Checkpoint_LTX2_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_QwenImage21_Config"] | components["schemas"]["Main_GGUF_Wan_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["Main_GGUF_Krea2_Config"] | components["schemas"]["Main_GGUF_Ideogram4_Config"] | components["schemas"]["Main_GGUF_ErnieImage_Config"] | components["schemas"]["Main_SDNQ_Diffusers_Flux2_Config"] | components["schemas"]["Main_SDNQ_Diffusers_FLUX_Config"] | components["schemas"]["Main_SDNQ_Diffusers_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_SD3_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_Wan_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage21_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_FLUX_Config"] | components["schemas"]["VAE_Diffusers_SD3_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["VAE_Diffusers_Wan_Config"] | components["schemas"]["VAE_Diffusers_QwenImage21_Config"] | components["schemas"]["PiDDecoder_Checkpoint_FLUX_Config"] | components["schemas"]["PiDDecoder_Checkpoint_Flux2_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SD3_Config"] | components["schemas"]["PiDDecoder_Checkpoint_SDXL_Config"] | components["schemas"]["PiDDecoder_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Anima_Config"] | components["schemas"]["ControlNet_Checkpoint_QwenImage_Config"] | components["schemas"]["ControlNet_Checkpoint_Flux2_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_Krea2_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_LTX2_Config"] | components["schemas"]["LoRA_LyCORIS_MiniMaxH3_Config"] | components["schemas"]["LoRA_LyCORIS_Wan_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["T5Encoder_SDNQ_Config"] | components["schemas"]["T5Encoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_MiniMaxH3_Config"] | components["schemas"]["Qwen3VLEncoder_Checkpoint_Config"] | components["schemas"]["Qwen3VLEncoder_GGUF_Config"] | components["schemas"]["Qwen3VLEncoder_Qwen3VLEncoder_Config"] | components["schemas"]["Qwen35Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["Qwen3Encoder_SDNQ_Folder_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["Gemma2Encoder_Gemma2Encoder_Config"] | components["schemas"]["Gemma4Encoder_Gemma4Encoder_LTX2_Config"] | components["schemas"]["Gemma2Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["WanT5Encoder_WanT5Encoder_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_G_Config"] | components["schemas"]["CLIPEmbed_Checkpoint_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LTX2DurationHead_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; }; /** @description Bad request */ diff --git a/invokeai/frontend/webv2/public/locales/en.json b/invokeai/frontend/webv2/public/locales/en.json index 9736510fcf8..8f62e1551c9 100644 --- a/invokeai/frontend/webv2/public/locales/en.json +++ b/invokeai/frontend/webv2/public/locales/en.json @@ -3778,6 +3778,7 @@ "anima_lllite": "Anima ControlNet-LLLite", "control_lora": "Control LoRA", "controlnet": "ControlNet", + "flux2_control": "FLUX.2 [dev] ControlNet", "qwen_image_control": "Qwen Image ControlNet", "t2i_adapter": "T2I Adapter", "z_image_control": "Z-Image ControlNet" @@ -3800,6 +3801,8 @@ "capabilities_unavailable": "waiting for model capabilities to load.", "control_lora_limit": "Only one Control LoRA can be used at a time.", "duplicate_lllite_model": "Another control layer already uses this ControlNet-LLLite model; each can be applied once per generation.", + "flux2_control_limit": "Only one FLUX.2 [dev] ControlNet can be used at a time.", + "flux2_klein_control": "FLUX.2 [dev] ControlNet is not compatible with FLUX.2 Klein models.", "flux_fill_control_lora": "Control LoRA is not compatible with FLUX Fill.", "incompatible_adapter": "The selected model does not match this adapter type.", "incompatible_base": "The control model is incompatible with the selected base model.", diff --git a/invokeai/frontend/webv2/src/features/generation/core/__fixtures__/architectureCapabilities.json b/invokeai/frontend/webv2/src/features/generation/core/__fixtures__/architectureCapabilities.json index 89bbf689e3c..011566f5018 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/__fixtures__/architectureCapabilities.json +++ b/invokeai/frontend/webv2/src/features/generation/core/__fixtures__/architectureCapabilities.json @@ -350,7 +350,9 @@ "guidance_max": 20.0, "scheduler_set": "flow", "scheduler_applies_to_graph": true, - "control_kinds": [], + "control_kinds": [ + "flux2_control" + ], "max_reference_images": 5, "reference_images_require_variant": null, "supports_regional_guidance": true, @@ -391,7 +393,9 @@ "guidance_max": 20.0, "scheduler_set": "flow", "scheduler_applies_to_graph": true, - "control_kinds": [], + "control_kinds": [ + "flux2_control" + ], "max_reference_images": 5, "reference_images_require_variant": null, "supports_regional_guidance": true, @@ -432,7 +436,9 @@ "guidance_max": 20.0, "scheduler_set": "flow", "scheduler_applies_to_graph": true, - "control_kinds": [], + "control_kinds": [ + "flux2_control" + ], "max_reference_images": 5, "reference_images_require_variant": null, "supports_regional_guidance": true, @@ -473,7 +479,9 @@ "guidance_max": 20.0, "scheduler_set": "flow", "scheduler_applies_to_graph": true, - "control_kinds": [], + "control_kinds": [ + "flux2_control" + ], "max_reference_images": 5, "reference_images_require_variant": null, "supports_regional_guidance": true, diff --git a/invokeai/frontend/webv2/src/features/generation/core/__snapshots__/flux2ControlCanvasGraphs.json b/invokeai/frontend/webv2/src/features/generation/core/__snapshots__/flux2ControlCanvasGraphs.json new file mode 100644 index 00000000000..53982380225 --- /dev/null +++ b/invokeai/frontend/webv2/src/features/generation/core/__snapshots__/flux2ControlCanvasGraphs.json @@ -0,0 +1,1141 @@ +{ + "_comment": "Generated by compileCanvasGraph.test.ts; regenerate with `vitest -u`. Consumed by tests/app/invocations/test_frontend_fun_control_graphs.py, which validates the graphs against the backend invocations.", + "inpaint_control_layer": { + "edges": [ + { + "destination": { + "field": "vae", + "node_id": "canvas_l2i" + }, + "source": { + "field": "vae", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "latents", + "node_id": "canvas_l2i" + }, + "source": { + "field": "latents", + "node_id": "denoise_latents" + } + }, + { + "destination": { + "field": "mistral_encoder", + "node_id": "pos_cond" + }, + "source": { + "field": "mistral_encoder", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "max_seq_len", + "node_id": "pos_cond" + }, + "source": { + "field": "max_seq_len", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "transformer", + "node_id": "denoise_latents" + }, + "source": { + "field": "transformer", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "vae", + "node_id": "denoise_latents" + }, + "source": { + "field": "vae", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "prompt", + "node_id": "pos_cond" + }, + "source": { + "field": "value", + "node_id": "positive_prompt" + } + }, + { + "destination": { + "field": "item", + "node_id": "pos_cond_collect" + }, + "source": { + "field": "conditioning", + "node_id": "pos_cond" + } + }, + { + "destination": { + "field": "positive_text_conditioning", + "node_id": "denoise_latents" + }, + "source": { + "field": "collection", + "node_id": "pos_cond_collect" + } + }, + { + "destination": { + "field": "seed", + "node_id": "denoise_latents" + }, + "source": { + "field": "value", + "node_id": "seed" + } + }, + { + "destination": { + "field": "seed", + "node_id": "core_metadata_0_i" + }, + "source": { + "field": "value", + "node_id": "seed" + } + }, + { + "destination": { + "field": "positive_prompt", + "node_id": "core_metadata_0_i" + }, + "source": { + "field": "value", + "node_id": "positive_prompt" + } + }, + { + "destination": { + "field": "negative_prompt", + "node_id": "core_metadata_0_i" + }, + "source": { + "field": "value", + "node_id": "negative_prompt" + } + }, + { + "destination": { + "field": "metadata", + "node_id": "canvas_output" + }, + "source": { + "field": "metadata", + "node_id": "core_metadata_0_i" + } + }, + { + "destination": { + "field": "vae", + "node_id": "canvas_i2l" + }, + "source": { + "field": "vae", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "latents", + "node_id": "denoise_latents" + }, + "source": { + "field": "latents", + "node_id": "canvas_i2l" + } + }, + { + "destination": { + "field": "vae", + "node_id": "create_gradient_mask" + }, + "source": { + "field": "vae", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "denoise_mask", + "node_id": "denoise_latents" + }, + "source": { + "field": "denoise_mask", + "node_id": "create_gradient_mask" + } + }, + { + "destination": { + "field": "mask", + "node_id": "expand_mask" + }, + "source": { + "field": "expanded_mask_area", + "node_id": "create_gradient_mask" + } + }, + { + "destination": { + "field": "layer_upper", + "node_id": "canvas_output" + }, + "source": { + "field": "image", + "node_id": "canvas_l2i" + } + }, + { + "destination": { + "field": "mask", + "node_id": "canvas_output" + }, + "source": { + "field": "image", + "node_id": "expand_mask" + } + }, + { + "destination": { + "field": "inpaint_mask", + "node_id": "flux2_control_f-control" + }, + "source": { + "field": "image", + "node_id": "flux2_control_mask_f-control" + } + }, + { + "destination": { + "field": "control", + "node_id": "denoise_latents" + }, + "source": { + "field": "control", + "node_id": "flux2_control_f-control" + } + } + ], + "id": "flux2_control_canvas_inpaint", + "nodes": { + "negative_prompt": { + "is_intermediate": true, + "use_cache": true, + "id": "negative_prompt", + "type": "string" + }, + "positive_prompt": { + "is_intermediate": true, + "use_cache": true, + "id": "positive_prompt", + "type": "string" + }, + "seed": { + "is_intermediate": true, + "use_cache": true, + "id": "seed", + "type": "integer" + }, + "model_loader": { + "is_intermediate": true, + "use_cache": true, + "id": "model_loader", + "model": { + "base": "flux2", + "format": "diffusers", + "key": "flux2-dev-model", + "name": "FLUX.2 [dev]", + "type": "main", + "variant": "dev", + "hash": "blake3:flux2-dev" + }, + "type": "flux2_dev_model_loader" + }, + "pos_cond": { + "is_intermediate": true, + "use_cache": true, + "id": "pos_cond", + "type": "flux2_dev_text_encoder" + }, + "pos_cond_collect": { + "is_intermediate": true, + "use_cache": true, + "id": "pos_cond_collect", + "type": "collect" + }, + "denoise_latents": { + "is_intermediate": true, + "use_cache": true, + "cfg_scale": 1, + "denoising_end": 1, + "denoising_start": 0.09711954855256577, + "guidance": 3.5, + "height": 1024, + "id": "denoise_latents", + "num_steps": 28, + "scheduler": "euler", + "type": "flux2_denoise", + "width": 768 + }, + "core_metadata_0_i": { + "is_intermediate": true, + "use_cache": true, + "cfg_scale": 3.5, + "cfg_rescale_multiplier": 0, + "generation_mode": "flux2_inpaint", + "height": 1024, + "id": "core_metadata_0_i", + "model": { + "base": "flux2", + "format": "diffusers", + "key": "flux2-dev-model", + "name": "FLUX.2 [dev]", + "type": "main", + "variant": "dev", + "hash": "blake3:flux2-dev" + }, + "rand_device": "cpu", + "scheduler": "euler", + "seamless_x": false, + "seamless_y": false, + "steps": 28, + "type": "core_metadata", + "width": 768, + "clip_skip": 0, + "strength": 0.6 + }, + "canvas_i2l": { + "is_intermediate": true, + "use_cache": true, + "id": "canvas_i2l", + "type": "flux2_vae_encode", + "image": { + "image_name": "canvas-composite.png" + } + }, + "create_gradient_mask": { + "is_intermediate": true, + "use_cache": true, + "coherence_mode": "Gaussian Blur", + "edge_radius": 16, + "fp32": false, + "id": "create_gradient_mask", + "image": { + "image_name": "canvas-composite.png" + }, + "minimum_denoise": 0, + "type": "create_gradient_mask", + "mask": { + "image_name": "canvas-mask.png" + } + }, + "expand_mask": { + "is_intermediate": true, + "use_cache": true, + "fade_size_px": 16, + "id": "expand_mask", + "type": "expand_mask_with_fade" + }, + "canvas_l2i": { + "is_intermediate": true, + "use_cache": false, + "id": "canvas_l2i", + "type": "flux2_vae_decode" + }, + "canvas_output": { + "is_intermediate": true, + "use_cache": false, + "layer_base": { + "image_name": "canvas-composite.png" + }, + "type": "invokeai_img_blend", + "id": "canvas_output" + }, + "flux2_control_f-control": { + "is_intermediate": true, + "use_cache": true, + "begin_step_percent": 0, + "control_context_scale": 0.75, + "control_model": { + "base": "flux2", + "key": "flux2-union", + "name": "FLUX.2 [dev] ControlNet Union", + "type": "controlnet", + "hash": "blake3:union" + }, + "end_step_percent": 1, + "id": "flux2_control_f-control", + "image": { + "image_name": "f-control.png" + }, + "type": "flux2_control", + "inpaint_image": { + "image_name": "canvas-composite.png" + } + }, + "flux2_control_mask_f-control": { + "is_intermediate": true, + "use_cache": true, + "id": "flux2_control_mask_f-control", + "max": 0, + "min": 255, + "type": "img_lerp", + "image": { + "image_name": "canvas-mask.png" + } + } + } + }, + "outpaint_control_layer": { + "edges": [ + { + "destination": { + "field": "vae", + "node_id": "canvas_l2i" + }, + "source": { + "field": "vae", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "latents", + "node_id": "canvas_l2i" + }, + "source": { + "field": "latents", + "node_id": "denoise_latents" + } + }, + { + "destination": { + "field": "mistral_encoder", + "node_id": "pos_cond" + }, + "source": { + "field": "mistral_encoder", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "max_seq_len", + "node_id": "pos_cond" + }, + "source": { + "field": "max_seq_len", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "transformer", + "node_id": "denoise_latents" + }, + "source": { + "field": "transformer", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "vae", + "node_id": "denoise_latents" + }, + "source": { + "field": "vae", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "prompt", + "node_id": "pos_cond" + }, + "source": { + "field": "value", + "node_id": "positive_prompt" + } + }, + { + "destination": { + "field": "item", + "node_id": "pos_cond_collect" + }, + "source": { + "field": "conditioning", + "node_id": "pos_cond" + } + }, + { + "destination": { + "field": "positive_text_conditioning", + "node_id": "denoise_latents" + }, + "source": { + "field": "collection", + "node_id": "pos_cond_collect" + } + }, + { + "destination": { + "field": "seed", + "node_id": "denoise_latents" + }, + "source": { + "field": "value", + "node_id": "seed" + } + }, + { + "destination": { + "field": "seed", + "node_id": "core_metadata_0_i" + }, + "source": { + "field": "value", + "node_id": "seed" + } + }, + { + "destination": { + "field": "positive_prompt", + "node_id": "core_metadata_0_i" + }, + "source": { + "field": "value", + "node_id": "positive_prompt" + } + }, + { + "destination": { + "field": "negative_prompt", + "node_id": "core_metadata_0_i" + }, + "source": { + "field": "value", + "node_id": "negative_prompt" + } + }, + { + "destination": { + "field": "metadata", + "node_id": "canvas_output" + }, + "source": { + "field": "metadata", + "node_id": "core_metadata_0_i" + } + }, + { + "destination": { + "field": "mask2", + "node_id": "mask_combine" + }, + "source": { + "field": "image", + "node_id": "image_alpha_to_mask" + } + }, + { + "destination": { + "field": "image", + "node_id": "canvas_i2l" + }, + "source": { + "field": "image", + "node_id": "infill" + } + }, + { + "destination": { + "field": "vae", + "node_id": "canvas_i2l" + }, + "source": { + "field": "vae", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "latents", + "node_id": "denoise_latents" + }, + "source": { + "field": "latents", + "node_id": "canvas_i2l" + } + }, + { + "destination": { + "field": "mask", + "node_id": "create_gradient_mask" + }, + "source": { + "field": "image", + "node_id": "mask_combine" + } + }, + { + "destination": { + "field": "vae", + "node_id": "create_gradient_mask" + }, + "source": { + "field": "vae", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "denoise_mask", + "node_id": "denoise_latents" + }, + "source": { + "field": "denoise_mask", + "node_id": "create_gradient_mask" + } + }, + { + "destination": { + "field": "mask", + "node_id": "expand_mask" + }, + "source": { + "field": "expanded_mask_area", + "node_id": "create_gradient_mask" + } + }, + { + "destination": { + "field": "layer_upper", + "node_id": "canvas_output" + }, + "source": { + "field": "image", + "node_id": "canvas_l2i" + } + }, + { + "destination": { + "field": "mask", + "node_id": "canvas_output" + }, + "source": { + "field": "image", + "node_id": "expand_mask" + } + }, + { + "destination": { + "field": "image", + "node_id": "flux2_control_mask_f-control" + }, + "source": { + "field": "image", + "node_id": "mask_combine" + } + }, + { + "destination": { + "field": "inpaint_image", + "node_id": "flux2_control_f-control" + }, + "source": { + "field": "image", + "node_id": "infill" + } + }, + { + "destination": { + "field": "inpaint_mask", + "node_id": "flux2_control_f-control" + }, + "source": { + "field": "image", + "node_id": "flux2_control_mask_f-control" + } + }, + { + "destination": { + "field": "control", + "node_id": "denoise_latents" + }, + "source": { + "field": "control", + "node_id": "flux2_control_f-control" + } + } + ], + "id": "flux2_control_canvas_outpaint", + "nodes": { + "negative_prompt": { + "is_intermediate": true, + "use_cache": true, + "id": "negative_prompt", + "type": "string" + }, + "positive_prompt": { + "is_intermediate": true, + "use_cache": true, + "id": "positive_prompt", + "type": "string" + }, + "seed": { + "is_intermediate": true, + "use_cache": true, + "id": "seed", + "type": "integer" + }, + "model_loader": { + "is_intermediate": true, + "use_cache": true, + "id": "model_loader", + "model": { + "base": "flux2", + "format": "diffusers", + "key": "flux2-dev-model", + "name": "FLUX.2 [dev]", + "type": "main", + "variant": "dev", + "hash": "blake3:flux2-dev" + }, + "type": "flux2_dev_model_loader" + }, + "pos_cond": { + "is_intermediate": true, + "use_cache": true, + "id": "pos_cond", + "type": "flux2_dev_text_encoder" + }, + "pos_cond_collect": { + "is_intermediate": true, + "use_cache": true, + "id": "pos_cond_collect", + "type": "collect" + }, + "denoise_latents": { + "is_intermediate": true, + "use_cache": true, + "cfg_scale": 1, + "denoising_end": 1, + "denoising_start": 0.09711954855256577, + "guidance": 3.5, + "height": 1024, + "id": "denoise_latents", + "num_steps": 28, + "scheduler": "euler", + "type": "flux2_denoise", + "width": 768 + }, + "core_metadata_0_i": { + "is_intermediate": true, + "use_cache": true, + "cfg_scale": 3.5, + "cfg_rescale_multiplier": 0, + "generation_mode": "flux2_outpaint", + "height": 1024, + "id": "core_metadata_0_i", + "model": { + "base": "flux2", + "format": "diffusers", + "key": "flux2-dev-model", + "name": "FLUX.2 [dev]", + "type": "main", + "variant": "dev", + "hash": "blake3:flux2-dev" + }, + "rand_device": "cpu", + "scheduler": "euler", + "seamless_x": false, + "seamless_y": false, + "steps": 28, + "type": "core_metadata", + "width": 768, + "clip_skip": 0, + "strength": 0.6 + }, + "infill": { + "is_intermediate": true, + "use_cache": true, + "id": "infill", + "type": "infill_lama", + "image": { + "image_name": "canvas-composite.png" + } + }, + "image_alpha_to_mask": { + "is_intermediate": true, + "use_cache": true, + "id": "image_alpha_to_mask", + "image": { + "image_name": "canvas-composite.png" + }, + "type": "tomask" + }, + "mask_combine": { + "is_intermediate": true, + "use_cache": true, + "id": "mask_combine", + "mask1": { + "image_name": "canvas-mask.png" + }, + "type": "mask_combine" + }, + "canvas_i2l": { + "is_intermediate": true, + "use_cache": true, + "id": "canvas_i2l", + "type": "flux2_vae_encode" + }, + "create_gradient_mask": { + "is_intermediate": true, + "use_cache": true, + "coherence_mode": "Gaussian Blur", + "edge_radius": 16, + "fp32": false, + "id": "create_gradient_mask", + "image": { + "image_name": "canvas-composite.png" + }, + "minimum_denoise": 0, + "type": "create_gradient_mask" + }, + "expand_mask": { + "is_intermediate": true, + "use_cache": true, + "fade_size_px": 16, + "id": "expand_mask", + "type": "expand_mask_with_fade" + }, + "canvas_l2i": { + "is_intermediate": true, + "use_cache": false, + "id": "canvas_l2i", + "type": "flux2_vae_decode" + }, + "canvas_output": { + "is_intermediate": true, + "use_cache": false, + "layer_base": { + "image_name": "canvas-composite.png" + }, + "type": "invokeai_img_blend", + "id": "canvas_output" + }, + "flux2_control_f-control": { + "is_intermediate": true, + "use_cache": true, + "begin_step_percent": 0, + "control_context_scale": 0.75, + "control_model": { + "base": "flux2", + "key": "flux2-union", + "name": "FLUX.2 [dev] ControlNet Union", + "type": "controlnet", + "hash": "blake3:union" + }, + "end_step_percent": 1, + "id": "flux2_control_f-control", + "image": { + "image_name": "f-control.png" + }, + "type": "flux2_control" + }, + "flux2_control_mask_f-control": { + "is_intermediate": true, + "use_cache": true, + "id": "flux2_control_mask_f-control", + "max": 0, + "min": 255, + "type": "img_lerp" + } + } + }, + "txt2img_control_layer": { + "edges": [ + { + "destination": { + "field": "vae", + "node_id": "canvas_output" + }, + "source": { + "field": "vae", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "latents", + "node_id": "canvas_output" + }, + "source": { + "field": "latents", + "node_id": "denoise_latents" + } + }, + { + "destination": { + "field": "mistral_encoder", + "node_id": "pos_cond" + }, + "source": { + "field": "mistral_encoder", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "max_seq_len", + "node_id": "pos_cond" + }, + "source": { + "field": "max_seq_len", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "transformer", + "node_id": "denoise_latents" + }, + "source": { + "field": "transformer", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "vae", + "node_id": "denoise_latents" + }, + "source": { + "field": "vae", + "node_id": "model_loader" + } + }, + { + "destination": { + "field": "prompt", + "node_id": "pos_cond" + }, + "source": { + "field": "value", + "node_id": "positive_prompt" + } + }, + { + "destination": { + "field": "item", + "node_id": "pos_cond_collect" + }, + "source": { + "field": "conditioning", + "node_id": "pos_cond" + } + }, + { + "destination": { + "field": "positive_text_conditioning", + "node_id": "denoise_latents" + }, + "source": { + "field": "collection", + "node_id": "pos_cond_collect" + } + }, + { + "destination": { + "field": "seed", + "node_id": "denoise_latents" + }, + "source": { + "field": "value", + "node_id": "seed" + } + }, + { + "destination": { + "field": "seed", + "node_id": "core_metadata_0_i" + }, + "source": { + "field": "value", + "node_id": "seed" + } + }, + { + "destination": { + "field": "positive_prompt", + "node_id": "core_metadata_0_i" + }, + "source": { + "field": "value", + "node_id": "positive_prompt" + } + }, + { + "destination": { + "field": "negative_prompt", + "node_id": "core_metadata_0_i" + }, + "source": { + "field": "value", + "node_id": "negative_prompt" + } + }, + { + "destination": { + "field": "metadata", + "node_id": "canvas_output" + }, + "source": { + "field": "metadata", + "node_id": "core_metadata_0_i" + } + }, + { + "destination": { + "field": "control", + "node_id": "denoise_latents" + }, + "source": { + "field": "control", + "node_id": "flux2_control_f-control" + } + } + ], + "id": "flux2_control_canvas_txt2img", + "nodes": { + "negative_prompt": { + "is_intermediate": true, + "use_cache": true, + "id": "negative_prompt", + "type": "string" + }, + "positive_prompt": { + "is_intermediate": true, + "use_cache": true, + "id": "positive_prompt", + "type": "string" + }, + "seed": { + "is_intermediate": true, + "use_cache": true, + "id": "seed", + "type": "integer" + }, + "model_loader": { + "is_intermediate": true, + "use_cache": true, + "id": "model_loader", + "model": { + "base": "flux2", + "format": "diffusers", + "key": "flux2-dev-model", + "name": "FLUX.2 [dev]", + "type": "main", + "variant": "dev", + "hash": "blake3:flux2-dev" + }, + "type": "flux2_dev_model_loader" + }, + "pos_cond": { + "is_intermediate": true, + "use_cache": true, + "id": "pos_cond", + "type": "flux2_dev_text_encoder" + }, + "pos_cond_collect": { + "is_intermediate": true, + "use_cache": true, + "id": "pos_cond_collect", + "type": "collect" + }, + "denoise_latents": { + "is_intermediate": true, + "use_cache": true, + "cfg_scale": 1, + "denoising_end": 1, + "denoising_start": 0, + "guidance": 3.5, + "height": 1024, + "id": "denoise_latents", + "num_steps": 28, + "scheduler": "euler", + "type": "flux2_denoise", + "width": 768 + }, + "canvas_output": { + "is_intermediate": true, + "use_cache": false, + "id": "canvas_output", + "type": "flux2_vae_decode" + }, + "core_metadata_0_i": { + "is_intermediate": true, + "use_cache": true, + "cfg_scale": 3.5, + "cfg_rescale_multiplier": 0, + "generation_mode": "flux2_txt2img", + "height": 1024, + "id": "core_metadata_0_i", + "model": { + "base": "flux2", + "format": "diffusers", + "key": "flux2-dev-model", + "name": "FLUX.2 [dev]", + "type": "main", + "variant": "dev", + "hash": "blake3:flux2-dev" + }, + "rand_device": "cpu", + "scheduler": "euler", + "seamless_x": false, + "seamless_y": false, + "steps": 28, + "type": "core_metadata", + "width": 768, + "clip_skip": 0 + }, + "flux2_control_f-control": { + "is_intermediate": true, + "use_cache": true, + "begin_step_percent": 0, + "control_context_scale": 0.75, + "control_model": { + "base": "flux2", + "key": "flux2-union", + "name": "FLUX.2 [dev] ControlNet Union", + "type": "controlnet", + "hash": "blake3:union" + }, + "end_step_percent": 1, + "id": "flux2_control_f-control", + "image": { + "image_name": "f-control.png" + }, + "type": "flux2_control" + } + } + } +} diff --git a/invokeai/frontend/webv2/src/features/generation/core/__snapshots__/qwenImageControlCanvasGraphs.json b/invokeai/frontend/webv2/src/features/generation/core/__snapshots__/qwenImageControlCanvasGraphs.json index 19fd1898747..e1a3d2badfd 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/__snapshots__/qwenImageControlCanvasGraphs.json +++ b/invokeai/frontend/webv2/src/features/generation/core/__snapshots__/qwenImageControlCanvasGraphs.json @@ -1,5 +1,5 @@ { - "_comment": "Generated by compileCanvasGraph.test.ts; regenerate with `vitest -u`. Consumed by tests/app/invocations/test_frontend_qwen_image_control_graphs.py, which validates the graphs against the backend invocations.", + "_comment": "Generated by compileCanvasGraph.test.ts; regenerate with `vitest -u`. Consumed by tests/app/invocations/test_frontend_fun_control_graphs.py, which validates the graphs against the backend invocations.", "inpaint_control_layer": { "edges": [ { diff --git a/invokeai/frontend/webv2/src/features/generation/core/architectureCapabilities.test.ts b/invokeai/frontend/webv2/src/features/generation/core/architectureCapabilities.test.ts index d04352ee1c4..ad938a9b9dc 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/architectureCapabilities.test.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/architectureCapabilities.test.ts @@ -118,6 +118,7 @@ describe('the registry', () => { expect(getArchitectureFeatures('sd-1')?.control_kinds).toEqual(['controlnet', 't2i_adapter']); expect(getArchitectureFeatures('z-image')?.control_kinds).toEqual(['z_image_control']); expect(getArchitectureFeatures('qwen-image')?.control_kinds).toEqual(['qwen_image_control']); + expect(getArchitectureFeatures('flux2')?.control_kinds).toEqual(['flux2_control']); expect(getArchitectureFeatures('made-up')).toBeUndefined(); }); diff --git a/invokeai/frontend/webv2/src/features/generation/core/canvas/addControlLayers.test.ts b/invokeai/frontend/webv2/src/features/generation/core/canvas/addControlLayers.test.ts index 82caeb025d7..7312b1a8147 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/canvas/addControlLayers.test.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/canvas/addControlLayers.test.ts @@ -83,6 +83,13 @@ describe('isControlKindSupportedForBase', () => { expect(isControlKindSupportedForBase('qwen-image', 'z_image_control')).toBe(false); }); + it('flux2_control is supported on flux2 only, which supports nothing else', () => { + expect(isControlKindSupportedForBase('flux2', 'flux2_control')).toBe(true); + expect(isControlKindSupportedForBase('qwen-image', 'flux2_control')).toBe(false); + expect(isControlKindSupportedForBase('flux2', 'controlnet')).toBe(false); + expect(isControlKindSupportedForBase('flux2', 'qwen_image_control')).toBe(false); + }); + it('control_lora is supported on flux only', () => { expect(isControlKindSupportedForBase('flux', 'control_lora')).toBe(true); expect(isControlKindSupportedForBase('sd-1', 'control_lora')).toBe(false); @@ -476,6 +483,91 @@ describe('addControlLayers — Qwen-Image control', () => { }); }); +describe('addControlLayers — FLUX.2 control', () => { + const union = model('flux2', 'controlnet'); + const flux2Layer = (id: string, overrides: Partial = {}) => + layer({ + beginEndStepPct: [0, 1], + controlMode: null, + id, + imageName: `${id}.png`, + kind: 'flux2_control', + model: union, + weight: 0.75, + ...overrides, + }); + const dev = { base: 'flux2', modelVariant: 'dev' } as const; + + it('creates the exact backend node and connects it directly to the FLUX.2 denoise', () => { + const graph = run({ + ...dev, + layers: [flux2Layer('F1', { beginEndStepPct: [0.1, 0.8], imageName: 'depth.png', weight: 0.65 })], + }); + + expect(graph.nodes.flux2_control_F1).toEqual({ + begin_step_percent: 0.1, + control_context_scale: 0.65, + control_model: union, + end_step_percent: 0.8, + id: 'flux2_control_F1', + image: { image_name: 'depth.png' }, + is_intermediate: true, + type: 'flux2_control', + use_cache: true, + }); + expect(graph.edges).toEqual([ + { + destination: { field: 'control', node_id: 'denoise_latents' }, + source: { field: 'control', node_id: 'flux2_control_F1' }, + }, + ]); + expect(Object.keys(graph.nodes)).toEqual(['denoise_latents', 'flux2_control_F1']); + }); + + it('feeds the inpaint image and the inverted canvas mask, as the Qwen-Image union takes them', () => { + const graph = run({ + ...dev, + inpaint: { image: { image_name: 'composite.png' }, mask: { image_name: 'canvas-mask.png' } }, + layers: [flux2Layer('F1')], + }); + + expect(graph.nodes.flux2_control_F1).toMatchObject({ inpaint_image: { image_name: 'composite.png' } }); + // The canvas mask is white = keep; the node regenerates white, so 255 → 0 inverts it. + expect(graph.nodes.flux2_control_mask_F1).toEqual({ + id: 'flux2_control_mask_F1', + image: { image_name: 'canvas-mask.png' }, + is_intermediate: true, + max: 0, + min: 255, + type: 'img_lerp', + use_cache: true, + }); + expect(edgesTo(graph, 'flux2_control_F1', 'inpaint_mask').map((edge) => edge.source)).toEqual([ + { field: 'image', node_id: 'flux2_control_mask_F1' }, + ]); + }); + + it('rejects a second FLUX.2 control because the denoise accepts a single field', () => { + expect(() => run({ ...dev, layers: [flux2Layer('F1'), flux2Layer('F2')] })).toThrow(/flux2_control_limit/); + }); + + it.each(['klein_9b', 'klein_4b_base', undefined])( + 'rejects the control on FLUX.2 variant %s, whose transformer the denoise refuses to control', + (modelVariant) => { + expect(() => run({ base: 'flux2', layers: [flux2Layer('F1')], modelVariant })).toThrow(/flux2_klein_control/); + } + ); + + it.each([ + [{ weight: -0.01 }, /invalid_adapter_values/], + [{ model: model('flux', 'controlnet') }, /incompatible_base/], + [{ model: model('flux2', 'lora') }, /incompatible_adapter/], + [{ kind: 'qwen_image_control' as const }, /switch_adapter_kind/], + ])('rejects %o', (overrides, reason) => { + expect(() => run({ ...dev, layers: [flux2Layer('F1', overrides)] })).toThrow(reason); + }); +}); + describe('addControlLayers — Anima ControlNet-LLLite', () => { const lllite = (key: string): ControlModelIdentifier => ({ base: 'anima', diff --git a/invokeai/frontend/webv2/src/features/generation/core/canvas/addControlLayers.ts b/invokeai/frontend/webv2/src/features/generation/core/canvas/addControlLayers.ts index 9ed4549d6dd..fe080f9c8ac 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/canvas/addControlLayers.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/canvas/addControlLayers.ts @@ -75,17 +75,57 @@ const feedImage = ( export interface AddControlLayersOptions { /** The main model base — selects the adapter nodes and support. */ base: SupportedGenerateBase; - /** The main model variant (a FLUX `dev_fill` blocks Control LoRA; a Qwen-Image `edit` blocks its control). */ + /** + * The main model variant (a FLUX `dev_fill` blocks Control LoRA; a Qwen-Image `edit` blocks its control; FLUX.2's + * control needs `dev`). + */ modelVariant?: string; /** The valid, resolved control layers to graft (in document order). */ layers: readonly ControlLayerGraphInput[]; /** - * Present when the canvas compiles in inpaint or outpaint mode. The Qwen-Image control node also conditions on - * the inpainted region and takes them; the other kinds ignore them. + * Present when the canvas compiles in inpaint or outpaint mode. The Qwen-Image and FLUX.2 control nodes also + * condition on the inpainted region and take them; the other kinds ignore them. */ inpaint?: CanvasInpaintSources; } +/** + * The Fun-ControlNet-Union nodes (`qwen_image_control`, `flux2_control`): the control image, plus the region being + * regenerated when the canvas inpaints or outpaints, wired straight to the denoise's single `control` field. + * Validation admits one per generation, so there is no collector. + */ +const addFunUnionControl = ( + graph: BackendGraphContract, + denoise: BackendInvocationContract, + layer: ControlLayerGraphInput, + type: 'qwen_image_control' | 'flux2_control', + inpaint: CanvasInpaintSources | undefined +): void => { + const node = addNode(graph, { + begin_step_percent: layer.beginEndStepPct[0], + control_context_scale: layer.weight, + control_model: layer.model, + end_step_percent: layer.beginEndStepPct[1], + id: `${type}_${layer.id}`, + image: { image_name: layer.imageName }, + type, + }); + if (inpaint) { + // The union's inpainting condition. The canvas mask is white = keep and the node wants white = regenerate, + // so `img_lerp` 255 → 0 inverts it first, as the Anima inpaint adapter does. + const invertMask = addNode(graph, { + id: `${type}_mask_${layer.id}`, + max: 0, + min: 255, + type: 'img_lerp', + }); + feedImage(graph, invertMask, 'image', inpaint.mask); + feedImage(graph, node, 'inpaint_image', inpaint.image); + addEdge(graph, invertMask, 'image', node, 'inpaint_mask'); + } + addEdge(graph, node, 'control', denoise, 'control'); +}; + /** * The one collector every Anima ControlNet-LLLite adapter joins. `anima_denoise.control_lllite` takes one field or a * list, and the denoiser applies each model once, so control layers and the canvas inpaint adapter share it. @@ -192,31 +232,8 @@ export const addControlLayers = (graph: BackendGraphContract, options: AddContro weight: layer.weight, }); addEdge(graph, node, 'control', getOrAddLliteCollector(graph, denoise), 'item'); - } else if (layer.kind === 'qwen_image_control') { - // One field on the denoise, no collector: validation admits a single Qwen-Image control per generation. - const node = addNode(graph, { - begin_step_percent: layer.beginEndStepPct[0], - control_context_scale: layer.weight, - control_model: layer.model, - end_step_percent: layer.beginEndStepPct[1], - id: `qwen_image_control_${layer.id}`, - image: { image_name: layer.imageName }, - type: 'qwen_image_control', - }); - if (inpaint) { - // The union's inpainting condition. The canvas mask is white = keep and the node wants white = regenerate, - // so `img_lerp` 255 → 0 inverts it first, as the Anima inpaint adapter does. - const invertMask = addNode(graph, { - id: `qwen_image_control_mask_${layer.id}`, - max: 0, - min: 255, - type: 'img_lerp', - }); - feedImage(graph, invertMask, 'image', inpaint.mask); - feedImage(graph, node, 'inpaint_image', inpaint.image); - addEdge(graph, invertMask, 'image', node, 'inpaint_mask'); - } - addEdge(graph, node, 'control', denoise, 'control'); + } else if (layer.kind === 'qwen_image_control' || layer.kind === 'flux2_control') { + addFunUnionControl(graph, denoise, layer, layer.kind, inpaint); } else { const node = addNode(graph, { begin_step_percent: layer.beginEndStepPct[0], diff --git a/invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.test.ts b/invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.test.ts index 11218061889..bc3503f5896 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.test.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.test.ts @@ -1070,7 +1070,7 @@ describe('compileCanvasGraph — Qwen-Image ControlNet (integration)', () => { } const fixture = { _comment: - 'Generated by compileCanvasGraph.test.ts; regenerate with `vitest -u`. Consumed by tests/app/invocations/test_frontend_qwen_image_control_graphs.py, which validates the graphs against the backend invocations.', + 'Generated by compileCanvasGraph.test.ts; regenerate with `vitest -u`. Consumed by tests/app/invocations/test_frontend_fun_control_graphs.py, which validates the graphs against the backend invocations.', inpaint_control_layer: { ...inpaint, id: 'qwen_image_control_canvas_inpaint' }, outpaint_control_layer: { ...outpaint, id: 'qwen_image_control_canvas_outpaint' }, txt2img_control_layer: { ...txt2img, id: 'qwen_image_control_canvas_txt2img' }, @@ -1081,6 +1081,113 @@ describe('compileCanvasGraph — Qwen-Image ControlNet (integration)', () => { }); }); +describe('compileCanvasGraph — FLUX.2 [dev] ControlNet (integration)', () => { + const layer: ControlLayerGraphInput = { + beginEndStepPct: [0, 1], + controlMode: null, + id: 'f-control', + imageName: 'f-control.png', + kind: 'flux2_control', + model: { base: 'flux2', key: 'flux2-union', name: 'FLUX.2 [dev] ControlNet Union', type: 'controlnet' }, + weight: 0.75, + }; + const CONTROL = 'flux2_control_f-control'; + const MASK = 'flux2_control_mask_f-control'; + + it('grafts the control into the FLUX.2 [dev] base graph, whose denoise holds the VAE that encodes its images', () => { + const { backendGraph } = compile(flux2DevModel, 'txt2img', { controlLayers: [layer] }); + + expect(backendGraph.nodes.denoise_latents?.type).toBe('flux2_denoise'); + expect(backendGraph.nodes[CONTROL]).toMatchObject({ + begin_step_percent: 0, + control_context_scale: 0.75, + control_model: layer.model, + end_step_percent: 1, + image: { image_name: 'f-control.png' }, + type: 'flux2_control', + }); + expect(backendGraph.nodes[CONTROL]).not.toHaveProperty('inpaint_image'); + expect(backendGraph.nodes[MASK]).toBeUndefined(); + expect(getEdge(backendGraph, 'denoise_latents', 'control')?.source).toEqual({ field: 'control', node_id: CONTROL }); + expect(getEdge(backendGraph, 'denoise_latents', 'vae')?.source).toEqual({ field: 'vae', node_id: 'model_loader' }); + }); + + it('inpaint: the control also reads the composite and the inverted canvas mask the denoise is limited to', () => { + const { backendGraph } = compile(flux2DevModel, 'inpaint', { controlLayers: [layer] }); + + expect(backendGraph.nodes[CONTROL]).toMatchObject({ inpaint_image: { image_name: 'canvas-composite.png' } }); + expect(backendGraph.nodes[MASK]).toMatchObject({ image: { image_name: 'canvas-mask.png' }, max: 0, min: 255 }); + expect(getEdge(backendGraph, CONTROL, 'inpaint_mask')?.source.node_id).toBe(MASK); + // The denoise mask is untouched: the gradient mask still reads the uploaded canvas mask as is. + expect(backendGraph.nodes.create_gradient_mask?.mask).toEqual({ image_name: 'canvas-mask.png' }); + expect(getEdge(backendGraph, 'denoise_latents', 'denoise_mask')?.source.node_id).toBe('create_gradient_mask'); + }); + + it('inpaint with Scale Before Processing: the control reads the resized composite and mask', () => { + const { backendGraph } = compile(flux2DevModel, 'inpaint', { + bbox: { height: 888, width: 1025, x: 0, y: 0 }, + controlLayers: [layer], + }); + + expect(getEdge(backendGraph, CONTROL, 'inpaint_image')?.source.node_id).toBe('canvas_resize_initial_to_processing'); + expect(getEdge(backendGraph, MASK, 'image')?.source.node_id).toBe('canvas_resize_mask_to_processing'); + }); + + it('outpaint: the control reads the infilled image and the combined mask', () => { + const { backendGraph } = compile(flux2DevModel, 'outpaint', { + controlLayers: [layer], + maskImageName: 'canvas-mask.png', + }); + + expect(getEdge(backendGraph, CONTROL, 'inpaint_image')?.source.node_id).toBe('infill'); + expect(getEdge(backendGraph, MASK, 'image')?.source.node_id).toBe('mask_combine'); + expect(getEdge(backendGraph, CONTROL, 'inpaint_mask')?.source.node_id).toBe(MASK); + }); + + it('rejects the control on a FLUX.2 Klein 9B model, as the denoise does', () => { + expect(() => compile({ ...flux2Model, variant: 'klein_9b' }, 'inpaint', { controlLayers: [layer] })).toThrow( + /flux2_klein_control/ + ); + }); + + it('rejects the control on a FLUX.2 model whose variant is unknown, as the denoise does', () => { + expect(flux2Model.variant).toBeUndefined(); + expect(() => compile(flux2Model, 'inpaint', { controlLayers: [layer] })).toThrow(/flux2_klein_control/); + }); + + it('writes the graphs the backend validates against its invocations', async () => { + // Ids minted from the clock and Math.random are pinned so the fixture changes only when the graph does. + const clock = vi.spyOn(Date, 'now').mockReturnValue(0); + const random = vi.spyOn(Math, 'random').mockReturnValue(0.5); + // Installed models always carry a hash, which the backend's model identifier requires. + const hashed = (config: T, hash: string): T => ({ ...config, hash }); + const model = hashed(flux2DevModel, 'blake3:flux2-dev'); + const controlLayers = [{ ...layer, model: hashed(layer.model, 'blake3:union') }]; + let txt2img: BackendGraphContract; + let inpaint: BackendGraphContract; + let outpaint: BackendGraphContract; + try { + txt2img = compile(model, 'txt2img', { controlLayers }).backendGraph; + // Without Scale Before Processing the control reads the canvas uploads as fixed image fields. + inpaint = compile(model, 'inpaint', { controlLayers }).backendGraph; + // The infilled image and the combined mask reach the control through edges. + outpaint = compile(model, 'outpaint', { controlLayers, maskImageName: 'canvas-mask.png' }).backendGraph; + } finally { + clock.mockRestore(); + random.mockRestore(); + } + const fixture = { + _comment: + 'Generated by compileCanvasGraph.test.ts; regenerate with `vitest -u`. Consumed by tests/app/invocations/test_frontend_fun_control_graphs.py, which validates the graphs against the backend invocations.', + inpaint_control_layer: { ...inpaint, id: 'flux2_control_canvas_inpaint' }, + outpaint_control_layer: { ...outpaint, id: 'flux2_control_canvas_outpaint' }, + txt2img_control_layer: { ...txt2img, id: 'flux2_control_canvas_txt2img' }, + }; + await expect(`${JSON.stringify(fixture, null, 2)} +`).toMatchFileSnapshot('../__snapshots__/flux2ControlCanvasGraphs.json'); + }); +}); + describe('compileCanvasGraph — Anima ControlNet-LLLite (integration)', () => { const lliteLayer = (id: string, key: string, weight = 1): ControlLayerGraphInput => ({ beginEndStepPct: [0, 0.9], diff --git a/invokeai/frontend/webv2/src/features/generation/core/canvas/controlValidation.test.ts b/invokeai/frontend/webv2/src/features/generation/core/canvas/controlValidation.test.ts index c8b915a92b7..3ca83ae2300 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/canvas/controlValidation.test.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/canvas/controlValidation.test.ts @@ -148,6 +148,51 @@ describe('getControlValidationReason', () => { ).toBe('invalid_adapter_values'); }); + it('accepts only a FLUX.2 ControlNet model, and only on FLUX.2 [dev]', () => { + const dev = { + adapterModel: { base: 'flux2', type: 'controlnet' }, + beginEndStepPct: [0, 1] as [number, number], + controlLoraIndex: 0, + kind: 'flux2_control' as const, + mainBase: 'flux2', + mainVariant: 'dev', + weight: 0.75, + }; + expect(getControlValidationReason(dev)).toBeNull(); + expect(getControlValidationReason({ ...dev, flux2ControlIndex: 1 })).toBe('flux2_control_limit'); + expect(getControlValidationReason({ ...dev, mainBase: 'qwen-image' })).toBe('switch_adapter_kind'); + expect(getControlValidationReason({ ...dev, kind: 'controlnet' })).toBe('switch_adapter_kind'); + expect(getControlValidationReason({ ...dev, adapterModel: { base: 'flux', type: 'controlnet' } })).toBe( + 'incompatible_base' + ); + expect(getControlValidationReason({ ...dev, adapterModel: { base: 'flux2', type: 'lora' } })).toBe( + 'incompatible_adapter' + ); + expect(getControlValidationReason({ ...dev, weight: 0 })).toBeNull(); + expect(getControlValidationReason({ ...dev, weight: 2 })).toBeNull(); + expect(getControlValidationReason({ ...dev, weight: -0.01 })).toBe('invalid_adapter_values'); + expect(getControlValidationReason({ ...dev, weight: 2.01 })).toBe('invalid_adapter_values'); + }); + + it.each(['klein_4b', 'klein_9b', 'klein_9b_base', undefined])( + 'refuses the FLUX.2 control on variant %s before asking for a model or valid values', + (mainVariant) => { + // Capabilities are per base, so the variant is the policy's to judge; the denoise refuses everything but dev. + const klein = { + adapterModel: { base: 'flux2', type: 'controlnet' }, + beginEndStepPct: [0, 1] as [number, number], + controlLoraIndex: 0, + kind: 'flux2_control' as const, + mainBase: 'flux2', + mainVariant, + weight: 0.75, + }; + expect(getControlValidationReason(klein)).toBe('flux2_klein_control'); + expect(getControlValidationReason({ ...klein, adapterModel: null })).toBe('flux2_klein_control'); + expect(getControlValidationReason({ ...klein, weight: -1 })).toBe('flux2_klein_control'); + } + ); + it('retains the legacy -1 lower weight bound for existing adapter kinds', () => { expect(getControlValidationReason({ ...valid, weight: -1 })).toBeNull(); }); @@ -200,6 +245,7 @@ describe('Anima ControlNet-LLLite validation', () => { expect(getSuggestedControlKind('anima')).toBe('anima_lllite'); expect(getSuggestedControlKind('z-image')).toBe('z_image_control'); expect(getSuggestedControlKind('qwen-image')).toBe('qwen_image_control'); + expect(getSuggestedControlKind('flux2')).toBe('flux2_control'); expect(getSuggestedControlKind('flux')).toBe('controlnet'); expect(getSuggestedControlKind('sd-2')).toBeNull(); expect(getControlValidationReason({ ...lllite, mainBase: 'sd-2' })).toBe('unsupported_adapter'); @@ -298,4 +344,21 @@ describe('createControlValidationSequence', () => { expect(edit(qwen)).toBe('qwen_image_edit_control'); expect(edit(qwen)).toBe('qwen_image_edit_control'); }); + + it('lets one FLUX.2 control through per generation, and none on Klein', () => { + const flux2 = { + adapterModel: { base: 'flux2', key: 'union', type: 'controlnet' }, + beginEndStepPct: [0, 1] as [number, number], + kind: 'flux2_control' as const, + weight: 0.75, + }; + const generate = createControlValidationSequence({ base: 'flux2', variant: 'dev' }); + expect(generate(flux2)).toBeNull(); + expect(generate(flux2)).toBe('flux2_control_limit'); + + // A refused layer claims no slot, so every layer on a Klein model reports the same reason. + const klein = createControlValidationSequence({ base: 'flux2', variant: 'klein_9b' }); + expect(klein(flux2)).toBe('flux2_klein_control'); + expect(klein(flux2)).toBe('flux2_klein_control'); + }); }); diff --git a/invokeai/frontend/webv2/src/features/generation/core/canvas/controlValidation.ts b/invokeai/frontend/webv2/src/features/generation/core/canvas/controlValidation.ts index 90088e0761e..677036fa7dc 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/canvas/controlValidation.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/canvas/controlValidation.ts @@ -11,6 +11,7 @@ export const CONTROL_ADAPTER_KINDS = [ 'z_image_control', 'anima_lllite', 'qwen_image_control', + 'flux2_control', ] as const; export type ControlAdapterKind = (typeof CONTROL_ADAPTER_KINDS)[number]; @@ -28,9 +29,11 @@ export const CONTROL_VALIDATION_REASONS = [ 'control_lora_limit', 'z_image_control_limit', 'qwen_image_control_limit', + 'flux2_control_limit', 'duplicate_lllite_model', 'flux_fill_control_lora', 'qwen_image_edit_control', + 'flux2_klein_control', ] as const; export type ControlValidationReason = (typeof CONTROL_VALIDATION_REASONS)[number]; @@ -42,16 +45,19 @@ export interface ControlAdapterModelFacts { cond_in_channels?: number | null; } -/** Z-Image control, Anima ControlNet-LLLite and Qwen-Image control models install with the `controlnet` model type. */ +/** The Fun-style control nodes: a 0..2 context scale, one layer per generation, a `controlnet` model. */ +const isFunControlKind = (kind: ControlAdapterKind): boolean => + kind === 'z_image_control' || kind === 'qwen_image_control' || kind === 'flux2_control'; + +/** Z-Image, Qwen-Image and FLUX.2 control and Anima ControlNet-LLLite models install with the `controlnet` type. */ const getControlAdapterModelType = (kind: ControlAdapterKind): string => - kind === 'z_image_control' || kind === 'anima_lllite' || kind === 'qwen_image_control' ? 'controlnet' : kind; + isFunControlKind(kind) || kind === 'anima_lllite' ? 'controlnet' : kind; /** - * The lowest weight a kind accepts: the Z-Image and Qwen-Image control nodes take a 0..2 context scale, the other - * adapters keep the legacy -1 floor. Validation, persisted-value repair and the weight input share it. + * The lowest weight a kind accepts: the Z-Image, Qwen-Image and FLUX.2 control nodes take a 0..2 context scale, the + * other adapters keep the legacy -1 floor. Validation, persisted-value repair and the weight input share it. */ -export const getControlAdapterMinWeight = (kind: ControlAdapterKind): number => - kind === 'z_image_control' || kind === 'qwen_image_control' ? 0 : -1; +export const getControlAdapterMinWeight = (kind: ControlAdapterKind): number => (isFunControlKind(kind) ? 0 : -1); /** The backend owns kind support; count and Fill constraints are frontend policy. */ export const isControlKindSupportedForBase = (base: string, kind: ControlAdapterKind): boolean => @@ -109,6 +115,7 @@ export const getControlValidationReason = (params: { weight: number; zImageControlIndex?: number; qwenImageControlIndex?: number; + flux2ControlIndex?: number; /** An earlier contributing Anima LLLite layer already applies this model; the denoiser applies each once. */ lliteModelInUse?: boolean; }): ControlValidationReason | null => { @@ -116,6 +123,7 @@ export const getControlValidationReason = (params: { adapterModel, beginEndStepPct, controlLoraIndex, + flux2ControlIndex = 0, kind, lliteModelInUse = false, mainBase, @@ -130,6 +138,11 @@ export const getControlValidationReason = (params: { if (capabilitiesLoaded && !isControlKindSupportedForBase(mainBase, kind)) { return getSuggestedControlKind(mainBase) ? 'switch_adapter_kind' : 'unsupported_adapter'; } + // Capabilities are per base, and FLUX.2's Fun-ControlNet is FLUX.2 [dev]'s alone: `flux2_denoise` refuses it on + // Klein, and so does an unknown variant. No model or value fixes that, only another main model, so it comes first. + if (kind === 'flux2_control' && mainBase === 'flux2' && mainVariant !== 'dev') { + return 'flux2_klein_control'; + } if (!areControlAdapterValuesValid(kind, weight, beginEndStepPct)) { return 'invalid_adapter_values'; } @@ -156,6 +169,9 @@ export const getControlValidationReason = (params: { if (kind === 'qwen_image_control' && qwenImageControlIndex > 0) { return 'qwen_image_control_limit'; } + if (kind === 'flux2_control' && flux2ControlIndex > 0) { + return 'flux2_control_limit'; + } if (kind === 'anima_lllite' && lliteModelInUse) { return 'duplicate_lllite_model'; } @@ -172,13 +188,14 @@ export const getControlValidationReason = (params: { /** * Validates control layers in generation order. Per-generation limits (one Control LoRA, one Z-Image control, one - * Qwen-Image control, each LLLite model once) count only layers that passed, so an invalid layer never consumes a - * later layer's slot. + * Qwen-Image control, one FLUX.2 control, each LLLite model once) count only layers that passed, so an invalid layer + * never consumes a later layer's slot. */ export const createControlValidationSequence = (main: { base: string; variant?: string | null }) => { let controlLoraCount = 0; let zImageControlCount = 0; let qwenImageControlCount = 0; + let flux2ControlCount = 0; const lliteModelKeys = new Set(); return (layer: { @@ -192,6 +209,7 @@ export const createControlValidationSequence = (main: { base: string; variant?: adapterModel, beginEndStepPct: layer.beginEndStepPct, controlLoraIndex: kind === 'control_lora' ? controlLoraCount : 0, + flux2ControlIndex: kind === 'flux2_control' ? flux2ControlCount : 0, kind, lliteModelInUse: kind === 'anima_lllite' && adapterModel !== null && lliteModelKeys.has(adapterModel.key), mainBase: main.base, @@ -209,6 +227,8 @@ export const createControlValidationSequence = (main: { base: string; variant?: zImageControlCount += 1; } else if (kind === 'qwen_image_control') { qwenImageControlCount += 1; + } else if (kind === 'flux2_control') { + flux2ControlCount += 1; } else if (kind === 'anima_lllite' && adapterModel) { lliteModelKeys.add(adapterModel.key); } diff --git a/invokeai/frontend/webv2/src/workbench/canvas-engine/contracts.ts b/invokeai/frontend/webv2/src/workbench/canvas-engine/contracts.ts index c85511d5ae5..fe73166ecaa 100644 --- a/invokeai/frontend/webv2/src/workbench/canvas-engine/contracts.ts +++ b/invokeai/frontend/webv2/src/workbench/canvas-engine/contracts.ts @@ -234,7 +234,14 @@ export type CanvasAdjustmentEntry = export type CanvasAdjustmentsContract = readonly CanvasAdjustmentEntry[]; export interface CanvasControlAdapterContract { - kind: 'controlnet' | 't2i_adapter' | 'control_lora' | 'z_image_control' | 'anima_lllite' | 'qwen_image_control'; + kind: + | 'controlnet' + | 't2i_adapter' + | 'control_lora' + | 'z_image_control' + | 'anima_lllite' + | 'qwen_image_control' + | 'flux2_control'; model: string | null; weight: number; beginEndStepPct: [number, number]; diff --git a/invokeai/frontend/webv2/src/workbench/canvasMigration.test.ts b/invokeai/frontend/webv2/src/workbench/canvasMigration.test.ts index 41e84632f65..c1ba50b64f1 100644 --- a/invokeai/frontend/webv2/src/workbench/canvasMigration.test.ts +++ b/invokeai/frontend/webv2/src/workbench/canvasMigration.test.ts @@ -75,6 +75,7 @@ describe('loadCanvasState', () => { { beginEndStepPct: [0.2, 0.9], controlMode: null, kind: 'z_image_control', model: 'z-control', weight: 0.7 }, { beginEndStepPct: [0, 0.8], controlMode: null, kind: 'anima_lllite', model: 'anima-sketch', weight: 1.2 }, { beginEndStepPct: [0, 1], controlMode: null, kind: 'qwen_image_control', model: 'qwen-union', weight: 0.85 }, + { beginEndStepPct: [0.1, 0.9], controlMode: null, kind: 'flux2_control', model: 'flux2-union', weight: 0 }, ] as const; const layers = adapters.map((adapter, index) => ({ ...createControlLayer(`Control ${index}`, `control-${index}`), diff --git a/invokeai/frontend/webv2/src/workbench/canvasMigration.ts b/invokeai/frontend/webv2/src/workbench/canvasMigration.ts index 04a27ff9ef4..e3e6e59546a 100644 --- a/invokeai/frontend/webv2/src/workbench/canvasMigration.ts +++ b/invokeai/frontend/webv2/src/workbench/canvasMigration.ts @@ -139,6 +139,7 @@ const zControlAdapter = z 'z_image_control', 'anima_lllite', 'qwen_image_control', + 'flux2_control', ]), model: z.string().nullable(), weight: zFiniteNumber, diff --git a/invokeai/frontend/webv2/src/workbench/controlAdapters.test.ts b/invokeai/frontend/webv2/src/workbench/controlAdapters.test.ts index 3bbb9dfc91f..8a907d59662 100644 --- a/invokeai/frontend/webv2/src/workbench/controlAdapters.test.ts +++ b/invokeai/frontend/webv2/src/workbench/controlAdapters.test.ts @@ -15,6 +15,7 @@ describe('normalizeControlAdapter', () => { ['z_image_control', 0, [0.1, 0.9]], ['anima_lllite', -1, [0.1, 0.9]], ['qwen_image_control', 0, [0.1, 0.9]], + ['flux2_control', 0, [0.1, 0.9]], ] as const)('preserves valid %s numeric values', (kind, weight, beginEndStepPct) => { const adapter = { ...CONTROL_ADAPTER_DEFAULTS[kind], beginEndStepPct, weight }; expect(normalizeControlAdapter(adapter)).toEqual(adapter); @@ -30,12 +31,14 @@ describe('normalizeControlAdapter', () => { ['anima_lllite', 2.01], ['qwen_image_control', -0.01], ['qwen_image_control', 2.01], + ['flux2_control', -0.01], + ['flux2_control', 2.01], ] as const)('repairs invalid %s weight %s with its default', (kind, weight) => { const adapter = { ...CONTROL_ADAPTER_DEFAULTS[kind], weight }; expect(normalizeControlAdapter(adapter)).toMatchObject({ kind, weight: CONTROL_ADAPTER_DEFAULTS[kind].weight }); }); - it.each(['z_image_control', 'qwen_image_control'] as const)( + it.each(['z_image_control', 'qwen_image_control', 'flux2_control'] as const)( 'rebuilds a %s adapter from the contract fields', (kind) => { const persisted = { @@ -74,6 +77,7 @@ describe('default control adapters', () => { expect(getDefaultControlAdapterKind('anima')).toBe('anima_lllite'); expect(getDefaultControlAdapterKind('z-image')).toBe('z_image_control'); expect(getDefaultControlAdapterKind('qwen-image')).toBe('qwen_image_control'); + expect(getDefaultControlAdapterKind('flux2')).toBe('flux2_control'); expect(getDefaultControlAdapterKind('sdxl')).toBe('controlnet'); expect(getDefaultControlAdapterKind(null)).toBe('controlnet'); }); @@ -88,6 +92,16 @@ describe('default control adapters', () => { }); }); + it('starts a FLUX.2 control at the union model card recommendation', () => { + expect(createDefaultControlAdapter('flux2', 'union')).toEqual({ + beginEndStepPct: [0, 1], + controlMode: null, + kind: 'flux2_control', + model: 'union', + weight: 0.75, + }); + }); + it('hands out a step range the caller may mutate without touching the defaults', () => { const adapter = createDefaultControlAdapter('anima'); adapter.beginEndStepPct[0] = 0.5; diff --git a/invokeai/frontend/webv2/src/workbench/controlAdapters.ts b/invokeai/frontend/webv2/src/workbench/controlAdapters.ts index 8963492f277..8e146c3a127 100644 --- a/invokeai/frontend/webv2/src/workbench/controlAdapters.ts +++ b/invokeai/frontend/webv2/src/workbench/controlAdapters.ts @@ -26,6 +26,14 @@ export const CONTROL_ADAPTER_DEFAULTS: Readonly< model: null, weight: 0.75, }, + // The FLUX.2 [dev] Fun-ControlNet-Union's recommended 0.65–0.80 context scale; the node's own default. + flux2_control: { + beginEndStepPct: [0, 1], + controlMode: null, + kind: 'flux2_control', + model: null, + weight: 0.75, + }, // The Fun-ControlNet-Union's recommended 0.70–0.95 context scale, centred. qwen_image_control: { beginEndStepPct: [0, 1], @@ -53,6 +61,7 @@ export const CONTROL_ADAPTER_DEFAULTS: Readonly< /** Kinds that exist for exactly one main-model base. Every other kind is offered wherever capabilities allow it. */ export const CONTROL_KIND_BASE: Readonly>> = { anima_lllite: 'anima', + flux2_control: 'flux2', qwen_image_control: 'qwen-image', z_image_control: 'z-image', }; @@ -95,7 +104,7 @@ export const normalizeControlAdapter = (value: unknown): unknown => { ? [value.beginEndStepPct[0], value.beginEndStepPct[1]] : [defaults.beginEndStepPct[0], defaults.beginEndStepPct[1]]; - if (value.kind !== 'z_image_control' && value.kind !== 'qwen_image_control') { + if (value.kind !== 'z_image_control' && value.kind !== 'qwen_image_control' && value.kind !== 'flux2_control') { return { ...defaults, ...value, beginEndStepPct, weight } satisfies CanvasControlAdapterContract; } return { diff --git a/invokeai/frontend/webv2/src/workbench/controlLayerChecks.test.ts b/invokeai/frontend/webv2/src/workbench/controlLayerChecks.test.ts index 67c3c49d2af..3890a9c947b 100644 --- a/invokeai/frontend/webv2/src/workbench/controlLayerChecks.test.ts +++ b/invokeai/frontend/webv2/src/workbench/controlLayerChecks.test.ts @@ -171,6 +171,25 @@ describe('getBlockingControlLayerIssues', () => { ]); }); + it('lets one FLUX.2 control through on [dev], and none on Klein', () => { + const flux2Models = [model('flux2-union', 'flux2', 'controlnet')]; + const layers = [ + controlLayer('first', { kind: 'flux2_control', model: 'flux2-union', weight: 0.75 }), + controlLayer('second', { kind: 'flux2_control', model: 'flux2-union', weight: 0.75 }), + ]; + const codes = (mainModel: { base: string; variant?: string }) => + getBlockingControlLayerIssues({ layers, mainModel, models: flux2Models }).map(({ code, layerId }) => [ + layerId, + code, + ]); + + expect(codes({ base: 'flux2', variant: 'dev' })).toEqual([['second', 'flux2_control_limit']]); + expect(codes({ base: 'flux2', variant: 'klein_9b' })).toEqual([ + ['first', 'flux2_klein_control'], + ['second', 'flux2_klein_control'], + ]); + }); + it('reports issues in document order', () => { const issues = getBlockingControlLayerIssues({ layers: [controlLayer('top'), controlLayer('bottom')], @@ -193,6 +212,17 @@ describe('getControlLayerAttentionReason', () => { expect(getControlLayerAttentionReason(controlLayer('ok', { model: 'sdxl-control' }), sdxl, models)).toBeNull(); }); + it('warns that a Klein model cannot run the FLUX.2 control, even on a fresh layer without a model', () => { + const fresh = controlLayer('fresh', { kind: 'flux2_control', source: { bitmap: null, type: 'paint' } }); + const picked = controlLayer('picked', { kind: 'flux2_control', model: 'flux2-union', weight: 0.75 }); + const flux2Models = [model('flux2-union', 'flux2', 'controlnet')]; + + expect(getControlLayerAttentionReason(fresh, { base: 'flux2', variant: 'klein_4b' }, flux2Models)).toBe( + 'flux2_klein_control' + ); + expect(getControlLayerAttentionReason(picked, { base: 'flux2', variant: 'dev' }, flux2Models)).toBeNull(); + }); + it('warns that an Edit model cannot run the Qwen-Image control', () => { const qwenModels = [model('qwen-union', 'qwen-image', 'controlnet')]; const layer = controlLayer('qwen', { kind: 'qwen_image_control', model: 'qwen-union', weight: 0.85 }); diff --git a/invokeai/frontend/webv2/src/workbench/controlLayerChecks.ts b/invokeai/frontend/webv2/src/workbench/controlLayerChecks.ts index e6e0541ba32..4958d679917 100644 --- a/invokeai/frontend/webv2/src/workbench/controlLayerChecks.ts +++ b/invokeai/frontend/webv2/src/workbench/controlLayerChecks.ts @@ -95,6 +95,7 @@ export const getControlLayerAttentionReason = ( adapterModel: resolveAdapterModel(layer.adapter.model, models), beginEndStepPct: layer.adapter.beginEndStepPct, controlLoraIndex: 0, + flux2ControlIndex: 0, kind: layer.adapter.kind, mainBase: mainModel.base, mainVariant: mainModel.variant ?? undefined, diff --git a/invokeai/frontend/webv2/src/workbench/widgets/canvas/invoke/prepareCanvasInvocation.test.ts b/invokeai/frontend/webv2/src/workbench/widgets/canvas/invoke/prepareCanvasInvocation.test.ts index e311bf6ed42..a343e591c06 100644 --- a/invokeai/frontend/webv2/src/workbench/widgets/canvas/invoke/prepareCanvasInvocation.test.ts +++ b/invokeai/frontend/webv2/src/workbench/widgets/canvas/invoke/prepareCanvasInvocation.test.ts @@ -1099,6 +1099,96 @@ describe('runCanvasInvocation', () => { }); }); + describe('FLUX.2 [dev] ControlNet', () => { + const flux2Dev = { + ...sd1Model, + base: 'flux2' as const, + format: 'diffusers' as const, + key: 'flux2-dev', + name: 'FLUX.2 [dev]', + variant: 'dev', + }; + const union = { + base: 'flux2', + file_size: 1, + format: 'checkpoint', + hash: 'flux2-union-hash', + key: 'flux2-union', + name: 'FLUX.2 [dev] ControlNet Union', + path: 'flux2-union', + source: 'flux2-union', + source_type: 'path' as const, + type: 'controlnet', + }; + const flux2Layer = (id: string, values: Partial = {}) => + controlLayer(id, { controlMode: null, kind: 'flux2_control', model: union.key, weight: 0.75, ...values }); + + it('prepares the control with the adapter values and the installed model', async () => { + const harness = makeHarness({ + document: docWithLayers([flux2Layer('f-layer', { beginEndStepPct: [0.1, 0.9], weight: 0.65 })]), + model: flux2Dev, + models: [union], + }); + + await runCanvasInvocation(harness.deps); + + expect(harness.notices()).toHaveLength(0); + expect(harness.submittedGraphs()[0]?.graph.backendGraph?.nodes['flux2_control_f-layer']).toMatchObject({ + begin_step_percent: 0.1, + control_context_scale: 0.65, + control_model: { base: 'flux2', hash: 'flux2-union-hash', key: 'flux2-union', type: 'controlnet' }, + end_step_percent: 0.9, + type: 'flux2_control', + }); + expect(harness.surfaceIds).toEqual(['f-layer']); + }); + + it('hands the control the uploads the inpaint graph itself reads when the canvas inpaints', async () => { + const harness = makeHarness({ + document: docWithLayers([rasterLayer('base'), flux2Layer('f-layer'), inpaintMaskLayer('mask')]), + model: flux2Dev, + models: [union], + }); + + await runCanvasInvocation(harness.deps); + + const nodes = harness.submittedGraphs()[0]!.graph.backendGraph!.nodes; + expect(nodes['flux2_control_f-layer']?.inpaint_image).toEqual(nodes.create_gradient_mask?.image); + expect(nodes['flux2_control_mask_f-layer']).toMatchObject({ + image: nodes.create_gradient_mask?.mask, + max: 0, + min: 255, + type: 'img_lerp', + }); + }); + + it('blocks a second enabled nonempty control', async () => { + const harness = makeHarness({ + document: docWithLayers([flux2Layer('first'), flux2Layer('second')]), + model: flux2Dev, + models: [union], + }); + + await runCanvasInvocation(harness.deps); + + expect(harness.submittedGraphs()).toHaveLength(0); + expect(harness.notices()[0]?.message).toBe('second: flux2_control_limit'); + }); + + it('blocks the control on a FLUX.2 Klein model', async () => { + const harness = makeHarness({ + document: docWithLayers([flux2Layer('layer')]), + model: { ...flux2Dev, key: 'flux2-klein', name: 'FLUX.2 Klein 9B', variant: 'klein_9b' }, + models: [union], + }); + + await runCanvasInvocation(harness.deps); + + expect(harness.submittedGraphs()).toHaveLength(0); + expect(harness.notices()[0]?.message).toBe('layer: flux2_klein_control'); + }); + }); + describe('Anima ControlNet-LLLite', () => { const anima = { ...sd1Model, base: 'anima' as const, key: 'anima', name: 'Anima' }; const installed = (key: string, base: string, type: string, extra: Record = {}) => ({ diff --git a/invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.browser.test.tsx b/invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.browser.test.tsx index e91b2716b1c..b94c2d800c1 100644 --- a/invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.browser.test.tsx +++ b/invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.browser.test.tsx @@ -466,6 +466,43 @@ describe('ControlLayerSettings on a Qwen Image main model', () => { }); }); +describe('ControlLayerSettings on a FLUX.2 main model', () => { + const FLUX2_DEV_MAIN = { base: 'flux2', key: 'flux2-dev', name: 'FLUX.2 [dev]', type: 'main', variant: 'dev' }; + const FLUX2_KLEIN_MAIN = { ...FLUX2_DEV_MAIN, key: 'flux2-klein', name: 'FLUX.2 Klein 9B', variant: 'klein_9b' }; + const FLUX2_MODELS = [ + { base: 'flux2', key: 'flux2-union', name: 'FLUX.2 [dev] ControlNet Union', type: 'controlnet' }, + { base: 'flux', key: 'flux-union', name: 'FLUX.1 ControlNet Union', type: 'controlnet' }, + ]; + + it('offers the FLUX.2 ControlNet kind and its models on [dev], and accepts one without a warning', async () => { + await renderWith( + FLUX2_DEV_MAIN, + FLUX2_MODELS, + createControlLayer('control-1', 'control-1', 'flux2', 'flux2-union') + ); + + expect(offersKind('flux2_control')).toBe(true); + expect(offersKind('controlnet')).toBe(false); + expect(offeredModels()).toEqual(['flux2-union']); + expect(host!.textContent).toContain('FLUX.2 [dev] ControlNet Union'); + expect(textOf('alert')).toBe(''); + }); + + it('tells a Klein user on a fresh, empty layer that the ControlNet cannot run, before asking for a model', async () => { + catalog.mainModel = FLUX2_KLEIN_MAIN; + catalog.models = FLUX2_MODELS; + getArchitectureCapabilities.mockResolvedValueOnce(architectureCapabilitiesFixture); + await settle(ensureArchitectureCapabilitiesLoaded); + const fresh = createControlLayer('control-1', 'control-1', 'flux2', null); + const engine = engineWith([fresh]); + engine.exports.hasExportableLayerContent = () => false; + + await render(fresh, engine); + + expect(textOf('alert')).toBe('widgets.layers.control.validation.flux2_klein_control'); + }); +}); + describe('ControlLayerSettings weight', () => { // A full document layer (the panel reads its leaf), weighted 1 so a drag can move either way. const weighted = ((): CanvasControlLayerContract => { diff --git a/invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx b/invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx index 96a90a967e3..f6c998e8e52 100644 --- a/invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx +++ b/invokeai/frontend/webv2/src/workbench/widgets/layers/ControlLayerSettings.tsx @@ -323,11 +323,15 @@ export const ControlLayerSettings = ({ engine, layer, onOperationStarted }: Cont // retry it started keeps the button, and the user's focus, in place. const isRetryingCapabilities = hasRequestedCapabilitiesRetry && capabilitiesStatus === 'loading'; const showCapabilitiesFailure = capabilitiesUnavailable && (capabilitiesStatus === 'error' || isRetryingCapabilities); - // A missing model or a kind to switch is worth saying on a fresh empty layer; an empty model list explains itself. + // A missing model, a kind to switch or a main model that cannot run the kind at all is worth saying on a fresh empty + // layer; an empty model list explains itself. const visibleValidationReason = validationReason && !capabilitiesUnavailable && - (hasContent || validationReason === 'missing_model' || validationReason === 'switch_adapter_kind') && + (hasContent || + validationReason === 'missing_model' || + validationReason === 'switch_adapter_kind' || + validationReason === 'flux2_klein_control') && !(validationReason === 'missing_model' && hiddenModelReasons.length > 0) ? validationReason : null; diff --git a/invokeai/frontend/webv2/src/workbench/widgets/layers/controlModelOptions.test.ts b/invokeai/frontend/webv2/src/workbench/widgets/layers/controlModelOptions.test.ts index e181f62f71a..35425adaf0a 100644 --- a/invokeai/frontend/webv2/src/workbench/widgets/layers/controlModelOptions.test.ts +++ b/invokeai/frontend/webv2/src/workbench/widgets/layers/controlModelOptions.test.ts @@ -41,6 +41,20 @@ describe('getCompatibleControlModels', () => { expect(getCompatibleControlModels(models, null, 'qwen_image_control')).toEqual([]); }); + it('returns only FLUX.2 ControlNet models for flux2_control', () => { + const models = [ + model('flux2-union', 'flux2', 'controlnet'), + model('flux-union', 'flux', 'controlnet'), + model('flux2-lora', 'flux2', 'lora'), + ]; + + expect(getCompatibleControlModels(models, 'flux2', 'flux2_control').map((candidate) => candidate.key)).toEqual([ + 'flux2-union', + ]); + expect(getCompatibleControlModels(models, 'flux', 'flux2_control')).toEqual([]); + expect(getCompatibleControlModels(models, null, 'flux2_control')).toEqual([]); + }); + it('keeps existing adapter filtering unchanged', () => { const models = [model('sd-control', 'sd-1', 'controlnet'), model('flux-lora', 'flux', 'control_lora')]; expect(getCompatibleControlModels(models, 'sd-1', 'controlnet').map((candidate) => candidate.key)).toEqual([ @@ -162,4 +176,13 @@ describe('resolveDefaultControlModelForBase', () => { expect(resolveDefaultControlModelForBase(models, 'qwen-image')).toBe('qwen-union'); }); + + it('starts a FLUX.2 control layer on the union ControlNet of its own base', () => { + const models = [ + { ...model('flux-union', 'flux', 'controlnet'), name: 'FLUX.1 ControlNet Union' } as ModelConfig, + { ...model('flux2-union', 'flux2', 'controlnet'), name: 'FLUX.2 [dev] ControlNet Union' } as ModelConfig, + ]; + + expect(resolveDefaultControlModelForBase(models, 'flux2')).toBe('flux2-union'); + }); }); diff --git a/invokeai/frontend/webv2/src/workbench/widgets/layers/layerOps.test.ts b/invokeai/frontend/webv2/src/workbench/widgets/layers/layerOps.test.ts index bd6d288d61a..abc05c0be42 100644 --- a/invokeai/frontend/webv2/src/workbench/widgets/layers/layerOps.test.ts +++ b/invokeai/frontend/webv2/src/workbench/widgets/layers/layerOps.test.ts @@ -279,6 +279,7 @@ describe('createControlLayer', () => { model: null, weight: 0.75, }, + flux2_control: { beginEndStepPct: [0, 1], controlMode: null, kind: 'flux2_control', model: null, weight: 0.75 }, qwen_image_control: { beginEndStepPct: [0, 1], controlMode: null, diff --git a/tests/app/invocations/test_flux2_control.py b/tests/app/invocations/test_flux2_control.py new file mode 100644 index 00000000000..7306571a5c7 --- /dev/null +++ b/tests/app/invocations/test_flux2_control.py @@ -0,0 +1,571 @@ +"""The FLUX.2 [dev] ControlNet node, and what the FLUX.2 denoise does with its field: refuses Klein and a VAE without +batch-norm statistics, reserves the hints over the whole image stream, encodes the control images before the +transformer's lock and pads the context for reference tokens, locks the branch with the same reservation inside the +exit stack, and gates it per user step. + +The denoise runs its transformer in bfloat16, which the CPU test fleet cannot matmul, so every run here stops at the +transformer's lock or at the LoRA patcher, or runs the loop with the transformer's forward stood in. The forward with +the hooks is covered in `tests/backend/fun_controlnet`. +""" + +from contextlib import contextmanager, nullcontext +from types import SimpleNamespace +from unittest.mock import MagicMock + +import numpy as np +import pytest +import torch +from diffusers.models.autoencoders.autoencoder_kl_flux2 import AutoencoderKLFlux2 +from diffusers.models.transformers.transformer_flux2 import Flux2Transformer2DModel +from PIL import Image +from pydantic import ValidationError + +from invokeai.app.invocations.fields import ImageField +from invokeai.app.invocations.flux2 import flux2_denoise +from invokeai.app.invocations.flux2.flux2_control import Flux2ControlField, Flux2ControlInvocation +from invokeai.app.invocations.flux2.flux2_denoise import Flux2DenoiseInvocation +from invokeai.app.invocations.model import ModelIdentifierField, VAEField +from invokeai.app.invocations.vae.flux2_vae_encode import Flux2VaeEncodeInvocation +from invokeai.backend.fun_controlnet.flux2 import FLUX2_FUN_CONTROL_IN_DIM, Flux2FunControlBranch +from invokeai.backend.fun_controlnet.hooks import FunControlHooks +from invokeai.backend.model_manager.taxonomy import BaseModelType, Flux2VariantType, ModelFormat, ModelType +from invokeai.backend.patches.layer_patcher import LayerPatcher +from invokeai.backend.stable_diffusion.diffusion.conditioning_data import ConditioningFieldData, FLUXConditioningInfo +from invokeai.backend.util import attention +from invokeai.backend.util.devices import TorchDevice + +SIDE = 64 # an 8x8 latent: 16 image tokens +IMAGE_TOKENS = (SIDE // 16) ** 2 +REFERENCE_TOKENS = 9 +TEXT_TOKENS = 4 +HIDDEN = 16 +DEV_HIDDEN = 6144 # the width the estimate takes for a [dev] config +NUM_CONTROL_BLOCKS = 4 + + +class _Stop(Exception): + """Raised where the node has made the decision a test looks at.""" + + +def _model(type_: ModelType) -> ModelIdentifierField: + return ModelIdentifierField( + key=f"{type_.value}", hash="hash", name=type_.value, base=BaseModelType.Flux2, type=type_ + ) + + +# --- the node --- + + +def test_the_node_hands_its_images_and_settings_to_the_field() -> None: + node = Flux2ControlInvocation( + id="control", + control_model=_model(ModelType.ControlNet), + image=ImageField(image_name="canny"), + inpaint_image=ImageField(image_name="photo"), + inpaint_mask=ImageField(image_name="mask"), + control_context_scale=0.7, + begin_step_percent=0.1, + end_step_percent=0.9, + tiled=True, + tile_size=512, + ) + + assert node.invoke(MagicMock()).control == Flux2ControlField( + image_name="canny", + inpaint_image_name="photo", + inpaint_mask_name="mask", + control_model=_model(ModelType.ControlNet), + control_context_scale=0.7, + begin_step_percent=0.1, + end_step_percent=0.9, + tiled=True, + tile_size=512, + ) + + +@pytest.mark.parametrize( + ("images", "message"), + [ + ({}, "control image"), + ({"inpaint_mask": ImageField(image_name="mask")}, "go together"), + ({"inpaint_image": ImageField(image_name="photo")}, "go together"), + ], + ids=["nothing", "mask-alone", "image-alone"], +) +def test_the_node_refuses_to_run_without_a_complete_input(images, message) -> None: + node = Flux2ControlInvocation(id="control", control_model=_model(ModelType.ControlNet), **images) + with pytest.raises(ValueError, match=message): + node.invoke(MagicMock()) + + +def test_a_begin_after_the_end_is_refused_when_the_node_is_built() -> None: + with pytest.raises(ValidationError, match="Begin step percent"): + Flux2ControlInvocation( + id="control", control_model=_model(ModelType.ControlNet), begin_step_percent=0.8, end_step_percent=0.2 + ) + + +# --- the denoise --- + + +@pytest.fixture(autouse=True) +def cpu(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setattr(TorchDevice, "choose_torch_device", lambda: torch.device("cpu")) + + +@pytest.fixture(autouse=True) +def fused_sdpa(monkeypatch: pytest.MonkeyPatch) -> None: + """Answer the dispatch questions `sdpa_score_matrix_bytes` asks, so no test depends on the torch build of the + machine it runs on.""" + monkeypatch.setattr(attention, "_diffusers_attention_dispatch", lambda: attention._DISPATCH_TORCH) + monkeypatch.setattr(attention, "rocm_sdpa_uses_math_kernel", lambda *_args: False) + monkeypatch.setattr(attention, "_torch_sdpa_materializes_score_matrix", lambda *_args: False) + + +_TINY_TRANSFORMER = { + "patch_size": 1, + "in_channels": 128, + "num_layers": 8, + "num_single_layers": 1, + "attention_head_dim": 8, + "num_attention_heads": 2, + "joint_attention_dim": 8, + "timestep_guidance_channels": 16, + "axes_dims_rope": (2, 2, 2, 2), +} + + +def _tiny_transformer() -> Flux2Transformer2DModel: + return Flux2Transformer2DModel(**_TINY_TRANSFORMER).eval() + + +def _tiny_branch() -> Flux2FunControlBranch: + return Flux2FunControlBranch(hidden_size=HIDDEN, num_attention_heads=2, attention_head_dim=8).eval() + + +def _tiny_vae() -> AutoencoderKLFlux2: + """The real FLUX.2 VAE class at toy width: 8x compression, 32 latent channels, and a batch norm whose statistics + are not the identity, so a skipped normalization shows.""" + torch.manual_seed(0) + vae = AutoencoderKLFlux2( + block_out_channels=(4, 4, 4, 4), layers_per_block=1, latent_channels=32, norm_num_groups=2, sample_size=64 + ).eval() + vae.bn.running_mean.uniform_(-0.5, 0.5) + vae.bn.running_var.uniform_(0.5, 2.0) + return vae + + +def _loaded(model, lock) -> MagicMock: + """A `LoadedModel` stand-in: `model` unlocked, `model_on_device` as `lock` says (a context or a raise).""" + info = MagicMock() + info.model = model + info.compute_device = torch.device("cpu") + info.model_on_device = MagicMock(side_effect=lock) + return info + + +def _yielding(model): + return lambda working_mem_bytes=None, working_memory=None: nullcontext((None, model)) + + +def _stopping(working_mem_bytes=None, working_memory=None): + raise _Stop + + +def _control_field(**overrides) -> Flux2ControlField: + field = { + "image_name": "canny", + "inpaint_image_name": "photo", + "inpaint_mask_name": "mask", + "control_model": _model(ModelType.ControlNet), + } + field.update(overrides) + return Flux2ControlField(**field) + + +def _denoise(**overrides) -> Flux2DenoiseInvocation: + fields = { + "latents": None, + "noise": None, + "denoise_mask": None, + "denoising_start": 0.0, + "denoising_end": 1.0, + "add_noise": True, + "transformer": SimpleNamespace(transformer=_model(ModelType.Main), loras=[]), + "positive_text_conditioning": SimpleNamespace(conditioning_name="pos", mask=None), + "negative_text_conditioning": SimpleNamespace(conditioning_name="neg"), + "guidance": 4.0, + "cfg_scale": 2.0, + "width": SIDE, + "height": SIDE, + "num_steps": 2, + "scheduler": "euler", + "seed": 0, + "vae": VAEField(vae=_model(ModelType.VAE)), + "kontext_conditioning": None, + "control": _control_field(), + } + fields.update(overrides) + return Flux2DenoiseInvocation.model_construct(**fields) + + +def _control_image() -> Image.Image: + return Image.linear_gradient("L").resize((SIDE // 2, SIDE // 2)).convert("RGB") + + +def _inpaint_image() -> Image.Image: + return Image.linear_gradient("L").rotate(90).resize((SIDE, SIDE)).convert("RGB") + + +def _inpaint_mask() -> Image.Image: + """White (regenerate) in the top-left quarter.""" + mask = Image.new("L", (SIDE, SIDE), 0) + mask.paste(255, (0, 0, SIDE // 2, SIDE // 2)) + return mask + + +def _context(transformer_info=None, control_info=None, vae=None, variant=Flux2VariantType.Dev) -> MagicMock: + vae = vae if vae is not None else _tiny_vae() + infos = { + ModelType.Main: transformer_info, + ModelType.ControlNet: control_info, + ModelType.VAE: _loaded(vae, _yielding(vae)), + } + context = MagicMock() + context.models.load.side_effect = lambda identifier: infos[identifier.type] + context.models.get_config.return_value = SimpleNamespace( + base=BaseModelType.Flux2, type=ModelType.Main, format=ModelFormat.Checkpoint, variant=variant + ) + context.conditioning.load.side_effect = lambda name: ConditioningFieldData( + conditionings=[FLUXConditioningInfo(clip_embeds=torch.zeros(1, 768), t5_embeds=torch.zeros(1, TEXT_TOKENS, 8))] + ) + images = {"canny": _control_image(), "photo": _inpaint_image(), "mask": _inpaint_mask()} + context.images.get_pil.side_effect = lambda name: images[name] + context.config.get.return_value.force_tiled_decode = False + return context + + +def _loaded_types(context) -> list[ModelType]: + return [call.args[0].type for call in context.models.load.call_args_list] + + +def _hook_count(transformer) -> int: + return sum(len(block._forward_hooks) + len(block._forward_pre_hooks) for block in transformer.transformer_blocks) + + +@pytest.mark.parametrize("variant", [Flux2VariantType.Klein9B, Flux2VariantType.Klein4BBase], ids=lambda v: v.value) +def test_control_is_refused_on_klein_before_the_controlnet_is_loaded(variant) -> None: + context = _context(transformer_info=_loaded(_tiny_transformer(), _stopping), variant=variant) + + with pytest.raises(ValueError, match=r"FLUX.2 \[dev\] only, not with FLUX.2 Klein models"): + _denoise()._run_diffusion(context) + + assert ModelType.ControlNet not in _loaded_types(context) + + +def test_control_is_refused_with_a_vae_that_has_no_batch_norm_statistics(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setattr(Flux2DenoiseInvocation, "_get_bn_stats", lambda self, context: None) + context = _context(transformer_info=_loaded(_tiny_transformer(), _stopping)) + + with pytest.raises(ValueError, match="batch-norm statistics"): + _denoise()._run_diffusion(context) + + assert ModelType.ControlNet not in _loaded_types(context) + + +def test_a_model_that_is_not_the_flux2_branch_is_refused() -> None: + context = _context(transformer_info=_loaded(_tiny_transformer(), _stopping), control_info=_loaded(object(), None)) + + with pytest.raises(TypeError, match="Expected a FLUX.2 ControlNet"): + _denoise()._run_diffusion(context) + + +class _ReferenceImages: + """Stands in for `Flux2RefImageExtension`: one reference image's tokens after the generated ones.""" + + def __init__(self, **_kwargs) -> None: + self.ref_image_latents = torch.randn(1, REFERENCE_TOKENS, 128).to(torch.bfloat16) + self.ref_image_ids = torch.full((1, REFERENCE_TOKENS, 4), 10, dtype=torch.long) + + def ensure_batch_size(self, _batch_size: int) -> None: + pass + + +def test_with_control_and_a_reference_image_the_hints_are_reserved_over_the_whole_stream( + monkeypatch: pytest.MonkeyPatch, +) -> None: + """The hints are as long as the image stream the transformer sees, and that stream carries the reference tokens.""" + monkeypatch.setattr(flux2_denoise, "Flux2RefImageExtension", _ReferenceImages) + transformer_info = _loaded(_tiny_transformer(), _stopping) + vae = _tiny_vae() + context = _context(transformer_info, _loaded(_tiny_branch(), _yielding(_tiny_branch())), vae) + node = _denoise(kontext_conditioning=[SimpleNamespace()]) + + with pytest.raises(_Stop): + node._run_diffusion(context) + + without_control = node._estimate_working_memory( + image_seq_len=IMAGE_TOKENS, + ref_image_seq_len=REFERENCE_TOKENS, + text_seq_len=TEXT_TOKENS, + num_loras=0, + hidden_size=DEV_HIDDEN, + device=torch.device("cpu"), + ) + hints = (NUM_CONTROL_BLOCKS + 4) * (IMAGE_TOKENS + REFERENCE_TOKENS) * DEV_HIDDEN * torch.bfloat16.itemsize + assert transformer_info.model_on_device.call_args.kwargs["working_mem_bytes"] == without_control + hints + # The control image and the masked inpaint image went through the VAE before the transformer was locked. + vae_info = context.models.load(VAEField(vae=_model(ModelType.VAE)).vae) + encodes = [call for call in vae_info.model_on_device.call_args_list if "working_memory" in call.kwargs] + assert len(encodes) == 2 + + +def test_the_control_context_is_zero_for_the_reference_tokens(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setattr(flux2_denoise, "Flux2RefImageExtension", _ReferenceImages) + installed: list[torch.Tensor] = [] + + @contextmanager + def recording_install(_transformer, _branch, control_context, *, scale): + installed.append(control_context) + raise _Stop + yield + + monkeypatch.setattr(flux2_denoise, "install_fun_control", recording_install) + transformer, branch = _tiny_transformer(), _tiny_branch() + context = _context(_loaded(transformer, _yielding(transformer)), _loaded(branch, _yielding(branch))) + + with pytest.raises(_Stop): + _denoise(kontext_conditioning=[SimpleNamespace()])._run_diffusion(context) + + (control_context,) = installed + assert control_context.shape == (1, IMAGE_TOKENS + REFERENCE_TOKENS, FLUX2_FUN_CONTROL_IN_DIM) + assert control_context.dtype == torch.bfloat16 + assert torch.equal(control_context[:, IMAGE_TOKENS:], torch.zeros(1, REFERENCE_TOKENS, FLUX2_FUN_CONTROL_IN_DIM)) + assert torch.all(control_context[:, :IMAGE_TOKENS].abs().sum(dim=-1) > 0) + + +def test_the_branch_is_locked_with_the_same_reservation_and_hooked_inside_the_exit_stack( + monkeypatch: pytest.MonkeyPatch, +) -> None: + transformer, branch = _tiny_transformer(), _tiny_branch() + transformer_info = _loaded(transformer, _yielding(transformer)) + control_info = _loaded(branch, _yielding(branch)) + context = _context(transformer_info, control_info) + hooks_at_patching: list[int] = [] + + def stop(**_kwargs): + hooks_at_patching.append(_hook_count(transformer)) + raise _Stop + + monkeypatch.setattr(LayerPatcher, "apply_smart_model_patches", stop) + + with pytest.raises(_Stop): + _denoise()._run_diffusion(context) + + reserved = transformer_info.model_on_device.call_args.kwargs["working_mem_bytes"] + assert control_info.model_on_device.call_args.kwargs["working_mem_bytes"] == reserved + assert hooks_at_patching == [1 + NUM_CONTROL_BLOCKS] + assert _hook_count(transformer) == 0 + + +class _GateRecordingTransformer(Flux2Transformer2DModel): + """The real class, so the node's checks hold and the real hooks land on its blocks, with the forward replaced: no + bfloat16 matmul on the CPU, and a record of the control gate at every call.""" + + def __init__(self) -> None: + super().__init__(**_TINY_TRANSFORMER) + self.hooks: FunControlHooks | None = None + self.gates: list[bool] = [] + + def forward(self, hidden_states: torch.Tensor, *_args, **_kwargs): + assert self.hooks is not None + self.gates.append(self.hooks.active) + return (torch.zeros(*hidden_states.shape[:2], self.out_channels, dtype=hidden_states.dtype),) + + +@pytest.mark.parametrize( + ("scheduler", "begin", "end", "expected_gates"), + [ + ("euler", 0.5, 1.0, [False] * 4 + [True] * 4), + ("euler", 0.0, 0.5, [True] * 6 + [False] * 2), + # Heun: two forwards per step, one for the last; CFG doubles each. + ("heun", 0.5, 1.0, [False] * 8 + [True] * 6), + ], + ids=["euler-second-half", "euler-first-half", "heun-second-half"], +) +def test_the_gate_follows_the_user_step_for_every_forward_of_it( + monkeypatch: pytest.MonkeyPatch, scheduler, begin, end, expected_gates +) -> None: + """Four steps with CFG: the gate follows `step / total_steps` with both ends included, and the positive and the + negative forward of a step -- and Heun's two evaluations of it -- see the same one.""" + transformer, branch = _GateRecordingTransformer(), _tiny_branch() + install = flux2_denoise.install_fun_control + + @contextmanager + def capturing_install(*args, **kwargs): + with install(*args, **kwargs) as hooks: + transformer.hooks = hooks + yield hooks + + monkeypatch.setattr(flux2_denoise, "install_fun_control", capturing_install) + context = _context(_loaded(transformer, _yielding(transformer)), _loaded(branch, _yielding(branch))) + + _denoise( + num_steps=4, + scheduler=scheduler, + control=_control_field(begin_step_percent=begin, end_step_percent=end), + )._run_diffusion(context) + + assert transformer.gates == expected_gates + assert _hook_count(transformer) == 0 + + +@pytest.mark.parametrize( + ("tiled", "tile_size", "force_tiled_decode", "expected_tiled"), + [(False, 0, False, False), (True, 512, False, True), (False, 0, True, True)], + ids=["untiled", "field", "forced"], +) +def test_the_control_images_are_encoded_at_generation_size_with_the_fields_tiling( + monkeypatch: pytest.MonkeyPatch, tiled, tile_size, force_tiled_decode, expected_tiled +) -> None: + vae = _tiny_vae() + context = _context(vae=vae) + context.config.get.return_value.force_tiled_decode = force_tiled_decode + encode = Flux2VaeEncodeInvocation.vae_encode + encoded_with: list[tuple[tuple[int, ...], bool, int]] = [] + + def recording(**kwargs): + encoded_with.append((tuple(kwargs["image_tensor"].shape), kwargs["tiled"], kwargs["tile_size"])) + return encode(**kwargs) + + monkeypatch.setattr(Flux2VaeEncodeInvocation, "vae_encode", staticmethod(recording)) + bn_mean, bn_std = vae.bn.running_mean, torch.sqrt(vae.bn.running_var + vae.bn.eps) + + _denoise(control=_control_field(tiled=tiled, tile_size=tile_size))._build_control_context( + context, bn_mean, bn_std, image_seq_len=IMAGE_TOKENS, ref_image_seq_len=0 + ) + + # The control image (half size in the gallery) and the masked inpaint image, both at the generation size. + assert encoded_with == [((1, 3, SIDE, SIDE), expected_tiled, tile_size)] * 2 + + +def test_control_images_that_do_not_cover_the_latents_are_refused() -> None: + """Init latents of another size than width x height would otherwise meet the context in the hook as a shape + error.""" + vae = _tiny_vae() + bn_mean, bn_std = vae.bn.running_mean, torch.sqrt(vae.bn.running_var + vae.bn.eps) + + with pytest.raises(ValueError, match="generation size"): + _denoise()._build_control_context( + _context(vae=vae), bn_mean, bn_std, image_seq_len=4 * IMAGE_TOKENS, ref_image_seq_len=0 + ) + + +# --- the control context the node builds, against an independent restatement --- + + +def _pixels(image: Image.Image) -> torch.Tensor: + """An RGB image at generation size as the VAE takes it: (1, 3, H, W) in [-1, 1].""" + resized = image.convert("RGB").resize((SIDE, SIDE), Image.Resampling.LANCZOS) + return torch.from_numpy(np.asarray(resized, dtype=np.float32) / 127.5 - 1.0).permute(2, 0, 1).unsqueeze(0) + + +def _patchify(latents: torch.Tensor) -> torch.Tensor: + """VideoX-Fun `Flux2ControlPipeline._patchify_latents`.""" + b, c, h, w = latents.shape + return latents.view(b, c, h // 2, 2, w // 2, 2).permute(0, 1, 3, 5, 2, 4).reshape(b, c * 4, h // 2, w // 2) + + +def _pack(latents: torch.Tensor) -> torch.Tensor: + """VideoX-Fun `Flux2ControlPipeline._pack_latents`.""" + b, c, h, w = latents.shape + return latents.reshape(b, c, h * w).permute(0, 2, 1) + + +@torch.no_grad() +def _normalized_encoding(vae: AutoencoderKLFlux2, pixels: torch.Tensor) -> torch.Tensor: + """`pipeline_flux2_control.py`: encode, take the mode, patchify, batch-normalize with the VAE's running stats.""" + patches = _patchify(vae.encode(pixels).latent_dist.mode()) + mean = vae.bn.running_mean.view(1, -1, 1, 1) + std = torch.sqrt(vae.bn.running_var + vae.bn.eps).view(1, -1, 1, 1) + return _pack((patches - mean) / std) + + +def _context_the_denoise_installs(monkeypatch: pytest.MonkeyPatch, control: Flux2ControlField): + """Runs the denoise up to the hooks and returns the control context it hands them, with the VAE it encoded with: + the node's own image loading, resizing, batch-norm statistics and encode, nothing stood in.""" + installed: list[torch.Tensor] = [] + + @contextmanager + def recording_install(_transformer, _branch, control_context, *, scale): + installed.append(control_context) + raise _Stop + yield + + monkeypatch.setattr(flux2_denoise, "install_fun_control", recording_install) + transformer, branch, vae = _tiny_transformer(), _tiny_branch(), _tiny_vae() + context = _context(_loaded(transformer, _yielding(transformer)), _loaded(branch, _yielding(branch)), vae) + + with pytest.raises(_Stop): + _denoise(control=control)._run_diffusion(context) + + (control_context,) = installed + return control_context.float(), vae + + +# The context reaches the hooks in bfloat16; the restatement runs in float32. +BF16 = {"atol": 2e-2, "rtol": 2e-2} + + +def test_a_control_image_alone_fills_the_control_features_and_leaves_the_inpaint_features_zero( + monkeypatch: pytest.MonkeyPatch, +) -> None: + control_context, vae = _context_the_denoise_installs( + monkeypatch, _control_field(inpaint_image_name=None, inpaint_mask_name=None) + ) + + expected_control = _normalized_encoding(vae, _pixels(_control_image())) + torch.testing.assert_close(control_context[..., :128], expected_control, **BF16) + assert torch.equal(control_context[..., 128:], torch.zeros(1, IMAGE_TOKENS, 132)) + + +def test_an_inpaint_pair_alone_fills_the_keep_mask_and_the_masked_image_and_no_control( + monkeypatch: pytest.MonkeyPatch, +) -> None: + control_context, vae = _context_the_denoise_installs(monkeypatch, _control_field(image_name=None)) + + assert torch.equal(control_context[..., :128], torch.zeros(1, IMAGE_TOKENS, 128)) + # The mask is white (regenerate) in the top-left quarter: the keep channel is 0 there and 1 elsewhere, at latent + # resolution, then patchified with the latents. + keep = torch.ones(1, 1, SIDE // 8, SIDE // 8) + keep[..., : SIDE // 16, : SIDE // 16] = 0.0 + assert torch.equal(control_context[..., 128:132], _pack(_patchify(keep))) + masked = _pixels(_inpaint_image()) + masked[..., : SIDE // 2, : SIDE // 2] = 0.0 + torch.testing.assert_close(control_context[..., 132:], _normalized_encoding(vae, masked), **BF16) + + +def test_a_control_encode_that_runs_out_of_memory_is_retried_in_tiles() -> None: + """As the FLUX.2 image-to-latents node does: the generation-size encode is the one most likely not to fit.""" + vae = _tiny_vae() + encode = vae.encode + tiling_at_call: list[bool] = [] + + def out_of_memory_once(*args, **kwargs): + tiling_at_call.append(vae.use_tiling) + if len(tiling_at_call) == 1: + raise torch.cuda.OutOfMemoryError("CUDA out of memory") + return encode(*args, **kwargs) + + vae.encode = out_of_memory_once + context = _context(vae=vae) + bn_mean, bn_std = vae.bn.running_mean, torch.sqrt(vae.bn.running_var + vae.bn.eps) + + packed = _denoise()._build_control_context( + context, bn_mean, bn_std, image_seq_len=IMAGE_TOKENS, ref_image_seq_len=0 + ) + + # The control image once untiled and once tiled, then the masked inpaint image untiled again. + assert tiling_at_call == [False, True, False] + assert packed.shape == (1, IMAGE_TOKENS, FLUX2_FUN_CONTROL_IN_DIM) + context.logger.warning.assert_called_once() diff --git a/tests/app/invocations/test_frontend_qwen_image_control_graphs.py b/tests/app/invocations/test_frontend_fun_control_graphs.py similarity index 51% rename from tests/app/invocations/test_frontend_qwen_image_control_graphs.py rename to tests/app/invocations/test_frontend_fun_control_graphs.py index 214bd29f208..a973c3fef13 100644 --- a/tests/app/invocations/test_frontend_qwen_image_control_graphs.py +++ b/tests/app/invocations/test_frontend_fun_control_graphs.py @@ -1,30 +1,34 @@ -"""The Qwen Image ControlNet canvas graphs webv2 compiles are graphs this backend accepts. - -`qwenImageControlCanvasGraphs.json` is written by webv2's `compileCanvasGraph.test.ts` (regenerate with -`vitest -u`) from the real canvas compiler: a text-to-image submission with one control layer, an inpainting -submission where that layer also hands the control the canvas composite and the inverted canvas mask, and an -outpainting submission where it hands over the infilled image and the combined mask through edges. This module -checks more than names: pydantic validates every node against its invocation (bounds such as -`qwen_image_control.control_context_scale` in [0, 2] included), `Graph.validate_self` checks every edge type into -`qwen_image_denoise.control` and `.vae`, the control node's own `invoke` runs on the fields it would receive, and +"""The Fun-ControlNet-Union canvas graphs webv2 compiles are graphs this backend accepts. + +`qwenImageControlCanvasGraphs.json` and `flux2ControlCanvasGraphs.json` are written by webv2's +`compileCanvasGraph.test.ts` (regenerate with `vitest -u`) from the real canvas compiler, one per family: a +text-to-image submission with one control layer, an inpainting submission where that layer also hands the control the +canvas composite and the inverted canvas mask, and an outpainting submission where it hands over the infilled image +and the combined mask through edges. This module checks more than names: pydantic validates every node against its +invocation (bounds such as `control_context_scale` in [0, 2] included), `Graph.validate_self` checks every edge type +into the denoise's `control` and `vae`, the control node's own `invoke` runs on the fields it would receive, and `core_metadata` is serialised the way the gallery persists it. No model is loaded. """ import json +from dataclasses import dataclass from pathlib import Path from typing import Any import pytest +from invokeai.app.invocations.baseinvocation import BaseInvocation from invokeai.app.invocations.fields import ImageField +from invokeai.app.invocations.flux2.flux2_control import Flux2ControlInvocation +from invokeai.app.invocations.flux2.flux2_denoise import Flux2DenoiseInvocation from invokeai.app.invocations.image import ImageLerpInvocation from invokeai.app.invocations.metadata import CoreMetadataInvocation -from invokeai.app.invocations.qwen_image.qwen_image_control import QwenImageControlField, QwenImageControlInvocation +from invokeai.app.invocations.qwen_image.qwen_image_control import QwenImageControlInvocation from invokeai.app.invocations.qwen_image.qwen_image_denoise import QwenImageDenoiseInvocation from invokeai.app.invocations.sd.create_gradient_mask import CreateGradientMaskInvocation from invokeai.app.services.shared.graph import Graph -FIXTURE_PATH = ( +SNAPSHOTS = ( Path(__file__).parents[3] / "invokeai" / "frontend" @@ -34,29 +38,65 @@ / "generation" / "core" / "__snapshots__" - / "qwenImageControlCanvasGraphs.json" ) -GRAPHS: dict[str, Any] = { - name: graph for name, graph in json.loads(FIXTURE_PATH.read_text(encoding="utf-8")).items() if name != "_comment" + +@dataclass(frozen=True) +class Family: + """What one family's canvas graphs are made of, as `compileCanvasGraph.test.ts` writes them.""" + + fixture: str + control: type[BaseInvocation] + denoise: type[BaseInvocation] + loader: str + base: str + control_image: str + scale: float + metadata_prefix: str + + +FAMILIES = { + "qwen_image": Family( + fixture="qwenImageControlCanvasGraphs.json", + control=QwenImageControlInvocation, + denoise=QwenImageDenoiseInvocation, + loader="qwen_image_model_loader", + base="qwen-image", + control_image="q-control.png", + scale=0.85, + metadata_prefix="qwen_image", + ), + "flux2": Family( + fixture="flux2ControlCanvasGraphs.json", + control=Flux2ControlInvocation, + denoise=Flux2DenoiseInvocation, + loader="flux2_dev_model_loader", + base="flux2", + control_image="f-control.png", + scale=0.75, + metadata_prefix="flux2", + ), +} + +GRAPHS: dict[str, dict[str, Any]] = { + family: { + name: graph + for name, graph in json.loads((SNAPSHOTS / spec.fixture).read_text(encoding="utf-8")).items() + if name != "_comment" + } + for family, spec in FAMILIES.items() } +CASES = [(family, name) for family in sorted(GRAPHS) for name in sorted(GRAPHS[family])] -@pytest.fixture(params=sorted(GRAPHS), ids=str) -def graph(request: pytest.FixtureRequest) -> Graph: - graph = Graph.model_validate(GRAPHS[request.param]) +def _graph(family: str, name: str) -> Graph: + graph = Graph.model_validate(GRAPHS[family][name]) graph.validate_self() return graph -def _control_node(graph: Graph) -> QwenImageControlInvocation: - nodes = [node for node in graph.nodes.values() if isinstance(node, QwenImageControlInvocation)] - assert len(nodes) == 1 - return nodes[0] - - -def _denoise_node(graph: Graph) -> QwenImageDenoiseInvocation: - nodes = [node for node in graph.nodes.values() if isinstance(node, QwenImageDenoiseInvocation)] +def _only(graph: Graph, cls: type[BaseInvocation]) -> Any: + nodes = [node for node in graph.nodes.values() if isinstance(node, cls)] assert len(nodes) == 1 return nodes[0] @@ -66,7 +106,7 @@ def _inputs(graph: Graph, node_id: str) -> dict[str, Any]: return {e.destination.field: e.source for e in graph.edges if e.destination.node_id == node_id} -def _control_field(graph: Graph, node: QwenImageControlInvocation) -> QwenImageControlField: +def _control_field(graph: Graph, node: Any) -> Any: """The field the node would emit. `invoke` only repackages the node's own fields, so an image that an edge supplies at run time stands in as the image its source node would produce.""" runtime = node.model_copy( @@ -76,74 +116,80 @@ def _control_field(graph: Graph, node: QwenImageControlInvocation) -> QwenImageC if field in {"image", "inpaint_image", "inpaint_mask"} } ) - return runtime.invoke(None).control # type: ignore[arg-type] + return runtime.invoke(None).control -def test_the_fixtures_cover_every_canvas_mode_with_one_control_layer() -> None: - assert sorted(GRAPHS) == ["inpaint_control_layer", "outpaint_control_layer", "txt2img_control_layer"] - for name, raw in GRAPHS.items(): +@pytest.mark.parametrize("family", sorted(FAMILIES)) +def test_the_fixtures_cover_every_canvas_mode_with_one_control_layer(family: str) -> None: + spec = FAMILIES[family] + assert sorted(GRAPHS[family]) == ["inpaint_control_layer", "outpaint_control_layer", "txt2img_control_layer"] + for name, raw in GRAPHS[family].items(): types = [node["type"] for node in raw["nodes"].values()] - assert types.count("qwen_image_control") == 1, name - assert types.count("qwen_image_denoise") == 1, name + assert types.count(spec.control.get_type()) == 1, name + assert types.count(spec.denoise.get_type()) == 1, name -@pytest.mark.parametrize("name", sorted(GRAPHS)) -def test_every_field_the_frontend_writes_is_one_the_invocation_declares(name: str) -> None: +@pytest.mark.parametrize(("family", "name"), CASES) +def test_every_field_the_frontend_writes_is_one_the_invocation_declares(family: str, name: str) -> None: """Pydantic ignores an unknown key, so a misnamed field (`weight` for `control_context_scale`) would validate and run at its default. Values must also survive validation unchanged rather than being coerced.""" - graph = Graph.model_validate(GRAPHS[name]) - for node_id, raw in GRAPHS[name]["nodes"].items(): + graph = Graph.model_validate(GRAPHS[family][name]) + for node_id, raw in GRAPHS[family][name]["nodes"].items(): node = graph.nodes[node_id] if type(node).model_config.get("extra") == "allow": # `core_metadata` records whatever the graph gives it, feature fields included, and persists the extras. continue unknown = set(raw) - set(type(node).model_fields) assert unknown == set(), f"{raw['type']} has no field(s) {sorted(unknown)}" - if isinstance(node, QwenImageControlInvocation): + if isinstance(node, FAMILIES[family].control): written = { field: raw[field] for field in ("control_context_scale", "begin_step_percent", "end_step_percent") } assert {field: getattr(node, field) for field in written} == written -def test_the_control_reaches_the_denoise_directly_beside_the_vae_it_needs(graph: Graph) -> None: - """`qwen_image_denoise.control` is one field, not a collection, and the denoise refuses a control unless the - VAE that encodes its images is connected too.""" - control = _control_node(graph) - denoise = _denoise_node(graph) - inputs = _inputs(graph, denoise.id) +@pytest.mark.parametrize(("family", "name"), CASES) +def test_the_control_reaches_the_denoise_directly_beside_the_vae_it_needs(family: str, name: str) -> None: + """The denoise's `control` is one field, not a collection, and it encodes the control's images with the VAE + connected beside it.""" + spec = FAMILIES[family] + graph = _graph(family, name) + control = _only(graph, spec.control) + inputs = _inputs(graph, _only(graph, spec.denoise).id) assert (inputs["control"].node_id, inputs["control"].field) == (control.id, "control") - assert graph.nodes[inputs["vae"].node_id].get_type() == "qwen_image_model_loader" + assert graph.nodes[inputs["vae"].node_id].get_type() == spec.loader assert inputs["vae"].field == "vae" - assert not any(node.get_type() == "collect" for node in graph.nodes.values()) - assert control.control_model.base.value == "qwen-image" + assert control.control_model.base.value == spec.base assert control.control_model.type.value == "controlnet" - assert control.control_context_scale == 0.85 + assert control.control_context_scale == spec.scale assert (control.begin_step_percent, control.end_step_percent) == (0.0, 1.0) -def test_text_to_image_sends_the_control_image_alone() -> None: - graph = Graph.model_validate(GRAPHS["txt2img_control_layer"]) - control = _control_node(graph) +@pytest.mark.parametrize("family", sorted(FAMILIES)) +def test_text_to_image_sends_the_control_image_alone(family: str) -> None: + spec = FAMILIES[family] + graph = _graph(family, "txt2img_control_layer") + control = _only(graph, spec.control) - assert control.image is not None and control.image.image_name == "q-control.png" + assert control.image is not None and control.image.image_name == spec.control_image assert control.inpaint_image is None and control.inpaint_mask is None assert _inputs(graph, control.id) == {} assert not any(isinstance(node, ImageLerpInvocation) for node in graph.nodes.values()) field = _control_field(graph, control) - assert field.image_name == "q-control.png" + assert field.image_name == spec.control_image assert field.inpaint_image_name is None and field.inpaint_mask_name is None -def test_inpainting_adds_the_composite_and_the_inverted_uploaded_mask() -> None: +@pytest.mark.parametrize("family", sorted(FAMILIES)) +def test_inpainting_adds_the_composite_and_the_inverted_uploaded_mask(family: str) -> None: """Without Scale Before Processing the canvas uploads are read as fixed image fields, not through resize nodes. The canvas mask is white = keep; the control regenerates white, so an `img_lerp` 255 -> 0 feeds its mask.""" - graph = Graph.model_validate(GRAPHS["inpaint_control_layer"]) - graph.validate_self() - control = _control_node(graph) + spec = FAMILIES[family] + graph = _graph(family, "inpaint_control_layer") + control = _only(graph, spec.control) - assert control.image is not None and control.image.image_name == "q-control.png" + assert control.image is not None and control.image.image_name == spec.control_image assert control.inpaint_image is not None and control.inpaint_image.image_name == "canvas-composite.png" inputs = _inputs(graph, control.id) assert set(inputs) == {"inpaint_mask"} @@ -154,18 +200,19 @@ def test_inpainting_adds_the_composite_and_the_inverted_uploaded_mask() -> None: assert inputs["inpaint_mask"].field == "image" assert _inputs(graph, invert.id) == {} # The denoise mask is the uploaded canvas mask as is; only the control gets the inverted copy. - gradient_mask = graph.nodes[_inputs(graph, _denoise_node(graph).id)["denoise_mask"].node_id] + gradient_mask = graph.nodes[_inputs(graph, _only(graph, spec.denoise).id)["denoise_mask"].node_id] assert isinstance(gradient_mask, CreateGradientMaskInvocation) assert gradient_mask.mask.image_name == "canvas-mask.png" field = _control_field(graph, control) - assert (field.image_name, field.inpaint_image_name) == ("q-control.png", "canvas-composite.png") + assert (field.image_name, field.inpaint_image_name) == (spec.control_image, "canvas-composite.png") assert field.inpaint_mask_name == f"{control.id}.inpaint_mask" -def test_outpainting_adds_the_infilled_image_and_the_inverted_combined_mask() -> None: - graph = Graph.model_validate(GRAPHS["outpaint_control_layer"]) - graph.validate_self() - control = _control_node(graph) +@pytest.mark.parametrize("family", sorted(FAMILIES)) +def test_outpainting_adds_the_infilled_image_and_the_inverted_combined_mask(family: str) -> None: + spec = FAMILIES[family] + graph = _graph(family, "outpaint_control_layer") + control = _only(graph, spec.control) inputs = _inputs(graph, control.id) assert set(inputs) == {"inpaint_image", "inpaint_mask"} @@ -179,32 +226,26 @@ def test_outpainting_adds_the_infilled_image_and_the_inverted_combined_mask() -> # The control reads the same infilled image the encode the denoise starts from reads. assert _inputs(graph, "canvas_i2l")["image"].node_id == inputs["inpaint_image"].node_id field = _control_field(graph, control) - assert field.image_name == "q-control.png" + assert field.image_name == spec.control_image assert field.inpaint_image_name is not None and field.inpaint_mask_name is not None -def test_the_control_node_refuses_the_half_pair_the_frontend_never_sends() -> None: +@pytest.mark.parametrize("family", sorted(FAMILIES)) +def test_the_control_node_refuses_the_half_pair_the_frontend_never_sends(family: str) -> None: """The frontend sends the inpaint image and mask together or not at all; pin the node constraint it mirrors.""" - graph = Graph.model_validate(GRAPHS["inpaint_control_layer"]) - control = _control_node(graph) - half = control.model_copy(update={"inpaint_mask": None}) + graph = Graph.model_validate(GRAPHS[family]["inpaint_control_layer"]) + half = _only(graph, FAMILIES[family].control).model_copy(update={"inpaint_mask": None}) with pytest.raises(ValueError, match="go together"): - half.invoke(None) # type: ignore[arg-type] + half.invoke(None) -@pytest.mark.parametrize( - ("name", "mode"), - [ - ("txt2img_control_layer", "qwen_image_txt2img"), - ("inpaint_control_layer", "qwen_image_inpaint"), - ("outpaint_control_layer", "qwen_image_outpaint"), - ], -) -def test_persisted_metadata_records_the_canvas_mode(name: str, mode: str) -> None: - graph = Graph.model_validate(GRAPHS[name]) +@pytest.mark.parametrize(("family", "name"), CASES) +def test_persisted_metadata_records_the_canvas_mode(family: str, name: str) -> None: + graph = Graph.model_validate(GRAPHS[family][name]) metadata = next(node for node in graph.nodes.values() if isinstance(node, CoreMetadataInvocation)) persisted = metadata.invoke(None).metadata.root # type: ignore[arg-type] - assert persisted["generation_mode"] == mode + mode = name.removesuffix("_control_layer") + assert persisted["generation_mode"] == f"{FAMILIES[family].metadata_prefix}_{mode}" diff --git a/tests/backend/architectures/test_features.py b/tests/backend/architectures/test_features.py index 94970513b58..82109ba34bb 100644 --- a/tests/backend/architectures/test_features.py +++ b/tests/backend/architectures/test_features.py @@ -71,6 +71,7 @@ def test_the_sd_family_grid_is_the_vae_compression() -> None: ("z_image_control", {"z-image"}), ("anima_lllite", {"anima"}), ("qwen_image_control", {"qwen-image"}), + ("flux2_control", {"flux2"}), ], ) def test_control_kinds_match_the_frontend_policy(kind: ControlKind, expected: set[str]) -> None: diff --git a/tests/backend/flux2/test_denoise_before_step.py b/tests/backend/flux2/test_denoise_before_step.py new file mode 100644 index 00000000000..2749af40928 --- /dev/null +++ b/tests/backend/flux2/test_denoise_before_step.py @@ -0,0 +1,75 @@ +"""`denoise()`'s `before_step` seam: which user step each forward pass belongs to. + +A per-step setting -- a ControlNet's begin/end range -- is set from this call, so every forward of a step, the +negative one and Heun's second-order one included, has to see the index of the step it belongs to. +""" + +from typing import Any + +import pytest +import torch +from diffusers.schedulers.scheduling_flow_match_euler_discrete import FlowMatchEulerDiscreteScheduler +from diffusers.schedulers.scheduling_flow_match_heun_discrete import FlowMatchHeunDiscreteScheduler + +from invokeai.backend.flux2.denoise import denoise + +TOKENS = 4 +CHANNELS = 8 +TIMESTEPS = [1.0, 0.75, 0.5, 0.25, 0.0] # four user steps + + +class StepRecordingModel: + """Records, per forward pass, the step `before_step` last announced, and predicts a constant velocity.""" + + def __init__(self) -> None: + self.current_step: int | None = None + self.steps_seen: list[int | None] = [] + + def announce(self, step_index: int) -> None: + self.current_step = step_index + + def __call__(self, hidden_states: torch.Tensor, **_kwargs: Any) -> tuple[torch.Tensor]: + self.steps_seen.append(self.current_step) + return (torch.full_like(hidden_states, 0.5),) + + +def _run(model: StepRecordingModel, scheduler: Any, cfg_scale: float) -> None: + generator = torch.Generator().manual_seed(0) + denoise( + model=model, # type: ignore[arg-type] + img=torch.randn(1, TOKENS, CHANNELS, generator=generator), + img_ids=torch.zeros(1, TOKENS, 4, dtype=torch.long), + txt=torch.randn(1, 3, CHANNELS, generator=generator), + txt_ids=torch.zeros(1, 3, 4, dtype=torch.long), + timesteps=TIMESTEPS, + step_callback=lambda _state: None, + guidance=1.0, + cfg_scale=[cfg_scale] * (len(TIMESTEPS) - 1), + neg_txt=torch.zeros(1, 3, CHANNELS), + neg_txt_ids=torch.zeros(1, 3, 4, dtype=torch.long), + scheduler=scheduler, + before_step=model.announce, + ) + + +@pytest.mark.parametrize( + "scheduler", + [None, FlowMatchEulerDiscreteScheduler(num_train_timesteps=1000, shift=3.0)], + ids=["manual-euler", "scheduler-euler"], +) +def test_both_guidance_forwards_of_a_step_see_its_index(scheduler) -> None: + model = StepRecordingModel() + + _run(model, scheduler, cfg_scale=2.0) + + assert model.steps_seen == [0, 0, 1, 1, 2, 2, 3, 3] + + +def test_heuns_two_forwards_of_a_step_share_its_index() -> None: + """Heun evaluates the model at a step's start and at its end, except on the last step to sigma 0, which it takes + as a single Euler evaluation: seven forwards for four steps, numbered by the step they advance.""" + model = StepRecordingModel() + + _run(model, FlowMatchHeunDiscreteScheduler(num_train_timesteps=1000, shift=3.0), cfg_scale=1.0) + + assert model.steps_seen == [0, 0, 1, 1, 2, 2, 3] diff --git a/tests/backend/fun_controlnet/test_flux2_control_context.py b/tests/backend/fun_controlnet/test_flux2_control_context.py new file mode 100644 index 00000000000..8164ec0d0d8 --- /dev/null +++ b/tests/backend/fun_controlnet/test_flux2_control_context.py @@ -0,0 +1,111 @@ +"""The FLUX.2 Fun control context is VideoX-Fun's, value for value. + +`_videox_context` restates `pipeline_flux2_control.py` (the block that builds `control_context`): each part is encoded, +patchified 2x2 to 128 channels, batch-normalized only if it was provided, and packed; the keep mask is `1 - mask` +nearest-sampled to latent resolution and patchified to 4 features; the three are concatenated per token. The function +under test takes the other route -- normalize, put back to 32 channels, let the shared builder stack 65 channels, pack +once -- and must land on the same tensor. +""" + +import pytest +import torch +import torch.nn.functional as F + +from invokeai.backend.fun_controlnet.flux2 import FLUX2_FUN_CONTROL_IN_DIM, build_flux2_control_context + +SIDE = 64 +LATENT_SIDE = SIDE // 8 +LATENT_CHANNELS = 32 + + +def _encode(pixels: torch.Tensor) -> torch.Tensor: + """Stands in for the VAE: an 8x average pool spread over 32 channels, each scaled differently so a channel that + lands in the wrong feature shows up.""" + pooled = F.avg_pool2d(pixels, 8) + channels = torch.cat([pooled] * 11, dim=1)[:, :LATENT_CHANNELS] + return channels * torch.linspace(0.5, 2.0, LATENT_CHANNELS).view(1, -1, 1, 1) + + +def _bn_stats() -> tuple[torch.Tensor, torch.Tensor]: + generator = torch.Generator().manual_seed(0) + mean = torch.randn(4 * LATENT_CHANNELS, generator=generator) * 0.3 + std = torch.rand(4 * LATENT_CHANNELS, generator=generator) + 0.5 + return mean, std + + +def _image(seed: int) -> torch.Tensor: + return torch.rand(1, 3, SIDE, SIDE, generator=torch.Generator().manual_seed(seed)) * 2 - 1 + + +def _soft_mask() -> torch.Tensor: + """Bands below, at and above the 0.5 threshold, so thresholding and the nearest sampling both matter.""" + mask = torch.zeros(1, 1, SIDE, SIDE) + mask[..., :16, :] = 0.5 + mask[..., 16:24, :] = 0.3 + mask[..., 24:40, : SIDE // 2] = 0.9 + return mask + + +# VideoX-Fun `Flux2ControlPipeline._patchify_latents` / `_pack_latents`. +def _patchify(latents: torch.Tensor) -> torch.Tensor: + b, c, h, w = latents.shape + latents = latents.view(b, c, h // 2, 2, w // 2, 2).permute(0, 1, 3, 5, 2, 4) + return latents.reshape(b, c * 4, h // 2, w // 2) + + +def _pack(latents: torch.Tensor) -> torch.Tensor: + b, c, h, w = latents.shape + return latents.reshape(b, c, h * w).permute(0, 2, 1) + + +def _videox_context(bn_mean, bn_std, control_image=None, inpaint_image=None, inpaint_mask=None) -> torch.Tensor: + mean, std = bn_mean.view(1, -1, 1, 1), bn_std.view(1, -1, 1, 1) + if inpaint_mask is not None: + mask_condition = torch.where(inpaint_mask >= 0.5, 1.0, 0.0).tile(1, 3, 1, 1) + else: + mask_condition = torch.ones(1, 3, SIDE, SIDE) + if inpaint_image is not None: + inpaint_latent = _encode(inpaint_image * (mask_condition < 0.5)) + else: + inpaint_latent = torch.zeros(1, LATENT_CHANNELS, LATENT_SIDE, LATENT_SIDE) + control_latents = _encode(control_image) if control_image is not None else torch.zeros_like(inpaint_latent) + + keep = F.interpolate(1 - mask_condition[:, :1], size=control_latents.shape[-2:], mode="nearest") + keep = _pack(_patchify(keep)) + inpaint_latent = _patchify(inpaint_latent) + if inpaint_image is not None: + inpaint_latent = (inpaint_latent - mean) / std + control_latents = _patchify(control_latents) + if control_image is not None: + control_latents = (control_latents - mean) / std + return torch.cat([_pack(control_latents), keep, _pack(inpaint_latent)], dim=2) + + +@pytest.mark.parametrize( + "parts", + [ + {"control_image": _image(1)}, + {"inpaint_image": _image(2), "inpaint_mask": _soft_mask()}, + {"control_image": _image(3), "inpaint_image": _image(4), "inpaint_mask": _soft_mask()}, + ], + ids=["control", "inpaint", "both"], +) +def test_the_context_is_videox_funs_value_for_value(parts) -> None: + bn_mean, bn_std = _bn_stats() + + context = build_flux2_control_context(encode=_encode, bn_mean=bn_mean, bn_std=bn_std, **parts) + + assert context.shape == (1, (LATENT_SIDE // 2) ** 2, FLUX2_FUN_CONTROL_IN_DIM) + assert torch.equal(context, _videox_context(bn_mean, bn_std, **parts)) + + +def test_an_absent_part_stays_zero_rather_than_normalized_zero() -> None: + """The normalization would turn an absent part into `-mean / std`. Zeros are what training feeds there most of + the time: always for a dropped control image, and for 90 % of control-only samples' masked image (the rest, and + VideoX-Fun's inference scripts, use the normalized encoding of the grey masked image).""" + bn_mean, bn_std = _bn_stats() + assert bn_mean.abs().min() > 0, "the stats must move zero for this test to mean anything" + + context = build_flux2_control_context(encode=_encode, bn_mean=bn_mean, bn_std=bn_std, control_image=_image(5)) + + assert torch.equal(context[..., 128:], torch.zeros(1, (LATENT_SIDE // 2) ** 2, 132)) diff --git a/tests/backend/fun_controlnet/test_flux2_fun_control.py b/tests/backend/fun_controlnet/test_flux2_fun_control.py new file mode 100644 index 00000000000..7fccd929900 --- /dev/null +++ b/tests/backend/fun_controlnet/test_flux2_fun_control.py @@ -0,0 +1,357 @@ +"""The FLUX.2 Fun control branch, hooked into the real transformer, computes what VideoX-Fun's formulation does. + +`_videox_forward` is the recipe written out against diffusers' `Flux2Transformer2DModel`: the base preamble, the control +chain threading its own text stream from the base's, and an explicit loop over the double-stream blocks adding each +hint after its listed layer to the whole image stream, reference tokens included. It shares nothing with the hooks +beyond the modules' own forwards. Everything runs in float32 on the CPU. +""" + +import pytest +import torch +from diffusers.models.transformers.transformer_flux2 import Flux2Transformer2DModel + +from invokeai.backend.fun_controlnet.flux2 import ( + FLUX2_FUN_CONTROL_IN_DIM, + FLUX2_FUN_CONTROL_LAYERS, + Flux2FunControlBranch, +) +from invokeai.backend.fun_controlnet.hooks import install_fun_control +from tests.backend.model_manager.load.state_dicts.flux2_fun_controlnet_keys import state_dict_keys + +HIDDEN = 16 # two heads of 8 +HEAD_DIM = 8 +TEXT_DIM = 12 +GENERATED_TOKENS = 16 # a 4x4 packed grid +REFERENCE_TOKENS = 4 # one 2x2 reference image +TEXT_TOKENS = 6 +SCALE = 0.75 + + +def _randomized(module: torch.nn.Module, seed: int) -> torch.nn.Module: + """Every parameter from N(0, 0.1). diffusers and VideoX-Fun zero-initialise projections (VideoX-Fun `after_proj` + and `before_proj` included), which would leave a hint that is zero and a parity test that cannot fail.""" + torch.manual_seed(seed) + for parameter in module.parameters(): + torch.nn.init.normal_(parameter, std=0.1) + return module.eval() + + +@pytest.fixture +def transformer() -> Flux2Transformer2DModel: + """The real FLUX.2 transformer at toy width: eight double-stream blocks, so the real layer map (0, 2, 4, 6) fits.""" + model = Flux2Transformer2DModel( + patch_size=1, + in_channels=8, + num_layers=8, + num_single_layers=2, + attention_head_dim=HEAD_DIM, + num_attention_heads=HIDDEN // HEAD_DIM, + joint_attention_dim=TEXT_DIM, + timestep_guidance_channels=16, + axes_dims_rope=(2, 2, 2, 2), + ) + return _randomized(model, seed=0) + + +def _branch(control_layers=FLUX2_FUN_CONTROL_LAYERS) -> Flux2FunControlBranch: + branch = Flux2FunControlBranch( + hidden_size=HIDDEN, + num_attention_heads=HIDDEN // HEAD_DIM, + attention_head_dim=HEAD_DIM, + control_layers=control_layers, + ) + return _randomized(branch, seed=1) + + +@pytest.fixture +def branch() -> Flux2FunControlBranch: + return _branch() + + +def _ids(t: int, side: int) -> torch.Tensor: + ids = torch.zeros(side, side, 4, dtype=torch.long) + ids[..., 0] = t + ids[..., 1] = torch.arange(side)[:, None] + ids[..., 2] = torch.arange(side)[None, :] + return ids.reshape(1, side * side, 4) + + +@pytest.fixture +def inputs(transformer) -> dict: + """One forward's arguments with a reference image: its tokens follow the generated ones, at T=10, as + `Flux2RefImageExtension` lays them out.""" + torch.manual_seed(2) + text_ids = torch.zeros(1, TEXT_TOKENS, 4, dtype=torch.long) + text_ids[..., 3] = torch.arange(TEXT_TOKENS) + return { + "hidden_states": torch.randn(1, GENERATED_TOKENS + REFERENCE_TOKENS, transformer.config.in_channels), + "encoder_hidden_states": torch.randn(1, TEXT_TOKENS, TEXT_DIM), + "timestep": torch.tensor([0.5]), + "img_ids": torch.cat([_ids(0, 4), _ids(10, 2)], dim=1), + "txt_ids": text_ids, + "guidance": torch.tensor([3.5]), + } + + +@pytest.fixture +def control_context() -> torch.Tensor: + """The generated tokens' context, zero-padded for the reference tokens as VideoX-Fun pads it.""" + torch.manual_seed(3) + generated = torch.randn(1, GENERATED_TOKENS, FLUX2_FUN_CONTROL_IN_DIM) + return torch.cat([generated, torch.zeros(1, REFERENCE_TOKENS, FLUX2_FUN_CONTROL_IN_DIM)], dim=1) + + +def _videox_forward(model, branch, control_context, scale, **inputs) -> tuple[torch.Tensor, list[torch.Tensor]]: + timestep = inputs["timestep"] * 1000 + guidance = inputs["guidance"] * 1000 + temb = model.time_guidance_embed(timestep, guidance) + shared = { + "temb_mod_img": model.double_stream_modulation_img(temb), + "temb_mod_txt": model.double_stream_modulation_txt(temb), + } + hidden = model.x_embedder(inputs["hidden_states"]) + text = model.context_embedder(inputs["encoder_hidden_states"]) + image_rope = model.pos_embed(inputs["img_ids"][0]) + text_rope = model.pos_embed(inputs["txt_ids"][0]) + rope = (torch.cat([text_rope[0], image_rope[0]]), torch.cat([text_rope[1], image_rope[1]])) + shared["image_rotary_emb"] = rope + + # `Flux2ControlTransformer2DModel.forward_control`: block 0 adds the embedded image stream, every block threads + # the text stream it was handed by the previous one, and each block's `after_proj` is a hint. + c = branch.control_img_in(control_context) + control_text = text + hints = [] + for index, block in enumerate(branch.control_blocks): + if index == 0: + c = block.before_proj(c) + hidden + control_text, c = block(hidden_states=c, encoder_hidden_states=control_text, **shared) + hints.append(block.after_proj(c)) + + # `BaseFlux2TransformerBlock.forward`: the hint goes onto the block's image-stream output, once. + for index, block in enumerate(model.transformer_blocks): + text, hidden = block(hidden_states=hidden, encoder_hidden_states=text, **shared) + if index in branch.control_layers: + hidden = hidden + hints[branch.control_layers.index(index)] * scale + + joint = torch.cat([text, hidden], dim=1) + single_mod = model.single_stream_modulation(temb) + for block in model.single_transformer_blocks: + joint = block(hidden_states=joint, encoder_hidden_states=None, temb_mod=single_mod, image_rotary_emb=rope) + return model.proj_out(model.norm_out(joint[:, TEXT_TOKENS:], temb)), hints + + +def _forward(model, inputs, **extra) -> torch.Tensor: + return model(**inputs, **extra, return_dict=False)[0] + + +def _hook_count(model) -> int: + return sum(len(block._forward_hooks) + len(block._forward_pre_hooks) for block in model.transformer_blocks) + + +@torch.no_grad() +def test_the_hooked_forward_computes_the_videox_formulation_with_a_reference_image( + transformer, branch, inputs, control_context +) -> None: + expected, hints = _videox_forward(transformer, branch, control_context, SCALE, **inputs) + plain = _forward(transformer, inputs) + + with install_fun_control(transformer, branch, control_context, scale=SCALE): + hooked = _forward(transformer, inputs) + + assert torch.equal(hooked, expected) + assert not torch.equal(hooked, plain) + # The context is zero for the reference tokens, their hints are not: the stream they are added to carries the + # reference image, so leaving those rows out would be a different model. + assert all(hint[:, GENERATED_TOKENS:].abs().sum() > 0 for hint in hints) + + +@torch.no_grad() +def test_a_branch_on_the_wrong_layers_no_longer_matches(transformer, branch, inputs, control_context) -> None: + """The parity above can tell where the hints land: the same weights after the odd base blocks compute something + else, so a layer map that drifted from (0, 2, 4, 6) would fail it.""" + expected, _ = _videox_forward(transformer, branch, control_context, SCALE, **inputs) + misplaced = Flux2FunControlBranch.from_state_dict( + branch.state_dict(), dtype=torch.float32, control_layers=(1, 3, 5, 7), attention_head_dim=HEAD_DIM + ) + + with install_fun_control(transformer, misplaced, control_context, scale=SCALE): + assert not torch.allclose(_forward(transformer, inputs), expected) + + +@torch.no_grad() +def test_hints_land_on_the_image_stream_of_the_listed_layers_only(transformer, branch, inputs, control_context) -> None: + """Each double-stream block's output is recorded before the hint hook sees it and after: the text stream comes + through untouched everywhere, and the image stream moves by exactly the scaled hint at the listed layers.""" + _, hints = _videox_forward(transformer, branch, control_context, SCALE, **inputs) + before: dict[int, tuple] = {} + after: dict[int, tuple] = {} + blocks = list(transformer.transformer_blocks) + handles = [ + block.register_forward_hook(lambda _m, _a, out, i=i: before.__setitem__(i, out)) + for i, block in enumerate(blocks) + ] + try: + with install_fun_control(transformer, branch, control_context, scale=SCALE): + handles += [ + block.register_forward_hook(lambda _m, _a, out, i=i: after.__setitem__(i, out)) + for i, block in enumerate(blocks) + ] + _forward(transformer, inputs) + finally: + for handle in handles: + handle.remove() + + for index in range(len(blocks)): + text_before, image_before = before[index] + text_after, image_after = after[index] + assert text_after is text_before + if index in branch.control_layers: + assert torch.equal(image_after, image_before + hints[branch.control_layers.index(index)] * SCALE) + else: + assert image_after is image_before + + +@torch.no_grad() +def test_scale_zero_and_an_inactive_handle_leave_the_forward_untouched( + transformer, branch, inputs, control_context +) -> None: + plain = _forward(transformer, inputs) + + with install_fun_control(transformer, branch, control_context, scale=0.0): + assert torch.equal(_forward(transformer, inputs), plain) + + with install_fun_control(transformer, branch, control_context, scale=SCALE) as hooks: + hooks.active = False + assert torch.equal(_forward(transformer, inputs), plain) + hooks.active = True + assert not torch.equal(_forward(transformer, inputs), plain) + hooks.active = False + assert torch.equal(_forward(transformer, inputs), plain) + + +@torch.no_grad() +def test_the_hooks_come_off_on_exit_and_when_the_body_raises(transformer, branch, inputs, control_context) -> None: + plain = _forward(transformer, inputs) + + with install_fun_control(transformer, branch, control_context, scale=SCALE): + assert _hook_count(transformer) == 1 + len(branch.control_layers) + assert _hook_count(transformer) == 0 + + with pytest.raises(RuntimeError, match="mid-step"): + with install_fun_control(transformer, branch, control_context, scale=SCALE): + _forward(transformer, inputs) + raise RuntimeError("mid-step") + assert _hook_count(transformer) == 0 + assert torch.equal(_forward(transformer, inputs), plain) + + +@torch.no_grad() +def test_the_branch_refuses_to_run_beside_the_reference_kv_cache(transformer, branch, inputs, control_context) -> None: + """diffusers' FLUX.2 can cache the reference tokens' keys and values per base block. The control blocks would read + and write those layers, so the forward stops at block 0 instead -- and the hooks still come off.""" + with pytest.raises(ValueError, match="KV cache"): + with install_fun_control(transformer, branch, control_context, scale=SCALE): + _forward(transformer, inputs, kv_cache_mode="extract", num_ref_tokens=REFERENCE_TOKENS) + assert _hook_count(transformer) == 0 + + +@torch.no_grad() +def test_the_chain_runs_in_the_branch_dtype_and_hands_hints_back_in_the_base_dtype( + transformer, branch, inputs, control_context +) -> None: + """Everything crossing into the chain -- the two modulations, the text stream, the image stream -- is cast to the + branch's dtype and the hint back. Checked with a float64 branch against the float32 base: the same arithmetic in a + dtype every CPU has a GEMM for.""" + with install_fun_control(transformer, branch, control_context, scale=SCALE): + expected = _forward(transformer, inputs) + wider = Flux2FunControlBranch.from_state_dict(branch.state_dict(), dtype=torch.float64, attention_head_dim=HEAD_DIM) + + with install_fun_control(transformer, wider, control_context, scale=SCALE): + hooked = _forward(transformer, inputs) + + assert hooked.dtype == torch.float32 + assert torch.allclose(hooked, expected, atol=1e-4, rtol=1e-4) + + +def _as_released(state_dict: dict) -> dict: + """The tensors under the names alibaba-pai's file uses for the blocks.""" + return {name.replace("control_blocks.", "control_transformer_blocks.", 1): t for name, t in state_dict.items()} + + +@torch.no_grad() +def test_from_state_dict_rebuilds_the_branch_from_the_released_names( + transformer, branch, inputs, control_context +) -> None: + loaded = Flux2FunControlBranch.from_state_dict( + _as_released(branch.state_dict()), dtype=torch.float32, attention_head_dim=HEAD_DIM + ) + + assert loaded.control_layers == FLUX2_FUN_CONTROL_LAYERS + assert not loaded.training + with install_fun_control(transformer, branch, control_context, scale=SCALE): + expected = _forward(transformer, inputs) + with install_fun_control(transformer, loaded, control_context, scale=SCALE): + assert torch.equal(_forward(transformer, inputs), expected) + + +def test_the_released_layout_reads_as_the_dev_geometry() -> None: + """Against the header of alibaba-pai's file, on the meta device so nothing of the 8.2 GB is allocated: the width, + head count and MLP width come off the tensors, and every one of the 76 tensors finds its parameter.""" + released = { + name: torch.empty(shape, dtype=torch.bfloat16, device="meta") + for name, (shape, _dtype) in state_dict_keys.items() + } + + branch = Flux2FunControlBranch.from_state_dict(released, dtype=torch.bfloat16) + + first = branch.control_blocks[0] + assert (branch.hidden_size, branch.control_in_dim, first.attn.heads, first.mlp_hidden_dim) == (6144, 260, 48, 18432) + assert branch.control_layers == FLUX2_FUN_CONTROL_LAYERS + assert {name: list(t.shape) for name, t in branch.state_dict().items()} == { + name.replace("control_transformer_blocks.", "control_blocks."): shape + for name, (shape, _dtype) in state_dict_keys.items() + } + + +def _without(state_dict: dict, prefix: str) -> dict: + return {name: tensor for name, tensor in state_dict.items() if not name.startswith(prefix)} + + +@pytest.mark.parametrize( + ("rewrite", "message"), + [ + (lambda sd: _without(sd, "control_transformer_blocks.3."), "3 control blocks"), + (lambda sd: {**sd, "control_img_in.weight": torch.zeros(HIDDEN, 132)}, "takes 132"), + (lambda sd: _without(sd, "control_img_in."), "control_img_in.weight"), + (lambda sd: _without(sd, "control_transformer_blocks.0.ff.linear_in."), "feed-forward"), + (lambda sd: _without(sd, "control_transformer_blocks.2.after_proj."), "missing"), + ( + lambda sd: {**sd, "control_transformer_blocks.1.before_proj.weight": torch.zeros(HIDDEN, HIDDEN)}, + "unexpected", + ), + ], + ids=["block-count", "qwen-in-dim", "no-projection", "no-feed-forward", "missing-key", "stray-key"], +) +def test_from_state_dict_refuses_what_is_not_the_flux2_recipe(branch, rewrite, message) -> None: + state_dict = rewrite(_as_released(branch.state_dict())) + with pytest.raises(ValueError, match=message): + Flux2FunControlBranch.from_state_dict(state_dict, dtype=torch.float32, attention_head_dim=HEAD_DIM) + + +def test_a_klein_width_transformer_is_refused_at_install(branch, control_context) -> None: + """The dev branch is 6144 wide and Klein 3072 or 4096; here the same mismatch at toy widths.""" + narrower = Flux2Transformer2DModel( + patch_size=1, + in_channels=8, + num_layers=8, + num_single_layers=1, + attention_head_dim=HEAD_DIM, + num_attention_heads=1, + joint_attention_dim=TEXT_DIM, + timestep_guidance_channels=16, + axes_dims_rope=(2, 2, 2, 2), + ) + + with pytest.raises(ValueError, match="16 wide"), install_fun_control(narrower, branch, control_context, scale=1.0): + pass + assert _hook_count(narrower) == 0 diff --git a/tests/backend/fun_controlnet/test_qwen_image_control_conditioning.py b/tests/backend/fun_controlnet/test_qwen_image_control_conditioning.py index 139d54f29f4..20a9061ae92 100644 --- a/tests/backend/fun_controlnet/test_qwen_image_control_conditioning.py +++ b/tests/backend/fun_controlnet/test_qwen_image_control_conditioning.py @@ -9,7 +9,7 @@ import torch import torch.nn.functional as F -from invokeai.backend.fun_controlnet.conditioning import build_qwen_image_control_context +from invokeai.backend.fun_controlnet.conditioning import build_fun_control_context SIDE = 32 LATENT_SIDE = SIDE // 8 @@ -44,7 +44,7 @@ def test_pure_control_fills_the_control_channels_and_leaves_the_inpaint_channels encode = _Encoder() control_image = _image(0) - context = build_qwen_image_control_context(encode=encode, control_image=control_image) + context = build_fun_control_context(encode=encode, control_image=control_image) assert context.shape == (1, 2 * LATENT_CHANNELS + 1, LATENT_SIDE, LATENT_SIDE) assert torch.equal(context[:, :LATENT_CHANNELS], _Encoder()(control_image)) @@ -57,7 +57,7 @@ def test_pure_inpaint_carries_the_keep_mask_and_the_masked_image_and_no_control( inpaint_image = _image(1) mask = _quadrant_mask() - context = build_qwen_image_control_context(encode=encode, inpaint_image=inpaint_image, inpaint_mask=mask) + context = build_fun_control_context(encode=encode, inpaint_image=inpaint_image, inpaint_mask=mask) assert torch.equal(context[:, :LATENT_CHANNELS], torch.zeros(1, LATENT_CHANNELS, LATENT_SIDE, LATENT_SIDE)) expected_keep = torch.ones(1, 1, LATENT_SIDE, LATENT_SIDE) @@ -75,7 +75,7 @@ def test_control_and_inpaint_together_fill_both_halves() -> None: encode = _Encoder() control_image, inpaint_image = _image(2), _image(3) - context = build_qwen_image_control_context( + context = build_fun_control_context( encode=encode, control_image=control_image, inpaint_image=inpaint_image, inpaint_mask=_quadrant_mask() ) @@ -94,7 +94,7 @@ def test_a_soft_mask_is_thresholded_before_it_becomes_the_keep_channel() -> None mask[..., 8:16, :] = 0.3 mask[..., 16:24, :] = 0.9 - context = build_qwen_image_control_context(encode=encode, inpaint_image=inpaint_image, inpaint_mask=mask) + context = build_fun_control_context(encode=encode, inpaint_image=inpaint_image, inpaint_mask=mask) (encoded,) = encode.inputs regenerated_rows = torch.zeros(1, 3, 8, SIDE) @@ -114,7 +114,7 @@ def test_the_keep_mask_is_sampled_nearest_not_averaged() -> None: mask = torch.zeros(1, 1, SIDE, SIDE) mask[..., 8, :] = 1.0 - context = build_qwen_image_control_context(encode=encode, inpaint_image=_image(4), inpaint_mask=mask) + context = build_fun_control_context(encode=encode, inpaint_image=_image(4), inpaint_mask=mask) keep = context[0, LATENT_CHANNELS] assert set(keep.unique().tolist()) <= {0.0, 1.0} @@ -142,4 +142,4 @@ def test_the_keep_mask_is_sampled_nearest_not_averaged() -> None: ) def test_incomplete_or_mismatched_inputs_are_refused(kwargs, message) -> None: with pytest.raises(ValueError, match=message): - build_qwen_image_control_context(encode=_Encoder(), **kwargs) + build_fun_control_context(encode=_Encoder(), **kwargs) diff --git a/tests/backend/model_manager/configs/test_flux2_fun_controlnet_config.py b/tests/backend/model_manager/configs/test_flux2_fun_controlnet_config.py new file mode 100644 index 00000000000..ed1698a1ec6 --- /dev/null +++ b/tests/backend/model_manager/configs/test_flux2_fun_controlnet_config.py @@ -0,0 +1,99 @@ +"""Identification of alibaba-pai's FLUX.2 [dev] Fun-ControlNet-Union, through the config factory. + +The adapter is a VACE-style control branch: `control_img_in` projects 260 packed channels into FLUX.2 [dev]'s +6144-wide stream, and four `control_transformer_blocks` copy the double-stream `Flux2TransformerBlock` with +`before_proj`/`after_proj` taps. Its Qwen-Image siblings use the same recipe under `control_blocks`. Every case is a +header written back without its data: identification reads nothing else, and each config sees the real key names, +shapes and dtypes. +""" + +from pathlib import Path + +import pytest +from pydantic import TypeAdapter + +from invokeai.backend.model_manager.configs.controlnet import ControlNet_Checkpoint_Flux2_Config +from invokeai.backend.model_manager.configs.factory import AnyModelConfig, ModelConfigFactory +from invokeai.backend.model_manager.configs.identification_utils import NotAMatchError +from invokeai.backend.model_manager.model_on_disk import ModelOnDisk +from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelFormat, ModelType +from tests.backend.model_manager.load.state_dicts import flux2_fun_controlnet_keys, qwen_image_fun_controlnet_keys +from tests.backend.model_manager.load.state_dicts.utils import write_header_only_safetensors + +Keys = dict[str, tuple[list[int], str]] + +FILE_NAME = "FLUX.2-dev-Fun-Controlnet-Union-2602.safetensors" + +_OVERRIDE_FIELDS: dict[str, object] = { + "hash": "blake3:fakehash", + "path": "/fake/models/controlnet.safetensors", + "file_size": 1000, + "name": "controlnet", + "description": "test", + "source": "test", + "source_type": "path", + "key": "test-key", +} + + +def _keys() -> Keys: + return dict(flux2_fun_controlnet_keys.state_dict_keys) + + +def _write(tmp_path: Path, name: str, keys: Keys) -> Path: + return write_header_only_safetensors(tmp_path / name, keys) + + +def test_the_released_file_is_a_flux2_controlnet_and_nothing_else(tmp_path: Path) -> None: + result = ModelConfigFactory.from_model_on_disk(_write(tmp_path, FILE_NAME, _keys()), allow_unknown=False) + + assert type(result.config) is ControlNet_Checkpoint_Flux2_Config, result.details + assert result.match_count == 1, result.details + assert result.config.base is BaseModelType.Flux2 + assert result.config.type is ModelType.ControlNet + assert result.config.format is ModelFormat.Checkpoint + + +def test_a_stored_record_reads_back_as_a_flux2_controlnet(tmp_path: Path) -> None: + """The record crosses the database and the API as a plain dict, so the config has to be a member of + `AnyModelConfig` under a discriminator of its own.""" + stored = ModelConfigFactory.from_model_on_disk( + _write(tmp_path, FILE_NAME, _keys()), allow_unknown=False + ).config.model_dump(mode="json") + + restored = TypeAdapter(AnyModelConfig).validate_python(stored) + + assert type(restored) is ControlNet_Checkpoint_Flux2_Config + assert restored.base is BaseModelType.Flux2 + + +def test_the_qwen_image_sibling_is_refused(tmp_path: Path) -> None: + mod = ModelOnDisk( + _write( + tmp_path, + "Qwen-Image-2512-Fun-Controlnet-Union-2602.safetensors", + qwen_image_fun_controlnet_keys.state_dict_keys, + ) + ) + + with pytest.raises(NotAMatchError): + ControlNet_Checkpoint_Flux2_Config.from_model_on_disk(mod, dict(_OVERRIDE_FIELDS)) + + +def _under_qwen_names(keys: Keys) -> Keys: + return {key.replace("control_transformer_blocks.", "control_blocks.", 1): value for key, value in keys.items()} + + +@pytest.mark.parametrize( + "keys", + [_under_qwen_names(_keys()), {**_keys(), "control_img_in.weight": ([4096, 260], "BF16")}], + ids=["control_blocks_names", "klein_9b_width"], +) +def test_a_branch_with_one_half_of_the_fingerprint_is_refused(tmp_path: Path, keys: Keys) -> None: + """Both halves carry weight: the projection shape alone does not name the recipe, which the FLUX.2 block naming + does, and the FLUX.2 names behind a 4096-wide projection would be a branch for Klein 9B, which nobody publishes + and the denoise could not run.""" + mod = ModelOnDisk(_write(tmp_path, FILE_NAME, keys)) + + with pytest.raises(NotAMatchError): + ControlNet_Checkpoint_Flux2_Config.from_model_on_disk(mod, dict(_OVERRIDE_FIELDS)) diff --git a/tests/backend/model_manager/configs/test_qwen_image_fun_controlnet_config.py b/tests/backend/model_manager/configs/test_qwen_image_fun_controlnet_config.py index ccf0a3bb650..701a0302967 100644 --- a/tests/backend/model_manager/configs/test_qwen_image_fun_controlnet_config.py +++ b/tests/backend/model_manager/configs/test_qwen_image_fun_controlnet_config.py @@ -19,6 +19,7 @@ from invokeai.backend.model_manager.model_on_disk import ModelOnDisk from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelFormat, ModelType from tests.backend.model_manager.load.state_dicts import ( + flux2_fun_controlnet_keys, qwen_image_fun_controlnet_keys, qwen_image_instantx_controlnet_keys, ) @@ -62,14 +63,6 @@ def _bf16(shapes: dict[str, list[int]]) -> Keys: "control_blocks.15.after_proj.weight": [4096, 4096], } ) -FLUX2_FUN_KEYS = _bf16( - { - "control_img_in.weight": [6144, 260], - "control_img_in.bias": [6144], - "control_transformer_blocks.0.attn.to_q.weight": [6144, 6144], - "control_transformer_blocks.0.after_proj.weight": [6144, 6144], - } -) Z_IMAGE_FUN_KEYS = _bf16( { "control_layers.0.attention.qkv.weight": [11520, 3840], @@ -136,7 +129,7 @@ def test_a_stored_record_reads_back_as_a_qwen_image_controlnet(tmp_path: Path) - ("name", "keys"), [ ("Qwen-Image-2.1-Fun-Controlnet-Union.safetensors", QWEN_IMAGE_2_1_FUN_KEYS), - ("FLUX.2-dev-Fun-Controlnet-Union.safetensors", FLUX2_FUN_KEYS), + ("FLUX.2-dev-Fun-Controlnet-Union-2602.safetensors", dict(flux2_fun_controlnet_keys.state_dict_keys)), ("Z-Image-Turbo-Fun-Controlnet-Union.safetensors", Z_IMAGE_FUN_KEYS), ("Qwen-Image-InstantX-ControlNet-Union.safetensors", dict(qwen_image_instantx_controlnet_keys.state_dict_keys)), ("Qwen-Image-DiffSynth-Controlnet.safetensors", DIFFSYNTH_KEYS), diff --git a/tests/backend/model_manager/load/state_dicts/flux2_fun_controlnet_keys.py b/tests/backend/model_manager/load/state_dicts/flux2_fun_controlnet_keys.py new file mode 100644 index 00000000000..17658df0e81 --- /dev/null +++ b/tests/backend/model_manager/load/state_dicts/flux2_fun_controlnet_keys.py @@ -0,0 +1,95 @@ +"""Key layout of alibaba-pai's FLUX.2 [dev] Fun-ControlNet-Union (2602 build), the VACE-style control branch. + +Captured on 2026-10-18 with `scripts/capture_state_dict_fixture.py`, +which reads the header only, from +`alibaba-pai/FLUX.2-dev-Fun-Controlnet-Union/FLUX.2-dev-Fun-Controlnet-Union-2602.safetensors`. + +Subsetting rule: none -- every key in the file. Values are `(shape, dtype)`. + +The whole branch is 76 bf16 tensors and no metadata: `control_img_in` projects 260 packed channels into FLUX.2 +[dev]'s 6144-wide stream, and `control_transformer_blocks.0..3` are copies of diffusers' double-stream +`Flux2TransformerBlock` (bias-free joint attention with `add_*_proj`, the fused SwiGLU `ff`/`ff_context` at MLP +ratio 3) with an `after_proj` tap on every block and a `before_proj` on block 0 only. There is no modulation +in the file: FLUX.2 blocks take the base's modulation as arguments. Identification keys on the projection shape and +on block 0's `before_proj` under the `control_transformer_blocks` name; the loader reads the width, the MLP ratio +and the block count off these tensors and renames the blocks to `control_blocks`. +""" + +state_dict_keys: dict[str, tuple[list[int], str]] = { + "control_img_in.bias": ([6144], "BF16"), + "control_img_in.weight": ([6144, 260], "BF16"), + "control_transformer_blocks.0.after_proj.bias": ([6144], "BF16"), + "control_transformer_blocks.0.after_proj.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.0.attn.add_k_proj.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.0.attn.add_q_proj.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.0.attn.add_v_proj.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.0.attn.norm_added_k.weight": ([128], "BF16"), + "control_transformer_blocks.0.attn.norm_added_q.weight": ([128], "BF16"), + "control_transformer_blocks.0.attn.norm_k.weight": ([128], "BF16"), + "control_transformer_blocks.0.attn.norm_q.weight": ([128], "BF16"), + "control_transformer_blocks.0.attn.to_add_out.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.0.attn.to_k.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.0.attn.to_out.0.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.0.attn.to_q.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.0.attn.to_v.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.0.before_proj.bias": ([6144], "BF16"), + "control_transformer_blocks.0.before_proj.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.0.ff.linear_in.weight": ([36864, 6144], "BF16"), + "control_transformer_blocks.0.ff.linear_out.weight": ([6144, 18432], "BF16"), + "control_transformer_blocks.0.ff_context.linear_in.weight": ([36864, 6144], "BF16"), + "control_transformer_blocks.0.ff_context.linear_out.weight": ([6144, 18432], "BF16"), + "control_transformer_blocks.1.after_proj.bias": ([6144], "BF16"), + "control_transformer_blocks.1.after_proj.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.1.attn.add_k_proj.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.1.attn.add_q_proj.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.1.attn.add_v_proj.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.1.attn.norm_added_k.weight": ([128], "BF16"), + "control_transformer_blocks.1.attn.norm_added_q.weight": ([128], "BF16"), + "control_transformer_blocks.1.attn.norm_k.weight": ([128], "BF16"), + "control_transformer_blocks.1.attn.norm_q.weight": ([128], "BF16"), + "control_transformer_blocks.1.attn.to_add_out.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.1.attn.to_k.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.1.attn.to_out.0.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.1.attn.to_q.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.1.attn.to_v.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.1.ff.linear_in.weight": ([36864, 6144], "BF16"), + "control_transformer_blocks.1.ff.linear_out.weight": ([6144, 18432], "BF16"), + "control_transformer_blocks.1.ff_context.linear_in.weight": ([36864, 6144], "BF16"), + "control_transformer_blocks.1.ff_context.linear_out.weight": ([6144, 18432], "BF16"), + "control_transformer_blocks.2.after_proj.bias": ([6144], "BF16"), + "control_transformer_blocks.2.after_proj.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.2.attn.add_k_proj.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.2.attn.add_q_proj.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.2.attn.add_v_proj.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.2.attn.norm_added_k.weight": ([128], "BF16"), + "control_transformer_blocks.2.attn.norm_added_q.weight": ([128], "BF16"), + "control_transformer_blocks.2.attn.norm_k.weight": ([128], "BF16"), + "control_transformer_blocks.2.attn.norm_q.weight": ([128], "BF16"), + "control_transformer_blocks.2.attn.to_add_out.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.2.attn.to_k.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.2.attn.to_out.0.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.2.attn.to_q.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.2.attn.to_v.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.2.ff.linear_in.weight": ([36864, 6144], "BF16"), + "control_transformer_blocks.2.ff.linear_out.weight": ([6144, 18432], "BF16"), + "control_transformer_blocks.2.ff_context.linear_in.weight": ([36864, 6144], "BF16"), + "control_transformer_blocks.2.ff_context.linear_out.weight": ([6144, 18432], "BF16"), + "control_transformer_blocks.3.after_proj.bias": ([6144], "BF16"), + "control_transformer_blocks.3.after_proj.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.3.attn.add_k_proj.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.3.attn.add_q_proj.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.3.attn.add_v_proj.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.3.attn.norm_added_k.weight": ([128], "BF16"), + "control_transformer_blocks.3.attn.norm_added_q.weight": ([128], "BF16"), + "control_transformer_blocks.3.attn.norm_k.weight": ([128], "BF16"), + "control_transformer_blocks.3.attn.norm_q.weight": ([128], "BF16"), + "control_transformer_blocks.3.attn.to_add_out.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.3.attn.to_k.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.3.attn.to_out.0.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.3.attn.to_q.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.3.attn.to_v.weight": ([6144, 6144], "BF16"), + "control_transformer_blocks.3.ff.linear_in.weight": ([36864, 6144], "BF16"), + "control_transformer_blocks.3.ff.linear_out.weight": ([6144, 18432], "BF16"), + "control_transformer_blocks.3.ff_context.linear_in.weight": ([36864, 6144], "BF16"), + "control_transformer_blocks.3.ff_context.linear_out.weight": ([6144, 18432], "BF16"), +} diff --git a/tests/backend/model_manager/load/test_fp8_capability.py b/tests/backend/model_manager/load/test_fp8_capability.py index 750b7d7dcb2..d1c15f02704 100644 --- a/tests/backend/model_manager/load/test_fp8_capability.py +++ b/tests/backend/model_manager/load/test_fp8_capability.py @@ -227,6 +227,7 @@ def test_the_declarations_are_the_backlog_and_nothing_else(self) -> None: assert by_marker[Unimplemented] == [ "flux/controlnet/checkpoint", "flux/controlnet/diffusers", + "flux2/controlnet/checkpoint", "minimax-h3/main/checkpoint", "minimax-h3/main/diffusers", "qwen-image/controlnet/checkpoint", diff --git a/tests/backend/model_manager/load/test_fun_controlnet_loader.py b/tests/backend/model_manager/load/test_fun_controlnet_loader.py index b4e4ac5a731..4734546f2e9 100644 --- a/tests/backend/model_manager/load/test_fun_controlnet_loader.py +++ b/tests/backend/model_manager/load/test_fun_controlnet_loader.py @@ -1,5 +1,5 @@ -"""What the Qwen-Image Fun-ControlNet loader makes of a checkpoint: the geometry it reads off the tensors, the dtype -it casts to, and the quantized files it refuses rather than loads unscaled. +"""What the Fun-ControlNet loaders (Qwen-Image, FLUX.2 [dev]) make of a checkpoint: the geometry they read off the +tensors, the dtype they cast to, and the quantized files they refuse rather than load unscaled. Like the Z-Image ControlNet loader it builds under `init_empty_weights` and assigns the file's tensors, so an fp8 weight with its scale dropped would become the parameter as it is (`test_z_image_control_adapter_loader.py`). No @@ -11,10 +11,17 @@ import pytest import torch +from invokeai.backend.fun_controlnet.flux2 import FLUX2_FUN_CONTROL_LAYERS, Flux2FunControlBranch from invokeai.backend.fun_controlnet.qwen_image import QWEN_IMAGE_FUN_CONTROL_LAYERS, QwenImageFunControlBranch -from invokeai.backend.model_manager.configs.controlnet import ControlNet_Checkpoint_QwenImage_Config +from invokeai.backend.model_manager.configs.controlnet import ( + ControlNet_Checkpoint_Flux2_Config, + ControlNet_Checkpoint_QwenImage_Config, +) from invokeai.backend.model_manager.load.model_loaders import fun_controlnet -from invokeai.backend.model_manager.load.model_loaders.fun_controlnet import QwenImageFunControlNetLoader +from invokeai.backend.model_manager.load.model_loaders.fun_controlnet import ( + Flux2FunControlNetLoader, + QwenImageFunControlNetLoader, +) from tests.fixtures.loader_seams import Seam, prepare from tests.fixtures.quantized_payloads import comfy_quant_marker, quantize_convrot, quantize_scaled_fp8 @@ -96,3 +103,66 @@ def test_another_recipe_is_refused_by_name(monkeypatch, tmp_path, rewrite, messa with pytest.raises(ValueError, match=message): run.load(config) + + +# --- FLUX.2 [dev] --- + +FLUX2_SEAM = Seam( + loader=Flux2FunControlNetLoader, + module=fun_controlnet, + entry="_load_model", + compute_dtype=torch.bfloat16, + # The loader casts to bfloat16, the dtype the FLUX.2 denoise runs in, whatever the device would pick. + patches_device=False, + sets_torch_dtype=False, + casts_fp8_storage=False, +) +FLUX2_QUANTIZED_LAYER = "control_transformer_blocks.0.attn.to_q" + + +def _flux2_checkpoint() -> dict[str, torch.Tensor]: + """A float32 file with the real four-block layout, under the names alibaba-pai's file uses.""" + torch.manual_seed(0) + branch = Flux2FunControlBranch(hidden_size=HIDDEN, num_attention_heads=1, attention_head_dim=128) + return { + name.replace("control_blocks.", "control_transformer_blocks.", 1): tensor.detach().clone() + for name, tensor in branch.state_dict().items() + } + + +def _flux2_driver(monkeypatch: pytest.MonkeyPatch, tmp_path: Path, state_dict: dict[str, torch.Tensor]): + checkpoint = tmp_path / "flux2_fun_controlnet.safetensors" + checkpoint.touch() + config = ControlNet_Checkpoint_Flux2_Config.model_construct(path=str(checkpoint), name="flux2-control") + return prepare(FLUX2_SEAM, monkeypatch, state_dict=state_dict), config + + +def test_a_dense_flux2_checkpoint_loads_with_its_geometry_in_bfloat16(monkeypatch, tmp_path) -> None: + run, config = _flux2_driver(monkeypatch, tmp_path, _flux2_checkpoint()) + + model = run.load(config) + + assert isinstance(model, Flux2FunControlBranch) + assert model.control_layers == FLUX2_FUN_CONTROL_LAYERS + first = model.control_blocks[0] + assert (model.hidden_size, model.control_in_dim, first.attn.heads, first.mlp_hidden_dim) == (HIDDEN, 260, 1, 384) + assert {parameter.dtype for parameter in model.parameters()} == {torch.bfloat16} + assert not model.training + + +def test_a_scaled_fp8_flux2_checkpoint_is_refused_rather_than_loaded_unscaled(monkeypatch, tmp_path) -> None: + payload = quantize_scaled_fp8(torch.randn(HIDDEN, HIDDEN)) + state_dict = _flux2_checkpoint() + state_dict[f"{FLUX2_QUANTIZED_LAYER}.weight"] = payload.codes + state_dict[f"{FLUX2_QUANTIZED_LAYER}.weight_scale"] = payload.scale + run, config = _flux2_driver(monkeypatch, tmp_path, state_dict) + + with pytest.raises(ValueError, match="quantization side channel"): + run.load(config) + + +def test_the_qwen_image_recipe_is_refused_by_the_flux2_loader(monkeypatch, tmp_path) -> None: + run, config = _flux2_driver(monkeypatch, tmp_path, _checkpoint()) + + with pytest.raises(ValueError, match="takes 132"): + run.load(config) diff --git a/tests/model_identification/stripped_models/8e61cdfc-d085-4172-9923-8344c62c73a5/FLUX.2-dev-Fun-Controlnet-Union-2602.safetensors b/tests/model_identification/stripped_models/8e61cdfc-d085-4172-9923-8344c62c73a5/FLUX.2-dev-Fun-Controlnet-Union-2602.safetensors new file mode 100644 index 00000000000..da427cb2859 --- /dev/null +++ b/tests/model_identification/stripped_models/8e61cdfc-d085-4172-9923-8344c62c73a5/FLUX.2-dev-Fun-Controlnet-Union-2602.safetensors @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d7e032171469df34b908878abb01f19644bdd6097e0045c76f68a2e2889e723 +size 12563 diff --git a/tests/model_identification/stripped_models/8e61cdfc-d085-4172-9923-8344c62c73a5/__test_metadata__.json b/tests/model_identification/stripped_models/8e61cdfc-d085-4172-9923-8344c62c73a5/__test_metadata__.json new file mode 100644 index 00000000000..e4222af4ce0 --- /dev/null +++ b/tests/model_identification/stripped_models/8e61cdfc-d085-4172-9923-8344c62c73a5/__test_metadata__.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:51c55fd33da1965d40db66b4ed9a1286f8e87fe00b480d7bba7d27e550d1ed02 +size 535 From 7fda869dd9b4cad150593463fbbf99f6a3dc8ca7 Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Sun, 18 Oct 2026 22:37:47 +0200 Subject: [PATCH 3/3] chore(perf): re-record the browser byte baseline for the ControlNet strings The Qwen-Image and FLUX.2 [dev] ControlNet strings add 0.5 KB to the locale file every route loads; request counts are unchanged. --- .../webv2/performance/browser-baseline.json | 200 +++++++++--------- 1 file changed, 100 insertions(+), 100 deletions(-) diff --git a/invokeai/frontend/webv2/performance/browser-baseline.json b/invokeai/frontend/webv2/performance/browser-baseline.json index fd47504b034..57d22b6a104 100644 --- a/invokeai/frontend/webv2/performance/browser-baseline.json +++ b/invokeai/frontend/webv2/performance/browser-baseline.json @@ -1,6 +1,6 @@ { - "browserExecutable": "/home/toast/.cache/ms-playwright/chromium-1243/chrome-linux64/chrome", - "capturedAt": "2026-10-17", + "browserExecutable": "C:\\Users\\PC1\\AppData\\Local\\ms-playwright\\chromium-1243\\chrome-win64\\chrome.exe", + "capturedAt": "2026-10-18", "routes": [ { "activatedResourceBaseline": { @@ -14,13 +14,13 @@ "scriptRequestCount": 0, "totalRawBytes": 0 }, - "domContentLoadedMedianMs": 128, + "domContentLoadedMedianMs": 138, "id": "launchpad", "layoutAckMedianMs": 0, "layoutReturnSwitchMedianMs": 0, "layoutSwitchMedianMs": 0, - "loadMedianMs": 128.09999999403954, - "longestTaskMaxMs": 82, + "loadMedianMs": 138.19999998807907, + "longestTaskMaxMs": 99, "owner": "app", "projectSwitchMedianMs": 0, "readyMark": "invokeai:ready:launchpad", @@ -30,13 +30,13 @@ "fontRawBytes": 23664, "imageRawBytes": 0, "largestAssetRawBytes": 752421, - "otherRawBytes": 211323, + "otherRawBytes": 215479, "requestCount": 30, - "scriptRawBytes": 1852857, + "scriptRawBytes": 1857477, "scriptRequestCount": 26, - "totalRawBytes": 2090003 + "totalRawBytes": 2098779 }, - "routeReadyMedianMs": 266.79999999701977, + "routeReadyMedianMs": 305.5, "scriptSourceOwnerSet": "launchpad-static", "stateProfile": "empty" }, @@ -52,13 +52,13 @@ "scriptRequestCount": 0, "totalRawBytes": 0 }, - "domContentLoadedMedianMs": 125.70000000298023, + "domContentLoadedMedianMs": 139.19999998807907, "id": "launchpad", "layoutAckMedianMs": 0, "layoutReturnSwitchMedianMs": 0, "layoutSwitchMedianMs": 0, - "loadMedianMs": 125.79999999701977, - "longestTaskMaxMs": 79, + "loadMedianMs": 139.5, + "longestTaskMaxMs": 101, "owner": "app", "projectSwitchMedianMs": 0, "readyMark": "invokeai:ready:launchpad", @@ -68,13 +68,13 @@ "fontRawBytes": 23664, "imageRawBytes": 0, "largestAssetRawBytes": 752421, - "otherRawBytes": 211323, + "otherRawBytes": 215479, "requestCount": 30, - "scriptRawBytes": 1852857, + "scriptRawBytes": 1857477, "scriptRequestCount": 26, - "totalRawBytes": 2090003 + "totalRawBytes": 2098779 }, - "routeReadyMedianMs": 278.09999999403954, + "routeReadyMedianMs": 325.7999999821186, "scriptSourceOwnerSet": "launchpad-static", "stateProfile": "representative" }, @@ -90,15 +90,15 @@ "scriptRequestCount": 0, "totalRawBytes": 0 }, - "domContentLoadedMedianMs": 128.70000000298023, + "domContentLoadedMedianMs": 150.7000000178814, "id": "editor-minimal", "layoutAckMedianMs": 0, "layoutReturnSwitchMedianMs": 0, "layoutSwitchMedianMs": 0, - "loadMedianMs": 128.8999999910593, - "longestTaskMaxMs": 174, + "loadMedianMs": 150.80000001192093, + "longestTaskMaxMs": 218, "owner": "workbench", - "projectSwitchMedianMs": 35.20000000298023, + "projectSwitchMedianMs": 48, "readyMark": "invokeai:ready:widget:center:preview", "remediationTicket": "deepen-widget-registry-loading", "resourceBaseline": { @@ -106,13 +106,13 @@ "fontRawBytes": 23664, "imageRawBytes": 44398, "largestAssetRawBytes": 752421, - "otherRawBytes": 211323, + "otherRawBytes": 215479, "requestCount": 88, - "scriptRawBytes": 4131338, + "scriptRawBytes": 4166277, "scriptRequestCount": 83, - "totalRawBytes": 4412882 + "totalRawBytes": 4451977 }, - "routeReadyMedianMs": 443.29999999701977, + "routeReadyMedianMs": 520, "scriptSourceOwnerSet": "editor-minimal-static", "stateProfile": "empty" }, @@ -128,15 +128,15 @@ "scriptRequestCount": 0, "totalRawBytes": 0 }, - "domContentLoadedMedianMs": 127.69999998807907, + "domContentLoadedMedianMs": 154.10000002384186, "id": "editor-minimal", "layoutAckMedianMs": 0, "layoutReturnSwitchMedianMs": 0, "layoutSwitchMedianMs": 0, - "loadMedianMs": 127.8999999910593, - "longestTaskMaxMs": 166, + "loadMedianMs": 154.2000000178814, + "longestTaskMaxMs": 218, "owner": "workbench", - "projectSwitchMedianMs": 44, + "projectSwitchMedianMs": 61.80000001192093, "readyMark": "invokeai:ready:widget:center:preview", "remediationTicket": "deepen-widget-registry-loading", "resourceBaseline": { @@ -144,13 +144,13 @@ "fontRawBytes": 23664, "imageRawBytes": 44398, "largestAssetRawBytes": 752421, - "otherRawBytes": 211323, + "otherRawBytes": 215479, "requestCount": 88, - "scriptRawBytes": 4131338, + "scriptRawBytes": 4166277, "scriptRequestCount": 83, - "totalRawBytes": 4412882 + "totalRawBytes": 4451977 }, - "routeReadyMedianMs": 442.79999999701977, + "routeReadyMedianMs": 533, "scriptSourceOwnerSet": "editor-minimal-static", "stateProfile": "representative" }, @@ -159,20 +159,20 @@ "cssRawBytes": 0, "fontRawBytes": 0, "imageRawBytes": 0, - "largestAssetRawBytes": 305464, + "largestAssetRawBytes": 305434, "otherRawBytes": 0, "requestCount": 9, - "scriptRawBytes": 516145, + "scriptRawBytes": 518929, "scriptRequestCount": 9, - "totalRawBytes": 516145 + "totalRawBytes": 518929 }, - "domContentLoadedMedianMs": 134.30000001192093, + "domContentLoadedMedianMs": 136.89999997615814, "id": "editor-canvas", - "layoutAckMedianMs": 2.7000000029802322, - "layoutReturnSwitchMedianMs": 62.099999994039536, - "layoutSwitchMedianMs": 81.19999998807907, - "loadMedianMs": 134.5, - "longestTaskMaxMs": 179, + "layoutAckMedianMs": 4, + "layoutReturnSwitchMedianMs": 56, + "layoutSwitchMedianMs": 124.30000001192093, + "loadMedianMs": 137, + "longestTaskMaxMs": 226, "owner": "canvas", "projectSwitchMedianMs": 0, "readyMark": "invokeai:ready:widget:center:canvas", @@ -182,13 +182,13 @@ "fontRawBytes": 23664, "imageRawBytes": 44398, "largestAssetRawBytes": 752421, - "otherRawBytes": 211323, + "otherRawBytes": 215479, "requestCount": 97, - "scriptRawBytes": 4647483, + "scriptRawBytes": 4685206, "scriptRequestCount": 92, - "totalRawBytes": 4929027 + "totalRawBytes": 4970906 }, - "routeReadyMedianMs": 1204.2999999970198, + "routeReadyMedianMs": 1323.300000011921, "scriptSourceOwnerSet": "editor-canvas-static", "stateProfile": "empty" }, @@ -197,20 +197,20 @@ "cssRawBytes": 0, "fontRawBytes": 0, "imageRawBytes": 0, - "largestAssetRawBytes": 305464, + "largestAssetRawBytes": 305434, "otherRawBytes": 0, "requestCount": 9, - "scriptRawBytes": 516145, + "scriptRawBytes": 518929, "scriptRequestCount": 9, - "totalRawBytes": 516145 + "totalRawBytes": 518929 }, - "domContentLoadedMedianMs": 130.59999999403954, + "domContentLoadedMedianMs": 148.30000001192093, "id": "editor-canvas", - "layoutAckMedianMs": 3, - "layoutReturnSwitchMedianMs": 53.5, - "layoutSwitchMedianMs": 77.3999999910593, - "loadMedianMs": 130.70000000298023, - "longestTaskMaxMs": 197, + "layoutAckMedianMs": 4.800000011920929, + "layoutReturnSwitchMedianMs": 55.400000005960464, + "layoutSwitchMedianMs": 94.40000000596046, + "loadMedianMs": 148.5, + "longestTaskMaxMs": 259, "owner": "canvas", "projectSwitchMedianMs": 0, "readyMark": "invokeai:ready:widget:center:canvas", @@ -220,13 +220,13 @@ "fontRawBytes": 23664, "imageRawBytes": 44398, "largestAssetRawBytes": 752421, - "otherRawBytes": 211323, + "otherRawBytes": 215479, "requestCount": 97, - "scriptRawBytes": 4647483, + "scriptRawBytes": 4685206, "scriptRequestCount": 92, - "totalRawBytes": 4929027 + "totalRawBytes": 4970906 }, - "routeReadyMedianMs": 1190.8999999910593, + "routeReadyMedianMs": 1314.9000000059605, "scriptSourceOwnerSet": "editor-canvas-static", "stateProfile": "representative" }, @@ -235,20 +235,20 @@ "cssRawBytes": 15413, "fontRawBytes": 0, "imageRawBytes": 0, - "largestAssetRawBytes": 201666, + "largestAssetRawBytes": 201664, "otherRawBytes": 0, "requestCount": 7, - "scriptRawBytes": 443711, + "scriptRawBytes": 444773, "scriptRequestCount": 6, - "totalRawBytes": 459124 + "totalRawBytes": 460186 }, - "domContentLoadedMedianMs": 130.79999999701977, + "domContentLoadedMedianMs": 130.09999999403954, "id": "editor-workflow", - "layoutAckMedianMs": 3, - "layoutReturnSwitchMedianMs": 37.1000000089407, - "layoutSwitchMedianMs": 79.29999999701977, - "loadMedianMs": 130.8999999910593, - "longestTaskMaxMs": 176, + "layoutAckMedianMs": 3.0999999940395355, + "layoutReturnSwitchMedianMs": 43.5, + "layoutSwitchMedianMs": 83.40000000596046, + "loadMedianMs": 130.19999998807907, + "longestTaskMaxMs": 191, "owner": "workflow", "projectSwitchMedianMs": 0, "readyMark": "invokeai:ready:widget:center:workflow", @@ -258,13 +258,13 @@ "fontRawBytes": 23664, "imageRawBytes": 44398, "largestAssetRawBytes": 752421, - "otherRawBytes": 211323, + "otherRawBytes": 215479, "requestCount": 95, - "scriptRawBytes": 4575049, + "scriptRawBytes": 4611050, "scriptRequestCount": 89, - "totalRawBytes": 4872006 + "totalRawBytes": 4912163 }, - "routeReadyMedianMs": 1193.4000000059605, + "routeReadyMedianMs": 1246.699999988079, "scriptSourceOwnerSet": "editor-workflow-static", "stateProfile": "empty" }, @@ -273,20 +273,20 @@ "cssRawBytes": 15413, "fontRawBytes": 0, "imageRawBytes": 0, - "largestAssetRawBytes": 201666, + "largestAssetRawBytes": 201664, "otherRawBytes": 0, "requestCount": 7, - "scriptRawBytes": 443711, + "scriptRawBytes": 444773, "scriptRequestCount": 6, - "totalRawBytes": 459124 + "totalRawBytes": 460186 }, - "domContentLoadedMedianMs": 131, + "domContentLoadedMedianMs": 129.40000000596046, "id": "editor-workflow", - "layoutAckMedianMs": 3, - "layoutReturnSwitchMedianMs": 46.3999999910593, - "layoutSwitchMedianMs": 156, - "loadMedianMs": 131.09999999403954, - "longestTaskMaxMs": 305, + "layoutAckMedianMs": 3.0999999940395355, + "layoutReturnSwitchMedianMs": 53.900000005960464, + "layoutSwitchMedianMs": 163, + "loadMedianMs": 129.59999999403954, + "longestTaskMaxMs": 331, "owner": "workflow", "projectSwitchMedianMs": 0, "readyMark": "invokeai:ready:widget:center:workflow", @@ -296,13 +296,13 @@ "fontRawBytes": 23664, "imageRawBytes": 44398, "largestAssetRawBytes": 752421, - "otherRawBytes": 211323, + "otherRawBytes": 215479, "requestCount": 95, - "scriptRawBytes": 4575049, + "scriptRawBytes": 4611050, "scriptRequestCount": 89, - "totalRawBytes": 4872006 + "totalRawBytes": 4912163 }, - "routeReadyMedianMs": 1273.2999999970198, + "routeReadyMedianMs": 1314.300000011921, "scriptSourceOwnerSet": "editor-workflow-static", "stateProfile": "representative" }, @@ -318,13 +318,13 @@ "scriptRequestCount": 0, "totalRawBytes": 0 }, - "domContentLoadedMedianMs": 129.19999998807907, + "domContentLoadedMedianMs": 124.5, "id": "editor-gallery", "layoutAckMedianMs": 0, "layoutReturnSwitchMedianMs": 0, - "layoutSwitchMedianMs": 42.29999999701977, - "loadMedianMs": 129.29999999701977, - "longestTaskMaxMs": 175, + "layoutSwitchMedianMs": 54.89999997615814, + "loadMedianMs": 124.59999999403954, + "longestTaskMaxMs": 192, "owner": "gallery", "projectSwitchMedianMs": 0, "readyMark": "invokeai:ready:widget:center:gallery", @@ -334,13 +334,13 @@ "fontRawBytes": 23664, "imageRawBytes": 44398, "largestAssetRawBytes": 752421, - "otherRawBytes": 211323, + "otherRawBytes": 215479, "requestCount": 88, - "scriptRawBytes": 4131338, + "scriptRawBytes": 4166277, "scriptRequestCount": 83, - "totalRawBytes": 4412882 + "totalRawBytes": 4451977 }, - "routeReadyMedianMs": 1437.8999999910593, + "routeReadyMedianMs": 1490.800000011921, "scriptSourceOwnerSet": "editor-minimal-static", "stateProfile": "empty" }, @@ -356,13 +356,13 @@ "scriptRequestCount": 0, "totalRawBytes": 0 }, - "domContentLoadedMedianMs": 132.5, + "domContentLoadedMedianMs": 130.39999997615814, "id": "editor-gallery", "layoutAckMedianMs": 0, "layoutReturnSwitchMedianMs": 0, - "layoutSwitchMedianMs": 50.8999999910593, - "loadMedianMs": 132.69999998807907, - "longestTaskMaxMs": 181, + "layoutSwitchMedianMs": 64.59999999403954, + "loadMedianMs": 130.59999999403954, + "longestTaskMaxMs": 210, "owner": "gallery", "projectSwitchMedianMs": 0, "readyMark": "invokeai:ready:widget:center:gallery", @@ -372,13 +372,13 @@ "fontRawBytes": 23664, "imageRawBytes": 44398, "largestAssetRawBytes": 752421, - "otherRawBytes": 211323, + "otherRawBytes": 215479, "requestCount": 88, - "scriptRawBytes": 4131338, + "scriptRawBytes": 4166277, "scriptRequestCount": 83, - "totalRawBytes": 4412882 + "totalRawBytes": 4451977 }, - "routeReadyMedianMs": 1443.8999999910593, + "routeReadyMedianMs": 1541.199999988079, "scriptSourceOwnerSet": "editor-minimal-static", "stateProfile": "representative" }