From 2b8118435c13c429e41939a17a38022b2fe97cd2 Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Fri, 16 Oct 2026 14:40:32 +0200 Subject: [PATCH 1/3] feat(flux3): add FLUX.3 Image Klein and Klein Base Adds the flux3 base (Klein flow map, Klein Base) with a vendored transformer, Diffusers/bf16/GGUF loading, text encoder, denoise node with up to 10 reference images, starter models and docs. webv2 generates, edits and runs canvas img2img/inpaint/outpaint with FLUX.3, shows tags on reference cards and blocks CFG on Klein. FLUX.3 encodes references untiled where they fit; quantized single files are refused at install until a follow-up. --- .../03.Models/02.model-families.mdx | 7 +- .../03.Models/03.model-format-support.mdx | 11 +- .../03.Models/Local Models/flux-3.mdx | 118 + .../03.Models/Local Models/ideogram4.mdx | 2 +- .../03.Models/Local Models/krea-2.mdx | 2 +- .../03.Models/Local Models/qwen-image-2-1.mdx | 2 +- .../03.Models/Local Models/qwen-image.mdx | 2 +- .../03.Models/Local Models/sd-3.mdx | 2 +- .../03.Models/Local Models/sdxl.mdx | 2 +- .../Local Models/stable-diffusion-1-2.mdx | 2 +- .../03.Models/Local Models/z-image.mdx | 2 +- .../Advanced Topics/pid-decode.mdx | 1 + .../04.Image Generation/generate-panel.mdx | 3 +- .../04.Image Generation/parameters.mdx | 2 +- .../contributing/new-model-integration.mdx | 2 +- .../docs/start-here/system-requirements.mdx | 1 + invokeai/app/invocations/fields.py | 7 + .../app/invocations/flux2/flux2_denoise.py | 80 +- invokeai/app/invocations/flux3/__init__.py | 10 + .../app/invocations/flux3/flux3_denoise.py | 311 ++ .../invocations/flux3/flux3_model_loader.py | 132 + .../invocations/krea2/krea2_model_loader.py | 15 +- invokeai/app/invocations/metadata.py | 4 + invokeai/app/invocations/primitives.py | 12 + .../text_encoder/flux3_text_encoder.py | 66 + .../model_records/model_records_base.py | 2 + invokeai/backend/architectures/defs/flux3.py | 57 + .../architectures/facets/latent_space.py | 2 +- invokeai/backend/flux2/latent_norm.py | 44 + invokeai/backend/flux2/ref_image_extension.py | 175 +- invokeai/backend/flux3/__init__.py | 20 + invokeai/backend/flux3/conversion.py | 165 ++ invokeai/backend/flux3/denoise.py | 99 + invokeai/backend/flux3/ref_images.py | 84 + invokeai/backend/flux3/sampling.py | 104 + invokeai/backend/flux3/text_encoding.py | 85 + invokeai/backend/flux3/transformer_flux3.py | 654 +++++ .../backend/model_manager/configs/factory.py | 10 + .../backend/model_manager/configs/main.py | 162 +- .../model_manager/load/model_loaders/flux3.py | 202 ++ .../model_manager/metadata/metadata_base.py | 26 +- .../backend/model_manager/qwen3_vl_labels.py | 25 +- .../model_manager/starter_models/__init__.py | 23 + .../model_manager/starter_models/common.py | 4 +- .../model_manager/starter_models/flux3.py | 89 + invokeai/backend/model_manager/taxonomy.py | 21 + .../diffusion/conditioning_data.py | 18 + invokeai/backend/util/vae_working_memory.py | 22 + invokeai/frontend/api/openapi.json | 2489 ++++++++++++----- invokeai/frontend/api/schema.ts | 595 +++- .../frontend/webv2/public/locales/en.json | 3 + .../architectureCapabilities.json | 96 + .../__snapshots__/generateGraphNodeTypes.json | 97 + .../core/baseGenerationPolicies.test.ts | 13 + .../generation/core/baseGenerationPolicies.ts | 34 +- .../core/canvas/compileCanvasGraph.test.ts | 19 +- .../core/canvas/compileCanvasGraph.ts | 7 +- .../generation/core/componentCompatibility.ts | 4 +- .../src/features/generation/core/contracts.ts | 1 + .../features/generation/core/graph.test.ts | 62 + .../src/features/generation/core/graph.ts | 113 +- .../generation/core/graphCoverage.testing.ts | 6 + .../webv2/src/features/generation/core/pid.ts | 4 +- .../src/features/generation/core/pidGraph.ts | 2 + .../generation/core/referenceImage.test.ts | 32 + .../generation/core/referenceImage.ts | 38 +- .../generation/core/supportedBases.test.ts | 1 + .../generation/core/supportedBases.ts | 1 + .../GenerateReferenceImagesSection.tsx | 11 +- .../reference-images/ReferenceImageCard.tsx | 76 +- .../features/models/core/baseIdentity.test.ts | 1 + .../src/features/models/core/baseIdentity.ts | 5 + .../src/features/models/core/relationships.ts | 10 +- .../src/features/models/core/taxonomy.ts | 5 +- .../webv2/src/features/models/core/types.ts | 1 + .../workflow/core/modelRequirements.ts | 1 + invokeai/invocation_api/__init__.py | 2 + pyproject.toml | 5 +- ...est_flux2_denoise_img2img_normalization.py | 3 +- .../invocations/test_flux3_denoise_wiring.py | 207 ++ .../test_frontend_graph_node_types.py | 6 +- tests/app/invocations/test_ideal_size.py | 1 + .../architectures/test_conditioning.py | 12 +- .../architectures/test_default_settings.py | 15 + tests/backend/architectures/test_features.py | 4 +- .../architectures/test_guidance_range.py | 1 + .../architectures/test_latent_space.py | 2 + .../flux2/test_reference_encode_tiling.py | 130 + tests/backend/flux3/flux3_fixture.py | 140 + tests/backend/flux3/test_conversion.py | 156 ++ tests/backend/flux3/test_denoise.py | 88 + tests/backend/flux3/test_loaders.py | 109 + tests/backend/flux3/test_sampling.py | 146 + tests/backend/flux3/test_text_encoding.py | 74 + .../flux3/test_vendored_transformer.py | 17 + .../configs/test_flux3_main_config.py | 186 ++ .../load/state_dicts/flux3_klein_base_keys.py | 59 + .../load/state_dicts/flux3_klein_keys.py | 62 + .../test_modular_repo_download_urls.py | 63 + 99 files changed, 7205 insertions(+), 901 deletions(-) create mode 100644 docs/src/content/docs/Users Guide/03.Models/Local Models/flux-3.mdx create mode 100644 invokeai/app/invocations/flux3/__init__.py create mode 100644 invokeai/app/invocations/flux3/flux3_denoise.py create mode 100644 invokeai/app/invocations/flux3/flux3_model_loader.py create mode 100644 invokeai/app/invocations/text_encoder/flux3_text_encoder.py create mode 100644 invokeai/backend/architectures/defs/flux3.py create mode 100644 invokeai/backend/flux2/latent_norm.py create mode 100644 invokeai/backend/flux3/__init__.py create mode 100644 invokeai/backend/flux3/conversion.py create mode 100644 invokeai/backend/flux3/denoise.py create mode 100644 invokeai/backend/flux3/ref_images.py create mode 100644 invokeai/backend/flux3/sampling.py create mode 100644 invokeai/backend/flux3/text_encoding.py create mode 100644 invokeai/backend/flux3/transformer_flux3.py create mode 100644 invokeai/backend/model_manager/load/model_loaders/flux3.py create mode 100644 invokeai/backend/model_manager/starter_models/flux3.py create mode 100644 tests/app/invocations/test_flux3_denoise_wiring.py create mode 100644 tests/backend/flux2/test_reference_encode_tiling.py create mode 100644 tests/backend/flux3/flux3_fixture.py create mode 100644 tests/backend/flux3/test_conversion.py create mode 100644 tests/backend/flux3/test_denoise.py create mode 100644 tests/backend/flux3/test_loaders.py create mode 100644 tests/backend/flux3/test_sampling.py create mode 100644 tests/backend/flux3/test_text_encoding.py create mode 100644 tests/backend/flux3/test_vendored_transformer.py create mode 100644 tests/backend/model_manager/configs/test_flux3_main_config.py create mode 100644 tests/backend/model_manager/load/state_dicts/flux3_klein_base_keys.py create mode 100644 tests/backend/model_manager/load/state_dicts/flux3_klein_keys.py create mode 100644 tests/backend/model_manager/test_modular_repo_download_urls.py 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..c4d684e228e 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 @@ -44,7 +44,7 @@ page lists the builds it supports. InvokeAI recognizes the format from the file's contents, so you install them like any other model. Which format loads for which model is listed in [Model Format Support](/users-guide/models/model-format-support/). -- **GGUF** (`.gguf`, llama.cpp quantization such as Q4_K or Q8_0): weights stay packed in memory and are unpacked layer by layer during generation. Supported for the FLUX.1, FLUX.2, Z-Image, Krea-2, Qwen-Image, Qwen-Image-2.1, Ideogram 4, ERNIE-Image and Wan transformers, and for the T5, Qwen3, Qwen3-VL, Mistral and Gemma 2 text encoders. ComfyUI-GGUF's `Q8_CR` files, which store int8 (`int8_convrot`) layers inside a `.gguf`, load for the Krea-2 transformer; for other models, and for ComfyUI-GGUF's `Q4_CR`, installation is refused with a message saying so. +- **GGUF** (`.gguf`, llama.cpp quantization such as Q4_K or Q8_0): weights stay packed in memory and are unpacked layer by layer during generation. Supported for the FLUX.1, FLUX.2, FLUX.3, Z-Image, Krea-2, Qwen-Image, Qwen-Image-2.1, Ideogram 4, ERNIE-Image and Wan transformers, and for the T5, Qwen3, Qwen3-VL, Mistral and Gemma 2 text encoders. ComfyUI-GGUF's `Q8_CR` files, which store int8 (`int8_convrot`) layers inside a `.gguf`, load for the Krea-2 transformer; for other models, and for ComfyUI-GGUF's `Q4_CR`, installation is refused with a message saying so. - **NF4** (bitsandbytes): 4-bit, CUDA only. - **SDNQ**: see [SDNQ Quantization](/configuration/optimization/sdnq-quantization/). - **int8** (`int8_convrot`, from ComfyUI repackages): the weights stay int8 in memory on every device, including Apple Silicon, and need no setting to turn on. Supported for FLUX.1, FLUX.2 Klein, Z-Image, Krea-2, Qwen-Image-2.1, Ideogram 4, MiniMax H3, LTX-2 and the PiD decoders, and for the Qwen3 8B, Qwen3-VL and LTX-2 Gemma encoders. @@ -52,7 +52,7 @@ InvokeAI recognizes the format from the file's contents, so you install them lik - **fp8** (plain or `fp8_scaled`): InvokeAI keeps the weights in fp8 when [FP8 Storage](/configuration/optimization/fp8-storage/) is on, which installation does for you, or when `fp8_compute` is enabled. - **MXFP8** (fp8 with one scale per block of 32 weights): loaded by unpacking to BF16. Turn FP8 Storage off for these; see the [FP8 Storage caution](/configuration/optimization/fp8-storage/). -Text encoders for Qwen-Image, Z-Image, Krea-2, Ideogram 4 and Qwen-Image-2.1 bring their tokenizer and configuration with InvokeAI, so single-file and GGUF encoders load without network access. +Text encoders for Qwen-Image, Z-Image, Krea-2, FLUX.3, Ideogram 4 and Qwen-Image-2.1 bring their tokenizer and configuration with InvokeAI, so single-file and GGUF encoders load without network access. ### Converting to Diffusers @@ -77,7 +77,7 @@ single-file and quantized installs you often pick some of them yourself. They appear as separate models in the Model Manager, and generation panels show slots for them (for example **VAE**, **Text encoder** or **Model components**) when the selected model needs -them. Several families share components: FLUX.2 and Ideogram 4 use +them. Several families share components: FLUX.2, FLUX.3 and Ideogram 4 use the same VAE, for example, and Ideogram 4 and Qwen-Image-2.1 the same Qwen3-VL 8B encoder, so one download can serve both. @@ -119,6 +119,7 @@ faster generation. | **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.3** | Images | 5.6B Klein in a fast step-distilled variant and an undistilled Base. Generates and edits images from up to ten reference images. | Kommunity, free under $5M revenue | [FLUX.3](/users-guide/models/local-models/flux-3/) | | **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 7279c395b1a..38933eb2f67 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 @@ -31,6 +31,7 @@ Ministral 3B encoder. Others are recognized by their layer names and fail, or mi | [SD 3](/users-guide/models/local-models/sd-3/) | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | | [FLUX.1](/users-guide/models/local-models/flux-1/) | ✓ | ✓ | ✓ | ✓ | ✗ | ✓ | ✓ | ✓ | ✓ | | [FLUX.2](/users-guide/models/local-models/flux-2/) | ✓ | ✓ | ✓ | ✓ | ✗ | ✓ | ✓ | ✓ | inside the Diffusers folder (FLUX.2 [dev]) | +| [FLUX.3](/users-guide/models/local-models/flux-3/) | ✓ | ✓ | R | R | R | – | ✓ | – | – | | [CogView4](/users-guide/models/local-models/cogview4/) | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | | [Z-Image](/users-guide/models/local-models/z-image/) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | | [Qwen-Image](/users-guide/models/local-models/qwen-image/) | ✓ | ✓ | ✓ | ✗ | ✓ | ✓ | ✓ | ✗ | ✗ | @@ -59,7 +60,7 @@ Ministral 3B encoder. Others are recognized by their layer names and fail, or mi | T5-XXL | FLUX.1, SD 3 | ✓ | ✗ | ✗ | ✗ | ✗ | ✓ | ✓ (and bitsandbytes int8) | | CLIP-L / CLIP-G | SD, SDXL, FLUX.1, SD 3 | ✓ | ✓ | R | R | – | ✗ | CLIP-L inside a FLUX.1 SDNQ pipeline | | Qwen3 0.6B / 4B / 8B | Z-Image, FLUX.2 Klein, Anima | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | -| Qwen3-VL 4B / 8B | Krea-2, Ideogram 4, Qwen-Image-2.1 (8B) | ✓ | ✓ | ✓ | ✓ | ✗ | ✓ | ✗ | +| Qwen3-VL 4B / 8B | Krea-2, FLUX.3, Ideogram 4, Qwen-Image-2.1 (8B) | ✓ | ✓ | ✓ | ✓ | ✗ | ✓ | ✗ | | Qwen3-VL 32B (truncated) | MiniMax H3 | in the Diffusers folder | ✓ | L | ✓ | L | ✗ | ✗ | | Qwen3.5 4B | Anima 3.8B | ✗ | ✓ | L | L | L | ✗ | ✗ | | Qwen2.5-VL | Qwen-Image | ✓ | ✓ | ✓ | L | ✓ | ✗ | ✗ | @@ -83,7 +84,7 @@ not recognized. | VAE | Single file | Diffusers | Used by | |---|---|---|---| -| SD 1.x, SDXL, SD 3, FLUX.1, FLUX.2 | ✓ | ✓ | its own family; FLUX.1's also by Z-Image, FLUX.2's also by Ideogram 4 and ERNIE-Image | +| SD 1.x, SDXL, SD 3, FLUX.1, FLUX.2 | ✓ | ✓ | its own family; FLUX.1's also by Z-Image, FLUX.2's also by FLUX.3, Ideogram 4 and ERNIE-Image | | SD 2.x | ✓ | ✗ | SD 2.x | | Wan (16 and 48 channels) | ✓ | ✓ | Wan 2.2; the Wan 2.1 VAE also by Anima | | Qwen-Image | ✓ | ✗ | Qwen-Image, Krea-2 | @@ -104,7 +105,7 @@ not check, so a quantized file there fails with an unclear error or decodes inco | 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) | | | LTX-2, MiniMax H3 | ✓ (plain low-rank; LoKR, LoHA and DoRA are refused) | ✗ | | -| SD 3, CogView4, Ideogram 4, ERNIE-Image, Qwen-Image-2.1 | ✗ | ✗ | | +| SD 3, CogView4, FLUX.3, Ideogram 4, ERNIE-Image, Qwen-Image-2.1 | ✗ | ✗ | | -[PiD decoders](/users-guide/image-generation/advanced-topics/pid-decode/) load for FLUX.1, FLUX.2, SD 3, SDXL and -Qwen-Image (v1 and v1.5, bf16 and int8 builds). +[PiD decoders](/users-guide/image-generation/advanced-topics/pid-decode/) load for FLUX.1, FLUX.2 (whose decoders also decode FLUX.3), SD 3, +SDXL and Qwen-Image (v1 and v1.5, bf16 and int8 builds). diff --git a/docs/src/content/docs/Users Guide/03.Models/Local Models/flux-3.mdx b/docs/src/content/docs/Users Guide/03.Models/Local Models/flux-3.mdx new file mode 100644 index 00000000000..d5c85cfd344 --- /dev/null +++ b/docs/src/content/docs/Users Guide/03.Models/Local Models/flux-3.mdx @@ -0,0 +1,118 @@ +--- +title: FLUX.3 +description: Generate and edit images with FLUX.3 Image Klein (step-distilled) and Klein Base, including editing with up to ten reference images and the GGUF / single-file workflow. +lastUpdated: 2026-10-16 +sidebar: + order: 6 +--- + +FLUX.3 Image Klein is a 5.6B diffusion transformer from Black Forest Labs that generates images from text +and edits or combines up to ten reference images. InvokeAI supports both published checkpoints: + +- **FLUX.3 Klein**: step-distilled, for everyday use. Runs at **16 steps** with **CFG off** (CFG Scale `1.0`). + It always samples without CFG, so Invoke is unavailable while CFG Scale is above 1. +- **FLUX.3 Klein Base**: the undistilled checkpoint. Runs at **50 steps** with **CFG 3.5** and a negative + prompt. It is meant mainly for fine-tuning and LoRA training, but generates normally too. + +The variant is detected on install. A new FLUX.3 model starts with the defaults of its variant (steps, CFG, +1024×1024); when you switch from one variant to the other, use **Reset all to model defaults** in the +Generate panel header to take over the new defaults. + +## License + +Both checkpoints are released under the **FLUX Kommunity License v1.0**: non-commercial use, or commercial use +for companies below US$5M in annual revenue. The Black Forest Labs repositories are gated: accept the license on +the model's HuggingFace page and add your HuggingFace token under **API Keys** in the Model Manager. The GGUF +copies are not gated, but the same license applies. + +This is a summary, not legal advice. Read the full license on the model's HuggingFace page before using a model +commercially. + +## Hardware + +| Transformer build | Transformer size | Notes | +| --------------------------- | ---------------- | --------------------------------------- | +| bf16 (Diffusers or single file) | ≈ 10.3 GiB | reference quality | +| GGUF Q8_0 (starter model) | ≈ 5.6 GiB | close to bf16 | +| GGUF Q4_K_M (starter model) | ≈ 3.1 GiB | lowest VRAM; fine detail differs from bf16 | + +The Qwen3-VL 4B encoder (≈ 8.5 GB as bf16, about half as fp8) and the FLUX.2 VAE come on top. The encoder runs +before the transformer, so the two do not have to fit on the GPU at the same time. + +Reference images add to the work per step: each 1 MP reference costs about as much as the image itself. On an +RTX 4090 a 1024² image takes about 15 s with Klein, 25 s with one reference, 50 s with three references, and +about 50 s with Klein Base. + +## Installing + +The **FLUX.3 launchpad bundle** in the Model Manager installs the GGUF Q4_K_M transformer, the Qwen3-VL 4B encoder +and the FLUX.2 VAE. None of these are gated. + +FLUX.3 needs three components: + +| Component | Diffusers install | GGUF / single-file install | +| ------------------------- | ----------------------- | -------------------------- | +| Transformer | bundled | the `.gguf` or `.safetensors` file | +| VAE (FLUX.2) | bundled | installed separately | +| Text encoder (Qwen3-VL 4B) | bundled | installed separately | + +- **Diffusers** (`black-forest-labs/flux-3-image-klein`, `black-forest-labs/flux-3-image-klein-base`): an install + of about 20 GB that bundles the VAE and the text encoder. Installing by repository id downloads only the + Diffusers folders, not the single-file copy that sits next to them in the repository. +- **GGUF / single file**: the file holds only the transformer. Install the **FLUX.2 VAE** and the **Qwen3-VL 4B + encoder** as well. They are the same models FLUX.2 and Krea-2 use, so an existing install serves FLUX.3 too. + +When you select a GGUF or single-file FLUX.3 model, pick the VAE and the Qwen3-VL encoder under **Components** if +they are not filled in. A Diffusers model uses its bundled components unless you override them there. + +:::note[Quantized single files] +The fp8, int8 and nvfp4 single files from Black Forest Labs and Comfy-Org are not supported yet. Installing one is +refused with a message saying so. Use the bf16 file or a GGUF. +::: + +## Reference images + +Add up to **ten** reference images on the Generate tab or the Canvas and describe the edit in the prompt. No extra +model is needed. A single reference is used at up to 4 MP; with several, each is limited to 1 MP. + +FLUX.3 names its references in the prompt as ``, `` and so on, for example +`The fox from sitting next to the fox from `. Each reference card shows its tag; click +the tag to copy it. Only enabled cards with an image are numbered, so turning a card off renumbers the cards below +it. + +In the workflow editor, wrap each image in a **Kontext Conditioning - FLUX** node and connect them, or a collection +of them, to the **Reference Images** input of **Denoise - FLUX.3**. + +On Nvidia GPUs reference images are encoded whole, as in the reference pipelines, unless the card is too small for a +large reference (a 4 MP reference needs about 8.5 GB to encode whole, so cards below 24 GB tile it). On AMD GPUs and +Apple Silicon, where the encoder's attention would need memory that grows with the square of the image size, they +are always encoded in 512 px tiles. Tiling keeps memory bounded but changes the edit slightly. + +## Canvas + +Image-to-image, inpainting and outpainting work on the Canvas as they do for FLUX.2. Regional guidance and layout +boxes are not supported yet. Using the canvas itself as a reference image is a manual step: create a reference image +from the bounding box. + +## Layout and box edits in the prompt + +FLUX.3 also reads object boxes and box edits written as JSON at the end of the prompt. InvokeAI passes the prompt +through unchanged, so a prompt written in the format from the model card works, but there is no editor for it +yet. + +## PiD super-resolution decode + +FLUX.3 latents are FLUX.2 latents, so the FLUX.2 PiD decoders decode them. See +[PiD Super-Resolution Decode](/users-guide/image-generation/advanced-topics/pid-decode/). + +## Workflow nodes + +| Node | Purpose | +| --- | --- | +| **Main Model - FLUX.3** | Loads the transformer, encoder and VAE | +| **Prompt - FLUX.3** | Encodes the prompt | +| **Denoise - FLUX.3** | Runs the diffusion; takes the VAE, optional reference images and, for Klein Base, CFG and a negative prompt | +| **Latents to Image - FLUX2** / **Image to Latents - FLUX2** | VAE decode / encode | + +**Denoise - FLUX.3** has no scheduler input: Klein steps its own flow map and Klein Base samples with Euler, as in +the reference implementation. diff --git a/docs/src/content/docs/Users Guide/03.Models/Local Models/ideogram4.mdx b/docs/src/content/docs/Users Guide/03.Models/Local Models/ideogram4.mdx index 788326294e8..1c99ebe5e99 100644 --- a/docs/src/content/docs/Users Guide/03.Models/Local Models/ideogram4.mdx +++ b/docs/src/content/docs/Users Guide/03.Models/Local Models/ideogram4.mdx @@ -3,7 +3,7 @@ title: Ideogram 4 description: Generate images with the Ideogram 4 text-to-image models. lastUpdated: 2026-10-08 sidebar: - order: 6 + order: 7 --- ## Ideogram 4 diff --git a/docs/src/content/docs/Users Guide/03.Models/Local Models/krea-2.mdx b/docs/src/content/docs/Users Guide/03.Models/Local Models/krea-2.mdx index d87a444e5cd..3a01e8e2be1 100644 --- a/docs/src/content/docs/Users Guide/03.Models/Local Models/krea-2.mdx +++ b/docs/src/content/docs/Users Guide/03.Models/Local Models/krea-2.mdx @@ -3,7 +3,7 @@ title: Krea-2 description: Generate images with the Krea-2 text-to-image models (Turbo and Raw), including the GGUF / single-file workflow, the conditioning enhancers and training-free style reference. lastUpdated: 2026-09-30 sidebar: - order: 7 + order: 8 --- Krea-2 is a ~12B single-stream diffusion-transformer text-to-image family. InvokeAI supports both diff --git a/docs/src/content/docs/Users Guide/03.Models/Local Models/qwen-image-2-1.mdx b/docs/src/content/docs/Users Guide/03.Models/Local Models/qwen-image-2-1.mdx index 25e2a520ad1..327cd4552a6 100644 --- a/docs/src/content/docs/Users Guide/03.Models/Local Models/qwen-image-2-1.mdx +++ b/docs/src/content/docs/Users Guide/03.Models/Local Models/qwen-image-2-1.mdx @@ -3,7 +3,7 @@ title: Qwen-Image-2.1 description: Generate images with Qwen-Image-2.1 and its 8-step Turbo variant, from the Diffusers folders or a GGUF transformer, including transparent (RGBA) output. lastUpdated: 2026-10-16 sidebar: - order: 8 + order: 9 --- ## 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 36f80a60b3a..6a2cf952060 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 @@ -3,7 +3,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 sidebar: - order: 8 + order: 9 --- Qwen Image is a diffusion-transformer image family from the Qwen team that encodes prompts with the diff --git a/docs/src/content/docs/Users Guide/03.Models/Local Models/sd-3.mdx b/docs/src/content/docs/Users Guide/03.Models/Local Models/sd-3.mdx index 84473f513f3..2526c698af7 100644 --- a/docs/src/content/docs/Users Guide/03.Models/Local Models/sd-3.mdx +++ b/docs/src/content/docs/Users Guide/03.Models/Local Models/sd-3.mdx @@ -3,7 +3,7 @@ title: Stable Diffusion 3.5 description: Generate images with Stability AI's Stable Diffusion 3.5 Medium and Large models, including text encoder options and PiD super-resolution decoding. lastUpdated: 2026-09-30 sidebar: - order: 11 + order: 12 --- Stable Diffusion 3.5 is Stability AI's diffusion-transformer text-to-image family. It encodes prompts diff --git a/docs/src/content/docs/Users Guide/03.Models/Local Models/sdxl.mdx b/docs/src/content/docs/Users Guide/03.Models/Local Models/sdxl.mdx index 84a8e26b810..e809771072c 100644 --- a/docs/src/content/docs/Users Guide/03.Models/Local Models/sdxl.mdx +++ b/docs/src/content/docs/Users Guide/03.Models/Local Models/sdxl.mdx @@ -3,7 +3,7 @@ title: SDXL description: Generate images with Stable Diffusion XL models, including the fp16-fix VAE, ControlNet, T2I-Adapter, IP-Adapter reference images, PiD decoding and the SDXL Refiner. lastUpdated: 2026-09-30 sidebar: - order: 9 + order: 10 --- Stable Diffusion XL (SDXL) is a latent-diffusion UNet model trained at **1024×1024**, with two CLIP diff --git a/docs/src/content/docs/Users Guide/03.Models/Local Models/stable-diffusion-1-2.mdx b/docs/src/content/docs/Users Guide/03.Models/Local Models/stable-diffusion-1-2.mdx index 7ad26980564..957650f5d10 100644 --- a/docs/src/content/docs/Users Guide/03.Models/Local Models/stable-diffusion-1-2.mdx +++ b/docs/src/content/docs/Users Guide/03.Models/Local Models/stable-diffusion-1-2.mdx @@ -3,7 +3,7 @@ title: Stable Diffusion 1.5 / 2.x description: Generate images with Stable Diffusion 1.5 and legacy SD 2.x models, including inpainting models, ControlNet, T2I-Adapter, IP-Adapter reference images, LoRAs and embeddings. lastUpdated: 2026-09-30 sidebar: - order: 10 + order: 11 --- Stable Diffusion 1.x and 2.x are the original latent-diffusion UNet models. They are small and fast diff --git a/docs/src/content/docs/Users Guide/03.Models/Local Models/z-image.mdx b/docs/src/content/docs/Users Guide/03.Models/Local Models/z-image.mdx index 956cf447a56..6be980e40d0 100644 --- a/docs/src/content/docs/Users Guide/03.Models/Local Models/z-image.mdx +++ b/docs/src/content/docs/Users Guide/03.Models/Local Models/z-image.mdx @@ -3,7 +3,7 @@ title: Z-Image description: Generate images with Z-Image Turbo and Z-Image Base, including the GGUF, NVFP4 and SDNQ builds, ControlNets and regional prompting. lastUpdated: 2026-09-30 sidebar: - order: 12 + order: 13 --- Z-Image is a 6B-parameter text-to-image family from Tongyi-MAI that understands both English and Chinese diff --git a/docs/src/content/docs/Users Guide/04.Image Generation/Advanced Topics/pid-decode.mdx b/docs/src/content/docs/Users Guide/04.Image Generation/Advanced Topics/pid-decode.mdx index 1fe55efa95e..d3469b1696e 100644 --- a/docs/src/content/docs/Users Guide/04.Image Generation/Advanced Topics/pid-decode.mdx +++ b/docs/src/content/docs/Users Guide/04.Image Generation/Advanced Topics/pid-decode.mdx @@ -23,6 +23,7 @@ PiD works with these base models: |---|---| | FLUX.1 | PiD Decoder FLUX | | FLUX.2 Klein (4B / 9B) | PiD Decoder FLUX.2 | +| FLUX.3 Klein / Klein Base | **PiD Decoder FLUX.2** (FLUX.3 shares FLUX.2's VAE) | | Stable Diffusion 3 | PiD Decoder SD3 | | SDXL | PiD Decoder SDXL | | Z-Image / Z-Image Turbo | **PiD Decoder FLUX** (Z-Image shares FLUX.1's VAE) | diff --git a/docs/src/content/docs/Users Guide/04.Image Generation/generate-panel.mdx b/docs/src/content/docs/Users Guide/04.Image Generation/generate-panel.mdx index eeb01458102..c3630d99fe4 100644 --- a/docs/src/content/docs/Users Guide/04.Image Generation/generate-panel.mdx +++ b/docs/src/content/docs/Users Guide/04.Image Generation/generate-panel.mdx @@ -49,7 +49,7 @@ The **Seed** sets the starting noise for the image. The same model, prompt, seed A negative prompt lists what you do *not* want in the image, such as *blurry, watermark, extra fingers*. Models that support one show a **+ Negative prompt…** button under the prompt; click it to open the box, and click **Turn off negative prompt** to hide it again without losing the text. -Not every model uses a negative prompt. SD 1.5, SDXL, SD 3.5 and CogView4 always use it. Several newer models, including Z-Image, Qwen Image, Qwen-Image-2.1 and Krea-2, use it only when CFG is above 1, and the box says so. FLUX.1, FLUX.2 and Ideogram 4 do not use a negative prompt, and the box is not shown for them. +Not every model uses a negative prompt. SD 1.5, SDXL, SD 3.5 and CogView4 always use it. Several newer models, including Z-Image, Qwen Image, Qwen-Image-2.1, Krea-2 and FLUX.3 Klein Base, use it only when CFG is above 1, and the box says so. FLUX.1, FLUX.2 and Ideogram 4 do not use a negative prompt, and the box is not shown for them. ### Advanced settings @@ -102,6 +102,7 @@ What a reference does, and what options it has, depends on the model family: | **FLUX.1** | An IP-Adapter, or a **FLUX Redux** model, which transfers the reference's content. | IP-Adapter options as above, or **Image influence** (Lowest to Highest) for Redux. | | **FLUX.1 Kontext** | Kontext edits or recombines the reference images according to your prompt. | None beyond the model. | | **FLUX.2, Qwen Image Edit** | The model reads the references directly and uses them as your prompt instructs, for example *put the jacket from the first image on the person in the second*. | None. | +| **FLUX.3** | As FLUX.2, with up to ten references. The prompt names them by the tag on each card, such as ``; click the tag to copy it. | None. | Reference images require an extra model for SD 1.5, SDXL and FLUX.1 (an IP-Adapter or FLUX Redux model). These are available as starter models in the Model Manager, and an installed IP-Adapter is selected automatically. diff --git a/docs/src/content/docs/Users Guide/04.Image Generation/parameters.mdx b/docs/src/content/docs/Users Guide/04.Image Generation/parameters.mdx index 377e5aeb789..b10b3b9c3da 100644 --- a/docs/src/content/docs/Users Guide/04.Image Generation/parameters.mdx +++ b/docs/src/content/docs/Users Guide/04.Image Generation/parameters.mdx @@ -40,7 +40,7 @@ The scheduler decides how much noise is removed at each step. Which ones are off * **SD 1.5, SD 2.x and SDXL** offer the full list. **DPM++ 2M Karras** and **Euler** are good general-purpose choices; **Euler Ancestral** and the other *Ancestral* and *SDE* schedulers add variety and keep changing the image as steps increase; **UniPC** and **DPM++ 3M** reach good results in fewer steps. **LCM** and **TCD** are only for LCM- and TCD-distilled models. * **Flow models**, such as FLUX.1, FLUX.2, Z-Image and ERNIE-Image, offer **Euler**, **Heun (2nd order)**, which is slower per step but can need fewer steps, and **LCM** for distilled models. * **Anima** has its own short list, starting with **Euler**. -* Some families, including SD 3.5, Qwen Image, Qwen-Image-2.1, CogView4, Krea-2 and Ideogram 4, use a fixed schedule and do not show the field. +* Some families, including SD 3.5, Qwen Image, Qwen-Image-2.1, CogView4, Krea-2, FLUX.3 and Ideogram 4, use a fixed schedule and do not show the field. **Use model default scheduler** switches back to the model's own choice. diff --git a/docs/src/content/docs/contributing/new-model-integration.mdx b/docs/src/content/docs/contributing/new-model-integration.mdx index eda7821880a..35e2d3c2c4a 100644 --- a/docs/src/content/docs/contributing/new-model-integration.mdx +++ b/docs/src/content/docs/contributing/new-model-integration.mdx @@ -215,7 +215,7 @@ Things to get right: - **Latent space.** If the architecture uses a VAE InvokeAI already supports, reuse its shared space from `facets/latent_space.py`: - `FLUX_16`: FLUX.1, Z-Image - - `FLUX2_32`: FLUX.2, ERNIE-Image, Ideogram 4 + - `FLUX2_32`: FLUX.2, FLUX.3, ERNIE-Image, Ideogram 4 - `WAN21_16`: Wan 2.1, Qwen-Image, Krea-2, Anima - `WAN22_48` diff --git a/docs/src/content/docs/start-here/system-requirements.mdx b/docs/src/content/docs/start-here/system-requirements.mdx index ea8c98c32c2..371e427e2be 100644 --- a/docs/src/content/docs/start-here/system-requirements.mdx +++ b/docs/src/content/docs/start-here/system-requirements.mdx @@ -30,6 +30,7 @@ The requirements below are rough guidelines for best performance. GPUs with less | FLUX.1 | 1024x1024 | Nvidia 20xx+ | 10GB | 32GB | Download totals: NF4 ~12GB, int8 ~18GB, bf16 ~33GB. The int8 transformer is 11.5GB resident on any supported GPU, so it streams on a 10GB card | | FLUX.2 Klein 4B | 1024x1024 | Nvidia 30xx+ | 12GB | 16GB | FP8 works with 8GB+; Diffusers + encoder | | FLUX.2 Klein 9B | 1024x1024 | Nvidia 30xx+ | 12GB | 32GB | int8 transformer ~9.5GB on any supported GPU; FP8 checkpoints stay about as small with FP8 Storage, which installation switches on. The Qwen3 8B encoder is 15GB (int8 7.6GB) and streams on a 12GB card | +| FLUX.3 Klein | 1024x1024 | Nvidia 30xx+ | 12GB | 32GB | Transformer bf16 10.3GB, GGUF Q8_0 5.6GB, Q4_K_M 3.1GB, plus the Qwen3-VL 4B encoder (8.5GB bf16). Diffusers ~20GB; single files and GGUFs need a standalone FLUX.2 VAE + Qwen3-VL encoder. Each 1MP reference image adds about as much working memory as the image itself | | Z-Image Turbo | 1024x1024 | Nvidia 20xx+ | 8GB | 16GB | Q4_K / NVFP4 / int8 8GB (int8 ~6GB resident); Q8/BF16 16GB+ | | Krea-2 (Turbo / Raw) | 1024x1024 | Nvidia 40xx | 24GB | 32GB | FP8 works with 16GB+; NVFP4 or GGUF Q4_K transformer ~7GB, plus the Qwen3-VL encoder (8.5GB bf16, ~2.8GB as GGUF Q4_K), int8 transformer 12.6GB. Diffusers ~26GB; single files need a standalone VAE + Qwen3-VL encoder (GGUF encoder ~2.8GB) | | Ideogram 4 | 1024x1024 | Nvidia 30xx+ | 24GB | 32GB | Two transformers resident at once. nf4 build fits 24GB (CUDA only); single-file fp8 or int8 pair ~17.5GB, GGUF Q4_0 pair ~11GB, plus the Qwen3-VL 8B encoder. See [Ideogram 4](/users-guide/models/local-models/ideogram4/) | diff --git a/invokeai/app/invocations/fields.py b/invokeai/app/invocations/fields.py index 588f64beafb..58f3617e2d1 100644 --- a/invokeai/app/invocations/fields.py +++ b/invokeai/app/invocations/fields.py @@ -184,6 +184,7 @@ class FieldDescriptions: flux2_dev_model = "FLUX.2 [dev] model (Transformer) to load" krea2_model = "Krea-2 model (Transformer) to load" qwen_image_2_1_model = "Qwen-Image-2.1 model (Transformer) to load" + flux3_model = "FLUX.3 model (Transformer) to load" qwen_image_model = "Qwen Image Edit model (Transformer) to load" qwen_vl_encoder = "Qwen2.5-VL tokenizer, processor and text/vision encoder" wan_model = "Wan 2.2 model (Transformer) to load" @@ -420,6 +421,12 @@ class QwenImage21ConditioningField(BaseModel): conditioning_name: str = Field(description="The name of conditioning tensor") +class Flux3ConditioningField(BaseModel): + """A FLUX.3 conditioning tensor primitive value""" + + conditioning_name: str = Field(description="The name of conditioning tensor") + + class Krea2StyleReferenceField(BaseModel): """Style-reference conditioning for Krea-2 shared-KV reference attention. diff --git a/invokeai/app/invocations/flux2/flux2_denoise.py b/invokeai/app/invocations/flux2/flux2_denoise.py index 928d2e1d117..b32aae2b40d 100644 --- a/invokeai/app/invocations/flux2/flux2_denoise.py +++ b/invokeai/app/invocations/flux2/flux2_denoise.py @@ -29,6 +29,7 @@ from invokeai.backend.flux.schedulers import FLUX_SCHEDULER_LABELS, FLUX_SCHEDULER_MAP, FLUX_SCHEDULER_NAME_VALUES from invokeai.backend.flux2.denoise import denoise from invokeai.backend.flux2.extensions.regional_prompting_extension import Flux2RegionalPromptingExtension +from invokeai.backend.flux2.latent_norm import bn_denormalize, bn_normalize, read_vae_bn_stats from invokeai.backend.flux2.ref_image_extension import Flux2RefImageExtension from invokeai.backend.flux2.sampling_utils import ( FLUX2_TXT2IMG_SCHEDULER_KWARGS, @@ -187,78 +188,7 @@ def _get_bn_stats(self, context: InvocationContext) -> Optional[Tuple[torch.Tens Tuple of (bn_mean, bn_std) tensors of shape (128,), or None if BN layer not found. """ with context.models.load(self.vae.vae).model_on_device() as (_, vae): - # Ensure VAE is in eval mode to prevent BN stats from being updated - vae.eval() - - # Try to find the BN layer - it may be at different locations depending on model format - bn_layer = None - if hasattr(vae, "bn"): - bn_layer = vae.bn - elif hasattr(vae, "batch_norm"): - bn_layer = vae.batch_norm - elif hasattr(vae, "encoder") and hasattr(vae.encoder, "bn"): - bn_layer = vae.encoder.bn - - if bn_layer is None: - return None - - # Verify running statistics are initialized - if bn_layer.running_mean is None or bn_layer.running_var is None: - return None - - # Get BN running statistics from VAE - bn_mean = bn_layer.running_mean.clone() # Shape: (128,) - bn_var = bn_layer.running_var.clone() # Shape: (128,) - bn_eps = bn_layer.eps if hasattr(bn_layer, "eps") else 1e-4 # BFL uses 1e-4 - bn_std = torch.sqrt(bn_var + bn_eps) - - return bn_mean, bn_std - - def _bn_normalize( - self, - x: torch.Tensor, - bn_mean: torch.Tensor, - bn_std: torch.Tensor, - ) -> torch.Tensor: - """Apply BN normalization to packed latents. - - BN formula (affine=False): y = (x - mean) / std - - Args: - x: Packed latents of shape (B, seq, 128). - bn_mean: BN running mean of shape (128,). - bn_std: BN running std of shape (128,). - - Returns: - Normalized latents of same shape. - """ - # x: (B, seq, 128), params: (128,) -> broadcast over batch and sequence dims - bn_mean = bn_mean.to(x.device, x.dtype) - bn_std = bn_std.to(x.device, x.dtype) - return (x - bn_mean) / bn_std - - def _bn_denormalize( - self, - x: torch.Tensor, - bn_mean: torch.Tensor, - bn_std: torch.Tensor, - ) -> torch.Tensor: - """Apply BN denormalization to packed latents (inverse of normalization). - - Inverse BN (affine=False): x = y * std + mean - - Args: - x: Packed latents of shape (B, seq, 128). - bn_mean: BN running mean of shape (128,). - bn_std: BN running std of shape (128,). - - Returns: - Denormalized latents of same shape. - """ - # x: (B, seq, 128), params: (128,) -> broadcast over batch and sequence dims - bn_mean = bn_mean.to(x.device, x.dtype) - bn_std = bn_std.to(x.device, x.dtype) - return x * bn_std + bn_mean + return read_vae_bn_stats(vae) def _prepare_normalized_start_latents( self, @@ -290,7 +220,7 @@ def _prepare_normalized_start_latents( Tuple of (start latents, normalized init latents), both of shape (B, seq, 128). """ if bn_mean is not None and bn_std is not None: - init_latents_packed = self._bn_normalize(init_latents_packed, bn_mean, bn_std) + init_latents_packed = bn_normalize(init_latents_packed, bn_mean, bn_std) if self.add_noise: assert noise_packed is not None @@ -477,7 +407,7 @@ def _run_diffusion(self, context: InvocationContext) -> torch.Tensor: # this output would divide it by bn_std a second time. if len(timesteps) <= 1: if bn_mean is not None and bn_std is not None: - x = self._bn_denormalize(x, bn_mean, bn_std) + x = bn_denormalize(x, bn_mean, bn_std) return unpack_flux2(x.float(), self.height, self.width) # Prepare inpaint extension @@ -653,7 +583,7 @@ def _run_diffusion(self, context: InvocationContext) -> torch.Tensor: # The diffusers Flux2KleinPipeline applies: latents = latents * bn_std + bn_mean # This transforms latents from normalized space to VAE's expected input space if bn_mean is not None and bn_std is not None: - x = self._bn_denormalize(x, bn_mean, bn_std) + x = bn_denormalize(x, bn_mean, bn_std) x = unpack_flux2(x.float(), self.height, self.width) return x diff --git a/invokeai/app/invocations/flux3/__init__.py b/invokeai/app/invocations/flux3/__init__.py new file mode 100644 index 00000000000..17dc7a36d16 --- /dev/null +++ b/invokeai/app/invocations/flux3/__init__.py @@ -0,0 +1,10 @@ +"""Flux3 nodes. + +Node modules go here, keeping their architecture prefix: `flux3_denoise.py`, +`flux3_model_loader.py`. VAE, text-encoder and PiD nodes belong in +`invocations/vae/`, `invocations/text_encoder/` and `invocations/pid/` instead — they are shared +across architectures rather than owned by one. + +This package is discovered automatically; there is no list to add it to. The `__init__.py` is what +makes it a package, and without it every node in here would silently not exist. +""" diff --git a/invokeai/app/invocations/flux3/flux3_denoise.py b/invokeai/app/invocations/flux3/flux3_denoise.py new file mode 100644 index 00000000000..d7bcf79ae33 --- /dev/null +++ b/invokeai/app/invocations/flux3/flux3_denoise.py @@ -0,0 +1,311 @@ +from contextlib import ExitStack +from typing import Callable, Optional + +import torch +import torchvision.transforms as tv_transforms +from torchvision.transforms.functional import resize as tv_resize + +from invokeai.app.invocations.baseinvocation import BaseInvocation, Classification, invocation +from invokeai.app.invocations.fields import ( + DenoiseMaskField, + FieldDescriptions, + Flux3ConditioningField, + FluxKontextConditioningField, + Input, + InputField, + LatentsField, +) +from invokeai.app.invocations.model import TransformerField, VAEField +from invokeai.app.invocations.primitives import LatentsOutput +from invokeai.app.services.shared.invocation_context import InvocationContext +from invokeai.backend.flux.sampling_utils import clip_timestep_schedule_fractional +from invokeai.backend.flux2.latent_norm import bn_denormalize, bn_normalize, read_vae_bn_stats +from invokeai.backend.flux2.sampling_utils import pack_flux2, unpack_flux2 +from invokeai.backend.flux3.denoise import denoise +from invokeai.backend.flux3.ref_images import FLUX3_MAX_REFERENCE_IMAGES, encode_flux3_references +from invokeai.backend.flux3.sampling import ( + get_noise_flux3, + get_schedule_flux3, + image_position_ids, + redensify_schedule_flux3, + text_position_ids, +) +from invokeai.backend.model_manager.taxonomy import BaseModelType, Flux3VariantType, ModelType +from invokeai.backend.quantization.dequantizing_linear import peak_dequant_transient_bytes +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.diffusion.conditioning_data import Flux3ConditioningInfo +from invokeai.backend.util.attention import sdpa_score_matrix_bytes +from invokeai.backend.util.devices import TorchDevice + +FLUX3_ATTENTION_HEAD_DIM = 128 +FLUX3_ATTENTION_HEADS = 24 +# Peak activation bytes per attended token (image + reference + text) in bf16, at driver level: one Klein forward +# on an RTX 4090 measured 0.286 MB/token from 1 to 4 MP without references and up to 0.320 with six 1 MP +# references (the allocator peak is about half of that). ROCm is unmeasured; FLUX.2 Klein 4B ran ~8 % higher there. +FLUX3_BYTES_PER_TOKEN = int(0.33 * 1024**2) + + +@invocation( + "flux3_denoise", + title="Denoise - FLUX.3", + tags=["image", "flux3", "flux", "denoise"], + category="latents", + version="1.0.0", + classification=Classification.Prototype, +) +class Flux3DenoiseInvocation(BaseInvocation): + """Run the denoising process with a FLUX.3 Image transformer (Klein or Klein Base). + + Klein is step-distilled (a flow map) and samples without CFG; Klein Base takes CFG with a negative + conditioning. Reference images condition an edit: describe the result in the prompt and refer to them as + , , ... in the order they are connected. + """ + + latents: Optional[LatentsField] = InputField( + default=None, description=FieldDescriptions.latents, input=Input.Connection + ) + denoise_mask: Optional[DenoiseMaskField] = InputField( + default=None, description=FieldDescriptions.denoise_mask, input=Input.Connection + ) + denoising_start: float = InputField(default=0.0, ge=0, le=1, description=FieldDescriptions.denoising_start) + denoising_end: float = InputField(default=1.0, ge=0, le=1, description=FieldDescriptions.denoising_end) + add_noise: bool = InputField(default=True, description="Add noise based on denoising start.") + transformer: TransformerField = InputField( + description=FieldDescriptions.flux3_model, input=Input.Connection, title="Transformer" + ) + positive_conditioning: Flux3ConditioningField = InputField( + description=FieldDescriptions.positive_cond, input=Input.Connection + ) + negative_conditioning: Optional[Flux3ConditioningField] = InputField( + default=None, + description="Negative conditioning. Used by Klein Base when CFG Scale is above 1.", + input=Input.Connection, + ) + cfg_scale: float = InputField( + default=1.0, + ge=1.0, + description="Classifier-free guidance scale for Klein Base (3.5 recommended); 1 disables it. Klein takes " + "no CFG.", + title="CFG Scale", + ) + # `multiple_of` must equal FeaturesFacet.dimension_grid. + width: int = InputField(default=1024, gt=0, multiple_of=16, description="Width of the generated image.") + height: int = InputField(default=1024, gt=0, multiple_of=16, description="Height of the generated image.") + steps: int = InputField( + default=16, gt=0, description="Number of denoising steps: 16 for Klein (4-16 work), 50 for Klein Base." + ) + seed: int = InputField(default=0, description="Randomness seed for reproducibility.") + vae: VAEField = InputField( + description="The FLUX.2 VAE: its latent statistics, and the encoder for reference images.", + input=Input.Connection, + ) + kontext_conditioning: FluxKontextConditioningField | list[FluxKontextConditioningField] | None = InputField( + default=None, + description="Reference images to edit or combine (up to 10).", + input=Input.Connection, + title="Reference Images", + ) + + @torch.no_grad() + def invoke(self, context: InvocationContext) -> LatentsOutput: + latents = self._run_diffusion(context).detach().to("cpu") + name = context.tensors.save(tensor=latents) + return LatentsOutput.build(latents_name=name, latents=latents, seed=None) + + def _run_diffusion(self, context: InvocationContext) -> torch.Tensor: + device = TorchDevice.choose_torch_device() + # The dtype the loaders build the transformer in, so the activations match its weights. + compute_dtype = TorchDevice.choose_bfloat16_safe_dtype(device) + + transformer_config = context.models.get_config(self.transformer.transformer) + if transformer_config.base is not BaseModelType.Flux3 or transformer_config.type is not ModelType.Main: + raise ValueError(f"'{transformer_config.name}' is not a FLUX.3 transformer.") + + references = self._reference_fields() + if len(references) > FLUX3_MAX_REFERENCE_IMAGES: + raise ValueError(f"FLUX.3 takes at most {FLUX3_MAX_REFERENCE_IMAGES} reference images.") + use_cfg = self.cfg_scale > 1.0 + # Checked before anything loads; `denoise` refuses the combination too, keyed on the loaded weights. + if use_cfg and getattr(transformer_config, "variant", None) is Flux3VariantType.Klein: + raise ValueError( + "FLUX.3 Klein is step-distilled and samples without CFG. Set CFG Scale to 1, or use FLUX.3 Klein " + "Base for CFG and a negative prompt." + ) + if use_cfg and self.negative_conditioning is None: + raise ValueError("A CFG Scale above 1 needs a negative conditioning.") + + vae_info = context.models.load(self.vae.vae) + with vae_info.model_on_device() as (_, vae): + bn_stats = read_vae_bn_stats(vae) + if bn_stats is None: + raise ValueError("FLUX.3 needs the FLUX.2 VAE, whose latent statistics this VAE does not carry.") + bn_mean, bn_std = bn_stats + + txt = self._load_conditioning(context, self.positive_conditioning, device, compute_dtype) + neg_txt = ( + self._load_conditioning(context, self.negative_conditioning, device, compute_dtype) + if use_cfg and self.negative_conditioning is not None + else None + ) + + noise = get_noise_flux3(self.height, self.width, self.seed).to(device) + init_latents = None + if self.latents is not None: + init_latents = context.tensors.load(self.latents.latents_name).to(device=device, dtype=torch.float32) + if init_latents.shape[-2:] != noise.shape[-2:]: + raise ValueError( + f"The input latents are {init_latents.shape[-1] * 8}x{init_latents.shape[-2] * 8} pixels, but " + f"the node generates {self.width}x{self.height}." + ) + elif self.denoising_start > 1e-5: + raise ValueError("denoising_start must be 0 when no input latents are given.") + + # The schedule is clipped by sigma value to the denoising window. A window that starts late (img2img at + # low strength) is re-spaced so it still takes the requested number of steps (see + # redensify_schedule_flux3); one that starts at 0 is the head of a split chain and keeps its own steps. + timesteps = get_schedule_flux3(self.steps) + timesteps = clip_timestep_schedule_fractional(timesteps, self.denoising_start, self.denoising_end) + if self.denoising_start > 0: + timesteps = redensify_schedule_flux3(timesteps, self.steps) + + # The transformer works on packed tokens in the VAE's BN-normalized space. Only the init latents are + # normalized: the noise is already N(0, 1), the distribution the transformer expects there, so the + # img2img blend is built from the normalized init latents rather than normalizing the mixture (#8964). + noise_packed = pack_flux2(noise) + init_packed = bn_normalize(pack_flux2(init_latents), bn_mean, bn_std) if init_latents is not None else None + if init_packed is None: + x = noise_packed + elif self.add_noise: + x = timesteps[0] * noise_packed + (1.0 - timesteps[0]) * init_packed + else: + x = init_packed + + if len(timesteps) <= 1: + return self._to_latents(x, bn_mean, bn_std) + + inpaint_extension = None + if self.denoise_mask is not None: + if init_packed is None: + raise ValueError("Inpainting needs input latents.") + inpaint_extension = RectifiedFlowInpaintExtension( + init_latents=init_packed, + inpaint_mask=pack_flux2(self._prep_inpaint_mask(context, noise)), + noise=noise_packed, + ) + + ref_tokens, ref_ids = None, None + if references: + ref_tokens, ref_ids = encode_flux3_references( + images=[context.images.get_pil(field.image.image_name) for field in references], + vae_info=vae_info, + bn_mean=bn_mean, + bn_std=bn_std, + device=device, + dtype=compute_dtype, + ) + + batch_size = x.shape[0] + txt = txt.expand(batch_size, -1, -1) + neg_txt = neg_txt.expand(batch_size, -1, -1) if neg_txt is not None else None + ref_tokens = ref_tokens.expand(batch_size, -1, -1) if ref_tokens is not None else None + packed_h, packed_w = self.height // 16, self.width // 16 + + working_memory = self._estimate_working_memory( + num_tokens=packed_h * packed_w + + (ref_tokens.shape[1] if ref_tokens is not None else 0) + + max(txt.shape[1], neg_txt.shape[1] if neg_txt is not None else 0), + batch_size=batch_size, + device=device, + dtype=compute_dtype, + ) + + with ExitStack() as exit_stack: + transformer_info = context.models.load(self.transformer.transformer) + # A GGUF build dequantizes each linear per forward, a transient its resident size does not cover. + dequant_bytes = peak_dequant_transient_bytes(transformer_info.model, compute_dtype) + (_, transformer) = exit_stack.enter_context( + transformer_info.model_on_device(working_mem_bytes=working_memory + dequant_bytes) + ) + x = denoise( + model=transformer, + img=x, + img_ids=image_position_ids(packed_h, packed_w, l_coord=0, device=device), + txt=txt, + txt_ids=text_position_ids(txt.shape[1], device=device), + timesteps=timesteps, + step_callback=self._build_step_callback(context), + flow_map=bool(transformer.config.flow_map), + compute_dtype=compute_dtype, + cfg_scale=self.cfg_scale, + neg_txt=neg_txt, + neg_txt_ids=text_position_ids(neg_txt.shape[1], device=device) if neg_txt is not None else None, + ref_tokens=ref_tokens, + ref_ids=ref_ids, + inpaint_extension=inpaint_extension, + ) + + return self._to_latents(x, bn_mean, bn_std) + + def _to_latents(self, x: torch.Tensor, bn_mean: torch.Tensor, bn_std: torch.Tensor) -> torch.Tensor: + """Packed, normalized tokens -> the unpacked, un-normalized latents FLUX.2-VAE nodes take.""" + return unpack_flux2(bn_denormalize(x.float(), bn_mean, bn_std), self.height, self.width) + + def _reference_fields(self) -> list[FluxKontextConditioningField]: + if self.kontext_conditioning is None: + return [] + if isinstance(self.kontext_conditioning, list): + return self.kontext_conditioning + return [self.kontext_conditioning] + + @staticmethod + def _load_conditioning( + context: InvocationContext, field: Flux3ConditioningField, device: torch.device, dtype: torch.dtype + ) -> torch.Tensor: + cond_data = context.conditioning.load(field.conditioning_name) + if len(cond_data.conditionings) != 1 or not isinstance(cond_data.conditionings[0], Flux3ConditioningInfo): + raise ValueError("The conditioning is not a FLUX.3 conditioning. Connect a 'Prompt - FLUX.3' node.") + return cond_data.conditionings[0].to(device=device, dtype=dtype).prompt_embeds + + def _prep_inpaint_mask(self, context: InvocationContext, latents: torch.Tensor) -> torch.Tensor: + """The denoise mask, inverted to "1 = regenerate" and resized to the unpacked latent grid.""" + assert self.denoise_mask is not None + mask = 1.0 - context.tensors.load(self.denoise_mask.mask_name) + _, _, latent_height, latent_width = latents.shape + mask = tv_resize( + img=mask, + size=[latent_height, latent_width], + interpolation=tv_transforms.InterpolationMode.BILINEAR, + antialias=False, + ) + return mask.to(device=latents.device, dtype=latents.dtype).expand_as(latents) + + @staticmethod + def _estimate_working_memory(num_tokens: int, batch_size: int, device: torch.device, dtype: torch.dtype) -> int: + """Peak transformer activation memory, so the model cache keeps that much VRAM free. + + Attention runs through SDPA without materializing the score matrix, so activations grow linearly with + the attended sequence -- image, reference and text tokens alike. References are the dominant term: ten + 1 MP references add ten times the tokens of a 1 MP image. CFG runs its two forwards one after the + other, so it does not double the peak. The fixed base covers allocator slack and transient casts. + """ + estimated = num_tokens * batch_size * FLUX3_BYTES_PER_TOKEN + int(1.0 * 1024**3) + estimated += sdpa_score_matrix_bytes( + device=device, + dtype=dtype, + num_heads=FLUX3_ATTENTION_HEADS * batch_size, + head_dim=FLUX3_ATTENTION_HEAD_DIM, + seq_len=num_tokens, + has_attn_mask=False, + # The vendored transformer attends through diffusers' `dispatch_attention_fn`. + via_diffusers_dispatch=True, + ) + return estimated + + def _build_step_callback(self, context: InvocationContext) -> Callable[[PipelineIntermediateState], None]: + def step_callback(state: PipelineIntermediateState) -> None: + # The x0 estimate in the normalized space, unpacked: the space FLUX2_32's preview factors expect. + state.latents = unpack_flux2(state.latents.float(), self.height, self.width).squeeze() + context.util.sd_step_callback(state, BaseModelType.Flux3) + + return step_callback diff --git a/invokeai/app/invocations/flux3/flux3_model_loader.py b/invokeai/app/invocations/flux3/flux3_model_loader.py new file mode 100644 index 00000000000..58d5fa80a8f --- /dev/null +++ b/invokeai/app/invocations/flux3/flux3_model_loader.py @@ -0,0 +1,132 @@ +from typing import Optional + +from invokeai.app.invocations.baseinvocation import ( + BaseInvocation, + BaseInvocationOutput, + Classification, + invocation, + invocation_output, +) +from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField +from invokeai.app.invocations.model import ( + ModelIdentifierField, + Qwen3VLEncoderField, + TransformerField, + VAEField, +) +from invokeai.app.services.shared.invocation_context import InvocationContext +from invokeai.backend.architectures import accepted_vae_bases, accepts_vae +from invokeai.backend.model_manager.qwen3_vl_labels import raise_for_wrong_qwen3_vl_variant +from invokeai.backend.model_manager.taxonomy import ( + BaseModelType, + ModelFormat, + ModelType, + Qwen3VLVariantType, + SubModelType, +) + + +@invocation_output("flux3_model_loader_output") +class Flux3ModelLoaderOutput(BaseInvocationOutput): + """FLUX.3 model loader output.""" + + transformer: TransformerField = OutputField(description=FieldDescriptions.transformer, title="Transformer") + qwen3_vl_encoder: Qwen3VLEncoderField = OutputField( + description=FieldDescriptions.qwen3_vl_encoder, title="Qwen3-VL Encoder" + ) + vae: VAEField = OutputField(description=FieldDescriptions.vae, title="VAE") + + +@invocation( + "flux3_model_loader", + title="Main Model - FLUX.3", + tags=["model", "flux3", "flux"], + category="model", + version="1.0.0", + classification=Classification.Prototype, +) +class Flux3ModelLoaderInvocation(BaseInvocation): + """Loads a FLUX.3 Image model (Klein or Klein Base), outputting its submodels. + + A Diffusers model brings its own VAE (the FLUX.2 VAE) and Qwen3-VL 4B text encoder; a single-file or GGUF + model is only the transformer and needs both picked separately. A standalone pick overrides the bundled + component. + """ + + model: ModelIdentifierField = InputField( + description=FieldDescriptions.flux3_model, + input=Input.Direct, + ui_model_base=BaseModelType.Flux3, + ui_model_type=ModelType.Main, + title="Transformer", + ) + + vae_model: Optional[ModelIdentifierField] = InputField( + default=None, + description="Standalone VAE (the FLUX.2 VAE, which FLUX.3 shares). Required when Model is a single file; " + "otherwise an override for the bundled VAE.", + input=Input.Direct, + ui_model_base=accepted_vae_bases(BaseModelType.Flux3), + ui_model_type=ModelType.VAE, + title="VAE", + ) + + qwen3_vl_encoder_model: Optional[ModelIdentifierField] = InputField( + default=None, + description="Standalone Qwen3-VL 4B encoder. Required when Model is a single file; otherwise an override " + "for the encoder bundled in the Diffusers model.", + input=Input.Direct, + # Base `any` excludes MiniMax H3's truncated Qwen3-VL-32B, which shares this model type. + ui_model_base=BaseModelType.Any, + ui_model_type=ModelType.Qwen3VLEncoder, + title="Qwen3-VL Encoder", + ) + + def invoke(self, context: InvocationContext) -> Flux3ModelLoaderOutput: + main_config = context.models.get_config(self.model) + if main_config.base is not BaseModelType.Flux3 or main_config.type is not ModelType.Main: + raise ValueError(f"Model '{main_config.name}' is not a FLUX.3 main model. Select a FLUX.3 transformer.") + is_diffusers = main_config.format is ModelFormat.Diffusers + + transformer = self.model.model_copy(update={"submodel_type": SubModelType.Transformer}) + + if self.vae_model is not None: + vae_config = context.models.get_config(self.vae_model) + if vae_config.type is not ModelType.VAE or not accepts_vae( + BaseModelType.Flux3, vae_config.base, getattr(vae_config, "latent_channels", None) + ): + accepted = " or ".join(base.value for base in accepted_vae_bases(BaseModelType.Flux3)) + raise ValueError( + f"VAE '{vae_config.name}' is not compatible with FLUX.3. Select a VAE of base {accepted}." + ) + vae = self.vae_model.model_copy(update={"submodel_type": SubModelType.VAE}) + elif is_diffusers: + vae = self.model.model_copy(update={"submodel_type": SubModelType.VAE}) + else: + raise ValueError( + f"'{main_config.name}' is a single-file FLUX.3 model and carries no VAE. Select the FLUX.2 VAE." + ) + + if self.qwen3_vl_encoder_model is not None: + encoder_config = context.models.get_config(self.qwen3_vl_encoder_model) + if encoder_config.type is not ModelType.Qwen3VLEncoder: + raise ValueError(f"Encoder '{encoder_config.name}' is not a Qwen3-VL encoder.") + raise_for_wrong_qwen3_vl_variant( + encoder_config.name, getattr(encoder_config, "variant", None), Qwen3VLVariantType.Qwen3VL_4B, "FLUX.3" + ) + tokenizer = self.qwen3_vl_encoder_model.model_copy(update={"submodel_type": SubModelType.Tokenizer}) + text_encoder = self.qwen3_vl_encoder_model.model_copy(update={"submodel_type": SubModelType.TextEncoder}) + elif is_diffusers: + tokenizer = self.model.model_copy(update={"submodel_type": SubModelType.Tokenizer}) + text_encoder = self.model.model_copy(update={"submodel_type": SubModelType.TextEncoder}) + else: + raise ValueError( + f"'{main_config.name}' is a single-file FLUX.3 model and carries no text encoder. Select the " + "Qwen3-VL 4B encoder." + ) + + return Flux3ModelLoaderOutput( + transformer=TransformerField(transformer=transformer, loras=[]), + qwen3_vl_encoder=Qwen3VLEncoderField(tokenizer=tokenizer, text_encoder=text_encoder, loras=[]), + vae=VAEField(vae=vae), + ) diff --git a/invokeai/app/invocations/krea2/krea2_model_loader.py b/invokeai/app/invocations/krea2/krea2_model_loader.py index d7f898e8a0d..48f70738d69 100644 --- a/invokeai/app/invocations/krea2/krea2_model_loader.py +++ b/invokeai/app/invocations/krea2/krea2_model_loader.py @@ -16,7 +16,7 @@ ) from invokeai.app.services.shared.invocation_context import InvocationContext from invokeai.backend.architectures import accepted_vae_bases, accepts_vae -from invokeai.backend.model_manager.qwen3_vl_labels import variant_label as _variant_label +from invokeai.backend.model_manager.qwen3_vl_labels import raise_for_wrong_qwen3_vl_variant from invokeai.backend.model_manager.taxonomy import ( BaseModelType, ModelFormat, @@ -111,15 +111,10 @@ def invoke(self, context: InvocationContext) -> Krea2ModelLoaderOutput: if encoder_config.type is not ModelType.Qwen3VLEncoder: raise ValueError(f"Encoder '{encoder_config.name}' is not a Qwen3-VL encoder compatible with Krea-2.") # Two Qwen3-VL encoders install under this type and they are not interchangeable: Krea-2 - # conditions on the 4B, Ideogram 4 on the 8B. Without this check the 8B loads (~10 GB) - # and then fails on a 4096-against-2560 shape error naming a tensor, which says nothing - # about what the user picked. - encoder_variant = getattr(encoder_config, "variant", None) - if encoder_variant is not Qwen3VLVariantType.Qwen3VL_4B: - raise ValueError( - f"'{encoder_config.name}' is the Qwen3-VL {_variant_label(encoder_variant)} encoder. " - "Krea-2 conditions on the 4B one (hidden size 2560)." - ) + # conditions on the 4B, Ideogram 4 on the 8B. + raise_for_wrong_qwen3_vl_variant( + encoder_config.name, getattr(encoder_config, "variant", None), Qwen3VLVariantType.Qwen3VL_4B, "Krea-2" + ) tokenizer = self.qwen3_vl_encoder_model.model_copy(update={"submodel_type": SubModelType.Tokenizer}) text_encoder = self.qwen3_vl_encoder_model.model_copy(update={"submodel_type": SubModelType.TextEncoder}) else: diff --git a/invokeai/app/invocations/metadata.py b/invokeai/app/invocations/metadata.py index ecf070d961e..7cab953f480 100644 --- a/invokeai/app/invocations/metadata.py +++ b/invokeai/app/invocations/metadata.py @@ -185,6 +185,10 @@ def invoke(self, context: InvocationContext) -> MetadataOutput: "qwen_image_2_1_img2img", "qwen_image_2_1_inpaint", "qwen_image_2_1_outpaint", + "flux3_txt2img", + "flux3_img2img", + "flux3_inpaint", + "flux3_outpaint", "wan_txt2img", "wan_img2img", "wan_inpaint", diff --git a/invokeai/app/invocations/primitives.py b/invokeai/app/invocations/primitives.py index 400b9962473..175ff5ee433 100644 --- a/invokeai/app/invocations/primitives.py +++ b/invokeai/app/invocations/primitives.py @@ -18,6 +18,7 @@ DenoiseMaskField, ErnieImageConditioningField, FieldDescriptions, + Flux3ConditioningField, FluxConditioningField, Ideogram4ConditioningField, ImageField, @@ -551,6 +552,17 @@ def build(cls, conditioning_name: str) -> "QwenImage21ConditioningOutput": return cls(conditioning=QwenImage21ConditioningField(conditioning_name=conditioning_name)) +@invocation_output("flux3_conditioning_output") +class Flux3ConditioningOutput(BaseInvocationOutput): + """Base class for nodes that output a FLUX.3 conditioning tensor.""" + + conditioning: Flux3ConditioningField = OutputField(description=FieldDescriptions.cond) + + @classmethod + def build(cls, conditioning_name: str) -> "Flux3ConditioningOutput": + return cls(conditioning=Flux3ConditioningField(conditioning_name=conditioning_name)) + + @invocation_output("anima_conditioning_output") class AnimaConditioningOutput(BaseInvocationOutput): """Base class for nodes that output an Anima text conditioning tensor.""" diff --git a/invokeai/app/invocations/text_encoder/flux3_text_encoder.py b/invokeai/app/invocations/text_encoder/flux3_text_encoder.py new file mode 100644 index 00000000000..b2a54b61687 --- /dev/null +++ b/invokeai/app/invocations/text_encoder/flux3_text_encoder.py @@ -0,0 +1,66 @@ +from contextlib import ExitStack + +import torch + +from invokeai.app.invocations.baseinvocation import BaseInvocation, Classification, invocation +from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, UIComponent +from invokeai.app.invocations.model import Qwen3VLEncoderField +from invokeai.app.invocations.primitives import Flux3ConditioningOutput +from invokeai.app.services.shared.invocation_context import InvocationContext +from invokeai.backend.flux3.text_encoding import encode_flux3_prompt +from invokeai.backend.model_manager.load.model_cache.utils import get_effective_device +from invokeai.backend.quantization.dequantizing_linear import peak_dequant_transient_bytes +from invokeai.backend.stable_diffusion.diffusion.conditioning_data import ConditioningFieldData, Flux3ConditioningInfo +from invokeai.backend.util.devices import TorchDevice + + +@invocation( + "flux3_text_encoder", + title="Prompt - FLUX.3", + tags=["prompt", "conditioning", "flux3", "flux"], + category="conditioning", + version="1.0.0", + classification=Classification.Prototype, + idle_gpu_offloadable=True, +) +class Flux3TextEncoderInvocation(BaseInvocation): + """Encodes a prompt for FLUX.3 with the Qwen3-VL 4B text encoder. + + Eight decoder layers are stacked per token. Write the prompt as a full description of the image; when + editing, describe the result and refer to reference images as , , ... in the + order they are connected. + """ + + prompt: str = InputField(description="Text prompt describing the desired image.", ui_component=UIComponent.Textarea) + qwen3_vl_encoder: Qwen3VLEncoderField = InputField( + title="Qwen3-VL Encoder", + description=FieldDescriptions.qwen3_vl_encoder, + input=Input.Connection, + ) + + @torch.no_grad() + def invoke(self, context: InvocationContext) -> Flux3ConditioningOutput: + tokenizer_info = context.models.load(self.qwen3_vl_encoder.tokenizer) + text_encoder_info = context.models.load(self.qwen3_vl_encoder.text_encoder) + # A GGUF or nvfp4 build dequantizes each packed Linear per forward, a transient its resident size does + # not cover. Read from the unlocked model, before the lock the reservation applies to; zero otherwise. + dequant_bytes = peak_dequant_transient_bytes( + text_encoder_info.model, TorchDevice.choose_bfloat16_safe_dtype(text_encoder_info.compute_device) + ) + + context.util.signal_progress("Running Qwen3-VL text encoder") + + with ExitStack() as exit_stack: + tokenizer = exit_stack.enter_context(tokenizer_info) + (_, text_encoder) = exit_stack.enter_context( + text_encoder_info.model_on_device(working_mem_bytes=dequant_bytes) + ) + prompt_embeds = encode_flux3_prompt( + self.prompt, tokenizer, text_encoder, get_effective_device(text_encoder) + ) + + conditioning_data = ConditioningFieldData( + conditionings=[Flux3ConditioningInfo(prompt_embeds=prompt_embeds.detach().to("cpu"))] + ) + conditioning_name = context.conditioning.save(conditioning_data) + return Flux3ConditioningOutput.build(conditioning_name) diff --git a/invokeai/app/services/model_records/model_records_base.py b/invokeai/app/services/model_records/model_records_base.py index ed454d9fc8f..6804b04d6b4 100644 --- a/invokeai/app/services/model_records/model_records_base.py +++ b/invokeai/app/services/model_records/model_records_base.py @@ -24,6 +24,7 @@ BaseModelType, ClipVariantType, Flux2VariantType, + Flux3VariantType, FluxVariantType, Krea2VariantType, LTX2VariantType, @@ -136,6 +137,7 @@ def validate_source_url(cls, v: Any) -> Optional[str]: | ClipVariantType | FluxVariantType | Flux2VariantType + | Flux3VariantType | ZImageVariantType | QwenImageVariantType | WanVariantType diff --git a/invokeai/backend/architectures/defs/flux3.py b/invokeai/backend/architectures/defs/flux3.py new file mode 100644 index 00000000000..44d344b1584 --- /dev/null +++ b/invokeai/backend/architectures/defs/flux3.py @@ -0,0 +1,57 @@ +"""What the flux3 architecture declares.""" + +from invokeai.backend.architectures.facets.conditioning import ConditioningFacet +from invokeai.backend.architectures.facets.default_settings import DefaultSettingsFacet +from invokeai.backend.architectures.facets.features import FeaturesFacet, NegativePrompt +from invokeai.backend.architectures.facets.latent_space import FLUX2_32, LatentSpaceFacet +from invokeai.backend.architectures.facets.modality import ModalityFacet +from invokeai.backend.architectures.facets.vae import VaeCompatibility, VaeFacet +from invokeai.backend.architectures.facets.variant import VariantFacet +from invokeai.backend.architectures.registry import register +from invokeai.backend.model_manager.configs.default_settings import MainModelDefaultSettings +from invokeai.backend.model_manager.taxonomy import BaseModelType, Flux3VariantType, ModelType +from invokeai.backend.stable_diffusion.diffusion.conditioning_data import Flux3ConditioningInfo + +# FLUX.3 Image decodes with the FLUX.2 autoencoder: the released VAE is byte-identical to the one FLUX.2 +# ships, so it shares that latent space. Its denoise node previews the same unpacked, BN-normalized x0 +# estimate FLUX.2's does. +register( + BaseModelType.Flux3, + LatentSpaceFacet(FLUX2_32), + ConditioningFacet(Flux3ConditioningInfo), + DefaultSettingsFacet( + { + # The reference sampler's settings for each checkpoint (BFL's flux-3-image-klein README and + # pipeline.py). No scheduler: there is none to choose, see `scheduler_set` below. + Flux3VariantType.KleinBase: MainModelDefaultSettings(steps=50, cfg_scale=3.5, width=1024, height=1024), + # Klein, the step-distilled flow map: 16 steps (it is trained for 4 to 16), no CFG. + None: MainModelDefaultSettings(steps=16, cfg_scale=1.0, width=1024, height=1024), + } + ), + ModalityFacet(frozenset({"txt2img", "img2img", "inpaint", "outpaint"}), metadata_slug="flux3"), + FeaturesFacet( + # Klein Base takes classifier-free guidance with a negative prompt; Klein (the flow map) takes neither, + # and `flux3_denoise` refuses a CFG scale above 1 for it. + negative_prompt=NegativePrompt(visible=True, usage="cfg-gated"), + dimension_grid=16, # equals `multiple_of` on flux3_denoise.width/height + guidance_label="CFG", + # FLUX.3 drives its own sampler: Euler on a fixed shifted schedule, and for Klein a flow-map step that + # also tells the transformer the timestep it jumps to. A different scheduler would step to sigmas the + # flow map was not told about, so there is no choice to offer. + scheduler_set=None, + max_reference_images=10, + ), + VaeFacet( + frozenset( + { + # The FLUX.2 VAE file is what FLUX.3 ships (`ae.safetensors`, and Comfy-Org's + # `vae/flux2-vae.safetensors`); it identifies as a FLUX.2 VAE, and no VAE config produces + # `flux3`. + VaeCompatibility(BaseModelType.Flux2), + } + ) + ), + # The values are flux3_klein / flux3_klein_base: variant strings are resolved without their base, and + # `klein_*` already belongs to FLUX.2. + VariantFacet({ModelType.Main: Flux3VariantType}), +) diff --git a/invokeai/backend/architectures/facets/latent_space.py b/invokeai/backend/architectures/facets/latent_space.py index fbe7c7e78fa..fc4908766cc 100644 --- a/invokeai/backend/architectures/facets/latent_space.py +++ b/invokeai/backend/architectures/facets/latent_space.py @@ -568,7 +568,7 @@ def preview(self, sample: torch.Tensor) -> Image.Image: rgb_factors=FLUX2_LATENT_RGB_FACTORS, rgb_bias=FLUX2_LATENT_RGB_BIAS, ) -"""AutoencoderKLFlux2: FLUX.2, ERNIE-Image and Ideogram 4.""" +"""AutoencoderKLFlux2: FLUX.2, FLUX.3, ERNIE-Image and Ideogram 4.""" MINIMAX_H3_24 = LatentSpace( channels=24, diff --git a/invokeai/backend/flux2/latent_norm.py b/invokeai/backend/flux2/latent_norm.py new file mode 100644 index 00000000000..f4ce62ab4b4 --- /dev/null +++ b/invokeai/backend/flux2/latent_norm.py @@ -0,0 +1,44 @@ +"""The FLUX.2 VAE's latent normalization, shared by every architecture that decodes with that VAE. + +The FLUX.2 autoencoder normalizes its 2x2-packed, 128-channel latents with a BatchNorm whose running +statistics ship in the checkpoint (``affine=False``, so there is no learned weight or bias). The +transformers that decode with it (FLUX.2, FLUX.3) denoise in the normalized space, while latents travel +between nodes un-normalized: a denoise node normalizes what it takes in and denormalizes what it returns. +""" + +import torch + +_DEFAULT_BN_EPS = 1e-4 # what BFL's autoencoder uses + + +def read_vae_bn_stats(vae: torch.nn.Module) -> tuple[torch.Tensor, torch.Tensor] | None: + """``(mean, std)`` of the VAE's latent BatchNorm, each of shape ``(128,)``, or None if it has none. + + The layer sits at a different attribute depending on the format the VAE was loaded from. + """ + vae.eval() # never update the running statistics + bn_layer = None + if hasattr(vae, "bn"): + bn_layer = vae.bn + elif hasattr(vae, "batch_norm"): + bn_layer = vae.batch_norm + elif hasattr(vae, "encoder") and hasattr(vae.encoder, "bn"): + bn_layer = vae.encoder.bn + + if bn_layer is None or bn_layer.running_mean is None or bn_layer.running_var is None: + return None + + bn_mean = bn_layer.running_mean.clone() + bn_var = bn_layer.running_var.clone() + bn_eps = bn_layer.eps if hasattr(bn_layer, "eps") else _DEFAULT_BN_EPS + return bn_mean, torch.sqrt(bn_var + bn_eps) + + +def bn_normalize(x: torch.Tensor, bn_mean: torch.Tensor, bn_std: torch.Tensor) -> torch.Tensor: + """``(x - mean) / std`` over the last (channel) axis of packed ``(B, seq, 128)`` latents.""" + return (x - bn_mean.to(x.device, x.dtype)) / bn_std.to(x.device, x.dtype) + + +def bn_denormalize(x: torch.Tensor, bn_mean: torch.Tensor, bn_std: torch.Tensor) -> torch.Tensor: + """``x * std + mean``, the inverse of :func:`bn_normalize`.""" + return x * bn_std.to(x.device, x.dtype) + bn_mean.to(x.device, x.dtype) diff --git a/invokeai/backend/flux2/ref_image_extension.py b/invokeai/backend/flux2/ref_image_extension.py index 9184b15c1d2..b95ec001548 100644 --- a/invokeai/backend/flux2/ref_image_extension.py +++ b/invokeai/backend/flux2/ref_image_extension.py @@ -9,6 +9,7 @@ """ import math +from typing import Literal import torch import torch.nn.functional as F @@ -19,9 +20,14 @@ from invokeai.app.invocations.fields import FluxKontextConditioningField from invokeai.app.invocations.model import VAEField from invokeai.app.services.shared.invocation_context import InvocationContext +from invokeai.backend.flux2.latent_norm import bn_normalize from invokeai.backend.flux2.sampling_utils import pack_flux2 +from invokeai.backend.model_manager.load.load_base import LoadedModel from invokeai.backend.util.devices import TorchDevice -from invokeai.backend.util.vae_working_memory import estimate_vae_working_memory_flux2 +from invokeai.backend.util.vae_working_memory import ( + estimate_vae_working_memory_flux2, + flux2_vae_attention_materializes, +) # Maximum pixel counts for reference images (matches BFL FLUX.2 sampling.py) # Single reference image: 2024² pixels, Multiple: 1024² pixels @@ -30,6 +36,11 @@ # Tile size (in pixels) forced on the VAE for reference-image encoding, see _prepare_ref_images(). REF_ENCODE_TILE_SIZE = 512 +# An untiled reference encode is taken only while its estimated peak stays within this share of the device's +# memory. The rest is for what the cache cannot evict for it: the VAE itself, models locked by the running +# graph, the CUDA context and allocator slack. A 1 MP reference (estimated 2.2 GB, measured 2.1 on an RTX 4090) +# stays untiled on an 8 GB card; a 4 MP one (8.6 GB, measured 8.3) is tiled there and untiled on a 24 GB card. +UNTILED_REF_ENCODE_MAX_VRAM_FRACTION = 0.5 def resize_image_to_max_pixels(image: Image.Image, max_pixels: int) -> Image.Image: @@ -62,6 +73,99 @@ def resize_image_to_max_pixels(image: Image.Image, max_pixels: int) -> Image.Ima return image.resize((new_width, new_height), Image.Resampling.LANCZOS) +def reference_encode_tile_size( + image_tensor: torch.Tensor, + vae: torch.nn.Module, + device: torch.device, + tiling: Literal["always", "if_attention_materializes"], +) -> int | None: + """The tile size a reference encode runs at, or None for an untiled encode. + + ``"if_attention_materializes"`` encodes untiled unless the mid-block attention would materialize its score + matrix (ROCm, MPS) or the untiled peak would not fit the device (see UNTILED_REF_ENCODE_MAX_VRAM_FRACTION). + """ + if tiling == "always" or flux2_vae_attention_materializes(image_tensor, vae, device): + return REF_ENCODE_TILE_SIZE + if device.type == "cuda": + total_memory = torch.cuda.get_device_properties(device).total_memory + elif device.type == "xpu": + total_memory = int(torch.xpu.get_device_properties(device).total_memory) + else: + return None # CPU encodes in system RAM. + untiled_estimate = estimate_vae_working_memory_flux2( + operation="encode", image_tensor=image_tensor, vae=vae, tile_size=None, device=device + ) + return None if untiled_estimate <= total_memory * UNTILED_REF_ENCODE_MAX_VRAM_FRACTION else REF_ENCODE_TILE_SIZE + + +def encode_reference_image( + vae_info: LoadedModel, + image: Image.Image, + tiling: Literal["always", "if_attention_materializes"] = "always", +) -> torch.Tensor: + """Encode one RGB reference image with the FLUX.2 VAE into unpacked ``(1, 32, H/8, W/8)`` latents. + + Shared by FLUX.2 and FLUX.3, which encode with the same autoencoder. The encode uses the latent + distribution's mode, so it is deterministic. + + A tiled encode is not the untiled one: each tile's mid-block attention sees only that tile, which moves + every token, not just the seams (measured on a 1024 px image: RMS error 0.21 against a token RMS of 0.97). + ``"if_attention_materializes"`` encodes untiled where SDPA runs the attention fused (CUDA), as the + reference pipelines do, and tiles where it would materialize the score matrix (ROCm, MPS) or where the + untiled peak would not fit the device (see `reference_encode_tile_size`). + """ + # Convert from [0, 1] to the [-1, 1] range the VAE expects, and add a batch dimension. + image_tensor = T.ToTensor()(image) * 2.0 - 1.0 + image_tensor = image_tensor.unsqueeze(0) + + device = TorchDevice.choose_torch_device() + tile_size = reference_encode_tile_size(image_tensor, vae_info.model, device, tiling) + + # A tiled encode peaks at one tile; tell the cache up front so it frees the room instead of hitting the + # shortfall as an OOM. + estimated_working_memory = estimate_vae_working_memory_flux2( + operation="encode", + image_tensor=image_tensor, + vae=vae_info.model, + tile_size=tile_size, + device=device, + ) + + with vae_info.model_on_device(working_mem_bytes=estimated_working_memory) as (_, vae): + vae_dtype = next(iter(vae.parameters())).dtype + image_tensor = image_tensor.to(device=device, dtype=vae_dtype) + + # Where SDPA materializes the encoder mid-block's attention matrix (ROCm, MPS), an untiled + # encode grows quadratically -- ~15GB at 1024px, hundreds of GB at the 2024px reference cap; + # on CUDA it stays linear but can still outgrow a small card (see reference_encode_tile_size). + # A tiled encode is bounded by one tile. The VAE's default tile size equals its sample_size + # (1024), which still OOMs per tile where the matrix materializes, so force a 512px tile. + # Save/restore the tiling config because this VAE is a shared, cached instance (e.g. + # the final image decode must not inherit these settings). + downsample = 2 ** (len(vae.config.block_out_channels) - 1) + prev_tiling = (vae.use_tiling, vae.tile_sample_min_size, vae.tile_latent_min_size) + vae.use_tiling = tile_size is not None + if tile_size is not None: + vae.tile_sample_min_size = tile_size + vae.tile_latent_min_size = tile_size // downsample + try: + latent_dist = vae.encode(image_tensor, return_dict=False)[0] + + # Use mode() for deterministic encoding (no sampling) + if hasattr(latent_dist, "mode"): + latents = latent_dist.mode() + elif hasattr(latent_dist, "sample"): + latents = latent_dist.sample() + else: + latents = latent_dist + finally: + vae.use_tiling, vae.tile_sample_min_size, vae.tile_latent_min_size = prev_tiling + + TorchDevice.empty_cache() + + return latents + + def generate_img_ids_flux2_with_offset( latent_height: int, latent_width: int, @@ -162,22 +266,6 @@ def __init__( # Pre-process and cache the reference image latents and ids upon initialization self.ref_image_latents, self.ref_image_ids = self._prepare_ref_images() - def _bn_normalize(self, x: torch.Tensor) -> torch.Tensor: - """Apply BN normalization to packed latents. - - BN formula (affine=False): y = (x - mean) / std - - Args: - x: Packed latents of shape (B, seq, 128). - - Returns: - Normalized latents of same shape. - """ - assert self._bn_mean is not None and self._bn_std is not None - bn_mean = self._bn_mean.to(x.device, x.dtype) - bn_std = self._bn_std.to(x.device, x.dtype) - return (x - bn_mean) / bn_std - def _prepare_ref_images(self) -> tuple[torch.Tensor, torch.Tensor]: """Encode reference images and prepare their concatenated latents and IDs with spatial tiling.""" all_latents = [] @@ -200,56 +288,7 @@ def _prepare_ref_images(self) -> tuple[torch.Tensor, torch.Tensor]: # Resize large images to max pixel count (matches BFL FLUX.2 sampling.py) image = resize_image_to_max_pixels(image, max_pixels) - # Convert to tensor using torchvision transforms - transformation = T.Compose([T.ToTensor()]) - image_tensor = transformation(image) - # Convert from [0, 1] to [-1, 1] range expected by VAE - image_tensor = image_tensor * 2.0 - 1.0 - image_tensor = image_tensor.unsqueeze(0) # Add batch dimension - - # Encode using FLUX.2 VAE. The encode below forces REF_ENCODE_TILE_SIZE tiling, so the - # peak is bounded by one tile; tell the cache that up front so it frees the room instead - # of hitting the shortfall as an OOM. - estimated_working_memory = estimate_vae_working_memory_flux2( - operation="encode", - image_tensor=image_tensor, - vae=vae_info.model, - tile_size=REF_ENCODE_TILE_SIZE, - device=TorchDevice.choose_torch_device(), - ) - - with vae_info.model_on_device(working_mem_bytes=estimated_working_memory) as (_, vae): - vae_dtype = next(iter(vae.parameters())).dtype - image_tensor = image_tensor.to(device=TorchDevice.choose_torch_device(), dtype=vae_dtype) - - # The FLUX.2 VAE encoder's mid-block self-attention scales quadratically with the - # input's spatial size (and on ROCm, SDPA falls back to a *materialized* attention - # matrix), so encoding a reference image at full size OOMs VRAM — ~15GB at 1024px, - # hundreds of GB at the 2024px reference cap. Tile the encode to bound peak memory - # regardless of reference resolution. The VAE's default tile size equals its - # sample_size (1024), which still OOMs per tile, so force a smaller 512px tile. - # Save/restore the tiling config because this VAE is a shared, cached instance (e.g. - # the final image decode must not inherit these settings). - downsample = 2 ** (len(vae.config.block_out_channels) - 1) - prev_tiling = (vae.use_tiling, vae.tile_sample_min_size, vae.tile_latent_min_size) - vae.use_tiling = True - vae.tile_sample_min_size = REF_ENCODE_TILE_SIZE - vae.tile_latent_min_size = REF_ENCODE_TILE_SIZE // downsample - try: - # FLUX.2 VAE uses diffusers API - latent_dist = vae.encode(image_tensor, return_dict=False)[0] - - # Use mode() for deterministic encoding (no sampling) - if hasattr(latent_dist, "mode"): - ref_image_latents_unpacked = latent_dist.mode() - elif hasattr(latent_dist, "sample"): - ref_image_latents_unpacked = latent_dist.sample() - else: - ref_image_latents_unpacked = latent_dist - finally: - vae.use_tiling, vae.tile_sample_min_size, vae.tile_latent_min_size = prev_tiling - - TorchDevice.empty_cache() + ref_image_latents_unpacked = encode_reference_image(vae_info, image) # Extract tensor dimensions (B, 32, H, W for FLUX.2) batch_size, _, latent_height, latent_width = ref_image_latents_unpacked.shape @@ -267,7 +306,7 @@ def _prepare_ref_images(self) -> tuple[torch.Tensor, torch.Tensor]: # Apply BN normalization to match the input latents scale # This is critical - the transformer expects normalized latents if self._bn_mean is not None and self._bn_std is not None: - ref_image_latents_packed = self._bn_normalize(ref_image_latents_packed) + ref_image_latents_packed = bn_normalize(ref_image_latents_packed, self._bn_mean, self._bn_std) # Determine spatial offsets for this reference image h_offset = 0 diff --git a/invokeai/backend/flux3/__init__.py b/invokeai/backend/flux3/__init__.py new file mode 100644 index 00000000000..47b75dc50c0 --- /dev/null +++ b/invokeai/backend/flux3/__init__.py @@ -0,0 +1,20 @@ +"""FLUX.3 Image (Klein and Klein Base). + +``transformer_flux3.py`` is vendored from huggingface/diffusers at commit +7ecb1e1b4fe500be7fb7381a7bb79a24d7fa3941 ("Flux3 image (#15046)"), which is not yet in any tagged diffusers +release. The only local change is rewriting the package-relative imports to absolute ``diffusers.*`` imports +(every referenced symbol exists in the pinned diffusers==0.41.0) and ruff import sorting. Keep it otherwise +byte-identical to upstream: when a diffusers release ships ``Flux3Transformer2DModel``, delete the vendored +file and import the class from diffusers here instead. Everything imports it from this package, so this is the +only import to change; ``tests/backend/flux3/test_vendored_transformer.py`` fails on that bump and lists the rest. + +The other modules of this package are first-party. Where they port the reference implementation +(github.com/black-forest-labs/flux-3-image-klein at 45e57c9fb06f9751cdced29a65c5d2171003be05, Apache-2.0), +the module says so. + +Apache-2.0, copyright Black Forest Labs and The HuggingFace Team (see the file header). +""" + +from invokeai.backend.flux3.transformer_flux3 import Flux3Transformer2DModel + +__all__ = ["Flux3Transformer2DModel"] diff --git a/invokeai/backend/flux3/conversion.py b/invokeai/backend/flux3/conversion.py new file mode 100644 index 00000000000..612fc44bcf5 --- /dev/null +++ b/invokeai/backend/flux3/conversion.py @@ -0,0 +1,165 @@ +"""Native FLUX.3 state dicts, converted to the vendored diffusers ``Flux3Transformer2DModel``. + +Every single-file FLUX.3 build InvokeAI loads uses Black Forest Labs' own key names: BFL's +``model.safetensors``, the ComfyUI repackage (byte-identical to it), and the GGUF conversions. The renames +are a port of diffusers' ``convert_flux3_transformer_checkpoint_to_diffusers`` (``single_file_utils.py`` at +the commit ``transformer_flux3.py`` is vendored from). Reading the structure from the weights, rather than +assuming the released one, is InvokeAI's: a finetune that changes the depth must not load as the first N +blocks of the released model. +""" + +import re +from collections.abc import Mapping +from typing import Any + +import torch + +from invokeai.backend.quantization.gguf.ggml_tensor import GGMLTensor + +FLUX3_NATIVE_FLOW_MAP_KEY = "ref_time_in.in_layer.weight" +"""Only the step-distilled checkpoint has it: the embedder of the timestep each step jumps to.""" + +# The rotary axes are the one structural parameter the weights do not record. Every released FLUX.3 +# checkpoint uses these, and they must add up to the attention head width the weights do record. +FLUX3_AXES_DIMS_ROPE = (32, 32, 32, 32) + +# Inner-module renames shared by the per-mode blocks and the joint single blocks. +_BLOCK_KEY_MAP = { + "q_proj.weight": "attn.to_q.weight", + "k_proj.weight": "attn.to_k.weight", + "v_proj.weight": "attn.to_v.weight", + "attn_out.weight": "attn.to_out.0.weight", + "norm.query_norm.scale": "attn.norm_q.weight", + "norm.key_norm.scale": "attn.norm_k.weight", + "mlp_in.weight": "ff.linear_in.weight", + "mlp_out.weight": "ff.linear_out.weight", +} + +_PREFIX_MAP = { + "emb_in.": "x_embedders.", + "txt_in.": "context_embedder.", + "content_mode_blocks.": "mode_blocks.", + "single_blocks.": "single_transformer_blocks.", +} + +_ADALN_KEY = "final_layer.image.adaLN_modulation.1.weight" + +_KEY_RENAMES = { + "time_in.in_layer.weight": "timestep_embedder.linear_1.weight", + "time_in.out_layer.weight": "timestep_embedder.linear_2.weight", + FLUX3_NATIVE_FLOW_MAP_KEY: "target_timestep_embedder.linear_1.weight", + "ref_time_in.out_layer.weight": "target_timestep_embedder.linear_2.weight", + "final_layer.image.linear.weight": "proj_out.weight", + _ADALN_KEY: "norm_out.linear.weight", +} + +# Training-only REPA projection heads; not part of the inference model. +_TRAINING_ONLY_PREFIX = "repa_projectors." + + +def _swap_shift_scale(weight: torch.Tensor) -> torch.Tensor: + """BFL's output adaLN produces [shift, scale]; ``Flux3AdaLayerNorm`` expects [scale, shift]. + + The halves are output rows, so a packed GGML tensor is unpacked first: a row swap inside quantized + blocks is not something a byte shuffle can express for every quantization type. + """ + if isinstance(weight, GGMLTensor): + weight = weight.get_dequantized_tensor() + shift, scale = weight.chunk(2, dim=0) + return torch.cat([scale, shift], dim=0) + + +def flux3_native_key_to_diffusers(key: str) -> str: + """The diffusers name of one native FLUX.3 parameter (identity for names it does not know).""" + if key in _KEY_RENAMES: + return _KEY_RENAMES[key] + new_key = key + for old_prefix, new_prefix in _PREFIX_MAP.items(): + if new_key.startswith(old_prefix): + new_key = new_prefix + new_key[len(old_prefix) :] + break + new_key = new_key.replace(".lin.weight", ".linear.weight") + for old_suffix, new_suffix in _BLOCK_KEY_MAP.items(): + if new_key.endswith(old_suffix): + return new_key[: -len(old_suffix)] + new_suffix + return new_key + + +def convert_flux3_native_to_diffusers(state_dict: dict[str, Any]) -> dict[str, Any]: + """Rename a native FLUX.3 transformer state dict to the vendored diffusers module, in place of the input. + + The input dict is emptied as it is converted, so the caller's reference does not keep a second copy of + every tensor alive. + """ + converted: dict[str, Any] = {} + for key in list(state_dict.keys()): + value = state_dict.pop(key) + if key.startswith(_TRAINING_ONLY_PREFIX): + continue + if key == _ADALN_KEY: + value = _swap_shift_scale(value) + converted[flux3_native_key_to_diffusers(key)] = value + return converted + + +def _shape(state_dict: Mapping[str, Any], key: str) -> tuple[int, ...]: + if key not in state_dict: + raise ValueError(f"The FLUX.3 checkpoint has no '{key}'; it is truncated or not a FLUX.3 transformer.") + # GGMLTensor.shape is the logical (unpacked) shape, which is the one needed here. + return tuple(state_dict[key].shape) + + +def _count_blocks(state_dict: Mapping[str, Any], prefix: str) -> int: + pattern = re.compile(rf"^{re.escape(prefix)}(\d+)\.") + indices = {int(m.group(1)) for key in state_dict if (m := pattern.match(key))} + if not indices: + raise ValueError(f"The FLUX.3 checkpoint has no '{prefix}N' blocks.") + if indices != set(range(len(indices))): + missing = sorted(set(range(max(indices) + 1)) - indices) + raise ValueError(f"The FLUX.3 checkpoint is missing '{prefix}' blocks {missing}; it is truncated.") + return len(indices) + + +def flux3_transformer_config(state_dict: Mapping[str, Any]) -> dict[str, Any]: + """The ``Flux3Transformer2DModel`` config of a native FLUX.3 state dict, read from its tensor shapes. + + Only shapes are read, so this works on meta tensors and on packed GGUF tensors alike. The feedforward + width is taken from ``mlp_in``'s output rows, which no supported quantization packs. + """ + hidden_size, in_channels = _shape(state_dict, "emb_in.image.weight") + cond_in_channels = _shape(state_dict, "emb_in.image_cond.weight")[1] + joint_attention_dim = _shape(state_dict, "txt_in.weight")[1] + timestep_channels = _shape(state_dict, "time_in.in_layer.weight")[1] + head_dim = _shape(state_dict, "single_blocks.0.norm.query_norm.scale")[0] + mlp_hidden = _shape(state_dict, "single_blocks.0.mlp_in.weight")[0] // 2 + + if hidden_size % head_dim != 0: + raise ValueError(f"FLUX.3 hidden size {hidden_size} is not a multiple of its head width {head_dim}.") + if sum(FLUX3_AXES_DIMS_ROPE) != head_dim: + raise ValueError( + f"FLUX.3 attention head width {head_dim} does not match the rotary axes {FLUX3_AXES_DIMS_ROPE} of every " + "released checkpoint; this checkpoint is not supported." + ) + + num_layers = _count_blocks(state_dict, "txt_mode_blocks.") + for mode in ("image", "image_cond"): + mode_layers = _count_blocks(state_dict, f"content_mode_blocks.{mode}.") + if mode_layers != num_layers: + raise ValueError( + f"The FLUX.3 checkpoint has {mode_layers} '{mode}' blocks but {num_layers} text blocks; the per-mode " + "stacks must have the same depth." + ) + + return { + "in_channels": in_channels, + "cond_in_channels": cond_in_channels, + "num_layers": num_layers, + "num_single_layers": _count_blocks(state_dict, "single_blocks."), + "attention_head_dim": head_dim, + "num_attention_heads": hidden_size // head_dim, + "joint_attention_dim": joint_attention_dim, + "timestep_channels": timestep_channels, + "mlp_ratio": mlp_hidden / hidden_size, + "axes_dims_rope": FLUX3_AXES_DIMS_ROPE, + "flow_map": FLUX3_NATIVE_FLOW_MAP_KEY in state_dict, + } diff --git a/invokeai/backend/flux3/denoise.py b/invokeai/backend/flux3/denoise.py new file mode 100644 index 00000000000..2b44642fb1f --- /dev/null +++ b/invokeai/backend/flux3/denoise.py @@ -0,0 +1,99 @@ +"""The FLUX.3 sampling loop. + +Euler on a fixed schedule, as in the reference implementation's ``denoise`` / ``denoise_flow_map`` +(``src/flux3/sampling.py``, Apache-2.0): + +- Klein Base takes classifier-free guidance, ``uncond + scale * (cond - uncond)``. The two predictions run + as separate forwards; the reference packs them into one sequence with per-sample attention, which gives + the same result. +- Klein is a flow map: each step also tells the transformer the timestep it jumps to, and it runs one + forward without guidance. + +The sample is kept in float32 across steps and cast to the compute dtype for each forward, as the reference +does. Reference-image tokens are context: they go into every forward and are never stepped. +""" + +from typing import Callable + +import torch +from tqdm import tqdm + +from invokeai.backend.rectified_flow.rectified_flow_inpaint_extension import RectifiedFlowInpaintExtension +from invokeai.backend.stable_diffusion.diffusers_pipeline import PipelineIntermediateState +from invokeai.backend.util.devices import TorchDevice + + +def denoise( + model: torch.nn.Module, + img: torch.Tensor, + img_ids: torch.Tensor, + txt: torch.Tensor, + txt_ids: torch.Tensor, + timesteps: list[float], + step_callback: Callable[[PipelineIntermediateState], None], + flow_map: bool, + compute_dtype: torch.dtype, + cfg_scale: float = 1.0, + neg_txt: torch.Tensor | None = None, + neg_txt_ids: torch.Tensor | None = None, + ref_tokens: torch.Tensor | None = None, + ref_ids: torch.Tensor | None = None, + inpaint_extension: RectifiedFlowInpaintExtension | None = None, +) -> torch.Tensor: + """Denoise packed, BN-normalized image tokens ``img`` of shape ``(B, S, 128)`` along ``timesteps``. + + Returns the denoised tokens in float32. + """ + use_cfg = cfg_scale > 1.0 + if use_cfg and flow_map: + raise ValueError("A flow-map FLUX.3 transformer samples without classifier-free guidance.") + if use_cfg and (neg_txt is None or neg_txt_ids is None): + raise ValueError("Classifier-free guidance needs a negative conditioning.") + + img = img.float() + batch_size = img.shape[0] + total_steps = len(timesteps) - 1 + + def predict(t_vec: torch.Tensor, target_vec: torch.Tensor | None, text: torch.Tensor, text_ids: torch.Tensor): + output = model( + hidden_states=img.to(compute_dtype), + encoder_hidden_states=text, + timestep=t_vec, + img_ids=img_ids, + txt_ids=text_ids, + image_cond_hidden_states=ref_tokens, + image_cond_ids=ref_ids, + target_timestep=target_vec, + return_dict=False, + ) + return output[0].float() + + for step_index in tqdm(range(total_steps), desc=f"Denoising{TorchDevice.get_session_device_label()}"): + t_curr, t_next = timesteps[step_index], timesteps[step_index + 1] + t_vec = torch.full((batch_size,), t_curr, device=img.device, dtype=compute_dtype) + target_vec = torch.full((batch_size,), t_next, device=img.device, dtype=compute_dtype) if flow_map else None + + pred = predict(t_vec, target_vec, txt, txt_ids) + if use_cfg: + assert neg_txt is not None and neg_txt_ids is not None + neg_pred = predict(t_vec, None, neg_txt, neg_txt_ids) + pred = neg_pred + cfg_scale * (pred - neg_pred) + + preview = img - t_curr * pred + img = img + (t_next - t_curr) * pred + + if inpaint_extension is not None: + img = inpaint_extension.merge_intermediate_latents_with_init_latents(img, t_next) + preview = inpaint_extension.merge_intermediate_latents_with_init_latents(preview, 0.0) + + step_callback( + PipelineIntermediateState( + step=step_index + 1, + order=1, + total_steps=total_steps, + timestep=int(t_curr * 1000), + latents=preview, + ) + ) + + return img diff --git a/invokeai/backend/flux3/ref_images.py b/invokeai/backend/flux3/ref_images.py new file mode 100644 index 00000000000..802411fd09c --- /dev/null +++ b/invokeai/backend/flux3/ref_images.py @@ -0,0 +1,84 @@ +"""FLUX.3 reference images: fitted to the token budget, VAE-encoded, normalized and packed. + +Unlike FLUX.2, a reference is VAE-encoded untiled wherever the encoder's attention runs fused, as both reference +pipelines encode it: tiling moves every token (see ``encode_reference_image``). + +The size budget follows the reference implementation (``src/flux3/pipeline.py``, Apache-2.0): a single +reference may have up to 4 MP, each of several up to 1 MP, and every side lies between 64 and 4096 px. The +reference reflect-pads a single reference to the 16 px grid and crops the output back afterwards; InvokeAI +sets the output size itself, so every reference is center-cropped to the grid instead, as diffusers does. + +References are clean conditioning content: they enter the transformer as a token stream of their own at +timestep 0, told apart from each other and from the generated image on the ``l`` position axis +(-1, -2, ...). +""" + +import math + +import torch +from PIL import Image, ImageOps + +from invokeai.backend.flux2.latent_norm import bn_normalize +from invokeai.backend.flux2.ref_image_extension import encode_reference_image +from invokeai.backend.flux2.sampling_utils import pack_flux2 +from invokeai.backend.flux3.sampling import image_position_ids +from invokeai.backend.model_manager.load.load_base import LoadedModel + +FLUX3_MAX_REFERENCE_IMAGES = 10 +SINGLE_REFERENCE_MAX_PIXELS = 4 * 1024 * 1024 +MULTI_REFERENCE_MAX_PIXELS = 1024 * 1024 +REFERENCE_MIN_SIDE = 64 +REFERENCE_MAX_SIDE = 4096 +_GRID = 16 # VAE downsampling (8) times the 2x2 packing + + +def fit_reference_image(image: Image.Image, num_references: int) -> Image.Image: + """``image`` as RGB, scaled into the size budget, center-cropped to a multiple of 16 px per side.""" + image = ImageOps.exif_transpose(image).convert("RGB") + width, height = image.size + if max(width, height) / min(width, height) > REFERENCE_MAX_SIDE / REFERENCE_MIN_SIDE: + raise ValueError( + f"A {width}x{height} reference is too elongated: FLUX.3 takes references with sides between " + f"{REFERENCE_MIN_SIDE} and {REFERENCE_MAX_SIDE} px, an aspect ratio of at most " + f"{REFERENCE_MAX_SIDE // REFERENCE_MIN_SIDE}:1." + ) + max_pixels = SINGLE_REFERENCE_MAX_PIXELS if num_references == 1 else MULTI_REFERENCE_MAX_PIXELS + scale = min(1.0, math.sqrt(max_pixels / (width * height)), REFERENCE_MAX_SIDE / max(width, height)) + # A tiny reference is scaled up instead: below 64 px a side has fewer than four tokens to carry it. + scale = max(scale, REFERENCE_MIN_SIDE / min(width, height)) + if scale != 1.0: + # Round up when scaling up, so a side scaled to the 64 px minimum cannot land on 63 and crop to 48. + to_int = math.ceil if scale > 1.0 else int + width, height = max(1, to_int(width * scale)), max(1, to_int(height * scale)) + image = image.resize((width, height), Image.Resampling.LANCZOS) + + crop_w, crop_h = width // _GRID * _GRID, height // _GRID * _GRID + if (crop_w, crop_h) != (width, height): + left, top = (width - crop_w) // 2, (height - crop_h) // 2 + image = image.crop((left, top, left + crop_w, top + crop_h)) + return image + + +def encode_flux3_references( + images: list[Image.Image], + vae_info: LoadedModel, + bn_mean: torch.Tensor, + bn_std: torch.Tensor, + device: torch.device, + dtype: torch.dtype, +) -> tuple[torch.Tensor, torch.Tensor]: + """The reference token stream and its position ids: ``(1, S, 128)`` in ``dtype`` and ``(S, 4)`` float32.""" + if len(images) > FLUX3_MAX_REFERENCE_IMAGES: + raise ValueError(f"FLUX.3 takes at most {FLUX3_MAX_REFERENCE_IMAGES} reference images, got {len(images)}.") + + tokens: list[torch.Tensor] = [] + ids: list[torch.Tensor] = [] + for index, image in enumerate(images): + fitted = fit_reference_image(image, len(images)) + latents = encode_reference_image(vae_info, fitted, tiling="if_attention_materializes").float() + packed = bn_normalize(pack_flux2(latents).to(device), bn_mean, bn_std) + tokens.append(packed.to(dtype)) + ids.append( + image_position_ids(fitted.height // _GRID, fitted.width // _GRID, l_coord=-(1 + index), device=device) + ) + return torch.cat(tokens, dim=1), torch.cat(ids, dim=0) diff --git a/invokeai/backend/flux3/sampling.py b/invokeai/backend/flux3/sampling.py new file mode 100644 index 00000000000..42744536374 --- /dev/null +++ b/invokeai/backend/flux3/sampling.py @@ -0,0 +1,104 @@ +"""FLUX.3 sampling: the timestep schedule, position ids and noise. + +The schedule, the rotary position layout and the noise draw follow the reference implementation +(github.com/black-forest-labs/flux-3-image-klein, ``src/flux3/sampling.py``, ``pipeline.py`` and +``autoencoder.py``, Apache-2.0). Latents use FLUX.2's contract, because FLUX.3 decodes with the FLUX.2 VAE: +between nodes they are unpacked ``(B, 32, H/8, W/8)``; the transformer sees them packed into 128-channel +tokens on a ``(H/16, W/16)`` grid by ``pack_flux2``. +""" + +import torch + +from invokeai.backend.flux2.sampling_utils import unpack_flux2 + +FLUX3_SCHEDULE_SHIFT = 6.93 +"""The constant timestep shift ("alpha") of the reference sampler, for both checkpoints and every resolution.""" + +FLUX3_IMAGE_ROPE_SCALE = 0.5 +"""The model was trained with the row and column position ids of image tokens scaled by this factor.""" + +FLUX3_PACKED_CHANNELS = 128 + + +def time_shift_flux3(sigmas: list[float], shift: float = FLUX3_SCHEDULE_SHIFT) -> list[float]: + """Apply the reference sampler's shift ``alpha * t / (1 + (alpha - 1) * t)`` to each sigma.""" + return [shift * t / (1.0 + (shift - 1.0) * t) for t in sigmas] + + +def unshift_flux3(sigmas: list[float], shift: float = FLUX3_SCHEDULE_SHIFT) -> list[float]: + """Invert :func:`time_shift_flux3`: ``t = s / (alpha - (alpha - 1) * s)``.""" + return [s / (shift - (shift - 1.0) * s) for s in sigmas] + + +def get_schedule_flux3(num_steps: int, shift: float = FLUX3_SCHEDULE_SHIFT) -> list[float]: + """The shifted schedule, descending from 1.0 to 0.0, with ``num_steps + 1`` entries.""" + if num_steps < 1: + raise ValueError(f"FLUX.3 needs at least one step, got {num_steps}.") + linear = [1.0 - i / num_steps for i in range(num_steps + 1)] + return time_shift_flux3(linear, shift) + + +def redensify_schedule_flux3( + timesteps: list[float], num_steps: int, shift: float = FLUX3_SCHEDULE_SHIFT +) -> list[float]: + """Re-space a clipped schedule so that it still takes ``num_steps`` steps. + + Clipping a schedule to an img2img window keeps only the sigmas inside it. The shift pushes sigmas + towards 1, so a low-strength window keeps very few: at 16 steps and a window starting at sigma 0.5, + only five survive, and the last has to cover 0.13 -> 0 in one jump. The window is resampled in unshifted + time and shifted back, so it follows the same curve as the full schedule, sampled more finely. The + endpoints are kept exactly: the first is the sigma the start latents are blended at, the last is the end + of the requested range. A window that already holds ``num_steps`` steps is returned unchanged. + """ + if num_steps < 1 or len(timesteps) < 2 or len(timesteps) - 1 >= num_steps: + return timesteps + + start, end = unshift_flux3([timesteps[0], timesteps[-1]], shift) + if start <= end: + return timesteps + + respaced = time_shift_flux3([start + (end - start) * (i / num_steps) for i in range(num_steps + 1)], shift) + respaced[0] = timesteps[0] + respaced[-1] = timesteps[-1] + return respaced + + +def image_position_ids( + packed_height: int, packed_width: int, l_coord: int, device: torch.device | None = None +) -> torch.Tensor: + """``(t, h, w, l)`` ids of a ``packed_height x packed_width`` token grid, shape ``(h * w, 4)``, float32. + + ``t`` is 0, the row and column carry the image RoPE scale, and ``l`` tells the generated image (0) and the + reference images (-1, -2, ...) apart. + """ + rows = torch.arange(packed_height, device=device, dtype=torch.float32) + cols = torch.arange(packed_width, device=device, dtype=torch.float32) + grid_h, grid_w = torch.meshgrid(rows, cols, indexing="ij") + ids = torch.zeros(packed_height, packed_width, 4, device=device, dtype=torch.float32) + ids[..., 1] = grid_h * FLUX3_IMAGE_ROPE_SCALE + ids[..., 2] = grid_w * FLUX3_IMAGE_ROPE_SCALE + ids[..., 3] = float(l_coord) + return ids.reshape(packed_height * packed_width, 4) + + +def text_position_ids(seq_len: int, device: torch.device | None = None) -> torch.Tensor: + """``(0, 0, 0, i)`` for each text token, shape ``(seq_len, 4)``, float32: text advances along ``l``.""" + ids = torch.zeros(seq_len, 4, device=device, dtype=torch.float32) + ids[:, 3] = torch.arange(seq_len, device=device, dtype=torch.float32) + return ids + + +def get_noise_flux3(height: int, width: int, seed: int) -> torch.Tensor: + """Unpacked ``(1, 32, H/8, W/8)`` float32 noise, drawn the way the reference implementation draws it. + + The reference draws image tokens ``(h * w, 128)`` from a seeded CPU generator in float32 and rounds them + to bf16, so this reproduces its sample for the same seed. Unpacking is a pure rearrange: packing the + result gives back exactly those tokens. + """ + if height % 16 or width % 16: + raise ValueError(f"FLUX.3 width and height must be multiples of 16, got {width}x{height}.") + packed_h, packed_w = height // 16, width // 16 + generator = torch.Generator(device="cpu").manual_seed(seed) + tokens = torch.randn((packed_h * packed_w, FLUX3_PACKED_CHANNELS), generator=generator, dtype=torch.float32) + tokens = tokens.to(torch.bfloat16).float() + return unpack_flux2(tokens.unsqueeze(0), height, width) diff --git a/invokeai/backend/flux3/text_encoding.py b/invokeai/backend/flux3/text_encoding.py new file mode 100644 index 00000000000..c36176ed61d --- /dev/null +++ b/invokeai/backend/flux3/text_encoding.py @@ -0,0 +1,85 @@ +"""FLUX.3 prompt encoding with the Qwen3-VL 4B text encoder. + +A port of diffusers' ``Flux3TextEncoderStep._get_qwen3_vl_prompt_embeds`` (``modular_pipelines/flux3/ +encoders.py`` at the commit ``transformer_flux3.py`` is vendored from), which matches the reference +implementation's ``TextEncoder.encode``. Small deviations here degrade images without failing, so each rule +below is load-bearing: + +- The prompt goes through the chat template as a single user turn, with the generation prompt appended. +- The token window is right-padded to a multiple of 80, capped at 8192. FLUX.3 attends to the padding + tokens, so the window size is part of the model recipe. +- The padding tokens' position ids are 1 (as in the training environment), not what the current + transformers release would derive for them; real tokens count up from 0. +- The attention mask is passed explicitly next to the position ids. Without it, transformers 5.10 reads the + non-monotonic positions as packed sequences and masks the padding into segments of its own. +- Hidden states 4, 8, ..., 32 (index 0 is the embedding output; all are taken before the final norm) are + stacked per token into a ``(L, 8 * 2560)`` sequence. +""" + +import math + +import torch +from transformers import PreTrainedModel, PreTrainedTokenizerBase + +FLUX3_TEXT_ENCODER_LAYERS = (4, 8, 12, 16, 20, 24, 28, 32) +FLUX3_TEXT_PAD_MULTIPLE = 80 +FLUX3_MAX_TEXT_TOKENS = 8192 +_PADDING_POSITION_ID = 1 + + +def flux3_prompt_text(tokenizer: PreTrainedTokenizerBase, prompt: str) -> str: + """The prompt in the chat template FLUX.3 was trained with.""" + return tokenizer.apply_chat_template( + [{"role": "user", "content": prompt}], tokenize=False, add_generation_prompt=True + ) + + +def tokenize_flux3_prompt( + tokenizer: PreTrainedTokenizerBase, prompt: str, max_tokens: int = FLUX3_MAX_TEXT_TOKENS +) -> tuple[torch.Tensor, torch.Tensor, torch.Tensor]: + """``(input_ids, attention_mask, position_ids)``, each ``(1, L)``, with ``L`` padded to a multiple of 80. + + The padding side is passed per call: the tokenizer is a shared, cached instance. + """ + text = flux3_prompt_text(tokenizer, prompt) + real_length = tokenizer(text, return_tensors="pt", truncation=True, max_length=max_tokens)["input_ids"].shape[1] + padded_length = min(math.ceil(real_length / FLUX3_TEXT_PAD_MULTIPLE) * FLUX3_TEXT_PAD_MULTIPLE, max_tokens) + inputs = tokenizer( + text, + return_tensors="pt", + padding="max_length", + padding_side="right", + truncation=True, + max_length=padded_length, + ) + input_ids, attention_mask = inputs["input_ids"], inputs["attention_mask"] + position_ids = torch.arange(padded_length)[None].masked_fill(attention_mask == 0, _PADDING_POSITION_ID) + return input_ids, attention_mask, position_ids + + +@torch.no_grad() +def encode_flux3_prompt( + prompt: str, + tokenizer: PreTrainedTokenizerBase, + text_encoder: PreTrainedModel, + device: torch.device, + max_tokens: int = FLUX3_MAX_TEXT_TOKENS, +) -> torch.Tensor: + """The FLUX.3 conditioning of ``prompt``: stacked Qwen3-VL hidden states, ``(1, L, 8 * hidden)``.""" + input_ids, attention_mask, position_ids = tokenize_flux3_prompt(tokenizer, prompt, max_tokens) + output = text_encoder( + input_ids=input_ids.to(device), + attention_mask=attention_mask.to(device), + position_ids=position_ids.to(device), + output_hidden_states=True, + use_cache=False, + ) + hidden_states = output.hidden_states + if len(hidden_states) <= max(FLUX3_TEXT_ENCODER_LAYERS): + raise ValueError( + f"The text encoder returned {len(hidden_states) - 1} layers; FLUX.3 reads layer " + f"{max(FLUX3_TEXT_ENCODER_LAYERS)}. Select the Qwen3-VL 4B encoder." + ) + stacked = torch.stack([hidden_states[k] for k in FLUX3_TEXT_ENCODER_LAYERS], dim=1) + batch_size, num_layers, seq_len, hidden_dim = stacked.shape + return stacked.permute(0, 2, 1, 3).reshape(batch_size, seq_len, num_layers * hidden_dim) diff --git a/invokeai/backend/flux3/transformer_flux3.py b/invokeai/backend/flux3/transformer_flux3.py new file mode 100644 index 00000000000..5e7b3049553 --- /dev/null +++ b/invokeai/backend/flux3/transformer_flux3.py @@ -0,0 +1,654 @@ +# Copyright 2026 Black Forest Labs and The HuggingFace Team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Any + +import torch +import torch.nn as nn +import torch.nn.functional as F +from diffusers.configuration_utils import ConfigMixin, register_to_config +from diffusers.loaders import FromOriginalModelMixin, PeftAdapterMixin +from diffusers.models.attention import AttentionMixin, AttentionModuleMixin +from diffusers.models.attention_dispatch import dispatch_attention_fn +from diffusers.models.embeddings import TimestepEmbedding, Timesteps, apply_rotary_emb, get_1d_rotary_pos_embed +from diffusers.models.modeling_outputs import Transformer2DModelOutput +from diffusers.models.modeling_utils import ModelMixin +from diffusers.utils import apply_lora_scale, logging +from diffusers.utils.torch_utils import maybe_adjust_dtype_for_device + +logger = logging.get_logger(__name__) # pylint: disable=invalid-name + + +# Copied from diffusers.models.transformers.transformer_flux2.Flux2SwiGLU with Flux2->Flux3 +class Flux3SwiGLU(nn.Module): + """ + Flux 2 uses a SwiGLU-style activation in the transformer feedforward sub-blocks, but with the linear projection + layer fused into the first linear layer of the FF sub-block. Thus, this module has no trainable parameters. + """ + + def __init__(self): + super().__init__() + self.gate_fn = nn.SiLU() + + def forward(self, x: torch.Tensor) -> torch.Tensor: + half = x.shape[-1] // 2 + x = self.gate_fn(x[..., :half]) * x[..., half:] + return x + + +# Copied from diffusers.models.transformers.transformer_flux2.Flux2FeedForward with Flux2->Flux3 +class Flux3FeedForward(nn.Module): + def __init__( + self, + dim: int, + dim_out: int | None = None, + mult: float = 3.0, + inner_dim: int | None = None, + bias: bool = False, + ): + super().__init__() + if inner_dim is None: + inner_dim = int(dim * mult) + dim_out = dim_out or dim + + # Flux3SwiGLU will reduce the dimension by half + self.linear_in = nn.Linear(dim, inner_dim * 2, bias=bias) + self.act_fn = Flux3SwiGLU() + self.linear_out = nn.Linear(inner_dim, dim_out, bias=bias) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + x = self.linear_in(x) + x = self.act_fn(x) + x = self.linear_out(x) + return x + + +class Flux3Modulation(nn.Module): + """Produces one set of per-token shift/scale/gate modulation parameters from a pre-activated per-token + conditioning embedding of shape `(batch_size, seq_len, dim)`. The per-mode and the joint heads of a token mode + share one activated embedding (activated once by the caller), so this module only holds the projection.""" + + def __init__(self, dim: int, bias: bool = False): + super().__init__() + self.linear = nn.Linear(dim, dim * 3, bias=bias) + + def forward(self, temb: torch.Tensor) -> torch.Tensor: + return self.linear(temb) + + +def _get_projections(attn: "Flux3Attention", hidden_states: torch.Tensor): + return attn.to_q(hidden_states), attn.to_k(hidden_states), attn.to_v(hidden_states) + + +def _get_fused_projections(attn: "Flux3Attention", hidden_states: torch.Tensor): + return attn.to_qkv(hidden_states).chunk(3, dim=-1) + + +def _get_qkv_projections(attn: "Flux3Attention", hidden_states: torch.Tensor): + if attn.fused_projections: + return _get_fused_projections(attn, hidden_states) + return _get_projections(attn, hidden_states) + + +class Flux3AttnProcessor: + _attention_backend = None + _parallel_config = None + + def __call__( + self, + attn: "Flux3Attention", + hidden_states: torch.Tensor, + attention_mask: torch.Tensor | None = None, + image_rotary_emb: tuple[torch.Tensor, torch.Tensor] | None = None, + ) -> torch.Tensor: + query, key, value = _get_qkv_projections(attn, hidden_states) + + query = query.unflatten(-1, (attn.heads, -1)) + key = key.unflatten(-1, (attn.heads, -1)) + value = value.unflatten(-1, (attn.heads, -1)) + + query = attn.norm_q(query.float()) + key = attn.norm_k(key.float()) + + if image_rotary_emb is not None: + query = apply_rotary_emb(query, image_rotary_emb, sequence_dim=1) + key = apply_rotary_emb(key, image_rotary_emb, sequence_dim=1) + query, key = query.to(value.dtype), key.to(value.dtype) + + hidden_states = dispatch_attention_fn( + query, + key, + value, + attn_mask=attention_mask, + backend=self._attention_backend, + parallel_config=self._parallel_config, + ) + hidden_states = hidden_states.flatten(2, 3) + hidden_states = hidden_states.to(query.dtype) + + hidden_states = attn.to_out[0](hidden_states) + hidden_states = attn.to_out[1](hidden_states) + + return hidden_states + + +class Flux3Attention(torch.nn.Module, AttentionModuleMixin): + _default_processor_cls = Flux3AttnProcessor + _available_processors = [Flux3AttnProcessor] + + def __init__( + self, + query_dim: int, + heads: int = 8, + dim_head: int = 64, + dropout: float = 0.0, + eps: float = 1e-6, + processor=None, + ): + super().__init__() + + self.head_dim = dim_head + self.inner_dim = dim_head * heads + self.query_dim = query_dim + self.heads = heads + self.dropout = dropout + self.use_bias = False + + self.to_q = torch.nn.Linear(query_dim, self.inner_dim, bias=False) + self.to_k = torch.nn.Linear(query_dim, self.inner_dim, bias=False) + self.to_v = torch.nn.Linear(query_dim, self.inner_dim, bias=False) + + self.norm_q = torch.nn.RMSNorm(dim_head, eps=eps, elementwise_affine=True) + self.norm_k = torch.nn.RMSNorm(dim_head, eps=eps, elementwise_affine=True) + + self.to_out = torch.nn.ModuleList([]) + self.to_out.append(torch.nn.Linear(self.inner_dim, query_dim, bias=False)) + self.to_out.append(torch.nn.Dropout(dropout)) + + if processor is None: + processor = self._default_processor_cls() + self.set_processor(processor) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: torch.Tensor | None = None, + image_rotary_emb: tuple[torch.Tensor, torch.Tensor] | None = None, + ) -> torch.Tensor: + return self.processor(self, hidden_states, attention_mask, image_rotary_emb) + + +class Flux3ModeTransformerBlock(nn.Module): + """ + Per-mode transformer block: parallel attention + feedforward computed from the same modulated input, with + self-attention restricted to a single token mode (the image, the reference images, or the text context). + """ + + def __init__( + self, + dim: int, + num_attention_heads: int, + attention_head_dim: int, + mlp_ratio: float = 3.0, + eps: float = 1e-6, + ): + super().__init__() + + self.norm = nn.LayerNorm(dim, elementwise_affine=False, eps=eps) + self.attn = Flux3Attention( + query_dim=dim, + heads=num_attention_heads, + dim_head=attention_head_dim, + eps=eps, + ) + self.ff = Flux3FeedForward(dim=dim, dim_out=dim, mult=mlp_ratio) + + def forward( + self, + hidden_states: torch.Tensor, + temb_mod: torch.Tensor, + image_rotary_emb: tuple[torch.Tensor, torch.Tensor], + ) -> torch.Tensor: + # modulation is split here rather than in Flux3Modulation, to avoid passing tuples into checkpoints https://github.com/huggingface/diffusers/issues/12776 + mod_shift, mod_scale, mod_gate = torch.chunk(temb_mod, 3, dim=-1) + + norm_hidden_states = self.norm(hidden_states) + norm_hidden_states = (1 + mod_scale) * norm_hidden_states + mod_shift + + attn_output = self.attn(hidden_states=norm_hidden_states, image_rotary_emb=image_rotary_emb) + ff_output = self.ff(norm_hidden_states) + + return hidden_states + mod_gate * (attn_output + ff_output) + + +class Flux3SingleTransformerBlock(nn.Module): + """ + Joint transformer block: text and content tokens are concatenated into a single sequence for parallel attention + + feedforward, with separate per-token modulation for the text and content tokens. + """ + + def __init__( + self, + dim: int, + num_attention_heads: int, + attention_head_dim: int, + mlp_ratio: float = 3.0, + eps: float = 1e-6, + ): + super().__init__() + + self.norm = nn.LayerNorm(dim, elementwise_affine=False, eps=eps) + self.attn = Flux3Attention( + query_dim=dim, + heads=num_attention_heads, + dim_head=attention_head_dim, + eps=eps, + ) + self.ff = Flux3FeedForward(dim=dim, dim_out=dim, mult=mlp_ratio) + + def forward( + self, + hidden_states: torch.Tensor, + encoder_hidden_states: torch.Tensor, + temb_mod: torch.Tensor, + temb_mod_context: torch.Tensor, + image_rotary_emb: tuple[torch.Tensor, torch.Tensor], + ) -> tuple[torch.Tensor, torch.Tensor]: + # modulation is split here rather than in Flux3Modulation, to avoid passing tuples into checkpoints https://github.com/huggingface/diffusers/issues/12776 + mod_shift, mod_scale, mod_gate = torch.chunk(temb_mod, 3, dim=-1) + c_mod_shift, c_mod_scale, c_mod_gate = torch.chunk(temb_mod_context, 3, dim=-1) + + norm_hidden_states = self.norm(hidden_states) + norm_hidden_states = (1 + mod_scale) * norm_hidden_states + mod_shift + + norm_encoder_hidden_states = self.norm(encoder_hidden_states) + norm_encoder_hidden_states = (1 + c_mod_scale) * norm_encoder_hidden_states + c_mod_shift + + combined = torch.cat([norm_encoder_hidden_states, norm_hidden_states], dim=1) + + attn_output = self.attn(hidden_states=combined, image_rotary_emb=image_rotary_emb) + ff_output = self.ff(combined) + output = attn_output + ff_output + + context_output, content_output = torch.split( + output, [encoder_hidden_states.shape[1], hidden_states.shape[1]], dim=1 + ) + encoder_hidden_states = encoder_hidden_states + c_mod_gate * context_output + hidden_states = hidden_states + mod_gate * content_output + + return encoder_hidden_states, hidden_states + + +# Copied from diffusers.models.transformers.transformer_flux2.Flux2PosEmbed with Flux2->Flux3 +class Flux3PosEmbed(nn.Module): + # modified from https://github.com/black-forest-labs/flux/blob/c00d7c60b085fce8058b9df845e036090873f2ce/src/flux/modules/layers.py#L11 + def __init__(self, theta: int, axes_dim: list[int]): + super().__init__() + self.theta = theta + self.axes_dim = axes_dim + + def forward(self, ids: torch.Tensor) -> torch.Tensor: + # Expected ids shape: [S, len(self.axes_dim)] + cos_out = [] + sin_out = [] + pos = ids.float() + freqs_dtype = maybe_adjust_dtype_for_device(torch.float64, ids.device) + # Unlike Flux 1, loop over len(self.axes_dim) rather than ids.shape[-1] + for i in range(len(self.axes_dim)): + cos, sin = get_1d_rotary_pos_embed( + self.axes_dim[i], + pos[..., i], + theta=self.theta, + repeat_interleave_real=True, + use_real=True, + freqs_dtype=freqs_dtype, + ) + cos_out.append(cos) + sin_out.append(sin) + freqs_cos = torch.cat(cos_out, dim=-1).to(ids.device) + freqs_sin = torch.cat(sin_out, dim=-1).to(ids.device) + return freqs_cos, freqs_sin + + +class Flux3AdaLayerNorm(nn.Module): + """Output adaptive layer norm conditioned on a per-token embedding of shape `(batch_size, seq_len, dim)`.""" + + def __init__(self, dim: int, eps: float = 1e-6, bias: bool = False): + super().__init__() + self.act_fn = nn.SiLU() + self.linear = nn.Linear(dim, dim * 2, bias=bias) + self.norm = nn.LayerNorm(dim, elementwise_affine=False, eps=eps) + + def forward(self, hidden_states: torch.Tensor, temb: torch.Tensor) -> torch.Tensor: + emb = self.linear(self.act_fn(temb)) + scale, shift = torch.chunk(emb, 2, dim=-1) + return self.norm(hidden_states) * (1 + scale) + shift + + +class Flux3Transformer2DModel(ModelMixin, ConfigMixin, PeftAdapterMixin, FromOriginalModelMixin, AttentionMixin): + """ + The Transformer model introduced in FLUX.3 for text-to-image and image-to-image generation. + + Three token modes share one joint sequence: the noisy image tokens (`hidden_states`), the optional VAE-encoded + reference image tokens (`image_cond_hidden_states`) and the text context (`encoder_hidden_states`). Each mode first + passes through its own per-mode transformer blocks (`mode_blocks` for the image modes, `txt_mode_blocks` for the + text context), then the text context and the active image modes are concatenated for the joint single blocks, and + only the image tokens pass through the output layers. The modulation is per mode: the image tokens are modulated by + the flow timestep, the reference image tokens and the text context by timestep `0`. A flow-map checkpoint + (`flow_map=True`, the step-distilled models) additionally embeds the timestep each denoising step jumps to and adds + it to every mode's modulation. + + Args: + in_channels (`int`, defaults to `128`): + Channel width of the image tokens (the packed VAE latents, `latent_channels * 4`). + cond_in_channels (`int`, defaults to `128`): + Channel width of the reference image tokens. + num_layers (`int`, defaults to `5`): + The number of per-mode transformer blocks. + num_single_layers (`int`, defaults to `28`): + The number of joint single transformer blocks. + attention_head_dim (`int`, defaults to `128`): + The number of dimensions to use for each attention head. + num_attention_heads (`int`, defaults to `24`): + The number of attention heads to use. + joint_attention_dim (`int`, defaults to `20480`): + The embedding/channel dimension of `encoder_hidden_states` (stacked Qwen3-VL hidden states). + timestep_channels (`int`, defaults to `256`): + The number of channels of the sinusoidal timestep embedding. + mlp_ratio (`float`, defaults to `3.0`): + The expansion ratio of the feedforward sub-blocks. + axes_dims_rope (`tuple[int]`, defaults to `(32, 32, 32, 32)`): + The dimensions to use for the rotary positional embeddings, per `(t, h, w, l)` position axis. + rope_theta (`int`, defaults to `10000`): + The base frequency of the rotary positional embeddings. + eps (`float`, defaults to `1e-6`): + The epsilon of the layer norms and the QK norms. + flow_map (`bool`, defaults to `False`): + Whether the model is a flow map (step-distilled): adds the `target_timestep_embedder` and requires + `target_timestep` in the forward pass. + """ + + _supports_gradient_checkpointing = True + _no_split_modules = ["Flux3ModeTransformerBlock", "Flux3SingleTransformerBlock"] + # QK norm and RoPE run in fp32 with a single cast back, matching the BFL implementation + _keep_in_fp32_modules = ["norm_q", "norm_k"] + _skip_layerwise_casting_patterns = ["pos_embed", "norm"] + _repeated_blocks = ["Flux3ModeTransformerBlock", "Flux3SingleTransformerBlock"] + + @register_to_config + def __init__( + self, + in_channels: int = 128, + cond_in_channels: int = 128, + num_layers: int = 5, + num_single_layers: int = 28, + attention_head_dim: int = 128, + num_attention_heads: int = 24, + joint_attention_dim: int = 20480, + timestep_channels: int = 256, + mlp_ratio: float = 3.0, + axes_dims_rope: tuple[int, ...] = (32, 32, 32, 32), + rope_theta: int = 10000, + eps: float = 1e-6, + flow_map: bool = False, + ): + super().__init__() + + self.inner_dim = num_attention_heads * attention_head_dim + in_channels_per_mode = {"image": in_channels, "image_cond": cond_in_channels} + modes = list(in_channels_per_mode.keys()) + + # 1. Sinusoidal positional embedding for RoPE on all token modes + self.pos_embed = Flux3PosEmbed(theta=rope_theta, axes_dim=list(axes_dims_rope)) + + # 2. Per-token timestep embedding + self.time_proj = Timesteps(num_channels=timestep_channels, flip_sin_to_cos=True, downscale_freq_shift=0) + self.timestep_embedder = TimestepEmbedding( + in_channels=timestep_channels, time_embed_dim=self.inner_dim, sample_proj_bias=False + ) + # flow map (step-distilled checkpoints): a second embedder for the timestep each step jumps to + self.target_timestep_embedder = ( + TimestepEmbedding(in_channels=timestep_channels, time_embed_dim=self.inner_dim, sample_proj_bias=False) + if flow_map + else None + ) + + # 3. Modulation: one head per mode (+ text) for the per-mode blocks and for the joint blocks + self.early_stream_modulations = nn.ModuleDict( + {name: Flux3Modulation(self.inner_dim, bias=False) for name in [*modes, "txt"]} + ) + self.single_stream_modulations = nn.ModuleDict( + {name: Flux3Modulation(self.inner_dim, bias=False) for name in [*modes, "txt"]} + ) + + # 4. Input projections + self.x_embedders = nn.ModuleDict( + {name: nn.Linear(channels, self.inner_dim, bias=False) for name, channels in in_channels_per_mode.items()} + ) + self.context_embedder = nn.Linear(joint_attention_dim, self.inner_dim, bias=False) + + # 5. Per-mode transformer blocks + self.mode_blocks = nn.ModuleDict( + { + name: nn.ModuleList( + [ + Flux3ModeTransformerBlock( + dim=self.inner_dim, + num_attention_heads=num_attention_heads, + attention_head_dim=attention_head_dim, + mlp_ratio=mlp_ratio, + eps=eps, + ) + for _ in range(num_layers) + ] + ) + for name in modes + } + ) + self.txt_mode_blocks = nn.ModuleList( + [ + Flux3ModeTransformerBlock( + dim=self.inner_dim, + num_attention_heads=num_attention_heads, + attention_head_dim=attention_head_dim, + mlp_ratio=mlp_ratio, + eps=eps, + ) + for _ in range(num_layers) + ] + ) + + # 6. Joint single transformer blocks + self.single_transformer_blocks = nn.ModuleList( + [ + Flux3SingleTransformerBlock( + dim=self.inner_dim, + num_attention_heads=num_attention_heads, + attention_head_dim=attention_head_dim, + mlp_ratio=mlp_ratio, + eps=eps, + ) + for _ in range(num_single_layers) + ] + ) + + # 7. Output layers (image tokens only) + self.norm_out = Flux3AdaLayerNorm(self.inner_dim, eps=eps) + self.proj_out = nn.Linear(self.inner_dim, in_channels, bias=False) + + self.gradient_checkpointing = False + + @apply_lora_scale("attention_kwargs") + def forward( + self, + hidden_states: torch.Tensor, + encoder_hidden_states: torch.Tensor, + timestep: torch.Tensor, + img_ids: torch.Tensor, + txt_ids: torch.Tensor, + image_cond_hidden_states: torch.Tensor | None = None, + image_cond_ids: torch.Tensor | None = None, + target_timestep: torch.Tensor | None = None, + attention_kwargs: dict[str, Any] | None = None, + return_dict: bool = True, + ) -> Transformer2DModelOutput | tuple[torch.Tensor]: + """ + The [`Flux3Transformer2DModel`] forward method. + + Args: + hidden_states (`torch.Tensor` of shape `(batch_size, image_seq_len, in_channels)`): + Noisy image latent tokens. + encoder_hidden_states (`torch.Tensor` of shape `(batch_size, text_seq_len, joint_attention_dim)`): + Text context embeddings (stacked Qwen3-VL hidden states). + timestep (`torch.Tensor` of shape `(batch_size,)`): + Flow timestep in `[0, 1]` of the image tokens. The reference image tokens and the text context sit at + timestep `0`. + img_ids (`torch.Tensor` of shape `(image_seq_len, 4)`): + Position ids `(t, h, w, l)` of the image tokens, used for the rotary positional embeddings and shared + by all samples in the batch. + txt_ids (`torch.Tensor` of shape `(text_seq_len, 4)`): + Position ids of the text context tokens. + image_cond_hidden_states (`torch.Tensor` of shape `(batch_size, cond_seq_len, cond_in_channels)`, *optional*): + VAE-encoded reference image tokens (clean conditioning content, for image-to-image generation). + image_cond_ids (`torch.Tensor` of shape `(cond_seq_len, 4)`, *optional*): + Position ids of the reference image tokens. Required with `image_cond_hidden_states`. + target_timestep (`torch.Tensor` of shape `(batch_size,)`, *optional*): + Flow timestep in `[0, 1]` that the current denoising step jumps to. Required by, and only by, a + flow-map model (`flow_map=True`). + attention_kwargs (`dict`, *optional*): + A kwargs dictionary whose `scale` entry, if specified, scales the LoRA layers for this forward pass. + return_dict (`bool`, *optional*, defaults to `True`): + Whether or not to return a [`~models.transformer_2d.Transformer2DModelOutput`] instead of a plain + tuple. + + Returns: + If `return_dict` is True, an [`~models.transformer_2d.Transformer2DModelOutput`] is returned, otherwise a + `tuple` where the first element is the predicted velocity of the image tokens, of the same shape as + `hidden_states`. + """ + if image_cond_hidden_states is not None and image_cond_ids is None: + raise ValueError("`image_cond_hidden_states` requires `image_cond_ids`.") + if image_cond_hidden_states is None and image_cond_ids is not None: + raise ValueError("`image_cond_ids` was passed without `image_cond_hidden_states`.") + if (target_timestep is not None) != bool(self.config.flow_map): + raise ValueError( + "`target_timestep` is required by, and only by, a flow-map transformer (`flow_map=True`)." + ) + + batch_size, image_seq_len = hidden_states.shape[:2] + dtype = hidden_states.dtype + + # 1. Timestep embeddings: the image tokens at `timestep`, the text context and the reference tokens at 0. + # Each is a per-token embedding (batch_size, seq_len, dim) since the modulation is per token. + image_temb = self.time_proj(timestep.to(dtype) * 1000) + image_temb = self.timestep_embedder(image_temb.to(dtype))[:, None, :] + zero_temb = self.time_proj(torch.zeros(batch_size, device=hidden_states.device, dtype=dtype)) + zero_temb = self.timestep_embedder(zero_temb.to(dtype))[:, None, :] + if target_timestep is not None: + # flow map: the embedding of the timestep this step jumps to is added to every mode's embedding, so it + # reaches the per-mode blocks, the joint blocks and the output layer + target_temb = self.time_proj(target_timestep.to(dtype) * 1000) + target_temb = self.target_timestep_embedder(target_temb.to(dtype))[:, None, :] + image_temb = image_temb + target_temb + zero_temb = zero_temb + target_temb + image_temb = image_temb.expand(batch_size, image_seq_len, -1) + zero_temb_act = F.silu(zero_temb) + + # 2. Text context: the two modulation sets, input projection and RoPE + txt_temb_act = zero_temb_act.expand(batch_size, encoder_hidden_states.shape[1], -1) + txt_early_mod = self.early_stream_modulations["txt"](txt_temb_act) + txt_single_mod = self.single_stream_modulations["txt"](txt_temb_act) + encoder_hidden_states = self.context_embedder(encoder_hidden_states) + txt_rotary_emb = self.pos_embed(txt_ids) + + # 3. Image tokens + image_temb_act = F.silu(image_temb) + image_early_mod = self.early_stream_modulations["image"](image_temb_act) + image_single_mod = self.single_stream_modulations["image"](image_temb_act) + hidden_states = self.x_embedders["image"](hidden_states) + image_rotary_emb = self.pos_embed(img_ids) + + # 4. Reference image tokens (optional) + if image_cond_hidden_states is not None: + cond_temb_act = zero_temb_act.expand(batch_size, image_cond_hidden_states.shape[1], -1) + cond_early_mod = self.early_stream_modulations["image_cond"](cond_temb_act) + cond_single_mod = self.single_stream_modulations["image_cond"](cond_temb_act) + image_cond_hidden_states = self.x_embedders["image_cond"](image_cond_hidden_states) + cond_rotary_emb = self.pos_embed(image_cond_ids) + + # 5. Per-mode transformer blocks (each mode self-attends within itself only) + for block in self.txt_mode_blocks: + if torch.is_grad_enabled() and self.gradient_checkpointing: + encoder_hidden_states = self._gradient_checkpointing_func( + block, encoder_hidden_states, txt_early_mod, txt_rotary_emb + ) + else: + encoder_hidden_states = block(encoder_hidden_states, txt_early_mod, txt_rotary_emb) + + for block in self.mode_blocks["image"]: + if torch.is_grad_enabled() and self.gradient_checkpointing: + hidden_states = self._gradient_checkpointing_func( + block, hidden_states, image_early_mod, image_rotary_emb + ) + else: + hidden_states = block(hidden_states, image_early_mod, image_rotary_emb) + + if image_cond_hidden_states is not None: + for block in self.mode_blocks["image_cond"]: + if torch.is_grad_enabled() and self.gradient_checkpointing: + image_cond_hidden_states = self._gradient_checkpointing_func( + block, image_cond_hidden_states, cond_early_mod, cond_rotary_emb + ) + else: + image_cond_hidden_states = block(image_cond_hidden_states, cond_early_mod, cond_rotary_emb) + + # 6. Joint single transformer blocks over [txt, image, image_cond] + if image_cond_hidden_states is not None: + content_states = torch.cat([hidden_states, image_cond_hidden_states], dim=1) + content_mod = torch.cat([image_single_mod, cond_single_mod], dim=1) + joint_rotary_emb = ( + torch.cat([txt_rotary_emb[0], image_rotary_emb[0], cond_rotary_emb[0]], dim=0), + torch.cat([txt_rotary_emb[1], image_rotary_emb[1], cond_rotary_emb[1]], dim=0), + ) + else: + content_states = hidden_states + content_mod = image_single_mod + joint_rotary_emb = ( + torch.cat([txt_rotary_emb[0], image_rotary_emb[0]], dim=0), + torch.cat([txt_rotary_emb[1], image_rotary_emb[1]], dim=0), + ) + + for block in self.single_transformer_blocks: + if torch.is_grad_enabled() and self.gradient_checkpointing: + encoder_hidden_states, content_states = self._gradient_checkpointing_func( + block, content_states, encoder_hidden_states, content_mod, txt_single_mod, joint_rotary_emb + ) + else: + encoder_hidden_states, content_states = block( + hidden_states=content_states, + encoder_hidden_states=encoder_hidden_states, + temb_mod=content_mod, + temb_mod_context=txt_single_mod, + image_rotary_emb=joint_rotary_emb, + ) + + # 7. Output layers: the image tokens sit first in the content sequence; the reference tokens produce no output + hidden_states = content_states[:, :image_seq_len] + hidden_states = self.norm_out(hidden_states, image_temb) + output = self.proj_out(hidden_states) + + if not return_dict: + return (output,) + + return Transformer2DModelOutput(sample=output) diff --git a/invokeai/backend/model_manager/configs/factory.py b/invokeai/backend/model_manager/configs/factory.py index 27553c2200c..a4193c48944 100644 --- a/invokeai/backend/model_manager/configs/factory.py +++ b/invokeai/backend/model_manager/configs/factory.py @@ -84,6 +84,7 @@ Main_Checkpoint_Anima_Config, Main_Checkpoint_ErnieImage_Config, Main_Checkpoint_Flux2_Config, + Main_Checkpoint_Flux3_Config, Main_Checkpoint_FLUX_Config, Main_Checkpoint_Ideogram4_Config, Main_Checkpoint_Krea2_Config, @@ -100,6 +101,7 @@ Main_Diffusers_CogView4_Config, Main_Diffusers_ErnieImage_Config, Main_Diffusers_Flux2_Config, + Main_Diffusers_Flux3_Config, Main_Diffusers_FLUX_Config, Main_Diffusers_Ideogram4_Config, Main_Diffusers_Krea2_Config, @@ -116,6 +118,7 @@ Main_Diffusers_ZImage_Config, Main_GGUF_ErnieImage_Config, Main_GGUF_Flux2_Config, + Main_GGUF_Flux3_Config, Main_GGUF_FLUX_Config, Main_GGUF_Ideogram4_Config, Main_GGUF_Krea2_Config, @@ -345,6 +348,10 @@ def _identified_default_settings( "MiniMaxH3Transformer3DModel", "AutoencoderKLMiniMaxH3", "AutoencoderKLMiniMaxH3Audio", + # FLUX.3 classes exist only on diffusers main (the transformer is vendored under invokeai/backend/flux3). + "Flux3ModularPipeline", + "Flux3DistilledModularPipeline", + "Flux3Transformer2DModel", } @@ -414,6 +421,7 @@ def has_model_export(module: Any, name: Any, expected_bases: tuple[type, ...]) - Annotated[Main_Diffusers_ErnieImage_Config, Main_Diffusers_ErnieImage_Config.get_tag()], Annotated[Main_Diffusers_Ideogram4_Config, Main_Diffusers_Ideogram4_Config.get_tag()], Annotated[Main_Diffusers_Krea2_Config, Main_Diffusers_Krea2_Config.get_tag()], + Annotated[Main_Diffusers_Flux3_Config, Main_Diffusers_Flux3_Config.get_tag()], Annotated[Main_Diffusers_MiniMaxH3_Config, Main_Diffusers_MiniMaxH3_Config.get_tag()], Annotated[Main_Diffusers_LTX2_Config, Main_Diffusers_LTX2_Config.get_tag()], # Main (Pipeline) - checkpoint format @@ -432,6 +440,7 @@ def has_model_export(module: Any, name: Any, expected_bases: tuple[type, ...]) - Annotated[Main_Checkpoint_ErnieImage_Config, Main_Checkpoint_ErnieImage_Config.get_tag()], Annotated[Main_Checkpoint_Ideogram4_Config, Main_Checkpoint_Ideogram4_Config.get_tag()], Annotated[Main_Checkpoint_Krea2_Config, Main_Checkpoint_Krea2_Config.get_tag()], + Annotated[Main_Checkpoint_Flux3_Config, Main_Checkpoint_Flux3_Config.get_tag()], Annotated[Main_Checkpoint_Anima_Config, Main_Checkpoint_Anima_Config.get_tag()], Annotated[Main_Checkpoint_MiniMaxH3_Config, Main_Checkpoint_MiniMaxH3_Config.get_tag()], Annotated[Main_Checkpoint_LTX2_Config, Main_Checkpoint_LTX2_Config.get_tag()], @@ -446,6 +455,7 @@ def has_model_export(module: Any, name: Any, expected_bases: tuple[type, ...]) - Annotated[Main_GGUF_Wan_Config, Main_GGUF_Wan_Config.get_tag()], Annotated[Main_GGUF_ZImage_Config, Main_GGUF_ZImage_Config.get_tag()], Annotated[Main_GGUF_Krea2_Config, Main_GGUF_Krea2_Config.get_tag()], + Annotated[Main_GGUF_Flux3_Config, Main_GGUF_Flux3_Config.get_tag()], Annotated[Main_GGUF_Ideogram4_Config, Main_GGUF_Ideogram4_Config.get_tag()], Annotated[Main_GGUF_ErnieImage_Config, Main_GGUF_ErnieImage_Config.get_tag()], # IMPORTANT: FLUX.2 must be listed BEFORE FLUX.1 here. An ambiguous SDNQ transformer diff --git a/invokeai/backend/model_manager/configs/main.py b/invokeai/backend/model_manager/configs/main.py index bd297396714..a2c217ce14e 100644 --- a/invokeai/backend/model_manager/configs/main.py +++ b/invokeai/backend/model_manager/configs/main.py @@ -50,6 +50,7 @@ AnimaVariantType, BaseModelType, Flux2VariantType, + Flux3VariantType, FluxVariantType, Krea2VariantType, LTX2VariantType, @@ -377,6 +378,11 @@ def _is_flux2_model(state_dict: dict[str | int, Any]) -> bool: Also checks for FLUX.2-specific 32-channel latent space (in_channels=128 after packing). """ + # FLUX.3 shares the 32-channel latent space and a wide text input (`txt_in`, read by + # `_get_flux2_variant`), so it is excluded by name rather than left to which keys happen to differ. + if _has_flux3_keys(state_dict): + return False + # Check context_embedder input dimension (most reliable) # Weight shape: [hidden_size, context_in_dim] for key in {"context_embedder.weight", "model.diffusion_model.context_embedder.weight"}: @@ -818,10 +824,16 @@ def _validate_has_flux_blocks(cls, mod: ModelOnDisk) -> None: @classmethod def _validate_is_not_flux2(cls, mod: ModelOnDisk) -> None: - """Validate that this is NOT a FLUX.2 model.""" + """Validate that this is NOT a FLUX.2 or FLUX.3 model. + + This config has no positive FLUX.1 key of its own, and FLUX.3 GGUFs label themselves + `general.architecture = "flux"` too, so both are excluded by name. + """ state_dict = mod.load_state_dict() if _is_flux2_model(state_dict): raise NotAMatchError("model is a FLUX.2 model, not FLUX.1") + if _has_flux3_keys(state_dict): + raise NotAMatchError("model is a FLUX.3 model, not FLUX.1") class Main_GGUF_Flux2_Config(Checkpoint_Config_Base, Main_Config_Base, Config_Base): @@ -2138,6 +2150,154 @@ def _validate_looks_like_gguf_quantized(cls, mod: ModelOnDisk) -> None: raise NotAMatchError("state dict does not look like GGUF quantized") +_FLUX3_LORA_SUFFIXES = ( + ".lora_down.weight", + ".lora_up.weight", + ".lora_A.weight", + ".lora_B.weight", + ".dora_scale", + ".alpha", +) + +# A quantized side channel next to a weight, or a weight stored in a quantized dtype. FLUX.3 loads these +# builds later; until it does, they are refused with a message rather than loaded wrongly. +_FLUX3_QUANTIZATION_SUFFIXES = (".weight_scale", ".weight_scale_2", ".input_scale", ".scale_weight", ".comfy_quant") +_FLUX3_QUANTIZED_DTYPES = (torch.float8_e4m3fn, torch.float8_e5m2, torch.uint8, torch.int8) + + +def _has_flux3_keys(state_dict: dict[str | int, Any]) -> bool: + """True for a FLUX.3 Image transformer in Black Forest Labs' native layout, False for its LoRAs. + + The per-mode stage before the joint blocks is unique to FLUX.3: `content_mode_blocks..N` and + `early_stream_modulations`. FLUX.1 and FLUX.2 have `double_blocks`, Krea-2 `text_fusion`. ComfyUI's key + prefixes are tolerated; the BFL file and the ComfyUI repackage are byte-identical and carry none. + """ + keys = [_strip_comfyui_key_prefix(key) for key in state_dict if isinstance(key, str)] + if any(key.endswith(_FLUX3_LORA_SUFFIXES) for key in keys): + return False + return "early_stream_modulations.image.lin.weight" in set(keys) and any( + key.startswith("content_mode_blocks.image.") for key in keys + ) + + +def _get_flux3_variant(state_dict: dict[str | int, Any]) -> Flux3VariantType: + """The step-distilled checkpoint has a second timestep embedder; the Base model does not.""" + keys = {_strip_comfyui_key_prefix(key) for key in state_dict if isinstance(key, str)} + return Flux3VariantType.Klein if "ref_time_in.in_layer.weight" in keys else Flux3VariantType.KleinBase + + +class Main_Diffusers_Flux3_Config(Diffusers_Config_Base, Main_Config_Base, Config_Base): + """Model config for FLUX.3 Image diffusers models (Klein and Klein Base). + + FLUX.3 ships as a Modular Diffusers pipeline: the root config is `modular_model_index.json`. The Hub + repositories also hold BFL's own single-file package at the root (`model.safetensors`, a BFL-format + `config.json`, `ae.safetensors`) and quantized `variants/`; none of them is read here. + """ + + base: Literal[BaseModelType.Flux3] = Field(BaseModelType.Flux3) + variant: Flux3VariantType = Field() + + @classmethod + def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) -> Self: + raise_if_not_dir(mod) + + raise_for_override_fields(cls, override_fields) + + raise_for_class_name( + mod.path / "modular_model_index.json", + {"Flux3ModularPipeline", "Flux3DistilledModularPipeline"}, + ) + raise_for_class_name(mod.path / "transformer" / "config.json", {"Flux3Transformer2DModel"}) + + # A partial download is refused here rather than failing mid-generation. + if not (mod.path / "vae" / "config.json").exists(): + raise InvalidMatchError("FLUX.3 folder has no `vae/`; download the full Diffusers pipeline") + text_encoder_dir = mod.path / "text_encoder" + if not (text_encoder_dir / "config.json").exists(): + raise InvalidMatchError("FLUX.3 folder has no `text_encoder/`; download the full Diffusers pipeline") + if not (text_encoder_dir / "tokenizer.json").exists() and not ( + (text_encoder_dir / "vocab.json").exists() and (text_encoder_dir / "merges.txt").exists() + ): + raise InvalidMatchError("FLUX.3 folder has no tokenizer files in `text_encoder/`") + + variant = override_fields.pop("variant", None) or cls._get_variant(mod) + + repo_variant = override_fields.pop("repo_variant", None) or cls._get_repo_variant_or_raise(mod) + + return cls(**override_fields, variant=variant, repo_variant=repo_variant) + + @classmethod + def _get_variant(cls, mod: ModelOnDisk) -> Flux3VariantType: + """The step-distilled transformer is a flow map (`flow_map: true`); the Base transformer is not.""" + config = get_config_dict_or_raise(mod.path / "transformer" / "config.json") + return Flux3VariantType.Klein if config.get("flow_map", False) else Flux3VariantType.KleinBase + + +class Main_Checkpoint_Flux3_Config(Checkpoint_Config_Base, Main_Config_Base, Config_Base): + """Model config for FLUX.3 Image single-file transformers (BFL `model.safetensors`, ComfyUI bf16).""" + + base: Literal[BaseModelType.Flux3] = Field(default=BaseModelType.Flux3) + format: Literal[ModelFormat.Checkpoint] = Field(default=ModelFormat.Checkpoint) + variant: Flux3VariantType = Field() + + @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 mod.path.suffix.lower() != ".safetensors": + raise NotAMatchError(f"expected a .safetensors file, got {mod.path.suffix or '(no suffix)'}") + + state_dict = mod.load_state_dict() + if not _has_flux3_keys(state_dict): + raise NotAMatchError("state dict does not look like a FLUX.3 model") + if _has_ggml_tensors(state_dict): + raise NotAMatchError("state dict looks like GGUF quantized") + cls._raise_for_quantized_weights(state_dict) + + variant = override_fields.pop("variant", None) or _get_flux3_variant(state_dict) + + return cls(**override_fields, variant=variant) + + @classmethod + def _raise_for_quantized_weights(cls, state_dict: dict[str | int, Any]) -> None: + for key, value in state_dict.items(): + if not isinstance(key, str): + continue + if key.endswith(_FLUX3_QUANTIZATION_SUFFIXES) or ( + key.endswith(".weight") and getattr(value, "dtype", None) in _FLUX3_QUANTIZED_DTYPES + ): + raise InvalidMatchError( + "this FLUX.3 build is quantized (fp8, int8 or nvfp4), which is not supported yet; install the " + "bf16 file or a GGUF build" + ) + + +class Main_GGUF_Flux3_Config(Checkpoint_Config_Base, Main_Config_Base, Config_Base): + """Model config for GGUF-quantized FLUX.3 Image transformers (single-file).""" + + base: Literal[BaseModelType.Flux3] = Field(default=BaseModelType.Flux3) + format: Literal[ModelFormat.GGUFQuantized] = Field(default=ModelFormat.GGUFQuantized) + variant: Flux3VariantType = Field() + + @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) + + state_dict = mod.load_state_dict() + if not _has_flux3_keys(state_dict): + raise NotAMatchError("state dict does not look like a FLUX.3 model") + if not _has_ggml_tensors(state_dict): + raise NotAMatchError("state dict does not look like GGUF quantized") + + variant = override_fields.pop("variant", None) or _get_flux3_variant(state_dict) + + return cls(**override_fields, variant=variant) + + class Main_Diffusers_QwenImage_Config(Diffusers_Config_Base, Main_Config_Base, Config_Base): """Model config for Qwen Image diffusers models (both txt2img and edit).""" diff --git a/invokeai/backend/model_manager/load/model_loaders/flux3.py b/invokeai/backend/model_manager/load/model_loaders/flux3.py new file mode 100644 index 00000000000..d2da0fb7fef --- /dev/null +++ b/invokeai/backend/model_manager/load/model_loaders/flux3.py @@ -0,0 +1,202 @@ +"""Loaders for FLUX.3 Image transformers (Klein and Klein Base). + +The transformer class is vendored under ``invokeai.backend.flux3`` because it exists only on diffusers main, +so the Diffusers loader dispatches submodels explicitly instead of subclassing ``GenericDiffusersLoader`` +(which reads ``model_index.json`` and resolves classes against the installed diffusers; FLUX.3 ships a +``modular_model_index.json``). + +Submodel map of a Diffusers folder (subfolder == ``SubModelType`` value, except the tokenizer): +- ``transformer`` -> vendored ``Flux3Transformer2DModel`` (bf16, QK norms in fp32) +- ``vae`` -> ``AutoencoderKLFlux2`` (the FLUX.2 VAE, byte-identical) +- ``text_encoder`` -> ``Qwen3VLModel`` (Qwen3-VL 4B Instruct), visual tower dropped +- tokenizer -> ``AutoTokenizer`` from ``text_encoder/``, where the release keeps its tokenizer files + +Single-file and GGUF builds are only the transformer, in Black Forest Labs' key layout. +""" + +from pathlib import Path +from typing import Optional + +import accelerate +import torch +from transformers import AutoConfig, AutoTokenizer, Qwen3VLModel + +from invokeai.backend.flux3.conversion import convert_flux3_native_to_diffusers, flux3_transformer_config +from invokeai.backend.model_manager.checkpoint_prefix import CheckpointPrefix +from invokeai.backend.model_manager.configs.factory import AnyModelConfig +from invokeai.backend.model_manager.configs.main import ( + Main_Checkpoint_Flux3_Config, + Main_Diffusers_Flux3_Config, + Main_GGUF_Flux3_Config, +) +from invokeai.backend.model_manager.load.load_default import ModelLoader, _model_declared_skip_patterns +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.model_manager.util.qwen3_vl import drop_qwen3vl_visual_tower, normalize_qwen3vl_rope_config +from invokeai.backend.quantization.fp8_scaled import cast_state_dict, reject_quantized_side_channel +from invokeai.backend.quantization.gguf.ggml_tensor import GGMLTensor +from invokeai.backend.quantization.gguf.loaders import gguf_sd_loader, unpack_ggml_at_load +from invokeai.backend.quantization.load_plan import reserve_for_load +from invokeai.backend.util.devices import TorchDevice +from invokeai.backend.util.state_dict_loading import load_state_dict_ignoring_extras, reject_incomplete_load + +_QK_NORM_WEIGHTS = (".norm_q.weight", ".norm_k.weight") + + +def _keep_qk_norms_in_fp32(model: torch.nn.Module) -> None: + """Hold the attention QK-norm weights in float32, as diffusers' `_keep_in_fp32_modules` does on a folder load. + + `Flux3AttnProcessor` normalizes a float32 query and key, as the reference implementation does; a bf16 + weight would round the scale that multiplies them. + """ + for name, module in model.named_modules(): + if name.endswith((".norm_q", ".norm_k")) and getattr(module, "weight", None) is not None: + module.weight = torch.nn.Parameter(module.weight.detach().to(torch.float32), requires_grad=False) + + +def _build_transformer(state_dict: dict) -> torch.nn.Module: + """An empty transformer (on the meta device) shaped by a native FLUX.3 state dict.""" + from invokeai.backend.flux3 import Flux3Transformer2DModel + + model_config = flux3_transformer_config(state_dict) + with accelerate.init_empty_weights(): + return Flux3Transformer2DModel(**model_config) + + +@ModelLoaderRegistry.register(base=BaseModelType.Flux3, type=ModelType.Main, format=ModelFormat.Diffusers) +class Flux3DiffusersModel(ModelLoader): + """Loads the submodels of a FLUX.3 Diffusers folder.""" + + def get_size_fs( + self, config: AnyModelConfig, model_path: Path, submodel_type: Optional[SubModelType] = None + ) -> int: + # The tokenizer lives in `text_encoder/` and has no folder of its own; the generic sizing would fall + # back to the folder root, which in a full repo download holds BFL's 11 GB single-file package. + if submodel_type is SubModelType.Tokenizer: + return 0 + return super().get_size_fs(config, model_path, submodel_type) + + def _load_model(self, config: AnyModelConfig, submodel_type: Optional[SubModelType] = None) -> AnyModel: + if not isinstance(config, Main_Diffusers_Flux3_Config): + raise ValueError(f"Unexpected config type {type(config).__name__} for the FLUX.3 Diffusers loader.") + if submodel_type is None: + raise ValueError("A submodel type must be provided when loading a FLUX.3 Diffusers model.") + + model_path = Path(config.path) + dtype = TorchDevice.choose_bfloat16_safe_dtype(TorchDevice.choose_torch_device()) + + match submodel_type: + case SubModelType.Transformer: + from invokeai.backend.flux3 import Flux3Transformer2DModel + + transformer = Flux3Transformer2DModel.from_pretrained( + model_path / "transformer", torch_dtype=dtype, local_files_only=True + ) + return self._apply_fp8_layerwise_casting(transformer, config, submodel_type) + case SubModelType.VAE: + from diffusers import AutoencoderKLFlux2 + + return AutoencoderKLFlux2.from_pretrained( + model_path / "vae", torch_dtype=self._torch_dtype_avoiding_float16(), local_files_only=True + ) + case SubModelType.TextEncoder: + encoder_path = model_path / "text_encoder" + encoder_config = normalize_qwen3vl_rope_config( + AutoConfig.from_pretrained(encoder_path, local_files_only=True) + ) + text_encoder = Qwen3VLModel.from_pretrained( + encoder_path, + config=encoder_config, + torch_dtype=dtype, + low_cpu_mem_usage=True, + local_files_only=True, + ) + # FLUX.3 conditions on the language tower's hidden states; the visual tower never runs. + drop_qwen3vl_visual_tower(text_encoder) + return text_encoder + case SubModelType.Tokenizer: + return AutoTokenizer.from_pretrained( + model_path / "text_encoder", local_files_only=True, extra_special_tokens={} + ) + case _: + raise ValueError(f"A FLUX.3 Diffusers model has no '{submodel_type.value}' submodel.") + + +@ModelLoaderRegistry.register(base=BaseModelType.Flux3, type=ModelType.Main, format=ModelFormat.Checkpoint) +class Flux3CheckpointModel(ModelLoader): + """Loads a FLUX.3 transformer from a single bf16 file (BFL `model.safetensors`, or its ComfyUI repackage).""" + + def _load_model(self, config: AnyModelConfig, submodel_type: Optional[SubModelType] = None) -> AnyModel: + if not isinstance(config, Main_Checkpoint_Flux3_Config): + raise ValueError(f"Unexpected config type {type(config).__name__} for the FLUX.3 single-file loader.") + if submodel_type is not SubModelType.Transformer: + raise ValueError("A single-file FLUX.3 model holds only the transformer.") + + from safetensors.torch import load_file + + model_dtype = TorchDevice.choose_bfloat16_safe_dtype(TorchDevice.choose_torch_device()) + sd = load_file(Path(config.path)) + sd = CheckpointPrefix.detect(sd).strip(sd) + # Identification refuses quantized builds already; this catches a record made before it did. + reject_quantized_side_channel(sd, "a FLUX.3 single-file checkpoint") + + model = _build_transformer(sd) + sd = convert_flux3_native_to_diffusers(sd) + skip_patterns = _model_declared_skip_patterns(model) + reserve_for_load( + self._ram_cache.make_room, + sd, + model_dtype, + keep_fp8=False, + model=model, + skip_patterns=skip_patterns, + fp8_layers={}, + nvfp4_payloads={}, + ) + cast_state_dict(sd, model_dtype, keep_fp8=False, model=model, skip_patterns=skip_patterns) + load_state_dict_ignoring_extras( + model, sd, source="FLUX.3 single-file checkpoint", assign=True, allow_missing=True + ) + reject_incomplete_load(model, what="FLUX.3 single-file checkpoint") + sd.clear() + _keep_qk_norms_in_fp32(model) + return self._apply_fp8_layerwise_casting(model, config, SubModelType.Transformer) + + +@ModelLoaderRegistry.register(base=BaseModelType.Flux3, type=ModelType.Main, format=ModelFormat.GGUFQuantized) +class Flux3GGUFCheckpointModel(ModelLoader): + """Loads a GGUF-quantized FLUX.3 transformer; the GGML tensors stay packed and dequantize per forward.""" + + def _load_model(self, config: AnyModelConfig, submodel_type: Optional[SubModelType] = None) -> AnyModel: + if not isinstance(config, Main_GGUF_Flux3_Config): + raise ValueError(f"Unexpected config type {type(config).__name__} for the FLUX.3 GGUF loader.") + if submodel_type is not SubModelType.Transformer: + raise ValueError("A GGUF FLUX.3 model holds only the transformer.") + + compute_dtype = TorchDevice.choose_bfloat16_safe_dtype(TorchDevice.choose_torch_device()) + sd = gguf_sd_loader(Path(config.path), compute_dtype=compute_dtype) + sd = CheckpointPrefix.detect(sd).strip(sd) + + model = _build_transformer(sd) + sd = convert_flux3_native_to_diffusers(sd) + # The output adaLN weight comes back unpacked from the [shift, scale] swap; it joins the compute dtype + # the packed tensors dequantize to. + adaln = sd.get("norm_out.linear.weight") + if adaln is not None and not isinstance(adaln, GGMLTensor): + sd["norm_out.linear.weight"] = adaln.to(compute_dtype) + # The QK norms are stored unquantized (F32) and stay float32, so they are taken as stored before the + # unpack below would round them through the bf16 compute dtype. + for key in [key for key in sd if key.endswith(_QK_NORM_WEIGHTS)]: + value = sd[key] + if isinstance(value, GGMLTensor): + stored = value.quantized_data + sd[key] = ( + stored.to(torch.float32) + if stored.is_floating_point() and stored.shape == value.shape + else value.get_dequantized_tensor().to(torch.float32) + ) + unpack_ggml_at_load(sd, model, _model_declared_skip_patterns(model), self._ram_cache.make_room) + load_state_dict_ignoring_extras(model, sd, source="FLUX.3 GGUF checkpoint", assign=True, allow_missing=True) + reject_incomplete_load(model, what="FLUX.3 GGUF checkpoint") + _keep_qk_norms_in_fp32(model) + return model diff --git a/invokeai/backend/model_manager/metadata/metadata_base.py b/invokeai/backend/model_manager/metadata/metadata_base.py index 3a011850f5d..6dd76ecbcba 100644 --- a/invokeai/backend/model_manager/metadata/metadata_base.py +++ b/invokeai/backend/model_manager/metadata/metadata_base.py @@ -13,7 +13,7 @@ """ from pathlib import Path -from typing import List, Literal, Optional, Union +from typing import Any, List, Literal, Optional, Union from huggingface_hub import hf_hub_url from pydantic import BaseModel, Field, TypeAdapter @@ -136,9 +136,33 @@ def download_urls( submodels = resp.json() paths = [Path(subfolder or "", x) for x in paths if Path(x).parent.as_posix() in submodels] paths.insert(0, Path(f"{prefix}model_index.json")) + elif not prefix and Path("modular_model_index.json") in paths: + # A Modular Diffusers repo names its components in modular_model_index.json instead. Each one + # says which folder it loads from -- FLUX.3's tokenizer lives in `text_encoder/` -- and anything + # else in the repo (FLUX.3 also ships BFL's own single-file package at the root) is not part of it. + url = hf_hub_url(self.id, filename="modular_model_index.json") + try: + resp = session.get(url, timeout=HF_METADATA_REQUEST_TIMEOUT_SECONDS) + except RequestException as e: + raise ModelMetadataUnavailableError(f"Could not fetch modular model index for '{self.id}'") from e + resp.raise_for_status() + component_folders = _modular_component_folders(resp.json()) + paths = [x for x in paths if Path(x).parent.as_posix() in component_folders] + paths.insert(0, Path("modular_model_index.json")) return [x for x in self.files if x.path in paths] +def _modular_component_folders(index: dict[str, Any]) -> set[str]: + """The folders the components of a ``modular_model_index.json`` load from.""" + folders: set[str] = set() + for name, spec in index.items(): + if name.startswith("_"): + continue + load_spec = spec[2] if isinstance(spec, list) and len(spec) > 2 and isinstance(spec[2], dict) else {} + folders.add(str(load_spec.get("subfolder") or name)) + return folders + + AnyModelRepoMetadata = Annotated[Union[BaseMetadata, HuggingFaceMetadata], Field(discriminator="type")] AnyModelRepoMetadataValidator = TypeAdapter(AnyModelRepoMetadata) diff --git a/invokeai/backend/model_manager/qwen3_vl_labels.py b/invokeai/backend/model_manager/qwen3_vl_labels.py index 6cfa7eaecf3..fe47f9dc374 100644 --- a/invokeai/backend/model_manager/qwen3_vl_labels.py +++ b/invokeai/backend/model_manager/qwen3_vl_labels.py @@ -1,7 +1,7 @@ """How a Qwen3-VL encoder variant is named to a user. -Two architectures condition on Qwen3-VL and neither can use the other's size, so both loader nodes -refuse the wrong one by name. The refusal is only useful if the name is one the user recognises +Several architectures condition on Qwen3-VL and none can use another size than its own, so their loader +nodes refuse the wrong one by name. The refusal is only useful if the name is one the user recognises from the picker -- and a third config class (MiniMax H3's truncated Qwen3-VL-32B) shares the model type while carrying no variant at all, so `None` has to render as something better than "None". """ @@ -14,8 +14,29 @@ } +_HIDDEN_SIZES = { + Qwen3VLVariantType.Qwen3VL_4B: 2560, + Qwen3VLVariantType.Qwen3VL_8B: 4096, +} + + def variant_label(variant: object) -> str: """A human name for a recorded Qwen3-VL variant, or a description of its absence.""" if isinstance(variant, Qwen3VLVariantType): return _LABELS[variant] return "of an unrecorded size" if variant is None else str(getattr(variant, "value", variant)) + + +def raise_for_wrong_qwen3_vl_variant( + encoder_name: str, variant: object, expected: Qwen3VLVariantType, architecture: str +) -> None: + """Refuse an encoder of the wrong size before it loads. + + The wrong size would otherwise load in full and then fail on a shape error naming a tensor, which says + nothing about what the user picked. + """ + if variant is not expected: + raise ValueError( + f"'{encoder_name}' is the Qwen3-VL {variant_label(variant)} encoder. {architecture} conditions on the " + f"{_LABELS[expected]} one (hidden size {_HIDDEN_SIZES[expected]})." + ) diff --git a/invokeai/backend/model_manager/starter_models/__init__.py b/invokeai/backend/model_manager/starter_models/__init__.py index a7b2a814a04..f0811dbf4a5 100644 --- a/invokeai/backend/model_manager/starter_models/__init__.py +++ b/invokeai/backend/model_manager/starter_models/__init__.py @@ -154,6 +154,14 @@ pid_decoder_flux2_2k, pid_decoder_flux2_2kto4k, ) +from invokeai.backend.model_manager.starter_models.flux3 import ( + flux3_klein, + flux3_klein_base, + flux3_klein_base_single_file, + flux3_klein_gguf_q4_k_m, + flux3_klein_gguf_q8_0, + flux3_klein_single_file, +) from invokeai.backend.model_manager.starter_models.ideogram_4 import ( ideogram_4_fp8, ideogram_4_gguf_q4_0, @@ -487,6 +495,12 @@ krea2_turbo_gguf_q4_k_m, krea2_turbo_gguf_q8_0, krea2_turbo_nvfp4, + flux3_klein, + flux3_klein_base, + flux3_klein_single_file, + flux3_klein_base_single_file, + flux3_klein_gguf_q4_k_m, + flux3_klein_gguf_q8_0, qwen3_vl_encoder_4b, qwen_image_2_1_turbo, qwen_image_2_1, @@ -701,6 +715,14 @@ krea2_turbo_nvfp4, ] +# FLUX.3: the ungated GGUF build with its shared VAE and encoder, so one click needs no license gate and no +# 20 GB download. The gated BFL builds (Diffusers and single files) stay available a la carte. +flux3_bundle: list[StarterModel] = [ + flux2_vae, + qwen3_vl_encoder_4b, + flux3_klein_gguf_q4_k_m, +] + # Wan 2.2: text-to-video (T2V-A14B), image-to-video (I2V-A14B), and the low-VRAM TI2V-5B that # handles both modes in one ~3.4 GB model, each A14B pair with its Lightning LoRAs. Q8 variants and # full Diffusers builds stay available as a-la-carte starters. @@ -755,6 +777,7 @@ BaseModelType.QwenImage: StarterModelBundle(name="Qwen Image", models=qwen_image_bundle), BaseModelType.Anima: StarterModelBundle(name="Anima", models=anima_bundle), BaseModelType.Krea2: StarterModelBundle(name="Krea 2", models=krea2_bundle), + BaseModelType.Flux3: StarterModelBundle(name="FLUX.3", models=flux3_bundle), BaseModelType.Wan: StarterModelBundle(name="Wan 2.2", models=wan_bundle), BaseModelType.MiniMaxH3: StarterModelBundle(name="MiniMax H3", models=minimax_h3_bundle), BaseModelType.LTX2: StarterModelBundle(name="LTX 2.5", models=ltx2_bundle), diff --git a/invokeai/backend/model_manager/starter_models/common.py b/invokeai/backend/model_manager/starter_models/common.py index 73348d88193..27a8407557c 100644 --- a/invokeai/backend/model_manager/starter_models/common.py +++ b/invokeai/backend/model_manager/starter_models/common.py @@ -370,8 +370,8 @@ name="Qwen3-VL 4B Encoder (Diffusers)", base=BaseModelType.Any, source="Qwen/Qwen3-VL-4B-Instruct", - description="Qwen3-VL 4B text encoder (Qwen3VLModel) used by Krea-2, in HuggingFace folder layout " - "(includes tokenizer). Use with single-file / GGUF Krea-2 transformers. (~8GB)", + description="Qwen3-VL 4B text encoder (Qwen3VLModel) used by Krea-2 and FLUX.3, in HuggingFace folder " + "layout (includes tokenizer). Use with single-file / GGUF Krea-2 and FLUX.3 transformers. (~8GB)", type=ModelType.Qwen3VLEncoder, format=ModelFormat.Qwen3VLEncoder, ) diff --git a/invokeai/backend/model_manager/starter_models/flux3.py b/invokeai/backend/model_manager/starter_models/flux3.py new file mode 100644 index 00000000000..4d7b950cada --- /dev/null +++ b/invokeai/backend/model_manager/starter_models/flux3.py @@ -0,0 +1,89 @@ +"""FLUX.3 Image starter models. + +License: the FLUX Kommunity License v1.0 -- non-commercial use, or commercial use by users with under US$5M +annual revenue. Black Forest Labs' repositories (``flux-3-image-klein``, ``-base``, ``-comfy``) are gated: the +license must be accepted on the Hugging Face model page and a Hugging Face token configured. The community +GGUF repository is not gated; the same license applies. +""" + +from invokeai.backend.model_manager.starter_models.common import qwen3_vl_encoder_4b +from invokeai.backend.model_manager.starter_models.flux2 import flux2_vae +from invokeai.backend.model_manager.starter_models.types import StarterModel +from invokeai.backend.model_manager.taxonomy import BaseModelType, Flux3VariantType, ModelFormat, ModelType + +_LICENSE = "FLUX Kommunity License (non-commercial, or commercial under US$5M annual revenue). Accept it on Hugging Face first." +_GGUF_LICENSE = "FLUX Kommunity License (non-commercial, or commercial under US$5M annual revenue)." + +# The Hub repositories also carry BFL's own single-file package and quantized variants at their root; the +# Diffusers install takes only the pipeline's folders. +flux3_klein = StarterModel( + name="FLUX.3 Klein", + base=BaseModelType.Flux3, + source="black-forest-labs/flux-3-image-klein::modular_model_index.json+transformer+vae+text_encoder", + description="FLUX.3 Image Klein: the step-distilled 5.6B model for generation and editing with up to 10 " + "reference images (16 steps, no CFG). Full Diffusers pipeline with the FLUX.2 VAE and the Qwen3-VL 4B " + f"encoder. ~20GB. {_LICENSE}", + type=ModelType.Main, + variant=Flux3VariantType.Klein, +) + +flux3_klein_base = StarterModel( + name="FLUX.3 Klein Base", + base=BaseModelType.Flux3, + source="black-forest-labs/flux-3-image-klein-base::modular_model_index.json+transformer+vae+text_encoder", + description="FLUX.3 Image Klein Base: the undistilled model (50 steps, CFG 3.5, negative prompt), meant for " + "fine-tuning and LoRA training; Klein is about 6x faster for generation. Full Diffusers pipeline. ~20GB. " + f"{_LICENSE}", + type=ModelType.Main, + variant=Flux3VariantType.KleinBase, +) + +flux3_klein_single_file = StarterModel( + name="FLUX.3 Klein (single file)", + base=BaseModelType.Flux3, + source="https://huggingface.co/black-forest-labs/flux-3-image-klein-comfy/resolve/main/diffusion_models/" + "flux3_image_klein_sd_bf16.safetensors", + description="FLUX.3 Image Klein transformer as one bf16 file; the FLUX.2 VAE and Qwen3-VL 4B encoder are " + f"installed as dependencies and shared with other models. ~11GB. {_LICENSE}", + type=ModelType.Main, + format=ModelFormat.Checkpoint, + variant=Flux3VariantType.Klein, + dependencies=[flux2_vae, qwen3_vl_encoder_4b], +) + +flux3_klein_base_single_file = StarterModel( + name="FLUX.3 Klein Base (single file)", + base=BaseModelType.Flux3, + source="https://huggingface.co/black-forest-labs/flux-3-image-klein-comfy/resolve/main/diffusion_models/" + "flux3_image_klein_bf16.safetensors", + description="FLUX.3 Image Klein Base transformer as one bf16 file; the FLUX.2 VAE and Qwen3-VL 4B encoder are " + f"installed as dependencies. ~11GB. {_LICENSE}", + type=ModelType.Main, + format=ModelFormat.Checkpoint, + variant=Flux3VariantType.KleinBase, + dependencies=[flux2_vae, qwen3_vl_encoder_4b], +) + +flux3_klein_gguf_q4_k_m = StarterModel( + name="FLUX.3 Klein (GGUF Q4_K_M)", + base=BaseModelType.Flux3, + source="https://huggingface.co/Abiray/flux-3-image-klein-sd-GGUF/resolve/main/flux3_image_klein_sd_Q4_K_M.gguf", + description="FLUX.3 Image Klein transformer quantized to GGUF Q4_K_M for lower VRAM; the FLUX.2 VAE and " + f"Qwen3-VL 4B encoder are installed as dependencies. ~3.3GB. {_GGUF_LICENSE}", + type=ModelType.Main, + format=ModelFormat.GGUFQuantized, + variant=Flux3VariantType.Klein, + dependencies=[flux2_vae, qwen3_vl_encoder_4b], +) + +flux3_klein_gguf_q8_0 = StarterModel( + name="FLUX.3 Klein (GGUF Q8_0)", + base=BaseModelType.Flux3, + source="https://huggingface.co/Abiray/flux-3-image-klein-sd-GGUF/resolve/main/flux3_image_klein_sd_Q8_0.gguf", + description="FLUX.3 Image Klein transformer quantized to GGUF Q8_0, close to bf16 quality at half its memory; " + f"the FLUX.2 VAE and Qwen3-VL 4B encoder are installed as dependencies. ~6GB. {_GGUF_LICENSE}", + type=ModelType.Main, + format=ModelFormat.GGUFQuantized, + variant=Flux3VariantType.Klein, + dependencies=[flux2_vae, qwen3_vl_encoder_4b], +) diff --git a/invokeai/backend/model_manager/taxonomy.py b/invokeai/backend/model_manager/taxonomy.py index 3a328b436ed..aa2e71bb2ac 100644 --- a/invokeai/backend/model_manager/taxonomy.py +++ b/invokeai/backend/model_manager/taxonomy.py @@ -48,6 +48,9 @@ class BaseModelType(str, Enum): """Indicates the model is associated with FLUX.1 model architecture, including FLUX Dev, Schnell and Fill.""" Flux2 = "flux2" """Indicates the model is associated with FLUX.2 model architecture, including FLUX.2 Klein and FLUX.2 [dev].""" + Flux3 = "flux3" + """Indicates the model is associated with the FLUX.3 Image architecture, including FLUX.3 Image Klein and its + Base model.""" CogView4 = "cogview4" """Indicates the model is associated with CogView 4 model architecture.""" ZImage = "z-image" @@ -183,6 +186,21 @@ class Flux2VariantType(str, Enum): """FLUX.2 [dev] - 32B rectified flow transformer using Mistral Small 3.1 text encoder (guidance-distilled).""" +class Flux3VariantType(str, Enum): + """FLUX.3 Image variants, by how the transformer is sampled. + + The values carry a ``flux3_`` prefix: variant strings are resolved without their base, and ``klein_*`` + already belongs to FLUX.2.""" + + Klein = "flux3_klein" + """FLUX.3 Image Klein, the step-distilled checkpoint. Its transformer is a flow map: every step is also told + the timestep it jumps to, it samples in 16 steps and takes no classifier-free guidance.""" + + KleinBase = "flux3_klein_base" + """FLUX.3 Image Klein Base, the undistilled checkpoint: 50 steps with classifier-free guidance and a negative + prompt. Black Forest Labs publishes it for fine-tuning and LoRA training.""" + + class ZImageVariantType(str, Enum): """Z-Image model variants.""" @@ -482,6 +500,7 @@ class FluxLoRAFormat(str, Enum): ClipVariantType, FluxVariantType, Flux2VariantType, + Flux3VariantType, ZImageVariantType, QwenImageVariantType, WanVariantType, @@ -502,6 +521,7 @@ class FluxLoRAFormat(str, Enum): | ClipVariantType | FluxVariantType | Flux2VariantType + | Flux3VariantType | ZImageVariantType | QwenImageVariantType | WanVariantType @@ -521,6 +541,7 @@ class FluxLoRAFormat(str, Enum): | ClipVariantType | FluxVariantType | Flux2VariantType + | Flux3VariantType | ZImageVariantType | QwenImageVariantType | WanVariantType diff --git a/invokeai/backend/stable_diffusion/diffusion/conditioning_data.py b/invokeai/backend/stable_diffusion/diffusion/conditioning_data.py index 04591b0f238..0bd186ec759 100644 --- a/invokeai/backend/stable_diffusion/diffusion/conditioning_data.py +++ b/invokeai/backend/stable_diffusion/diffusion/conditioning_data.py @@ -171,6 +171,23 @@ def to(self, device: torch.device | None = None, dtype: torch.dtype | None = Non return self +@dataclass +class Flux3ConditioningInfo: + """FLUX.3 text conditioning from the Qwen3-VL 4B encoder. + + Eight decoder hidden-state layers are stacked per token along the channel axis. There is no mask: the + prompt is right-padded to a multiple of 80 tokens and the FLUX.3 transformer attends to the padding, + so the padded window is part of the conditioning. + """ + + prompt_embeds: torch.Tensor + """Stacked Qwen3-VL hidden states. Shape: (batch_size, seq_len, 8 * hidden=20480).""" + + def to(self, device: torch.device | None = None, dtype: torch.dtype | None = None): + self.prompt_embeds = self.prompt_embeds.to(device=device, dtype=dtype) + return self + + @dataclass class AnimaConditioningInfo: """Anima text conditioning information from Qwen3 0.6B encoder + T5-XXL tokenizer. @@ -314,6 +331,7 @@ class ConditioningFieldData: | List[QwenImageConditioningInfo] | List[Krea2ConditioningInfo] | List[QwenImage21ConditioningInfo] + | List[Flux3ConditioningInfo] | List[AnimaConditioningInfo] | List[WanConditioningInfo] | List[MiniMaxH3ConditioningInfo] diff --git a/invokeai/backend/util/vae_working_memory.py b/invokeai/backend/util/vae_working_memory.py index 4c92894f1ee..550947b53b4 100644 --- a/invokeai/backend/util/vae_working_memory.py +++ b/invokeai/backend/util/vae_working_memory.py @@ -364,6 +364,28 @@ def _flux_vae_scaling_constant(operation: Literal["encode", "decode"], device: t return _FLUX_VAE_SCALING_CONSTANTS["miopen" if is_rocm else "cudnn"][operation] +def flux2_vae_attention_materializes(image_tensor: torch.Tensor, vae: AutoencoderKLFlux2, device: torch.device) -> bool: + """Whether encoding ``image_tensor`` untiled would materialize the FLUX.2 VAE mid-block's score matrix. + + False on CUDA, where a fused SDPA kernel takes the 512-wide head and the encode stays linear in area; true + on ROCm and MPS (see ``estimate_vae_working_memory_flux2``), where the matrix grows with the square of the + pixel count and only a tiled encode stays bounded. + """ + seq_len = (image_tensor.shape[-2] // _FLUX2_VAE_SPATIAL_COMPRESSION) * ( + image_tensor.shape[-1] // _FLUX2_VAE_SPATIAL_COMPRESSION + ) + return ( + sdpa_score_matrix_bytes( + device=device, + dtype=next(vae.parameters()).dtype, + num_heads=_FLUX2_VAE_MID_BLOCK_HEADS, + head_dim=_FLUX2_VAE_MID_BLOCK_HEAD_DIM, + seq_len=seq_len, + ) + > 0 + ) + + def estimate_vae_working_memory_flux2( operation: Literal["encode", "decode"], image_tensor: torch.Tensor, diff --git a/invokeai/frontend/api/openapi.json b/invokeai/frontend/api/openapi.json index a78b1e299b2..d026305847d 100644 --- a/invokeai/frontend/api/openapi.json +++ b/invokeai/frontend/api/openapi.json @@ -1424,6 +1424,9 @@ { "$ref": "#/components/schemas/Main_Diffusers_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Diffusers_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Diffusers_MiniMaxH3_Config" }, @@ -1469,6 +1472,9 @@ { "$ref": "#/components/schemas/Main_Checkpoint_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Checkpoint_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Checkpoint_Anima_Config" }, @@ -1502,6 +1508,9 @@ { "$ref": "#/components/schemas/Main_GGUF_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_GGUF_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_GGUF_Ideogram4_Config" }, @@ -1921,6 +1930,9 @@ { "$ref": "#/components/schemas/Main_Diffusers_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Diffusers_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Diffusers_MiniMaxH3_Config" }, @@ -1966,6 +1978,9 @@ { "$ref": "#/components/schemas/Main_Checkpoint_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Checkpoint_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Checkpoint_Anima_Config" }, @@ -1999,6 +2014,9 @@ { "$ref": "#/components/schemas/Main_GGUF_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_GGUF_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_GGUF_Ideogram4_Config" }, @@ -2418,6 +2436,9 @@ { "$ref": "#/components/schemas/Main_Diffusers_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Diffusers_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Diffusers_MiniMaxH3_Config" }, @@ -2463,6 +2484,9 @@ { "$ref": "#/components/schemas/Main_Checkpoint_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Checkpoint_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Checkpoint_Anima_Config" }, @@ -2496,6 +2520,9 @@ { "$ref": "#/components/schemas/Main_GGUF_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_GGUF_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_GGUF_Ideogram4_Config" }, @@ -2960,6 +2987,9 @@ { "$ref": "#/components/schemas/Main_Diffusers_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Diffusers_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Diffusers_MiniMaxH3_Config" }, @@ -3005,6 +3035,9 @@ { "$ref": "#/components/schemas/Main_Checkpoint_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Checkpoint_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Checkpoint_Anima_Config" }, @@ -3038,6 +3071,9 @@ { "$ref": "#/components/schemas/Main_GGUF_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_GGUF_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_GGUF_Ideogram4_Config" }, @@ -3529,6 +3565,9 @@ { "$ref": "#/components/schemas/Main_Diffusers_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Diffusers_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Diffusers_MiniMaxH3_Config" }, @@ -3574,6 +3613,9 @@ { "$ref": "#/components/schemas/Main_Checkpoint_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Checkpoint_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Checkpoint_Anima_Config" }, @@ -3607,6 +3649,9 @@ { "$ref": "#/components/schemas/Main_GGUF_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_GGUF_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_GGUF_Ideogram4_Config" }, @@ -4970,6 +5015,9 @@ { "$ref": "#/components/schemas/Main_Diffusers_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Diffusers_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Diffusers_MiniMaxH3_Config" }, @@ -5015,6 +5063,9 @@ { "$ref": "#/components/schemas/Main_Checkpoint_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Checkpoint_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Checkpoint_Anima_Config" }, @@ -5048,6 +5099,9 @@ { "$ref": "#/components/schemas/Main_GGUF_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_GGUF_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_GGUF_Ideogram4_Config" }, @@ -19585,6 +19639,9 @@ { "$ref": "#/components/schemas/Main_Diffusers_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Diffusers_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Diffusers_MiniMaxH3_Config" }, @@ -19630,6 +19687,9 @@ { "$ref": "#/components/schemas/Main_Checkpoint_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Checkpoint_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Checkpoint_Anima_Config" }, @@ -19663,6 +19723,9 @@ { "$ref": "#/components/schemas/Main_GGUF_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_GGUF_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_GGUF_Ideogram4_Config" }, @@ -20706,6 +20769,7 @@ "sdxl-refiner", "flux", "flux2", + "flux3", "cogview4", "z-image", "ernie-image", @@ -28929,6 +28993,10 @@ "qwen_image_2_1_img2img", "qwen_image_2_1_inpaint", "qwen_image_2_1_outpaint", + "flux3_txt2img", + "flux3_img2img", + "flux3_inpaint", + "flux3_outpaint", "wan_txt2img", "wan_img2img", "wan_inpaint", @@ -37629,84 +37697,594 @@ "title": "Flux2VariantType", "description": "FLUX.2 model variants." }, - "FluxConditioningCollectionOutput": { + "Flux3ConditioningField": { + "description": "A FLUX.3 conditioning tensor primitive value", + "properties": { + "conditioning_name": { + "description": "The name of conditioning tensor", + "title": "Conditioning Name", + "type": "string" + } + }, + "required": ["conditioning_name"], + "title": "Flux3ConditioningField", + "type": "object" + }, + "Flux3ConditioningOutput": { "class": "output", - "description": "Base class for nodes that output a collection of conditioning tensors", + "description": "Base class for nodes that output a FLUX.3 conditioning tensor.", "properties": { - "collection": { - "description": "The output conditioning tensors", + "conditioning": { + "$ref": "#/components/schemas/Flux3ConditioningField", + "description": "Conditioning tensor", "field_kind": "output", - "items": { - "$ref": "#/components/schemas/FluxConditioningField" - }, - "title": "Collection", - "type": "array", "ui_hidden": false }, "type": { - "const": "flux_conditioning_collection_output", - "default": "flux_conditioning_collection_output", + "const": "flux3_conditioning_output", + "default": "flux3_conditioning_output", "field_kind": "node_attribute", "title": "type", "type": "string" } }, - "required": ["output_meta", "collection", "type", "type"], - "title": "FluxConditioningCollectionOutput", + "required": ["output_meta", "conditioning", "type", "type"], + "title": "Flux3ConditioningOutput", "type": "object" }, - "FluxConditioningField": { - "description": "A conditioning tensor primitive value", + "Flux3DenoiseInvocation": { + "category": "latents", + "class": "invocation", + "classification": "prototype", + "description": "Run the denoising process with a FLUX.3 Image transformer (Klein or Klein Base).\n\nKlein is step-distilled (a flow map) and samples without CFG; Klein Base takes CFG with a negative\nconditioning. Reference images condition an edit: describe the result in the prompt and refer to them as\n, , ... in the order they are connected.", + "node_pack": "invokeai", "properties": { - "conditioning_name": { - "description": "The name of conditioning tensor", - "title": "Conditioning Name", + "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" }, - "mask": { + "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" + }, + "latents": { "anyOf": [ { - "$ref": "#/components/schemas/TensorField" + "$ref": "#/components/schemas/LatentsField" }, { "type": "null" } ], "default": null, - "description": "The mask associated with this conditioning tensor. Excluded regions should be set to False, included regions should be set to True." - } - }, - "required": ["conditioning_name"], - "title": "FluxConditioningField", - "type": "object" - }, - "FluxConditioningOutput": { - "class": "output", - "description": "Base class for nodes that output a single conditioning tensor", - "properties": { - "conditioning": { - "$ref": "#/components/schemas/FluxConditioningField", - "description": "Conditioning tensor", - "field_kind": "output", - "ui_hidden": false + "description": "Latents tensor", + "field_kind": "input", + "input": "connection", + "orig_default": null, + "orig_required": false + }, + "denoise_mask": { + "anyOf": [ + { + "$ref": "#/components/schemas/DenoiseMaskField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "A mask of the region to apply the denoising process to. Values of 0.0 represent the regions to be fully denoised, and 1.0 represent the regions to be preserved.", + "field_kind": "input", + "input": "connection", + "orig_default": null, + "orig_required": false + }, + "denoising_start": { + "default": 0.0, + "description": "When to start denoising, expressed a percentage of total steps", + "field_kind": "input", + "input": "any", + "maximum": 1, + "minimum": 0, + "orig_default": 0.0, + "orig_required": false, + "title": "Denoising Start", + "type": "number" + }, + "denoising_end": { + "default": 1.0, + "description": "When to stop denoising, expressed a percentage of total steps", + "field_kind": "input", + "input": "any", + "maximum": 1, + "minimum": 0, + "orig_default": 1.0, + "orig_required": false, + "title": "Denoising End", + "type": "number" + }, + "add_noise": { + "default": true, + "description": "Add noise based on denoising start.", + "field_kind": "input", + "input": "any", + "orig_default": true, + "orig_required": false, + "title": "Add Noise", + "type": "boolean" + }, + "transformer": { + "anyOf": [ + { + "$ref": "#/components/schemas/TransformerField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "FLUX.3 model (Transformer) to load", + "field_kind": "input", + "input": "connection", + "orig_required": true, + "title": "Transformer" + }, + "positive_conditioning": { + "anyOf": [ + { + "$ref": "#/components/schemas/Flux3ConditioningField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Positive conditioning tensor", + "field_kind": "input", + "input": "connection", + "orig_required": true + }, + "negative_conditioning": { + "anyOf": [ + { + "$ref": "#/components/schemas/Flux3ConditioningField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Negative conditioning. Used by Klein Base when CFG Scale is above 1.", + "field_kind": "input", + "input": "connection", + "orig_default": null, + "orig_required": false + }, + "cfg_scale": { + "default": 1.0, + "description": "Classifier-free guidance scale for Klein Base (3.5 recommended); 1 disables it. Klein takes no CFG.", + "field_kind": "input", + "input": "any", + "minimum": 1.0, + "orig_default": 1.0, + "orig_required": false, + "title": "CFG Scale", + "type": "number" + }, + "width": { + "default": 1024, + "description": "Width of the generated image.", + "exclusiveMinimum": 0, + "field_kind": "input", + "input": "any", + "multipleOf": 16, + "orig_default": 1024, + "orig_required": false, + "title": "Width", + "type": "integer" + }, + "height": { + "default": 1024, + "description": "Height of the generated image.", + "exclusiveMinimum": 0, + "field_kind": "input", + "input": "any", + "multipleOf": 16, + "orig_default": 1024, + "orig_required": false, + "title": "Height", + "type": "integer" + }, + "steps": { + "default": 16, + "description": "Number of denoising steps: 16 for Klein (4-16 work), 50 for Klein Base.", + "exclusiveMinimum": 0, + "field_kind": "input", + "input": "any", + "orig_default": 16, + "orig_required": false, + "title": "Steps", + "type": "integer" + }, + "seed": { + "default": 0, + "description": "Randomness seed for reproducibility.", + "field_kind": "input", + "input": "any", + "orig_default": 0, + "orig_required": false, + "title": "Seed", + "type": "integer" + }, + "vae": { + "anyOf": [ + { + "$ref": "#/components/schemas/VAEField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The FLUX.2 VAE: its latent statistics, and the encoder for reference images.", + "field_kind": "input", + "input": "connection", + "orig_required": true + }, + "kontext_conditioning": { + "anyOf": [ + { + "$ref": "#/components/schemas/FluxKontextConditioningField" + }, + { + "items": { + "$ref": "#/components/schemas/FluxKontextConditioningField" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Reference images to edit or combine (up to 10).", + "field_kind": "input", + "input": "connection", + "orig_default": null, + "orig_required": false, + "title": "Reference Images" }, "type": { - "const": "flux_conditioning_output", - "default": "flux_conditioning_output", + "const": "flux3_denoise", + "default": "flux3_denoise", "field_kind": "node_attribute", "title": "type", "type": "string" } }, - "required": ["output_meta", "conditioning", "type", "type"], - "title": "FluxConditioningOutput", - "type": "object" + "required": ["type", "id"], + "tags": ["image", "flux3", "flux", "denoise"], + "title": "Denoise - FLUX.3", + "type": "object", + "version": "1.0.0", + "output": { + "$ref": "#/components/schemas/LatentsOutput" + } }, - "FluxControlLoRALoaderInvocation": { + "Flux3ModelLoaderInvocation": { "category": "model", "class": "invocation", - "classification": "stable", - "description": "LoRA model and Image to use with FLUX transformer generation.", + "classification": "prototype", + "description": "Loads a FLUX.3 Image model (Klein or Klein Base), outputting its submodels.\n\nA Diffusers model brings its own VAE (the FLUX.2 VAE) and Qwen3-VL 4B text encoder; a single-file or GGUF\nmodel is only the transformer and needs both picked separately. A standalone pick overrides the bundled\ncomponent.", + "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" + }, + "model": { + "$ref": "#/components/schemas/ModelIdentifierField", + "description": "FLUX.3 model (Transformer) to load", + "field_kind": "input", + "input": "direct", + "orig_required": true, + "title": "Transformer", + "ui_model_base": ["flux3"], + "ui_model_type": ["main"] + }, + "vae_model": { + "anyOf": [ + { + "$ref": "#/components/schemas/ModelIdentifierField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Standalone VAE (the FLUX.2 VAE, which FLUX.3 shares). Required when Model is a single file; otherwise an override for the bundled VAE.", + "field_kind": "input", + "input": "direct", + "orig_default": null, + "orig_required": false, + "title": "VAE", + "ui_model_base": ["flux2"], + "ui_model_type": ["vae"] + }, + "qwen3_vl_encoder_model": { + "anyOf": [ + { + "$ref": "#/components/schemas/ModelIdentifierField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Standalone Qwen3-VL 4B encoder. Required when Model is a single file; otherwise an override for the encoder bundled in the Diffusers model.", + "field_kind": "input", + "input": "direct", + "orig_default": null, + "orig_required": false, + "title": "Qwen3-VL Encoder", + "ui_model_base": ["any"], + "ui_model_type": ["qwen3_vl_encoder"] + }, + "type": { + "const": "flux3_model_loader", + "default": "flux3_model_loader", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["model", "type", "id"], + "tags": ["model", "flux3", "flux"], + "title": "Main Model - FLUX.3", + "type": "object", + "version": "1.0.0", + "output": { + "$ref": "#/components/schemas/Flux3ModelLoaderOutput" + } + }, + "Flux3ModelLoaderOutput": { + "class": "output", + "description": "FLUX.3 model loader output.", + "properties": { + "transformer": { + "$ref": "#/components/schemas/TransformerField", + "description": "Transformer", + "field_kind": "output", + "title": "Transformer", + "ui_hidden": false + }, + "qwen3_vl_encoder": { + "$ref": "#/components/schemas/Qwen3VLEncoderField", + "description": "Qwen3-VL tokenizer and text encoder", + "field_kind": "output", + "title": "Qwen3-VL Encoder", + "ui_hidden": false + }, + "vae": { + "$ref": "#/components/schemas/VAEField", + "description": "VAE", + "field_kind": "output", + "title": "VAE", + "ui_hidden": false + }, + "type": { + "const": "flux3_model_loader_output", + "default": "flux3_model_loader_output", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["output_meta", "transformer", "qwen3_vl_encoder", "vae", "type", "type"], + "title": "Flux3ModelLoaderOutput", + "type": "object" + }, + "Flux3TextEncoderInvocation": { + "category": "conditioning", + "class": "invocation", + "classification": "prototype", + "description": "Encodes a prompt for FLUX.3 with the Qwen3-VL 4B text encoder.\n\nEight decoder layers are stacked per token. Write the prompt as a full description of the image; when\nediting, describe the result and refer to reference images as , , ... in the\norder they are connected.", + "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" + }, + "prompt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Text prompt describing the desired image.", + "field_kind": "input", + "input": "any", + "orig_required": true, + "title": "Prompt", + "ui_component": "textarea" + }, + "qwen3_vl_encoder": { + "anyOf": [ + { + "$ref": "#/components/schemas/Qwen3VLEncoderField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Qwen3-VL tokenizer and text encoder", + "field_kind": "input", + "input": "connection", + "orig_required": true, + "title": "Qwen3-VL Encoder" + }, + "type": { + "const": "flux3_text_encoder", + "default": "flux3_text_encoder", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["type", "id"], + "tags": ["prompt", "conditioning", "flux3", "flux"], + "title": "Prompt - FLUX.3", + "type": "object", + "version": "1.0.0", + "output": { + "$ref": "#/components/schemas/Flux3ConditioningOutput" + } + }, + "Flux3VariantType": { + "type": "string", + "enum": ["flux3_klein", "flux3_klein_base"], + "title": "Flux3VariantType", + "description": "FLUX.3 Image variants, by how the transformer is sampled.\n\nThe values carry a ``flux3_`` prefix: variant strings are resolved without their base, and ``klein_*``\nalready belongs to FLUX.2." + }, + "FluxConditioningCollectionOutput": { + "class": "output", + "description": "Base class for nodes that output a collection of conditioning tensors", + "properties": { + "collection": { + "description": "The output conditioning tensors", + "field_kind": "output", + "items": { + "$ref": "#/components/schemas/FluxConditioningField" + }, + "title": "Collection", + "type": "array", + "ui_hidden": false + }, + "type": { + "const": "flux_conditioning_collection_output", + "default": "flux_conditioning_collection_output", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["output_meta", "collection", "type", "type"], + "title": "FluxConditioningCollectionOutput", + "type": "object" + }, + "FluxConditioningField": { + "description": "A conditioning tensor primitive value", + "properties": { + "conditioning_name": { + "description": "The name of conditioning tensor", + "title": "Conditioning Name", + "type": "string" + }, + "mask": { + "anyOf": [ + { + "$ref": "#/components/schemas/TensorField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The mask associated with this conditioning tensor. Excluded regions should be set to False, included regions should be set to True." + } + }, + "required": ["conditioning_name"], + "title": "FluxConditioningField", + "type": "object" + }, + "FluxConditioningOutput": { + "class": "output", + "description": "Base class for nodes that output a single conditioning tensor", + "properties": { + "conditioning": { + "$ref": "#/components/schemas/FluxConditioningField", + "description": "Conditioning tensor", + "field_kind": "output", + "ui_hidden": false + }, + "type": { + "const": "flux_conditioning_output", + "default": "flux_conditioning_output", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["output_meta", "conditioning", "type", "type"], + "title": "FluxConditioningOutput", + "type": "object" + }, + "FluxControlLoRALoaderInvocation": { + "category": "model", + "class": "invocation", + "classification": "stable", + "description": "LoRA model and Image to use with FLUX transformer generation.", "node_pack": "invokeai", "properties": { "id": { @@ -43066,6 +43644,15 @@ { "$ref": "#/components/schemas/Flux2VaeEncodeInvocation" }, + { + "$ref": "#/components/schemas/Flux3DenoiseInvocation" + }, + { + "$ref": "#/components/schemas/Flux3ModelLoaderInvocation" + }, + { + "$ref": "#/components/schemas/Flux3TextEncoderInvocation" + }, { "$ref": "#/components/schemas/FluxControlLoRALoaderInvocation" }, @@ -43999,6 +44586,12 @@ { "$ref": "#/components/schemas/Flux2KleinModelLoaderOutput" }, + { + "$ref": "#/components/schemas/Flux3ConditioningOutput" + }, + { + "$ref": "#/components/schemas/Flux3ModelLoaderOutput" + }, { "$ref": "#/components/schemas/FluxConditioningCollectionOutput" }, @@ -53366,6 +53959,15 @@ { "$ref": "#/components/schemas/Flux2VaeEncodeInvocation" }, + { + "$ref": "#/components/schemas/Flux3DenoiseInvocation" + }, + { + "$ref": "#/components/schemas/Flux3ModelLoaderInvocation" + }, + { + "$ref": "#/components/schemas/Flux3TextEncoderInvocation" + }, { "$ref": "#/components/schemas/FluxControlLoRALoaderInvocation" }, @@ -54295,6 +54897,12 @@ { "$ref": "#/components/schemas/Flux2KleinModelLoaderOutput" }, + { + "$ref": "#/components/schemas/Flux3ConditioningOutput" + }, + { + "$ref": "#/components/schemas/Flux3ModelLoaderOutput" + }, { "$ref": "#/components/schemas/FluxConditioningCollectionOutput" }, @@ -54981,6 +55589,15 @@ { "$ref": "#/components/schemas/Flux2VaeEncodeInvocation" }, + { + "$ref": "#/components/schemas/Flux3DenoiseInvocation" + }, + { + "$ref": "#/components/schemas/Flux3ModelLoaderInvocation" + }, + { + "$ref": "#/components/schemas/Flux3TextEncoderInvocation" + }, { "$ref": "#/components/schemas/FluxControlLoRALoaderInvocation" }, @@ -56109,6 +56726,15 @@ "flux2_vae_encode": { "$ref": "#/components/schemas/LatentsOutput" }, + "flux3_denoise": { + "$ref": "#/components/schemas/LatentsOutput" + }, + "flux3_model_loader": { + "$ref": "#/components/schemas/Flux3ModelLoaderOutput" + }, + "flux3_text_encoder": { + "$ref": "#/components/schemas/Flux3ConditioningOutput" + }, "flux_control_lora_loader": { "$ref": "#/components/schemas/FluxControlLoRALoaderOutput" }, @@ -56986,6 +57612,9 @@ "flux2_pid_decode", "flux2_vae_decode", "flux2_vae_encode", + "flux3_denoise", + "flux3_model_loader", + "flux3_text_encoder", "flux_control_lora_loader", "flux_controlnet", "flux_denoise", @@ -57592,6 +58221,15 @@ { "$ref": "#/components/schemas/Flux2VaeEncodeInvocation" }, + { + "$ref": "#/components/schemas/Flux3DenoiseInvocation" + }, + { + "$ref": "#/components/schemas/Flux3ModelLoaderInvocation" + }, + { + "$ref": "#/components/schemas/Flux3TextEncoderInvocation" + }, { "$ref": "#/components/schemas/FluxControlLoRALoaderInvocation" }, @@ -58837,6 +59475,15 @@ { "$ref": "#/components/schemas/Flux2VaeEncodeInvocation" }, + { + "$ref": "#/components/schemas/Flux3DenoiseInvocation" + }, + { + "$ref": "#/components/schemas/Flux3ModelLoaderInvocation" + }, + { + "$ref": "#/components/schemas/Flux3TextEncoderInvocation" + }, { "$ref": "#/components/schemas/FluxControlLoRALoaderInvocation" }, @@ -72006,14 +72653,698 @@ "title": "Format", "default": "checkpoint" }, - "base": { - "type": "string", - "const": "flux2", - "title": "Base", - "default": "flux2" - }, + "base": { + "type": "string", + "const": "flux2", + "title": "Base", + "default": "flux2" + }, + "variant": { + "$ref": "#/components/schemas/Flux2VariantType" + } + }, + "type": "object", + "required": [ + "key", + "hash", + "path", + "file_size", + "name", + "description", + "source", + "source_type", + "source_api_response", + "source_url", + "cover_image", + "type", + "trigger_phrases", + "default_settings", + "config_path", + "format", + "base", + "variant" + ], + "title": "Main_Checkpoint_Flux2_Config", + "description": "Model config for FLUX.2 checkpoint models (e.g. Klein)." + }, + "Main_Checkpoint_Flux3_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" + }, + "type": { + "type": "string", + "const": "main", + "title": "Type", + "default": "main" + }, + "trigger_phrases": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array", + "uniqueItems": true + }, + { + "type": "null" + } + ], + "title": "Trigger Phrases", + "description": "Set of trigger phrases for this model" + }, + "default_settings": { + "anyOf": [ + { + "$ref": "#/components/schemas/MainModelDefaultSettings" + }, + { + "type": "null" + } + ], + "description": "Default settings for this model" + }, + "config_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Config Path", + "description": "Path to the config for this model, if any." + }, + "base": { + "type": "string", + "const": "flux3", + "title": "Base", + "default": "flux3" + }, + "format": { + "type": "string", + "const": "checkpoint", + "title": "Format", + "default": "checkpoint" + }, + "variant": { + "$ref": "#/components/schemas/Flux3VariantType" + } + }, + "type": "object", + "required": [ + "key", + "hash", + "path", + "file_size", + "name", + "description", + "source", + "source_type", + "source_api_response", + "source_url", + "cover_image", + "type", + "trigger_phrases", + "default_settings", + "config_path", + "base", + "format", + "variant" + ], + "title": "Main_Checkpoint_Flux3_Config", + "description": "Model config for FLUX.3 Image single-file transformers (BFL `model.safetensors`, ComfyUI bf16)." + }, + "Main_Checkpoint_Ideogram4_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" + }, + "type": { + "type": "string", + "const": "main", + "title": "Type", + "default": "main" + }, + "trigger_phrases": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array", + "uniqueItems": true + }, + { + "type": "null" + } + ], + "title": "Trigger Phrases", + "description": "Set of trigger phrases for this model" + }, + "default_settings": { + "anyOf": [ + { + "$ref": "#/components/schemas/MainModelDefaultSettings" + }, + { + "type": "null" + } + ], + "description": "Default settings for this model" + }, + "config_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Config Path", + "description": "Path to the config for this model, if any." + }, + "base": { + "type": "string", + "const": "ideogram-4", + "title": "Base", + "default": "ideogram-4" + }, + "format": { + "type": "string", + "const": "checkpoint", + "title": "Format", + "default": "checkpoint" + }, + "branch": { + "type": "string", + "enum": ["conditional", "unconditional"], + "title": "Branch", + "description": "Which of Ideogram 4's two transformer branches this file holds. Read from the file's `model_type` metadata where it has any, and from the filename otherwise \u2014 the released int8 build records no metadata at all, so keep those files under their published names. Rename and re-install to correct it." + } + }, + "type": "object", + "required": [ + "key", + "hash", + "path", + "file_size", + "name", + "description", + "source", + "source_type", + "source_api_response", + "source_url", + "cover_image", + "type", + "trigger_phrases", + "default_settings", + "config_path", + "base", + "format", + "branch" + ], + "title": "Main_Checkpoint_Ideogram4_Config", + "description": "Model config for Ideogram 4 single-file transformer checkpoints (safetensors).\n\nOne file holds ONE of the two dual-branch transformers. The Qwen3-VL 8B text encoder and the\nFLUX.2 VAE are separate models, selected on the loader node; the diffusers pipeline folder\n(``Main_Diffusers_Ideogram4_Config``) is the variant that bundles everything.\n\nQuantization: plain bf16/fp16, ComfyUI \"scaled fp8\" and ComfyUI ``int8_tensorwise``(+convrot)\nall load. The ``nvfp4`` repack of the same files is recognised and rejected with\n`InvalidMatchError`, which keeps it out of the database entirely -- `NotAMatchError` would let\nit fall through to `Unknown_Config` and register a 5 GiB file that nothing can ever load." + }, + "Main_Checkpoint_Krea2_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" + }, + "type": { + "type": "string", + "const": "main", + "title": "Type", + "default": "main" + }, + "trigger_phrases": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array", + "uniqueItems": true + }, + { + "type": "null" + } + ], + "title": "Trigger Phrases", + "description": "Set of trigger phrases for this model" + }, + "default_settings": { + "anyOf": [ + { + "$ref": "#/components/schemas/MainModelDefaultSettings" + }, + { + "type": "null" + } + ], + "description": "Default settings for this model" + }, + "config_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Config Path", + "description": "Path to the config for this model, if any." + }, + "base": { + "type": "string", + "const": "krea-2", + "title": "Base", + "default": "krea-2" + }, + "format": { + "type": "string", + "const": "checkpoint", + "title": "Format", + "default": "checkpoint" + }, + "variant": { + "$ref": "#/components/schemas/Krea2VariantType" + } + }, + "type": "object", + "required": [ + "key", + "hash", + "path", + "file_size", + "name", + "description", + "source", + "source_type", + "source_api_response", + "source_url", + "cover_image", + "type", + "trigger_phrases", + "default_settings", + "config_path", + "base", + "format", + "variant" + ], + "title": "Main_Checkpoint_Krea2_Config", + "description": "Model config for Krea-2 single-file checkpoint models (safetensors, etc)." + }, + "Main_Checkpoint_LTX2_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" + }, + "type": { + "type": "string", + "const": "main", + "title": "Type", + "default": "main" + }, + "trigger_phrases": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array", + "uniqueItems": true + }, + { + "type": "null" + } + ], + "title": "Trigger Phrases", + "description": "Set of trigger phrases for this model" + }, + "default_settings": { + "anyOf": [ + { + "$ref": "#/components/schemas/MainModelDefaultSettings" + }, + { + "type": "null" + } + ], + "description": "Default settings for this model" + }, + "config_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Config Path", + "description": "Path to the config for this model, if any." + }, + "base": { + "type": "string", + "const": "ltx-2", + "title": "Base", + "default": "ltx-2" + }, + "format": { + "type": "string", + "const": "checkpoint", + "title": "Format", + "default": "checkpoint" + }, "variant": { - "$ref": "#/components/schemas/Flux2VariantType" + "$ref": "#/components/schemas/LTX2VariantType" + }, + "generation": { + "type": "string", + "title": "Generation", + "description": "The LTX-2 generation the transformer belongs to, e.g. '2.5'." } }, "type": "object", @@ -72033,14 +73364,15 @@ "trigger_phrases", "default_settings", "config_path", - "format", "base", - "variant" + "format", + "variant", + "generation" ], - "title": "Main_Checkpoint_Flux2_Config", - "description": "Model config for FLUX.2 checkpoint models (e.g. Klein)." + "title": "Main_Checkpoint_LTX2_Config", + "description": "An LTX-2 single-file transformer (safetensors) in the official key layout.\n\nCovers the bf16, Comfy ``int8_tensorwise``(+convrot) and ``nvfp4`` releases; the quantization\nscheme is read from the file's own markers by the loader, not recorded here. The file may hold\nonly the transformer (the 2.5 releases) or bundle other components beside it (earlier\ngenerations) -- either way everything else comes from an installed LTX-2 component folder.\n\nDev and Distilled transformers are key-for-key identical, so the FILENAME is the variant\nclassifier and ``variant`` is the user-correctable override for renamed files. A misclassified\nvariant runs but samples with the wrong recipe (guided schedule vs fixed distilled sigmas)." }, - "Main_Checkpoint_Ideogram4_Config": { + "Main_Checkpoint_MiniMaxH3_Config": { "properties": { "key": { "type": "string", @@ -72171,9 +73503,9 @@ }, "base": { "type": "string", - "const": "ideogram-4", + "const": "minimax-h3", "title": "Base", - "default": "ideogram-4" + "default": "minimax-h3" }, "format": { "type": "string", @@ -72181,11 +73513,13 @@ "title": "Format", "default": "checkpoint" }, - "branch": { - "type": "string", - "enum": ["conditional", "unconditional"], - "title": "Branch", - "description": "Which of Ideogram 4's two transformer branches this file holds. Read from the file's `model_type` metadata where it has any, and from the filename otherwise \u2014 the released int8 build records no metadata at all, so keep those files under their published names. Rename and re-install to correct it." + "variant": { + "$ref": "#/components/schemas/MiniMaxH3VariantType" + }, + "pruned": { + "type": "boolean", + "title": "Pruned", + "description": "Whether this is an AdaLN-pruned ('adaln curves') checkpoint." } }, "type": "object", @@ -72207,12 +73541,13 @@ "config_path", "base", "format", - "branch" + "variant", + "pruned" ], - "title": "Main_Checkpoint_Ideogram4_Config", - "description": "Model config for Ideogram 4 single-file transformer checkpoints (safetensors).\n\nOne file holds ONE of the two dual-branch transformers. The Qwen3-VL 8B text encoder and the\nFLUX.2 VAE are separate models, selected on the loader node; the diffusers pipeline folder\n(``Main_Diffusers_Ideogram4_Config``) is the variant that bundles everything.\n\nQuantization: plain bf16/fp16, ComfyUI \"scaled fp8\" and ComfyUI ``int8_tensorwise``(+convrot)\nall load. The ``nvfp4`` repack of the same files is recognised and rejected with\n`InvalidMatchError`, which keeps it out of the database entirely -- `NotAMatchError` would let\nit fall through to `Unknown_Config` and register a 5 GiB file that nothing can ever load." + "title": "Main_Checkpoint_MiniMaxH3_Config", + "description": "Model config for MiniMax H3 single-file transformer checkpoints (safetensors).\n\nCovers MiniMax's single-file FL2VA transformer repacks (Comfy-Org and mirrors): bf16 or\nComfy ``int8_tensorwise``(+convrot) quantized, full or AdaLN-pruned (\"adaln curves\"). The\nfile holds ONLY the transformer - the text encoder, VAEs, tokenizer and processor must come\nfrom an installed H3 diffusers-layout folder.\n\nThe FL2VA and Ref2VA task transformers are key-for-key (and, except the non-pruned\nint8_convrot repacks, byte-size) indistinguishable, so the FILENAME is the variant\nclassifier and ``variant`` is the user-correctable override for renamed files (e.g.\nre-uploads). A misclassified variant loads and runs but produces degraded output - FL2VA\nexpects no reference conditioning rows, Ref2VA expects them - which is why the override\nexists rather than any attempt at content sniffing." }, - "Main_Checkpoint_Krea2_Config": { + "Main_Checkpoint_QwenImage21_Config": { "properties": { "key": { "type": "string", @@ -72343,9 +73678,9 @@ }, "base": { "type": "string", - "const": "krea-2", + "const": "qwen-image-2-1", "title": "Base", - "default": "krea-2" + "default": "qwen-image-2-1" }, "format": { "type": "string", @@ -72354,7 +73689,7 @@ "default": "checkpoint" }, "variant": { - "$ref": "#/components/schemas/Krea2VariantType" + "$ref": "#/components/schemas/QwenImage21VariantType" } }, "type": "object", @@ -72378,10 +73713,10 @@ "format", "variant" ], - "title": "Main_Checkpoint_Krea2_Config", - "description": "Model config for Krea-2 single-file checkpoint models (safetensors, etc)." + "title": "Main_Checkpoint_QwenImage21_Config", + "description": "Model config for Qwen-Image-2.1 single-file transformers (bf16, ComfyUI fp8 scaled or int8 convrot)." }, - "Main_Checkpoint_LTX2_Config": { + "Main_Checkpoint_QwenImage_Config": { "properties": { "key": { "type": "string", @@ -72512,9 +73847,9 @@ }, "base": { "type": "string", - "const": "ltx-2", + "const": "qwen-image", "title": "Base", - "default": "ltx-2" + "default": "qwen-image" }, "format": { "type": "string", @@ -72523,187 +73858,14 @@ "default": "checkpoint" }, "variant": { - "$ref": "#/components/schemas/LTX2VariantType" - }, - "generation": { - "type": "string", - "title": "Generation", - "description": "The LTX-2 generation the transformer belongs to, e.g. '2.5'." - } - }, - "type": "object", - "required": [ - "key", - "hash", - "path", - "file_size", - "name", - "description", - "source", - "source_type", - "source_api_response", - "source_url", - "cover_image", - "type", - "trigger_phrases", - "default_settings", - "config_path", - "base", - "format", - "variant", - "generation" - ], - "title": "Main_Checkpoint_LTX2_Config", - "description": "An LTX-2 single-file transformer (safetensors) in the official key layout.\n\nCovers the bf16, Comfy ``int8_tensorwise``(+convrot) and ``nvfp4`` releases; the quantization\nscheme is read from the file's own markers by the loader, not recorded here. The file may hold\nonly the transformer (the 2.5 releases) or bundle other components beside it (earlier\ngenerations) -- either way everything else comes from an installed LTX-2 component folder.\n\nDev and Distilled transformers are key-for-key identical, so the FILENAME is the variant\nclassifier and ``variant`` is the user-correctable override for renamed files. A misclassified\nvariant runs but samples with the wrong recipe (guided schedule vs fixed distilled sigmas)." - }, - "Main_Checkpoint_MiniMaxH3_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" - }, - "type": { - "type": "string", - "const": "main", - "title": "Type", - "default": "main" - }, - "trigger_phrases": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array", - "uniqueItems": true - }, - { - "type": "null" - } - ], - "title": "Trigger Phrases", - "description": "Set of trigger phrases for this model" - }, - "default_settings": { - "anyOf": [ - { - "$ref": "#/components/schemas/MainModelDefaultSettings" - }, - { - "type": "null" - } - ], - "description": "Default settings for this model" - }, - "config_path": { "anyOf": [ { - "type": "string" + "$ref": "#/components/schemas/QwenImageVariantType" }, { "type": "null" } - ], - "title": "Config Path", - "description": "Path to the config for this model, if any." - }, - "base": { - "type": "string", - "const": "minimax-h3", - "title": "Base", - "default": "minimax-h3" - }, - "format": { - "type": "string", - "const": "checkpoint", - "title": "Format", - "default": "checkpoint" - }, - "variant": { - "$ref": "#/components/schemas/MiniMaxH3VariantType" - }, - "pruned": { - "type": "boolean", - "title": "Pruned", - "description": "Whether this is an AdaLN-pruned ('adaln curves') checkpoint." + ] } }, "type": "object", @@ -72725,13 +73887,12 @@ "config_path", "base", "format", - "variant", - "pruned" + "variant" ], - "title": "Main_Checkpoint_MiniMaxH3_Config", - "description": "Model config for MiniMax H3 single-file transformer checkpoints (safetensors).\n\nCovers MiniMax's single-file FL2VA transformer repacks (Comfy-Org and mirrors): bf16 or\nComfy ``int8_tensorwise``(+convrot) quantized, full or AdaLN-pruned (\"adaln curves\"). The\nfile holds ONLY the transformer - the text encoder, VAEs, tokenizer and processor must come\nfrom an installed H3 diffusers-layout folder.\n\nThe FL2VA and Ref2VA task transformers are key-for-key (and, except the non-pruned\nint8_convrot repacks, byte-size) indistinguishable, so the FILENAME is the variant\nclassifier and ``variant`` is the user-correctable override for renamed files (e.g.\nre-uploads). A misclassified variant loads and runs but produces degraded output - FL2VA\nexpects no reference conditioning rows, Ref2VA expects them - which is why the override\nexists rather than any attempt at content sniffing." + "title": "Main_Checkpoint_QwenImage_Config", + "description": "Model config for Qwen Image single-file checkpoint models (safetensors, etc).\n\nCovers raw bf16/fp16 checkpoints and ComfyUI-style fp8_scaled and nvfp4 checkpoints.\nThe loader keeps scaled fp8 weights when fp8 compute is available or the\n`default_settings.fp8_storage` toggle is on (which also re-casts the rest to fp8),\nand dequantizes them to bf16 at load time otherwise." }, - "Main_Checkpoint_QwenImage21_Config": { + "Main_Checkpoint_SD1_Config": { "properties": { "key": { "type": "string", @@ -72860,196 +74021,23 @@ "title": "Config Path", "description": "Path to the config for this model, if any." }, - "base": { - "type": "string", - "const": "qwen-image-2-1", - "title": "Base", - "default": "qwen-image-2-1" - }, "format": { "type": "string", "const": "checkpoint", "title": "Format", "default": "checkpoint" }, - "variant": { - "$ref": "#/components/schemas/QwenImage21VariantType" - } - }, - "type": "object", - "required": [ - "key", - "hash", - "path", - "file_size", - "name", - "description", - "source", - "source_type", - "source_api_response", - "source_url", - "cover_image", - "type", - "trigger_phrases", - "default_settings", - "config_path", - "base", - "format", - "variant" - ], - "title": "Main_Checkpoint_QwenImage21_Config", - "description": "Model config for Qwen-Image-2.1 single-file transformers (bf16, ComfyUI fp8 scaled or int8 convrot)." - }, - "Main_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" - }, - "type": { - "type": "string", - "const": "main", - "title": "Type", - "default": "main" - }, - "trigger_phrases": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array", - "uniqueItems": true - }, - { - "type": "null" - } - ], - "title": "Trigger Phrases", - "description": "Set of trigger phrases for this model" - }, - "default_settings": { - "anyOf": [ - { - "$ref": "#/components/schemas/MainModelDefaultSettings" - }, - { - "type": "null" - } - ], - "description": "Default settings for this model" + "prediction_type": { + "$ref": "#/components/schemas/SchedulerPredictionType" }, - "config_path": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Config Path", - "description": "Path to the config for this model, if any." + "variant": { + "$ref": "#/components/schemas/ModelVariantType" }, "base": { "type": "string", - "const": "qwen-image", + "const": "sd-1", "title": "Base", - "default": "qwen-image" - }, - "format": { - "type": "string", - "const": "checkpoint", - "title": "Format", - "default": "checkpoint" - }, - "variant": { - "anyOf": [ - { - "$ref": "#/components/schemas/QwenImageVariantType" - }, - { - "type": "null" - } - ] + "default": "sd-1" } }, "type": "object", @@ -73069,14 +74057,14 @@ "trigger_phrases", "default_settings", "config_path", - "base", "format", - "variant" + "prediction_type", + "variant", + "base" ], - "title": "Main_Checkpoint_QwenImage_Config", - "description": "Model config for Qwen Image single-file checkpoint models (safetensors, etc).\n\nCovers raw bf16/fp16 checkpoints and ComfyUI-style fp8_scaled and nvfp4 checkpoints.\nThe loader keeps scaled fp8 weights when fp8 compute is available or the\n`default_settings.fp8_storage` toggle is on (which also re-casts the rest to fp8),\nand dequantizes them to bf16 at load time otherwise." + "title": "Main_Checkpoint_SD1_Config" }, - "Main_Checkpoint_SD1_Config": { + "Main_Checkpoint_SD2_Config": { "properties": { "key": { "type": "string", @@ -73219,9 +74207,9 @@ }, "base": { "type": "string", - "const": "sd-1", + "const": "sd-2", "title": "Base", - "default": "sd-1" + "default": "sd-2" } }, "type": "object", @@ -73246,9 +74234,9 @@ "variant", "base" ], - "title": "Main_Checkpoint_SD1_Config" + "title": "Main_Checkpoint_SD2_Config" }, - "Main_Checkpoint_SD2_Config": { + "Main_Checkpoint_SDXLRefiner_Config": { "properties": { "key": { "type": "string", @@ -73391,9 +74379,9 @@ }, "base": { "type": "string", - "const": "sd-2", + "const": "sdxl-refiner", "title": "Base", - "default": "sd-2" + "default": "sdxl-refiner" } }, "type": "object", @@ -73418,9 +74406,9 @@ "variant", "base" ], - "title": "Main_Checkpoint_SD2_Config" + "title": "Main_Checkpoint_SDXLRefiner_Config" }, - "Main_Checkpoint_SDXLRefiner_Config": { + "Main_Checkpoint_SDXL_Config": { "properties": { "key": { "type": "string", @@ -73563,9 +74551,9 @@ }, "base": { "type": "string", - "const": "sdxl-refiner", + "const": "sdxl", "title": "Base", - "default": "sdxl-refiner" + "default": "sdxl" } }, "type": "object", @@ -73590,9 +74578,9 @@ "variant", "base" ], - "title": "Main_Checkpoint_SDXLRefiner_Config" + "title": "Main_Checkpoint_SDXL_Config" }, - "Main_Checkpoint_SDXL_Config": { + "Main_Checkpoint_Wan_Config": { "properties": { "key": { "type": "string", @@ -73721,23 +74709,27 @@ "title": "Config Path", "description": "Path to the config for this model, if any." }, + "base": { + "type": "string", + "const": "wan", + "title": "Base", + "default": "wan" + }, "format": { "type": "string", "const": "checkpoint", "title": "Format", "default": "checkpoint" }, - "prediction_type": { - "$ref": "#/components/schemas/SchedulerPredictionType" - }, "variant": { - "$ref": "#/components/schemas/ModelVariantType" + "$ref": "#/components/schemas/WanVariantType" }, - "base": { + "expert": { "type": "string", - "const": "sdxl", - "title": "Base", - "default": "sdxl" + "enum": ["high", "low", "none"], + "title": "Expert", + "description": "For Wan 2.2 A14B's dual-expert MoE: 'high' for the high-noise expert, 'low' for the low-noise expert. 'none' for single-transformer models (TI2V-5B).", + "default": "none" } }, "type": "object", @@ -73757,14 +74749,15 @@ "trigger_phrases", "default_settings", "config_path", + "base", "format", - "prediction_type", "variant", - "base" + "expert" ], - "title": "Main_Checkpoint_SDXL_Config" + "title": "Main_Checkpoint_Wan_Config", + "description": "Model config for single-file Wan 2.2 transformer checkpoints (safetensors).\n\nThis is the format the community ships on CivitAI and in ComfyUI-oriented\nHugging Face repos: one ``.safetensors`` per transformer, in either the native\nupstream key layout or the diffusers one, optionally under a\n``model.diffusion_model.`` prefix, and optionally ComfyUI ``fp8_scaled``\nquantized. The loader normalises all of those.\n\nAs with GGUF, A14B's MoE arrives as two files (one per expert); ``expert``\nrecords which one this is so the Wan model loader invocation can pair them.\nTI2V-5B is single-transformer and stores ``expert='none'``." }, - "Main_Checkpoint_Wan_Config": { + "Main_Checkpoint_ZImage_Config": { "properties": { "key": { "type": "string", @@ -73895,9 +74888,9 @@ }, "base": { "type": "string", - "const": "wan", + "const": "z-image", "title": "Base", - "default": "wan" + "default": "z-image" }, "format": { "type": "string", @@ -73906,14 +74899,7 @@ "default": "checkpoint" }, "variant": { - "$ref": "#/components/schemas/WanVariantType" - }, - "expert": { - "type": "string", - "enum": ["high", "low", "none"], - "title": "Expert", - "description": "For Wan 2.2 A14B's dual-expert MoE: 'high' for the high-noise expert, 'low' for the low-noise expert. 'none' for single-transformer models (TI2V-5B).", - "default": "none" + "$ref": "#/components/schemas/ZImageVariantType" } }, "type": "object", @@ -73935,13 +74921,12 @@ "config_path", "base", "format", - "variant", - "expert" + "variant" ], - "title": "Main_Checkpoint_Wan_Config", - "description": "Model config for single-file Wan 2.2 transformer checkpoints (safetensors).\n\nThis is the format the community ships on CivitAI and in ComfyUI-oriented\nHugging Face repos: one ``.safetensors`` per transformer, in either the native\nupstream key layout or the diffusers one, optionally under a\n``model.diffusion_model.`` prefix, and optionally ComfyUI ``fp8_scaled``\nquantized. The loader normalises all of those.\n\nAs with GGUF, A14B's MoE arrives as two files (one per expert); ``expert``\nrecords which one this is so the Wan model loader invocation can pair them.\nTI2V-5B is single-transformer and stores ``expert='none'``." + "title": "Main_Checkpoint_ZImage_Config", + "description": "Model config for Z-Image single-file checkpoint models (safetensors, etc)." }, - "Main_Checkpoint_ZImage_Config": { + "Main_Diffusers_CogView4_Config": { "properties": { "key": { "type": "string", @@ -74058,32 +75043,21 @@ ], "description": "Default settings for this model" }, - "config_path": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Config Path", - "description": "Path to the config for this model, if any." - }, - "base": { - "type": "string", - "const": "z-image", - "title": "Base", - "default": "z-image" - }, "format": { "type": "string", - "const": "checkpoint", + "const": "diffusers", "title": "Format", - "default": "checkpoint" + "default": "diffusers" }, - "variant": { - "$ref": "#/components/schemas/ZImageVariantType" + "repo_variant": { + "$ref": "#/components/schemas/ModelRepoVariant", + "default": "" + }, + "base": { + "type": "string", + "const": "cogview4", + "title": "Base", + "default": "cogview4" } }, "type": "object", @@ -74102,15 +75076,13 @@ "type", "trigger_phrases", "default_settings", - "config_path", - "base", "format", - "variant" + "repo_variant", + "base" ], - "title": "Main_Checkpoint_ZImage_Config", - "description": "Model config for Z-Image single-file checkpoint models (safetensors, etc)." + "title": "Main_Diffusers_CogView4_Config" }, - "Main_Diffusers_CogView4_Config": { + "Main_Diffusers_ErnieImage_Config": { "properties": { "key": { "type": "string", @@ -74239,9 +75211,9 @@ }, "base": { "type": "string", - "const": "cogview4", + "const": "ernie-image", "title": "Base", - "default": "cogview4" + "default": "ernie-image" } }, "type": "object", @@ -74264,9 +75236,10 @@ "repo_variant", "base" ], - "title": "Main_Diffusers_CogView4_Config" + "title": "Main_Diffusers_ErnieImage_Config", + "description": "Model config for ERNIE-Image diffusers models (ERNIE-Image, ERNIE-Image-Turbo)." }, - "Main_Diffusers_ErnieImage_Config": { + "Main_Diffusers_FLUX_Config": { "properties": { "key": { "type": "string", @@ -74395,9 +75368,12 @@ }, "base": { "type": "string", - "const": "ernie-image", + "const": "flux", "title": "Base", - "default": "ernie-image" + "default": "flux" + }, + "variant": { + "$ref": "#/components/schemas/FluxVariantType" } }, "type": "object", @@ -74418,12 +75394,13 @@ "default_settings", "format", "repo_variant", - "base" + "base", + "variant" ], - "title": "Main_Diffusers_ErnieImage_Config", - "description": "Model config for ERNIE-Image diffusers models (ERNIE-Image, ERNIE-Image-Turbo)." + "title": "Main_Diffusers_FLUX_Config", + "description": "Model config for FLUX.1 models in diffusers format." }, - "Main_Diffusers_FLUX_Config": { + "Main_Diffusers_Flux2_Config": { "properties": { "key": { "type": "string", @@ -74552,12 +75529,12 @@ }, "base": { "type": "string", - "const": "flux", + "const": "flux2", "title": "Base", - "default": "flux" + "default": "flux2" }, "variant": { - "$ref": "#/components/schemas/FluxVariantType" + "$ref": "#/components/schemas/Flux2VariantType" } }, "type": "object", @@ -74581,10 +75558,10 @@ "base", "variant" ], - "title": "Main_Diffusers_FLUX_Config", - "description": "Model config for FLUX.1 models in diffusers format." + "title": "Main_Diffusers_Flux2_Config", + "description": "Model config for FLUX.2 models in diffusers format (FLUX.2 Klein and FLUX.2 [dev])." }, - "Main_Diffusers_Flux2_Config": { + "Main_Diffusers_Flux3_Config": { "properties": { "key": { "type": "string", @@ -74713,12 +75690,12 @@ }, "base": { "type": "string", - "const": "flux2", + "const": "flux3", "title": "Base", - "default": "flux2" + "default": "flux3" }, "variant": { - "$ref": "#/components/schemas/Flux2VariantType" + "$ref": "#/components/schemas/Flux3VariantType" } }, "type": "object", @@ -74742,8 +75719,8 @@ "base", "variant" ], - "title": "Main_Diffusers_Flux2_Config", - "description": "Model config for FLUX.2 models in diffusers format (FLUX.2 Klein and FLUX.2 [dev])." + "title": "Main_Diffusers_Flux3_Config", + "description": "Model config for FLUX.3 Image diffusers models (Klein and Klein Base).\n\nFLUX.3 ships as a Modular Diffusers pipeline: the root config is `modular_model_index.json`. The Hub\nrepositories also hold BFL's own single-file package at the root (`model.safetensors`, a BFL-format\n`config.json`, `ae.safetensors`) and quantized `variants/`; none of them is read here." }, "Main_Diffusers_Ideogram4_Config": { "properties": { @@ -76034,17 +77011,193 @@ "$ref": "#/components/schemas/ModelRepoVariant", "default": "" }, - "prediction_type": { - "$ref": "#/components/schemas/SchedulerPredictionType" - }, - "variant": { - "$ref": "#/components/schemas/ModelVariantType" - }, + "prediction_type": { + "$ref": "#/components/schemas/SchedulerPredictionType" + }, + "variant": { + "$ref": "#/components/schemas/ModelVariantType" + }, + "base": { + "type": "string", + "const": "sd-2", + "title": "Base", + "default": "sd-2" + } + }, + "type": "object", + "required": [ + "key", + "hash", + "path", + "file_size", + "name", + "description", + "source", + "source_type", + "source_api_response", + "source_url", + "cover_image", + "type", + "trigger_phrases", + "default_settings", + "format", + "repo_variant", + "prediction_type", + "variant", + "base" + ], + "title": "Main_Diffusers_SD2_Config" + }, + "Main_Diffusers_SD3_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" + }, + "type": { + "type": "string", + "const": "main", + "title": "Type", + "default": "main" + }, + "trigger_phrases": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array", + "uniqueItems": true + }, + { + "type": "null" + } + ], + "title": "Trigger Phrases", + "description": "Set of trigger phrases for this model" + }, + "default_settings": { + "anyOf": [ + { + "$ref": "#/components/schemas/MainModelDefaultSettings" + }, + { + "type": "null" + } + ], + "description": "Default settings for this model" + }, + "format": { + "type": "string", + "const": "diffusers", + "title": "Format", + "default": "diffusers" + }, + "repo_variant": { + "$ref": "#/components/schemas/ModelRepoVariant", + "default": "" + }, "base": { "type": "string", - "const": "sd-2", + "const": "sd-3", "title": "Base", - "default": "sd-2" + "default": "sd-3" + }, + "submodels": { + "anyOf": [ + { + "additionalProperties": { + "$ref": "#/components/schemas/SubmodelDefinition" + }, + "propertyNames": { + "$ref": "#/components/schemas/SubModelType" + }, + "type": "object" + }, + { + "type": "null" + } + ], + "title": "Submodels", + "description": "Loadable submodels in this model" } }, "type": "object", @@ -76065,13 +77218,12 @@ "default_settings", "format", "repo_variant", - "prediction_type", - "variant", - "base" + "base", + "submodels" ], - "title": "Main_Diffusers_SD2_Config" + "title": "Main_Diffusers_SD3_Config" }, - "Main_Diffusers_SD3_Config": { + "Main_Diffusers_SDXLRefiner_Config": { "properties": { "key": { "type": "string", @@ -76198,29 +77350,17 @@ "$ref": "#/components/schemas/ModelRepoVariant", "default": "" }, + "prediction_type": { + "$ref": "#/components/schemas/SchedulerPredictionType" + }, + "variant": { + "$ref": "#/components/schemas/ModelVariantType" + }, "base": { "type": "string", - "const": "sd-3", + "const": "sdxl-refiner", "title": "Base", - "default": "sd-3" - }, - "submodels": { - "anyOf": [ - { - "additionalProperties": { - "$ref": "#/components/schemas/SubmodelDefinition" - }, - "propertyNames": { - "$ref": "#/components/schemas/SubModelType" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "title": "Submodels", - "description": "Loadable submodels in this model" + "default": "sdxl-refiner" } }, "type": "object", @@ -76241,12 +77381,13 @@ "default_settings", "format", "repo_variant", - "base", - "submodels" + "prediction_type", + "variant", + "base" ], - "title": "Main_Diffusers_SD3_Config" + "title": "Main_Diffusers_SDXLRefiner_Config" }, - "Main_Diffusers_SDXLRefiner_Config": { + "Main_Diffusers_SDXL_Config": { "properties": { "key": { "type": "string", @@ -76381,9 +77522,9 @@ }, "base": { "type": "string", - "const": "sdxl-refiner", + "const": "sdxl", "title": "Base", - "default": "sdxl-refiner" + "default": "sdxl" } }, "type": "object", @@ -76408,9 +77549,9 @@ "variant", "base" ], - "title": "Main_Diffusers_SDXLRefiner_Config" + "title": "Main_Diffusers_SDXL_Config" }, - "Main_Diffusers_SDXL_Config": { + "Main_Diffusers_Wan_Config": { "properties": { "key": { "type": "string", @@ -76537,17 +77678,32 @@ "$ref": "#/components/schemas/ModelRepoVariant", "default": "" }, - "prediction_type": { - "$ref": "#/components/schemas/SchedulerPredictionType" - }, - "variant": { - "$ref": "#/components/schemas/ModelVariantType" - }, "base": { "type": "string", - "const": "sdxl", + "const": "wan", "title": "Base", - "default": "sdxl" + "default": "wan" + }, + "variant": { + "$ref": "#/components/schemas/WanVariantType" + }, + "has_dual_expert": { + "type": "boolean", + "title": "Has Dual Expert", + "description": "Whether this model ships two transformer experts (Wan 2.2 A14B MoE). False for TI2V-5B.", + "default": false + }, + "boundary_ratio": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Boundary Ratio", + "description": "MoE expert switch point as a fraction of num_train_timesteps (typically 1000). None for single-transformer models. Read from model_index.json by Diffusers' WanPipeline." } }, "type": "object", @@ -76568,13 +77724,15 @@ "default_settings", "format", "repo_variant", - "prediction_type", + "base", "variant", - "base" + "has_dual_expert", + "boundary_ratio" ], - "title": "Main_Diffusers_SDXL_Config" + "title": "Main_Diffusers_Wan_Config", + "description": "Model config for Wan 2.2 diffusers models.\n\nCovers both the dual-expert T2V-A14B family and the single-transformer TI2V-5B\nfamily. Variant is detected from the on-disk transformer config (latent channel\ncount) plus the presence of a sibling ``transformer_2/`` directory." }, - "Main_Diffusers_Wan_Config": { + "Main_Diffusers_ZImage_Config": { "properties": { "key": { "type": "string", @@ -76703,30 +77861,12 @@ }, "base": { "type": "string", - "const": "wan", + "const": "z-image", "title": "Base", - "default": "wan" + "default": "z-image" }, "variant": { - "$ref": "#/components/schemas/WanVariantType" - }, - "has_dual_expert": { - "type": "boolean", - "title": "Has Dual Expert", - "description": "Whether this model ships two transformer experts (Wan 2.2 A14B MoE). False for TI2V-5B.", - "default": false - }, - "boundary_ratio": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Boundary Ratio", - "description": "MoE expert switch point as a fraction of num_train_timesteps (typically 1000). None for single-transformer models. Read from model_index.json by Diffusers' WanPipeline." + "$ref": "#/components/schemas/ZImageVariantType" } }, "type": "object", @@ -76748,14 +77888,12 @@ "format", "repo_variant", "base", - "variant", - "has_dual_expert", - "boundary_ratio" + "variant" ], - "title": "Main_Diffusers_Wan_Config", - "description": "Model config for Wan 2.2 diffusers models.\n\nCovers both the dual-expert T2V-A14B family and the single-transformer TI2V-5B\nfamily. Variant is detected from the on-disk transformer config (latent channel\ncount) plus the presence of a sibling ``transformer_2/`` directory." + "title": "Main_Diffusers_ZImage_Config", + "description": "Model config for Z-Image diffusers models (Z-Image-Turbo, Z-Image-Base)." }, - "Main_Diffusers_ZImage_Config": { + "Main_GGUF_ErnieImage_Config": { "properties": { "key": { "type": "string", @@ -76872,24 +78010,29 @@ ], "description": "Default settings for this model" }, - "format": { - "type": "string", - "const": "diffusers", - "title": "Format", - "default": "diffusers" - }, - "repo_variant": { - "$ref": "#/components/schemas/ModelRepoVariant", - "default": "" + "config_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Config Path", + "description": "Path to the config for this model, if any." }, "base": { "type": "string", - "const": "z-image", + "const": "ernie-image", "title": "Base", - "default": "z-image" + "default": "ernie-image" }, - "variant": { - "$ref": "#/components/schemas/ZImageVariantType" + "format": { + "type": "string", + "const": "gguf_quantized", + "title": "Format", + "default": "gguf_quantized" } }, "type": "object", @@ -76908,15 +78051,14 @@ "type", "trigger_phrases", "default_settings", - "format", - "repo_variant", + "config_path", "base", - "variant" + "format" ], - "title": "Main_Diffusers_ZImage_Config", - "description": "Model config for Z-Image diffusers models (Z-Image-Turbo, Z-Image-Base)." + "title": "Main_GGUF_ErnieImage_Config", + "description": "Model config for GGUF-quantized ERNIE-Image transformers (single-file).\n\nThe community GGUFs carry the diffusers key layout unchanged, so the same fingerprint identifies\nthem. Their `general.architecture` says nothing about ERNIE -- unsloth's builds declare `wan`,\nothers `flux` -- so identification rests on the keys alone. As with the safetensors file, Turbo\nand base are told apart by the model name." }, - "Main_GGUF_ErnieImage_Config": { + "Main_GGUF_FLUX_Config": { "properties": { "key": { "type": "string", @@ -77047,15 +78189,18 @@ }, "base": { "type": "string", - "const": "ernie-image", + "const": "flux", "title": "Base", - "default": "ernie-image" + "default": "flux" }, "format": { "type": "string", "const": "gguf_quantized", "title": "Format", "default": "gguf_quantized" + }, + "variant": { + "$ref": "#/components/schemas/FluxVariantType" } }, "type": "object", @@ -77076,12 +78221,13 @@ "default_settings", "config_path", "base", - "format" + "format", + "variant" ], - "title": "Main_GGUF_ErnieImage_Config", - "description": "Model config for GGUF-quantized ERNIE-Image transformers (single-file).\n\nThe community GGUFs carry the diffusers key layout unchanged, so the same fingerprint identifies\nthem. Their `general.architecture` says nothing about ERNIE -- unsloth's builds declare `wan`,\nothers `flux` -- so identification rests on the keys alone. As with the safetensors file, Turbo\nand base are told apart by the model name." + "title": "Main_GGUF_FLUX_Config", + "description": "Model config for main checkpoint models." }, - "Main_GGUF_FLUX_Config": { + "Main_GGUF_Flux2_Config": { "properties": { "key": { "type": "string", @@ -77212,9 +78358,9 @@ }, "base": { "type": "string", - "const": "flux", + "const": "flux2", "title": "Base", - "default": "flux" + "default": "flux2" }, "format": { "type": "string", @@ -77223,7 +78369,7 @@ "default": "gguf_quantized" }, "variant": { - "$ref": "#/components/schemas/FluxVariantType" + "$ref": "#/components/schemas/Flux2VariantType" } }, "type": "object", @@ -77247,10 +78393,10 @@ "format", "variant" ], - "title": "Main_GGUF_FLUX_Config", - "description": "Model config for main checkpoint models." + "title": "Main_GGUF_Flux2_Config", + "description": "Model config for GGUF-quantized FLUX.2 checkpoint models (e.g. Klein)." }, - "Main_GGUF_Flux2_Config": { + "Main_GGUF_Flux3_Config": { "properties": { "key": { "type": "string", @@ -77381,9 +78527,9 @@ }, "base": { "type": "string", - "const": "flux2", + "const": "flux3", "title": "Base", - "default": "flux2" + "default": "flux3" }, "format": { "type": "string", @@ -77392,7 +78538,7 @@ "default": "gguf_quantized" }, "variant": { - "$ref": "#/components/schemas/Flux2VariantType" + "$ref": "#/components/schemas/Flux3VariantType" } }, "type": "object", @@ -77416,8 +78562,8 @@ "format", "variant" ], - "title": "Main_GGUF_Flux2_Config", - "description": "Model config for GGUF-quantized FLUX.2 checkpoint models (e.g. Klein)." + "title": "Main_GGUF_Flux3_Config", + "description": "Model config for GGUF-quantized FLUX.3 Image transformers (single-file)." }, "Main_GGUF_Ideogram4_Config": { "properties": { @@ -86122,6 +87268,9 @@ { "$ref": "#/components/schemas/Main_Diffusers_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Diffusers_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Diffusers_MiniMaxH3_Config" }, @@ -86167,6 +87316,9 @@ { "$ref": "#/components/schemas/Main_Checkpoint_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Checkpoint_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Checkpoint_Anima_Config" }, @@ -86200,6 +87352,9 @@ { "$ref": "#/components/schemas/Main_GGUF_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_GGUF_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_GGUF_Ideogram4_Config" }, @@ -86865,6 +88020,9 @@ { "$ref": "#/components/schemas/Main_Diffusers_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Diffusers_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Diffusers_MiniMaxH3_Config" }, @@ -86910,6 +88068,9 @@ { "$ref": "#/components/schemas/Main_Checkpoint_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Checkpoint_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Checkpoint_Anima_Config" }, @@ -86943,6 +88104,9 @@ { "$ref": "#/components/schemas/Main_GGUF_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_GGUF_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_GGUF_Ideogram4_Config" }, @@ -87493,6 +88657,9 @@ { "$ref": "#/components/schemas/Main_Diffusers_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Diffusers_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Diffusers_MiniMaxH3_Config" }, @@ -87538,6 +88705,9 @@ { "$ref": "#/components/schemas/Main_Checkpoint_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Checkpoint_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Checkpoint_Anima_Config" }, @@ -87571,6 +88741,9 @@ { "$ref": "#/components/schemas/Main_GGUF_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_GGUF_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_GGUF_Ideogram4_Config" }, @@ -87977,6 +89150,9 @@ { "$ref": "#/components/schemas/Main_Diffusers_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Diffusers_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Diffusers_MiniMaxH3_Config" }, @@ -88022,6 +89198,9 @@ { "$ref": "#/components/schemas/Main_Checkpoint_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Checkpoint_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Checkpoint_Anima_Config" }, @@ -88055,6 +89234,9 @@ { "$ref": "#/components/schemas/Main_GGUF_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_GGUF_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_GGUF_Ideogram4_Config" }, @@ -88695,6 +89877,9 @@ { "$ref": "#/components/schemas/Flux2VariantType" }, + { + "$ref": "#/components/schemas/Flux3VariantType" + }, { "$ref": "#/components/schemas/ZImageVariantType" }, @@ -88954,6 +90139,9 @@ { "$ref": "#/components/schemas/Main_Diffusers_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Diffusers_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Diffusers_MiniMaxH3_Config" }, @@ -88999,6 +90187,9 @@ { "$ref": "#/components/schemas/Main_Checkpoint_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_Checkpoint_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_Checkpoint_Anima_Config" }, @@ -89032,6 +90223,9 @@ { "$ref": "#/components/schemas/Main_GGUF_Krea2_Config" }, + { + "$ref": "#/components/schemas/Main_GGUF_Flux3_Config" + }, { "$ref": "#/components/schemas/Main_GGUF_Ideogram4_Config" }, @@ -102774,6 +103968,9 @@ { "$ref": "#/components/schemas/Flux2VariantType" }, + { + "$ref": "#/components/schemas/Flux3VariantType" + }, { "$ref": "#/components/schemas/ZImageVariantType" }, @@ -102967,6 +104164,9 @@ { "$ref": "#/components/schemas/Flux2VariantType" }, + { + "$ref": "#/components/schemas/Flux3VariantType" + }, { "$ref": "#/components/schemas/ZImageVariantType" }, @@ -104244,6 +105444,9 @@ { "$ref": "#/components/schemas/Flux2VariantType" }, + { + "$ref": "#/components/schemas/Flux3VariantType" + }, { "$ref": "#/components/schemas/ZImageVariantType" }, diff --git a/invokeai/frontend/api/schema.ts b/invokeai/frontend/api/schema.ts index 1c635d6f3c3..bb8072d0773 100644 --- a/invokeai/frontend/api/schema.ts +++ b/invokeai/frontend/api/schema.ts @@ -5514,7 +5514,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_Flux3_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_Flux3_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_Flux3_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"]; /** * AppVersion * @description App Version Response @@ -5888,7 +5888,7 @@ export type components = { * fallback/null value `BaseModelType.Any` for these models, instead of making the model base optional. * @enum {string} */ - BaseModelType: "any" | "sd-1" | "sd-2" | "sd-3" | "sdxl" | "sdxl-refiner" | "flux" | "flux2" | "cogview4" | "z-image" | "ernie-image" | "ideogram-4" | "external" | "qwen-image" | "anima" | "qwen-image-2-1" | "krea-2" | "wan" | "minimax-h3" | "ltx-2" | "unknown"; + BaseModelType: "any" | "sd-1" | "sd-2" | "sd-3" | "sdxl" | "sdxl-refiner" | "flux" | "flux2" | "flux3" | "cogview4" | "z-image" | "ernie-image" | "ideogram-4" | "external" | "qwen-image" | "anima" | "qwen-image-2-1" | "krea-2" | "wan" | "minimax-h3" | "ltx-2" | "unknown"; /** Batch */ Batch: { /** @@ -10438,7 +10438,7 @@ export type components = { * @description The generation mode that output this image * @default null */ - generation_mode?: ("txt2img" | "img2img" | "inpaint" | "outpaint" | "sdxl_txt2img" | "sdxl_img2img" | "sdxl_inpaint" | "sdxl_outpaint" | "flux_txt2img" | "flux_img2img" | "flux_inpaint" | "flux_outpaint" | "flux2_txt2img" | "flux2_img2img" | "flux2_inpaint" | "flux2_outpaint" | "sd3_txt2img" | "sd3_img2img" | "sd3_inpaint" | "sd3_outpaint" | "cogview4_txt2img" | "cogview4_img2img" | "cogview4_inpaint" | "cogview4_outpaint" | "z_image_txt2img" | "z_image_img2img" | "z_image_inpaint" | "z_image_outpaint" | "ernie_image_txt2img" | "ideogram4_txt2img" | "qwen_image_txt2img" | "qwen_image_img2img" | "qwen_image_inpaint" | "qwen_image_outpaint" | "anima_txt2img" | "anima_img2img" | "anima_inpaint" | "anima_outpaint" | "krea2_txt2img" | "krea2_img2img" | "krea2_inpaint" | "krea2_outpaint" | "qwen_image_2_1_txt2img" | "qwen_image_2_1_img2img" | "qwen_image_2_1_inpaint" | "qwen_image_2_1_outpaint" | "wan_txt2img" | "wan_img2img" | "wan_inpaint" | "wan_outpaint" | "wan_t2v" | "wan_i2v" | "wan_interpolate" | "wan_extend_video" | "minimax_h3_t2v" | "minimax_h3_i2v" | "ltx2_t2v" | "ltx2_i2v" | "ltx2_a2v" | "ltx2_v2a" | "ltx2_lf2v" | "ltx2_flf2v" | "ltx2_extend_video" | "minimax_h3_lf2v" | "minimax_h3_flf2v" | "minimax_h3_extend_video" | "minimax_h3_ref2v" | "minimax_h3_txt2img") | null; + generation_mode?: ("txt2img" | "img2img" | "inpaint" | "outpaint" | "sdxl_txt2img" | "sdxl_img2img" | "sdxl_inpaint" | "sdxl_outpaint" | "flux_txt2img" | "flux_img2img" | "flux_inpaint" | "flux_outpaint" | "flux2_txt2img" | "flux2_img2img" | "flux2_inpaint" | "flux2_outpaint" | "sd3_txt2img" | "sd3_img2img" | "sd3_inpaint" | "sd3_outpaint" | "cogview4_txt2img" | "cogview4_img2img" | "cogview4_inpaint" | "cogview4_outpaint" | "z_image_txt2img" | "z_image_img2img" | "z_image_inpaint" | "z_image_outpaint" | "ernie_image_txt2img" | "ideogram4_txt2img" | "qwen_image_txt2img" | "qwen_image_img2img" | "qwen_image_inpaint" | "qwen_image_outpaint" | "anima_txt2img" | "anima_img2img" | "anima_inpaint" | "anima_outpaint" | "krea2_txt2img" | "krea2_img2img" | "krea2_inpaint" | "krea2_outpaint" | "qwen_image_2_1_txt2img" | "qwen_image_2_1_img2img" | "qwen_image_2_1_inpaint" | "qwen_image_2_1_outpaint" | "flux3_txt2img" | "flux3_img2img" | "flux3_inpaint" | "flux3_outpaint" | "wan_txt2img" | "wan_img2img" | "wan_inpaint" | "wan_outpaint" | "wan_t2v" | "wan_i2v" | "wan_interpolate" | "wan_extend_video" | "minimax_h3_t2v" | "minimax_h3_i2v" | "ltx2_t2v" | "ltx2_i2v" | "ltx2_a2v" | "ltx2_v2a" | "ltx2_lf2v" | "ltx2_flf2v" | "ltx2_extend_video" | "minimax_h3_lf2v" | "minimax_h3_flf2v" | "minimax_h3_extend_video" | "minimax_h3_ref2v" | "minimax_h3_txt2img") | null; /** * Positive Prompt * @description The positive prompt parameter @@ -14698,6 +14698,280 @@ export type components = { * @enum {string} */ Flux2VariantType: "klein_4b" | "klein_4b_base" | "klein_9b" | "klein_9b_base" | "dev"; + /** + * Flux3ConditioningField + * @description A FLUX.3 conditioning tensor primitive value + */ + Flux3ConditioningField: { + /** + * Conditioning Name + * @description The name of conditioning tensor + */ + conditioning_name: string; + }; + /** + * Flux3ConditioningOutput + * @description Base class for nodes that output a FLUX.3 conditioning tensor. + */ + Flux3ConditioningOutput: { + /** @description Conditioning tensor */ + conditioning: components["schemas"]["Flux3ConditioningField"]; + /** + * type + * @default flux3_conditioning_output + * @constant + */ + type: "flux3_conditioning_output"; + }; + /** + * Denoise - FLUX.3 + * @description Run the denoising process with a FLUX.3 Image transformer (Klein or Klein Base). + * + * Klein is step-distilled (a flow map) and samples without CFG; Klein Base takes CFG with a negative + * conditioning. Reference images condition an edit: describe the result in the prompt and refer to them as + * , , ... in the order they are connected. + */ + Flux3DenoiseInvocation: { + /** + * 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 Latents tensor + * @default null + */ + latents?: components["schemas"]["LatentsField"] | null; + /** + * @description A mask of the region to apply the denoising process to. Values of 0.0 represent the regions to be fully denoised, and 1.0 represent the regions to be preserved. + * @default null + */ + denoise_mask?: components["schemas"]["DenoiseMaskField"] | null; + /** + * Denoising Start + * @description When to start denoising, expressed a percentage of total steps + * @default 0 + */ + denoising_start?: number; + /** + * Denoising End + * @description When to stop denoising, expressed a percentage of total steps + * @default 1 + */ + denoising_end?: number; + /** + * Add Noise + * @description Add noise based on denoising start. + * @default true + */ + add_noise?: boolean; + /** + * Transformer + * @description FLUX.3 model (Transformer) to load + * @default null + */ + transformer?: components["schemas"]["TransformerField"] | null; + /** + * @description Positive conditioning tensor + * @default null + */ + positive_conditioning?: components["schemas"]["Flux3ConditioningField"] | null; + /** + * @description Negative conditioning. Used by Klein Base when CFG Scale is above 1. + * @default null + */ + negative_conditioning?: components["schemas"]["Flux3ConditioningField"] | null; + /** + * CFG Scale + * @description Classifier-free guidance scale for Klein Base (3.5 recommended); 1 disables it. Klein takes no CFG. + * @default 1 + */ + cfg_scale?: number; + /** + * Width + * @description Width of the generated image. + * @default 1024 + */ + width?: number; + /** + * Height + * @description Height of the generated image. + * @default 1024 + */ + height?: number; + /** + * Steps + * @description Number of denoising steps: 16 for Klein (4-16 work), 50 for Klein Base. + * @default 16 + */ + steps?: number; + /** + * Seed + * @description Randomness seed for reproducibility. + * @default 0 + */ + seed?: number; + /** + * @description The FLUX.2 VAE: its latent statistics, and the encoder for reference images. + * @default null + */ + vae?: components["schemas"]["VAEField"] | null; + /** + * Reference Images + * @description Reference images to edit or combine (up to 10). + * @default null + */ + kontext_conditioning?: components["schemas"]["FluxKontextConditioningField"] | components["schemas"]["FluxKontextConditioningField"][] | null; + /** + * type + * @default flux3_denoise + * @constant + */ + type: "flux3_denoise"; + }; + /** + * Main Model - FLUX.3 + * @description Loads a FLUX.3 Image model (Klein or Klein Base), outputting its submodels. + * + * A Diffusers model brings its own VAE (the FLUX.2 VAE) and Qwen3-VL 4B text encoder; a single-file or GGUF + * model is only the transformer and needs both picked separately. A standalone pick overrides the bundled + * component. + */ + Flux3ModelLoaderInvocation: { + /** + * 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; + /** + * Transformer + * @description FLUX.3 model (Transformer) to load + */ + model: components["schemas"]["ModelIdentifierField"]; + /** + * VAE + * @description Standalone VAE (the FLUX.2 VAE, which FLUX.3 shares). Required when Model is a single file; otherwise an override for the bundled VAE. + * @default null + */ + vae_model?: components["schemas"]["ModelIdentifierField"] | null; + /** + * Qwen3-VL Encoder + * @description Standalone Qwen3-VL 4B encoder. Required when Model is a single file; otherwise an override for the encoder bundled in the Diffusers model. + * @default null + */ + qwen3_vl_encoder_model?: components["schemas"]["ModelIdentifierField"] | null; + /** + * type + * @default flux3_model_loader + * @constant + */ + type: "flux3_model_loader"; + }; + /** + * Flux3ModelLoaderOutput + * @description FLUX.3 model loader output. + */ + Flux3ModelLoaderOutput: { + /** + * Transformer + * @description Transformer + */ + transformer: components["schemas"]["TransformerField"]; + /** + * Qwen3-VL Encoder + * @description Qwen3-VL tokenizer and text encoder + */ + qwen3_vl_encoder: components["schemas"]["Qwen3VLEncoderField"]; + /** + * VAE + * @description VAE + */ + vae: components["schemas"]["VAEField"]; + /** + * type + * @default flux3_model_loader_output + * @constant + */ + type: "flux3_model_loader_output"; + }; + /** + * Prompt - FLUX.3 + * @description Encodes a prompt for FLUX.3 with the Qwen3-VL 4B text encoder. + * + * Eight decoder layers are stacked per token. Write the prompt as a full description of the image; when + * editing, describe the result and refer to reference images as , , ... in the + * order they are connected. + */ + Flux3TextEncoderInvocation: { + /** + * 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; + /** + * Prompt + * @description Text prompt describing the desired image. + * @default null + */ + prompt?: string | null; + /** + * Qwen3-VL Encoder + * @description Qwen3-VL tokenizer and text encoder + * @default null + */ + qwen3_vl_encoder?: components["schemas"]["Qwen3VLEncoderField"] | null; + /** + * type + * @default flux3_text_encoder + * @constant + */ + type: "flux3_text_encoder"; + }; + /** + * Flux3VariantType + * @description FLUX.3 Image variants, by how the transformer is sampled. + * + * The values carry a ``flux3_`` prefix: variant strings are resolved without their base, and ``klein_*`` + * already belongs to FLUX.2. + * @enum {string} + */ + Flux3VariantType: "flux3_klein" | "flux3_klein_base"; /** * FluxConditioningCollectionOutput * @description Base class for nodes that output a collection of conditioning tensors @@ -17286,7 +17560,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"]["Flux3DenoiseInvocation"] | components["schemas"]["Flux3ModelLoaderInvocation"] | components["schemas"]["Flux3TextEncoderInvocation"] | 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"]; }; /** * Edges @@ -17323,7 +17597,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"]["Flux3ConditioningOutput"] | components["schemas"]["Flux3ModelLoaderOutput"] | 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"]; }; /** * Errors @@ -22133,7 +22407,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"]["Flux3DenoiseInvocation"] | components["schemas"]["Flux3ModelLoaderInvocation"] | components["schemas"]["Flux3TextEncoderInvocation"] | 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 Source Id * @description The ID of the prepared invocation's source node @@ -22161,7 +22435,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"]["Flux3ConditioningOutput"] | components["schemas"]["Flux3ModelLoaderOutput"] | 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"]; }; /** * InvocationErrorEvent @@ -22215,7 +22489,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"]["Flux3DenoiseInvocation"] | components["schemas"]["Flux3ModelLoaderInvocation"] | components["schemas"]["Flux3TextEncoderInvocation"] | 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 Source Id * @description The ID of the prepared invocation's source node @@ -22345,6 +22619,9 @@ export type components = { flux2_pid_decode: components["schemas"]["ImageOutput"]; flux2_vae_decode: components["schemas"]["ImageOutput"]; flux2_vae_encode: components["schemas"]["LatentsOutput"]; + flux3_denoise: components["schemas"]["LatentsOutput"]; + flux3_model_loader: components["schemas"]["Flux3ModelLoaderOutput"]; + flux3_text_encoder: components["schemas"]["Flux3ConditioningOutput"]; flux_control_lora_loader: components["schemas"]["FluxControlLoRALoaderOutput"]; flux_controlnet: components["schemas"]["FluxControlNetOutput"]; flux_denoise: components["schemas"]["LatentsOutput"]; @@ -22660,7 +22937,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"]["Flux3DenoiseInvocation"] | components["schemas"]["Flux3ModelLoaderInvocation"] | components["schemas"]["Flux3TextEncoderInvocation"] | 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 Source Id * @description The ID of the prepared invocation's source node @@ -22765,7 +23042,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"]["Flux3DenoiseInvocation"] | components["schemas"]["Flux3ModelLoaderInvocation"] | components["schemas"]["Flux3TextEncoderInvocation"] | 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 Source Id * @description The ID of the prepared invocation's source node @@ -29777,6 +30054,95 @@ export type components = { base: "flux2"; variant: components["schemas"]["Flux2VariantType"]; }; + /** + * Main_Checkpoint_Flux3_Config + * @description Model config for FLUX.3 Image single-file transformers (BFL `model.safetensors`, ComfyUI bf16). + */ + Main_Checkpoint_Flux3_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; + /** + * Type + * @default main + * @constant + */ + type: "main"; + /** + * Trigger Phrases + * @description Set of trigger phrases for this model + */ + trigger_phrases: string[] | null; + /** @description Default settings for this model */ + default_settings: components["schemas"]["MainModelDefaultSettings"] | null; + /** + * Config Path + * @description Path to the config for this model, if any. + */ + config_path: string | null; + /** + * Base + * @default flux3 + * @constant + */ + base: "flux3"; + /** + * Format + * @default checkpoint + * @constant + */ + format: "checkpoint"; + variant: components["schemas"]["Flux3VariantType"]; + }; /** * Main_Checkpoint_Ideogram4_Config * @description Model config for Ideogram 4 single-file transformer checkpoints (safetensors). @@ -31243,6 +31609,96 @@ export type components = { base: "flux2"; variant: components["schemas"]["Flux2VariantType"]; }; + /** + * Main_Diffusers_Flux3_Config + * @description Model config for FLUX.3 Image diffusers models (Klein and Klein Base). + * + * FLUX.3 ships as a Modular Diffusers pipeline: the root config is `modular_model_index.json`. The Hub + * repositories also hold BFL's own single-file package at the root (`model.safetensors`, a BFL-format + * `config.json`, `ae.safetensors`) and quantized `variants/`; none of them is read here. + */ + Main_Diffusers_Flux3_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; + /** + * Type + * @default main + * @constant + */ + type: "main"; + /** + * Trigger Phrases + * @description Set of trigger phrases for this model + */ + trigger_phrases: string[] | null; + /** @description Default settings for this model */ + default_settings: components["schemas"]["MainModelDefaultSettings"] | null; + /** + * Format + * @default diffusers + * @constant + */ + format: "diffusers"; + /** @default */ + repo_variant: components["schemas"]["ModelRepoVariant"]; + /** + * Base + * @default flux3 + * @constant + */ + base: "flux3"; + variant: components["schemas"]["Flux3VariantType"]; + }; /** * Main_Diffusers_Ideogram4_Config * @description Model config for Ideogram 4 diffusers models (nf4 / fp8 quantized). @@ -32683,6 +33139,95 @@ export type components = { format: "gguf_quantized"; variant: components["schemas"]["Flux2VariantType"]; }; + /** + * Main_GGUF_Flux3_Config + * @description Model config for GGUF-quantized FLUX.3 Image transformers (single-file). + */ + Main_GGUF_Flux3_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; + /** + * Type + * @default main + * @constant + */ + type: "main"; + /** + * Trigger Phrases + * @description Set of trigger phrases for this model + */ + trigger_phrases: string[] | null; + /** @description Default settings for this model */ + default_settings: components["schemas"]["MainModelDefaultSettings"] | null; + /** + * Config Path + * @description Path to the config for this model, if any. + */ + config_path: string | null; + /** + * Base + * @default flux3 + * @constant + */ + base: "flux3"; + /** + * Format + * @default gguf_quantized + * @constant + */ + format: "gguf_quantized"; + variant: components["schemas"]["Flux3VariantType"]; + }; /** * Main_GGUF_Ideogram4_Config * @description Model config for GGUF-quantized Ideogram 4 transformers (single-file). @@ -37225,7 +37770,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_Flux3_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_Flux3_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_Flux3_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"]; }; /** * ModelInstallDownloadProgressEvent @@ -37391,7 +37936,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_Flux3_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_Flux3_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_Flux3_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; /** * Inplace * @description Leave model in its current location; otherwise install under models directory @@ -37477,7 +38022,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_Flux3_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_Flux3_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_Flux3_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"]; /** * @description The submodel type, if any * @default null @@ -37504,7 +38049,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_Flux3_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_Flux3_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_Flux3_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"]; /** * @description The submodel type, if any * @default null @@ -37636,7 +38181,7 @@ export type components = { * Variant * @description The variant of the model. */ - variant?: components["schemas"]["ModelVariantType"] | components["schemas"]["ClipVariantType"] | components["schemas"]["FluxVariantType"] | components["schemas"]["Flux2VariantType"] | components["schemas"]["ZImageVariantType"] | components["schemas"]["QwenImageVariantType"] | components["schemas"]["WanVariantType"] | components["schemas"]["WanLoRAVariantType"] | components["schemas"]["Qwen3VariantType"] | components["schemas"]["Qwen3VLVariantType"] | components["schemas"]["Qwen35VariantType"] | components["schemas"]["AnimaVariantType"] | components["schemas"]["Krea2VariantType"] | components["schemas"]["QwenImage21VariantType"] | components["schemas"]["MiniMaxH3VariantType"] | components["schemas"]["LTX2VariantType"] | components["schemas"]["MistralVariantType"] | components["schemas"]["PiDDecoderVariantType"] | null; + variant?: components["schemas"]["ModelVariantType"] | components["schemas"]["ClipVariantType"] | components["schemas"]["FluxVariantType"] | components["schemas"]["Flux2VariantType"] | components["schemas"]["Flux3VariantType"] | components["schemas"]["ZImageVariantType"] | components["schemas"]["QwenImageVariantType"] | components["schemas"]["WanVariantType"] | components["schemas"]["WanLoRAVariantType"] | components["schemas"]["Qwen3VariantType"] | components["schemas"]["Qwen3VLVariantType"] | components["schemas"]["Qwen35VariantType"] | components["schemas"]["AnimaVariantType"] | components["schemas"]["Krea2VariantType"] | components["schemas"]["QwenImage21VariantType"] | components["schemas"]["MiniMaxH3VariantType"] | components["schemas"]["LTX2VariantType"] | components["schemas"]["MistralVariantType"] | components["schemas"]["PiDDecoderVariantType"] | null; /** @description The prediction type of the model. */ prediction_type?: components["schemas"]["SchedulerPredictionType"] | null; /** @@ -37731,7 +38276,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_Flux3_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_Flux3_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_Flux3_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"])[]; }; /** * Multiply Integers @@ -44987,7 +45532,7 @@ export type components = { type: components["schemas"]["ModelType"]; format?: components["schemas"]["ModelFormat"] | null; /** Variant */ - variant?: components["schemas"]["ModelVariantType"] | components["schemas"]["ClipVariantType"] | components["schemas"]["FluxVariantType"] | components["schemas"]["Flux2VariantType"] | components["schemas"]["ZImageVariantType"] | components["schemas"]["QwenImageVariantType"] | components["schemas"]["WanVariantType"] | components["schemas"]["WanLoRAVariantType"] | components["schemas"]["Qwen3VariantType"] | components["schemas"]["Qwen3VLVariantType"] | components["schemas"]["Qwen35VariantType"] | components["schemas"]["AnimaVariantType"] | components["schemas"]["Krea2VariantType"] | components["schemas"]["QwenImage21VariantType"] | components["schemas"]["MiniMaxH3VariantType"] | components["schemas"]["LTX2VariantType"] | components["schemas"]["MistralVariantType"] | components["schemas"]["PiDDecoderVariantType"] | null; + variant?: components["schemas"]["ModelVariantType"] | components["schemas"]["ClipVariantType"] | components["schemas"]["FluxVariantType"] | components["schemas"]["Flux2VariantType"] | components["schemas"]["Flux3VariantType"] | components["schemas"]["ZImageVariantType"] | components["schemas"]["QwenImageVariantType"] | components["schemas"]["WanVariantType"] | components["schemas"]["WanLoRAVariantType"] | components["schemas"]["Qwen3VariantType"] | components["schemas"]["Qwen3VLVariantType"] | components["schemas"]["Qwen35VariantType"] | components["schemas"]["AnimaVariantType"] | components["schemas"]["Krea2VariantType"] | components["schemas"]["QwenImage21VariantType"] | components["schemas"]["MiniMaxH3VariantType"] | components["schemas"]["LTX2VariantType"] | components["schemas"]["MistralVariantType"] | components["schemas"]["PiDDecoderVariantType"] | null; /** * Is Installed * @default false @@ -45032,7 +45577,7 @@ export type components = { type: components["schemas"]["ModelType"]; format?: components["schemas"]["ModelFormat"] | null; /** Variant */ - variant?: components["schemas"]["ModelVariantType"] | components["schemas"]["ClipVariantType"] | components["schemas"]["FluxVariantType"] | components["schemas"]["Flux2VariantType"] | components["schemas"]["ZImageVariantType"] | components["schemas"]["QwenImageVariantType"] | components["schemas"]["WanVariantType"] | components["schemas"]["WanLoRAVariantType"] | components["schemas"]["Qwen3VariantType"] | components["schemas"]["Qwen3VLVariantType"] | components["schemas"]["Qwen35VariantType"] | components["schemas"]["AnimaVariantType"] | components["schemas"]["Krea2VariantType"] | components["schemas"]["QwenImage21VariantType"] | components["schemas"]["MiniMaxH3VariantType"] | components["schemas"]["LTX2VariantType"] | components["schemas"]["MistralVariantType"] | components["schemas"]["PiDDecoderVariantType"] | null; + variant?: components["schemas"]["ModelVariantType"] | components["schemas"]["ClipVariantType"] | components["schemas"]["FluxVariantType"] | components["schemas"]["Flux2VariantType"] | components["schemas"]["Flux3VariantType"] | components["schemas"]["ZImageVariantType"] | components["schemas"]["QwenImageVariantType"] | components["schemas"]["WanVariantType"] | components["schemas"]["WanLoRAVariantType"] | components["schemas"]["Qwen3VariantType"] | components["schemas"]["Qwen3VLVariantType"] | components["schemas"]["Qwen35VariantType"] | components["schemas"]["AnimaVariantType"] | components["schemas"]["Krea2VariantType"] | components["schemas"]["QwenImage21VariantType"] | components["schemas"]["MiniMaxH3VariantType"] | components["schemas"]["LTX2VariantType"] | components["schemas"]["MistralVariantType"] | components["schemas"]["PiDDecoderVariantType"] | null; /** * Is Installed * @default false @@ -45726,7 +46271,7 @@ export type components = { path_or_prefix: string; model_type: components["schemas"]["ModelType"]; /** Variant */ - variant?: components["schemas"]["ModelVariantType"] | components["schemas"]["ClipVariantType"] | components["schemas"]["FluxVariantType"] | components["schemas"]["Flux2VariantType"] | components["schemas"]["ZImageVariantType"] | components["schemas"]["QwenImageVariantType"] | components["schemas"]["WanVariantType"] | components["schemas"]["WanLoRAVariantType"] | components["schemas"]["Qwen3VariantType"] | components["schemas"]["Qwen3VLVariantType"] | components["schemas"]["Qwen35VariantType"] | components["schemas"]["AnimaVariantType"] | components["schemas"]["Krea2VariantType"] | components["schemas"]["QwenImage21VariantType"] | components["schemas"]["MiniMaxH3VariantType"] | components["schemas"]["LTX2VariantType"] | components["schemas"]["MistralVariantType"] | components["schemas"]["PiDDecoderVariantType"] | null; + variant?: components["schemas"]["ModelVariantType"] | components["schemas"]["ClipVariantType"] | components["schemas"]["FluxVariantType"] | components["schemas"]["Flux2VariantType"] | components["schemas"]["Flux3VariantType"] | components["schemas"]["ZImageVariantType"] | components["schemas"]["QwenImageVariantType"] | components["schemas"]["WanVariantType"] | components["schemas"]["WanLoRAVariantType"] | components["schemas"]["Qwen3VariantType"] | components["schemas"]["Qwen3VLVariantType"] | components["schemas"]["Qwen35VariantType"] | components["schemas"]["AnimaVariantType"] | components["schemas"]["Krea2VariantType"] | components["schemas"]["QwenImage21VariantType"] | components["schemas"]["MiniMaxH3VariantType"] | components["schemas"]["LTX2VariantType"] | components["schemas"]["MistralVariantType"] | components["schemas"]["PiDDecoderVariantType"] | null; }; /** * Subtract Integers @@ -54226,7 +54771,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_Flux3_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_Flux3_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_Flux3_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"]; }; }; /** @description Validation Error */ @@ -54258,7 +54803,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_Flux3_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_Flux3_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_Flux3_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"]; }; }; /** @description Validation Error */ @@ -54310,7 +54855,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_Flux3_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_Flux3_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_Flux3_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"]; }; }; /** @description Bad request */ @@ -54424,7 +54969,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_Flux3_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_Flux3_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_Flux3_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"]; }; }; /** @description Bad request */ @@ -54497,7 +55042,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_Flux3_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_Flux3_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_Flux3_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"]; }; }; /** @description Bad request */ @@ -55298,7 +55843,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_Flux3_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_Flux3_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_Flux3_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"]; }; }; /** @description Bad request */ diff --git a/invokeai/frontend/webv2/public/locales/en.json b/invokeai/frontend/webv2/public/locales/en.json index 2274602a242..b8e0777bd6b 100644 --- a/invokeai/frontend/webv2/public/locales/en.json +++ b/invokeai/frontend/webv2/public/locales/en.json @@ -2603,11 +2603,14 @@ "editAuthored": "Back to editing your prompt", "loading": "Loading templates…" }, + "copyReferenceImagePromptTag": "Copy prompt tag {{tag}}", "promptTriggerOptions": "Prompt trigger options", "readyWithIterations_one": "Ready · {{count}} iteration", "readyWithIterations_other": "Ready · {{count}} iterations", "referenceImage": "Reference Image", "referenceImageModel": "Reference image model", + "referenceImagePromptTagCopied": "Copied {{tag}}", + "referenceImagePromptTagHint": "Write {{tag}} in the prompt to refer to this image. Click to copy.", "referenceImages": "Reference images", "referenceImagesUnsupported": "Reference images are not supported by the selected model.", "removeConcept": "Remove concept", 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 01f6efbee4f..4a0e194526b 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/__fixtures__/architectureCapabilities.json +++ b/invokeai/frontend/webv2/src/features/generation/core/__fixtures__/architectureCapabilities.json @@ -500,6 +500,102 @@ }, "vae": null }, + { + "base": "flux3", + "variant": null, + "features": { + "negative_prompt": { + "visible": true, + "usage": "cfg-gated" + }, + "dimension_grid": 16, + "guidance_label": "CFG", + "guidance_min": 1.0, + "guidance_max": null, + "scheduler_set": null, + "scheduler_applies_to_graph": false, + "control_kinds": [], + "max_reference_images": 10, + "reference_images_require_variant": null, + "supports_regional_guidance": false, + "regional_negative": false, + "clip_skip_max": null, + "supports_seamless": false, + "supports_cfg_rescale": false, + "sd_vae_override": false, + "color_compensation": false, + "vae_precision": false + }, + "defaults": { + "vae": null, + "vae_precision": null, + "scheduler": null, + "steps": 16, + "cfg_scale": 1.0, + "cfg_rescale_multiplier": null, + "width": 1024, + "height": 1024, + "guidance": null, + "cpu_only": null, + "fp8_storage": null + }, + "vae": { + "accepted": [ + { + "base": "flux2", + "latent_channels": null + } + ] + } + }, + { + "base": "flux3", + "variant": "flux3_klein_base", + "features": { + "negative_prompt": { + "visible": true, + "usage": "cfg-gated" + }, + "dimension_grid": 16, + "guidance_label": "CFG", + "guidance_min": 1.0, + "guidance_max": null, + "scheduler_set": null, + "scheduler_applies_to_graph": false, + "control_kinds": [], + "max_reference_images": 10, + "reference_images_require_variant": null, + "supports_regional_guidance": false, + "regional_negative": false, + "clip_skip_max": null, + "supports_seamless": false, + "supports_cfg_rescale": false, + "sd_vae_override": false, + "color_compensation": false, + "vae_precision": false + }, + "defaults": { + "vae": null, + "vae_precision": null, + "scheduler": null, + "steps": 50, + "cfg_scale": 3.5, + "cfg_rescale_multiplier": null, + "width": 1024, + "height": 1024, + "guidance": null, + "cpu_only": null, + "fp8_storage": null + }, + "vae": { + "accepted": [ + { + "base": "flux2", + "latent_channels": null + } + ] + } + }, { "base": "ideogram-4", "variant": null, 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 c82de6d94d3..5cbf3f1ef8e 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/__snapshots__/generateGraphNodeTypes.json +++ b/invokeai/frontend/webv2/src/features/generation/core/__snapshots__/generateGraphNodeTypes.json @@ -118,6 +118,25 @@ "string" ] }, + "flux3": { + "componentsFilled": { + "klein-diffusers": [], + "klein-standalone": [ + "qwen3VLEncoderModel", + "vae" + ], + "klein-base-diffusers": [] + }, + "nodeTypes": [ + "core_metadata", + "flux2_vae_decode", + "flux3_denoise", + "flux3_model_loader", + "flux3_text_encoder", + "integer", + "string" + ] + }, "cogview4": { "componentsFilled": { "diffusers": [], @@ -546,6 +565,7 @@ "ernie_image_txt2img", "flux_txt2img", "flux2_txt2img", + "flux3_txt2img", "ideogram4_txt2img", "krea2_txt2img", "qwen_image_2_1_txt2img", @@ -627,6 +647,7 @@ false ], "steps": [ + 16, 28, 30, 35, @@ -1029,6 +1050,82 @@ }, "outputs": [] }, + "flux3_denoise": { + "inputs": [ + "negative_conditioning", + "positive_conditioning", + "seed", + "transformer", + "vae" + ], + "literalInputs": { + "cfg_scale": [ + 1, + 3.5 + ], + "denoising_end": [ + 1 + ], + "denoising_start": [ + 0 + ], + "height": [ + 1024 + ], + "is_intermediate": [ + true + ], + "steps": [ + 16, + 50 + ], + "use_cache": [ + true + ], + "width": [ + 1024 + ] + }, + "outputs": [ + "latents" + ] + }, + "flux3_model_loader": { + "inputs": [], + "literalInputs": { + "is_intermediate": [ + true + ], + "model": [], + "qwen3_vl_encoder_model": [], + "use_cache": [ + true + ], + "vae_model": [] + }, + "outputs": [ + "qwen3_vl_encoder", + "transformer", + "vae" + ] + }, + "flux3_text_encoder": { + "inputs": [ + "prompt", + "qwen3_vl_encoder" + ], + "literalInputs": { + "is_intermediate": [ + true + ], + "use_cache": [ + true + ] + }, + "outputs": [ + "conditioning" + ] + }, "ideogram4_caption_builder": { "inputs": [ "prompt" diff --git a/invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.test.ts b/invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.test.ts index 01b7a59d70d..405db68d819 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.test.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.test.ts @@ -1164,6 +1164,19 @@ describe('Anima inpaint adapter slot', () => { }); }); +describe('FLUX.3 policies', () => { + const KLEIN_CFG_REASON = 'FLUX.3 Klein samples without CFG. Set CFG Scale to 1, or use FLUX.3 Klein Base for CFG.'; + + it('blocks CFG on the step-distilled Klein and allows it on Klein Base', () => { + const klein = createModel('flux3', { format: 'diffusers', variant: 'flux3_klein' }); + const kleinBase = createModel('flux3', { format: 'diffusers', variant: 'flux3_klein_base' }); + + expect(getGenerationValidationReasons(klein, createSettings(klein))).toEqual([]); + expect(getGenerationValidationReasons(klein, createSettings(klein, { cfgScale: 2 }))).toContain(KLEIN_CFG_REASON); + expect(getGenerationValidationReasons(kleinBase, createSettings(kleinBase, { cfgScale: 3.5 }))).toEqual([]); + }); +}); + describe('Krea-2, Ideogram 4 and Wan policies', () => { const krea2Vae: VaeModelConfig = { base: 'qwen-image', key: 'krea2-vae', name: 'Qwen VAE', type: 'vae' }; const qwen3VlEncoder: ComponentModelConfig = { diff --git a/invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts b/invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts index b3bf6a01141..29c2f86f2d6 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/baseGenerationPolicies.ts @@ -41,7 +41,7 @@ import { isFlux2Qwen3EncoderForModel, isQwen3Vl8bEncoder, isIdeogram4UnconditionalBranch, - isKrea2Qwen3VlEncoder, + isQwen3Vl4bEncoder, isNonAnimaQwen3Encoder, isSelfContainedSDNQFlux1Pipeline, isSelfContainedSDNQPipeline, @@ -982,6 +982,26 @@ const getBaseComponentSectionPolicy = ( missingMessage: 'Generate needs a VAE for Z-Image models.', }, ]); + case 'flux3': + // A Diffusers FLUX.3 model bundles its VAE and encoder; single-file and GGUF models need both picked. + return createPolicy(model.format !== 'diffusers', [ + { + ...vaeSlot( + 'FLUX.3 decodes with the FLUX.2 VAE. Required for non-Diffusers FLUX.3 models; otherwise an optional override.', + isAcceptedVae + ), + required: (ctx) => ctx.model.format !== 'diffusers', + missingMessage: 'Generate needs a VAE for non-Diffusers FLUX.3 models.', + }, + { + ...qwen3VlEncoderSlot( + 'The Qwen3-VL 4B encoder. Required for non-Diffusers FLUX.3 models; otherwise an optional override.', + isQwen3Vl4bEncoder + ), + required: (ctx) => ctx.model.format !== 'diffusers', + missingMessage: 'Generate needs a Qwen3-VL Encoder for non-Diffusers FLUX.3 models.', + }, + ]); case 'krea-2': // Bundled Krea models supply components; standalone models need a separate encoder and VAE. return createPolicy(model.format !== 'diffusers', [ @@ -994,7 +1014,7 @@ const getBaseComponentSectionPolicy = ( missingMessage: 'Generate needs a VAE for non-Diffusers Krea-2 models.', }, { - ...qwen3VlEncoderSlot('Required for non-Diffusers Krea-2 models.', isKrea2Qwen3VlEncoder), + ...qwen3VlEncoderSlot('Required for non-Diffusers Krea-2 models.', isQwen3Vl4bEncoder), required: (ctx) => ctx.model.format !== 'diffusers', missingMessage: 'Generate needs a Qwen3-VL Encoder for non-Diffusers Krea-2 models.', }, @@ -1305,7 +1325,8 @@ export const getDefaultReferenceImageConfig = ( return { image, type: 'external_reference_image' }; } - if (modelBase === 'flux2') { + // FLUX.3 takes its references exactly as FLUX.2 does: plain images, VAE-encoded by the denoiser. + if (modelBase === 'flux2' || modelBase === 'flux3') { return { image, type: 'flux2_reference_image' }; } @@ -1339,7 +1360,7 @@ const getReferenceImageConfigSupported = ( case 'external_reference_image': return model.type === 'external_image_generator' && model.capabilities?.supports_reference_images === true; case 'flux2_reference_image': - return model.type !== 'external_image_generator' && model.base === 'flux2'; + return model.type !== 'external_image_generator' && (model.base === 'flux2' || model.base === 'flux3'); case 'qwen_image_reference_image': return model.type !== 'external_image_generator' && model.base === 'qwen-image' && model.variant === 'edit'; case 'flux_kontext_reference_image': @@ -1686,6 +1707,11 @@ const getModelFamilyValidationReasons = (model: MainModelConfig, settings: Gener reasons.push(`Krea-2 rebalance weights must be ${KREA2_REBALANCE_WEIGHT_COUNT} comma-separated numbers.`); } + // FLUX.3 Klein is a step-distilled flow map: it samples without CFG, and its denoise node refuses a scale above 1. + if (model.base === 'flux3' && model.variant === 'flux3_klein' && settings.cfgScale > 1) { + reasons.push('FLUX.3 Klein samples without CFG. Set CFG Scale to 1, or use FLUX.3 Klein Base for CFG.'); + } + // Finite persisted Ideogram overrides still need range validation. if (model.base === 'ideogram-4') { for (const [label, value, min, max] of [ 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 c97d954c1e7..909473adebc 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 @@ -37,6 +37,14 @@ const flux2DevModel: MainModelConfig = { name: 'FLUX.2 [dev]', variant: 'dev', }; +const flux3Model: MainModelConfig = { + base: 'flux3', + format: 'diffusers', + key: 'flux3-model', + name: 'FLUX.3 Klein', + type: 'main', + variant: 'flux3_klein', +}; const cogView4Model: MainModelConfig = { base: 'cogview4', key: 'cog-model', name: 'CogView4', type: 'main' }; const qwenImageModel: MainModelConfig = { base: 'qwen-image', @@ -244,6 +252,15 @@ const BASE_CASES: BaseCase[] = [ img2imgMode: 'flux2_img2img', optimizedDenoising: true, }, + { + model: flux3Model, + encodeType: 'flux2_vae_encode', + outputType: 'flux2_vae_decode', + denoiseType: 'flux3_denoise', + txt2imgMode: 'flux3_txt2img', + img2imgMode: 'flux3_img2img', + optimizedDenoising: true, + }, { model: cogView4Model, encodeType: 'cogview4_i2l', @@ -1240,7 +1257,7 @@ describe('compileCanvasGraph — PiD decode', () => { .filter((edge) => edge.destination.node_id === targetNodeId) .map((edge) => [edge.destination.field, [graph.nodes[edge.source.node_id]?.type, edge.source.field]]) ); - const PID_BASES = [sdxlModel, sd3Model, fluxModel, flux2Model, qwenImageModel, zImageModel]; + const PID_BASES = [sdxlModel, sd3Model, fluxModel, flux2Model, flux3Model, qwenImageModel, zImageModel]; it('txt2img fit: the PiD chain replaces the VAE decode and a resize back to the bbox owns canvas_output', () => { const { backendGraph } = compile(sdxlModel, 'txt2img', { settings: pidSettings(sdxlModel, 'fit') }); 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 39082c7264a..5e6f394da60 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/canvas/compileCanvasGraph.ts @@ -35,6 +35,8 @@ const CANVAS_I2L_NODE_TYPES: Partial> = { 'sd-3': 'sd3_i2l', flux: 'flux_vae_encode', flux2: 'flux2_vae_encode', + // FLUX.3 encodes with the FLUX.2 VAE. + flux3: 'flux2_vae_encode', cogview4: 'cogview4_i2l', 'qwen-image': 'qwen_image_i2l', 'z-image': 'z_image_i2l', @@ -46,12 +48,13 @@ const CANVAS_I2L_NODE_TYPES: Partial> = { // Ideogram lacks an encode node; reject these modes with an actionable error. }; -/** SD-3, FLUX, and FLUX.2 use start = 1 - strength^0.2. FLUX Fill always starts at 0; other bases use 1 - strength. */ +/** SD-3, FLUX, FLUX.2 and FLUX.3 use start = 1 - strength^0.2. FLUX Fill always starts at 0; other bases use 1 - strength. */ const canvasDenoisingStart = (model: GenerateModelConfig, strength: number): number => { if (model.base === 'flux' && model.variant === 'dev_fill') { return 0; } - const usesOptimizedCurve = model.base === 'sd-3' || model.base === 'flux' || model.base === 'flux2'; + const usesOptimizedCurve = + model.base === 'sd-3' || model.base === 'flux' || model.base === 'flux2' || model.base === 'flux3'; return 1 - strength ** (usesOptimizedCurve ? 0.2 : 1); }; diff --git a/invokeai/frontend/webv2/src/features/generation/core/componentCompatibility.ts b/invokeai/frontend/webv2/src/features/generation/core/componentCompatibility.ts index d5713a5fe97..4d5a5802fa0 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/componentCompatibility.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/componentCompatibility.ts @@ -96,8 +96,8 @@ export const isFlux2MistralEncoder: GenerateComponentFilter = (model) => export const isErnieImageMistralEncoder: GenerateComponentFilter = (model) => model.type === 'mistral_encoder' && model.variant === MINISTRAL_3B_VARIANT; -/** Krea-2 conditions on the 4B encoder; Ideogram 4 and Qwen-Image-2.1 on the 8B one. The two are not interchangeable. */ -export const isKrea2Qwen3VlEncoder: GenerateComponentFilter = (model) => +/** Krea-2 and FLUX.3 condition on the 4B encoder; Ideogram 4 and Qwen-Image-2.1 on the 8B one. The two are not interchangeable. */ +export const isQwen3Vl4bEncoder: GenerateComponentFilter = (model) => model.type === 'qwen3_vl_encoder' && model.variant === 'qwen3_vl_4b'; export const isQwen3Vl8bEncoder: GenerateComponentFilter = (model) => diff --git a/invokeai/frontend/webv2/src/features/generation/core/contracts.ts b/invokeai/frontend/webv2/src/features/generation/core/contracts.ts index 60489f4a5a4..9000537f327 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/contracts.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/contracts.ts @@ -62,6 +62,7 @@ export type KnownGenerationModelBase = | 'sdxl-refiner' | 'flux' | 'flux2' + | 'flux3' | 'cogview4' | 'ernie-image' | 'qwen-image' 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 f61e441084f..24d6b0837f8 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/graph.test.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/graph.test.ts @@ -4,6 +4,7 @@ import { afterEach, describe, expect, it, vi } from 'vitest'; import type { ComponentModelConfig, GenerateModelConfig, + GenerateReferenceImage, GenerateSettings, LoraModelConfig, MainModelConfig, @@ -12,6 +13,7 @@ import type { import { getDefaultGenerateSettings, isSupportedGenerateModel } from './baseGenerationPolicies'; import { compileGenerateGraph, resolveGenerateSeed } from './graph'; +import { getReferenceImagePromptTags } from './referenceImage'; const sd1Model: MainModelConfig = { base: 'sd-1', key: 'sd1-model', name: 'SD 1.5', type: 'main' }; const sd2Model: MainModelConfig = { base: 'sd-2', key: 'sd2-model', name: 'SD 2', type: 'main' }; @@ -1105,6 +1107,66 @@ describe('Qwen-Image-2.1 graphs', () => { }); }); +describe('FLUX.3 graphs', () => { + const kleinModel: MainModelConfig = { + base: 'flux3', + format: 'diffusers', + key: 'flux3-klein', + name: 'FLUX.3 Klein', + type: 'main', + variant: 'flux3_klein', + }; + const kleinBaseModel: MainModelConfig = { + ...kleinModel, + key: 'flux3-klein-base', + name: 'FLUX.3 Klein Base', + variant: 'flux3_klein_base', + }; + const reference = (id: string, isEnabled = true): GenerateReferenceImage => ({ + config: { + image: { original: { image: { height: 512, image_name: `${id}.png`, width: 512 } } }, + type: 'flux2_reference_image', + }, + id, + isEnabled, + }); + + /** The reference images in the order the denoiser receives them, walking the collect chain back from it. */ + const denoiserReferenceOrder = (graph: ReturnType): string[] => { + const names: string[] = []; + let collect = getEdge(graph, 'denoise_latents', 'kontext_conditioning')?.source.node_id; + while (collect) { + const kontextId = getEdge(graph, collect, 'item')?.source.node_id; + const kontext = kontextId ? graph.nodes[kontextId] : undefined; + names.unshift((kontext as { image?: { image_name: string } } | undefined)?.image?.image_name ?? '?'); + collect = getEdge(graph, collect, 'collection')?.source.node_id; + } + return names; + }; + + it('hands the denoiser the references in the order their prompt tags number them', () => { + const referenceImages = [reference('a'), reference('off', false), reference('b')]; + + const graph = compile(kleinModel, { referenceImages }); + + expect(denoiserReferenceOrder(graph)).toEqual(['a.png', 'b.png']); + expect([...getReferenceImagePromptTags('flux3', referenceImages)]).toEqual([ + ['a', ''], + ['b', ''], + ]); + }); + + it('compiles the negative branch only for Klein Base at its CFG default', () => { + const klein = compile(kleinModel); + const kleinBase = compile(kleinBaseModel); + + expect(getEdge(klein, 'denoise_latents', 'negative_conditioning')).toBeUndefined(); + expect(getNodeByType(klein, 'flux3_denoise')).toMatchObject({ cfg_scale: 1, steps: 16 }); + expect(getEdge(kleinBase, 'denoise_latents', 'negative_conditioning')?.source.node_id).toBe('neg_cond'); + expect(getNodeByType(kleinBase, 'flux3_denoise')).toMatchObject({ cfg_scale: 3.5, steps: 50 }); + }); +}); + describe('ERNIE-Image graphs', () => { const ernieModel: MainModelConfig = { base: 'ernie-image', diff --git a/invokeai/frontend/webv2/src/features/generation/core/graph.ts b/invokeai/frontend/webv2/src/features/generation/core/graph.ts index 4df2bcc73cb..c5082b09d79 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/graph.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/graph.ts @@ -12,9 +12,7 @@ import type { ComponentModelConfig, GenerateLora, GenerateModelConfig, - GenerateReferenceImage, GenerateReferenceImageAsset, - GenerateReferenceImageConfig, GenerateSettings, MainModelConfig, } from './types'; @@ -36,7 +34,7 @@ import { isFlux2MistralEncoder, isFlux2Qwen3EncoderForModel, isQwen3Vl8bEncoder, - isKrea2Qwen3VlEncoder, + isQwen3Vl4bEncoder, isNonAnimaQwen3Encoder, isSelfContainedSDNQFlux1Pipeline, isVaeCompatibleWithGenerateModel, @@ -53,7 +51,7 @@ import { } from './graphBuilder'; import { addKrea2ConditioningEnhancers } from './krea2Conditioning'; import { addPidDecode, getPidDenoiseSize, getPidMetadata, isPidDecodeNodeType, shouldUsePidDecode } from './pidGraph'; -import { getEffectiveReferenceImage } from './referenceImage'; +import { getEffectiveReferenceImage, getEnabledReferenceImages } from './referenceImage'; const getCompatibleComponentSource = ( settings: GenerateSettings, @@ -74,17 +72,6 @@ const toImageField = (image: GenerateReferenceImageAsset) => ({ image_name: getEffectiveReferenceImage(image).image_name, }); -const getEnabledReferenceImages = ( - settings: GenerateSettings, - type: T -): Array }> => - settings.referenceImages.filter( - ( - referenceImage - ): referenceImage is GenerateReferenceImage & { config: Extract } => - referenceImage.isEnabled && referenceImage.config.type === type && referenceImage.config.image !== null - ); - const addReferenceImageMetadata = ( graph: BackendGraphContract, outputNode: BackendInvocationContract, @@ -114,7 +101,9 @@ const addIPAdapterReferenceImages = ( model: MainModelConfig, denoise: BackendInvocationContract ) => { - const refs = getEnabledReferenceImages(settings, 'ip_adapter').filter((ref) => ref.config.model?.base === model.base); + const refs = getEnabledReferenceImages(settings.referenceImages, 'ip_adapter').filter( + (ref) => ref.config.model?.base === model.base + ); if (refs.length === 0) { return; @@ -161,7 +150,9 @@ const addFluxReduxReferenceImages = ( model: MainModelConfig, denoise: BackendInvocationContract ) => { - const refs = getEnabledReferenceImages(settings, 'flux_redux').filter((ref) => ref.config.model?.base === model.base); + const refs = getEnabledReferenceImages(settings.referenceImages, 'flux_redux').filter( + (ref) => ref.config.model?.base === model.base + ); if (refs.length === 0) { return; @@ -196,7 +187,7 @@ const addFluxKontextReferenceImages = ( denoise: BackendInvocationContract, type: 'flux2_reference_image' | 'flux_kontext_reference_image' ) => { - const refs = getEnabledReferenceImages(settings, type); + const refs = getEnabledReferenceImages(settings.referenceImages, type); if (refs.length === 0) { return; @@ -996,7 +987,7 @@ const buildQwenImageGraph = ( addEdge(graph, seed, 'value', denoise, 'seed'); const qwenReferenceImages = - model.variant === 'edit' ? getEnabledReferenceImages(settings, 'qwen_image_reference_image') : []; + model.variant === 'edit' ? getEnabledReferenceImages(settings.referenceImages, 'qwen_image_reference_image') : []; if (qwenReferenceImages.length > 0) { let prevCollect: BackendInvocationContract | null = null; @@ -1234,7 +1225,7 @@ const buildKrea2Graph = ( // Standalone Krea needs a separate VAE/encoder without a component source. const isDiffusers = model.format === 'diffusers'; const vaeModel = getCompatibleVae(settings, model); - const qwen3VlEncoderModel = getCompatibleComponent(settings.qwen3VLEncoderModel, isKrea2Qwen3VlEncoder); + const qwen3VlEncoderModel = getCompatibleComponent(settings.qwen3VLEncoderModel, isQwen3Vl4bEncoder); if (!isDiffusers) { requireComponent(vaeModel, 'Krea-2 VAE'); @@ -1364,6 +1355,85 @@ const buildQwenImage21Graph = ( return graph; }; +const buildFlux3Graph = ( + settings: GenerateSettings, + model: MainModelConfig, + outputIsIntermediate: boolean, + projectSettings: GenerationProjectSettings +): BackendGraphContract => { + // A single-file or GGUF FLUX.3 model is the transformer alone; a Diffusers one bundles the VAE and encoder. + const isDiffusers = model.format === 'diffusers'; + const vaeModel = getCompatibleVae(settings, model); + const qwen3VlEncoderModel = getCompatibleComponent(settings.qwen3VLEncoderModel, isQwen3Vl4bEncoder); + + if (!isDiffusers) { + requireComponent(vaeModel, 'FLUX.3 VAE'); + requireComponent(qwen3VlEncoderModel, 'Qwen3-VL Encoder'); + } + + const graph: BackendGraphContract = { edges: [], id: createId('flux3_graph'), nodes: {} }; + const { negativePrompt, positivePrompt, seed } = addPromptAndSeedNodes(graph); + // Klein Base takes CFG with a negative prompt; Klein (the flow map) samples at CFG 1 and takes neither. + const useCfg = settings.cfgScale > 1; + const modelLoader = addNode(graph, { + id: 'model_loader', + model, + qwen3_vl_encoder_model: qwen3VlEncoderModel ?? undefined, + type: 'flux3_model_loader', + vae_model: vaeModel ?? undefined, + }); + const posCond = addNode(graph, { id: 'pos_cond', type: 'flux3_text_encoder' }); + const negCond = useCfg ? addNode(graph, { id: 'neg_cond', type: 'flux3_text_encoder' }) : null; + const denoiseSize = getDenoiseSize(settings, model); + const denoise = addNode(graph, { + cfg_scale: settings.cfgScale, + denoising_end: 1, + denoising_start: 0, + height: denoiseSize.height, + id: 'denoise_latents', + steps: settings.steps, + type: 'flux3_denoise', + width: denoiseSize.width, + }); + // FLUX.3 decodes with the FLUX.2 VAE, so it reuses FLUX.2's decode node and PiD decoders. + const output = addDecodeOutput({ + denoise, + graph, + l2iType: 'flux2_vae_decode', + model, + outputIsIntermediate, + positivePrompt, + seed, + settings, + vaeSource: modelLoader, + }); + + addEdge(graph, modelLoader, 'transformer', denoise, 'transformer'); + addEdge(graph, modelLoader, 'qwen3_vl_encoder', posCond, 'qwen3_vl_encoder'); + addEdge(graph, modelLoader, 'vae', denoise, 'vae'); + addEdge(graph, positivePrompt, 'value', posCond, 'prompt'); + addEdge(graph, posCond, 'conditioning', denoise, 'positive_conditioning'); + + if (negCond) { + addEdge(graph, modelLoader, 'qwen3_vl_encoder', negCond, 'qwen3_vl_encoder'); + addEdge(graph, negativePrompt, 'value', negCond, 'prompt'); + addEdge(graph, negCond, 'conditioning', denoise, 'negative_conditioning'); + } + + addEdge(graph, seed, 'value', denoise, 'seed'); + addFluxKontextReferenceImages(graph, settings, denoise, 'flux2_reference_image'); + addMetadata(graph, output, settings, model, 'flux3_txt2img', projectSettings, { + // FLUX.3 offers no scheduler: its denoise node always runs the reference Euler sampler. + scheduler: 'euler', + qwen3_vl_encoder: qwen3VlEncoderModel ?? undefined, + vae: vaeModel ?? undefined, + ...(shouldUsePidDecode(settings, model.base) ? getPidMetadata(settings) : {}), + }); + addReferenceImageMetadata(graph, output, settings); + + return graph; +}; + const buildIdeogram4Graph = ( settings: GenerateSettings, model: MainModelConfig, @@ -1554,7 +1624,7 @@ const buildExternalGraph = ( addEdge(graph, seed, 'value', output, 'seed'); } if (model.capabilities?.supports_reference_images === true) { - const referenceImages = getEnabledReferenceImages(settings, 'external_reference_image') + const referenceImages = getEnabledReferenceImages(settings.referenceImages, 'external_reference_image') .map((referenceImage) => referenceImage.config.image) .filter((image): image is GenerateReferenceImageAsset => image !== null) .map(toImageField); @@ -1590,6 +1660,7 @@ export const GRAPH_BUILDERS = { 'ideogram-4': buildIdeogram4Graph, 'krea-2': buildKrea2Graph, 'qwen-image-2-1': buildQwenImage21Graph, + flux3: buildFlux3Graph, anima: buildAnimaGraph, wan: buildWanGraph, } satisfies Record; diff --git a/invokeai/frontend/webv2/src/features/generation/core/graphCoverage.testing.ts b/invokeai/frontend/webv2/src/features/generation/core/graphCoverage.testing.ts index 6340317d653..95537bb6e58 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/graphCoverage.testing.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/graphCoverage.testing.ts @@ -44,6 +44,12 @@ export const SHAPE_OVERRIDES: Partial SHAPE_OVERRIDES[base] ?? DEFAULT_SHAPES; diff --git a/invokeai/frontend/webv2/src/features/generation/core/pid.ts b/invokeai/frontend/webv2/src/features/generation/core/pid.ts index 76b900dd31b..e9e97fc28a6 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/pid.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/pid.ts @@ -23,11 +23,13 @@ export const isPidMode = (value: unknown): value is PidMode => /** Native PiD scales the target by 4; other modes use 1. */ export const getPidScale = (mode: PidMode): number => (mode === 'native' ? PID_SCALE : 1); -/** Z-Image reuses FLUX's decoder; unsupported bases return null. */ +/** Z-Image reuses FLUX's decoder and FLUX.3 FLUX.2's; unsupported bases return null. */ export const getPidDecoderBaseForMainBase = (base: string | null | undefined): KnownModelBase | null => { switch (base) { case 'z-image': return 'flux'; + case 'flux3': + return 'flux2'; case 'flux': case 'flux2': case 'sd-3': diff --git a/invokeai/frontend/webv2/src/features/generation/core/pidGraph.ts b/invokeai/frontend/webv2/src/features/generation/core/pidGraph.ts index 03d1ed3fa44..9a4d7beba13 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/pidGraph.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/pidGraph.ts @@ -11,6 +11,8 @@ import { getIsPidActive, getPidGenerationSize } from './pid'; export const PID_DECODE_NODE_TYPES = { flux: 'flux_pid_decode', flux2: 'flux2_pid_decode', + // FLUX.3 latents are FLUX.2 latents: same VAE, same PiD decoders. + flux3: 'flux2_pid_decode', 'qwen-image': 'qwen_image_pid_decode', 'sd-3': 'sd3_pid_decode', sdxl: 'sdxl_pid_decode', diff --git a/invokeai/frontend/webv2/src/features/generation/core/referenceImage.test.ts b/invokeai/frontend/webv2/src/features/generation/core/referenceImage.test.ts index 8355deb7b6e..baa435e8473 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/referenceImage.test.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/referenceImage.test.ts @@ -1,5 +1,7 @@ import { describe, expect, it } from 'vitest'; +import type { GenerateReferenceImage } from './types'; + import { applyReferenceImageCrop, clearReferenceImageCrop, @@ -8,6 +10,7 @@ import { generatedImageToReferenceImage, getEffectiveReferenceImage, getReferenceImageCropBoxPct, + getReferenceImagePromptTags, normalizeCroppableImage, resolveReferenceImageCrop, } from './referenceImage'; @@ -122,3 +125,32 @@ describe('reference images', () => { ).toBeNull(); }); }); + +describe('reference image prompt tags', () => { + const asset = { original: { image: original } }; + const reference = (id: string, overrides: Partial = {}): GenerateReferenceImage => ({ + config: { image: asset, type: 'flux2_reference_image' }, + id, + isEnabled: true, + ...overrides, + }); + const references = [ + reference('a'), + reference('disabled', { isEnabled: false }), + reference('empty', { config: { image: null, type: 'flux2_reference_image' } }), + reference('other-type', { config: { image: asset, type: 'qwen_image_reference_image' } }), + reference('b'), + ]; + + it('numbers FLUX.3 references by their position in the denoiser input', () => { + expect([...getReferenceImagePromptTags('flux3', references)]).toEqual([ + ['a', ''], + ['b', ''], + ]); + }); + + it('gives no tags to bases that do not name references in the prompt', () => { + expect(getReferenceImagePromptTags('flux2', references).size).toBe(0); + expect(getReferenceImagePromptTags(undefined, references).size).toBe(0); + }); +}); diff --git a/invokeai/frontend/webv2/src/features/generation/core/referenceImage.ts b/invokeai/frontend/webv2/src/features/generation/core/referenceImage.ts index 0d05093a2b3..fc9cfdb7ca4 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/referenceImage.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/referenceImage.ts @@ -1,6 +1,11 @@ import type { GeneratedImageContract } from '@features/gallery'; -import type { CroppableImageWithDims, ImageWithDims } from './types'; +import type { + CroppableImageWithDims, + GenerateReferenceImage, + GenerateReferenceImageConfig, + ImageWithDims, +} from './types'; const isRecord = (value: unknown): value is Record => Boolean(value) && typeof value === 'object' && !Array.isArray(value); @@ -183,3 +188,34 @@ export const applyReferenceImageCrop = ( export const clearReferenceImageCrop = (image: CroppableImageWithDims): CroppableImageWithDims => ({ original: { image: cloneImageWithDims(image.original.image) }, }); + +/** The references of one type that reach the graph, in conditioning order: enabled cards that hold an image. */ +export const getEnabledReferenceImages = ( + referenceImages: readonly GenerateReferenceImage[], + type: T +): Array }> => + referenceImages.filter( + ( + referenceImage + ): referenceImage is GenerateReferenceImage & { config: Extract } => + referenceImage.isEnabled && referenceImage.config.type === type && referenceImage.config.image !== null + ); + +const NO_PROMPT_TAGS: ReadonlyMap = new Map(); + +/** + * Tags a FLUX.3 prompt uses to name each reference, keyed by reference id. The model numbers its references by + * their 0-based position in the denoiser input, so disabled and empty cards take no number. + */ +export const getReferenceImagePromptTags = ( + base: string | undefined, + referenceImages: readonly GenerateReferenceImage[] +): ReadonlyMap => + base === 'flux3' + ? new Map( + getEnabledReferenceImages(referenceImages, 'flux2_reference_image').map((referenceImage, index) => [ + referenceImage.id, + ``, + ]) + ) + : NO_PROMPT_TAGS; diff --git a/invokeai/frontend/webv2/src/features/generation/core/supportedBases.test.ts b/invokeai/frontend/webv2/src/features/generation/core/supportedBases.test.ts index ba9d991f481..7417681826e 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/supportedBases.test.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/supportedBases.test.ts @@ -13,6 +13,7 @@ describe('SUPPORTED_GENERATE_BASES', () => { 'sd-3', 'flux', 'flux2', + 'flux3', 'cogview4', 'ernie-image', 'qwen-image', diff --git a/invokeai/frontend/webv2/src/features/generation/core/supportedBases.ts b/invokeai/frontend/webv2/src/features/generation/core/supportedBases.ts index 35424c7b183..0e17c33a48f 100644 --- a/invokeai/frontend/webv2/src/features/generation/core/supportedBases.ts +++ b/invokeai/frontend/webv2/src/features/generation/core/supportedBases.ts @@ -9,6 +9,7 @@ export const SUPPORTED_GENERATE_BASES = [ 'sd-3', 'flux', 'flux2', + 'flux3', 'cogview4', 'ernie-image', 'qwen-image', diff --git a/invokeai/frontend/webv2/src/features/generation/ui/reference-images/GenerateReferenceImagesSection.tsx b/invokeai/frontend/webv2/src/features/generation/ui/reference-images/GenerateReferenceImagesSection.tsx index 5ac47f0b066..4be2fa382e4 100644 --- a/invokeai/frontend/webv2/src/features/generation/ui/reference-images/GenerateReferenceImagesSection.tsx +++ b/invokeai/frontend/webv2/src/features/generation/ui/reference-images/GenerateReferenceImagesSection.tsx @@ -21,7 +21,11 @@ import { getMaxReferenceImages, isReferenceImageSupported, } from '@features/generation/core/baseGenerationPolicies'; -import { generatedImageToReferenceImage, getEffectiveReferenceImage } from '@features/generation/core/referenceImage'; +import { + generatedImageToReferenceImage, + getEffectiveReferenceImage, + getReferenceImagePromptTags, +} from '@features/generation/core/referenceImage'; import { clampDimension, deriveAspectRatioId, moveReferenceImage } from '@features/generation/core/settings'; import { useGenerationUi } from '@features/generation/ui/GenerationUiContext'; import { Button, DropTargetOverlay, DropZone } from '@platform/ui'; @@ -60,6 +64,10 @@ export const GenerateReferenceImagesContent = ({ id: 'generate-reference-images', }); const referenceImageCount = referenceImages.length; + const promptTags = useMemo( + () => getReferenceImagePromptTags(selectedModel?.base, referenceImages), + [referenceImages, selectedModel?.base] + ); const appendReferenceImages = useCallback( (images: GenerateReferenceImageAsset[]) => { @@ -269,6 +277,7 @@ export const GenerateReferenceImagesContent = ({ onPatch={patchReferenceImage} onRemove={removeReferenceImage} onUseSize={applyReferenceImageSize} + promptTag={promptTags.get(referenceImage.id)} /> ))} diff --git a/invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCard.tsx b/invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCard.tsx index d6b3cec080b..d700ea4772f 100644 --- a/invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCard.tsx +++ b/invokeai/frontend/webv2/src/features/generation/ui/reference-images/ReferenceImageCard.tsx @@ -7,15 +7,24 @@ import type { } from '@features/generation/core/types'; import type { CSSProperties } from 'react'; -import { Box, HStack, Icon, Stack, Text } from '@chakra-ui/react'; +import { Box, HStack, Icon, Stack, Text, VisuallyHidden } from '@chakra-ui/react'; import { FindInGalleryButton } from '@features/gallery/mediaSlot'; import { getEffectiveReferenceImage } from '@features/generation/core/referenceImage'; import { getReferenceImageUrls } from '@features/generation/data/referenceImageUrls'; import { GenerationModelSelect as ModelSelect } from '@features/generation/ui/GenerationUiContext'; import { useExitPresence } from '@platform/react/useExitRetainedValue'; -import { IconButton, ToggleDot, Tooltip } from '@platform/ui'; -import { ArrowDownIcon, ArrowUpIcon, ChevronDownIcon, CropIcon, ImageIcon, RulerIcon, Trash2Icon } from 'lucide-react'; -import { memo, useCallback, useRef, useState } from 'react'; +import { Button, IconButton, toaster, ToggleDot, Tooltip } from '@platform/ui'; +import { + ArrowDownIcon, + ArrowUpIcon, + CheckIcon, + ChevronDownIcon, + CropIcon, + ImageIcon, + RulerIcon, + Trash2Icon, +} from 'lucide-react'; +import { memo, useCallback, useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { formatWeight, getModeLabelKey } from './referenceImageConfig'; @@ -41,6 +50,7 @@ const COVER_IMG_STYLE: CSSProperties = { objectFit: 'cover', width: '100%', }; +const PROMPT_TAG_COPIED_MS = 1500; const OVERLAY_GRADIENT_STYLE: CSSProperties = { background: 'linear-gradient(to top, rgba(0, 0, 0, 0.72), transparent)', }; @@ -55,6 +65,8 @@ interface ReferenceImageCardProps { onPatch: (id: string, patch: Partial) => void; onRemove: (id: string) => void; onUseSize: (image: GenerateReferenceImageAsset) => void; + /** How the prompt names this reference, for models that address references by tag. */ + promptTag?: string; } const ReferenceImageCardBase = ({ @@ -65,6 +77,7 @@ const ReferenceImageCardBase = ({ onPatch, onRemove, onUseSize, + promptTag, referenceImage, selectedModel, }: ReferenceImageCardProps) => { @@ -157,6 +170,8 @@ const ReferenceImageCardBase = ({ )} + {promptTag ? : null} + {/* Array order is conditioning order. */} @@ -268,6 +283,59 @@ const ReferenceImageCardBase = ({ export const ReferenceImageCard = memo(ReferenceImageCardBase); +const PromptTagButton = ({ tag }: { tag: string }) => { + const { t } = useTranslation(); + const [hasCopied, setHasCopied] = useState(false); + const resetTimerRef = useRef | null>(null); + + useEffect( + () => () => { + if (resetTimerRef.current !== null) { + clearTimeout(resetTimerRef.current); + } + }, + [] + ); + + const copyTag = useCallback(() => { + // `navigator.clipboard` is undefined outside a secure context (plain http on a LAN address); the promise + // chain turns that into the same failure path as a denied permission. + Promise.resolve() + .then(() => navigator.clipboard.writeText(tag)) + .then(() => { + setHasCopied(true); + if (resetTimerRef.current !== null) { + clearTimeout(resetTimerRef.current); + } + resetTimerRef.current = setTimeout(() => setHasCopied(false), PROMPT_TAG_COPIED_MS); + }) + .catch(() => + toaster.create({ description: t('common.clipboardBlocked'), title: t('common.couldNotCopy'), type: 'error' }) + ); + }, [t, tag]); + + return ( + + + + ); +}; + const ReferenceModelSelector = ({ config, disabled, diff --git a/invokeai/frontend/webv2/src/features/models/core/baseIdentity.test.ts b/invokeai/frontend/webv2/src/features/models/core/baseIdentity.test.ts index bf53cddcc87..b41f333ebb5 100644 --- a/invokeai/frontend/webv2/src/features/models/core/baseIdentity.test.ts +++ b/invokeai/frontend/webv2/src/features/models/core/baseIdentity.test.ts @@ -76,6 +76,7 @@ describe('MODEL_BASES', () => { 'sd-3', 'flux', 'flux2', + 'flux3', 'cogview4', 'ernie-image', 'qwen-image', diff --git a/invokeai/frontend/webv2/src/features/models/core/baseIdentity.ts b/invokeai/frontend/webv2/src/features/models/core/baseIdentity.ts index 3bf13ea93a8..0687cc06bea 100644 --- a/invokeai/frontend/webv2/src/features/models/core/baseIdentity.ts +++ b/invokeai/frontend/webv2/src/features/models/core/baseIdentity.ts @@ -83,6 +83,11 @@ export const MODEL_BASES = { label: 'FLUX.2', colorPalette: 'ice', }, + flux3: { + base: 'flux3', + label: 'FLUX.3', + colorPalette: 'ice', + }, cogview4: { base: 'cogview4', label: 'CogView4', diff --git a/invokeai/frontend/webv2/src/features/models/core/relationships.ts b/invokeai/frontend/webv2/src/features/models/core/relationships.ts index b4c6c84ca57..69f5e723d5c 100644 --- a/invokeai/frontend/webv2/src/features/models/core/relationships.ts +++ b/invokeai/frontend/webv2/src/features/models/core/relationships.ts @@ -18,13 +18,13 @@ export const NULL_BASE_ALLOWANCES: Readonly = { gigantic: 'CLIP G', i2v_a14b: 'Wan 2.2 I2V A14B', inpaint: 'Inpaint', + flux3_klein: 'FLUX.3 Klein', + flux3_klein_base: 'FLUX.3 Klein Base', klein_4b: 'FLUX.2 Klein 4B', klein_4b_base: 'FLUX.2 Klein 4B Base', klein_9b: 'FLUX.2 Klein 9B', @@ -135,7 +137,7 @@ export const MODEL_VARIANT_LABELS: Record = { qwen3_4b: 'Qwen3 4B', qwen3_8b: 'Qwen3 8B', qwen3_5_4b: 'Qwen3.5 4B (Anima-3.8B)', - qwen3_vl_4b: 'Qwen3-VL 4B (Krea-2)', + qwen3_vl_4b: 'Qwen3-VL 4B (Krea-2, FLUX.3)', qwen3_vl_8b: 'Qwen3-VL 8B (Ideogram 4, Qwen-Image-2.1)', qwen_image_21_base: 'Qwen-Image-2.1 Base', qwen_image_21_turbo: 'Qwen-Image-2.1 Turbo', @@ -159,6 +161,7 @@ const MAIN_VARIANTS_BY_BASE: Record = { anima: ['anima_qwen3', 'anima_qwen35'], flux: ['schnell', 'dev', 'dev_fill'], flux2: ['klein_4b', 'klein_4b_base', 'klein_9b', 'klein_9b_base', 'dev'], + flux3: ['flux3_klein', 'flux3_klein_base'], 'krea-2': ['krea2_turbo', 'krea2_base'], 'ltx-2': ['ltx2_dev', 'ltx2_distilled'], 'minimax-h3': ['fl2va', 'ref2va'], diff --git a/invokeai/frontend/webv2/src/features/models/core/types.ts b/invokeai/frontend/webv2/src/features/models/core/types.ts index de39d5ea2d9..1fac37c14ea 100644 --- a/invokeai/frontend/webv2/src/features/models/core/types.ts +++ b/invokeai/frontend/webv2/src/features/models/core/types.ts @@ -13,6 +13,7 @@ export type ModelBase = | 'sdxl-refiner' | 'flux' | 'flux2' + | 'flux3' | 'cogview4' | 'ernie-image' | 'qwen-image' diff --git a/invokeai/frontend/webv2/src/features/workflow/core/modelRequirements.ts b/invokeai/frontend/webv2/src/features/workflow/core/modelRequirements.ts index 484fbe62048..9d5fa700e4f 100644 --- a/invokeai/frontend/webv2/src/features/workflow/core/modelRequirements.ts +++ b/invokeai/frontend/webv2/src/features/workflow/core/modelRequirements.ts @@ -36,6 +36,7 @@ const BASE_LABELS: Record = { external: 'External', flux: 'FLUX', flux2: 'FLUX.2', + flux3: 'FLUX.3', 'ideogram-4': 'Ideogram 4', 'krea-2': 'Krea-2', 'minimax-h3': 'MiniMax H3', diff --git a/invokeai/invocation_api/__init__.py b/invokeai/invocation_api/__init__.py index b0a85e7a3e4..6077ceff8a4 100644 --- a/invokeai/invocation_api/__init__.py +++ b/invokeai/invocation_api/__init__.py @@ -140,6 +140,7 @@ CogView4ConditioningInfo, ConditioningFieldData, ErnieImageConditioningInfo, + Flux3ConditioningInfo, FLUXConditioningInfo, Ideogram4ConditioningInfo, Krea2ConditioningInfo, @@ -242,6 +243,7 @@ "ConditioningFieldData", "ErnieImageConditioningInfo", "FLUXConditioningInfo", + "Flux3ConditioningInfo", "Ideogram4ConditioningInfo", "Krea2ConditioningInfo", "LTX2ConditioningInfo", diff --git a/pyproject.toml b/pyproject.toml index 786a71e56d0..25faf1bad18 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -637,15 +637,16 @@ select = ["B", "C", "E", "F", "W", "I", "TID"] "invokeai/backend/minimax_h3/scheduling_minimax_h3.py" = ["B905"] [tool.ruff.format] -# The vendored MiniMax-H3 files are kept byte-identical to upstream diffusers (modulo the +# The vendored MiniMax-H3 and FLUX.3 files are kept byte-identical to upstream diffusers (modulo the # absolute-import rewrite) so that re-syncing when a tagged diffusers ships them is a clean copy # rather than a manual re-application of formatting. Upstream wraps at a narrower line length, so # `ruff format` would rewrap lines for no semantic gain. `ruff check` still runs on them, so the # import sorting this project does enforce stays enforced. # -# Listed file by file rather than as a directory glob: the package also holds first-party modules +# Listed file by file rather than as a directory glob: the packages also hold first-party modules # (presets.py, sampling.py, denoise.py, int8_convrot.py, ...) which must stay formatted. exclude = [ + "invokeai/backend/flux3/transformer_flux3.py", "invokeai/backend/minimax_h3/packing.py", "invokeai/backend/minimax_h3/transformer_minimax_h3.py", "invokeai/backend/minimax_h3/autoencoder_kl_minimax_h3.py", diff --git a/tests/app/invocations/test_flux2_denoise_img2img_normalization.py b/tests/app/invocations/test_flux2_denoise_img2img_normalization.py index 70fc3006d65..2ebe9220eb3 100644 --- a/tests/app/invocations/test_flux2_denoise_img2img_normalization.py +++ b/tests/app/invocations/test_flux2_denoise_img2img_normalization.py @@ -11,6 +11,7 @@ import torch from invokeai.app.invocations.flux2_denoise import Flux2DenoiseInvocation +from invokeai.backend.flux2.latent_norm import bn_normalize # Measured on the BFL FLUX.2 VAE (bn.running_mean / bn.running_var): mean ~0, var ~3.13. BN_STD_VALUE = 1.7676 @@ -66,7 +67,7 @@ def test_start_latents_differ_from_normalizing_the_raw_mixture() -> None: bn_std=bn_std, ) - buggy = invocation._bn_normalize(t_0 * noise + (1.0 - t_0) * init_latents, bn_mean, bn_std) + buggy = bn_normalize(t_0 * noise + (1.0 - t_0) * init_latents, bn_mean, bn_std) # The buggy variant attenuates the noise term by 1 / bn_std. assert not torch.allclose(x, buggy, atol=1e-3) assert torch.allclose(x - buggy, t_0 * (noise - (noise - bn_mean) / bn_std), atol=1e-5) diff --git a/tests/app/invocations/test_flux3_denoise_wiring.py b/tests/app/invocations/test_flux3_denoise_wiring.py new file mode 100644 index 00000000000..35988c2add3 --- /dev/null +++ b/tests/app/invocations/test_flux3_denoise_wiring.py @@ -0,0 +1,207 @@ +"""How ``Flux3DenoiseInvocation._run_diffusion`` wires schedule, start latents, inpainting and CFG together. + +The backend loop and the schedule helpers have tests of their own; what those cannot see is the node that calls +them. Each of these one-line breakages passed the suite before (the same ones FLUX.2 had): + +* normalizing the noise, or the noise-and-init mixture, instead of only the init latents (#8964); +* handing the inpaint extension normalized noise, which rescales the noise outside the mask; +* dropping the ``1 - mask`` inversion, which regenerates the region that should be kept; +* skipping the respacing of a clipped schedule, or taking ``t_0`` from the unclipped one; +* returning the early (nothing-to-step) result without denormalizing it. + +The tests run the real ``_run_diffusion`` with the backend ``denoise`` replaced by a recorder. +""" + +from types import SimpleNamespace +from unittest.mock import MagicMock, patch + +import pytest +import torch + +import invokeai.app.invocations.flux3.flux3_denoise as flux3_denoise +from invokeai.app.invocations.flux3.flux3_denoise import Flux3DenoiseInvocation +from invokeai.backend.flux.sampling_utils import clip_timestep_schedule_fractional +from invokeai.backend.flux2.latent_norm import bn_denormalize, bn_normalize +from invokeai.backend.flux2.sampling_utils import pack_flux2, unpack_flux2 +from invokeai.backend.flux3.sampling import get_schedule_flux3, redensify_schedule_flux3 +from invokeai.backend.model_manager.taxonomy import BaseModelType, Flux3VariantType, ModelType +from invokeai.backend.rectified_flow.rectified_flow_inpaint_extension import RectifiedFlowInpaintExtension +from invokeai.backend.stable_diffusion.diffusion.conditioning_data import ( + ConditioningFieldData, + Flux3ConditioningInfo, +) + +# Far enough from (0, 1) that a stray or missing normalization is obvious. +BN_MEAN = torch.full((128,), 0.05) +BN_STD = torch.full((128,), 1.7676) +SIZE = 128 +LATENT = SIZE // 8 +STEPS = 4 + + +def _tensor(seed: int, *shape: int) -> torch.Tensor: + return torch.randn(*shape, generator=torch.Generator().manual_seed(seed)) + + +def _drive( + *, + variant: Flux3VariantType = Flux3VariantType.Klein, + denoising_start: float = 0.0, + denoising_end: float = 1.0, + with_init: bool = False, + with_mask: bool = False, + cfg_scale: float = 1.0, + captured: dict | None = None, +): + noise = _tensor(7, 1, 32, LATENT, LATENT) + tensors = {"init": _tensor(8, 1, 32, LATENT, LATENT), "mask": torch.rand(1, 1, LATENT, LATENT)} + captured = {} if captured is None else captured + captured.update({"denoise": [], "inpaint": [], "noise": noise, **tensors}) + + def model_info(model): + info = MagicMock() + info.model = model + info.model_on_device.return_value.__enter__.return_value = (None, model) + return info + + transformer = SimpleNamespace(config=SimpleNamespace(flow_map=variant is Flux3VariantType.Klein)) + vae_info, transformer_info = model_info(MagicMock()), model_info(transformer) + + context = MagicMock() + context.models.get_config.return_value = SimpleNamespace( + base=BaseModelType.Flux3, type=ModelType.Main, name="flux3", variant=variant + ) + context.models.load.side_effect = lambda key: vae_info if key == "vae" else transformer_info + context.conditioning.load.side_effect = lambda name: ConditioningFieldData( + conditionings=[Flux3ConditioningInfo(prompt_embeds=torch.full((1, 80, 8), 1.0 if name == "pos" else -1.0))] + ) + context.tensors.load.side_effect = lambda name: tensors[name].clone() + captured["context"] = context + + invocation = Flux3DenoiseInvocation.model_construct( + latents=SimpleNamespace(latents_name="init") if with_init else None, + denoise_mask=SimpleNamespace(mask_name="mask") if with_mask else None, + denoising_start=denoising_start, + denoising_end=denoising_end, + add_noise=True, + transformer=SimpleNamespace(transformer="transformer", loras=[]), + positive_conditioning=SimpleNamespace(conditioning_name="pos"), + negative_conditioning=SimpleNamespace(conditioning_name="neg"), + cfg_scale=cfg_scale, + width=SIZE, + height=SIZE, + steps=STEPS, + seed=0, + vae=SimpleNamespace(vae="vae"), + kontext_conditioning=None, + ) + + def recording_denoise(**kwargs): + captured["denoise"].append(kwargs) + return kwargs["img"] + + class _RecordingInpaintExtension(RectifiedFlowInpaintExtension): + def __init__(self, *, init_latents, inpaint_mask, noise): + captured["inpaint"].append({"init_latents": init_latents, "inpaint_mask": inpaint_mask, "noise": noise}) + super().__init__(init_latents, inpaint_mask, noise) + + with ( + patch.object(flux3_denoise.TorchDevice, "choose_torch_device", return_value=torch.device("cpu")), + patch.object(flux3_denoise, "read_vae_bn_stats", return_value=(BN_MEAN, BN_STD)), + patch.object(flux3_denoise, "get_noise_flux3", return_value=noise), + patch.object(flux3_denoise, "peak_dequant_transient_bytes", return_value=0), + patch.object(flux3_denoise, "denoise", recording_denoise), + patch.object(flux3_denoise, "RectifiedFlowInpaintExtension", _RecordingInpaintExtension), + ): + captured["result"] = invocation._run_diffusion(context) + captured["transformer_info"] = transformer_info + return captured + + +def _expected_schedule(denoising_start: float, denoising_end: float = 1.0) -> list[float]: + clipped = clip_timestep_schedule_fractional(get_schedule_flux3(STEPS), denoising_start, denoising_end) + return redensify_schedule_flux3(clipped, STEPS) + + +def _normalized_init(captured) -> torch.Tensor: + return bn_normalize(pack_flux2(captured["init"]), BN_MEAN, BN_STD) + + +def test_txt2img_starts_from_unit_noise_and_returns_denormalized_latents() -> None: + captured = _drive() + + (call,) = captured["denoise"] + assert torch.equal(call["img"], pack_flux2(captured["noise"])) + assert call["timesteps"] == pytest.approx(get_schedule_flux3(STEPS)) + assert call["flow_map"] is True and call["neg_txt"] is None and call["inpaint_extension"] is None + # The recorder hands the start back unchanged, so the output is the noise taken out of the normalized space. + expected = unpack_flux2(bn_denormalize(pack_flux2(captured["noise"]), BN_MEAN, BN_STD), SIZE, SIZE) + assert torch.allclose(captured["result"], expected) + + +def test_img2img_blends_unit_noise_with_normalized_init_on_the_respaced_schedule() -> None: + captured = _drive(with_init=True, denoising_start=0.5) + + (call,) = captured["denoise"] + expected_schedule = _expected_schedule(0.5) + assert len(expected_schedule) == STEPS + 1, "the clipped window is respaced to the requested steps" + assert call["timesteps"] == pytest.approx(expected_schedule) + + t_0 = expected_schedule[0] + assert t_0 != pytest.approx(1.0), "precondition: the clip moved t_0" + noise_packed = pack_flux2(captured["noise"]) + expected = t_0 * noise_packed + (1.0 - t_0) * _normalized_init(captured) + assert torch.allclose(call["img"], expected, atol=1e-6) + # Normalizing the mixture instead divides the noise term by bn_std as well. + mixture = t_0 * noise_packed + (1.0 - t_0) * pack_flux2(captured["init"]) + assert not torch.allclose(call["img"], bn_normalize(mixture, BN_MEAN, BN_STD), atol=1e-2) + + +def test_the_head_of_a_split_chain_keeps_the_steps_of_its_window() -> None: + """Respacing a window that starts at 0 would run the head of a two-node chain at the full step count.""" + captured = _drive(denoising_end=0.1) + + (call,) = captured["denoise"] + clipped = clip_timestep_schedule_fractional(get_schedule_flux3(STEPS), 0.0, 0.1) + assert len(clipped) - 1 < STEPS, "precondition: the window holds fewer steps than requested" + assert call["timesteps"] == pytest.approx(clipped) + + +def test_the_inpaint_extension_gets_unit_noise_normalized_init_and_the_inverted_mask() -> None: + captured = _drive(with_init=True, with_mask=True) + + (recorded,) = captured["inpaint"] + assert torch.equal(recorded["noise"], pack_flux2(captured["noise"])) + assert torch.allclose(recorded["init_latents"], _normalized_init(captured)) + # The denoise mask marks what to keep; the extension wants 1 where it regenerates. + expected_mask = pack_flux2((1.0 - captured["mask"]).expand(1, 32, LATENT, LATENT)) + assert torch.allclose(recorded["inpaint_mask"], expected_mask, atol=1e-6) + assert captured["denoise"][0]["inpaint_extension"] is not None + + +def test_a_degenerate_window_returns_the_denormalized_blend_without_loading_the_transformer() -> None: + captured = _drive(with_init=True, denoising_start=0.5, denoising_end=0.5) + + assert captured["denoise"] == [] + assert not captured["transformer_info"].model_on_device.called + (t_0,) = _expected_schedule(0.5, 0.5) + blend = t_0 * pack_flux2(captured["noise"]) + (1.0 - t_0) * _normalized_init(captured) + expected = unpack_flux2(bn_denormalize(blend, BN_MEAN, BN_STD), SIZE, SIZE) + assert torch.allclose(captured["result"], expected, atol=1e-6) + + +def test_klein_base_runs_cfg_with_the_negative_conditioning() -> None: + captured = _drive(variant=Flux3VariantType.KleinBase, cfg_scale=3.5) + + (call,) = captured["denoise"] + assert call["flow_map"] is False and call["cfg_scale"] == 3.5 + assert torch.all(call["neg_txt"] == -1.0) and torch.all(call["txt"] == 1.0) + + +def test_klein_with_cfg_is_refused_before_any_model_loads() -> None: + """A workflow with CFG on Klein used to load the ~10 GB transformer before it failed.""" + captured: dict = {} + with pytest.raises(ValueError, match="samples without CFG"): + _drive(variant=Flux3VariantType.Klein, cfg_scale=2.0, captured=captured) + + assert not captured["context"].models.load.called diff --git a/tests/app/invocations/test_frontend_graph_node_types.py b/tests/app/invocations/test_frontend_graph_node_types.py index 77bc5c37520..06591bcbe62 100644 --- a/tests/app/invocations/test_frontend_graph_node_types.py +++ b/tests/app/invocations/test_frontend_graph_node_types.py @@ -103,15 +103,15 @@ def test_every_connection_the_panel_compiles_is_one_the_queue_will_accept(contra # The number of architectures each panel supports. A contract that silently stopped being # regenerated would make every assertion below vacuous, so the count is pinned: a new architecture # updates this number and the fixture in the same commit. -SUPPORTED_BASE_COUNTS = {"generate": 15, "video": 3, "upscale": 5} +SUPPORTED_BASE_COUNTS = {"generate": 16, "video": 3, "upscale": 5} # Floors separating "the fixture records literals" from "it records a fraction of them". Set just -# under the current numbers (generate: 58 node types carrying 252 scalar values; video: 25 carrying +# under the current numbers (generate: 65 node types carrying 284 scalar values; video: 25 carrying # 142; upscale: 39 carrying 164) rather than far below them: a recording bug that dropped most of the # values while keeping the names would otherwise leave every annotation check below passing over a # short list. They are not per-architecture expectations, so removing an architecture means lowering # them deliberately. -LITERAL_FLOORS = {"generate": (55, 240), "video": (23, 135), "upscale": (37, 155)} +LITERAL_FLOORS = {"generate": (62, 270), "video": (23, 135), "upscale": (37, 155)} @pytest.mark.parametrize("contract", sorted(CONTRACTS), ids=lambda contract: contract) diff --git a/tests/app/invocations/test_ideal_size.py b/tests/app/invocations/test_ideal_size.py index 7a504e2c6ef..35722818a64 100644 --- a/tests/app/invocations/test_ideal_size.py +++ b/tests/app/invocations/test_ideal_size.py @@ -51,6 +51,7 @@ def _invoke( BaseModelType.ErnieImage: (1360, 768), BaseModelType.Flux: (1360, 768), BaseModelType.Flux2: (1360, 768), + BaseModelType.Flux3: (1360, 768), BaseModelType.Ideogram4: (1360, 768), BaseModelType.Krea2: (1360, 768), # Declared 1248x704 (non-square, like H3): 878592 px at 1.7778 -> height sqrt(494208) = 703.0 diff --git a/tests/backend/architectures/test_conditioning.py b/tests/backend/architectures/test_conditioning.py index d013ea62f86..b296f0f2ae2 100644 --- a/tests/backend/architectures/test_conditioning.py +++ b/tests/backend/architectures/test_conditioning.py @@ -35,10 +35,10 @@ def test_the_shared_types_are_shared_by_identity() -> None: assert facet is not None and facet.info is info, base.value -def test_fifteen_types_serve_eighteen_architectures() -> None: - """Pins the sharing itself. A sixteenth type means a new architecture stopped sharing.""" - assert len(conditioning_infos()) == 15 - assert len(generative_bases()) == 18 +def test_sixteen_types_serve_nineteen_architectures() -> None: + """Pins the sharing itself. A seventeenth type means a new architecture stopped sharing.""" + assert len(conditioning_infos()) == 16 + assert len(generative_bases()) == 19 def test_the_list_is_deterministic() -> None: @@ -115,12 +115,12 @@ def test_dependencies_imports_that_list_from_the_architecture_package() -> None: def test_the_assembled_list_holds_every_conditioning_class_exactly_once() -> None: - """The content of what the call site passes: the envelope first, then all fifteen classes.""" + """The content of what the call site passes: the envelope first, then all sixteen classes.""" safe_globals = conditioning_safe_globals() assert safe_globals[0] is ConditioningFieldData assert set(safe_globals[1:]) == set(conditioning_infos()) - assert len(safe_globals) == 16 + assert len(safe_globals) == 17 assert len(set(safe_globals)) == len(safe_globals), "a class appears twice" diff --git a/tests/backend/architectures/test_default_settings.py b/tests/backend/architectures/test_default_settings.py index 56af57cd0b0..2ab6afda7fc 100644 --- a/tests/backend/architectures/test_default_settings.py +++ b/tests/backend/architectures/test_default_settings.py @@ -15,6 +15,7 @@ AnyVariant, BaseModelType, Flux2VariantType, + Flux3VariantType, FluxVariantType, Krea2VariantType, LTX2VariantType, @@ -217,6 +218,20 @@ def test_every_architecture_declares_defaults() -> None: None, {"scheduler": "euler", "steps": 48, "cfg_scale": 1.0, **_SQUARE_1024}, ), + ( + "flux3-klein-base", + BaseModelType.Flux3, + Flux3VariantType.KleinBase, + None, + {"steps": 50, "cfg_scale": 3.5, **_SQUARE_1024}, + ), + ( + "flux3-klein", + BaseModelType.Flux3, + None, + None, + {"steps": 16, "cfg_scale": 1.0, **_SQUARE_1024}, + ), ( "krea-2-base", BaseModelType.Krea2, diff --git a/tests/backend/architectures/test_features.py b/tests/backend/architectures/test_features.py index 4d92ee605a7..c53a584f4f9 100644 --- a/tests/backend/architectures/test_features.py +++ b/tests/backend/architectures/test_features.py @@ -15,6 +15,7 @@ BaseModelType.CogView4: "cogview4_denoise", BaseModelType.Flux: "flux_denoise", BaseModelType.Flux2: "flux2_denoise", + BaseModelType.Flux3: "flux3_denoise", BaseModelType.ZImage: "z_image_denoise", BaseModelType.ErnieImage: "ernie_image_denoise", BaseModelType.Ideogram4: "ideogram4_denoise", @@ -86,7 +87,7 @@ def test_reference_images_and_the_one_variant_condition() -> None: supported = { b.value for b in generative_bases() if (f := get(b, FeaturesFacet)) is not None and f.supports_reference_images } - assert supported == {"flux", "flux2", "sd-1", "sdxl", "qwen-image"} + assert supported == {"flux", "flux2", "flux3", "sd-1", "sdxl", "qwen-image"} conditional = { b.value @@ -129,6 +130,7 @@ def test_the_negative_prompt_policy_follows_the_guidance_model() -> None: assert by_usage["never"] == {"flux", "flux2", "ideogram-4", "minimax-h3"} assert by_usage["cfg-gated"] == { "anima", + "flux3", "krea-2", "qwen-image", "qwen-image-2-1", diff --git a/tests/backend/architectures/test_guidance_range.py b/tests/backend/architectures/test_guidance_range.py index 4b54760aad2..0f35b51ae09 100644 --- a/tests/backend/architectures/test_guidance_range.py +++ b/tests/backend/architectures/test_guidance_range.py @@ -35,6 +35,7 @@ BaseModelType.CogView4: ("cogview4_denoise", "cfg_scale"), BaseModelType.Krea2: ("krea2_denoise", "cfg_scale"), BaseModelType.QwenImage21: ("qwen_image_2_1_denoise", "cfg_scale"), + BaseModelType.Flux3: ("flux3_denoise", "cfg_scale"), BaseModelType.QwenImage: ("qwen_image_denoise", "cfg_scale"), BaseModelType.Flux: ("flux_denoise", "guidance"), BaseModelType.Flux2: ("flux2_denoise", "guidance"), diff --git a/tests/backend/architectures/test_latent_space.py b/tests/backend/architectures/test_latent_space.py index 33e0d8e8349..37eedc0e299 100644 --- a/tests/backend/architectures/test_latent_space.py +++ b/tests/backend/architectures/test_latent_space.py @@ -58,6 +58,8 @@ def _name(space: LatentSpace) -> str: BaseModelType.ErnieImage: (FLUX2_32,), BaseModelType.Flux: (FLUX_16,), BaseModelType.Flux2: (FLUX2_32,), + # The FLUX.3 VAE is byte-identical to FLUX.2's. + BaseModelType.Flux3: (FLUX2_32,), # The one row the `if/elif` chain cannot corroborate: it had no Ideogram 4 branch and would # have raised "Unsupported base model" here. The second, divergent copy of the projection is # the source instead -- `ideogram4_denoise.py` at the same revision built its own preview from diff --git a/tests/backend/flux2/test_reference_encode_tiling.py b/tests/backend/flux2/test_reference_encode_tiling.py new file mode 100644 index 00000000000..fd5594c13df --- /dev/null +++ b/tests/backend/flux2/test_reference_encode_tiling.py @@ -0,0 +1,130 @@ +"""Which reference encode `encode_reference_image` runs: tiled always (FLUX.2), or untiled where it can (FLUX.3). + +A tiled encode is a different encode, not a cheaper copy of the untiled one: each tile's mid-block attention +sees only that tile. These tests pin which one each mode produces, on a tiny real FLUX.2 VAE, and that the +shared VAE's tiling settings survive the call. +""" + +from contextlib import contextmanager + +import pytest +import torch +import torchvision.transforms as T +from diffusers import AutoencoderKLFlux2 +from PIL import Image + +import invokeai.backend.flux2.ref_image_extension as ref_image_extension +from invokeai.backend.flux2.ref_image_extension import REF_ENCODE_TILE_SIZE, encode_reference_image + +# Larger than one 512 px tile, so the tiled and untiled encodes differ. +SIZE = 768 + + +class _LoadedVae: + """The part of `LoadedModel` the encode uses.""" + + def __init__(self, vae: AutoencoderKLFlux2): + self.model = vae + + @contextmanager + def model_on_device(self, working_mem_bytes: int | None = None): + yield None, self.model + + +@pytest.fixture(scope="module") +def vae() -> AutoencoderKLFlux2: + torch.manual_seed(0) + return AutoencoderKLFlux2( + block_out_channels=(32, 64, 64, 64), latent_channels=32, layers_per_block=1, norm_num_groups=32 + ).eval() + + +@pytest.fixture(scope="module") +def image() -> Image.Image: + pixels = torch.rand(3, SIZE, SIZE, generator=torch.Generator().manual_seed(1)) + return T.ToPILImage()(pixels) + + +@pytest.fixture(autouse=True) +def _cpu(monkeypatch: pytest.MonkeyPatch) -> None: + monkeypatch.setattr(ref_image_extension.TorchDevice, "choose_torch_device", lambda: torch.device("cpu")) + + +def _direct_encode(vae: AutoencoderKLFlux2, image: Image.Image, tiled: bool) -> torch.Tensor: + pixels = (T.ToTensor()(image) * 2.0 - 1.0).unsqueeze(0) + saved = (vae.use_tiling, vae.tile_sample_min_size, vae.tile_latent_min_size) + vae.use_tiling = tiled + vae.tile_sample_min_size, vae.tile_latent_min_size = REF_ENCODE_TILE_SIZE, REF_ENCODE_TILE_SIZE // 8 + try: + with torch.no_grad(): + return vae.encode(pixels, return_dict=False)[0].mode() + finally: + vae.use_tiling, vae.tile_sample_min_size, vae.tile_latent_min_size = saved + + +@pytest.fixture(scope="module") +def expected(vae: AutoencoderKLFlux2, image: Image.Image) -> dict[str, torch.Tensor]: + encodes = {"tiled": _direct_encode(vae, image, tiled=True), "untiled": _direct_encode(vae, image, tiled=False)} + assert not torch.allclose(encodes["tiled"], encodes["untiled"], atol=1e-4), "precondition: tiling matters here" + return encodes + + +def _encode(vae: AutoencoderKLFlux2, image: Image.Image, **kwargs) -> torch.Tensor: + with torch.no_grad(): + return encode_reference_image(_LoadedVae(vae), image, **kwargs) + + +def test_flux2_keeps_its_tiled_encode(vae, image, expected) -> None: + assert torch.allclose(_encode(vae, image), expected["tiled"], atol=1e-5) + + +@pytest.mark.parametrize(("materializes", "kind"), [(False, "untiled"), (True, "tiled")]) +def test_the_conditional_mode_tiles_only_where_attention_would_materialize( + vae, image, expected, monkeypatch: pytest.MonkeyPatch, materializes: bool, kind: str +) -> None: + monkeypatch.setattr(ref_image_extension, "flux2_vae_attention_materializes", lambda *_: materializes) + + latents = _encode(vae, image, tiling="if_attention_materializes") + + assert torch.allclose(latents, expected[kind], atol=1e-5) + + +def test_the_shared_vae_keeps_its_own_tiling_settings(vae, image, monkeypatch: pytest.MonkeyPatch) -> None: + """The VAE is a cached instance; the final decode must not inherit the reference encode's settings.""" + before = (vae.use_tiling, vae.tile_sample_min_size, vae.tile_latent_min_size) + monkeypatch.setattr(ref_image_extension, "flux2_vae_attention_materializes", lambda *_: False) + + _encode(vae, image, tiling="if_attention_materializes") + _encode(vae, image) + + assert (vae.use_tiling, vae.tile_sample_min_size, vae.tile_latent_min_size) == before + + +@pytest.mark.parametrize( + ("total_gb", "estimate_gb", "expected"), + [(24, 9.2, None), (8, 9.2, REF_ENCODE_TILE_SIZE), (8, 2.3, None)], + ids=["4mp-on-24gb", "4mp-on-8gb", "1mp-on-8gb"], +) +def test_an_untiled_encode_is_taken_only_where_it_fits_the_card( + vae, monkeypatch: pytest.MonkeyPatch, total_gb: int, estimate_gb: float, expected: int | None +) -> None: + """Fused attention keeps an untiled encode linear in area, but a 4 MP one still outgrows an 8 GB card.""" + monkeypatch.setattr(ref_image_extension, "flux2_vae_attention_materializes", lambda *_: False) + monkeypatch.setattr(ref_image_extension, "estimate_vae_working_memory_flux2", lambda **_: int(estimate_gb * 2**30)) + monkeypatch.setattr( + ref_image_extension.torch.cuda, + "get_device_properties", + lambda device: type("Props", (), {"total_memory": total_gb * 2**30})(), + ) + pixels = torch.zeros(1, 3, 64, 64) + + assert ( + ref_image_extension.reference_encode_tile_size( + pixels, vae, torch.device("cuda"), tiling="if_attention_materializes" + ) + == expected + ) + assert ( + ref_image_extension.reference_encode_tile_size(pixels, vae, torch.device("cuda"), tiling="always") + == REF_ENCODE_TILE_SIZE + ) diff --git a/tests/backend/flux3/flux3_fixture.py b/tests/backend/flux3/flux3_fixture.py new file mode 100644 index 00000000000..14613447815 --- /dev/null +++ b/tests/backend/flux3/flux3_fixture.py @@ -0,0 +1,140 @@ +"""A tiny FLUX.3 transformer, written out in Black Forest Labs' native key layout. + +Shared by the conversion, loader and identification tests. The native names are enumerated here from the +layout every release uses (``tests/backend/model_manager/load/state_dicts/flux3_klein_keys.py`` is the +captured real one), not derived from the converter under test; ``test_conversion`` checks the two agree. + +The head width is the released 128: the rotary axes are fixed at (32, 32, 32, 32) and the loader refuses any +other width. Everything else is small. Weights are random rather than the diffusers zero-init, so a forward +through a mis-wired parameter cannot pass by multiplying by zero. +""" + +from pathlib import Path + +import gguf +import torch +from gguf.quants import dequantize, quantize + +from invokeai.backend.flux3 import Flux3Transformer2DModel +from invokeai.backend.flux3.conversion import flux3_native_key_to_diffusers + +TINY_CONFIG = { + "in_channels": 32, + "cond_in_channels": 32, + "num_layers": 1, + "num_single_layers": 2, + "attention_head_dim": 128, + "num_attention_heads": 2, + "joint_attention_dim": 256, + "timestep_channels": 32, +} + +_BLOCK_PARAMS = ( + "q_proj.weight", + "k_proj.weight", + "v_proj.weight", + "attn_out.weight", + "mlp_in.weight", + "mlp_out.weight", + "norm.query_norm.scale", + "norm.key_norm.scale", +) +_ADALN = "final_layer.image.adaLN_modulation.1.weight" + + +def native_flux3_keys(num_layers: int, num_single_layers: int, flow_map: bool) -> list[str]: + keys = [ + "emb_in.image.weight", + "emb_in.image_cond.weight", + "txt_in.weight", + "time_in.in_layer.weight", + "time_in.out_layer.weight", + "final_layer.image.linear.weight", + _ADALN, + ] + if flow_map: + keys += ["ref_time_in.in_layer.weight", "ref_time_in.out_layer.weight"] + for stage in ("early_stream_modulations", "single_stream_modulations"): + keys += [f"{stage}.{mode}.lin.weight" for mode in ("image", "image_cond", "txt")] + stacks = [f"content_mode_blocks.{mode}.{i}" for mode in ("image", "image_cond") for i in range(num_layers)] + stacks += [f"txt_mode_blocks.{i}" for i in range(num_layers)] + stacks += [f"single_blocks.{i}" for i in range(num_single_layers)] + keys += [f"{stack}.{param}" for stack in stacks for param in _BLOCK_PARAMS] + return keys + + +def tiny_flux3_model(flow_map: bool, seed: int = 0) -> Flux3Transformer2DModel: + torch.manual_seed(seed) + model = Flux3Transformer2DModel(**TINY_CONFIG, flow_map=flow_map).eval() + with torch.no_grad(): + for param in model.parameters(): + param.normal_(0.0, 0.05) + return model + + +def to_native(model: Flux3Transformer2DModel) -> dict[str, torch.Tensor]: + """The model's weights under BFL's names, with the output adaLN in BFL's [shift, scale] order.""" + diffusers_sd = model.state_dict() + native = {} + for key in native_flux3_keys(TINY_CONFIG["num_layers"], TINY_CONFIG["num_single_layers"], model.config.flow_map): + value = diffusers_sd[flux3_native_key_to_diffusers(key)].clone() + if key == _ADALN: + scale, shift = value.chunk(2, dim=0) + value = torch.cat([shift, scale], dim=0) + native[key] = value + return native + + +def forward(model: torch.nn.Module, flow_map: bool, with_reference: bool = True) -> torch.Tensor: + """One step over four image tokens, two reference tokens and three text tokens.""" + generator = torch.Generator().manual_seed(1) + kwargs = {} + if with_reference: + kwargs = { + "image_cond_hidden_states": torch.randn(1, 2, TINY_CONFIG["cond_in_channels"], generator=generator), + "image_cond_ids": torch.tensor([[0.0, 0.0, 0.0, -1.0], [0.0, 0.0, 0.5, -1.0]]), + } + with torch.no_grad(): + return model( + hidden_states=torch.randn(1, 4, TINY_CONFIG["in_channels"], generator=generator), + encoder_hidden_states=torch.randn(1, 3, TINY_CONFIG["joint_attention_dim"], generator=generator), + timestep=torch.tensor([0.7]), + img_ids=torch.tensor([[0.0, h * 0.5, w * 0.5, 0.0] for h in range(2) for w in range(2)]), + txt_ids=torch.tensor([[0.0, 0.0, 0.0, float(i)] for i in range(3)]), + target_timestep=torch.tensor([0.4]) if flow_map else None, + return_dict=False, + **kwargs, + )[0] + + +def write_flux3_gguf( + path: Path, + native: dict[str, torch.Tensor], + *, + qtype: gguf.GGMLQuantizationType = gguf.GGMLQuantizationType.Q8_0, + prefix: str = "", +) -> dict[str, torch.Tensor]: + """Write ``native`` the way the published GGUFs do: 2D weights in ``qtype``, norms in F32, the rest BF16. + + The architecture string is the published one, ``flux``. Returns the values a reader dequantizes each + tensor to, so a reference model can be built from what the file means. + """ + writer = gguf.GGUFWriter(str(path), "flux") + block_size = gguf.GGML_QUANT_SIZES[qtype][0] + meant: dict[str, torch.Tensor] = {} + for name, tensor in native.items(): + data = tensor.detach().to(torch.float32).numpy() + if name.endswith(".scale"): + stored_as = gguf.GGMLQuantizationType.F32 + elif data.ndim == 2 and data.shape[-1] % block_size == 0 and not name.startswith(("final_layer", "time_in")): + stored_as = qtype + else: + stored_as = gguf.GGMLQuantizationType.BF16 + raw = quantize(data, stored_as) + writer.add_tensor(prefix + name, raw, raw_shape=raw.shape, raw_dtype=stored_as) + meant[name] = torch.from_numpy(dequantize(raw, stored_as)).reshape(tensor.shape) + writer.write_header_to_file() + writer.write_kv_data_to_file() + writer.write_tensors_to_file() + writer.close() + return meant diff --git a/tests/backend/flux3/test_conversion.py b/tests/backend/flux3/test_conversion.py new file mode 100644 index 00000000000..efeee303ebf --- /dev/null +++ b/tests/backend/flux3/test_conversion.py @@ -0,0 +1,156 @@ +"""Native FLUX.3 checkpoints -> the vendored diffusers transformer. + +The real-layout tests read the key names and shapes captured from the released Klein and Klein Base files. +Converted onto the vendored module (on the meta device), every parameter must be filled and nothing may be +left over -- a renamed key in a re-upload shows up here, not as a block silently missing from a generation. +""" + +import accelerate +import pytest +import torch + +from invokeai.backend.flux3 import Flux3Transformer2DModel +from invokeai.backend.flux3.conversion import ( + convert_flux3_native_to_diffusers, + flux3_native_key_to_diffusers, + flux3_transformer_config, +) +from invokeai.backend.quantization.gguf.ggml_tensor import GGMLTensor +from tests.backend.flux3.flux3_fixture import TINY_CONFIG, native_flux3_keys +from tests.backend.model_manager.load.state_dicts import flux3_klein_base_keys, flux3_klein_keys + +# The released transformer config (transformer/config.json of both repositories, 2026-10-15). +_RELEASED = { + "in_channels": 128, + "cond_in_channels": 128, + "attention_head_dim": 128, + "num_attention_heads": 24, + "joint_attention_dim": 20480, + "timestep_channels": 256, + "mlp_ratio": 3.0, +} + + +def _meta_state_dict(keys: dict[str, tuple[list[int], str]]) -> dict[str, torch.Tensor]: + return {name: torch.empty(shape, device="meta") for name, (shape, _dtype) in keys.items()} + + +@pytest.mark.parametrize( + ("fixture", "flow_map"), [(flux3_klein_keys, True), (flux3_klein_base_keys, False)], ids=["klein", "base"] +) +def test_the_released_layout_fills_the_vendored_model_exactly(fixture, flow_map: bool) -> None: + native = _meta_state_dict(fixture.state_dict_keys) + + config = flux3_transformer_config(native) + assert {key: config[key] for key in _RELEASED} == _RELEASED + assert config["flow_map"] is flow_map + # The fixture keeps block 0 of each stack, so the depth read from it is 1 everywhere. + assert (config["num_layers"], config["num_single_layers"]) == (1, 1) + + with accelerate.init_empty_weights(): + model = Flux3Transformer2DModel(**config) + converted = convert_flux3_native_to_diffusers(dict(native)) + expected = {name: tuple(t.shape) for name, t in model.state_dict().items()} + assert {name: tuple(t.shape) for name, t in converted.items()} == expected + + +def test_the_fixture_names_are_the_released_ones() -> None: + """The tiny fixture enumerates the layout itself; it must be the one the released file uses.""" + assert set(native_flux3_keys(1, 1, flow_map=True)) == set(flux3_klein_keys.state_dict_keys) + assert set(native_flux3_keys(1, 1, flow_map=False)) == set(flux3_klein_base_keys.state_dict_keys) + + +def test_the_output_adaln_is_reordered_from_shift_scale_to_scale_shift() -> None: + shift, scale = torch.full((4, 3), 1.0), torch.full((4, 3), 2.0) + native = {"final_layer.image.adaLN_modulation.1.weight": torch.cat([shift, scale])} + + converted = convert_flux3_native_to_diffusers(native) + + assert torch.equal(converted["norm_out.linear.weight"], torch.cat([scale, shift])) + assert native == {}, "the input dict is emptied so it holds no second reference to the weights" + + +def test_a_packed_gguf_adaln_is_unpacked_before_the_halves_swap() -> None: + import gguf + + shift, scale = torch.full((4, 32), 1.0), torch.full((4, 32), 2.0) + raw = torch.cat([shift, scale]) + packed = GGMLTensor( + raw, ggml_quantization_type=gguf.GGMLQuantizationType.F32, tensor_shape=raw.shape, compute_dtype=torch.float32 + ) + + converted = convert_flux3_native_to_diffusers({"final_layer.image.adaLN_modulation.1.weight": packed}) + + weight = converted["norm_out.linear.weight"] + assert not isinstance(weight, GGMLTensor) + assert torch.equal(weight, torch.cat([scale, shift])) + + +def test_training_only_heads_are_dropped() -> None: + converted = convert_flux3_native_to_diffusers( + {"repa_projectors.0.weight": torch.zeros(1), "txt_in.weight": torch.zeros(1)} + ) + assert set(converted) == {"context_embedder.weight"} + + +@pytest.mark.parametrize( + ("native", "diffusers"), + [ + ("content_mode_blocks.image_cond.0.attn_out.weight", "mode_blocks.image_cond.0.attn.to_out.0.weight"), + # q, k and v have identical shapes, so only their names keep a swap from loading silently. + ("content_mode_blocks.image.2.q_proj.weight", "mode_blocks.image.2.attn.to_q.weight"), + ("txt_mode_blocks.1.k_proj.weight", "txt_mode_blocks.1.attn.to_k.weight"), + ("single_blocks.4.v_proj.weight", "single_transformer_blocks.4.attn.to_v.weight"), + ("txt_mode_blocks.3.norm.query_norm.scale", "txt_mode_blocks.3.attn.norm_q.weight"), + ("single_blocks.27.mlp_in.weight", "single_transformer_blocks.27.ff.linear_in.weight"), + ("early_stream_modulations.txt.lin.weight", "early_stream_modulations.txt.linear.weight"), + ("ref_time_in.out_layer.weight", "target_timestep_embedder.linear_2.weight"), + ("emb_in.image_cond.weight", "x_embedders.image_cond.weight"), + ], +) +def test_key_renames(native: str, diffusers: str) -> None: + assert flux3_native_key_to_diffusers(native) == diffusers + + +def test_the_structure_is_read_from_the_weights_not_assumed() -> None: + """A deeper finetune must load as itself, not as the first N blocks of the released depth.""" + native = {name: torch.empty(1, device="meta") for name in native_flux3_keys(3, 5, flow_map=False)} + native["emb_in.image.weight"] = torch.empty(128, 32, device="meta") + native["emb_in.image_cond.weight"] = torch.empty(128, 32, device="meta") + native["txt_in.weight"] = torch.empty(128, 64, device="meta") + native["time_in.in_layer.weight"] = torch.empty(128, 32, device="meta") + native["single_blocks.0.norm.query_norm.scale"] = torch.empty(128, device="meta") + native["single_blocks.0.mlp_in.weight"] = torch.empty(768, 128, device="meta") + + config = flux3_transformer_config(native) + + assert (config["num_layers"], config["num_single_layers"]) == (3, 5) + assert (config["num_attention_heads"], config["mlp_ratio"]) == (1, 3.0) + + +def test_a_gap_in_a_block_stack_is_refused() -> None: + native = {name: torch.empty(1, device="meta") for name in native_flux3_keys(2, 3, flow_map=False)} + native = {name: t for name, t in native.items() if not name.startswith("single_blocks.1.")} + native.update(_shapes_of_tiny()) + with pytest.raises(ValueError, match="missing 'single_blocks.' blocks"): + flux3_transformer_config(native) + + +def test_per_mode_stacks_of_different_depth_are_refused() -> None: + native = {name: torch.empty(1, device="meta") for name in native_flux3_keys(2, 1, flow_map=False)} + native = {name: t for name, t in native.items() if not name.startswith("content_mode_blocks.image_cond.1.")} + native.update(_shapes_of_tiny()) + with pytest.raises(ValueError, match="per-mode"): + flux3_transformer_config(native) + + +def _shapes_of_tiny() -> dict[str, torch.Tensor]: + hidden = TINY_CONFIG["attention_head_dim"] * TINY_CONFIG["num_attention_heads"] + return { + "emb_in.image.weight": torch.empty(hidden, 32, device="meta"), + "emb_in.image_cond.weight": torch.empty(hidden, 32, device="meta"), + "txt_in.weight": torch.empty(hidden, 64, device="meta"), + "time_in.in_layer.weight": torch.empty(hidden, 32, device="meta"), + "single_blocks.0.norm.query_norm.scale": torch.empty(128, device="meta"), + "single_blocks.0.mlp_in.weight": torch.empty(6 * hidden, hidden, device="meta"), + } diff --git a/tests/backend/flux3/test_denoise.py b/tests/backend/flux3/test_denoise.py new file mode 100644 index 00000000000..c36c679df65 --- /dev/null +++ b/tests/backend/flux3/test_denoise.py @@ -0,0 +1,88 @@ +"""The FLUX.3 sampling loop over a stand-in transformer that records each call. + +What is asserted is what the loop owes the model: the flow-map target is the next sigma, CFG combines the two +predictions the reference way, references go into every forward unstepped, and the Euler update and preview +are computed from the prediction. +""" + +import pytest +import torch + +from invokeai.backend.flux3.denoise import denoise + + +class _Recorder(torch.nn.Module): + """Predicts a velocity of `scale` (pos) or `neg_scale` (neg text), and records every call.""" + + def __init__(self, neg_text: torch.Tensor | None = None): + super().__init__() + self.calls: list[dict] = [] + self.neg_text = neg_text + + def forward(self, **kwargs): + self.calls.append(kwargs) + is_neg = self.neg_text is not None and kwargs["encoder_hidden_states"] is self.neg_text + return (torch.full_like(kwargs["hidden_states"], -1.0 if is_neg else 1.0),) + + +def _run(model, schedule, **kwargs): + img = torch.zeros(1, 4, 8) + previews = [] + out = denoise( + model=model, + img=img, + img_ids=torch.zeros(4, 4), + txt=kwargs.pop("txt", torch.zeros(1, 2, 3)), + txt_ids=torch.zeros(2, 4), + timesteps=schedule, + step_callback=lambda state: previews.append(state.latents.clone()), + compute_dtype=torch.float32, + **kwargs, + ) + return out, previews + + +def test_the_flow_map_is_told_the_timestep_each_step_jumps_to() -> None: + model = _Recorder() + schedule = [1.0, 0.75, 0.3, 0.0] + + out, previews = _run(model, schedule, flow_map=True) + + targets = [call["target_timestep"].item() for call in model.calls] + timesteps = [call["timestep"].item() for call in model.calls] + assert timesteps == pytest.approx(schedule[:-1]) and targets == pytest.approx(schedule[1:]) + # Euler on a constant velocity of 1 from 0: x = sum(dt) = -1. + assert torch.allclose(out, torch.full_like(out, -1.0)) + assert len(previews) == 3 + + +def test_without_a_flow_map_no_target_is_passed() -> None: + model = _Recorder() + _run(model, [1.0, 0.5, 0.0], flow_map=False) + assert all(call["target_timestep"] is None for call in model.calls) + + +def test_cfg_is_uncond_plus_scale_times_the_difference() -> None: + neg = torch.zeros(1, 2, 3) + model = _Recorder(neg_text=neg) + + out, _ = _run(model, [1.0, 0.0], flow_map=False, cfg_scale=3.5, neg_txt=neg, neg_txt_ids=torch.zeros(2, 4)) + + # velocity = -1 + 3.5 * (1 - -1) = 6, one step of dt = -1. + assert len(model.calls) == 2 + assert torch.allclose(out, torch.full_like(out, -6.0)) + + +def test_a_flow_map_refuses_cfg() -> None: + with pytest.raises(ValueError, match="flow-map"): + _run(_Recorder(), [1.0, 0.0], flow_map=True, cfg_scale=2.0, neg_txt=torch.zeros(1, 2, 3)) + + +def test_references_go_into_every_forward_unchanged() -> None: + model = _Recorder() + ref_tokens, ref_ids = torch.randn(1, 3, 8), torch.zeros(3, 4) + + _run(model, [1.0, 0.5, 0.0], flow_map=True, ref_tokens=ref_tokens, ref_ids=ref_ids) + + assert all(call["image_cond_hidden_states"] is ref_tokens for call in model.calls) + assert all(call["image_cond_ids"] is ref_ids for call in model.calls) diff --git a/tests/backend/flux3/test_loaders.py b/tests/backend/flux3/test_loaders.py new file mode 100644 index 00000000000..31fc93cb5fb --- /dev/null +++ b/tests/backend/flux3/test_loaders.py @@ -0,0 +1,109 @@ +"""The FLUX.3 single-file and GGUF loaders, driven over tiny native checkpoints. + +Asserted is the forward: a loaded model must predict what the model the checkpoint was written from +predicts. That covers the prefix strip, the key conversion, the output adaLN reordering and the QK norms, +which the vendored transformer runs in float32. +""" + +import gguf +import pytest +import torch + +from invokeai.backend.flux3 import Flux3Transformer2DModel +from invokeai.backend.flux3.conversion import convert_flux3_native_to_diffusers +from invokeai.backend.model_manager.configs.main import Main_Checkpoint_Flux3_Config, Main_GGUF_Flux3_Config +from invokeai.backend.model_manager.load.model_cache.torch_module_autocast.torch_module_autocast import ( + apply_custom_layers_to_model, +) +from invokeai.backend.model_manager.load.model_loaders import flux3 as flux3_loaders +from invokeai.backend.model_manager.load.model_loaders.flux3 import Flux3CheckpointModel, Flux3GGUFCheckpointModel +from invokeai.backend.model_manager.taxonomy import Flux3VariantType, SubModelType +from invokeai.backend.quantization.gguf.ggml_tensor import GGMLTensor +from tests.backend.flux3.flux3_fixture import TINY_CONFIG, forward, tiny_flux3_model, to_native, write_flux3_gguf +from tests.fixtures.loader_seams import Seam, prepare + +FLOW_MAP = pytest.mark.parametrize("flow_map", [True, False], ids=["klein", "base"]) + + +def _variant(flow_map: bool) -> Flux3VariantType: + return Flux3VariantType.Klein if flow_map else Flux3VariantType.KleinBase + + +@FLOW_MAP +@pytest.mark.parametrize("prefix", ["", "model.diffusion_model."], ids=["bfl", "comfy-prefixed"]) +def test_a_single_file_loads_as_the_model_it_was_written_from(monkeypatch, flow_map: bool, prefix: str) -> None: + import safetensors.torch + + reference = tiny_flux3_model(flow_map) + native = {prefix + name: value for name, value in to_native(reference).items()} + seam = Seam( + loader=Flux3CheckpointModel, + module=flux3_loaders, + entry="_load_model", + load_file_host=safetensors.torch, + patches_device=True, + ) + run = prepare(seam, monkeypatch, state_dict=native) + config = Main_Checkpoint_Flux3_Config.model_construct( + path="flux3.safetensors", name="flux3", variant=_variant(flow_map) + ) + + model = run.load(config, SubModelType.Transformer) + + assert model.config.flow_map is flow_map + assert run.reserved, "the cache is asked for room before the weights are cast" + for name, module in model.named_modules(): + if name.endswith((".norm_q", ".norm_k")): + assert module.weight.dtype == torch.float32, name + torch.testing.assert_close(forward(model, flow_map), forward(reference, flow_map), rtol=0, atol=0) + + +def test_a_quantized_side_channel_is_refused_by_the_single_file_loader(monkeypatch) -> None: + import safetensors.torch + + native = to_native(tiny_flux3_model(flow_map=True)) + native["single_blocks.0.q_proj.weight_scale"] = torch.ones(1) + seam = Seam( + loader=Flux3CheckpointModel, module=flux3_loaders, entry="_load_model", load_file_host=safetensors.torch + ) + run = prepare(seam, monkeypatch, state_dict=native) + config = Main_Checkpoint_Flux3_Config.model_construct( + path="x.safetensors", name="x", variant=Flux3VariantType.Klein + ) + + with pytest.raises(ValueError, match="quantization side channel"): + run.load(config, SubModelType.Transformer) + assert run.reserved == [], "a refused file must not reserve cache room first" + + +@FLOW_MAP +@pytest.mark.parametrize( + # The `gguf` package writes no K-quants, so the packed path is driven through the block types it can write. + "qtype", + [gguf.GGMLQuantizationType.Q8_0, gguf.GGMLQuantizationType.Q5_1, gguf.GGMLQuantizationType.Q4_0], + ids=lambda qtype: qtype.name, +) +def test_a_gguf_loads_and_predicts_what_its_dequantized_weights_mean( + monkeypatch, tmp_path, flow_map: bool, qtype: gguf.GGMLQuantizationType +) -> None: + native = to_native(tiny_flux3_model(flow_map)) + path = tmp_path / "flux3_image_klein_sd_test.gguf" + meant = write_flux3_gguf(path, native, qtype=qtype) + seam = Seam(loader=Flux3GGUFCheckpointModel, module=flux3_loaders, entry="_load_model", patches_device=True) + run = prepare(seam, monkeypatch) + config = Main_GGUF_Flux3_Config.model_construct(path=str(path), name="flux3", variant=_variant(flow_map)) + + model = run.load(config, SubModelType.Transformer) + apply_custom_layers_to_model(model) + + packed = [p for p in model.parameters() if isinstance(p, GGMLTensor)] + assert packed, "the quantized block weights stay packed" + # Unquantized tensors (the fixture's BF16 linears) are unpacked at load rather than decoded every forward. + assert {p._ggml_quantization_type for p in packed} == {qtype} + for name, module in model.named_modules(): + if name.endswith((".norm_q", ".norm_k")): + assert not isinstance(module.weight, GGMLTensor) and module.weight.dtype == torch.float32, name + reference = Flux3Transformer2DModel(**TINY_CONFIG, flow_map=flow_map).eval() + reference.load_state_dict(convert_flux3_native_to_diffusers(dict(meant))) + # Q8_0 blocks dequantize through their fp16 scale, so the two forwards agree to fp16 precision. + torch.testing.assert_close(forward(model, flow_map), forward(reference, flow_map), rtol=1e-3, atol=1e-3) diff --git a/tests/backend/flux3/test_sampling.py b/tests/backend/flux3/test_sampling.py new file mode 100644 index 00000000000..1ba9fae999e --- /dev/null +++ b/tests/backend/flux3/test_sampling.py @@ -0,0 +1,146 @@ +"""The FLUX.3 schedule, position ids, noise and reference sizing, against the reference implementation. + +The expected values are restated from BFL's `src/flux3/sampling.py` / `pipeline.py` (Apache-2.0) rather than +imported, so a change to either side shows up here. +""" + +import math + +import pytest +import torch +from PIL import Image + +import invokeai.backend.flux3.ref_images as ref_images +from invokeai.backend.flux.sampling_utils import clip_timestep_schedule_fractional +from invokeai.backend.flux2.latent_norm import bn_normalize +from invokeai.backend.flux2.sampling_utils import pack_flux2 +from invokeai.backend.flux3.ref_images import encode_flux3_references, fit_reference_image +from invokeai.backend.flux3.sampling import ( + get_noise_flux3, + get_schedule_flux3, + image_position_ids, + redensify_schedule_flux3, + text_position_ids, +) + + +def _bfl_timesteps(steps: int, alpha: float = 6.93) -> list[float]: + t = torch.linspace(1.0, 0.0, steps + 1) + return (alpha * t / (1.0 + (alpha - 1.0) * t)).tolist() + + +@pytest.mark.parametrize("steps", [4, 16, 50]) +def test_the_schedule_is_the_reference_samplers(steps: int) -> None: + schedule = get_schedule_flux3(steps) + assert len(schedule) == steps + 1 + assert schedule[0] == 1.0 and schedule[-1] == 0.0 + assert schedule == pytest.approx(_bfl_timesteps(steps), abs=1e-6) + + +def test_a_clipped_window_is_respaced_to_the_requested_step_count() -> None: + clipped = clip_timestep_schedule_fractional(get_schedule_flux3(16), 0.6, 1.0) + assert len(clipped) - 1 < 16, "the shift leaves few steps in a low-strength window" + + respaced = redensify_schedule_flux3(clipped, 16) + + assert len(respaced) == 17 + assert respaced[0] == clipped[0] and respaced[-1] == clipped[-1] + assert all(a > b for a, b in zip(respaced, respaced[1:], strict=False)) + + +def test_a_full_schedule_is_left_alone() -> None: + schedule = get_schedule_flux3(16) + assert redensify_schedule_flux3(schedule, 16) is schedule + + +def test_image_ids_scale_rows_and_columns_and_carry_the_reference_index() -> None: + ids = image_position_ids(2, 3, l_coord=-2) + assert ids.shape == (6, 4) and ids.dtype == torch.float32 + # Row-major, as the packed tokens are. + assert ids[:, 1].tolist() == [0.0, 0.0, 0.0, 0.5, 0.5, 0.5] + assert ids[:, 2].tolist() == [0.0, 0.5, 1.0, 0.0, 0.5, 1.0] + assert set(ids[:, 0].tolist()) == {0.0} and set(ids[:, 3].tolist()) == {-2.0} + + +def test_text_advances_along_the_last_axis() -> None: + ids = text_position_ids(3) + assert ids.tolist() == [[0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 1.0], [0.0, 0.0, 0.0, 2.0]] + + +def test_the_noise_reproduces_the_reference_draw() -> None: + """BFL draws (h*w, 128) image tokens from a seeded CPU generator and rounds them to bf16.""" + seed, height, width = 7, 64, 96 + expected = torch.randn((height // 16 * width // 16, 128), generator=torch.Generator().manual_seed(seed)) + expected = expected.to(torch.bfloat16).float() + + noise = get_noise_flux3(height, width, seed) + + assert noise.shape == (1, 32, height // 8, width // 8) + assert torch.equal(pack_flux2(noise)[0], expected) + + +@pytest.mark.parametrize( + ("size", "count", "max_pixels"), + [((3000, 2000), 1, 4 * 1024 * 1024), ((3000, 2000), 3, 1024 * 1024), ((1000, 700), 2, 1024 * 1024)], +) +def test_references_are_fitted_to_the_budget_and_the_grid(size: tuple[int, int], count: int, max_pixels: int) -> None: + fitted = fit_reference_image(Image.new("RGB", size), count) + assert fitted.width % 16 == 0 and fitted.height % 16 == 0 + assert fitted.width * fitted.height <= max_pixels + assert math.isclose(fitted.width / fitted.height, size[0] / size[1], rel_tol=0.03) + + +def test_a_tiny_reference_is_scaled_up_and_an_alpha_image_becomes_rgb() -> None: + fitted = fit_reference_image(Image.new("RGBA", (20, 40)), 1) + assert fitted.mode == "RGB" + assert min(fitted.size) >= 64 + + +@pytest.mark.parametrize("size", [(49, 49), (21, 50), (63, 200)]) +def test_an_upscaled_reference_keeps_the_minimum_side(size: tuple[int, int]) -> None: + """Flooring the upscaled side gave 63 px for some inputs, which the 16 px crop turned into 48.""" + assert min(fit_reference_image(Image.new("RGB", size), 1).size) >= 64 + + +def test_an_elongated_reference_keeps_both_side_limits() -> None: + fitted = fit_reference_image(Image.new("RGB", (6000, 100)), 1) + assert max(fitted.size) <= 4096 and min(fitted.size) >= 64 + + +def test_a_reference_beyond_64_to_1_is_refused() -> None: + with pytest.raises(ValueError, match="too elongated"): + fit_reference_image(Image.new("RGB", (8000, 50)), 1) + + +def test_references_are_normalized_packed_and_numbered_from_minus_one(monkeypatch: pytest.MonkeyPatch) -> None: + """Reference i sits at l = -(1 + i): l = 0 is the generated image, so the first reference must not share it.""" + sizes = [(128, 64), (64, 96)] # (width, height): within the budget and on the 16 px grid, so kept as is + encoded: list[torch.Tensor] = [] + + def fake_encode(vae_info, image: Image.Image, tiling: str) -> torch.Tensor: + assert tiling == "if_attention_materializes" + latents = torch.full((1, 32, image.height // 8, image.width // 8), float(len(encoded) + 1)) + encoded.append(latents) + return latents + + monkeypatch.setattr(ref_images, "encode_reference_image", fake_encode) + bn_mean, bn_std = torch.full((128,), 0.5), torch.full((128,), 2.0) + + tokens, ids = encode_flux3_references( + images=[Image.new("RGB", size) for size in sizes], + vae_info=None, + bn_mean=bn_mean, + bn_std=bn_std, + device=torch.device("cpu"), + dtype=torch.float32, + ) + + counts = [(w // 16) * (h // 16) for w, h in sizes] + assert tokens.shape == (1, sum(counts), 128) and ids.shape == (sum(counts), 4) + expected = torch.cat([bn_normalize(pack_flux2(latents), bn_mean, bn_std) for latents in encoded], dim=1) + assert torch.equal(tokens, expected) + assert ids[: counts[0], 3].unique().tolist() == [-1.0] + assert ids[counts[0] :, 3].unique().tolist() == [-2.0] + # Rows and columns follow each reference's own grid: 64 px high, 128 px wide -> 4 x 8 tokens. + assert ids[: counts[0], 1].max().item() == pytest.approx(1.5) + assert ids[: counts[0], 2].max().item() == pytest.approx(3.5) diff --git a/tests/backend/flux3/test_text_encoding.py b/tests/backend/flux3/test_text_encoding.py new file mode 100644 index 00000000000..c0f32078a50 --- /dev/null +++ b/tests/backend/flux3/test_text_encoding.py @@ -0,0 +1,74 @@ +"""FLUX.3 prompt encoding: the token window and the hidden states it hands on. + +The tokenizer is the real Qwen3-VL one InvokeAI bundles; its chat template, token ids and pad token are the +ones the FLUX.3 repository's processor produces. The encoder is a stand-in that records what it was given and +returns hidden states that name their own layer, so the stacking order is visible in the result. +""" + +from types import SimpleNamespace + +import pytest +import torch + +from invokeai.backend.flux3.text_encoding import ( + FLUX3_TEXT_ENCODER_LAYERS, + encode_flux3_prompt, + flux3_prompt_text, + tokenize_flux3_prompt, +) +from invokeai.backend.qwen3_vl.qwen3_vl_assets import load_bundled_qwen3_vl_tokenizer + + +@pytest.fixture(scope="module") +def tokenizer(): + return load_bundled_qwen3_vl_tokenizer() + + +def test_the_prompt_is_one_user_turn_with_the_generation_prompt(tokenizer) -> None: + assert flux3_prompt_text(tokenizer, "a fox") == "<|im_start|>user\na fox<|im_end|>\n<|im_start|>assistant\n" + + +@pytest.mark.parametrize("words", [1, 40, 120]) +def test_the_window_is_right_padded_to_a_multiple_of_80(tokenizer, words: int) -> None: + input_ids, mask, position_ids = tokenize_flux3_prompt(tokenizer, " ".join(["fox"] * words)) + + real = int(mask.sum()) + length = input_ids.shape[1] + assert length % 80 == 0 and length - 80 < real <= length + # Right padding: the real tokens come first, then only padding. + assert mask[0, :real].all() and not mask[0, real:].any() + assert (input_ids[0, real:] == tokenizer.pad_token_id).all() + # Real tokens count up from 0; the padding sits at position 1, as in the training environment. + assert position_ids[0, :real].tolist() == list(range(real)) + assert (position_ids[0, real:] == 1).all() + + +def test_the_window_is_capped(tokenizer) -> None: + input_ids, _, _ = tokenize_flux3_prompt(tokenizer, " ".join(["fox"] * 200), max_tokens=120) + assert input_ids.shape[1] == 120 + + +def test_the_shared_tokenizer_is_not_reconfigured(tokenizer) -> None: + before = tokenizer.padding_side + tokenize_flux3_prompt(tokenizer, "a fox") + assert tokenizer.padding_side == before + + +def test_hidden_states_4_to_32_are_stacked_per_token_with_the_mask_passed(tokenizer) -> None: + hidden = 3 + seen = {} + + def text_encoder(**kwargs): + seen.update(kwargs) + batch, length = kwargs["input_ids"].shape + # hidden_states[k] is filled with k, so the stack order can be read off the output. + states = tuple(torch.full((batch, length, hidden), float(k)) for k in range(37)) + return SimpleNamespace(hidden_states=states) + + embeds = encode_flux3_prompt("a fox", tokenizer, text_encoder, torch.device("cpu")) + + assert seen["attention_mask"] is not None and seen["position_ids"] is not None + assert seen["output_hidden_states"] is True + assert embeds.shape == (1, 80, len(FLUX3_TEXT_ENCODER_LAYERS) * hidden) + per_token = embeds[0, 0].reshape(len(FLUX3_TEXT_ENCODER_LAYERS), hidden)[:, 0].tolist() + assert per_token == [float(k) for k in FLUX3_TEXT_ENCODER_LAYERS] diff --git a/tests/backend/flux3/test_vendored_transformer.py b/tests/backend/flux3/test_vendored_transformer.py new file mode 100644 index 00000000000..781134a1e1b --- /dev/null +++ b/tests/backend/flux3/test_vendored_transformer.py @@ -0,0 +1,17 @@ +"""The vendored FLUX.3 transformer is a stopgap until a diffusers release ships it. + +Everything in InvokeAI imports `Flux3Transformer2DModel` from `invokeai.backend.flux3`, so moving to the released +class is a change in one place. This test is what makes that move happen: it fails on the diffusers bump that +brings the class, instead of the vendored copy outliving its reason (as MiniMax-H3's did). +""" + +import diffusers + + +def test_diffusers_does_not_ship_flux3_yet() -> None: + assert not hasattr(diffusers, "Flux3Transformer2DModel"), ( + f"diffusers {diffusers.__version__} ships Flux3Transformer2DModel. Import it from diffusers in " + "invokeai/backend/flux3/__init__.py, delete invokeai/backend/flux3/transformer_flux3.py and its entry in " + "pyproject.toml's [tool.ruff.format] exclude, and drop the Flux3 classes from _PINNED_MODEL_CLASS_MARKERS " + "(configs/factory.py). The key conversion, configs, loaders and nodes do not change." + ) diff --git a/tests/backend/model_manager/configs/test_flux3_main_config.py b/tests/backend/model_manager/configs/test_flux3_main_config.py new file mode 100644 index 00000000000..f4898b44c23 --- /dev/null +++ b/tests/backend/model_manager/configs/test_flux3_main_config.py @@ -0,0 +1,186 @@ +"""Identification of FLUX.3 Image models, end to end through `ModelConfigFactory`. + +Run over the whole candidate set, because the question is that exactly one config claims each release: +FLUX.3 GGUFs call themselves `general.architecture = "flux"`, and the FLUX.1 and FLUX.2 detectors read some +of the same key names (`txt_in`, `time_in`, `single_blocks`). +""" + +import json +from pathlib import Path + +import pytest + +from invokeai.backend.model_manager.configs.factory import ModelConfigFactory +from invokeai.backend.model_manager.configs.identification_utils import InvalidMatchError, NotAMatchError +from invokeai.backend.model_manager.configs.main import ( + Main_Checkpoint_Flux3_Config, + Main_Diffusers_Flux3_Config, + Main_GGUF_Flux3_Config, +) +from invokeai.backend.model_manager.model_on_disk import ModelOnDisk +from invokeai.backend.model_manager.taxonomy import Flux3VariantType, ModelFormat +from tests.backend.flux3.flux3_fixture import tiny_flux3_model, to_native, write_flux3_gguf +from tests.backend.model_manager.load.state_dicts import flux3_klein_base_keys, flux3_klein_keys +from tests.backend.model_manager.load.state_dicts.utils import write_header_only_safetensors + +# The released folder's JSON files (black-forest-labs/flux-3-image-klein, 2026-10-15), shortened where nothing +# reads the rest. The root `config.json` is BFL's own package config, which sits beside the pipeline. +_MODULAR_INDEX = { + "_blocks_class_name": "Flux3DistilledAutoBlocks", + "_class_name": "Flux3DistilledModularPipeline", + "_diffusers_version": "0.41.0.dev0", + "text_encoder": ["transformers", "Qwen3VLForConditionalGeneration", {"subfolder": "text_encoder"}], + "tokenizer": ["transformers", "Qwen3VLProcessor", {"subfolder": "text_encoder"}], + "transformer": ["diffusers", "Flux3Transformer2DModel", {"subfolder": "transformer"}], + "vae": ["diffusers", "AutoencoderKLFlux2", {"subfolder": "vae"}], +} +_BFL_PACKAGE_CONFIG = { + "format_version": 1, + "model": "flux-3-image-klein", + "quantization": None, + "dit": {"flow_map": True}, +} +_TRANSFORMER_CONFIG = { + "_class_name": "Flux3Transformer2DModel", + "attention_head_dim": 128, + "joint_attention_dim": 20480, + "num_layers": 5, + "num_single_layers": 28, +} + + +def _identify(path: Path): + return ModelConfigFactory.from_model_on_disk(ModelOnDisk(path, "random"), {}, allow_unknown=True) + + +def _write_json(path: Path, content: dict) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(content)) + + +def _write_folder(root: Path, *, flow_map: bool, base: bool = False) -> Path: + index = dict(_MODULAR_INDEX) + if base: + index["_class_name"] = "Flux3ModularPipeline" + _write_json(root / "modular_model_index.json", index) + _write_json(root / "config.json", _BFL_PACKAGE_CONFIG) + _write_json(root / "transformer" / "config.json", {**_TRANSFORMER_CONFIG, "flow_map": flow_map}) + (root / "transformer" / "diffusion_pytorch_model.safetensors").write_bytes(b"") + _write_json(root / "vae" / "config.json", {"_class_name": "AutoencoderKLFlux2", "latent_channels": 32}) + _write_json(root / "text_encoder" / "config.json", {"architectures": ["Qwen3VLForConditionalGeneration"]}) + (root / "text_encoder" / "tokenizer.json").write_text("{}") + return root + + +@pytest.mark.parametrize( + ("flow_map", "base", "variant"), + [(True, False, Flux3VariantType.Klein), (False, True, Flux3VariantType.KleinBase)], + ids=["klein", "base"], +) +def test_a_diffusers_folder_installs_with_the_variant_its_transformer_declares( + tmp_path: Path, flow_map: bool, base: bool, variant: Flux3VariantType +) -> None: + result = _identify(_write_folder(tmp_path / "flux-3-image-klein", flow_map=flow_map, base=base)) + + assert result.match_count == 1, [type(match).__name__ for match in result.all_matches] + assert isinstance(result.config, Main_Diffusers_Flux3_Config) + assert result.config.variant is variant + assert result.config.default_settings is not None + assert result.config.default_settings.steps == (16 if flow_map else 50) + + +@pytest.mark.parametrize("missing", ["vae/config.json", "text_encoder/config.json", "text_encoder/tokenizer.json"]) +def test_a_partial_diffusers_folder_is_refused_by_name(tmp_path: Path, missing: str) -> None: + root = _write_folder(tmp_path / "flux3", flow_map=True) + (root / missing).unlink() + + with pytest.raises(InvalidMatchError): + Main_Diffusers_Flux3_Config.from_model_on_disk(ModelOnDisk(root, "random"), {}) + + +@pytest.mark.parametrize( + ("fixture", "variant"), + [(flux3_klein_keys, Flux3VariantType.Klein), (flux3_klein_base_keys, Flux3VariantType.KleinBase)], + ids=["klein", "base"], +) +def test_a_released_single_file_installs_as_flux3(tmp_path: Path, fixture, variant: Flux3VariantType) -> None: + path = write_header_only_safetensors(tmp_path / "flux3_image_klein.safetensors", fixture.state_dict_keys) + + result = _identify(path) + + assert result.match_count == 1, [type(match).__name__ for match in result.all_matches] + assert isinstance(result.config, Main_Checkpoint_Flux3_Config) + assert result.config.variant is variant + + +# What each quantized release changes on one linear, reduced to the header entries the refusal reads. +_QUANTIZED_LAYERS = { + # BFL `variants/fp8r`: per-row E4M3 with a scale vector. + "fp8r": {"weight": ([3072, 3072], "F8_E4M3"), "weight_scale": ([3072], "F32")}, + # A plain fp8 cast with no side channel. + "fp8-raw": {"weight": ([3072, 3072], "F8_E4M3")}, + # ComfyUI `int8_convrot`: int8 weights tagged by a `.comfy_quant` marker. + "int8-convrot": {"weight": ([3072, 3072], "I8"), "comfy_quant": ([16], "U8")}, + # nvfp4 (ComfyUI and ModelOpt): two values per byte, block and tensor scales. + "nvfp4": {"weight": ([3072, 1536], "U8"), "weight_scale": ([3072, 192], "F8_E4M3"), "weight_scale_2": ([], "F32")}, +} + + +@pytest.mark.parametrize("layout", sorted(_QUANTIZED_LAYERS)) +def test_a_quantized_single_file_is_refused_with_a_reason(tmp_path: Path, layout: str) -> None: + keys = dict(flux3_klein_keys.state_dict_keys) + for suffix, entry in _QUANTIZED_LAYERS[layout].items(): + keys[f"single_blocks.0.q_proj.{suffix}"] = entry + path = write_header_only_safetensors(tmp_path / f"flux3_{layout}.safetensors", keys) + + result = _identify(path) + + # Refused outright: neither installed as FLUX.3 nor taken by another config, nor registered as unknown. + assert result.config is None + assert any("quantized" in str(error) for error in result.invalid_matches) + + +def test_a_lora_with_flux3_names_is_not_a_main_model(tmp_path: Path) -> None: + keys = { + f"{name[: -len('.weight')]}.lora_A.weight": ([4, 3072], "BF16") + for name in flux3_klein_keys.state_dict_keys + if name.endswith(".weight") + } + path = write_header_only_safetensors(tmp_path / "flux3_lora.safetensors", keys) + + with pytest.raises(NotAMatchError): + Main_Checkpoint_Flux3_Config.from_model_on_disk(ModelOnDisk(path, "random"), {}) + + +@pytest.mark.parametrize("prefix", ["", "model.diffusion_model."], ids=["bare", "comfy-prefixed"]) +def test_a_gguf_installs_as_flux3_and_not_as_flux1(tmp_path: Path, prefix: str) -> None: + path = tmp_path / "flux3_image_klein_sd_Q8_0.gguf" + write_flux3_gguf(path, to_native(tiny_flux3_model(flow_map=True)), prefix=prefix) + + result = _identify(path) + + assert result.match_count == 1, [type(match).__name__ for match in result.all_matches] + assert isinstance(result.config, Main_GGUF_Flux3_Config) + assert result.config.format is ModelFormat.GGUFQuantized + assert result.config.variant is Flux3VariantType.Klein + + +def test_a_full_repo_download_sizes_the_tokenizer_without_the_root_package(tmp_path: Path) -> None: + """The tokenizer has no folder of its own; sizing it by the folder root counted BFL's 11 GB single file there. + + The model cache reserves that size before a load, so a few-MB tokenizer evicted the transformer. + """ + from unittest.mock import MagicMock + + from invokeai.backend.model_manager.load.model_loaders.flux3 import Flux3DiffusersModel + from invokeai.backend.model_manager.taxonomy import SubModelType + + root = _write_folder(tmp_path / "flux-3-image-klein", flow_map=True) + (root / "model.safetensors").write_bytes(b"\0" * 2_000_000) + (root / "transformer" / "diffusion_pytorch_model.safetensors").write_bytes(b"\0" * 1_000) + config = _identify(root).config + assert isinstance(config, Main_Diffusers_Flux3_Config) + loader = Flux3DiffusersModel(app_config=MagicMock(), logger=MagicMock(), ram_cache=MagicMock()) + + assert loader.get_size_fs(config, root, SubModelType.Tokenizer) == 0 + assert 1_000 <= loader.get_size_fs(config, root, SubModelType.Transformer) < 2_000_000 diff --git a/tests/backend/model_manager/load/state_dicts/flux3_klein_base_keys.py b/tests/backend/model_manager/load/state_dicts/flux3_klein_base_keys.py new file mode 100644 index 00000000000..135461cb349 --- /dev/null +++ b/tests/backend/model_manager/load/state_dicts/flux3_klein_base_keys.py @@ -0,0 +1,59 @@ +"""FLUX.3 Image Klein Base (undistilled), BFL's native bf16 layout -- `model.safetensors` of `black-forest-labs/flux-3-image-klein-base`. + +Captured on 2026-10-16 with `scripts/capture_state_dict_fixture.py`, +which reads the header only, from +`black-forest-labs/flux-3-image-klein-base/model.safetensors`. + +Subsetting rule: `content_mode_blocks.image` index 0, `content_mode_blocks.image_cond` index 0, `single_blocks` index 0, `txt_mode_blocks` index 0, plus every key outside a stack. Values are `(shape, dtype)`. + +The same layout as Klein without `ref_time_in.*`: that embedder is what tells a flow-map checkpoint from the Base model, and +what the variant detection and the transformer config read. +""" + +state_dict_keys: dict[str, tuple[list[int], str]] = { + "content_mode_blocks.image.0.attn_out.weight": ([3072, 3072], "BF16"), + "content_mode_blocks.image.0.k_proj.weight": ([3072, 3072], "BF16"), + "content_mode_blocks.image.0.mlp_in.weight": ([18432, 3072], "BF16"), + "content_mode_blocks.image.0.mlp_out.weight": ([3072, 9216], "BF16"), + "content_mode_blocks.image.0.norm.key_norm.scale": ([128], "BF16"), + "content_mode_blocks.image.0.norm.query_norm.scale": ([128], "BF16"), + "content_mode_blocks.image.0.q_proj.weight": ([3072, 3072], "BF16"), + "content_mode_blocks.image.0.v_proj.weight": ([3072, 3072], "BF16"), + "content_mode_blocks.image_cond.0.attn_out.weight": ([3072, 3072], "BF16"), + "content_mode_blocks.image_cond.0.k_proj.weight": ([3072, 3072], "BF16"), + "content_mode_blocks.image_cond.0.mlp_in.weight": ([18432, 3072], "BF16"), + "content_mode_blocks.image_cond.0.mlp_out.weight": ([3072, 9216], "BF16"), + "content_mode_blocks.image_cond.0.norm.key_norm.scale": ([128], "BF16"), + "content_mode_blocks.image_cond.0.norm.query_norm.scale": ([128], "BF16"), + "content_mode_blocks.image_cond.0.q_proj.weight": ([3072, 3072], "BF16"), + "content_mode_blocks.image_cond.0.v_proj.weight": ([3072, 3072], "BF16"), + "early_stream_modulations.image.lin.weight": ([9216, 3072], "BF16"), + "early_stream_modulations.image_cond.lin.weight": ([9216, 3072], "BF16"), + "early_stream_modulations.txt.lin.weight": ([9216, 3072], "BF16"), + "emb_in.image.weight": ([3072, 128], "BF16"), + "emb_in.image_cond.weight": ([3072, 128], "BF16"), + "final_layer.image.adaLN_modulation.1.weight": ([6144, 3072], "BF16"), + "final_layer.image.linear.weight": ([128, 3072], "BF16"), + "single_blocks.0.attn_out.weight": ([3072, 3072], "BF16"), + "single_blocks.0.k_proj.weight": ([3072, 3072], "BF16"), + "single_blocks.0.mlp_in.weight": ([18432, 3072], "BF16"), + "single_blocks.0.mlp_out.weight": ([3072, 9216], "BF16"), + "single_blocks.0.norm.key_norm.scale": ([128], "BF16"), + "single_blocks.0.norm.query_norm.scale": ([128], "BF16"), + "single_blocks.0.q_proj.weight": ([3072, 3072], "BF16"), + "single_blocks.0.v_proj.weight": ([3072, 3072], "BF16"), + "single_stream_modulations.image.lin.weight": ([9216, 3072], "BF16"), + "single_stream_modulations.image_cond.lin.weight": ([9216, 3072], "BF16"), + "single_stream_modulations.txt.lin.weight": ([9216, 3072], "BF16"), + "time_in.in_layer.weight": ([3072, 256], "BF16"), + "time_in.out_layer.weight": ([3072, 3072], "BF16"), + "txt_in.weight": ([3072, 20480], "BF16"), + "txt_mode_blocks.0.attn_out.weight": ([3072, 3072], "BF16"), + "txt_mode_blocks.0.k_proj.weight": ([3072, 3072], "BF16"), + "txt_mode_blocks.0.mlp_in.weight": ([18432, 3072], "BF16"), + "txt_mode_blocks.0.mlp_out.weight": ([3072, 9216], "BF16"), + "txt_mode_blocks.0.norm.key_norm.scale": ([128], "BF16"), + "txt_mode_blocks.0.norm.query_norm.scale": ([128], "BF16"), + "txt_mode_blocks.0.q_proj.weight": ([3072, 3072], "BF16"), + "txt_mode_blocks.0.v_proj.weight": ([3072, 3072], "BF16"), +} diff --git a/tests/backend/model_manager/load/state_dicts/flux3_klein_keys.py b/tests/backend/model_manager/load/state_dicts/flux3_klein_keys.py new file mode 100644 index 00000000000..863fe13226a --- /dev/null +++ b/tests/backend/model_manager/load/state_dicts/flux3_klein_keys.py @@ -0,0 +1,62 @@ +"""FLUX.3 Image Klein (step-distilled), BFL's native bf16 layout -- `model.safetensors` and its byte-identical ComfyUI repackage `flux3_image_klein_sd_bf16.safetensors`. + +Captured on 2026-10-16 with `scripts/capture_state_dict_fixture.py`, +which reads the header only, from +`E:/ModelStuffSSD/flux-3-image-klein-comfy/diffusion_models/flux3_image_klein_sd_bf16.safetensors`. + +Subsetting rule: `content_mode_blocks.image` index 0, `content_mode_blocks.image_cond` index 0, `single_blocks` index 0, `txt_mode_blocks` index 0, plus every key outside a stack. Values are `(shape, dtype)`. + +Every single-file and GGUF FLUX.3 build uses these names. The FLUX.3 loaders read the transformer's structure from it (widths, head +width, feedforward width, the flow-map embedder `ref_time_in`) and convert it to the vendored diffusers module; a key or shape +changed by a re-upload shows up here as a missing or unexpected parameter. +""" + +state_dict_keys: dict[str, tuple[list[int], str]] = { + "content_mode_blocks.image.0.attn_out.weight": ([3072, 3072], "BF16"), + "content_mode_blocks.image.0.k_proj.weight": ([3072, 3072], "BF16"), + "content_mode_blocks.image.0.mlp_in.weight": ([18432, 3072], "BF16"), + "content_mode_blocks.image.0.mlp_out.weight": ([3072, 9216], "BF16"), + "content_mode_blocks.image.0.norm.key_norm.scale": ([128], "BF16"), + "content_mode_blocks.image.0.norm.query_norm.scale": ([128], "BF16"), + "content_mode_blocks.image.0.q_proj.weight": ([3072, 3072], "BF16"), + "content_mode_blocks.image.0.v_proj.weight": ([3072, 3072], "BF16"), + "content_mode_blocks.image_cond.0.attn_out.weight": ([3072, 3072], "BF16"), + "content_mode_blocks.image_cond.0.k_proj.weight": ([3072, 3072], "BF16"), + "content_mode_blocks.image_cond.0.mlp_in.weight": ([18432, 3072], "BF16"), + "content_mode_blocks.image_cond.0.mlp_out.weight": ([3072, 9216], "BF16"), + "content_mode_blocks.image_cond.0.norm.key_norm.scale": ([128], "BF16"), + "content_mode_blocks.image_cond.0.norm.query_norm.scale": ([128], "BF16"), + "content_mode_blocks.image_cond.0.q_proj.weight": ([3072, 3072], "BF16"), + "content_mode_blocks.image_cond.0.v_proj.weight": ([3072, 3072], "BF16"), + "early_stream_modulations.image.lin.weight": ([9216, 3072], "BF16"), + "early_stream_modulations.image_cond.lin.weight": ([9216, 3072], "BF16"), + "early_stream_modulations.txt.lin.weight": ([9216, 3072], "BF16"), + "emb_in.image.weight": ([3072, 128], "BF16"), + "emb_in.image_cond.weight": ([3072, 128], "BF16"), + "final_layer.image.adaLN_modulation.1.weight": ([6144, 3072], "BF16"), + "final_layer.image.linear.weight": ([128, 3072], "BF16"), + "ref_time_in.in_layer.weight": ([3072, 256], "BF16"), + "ref_time_in.out_layer.weight": ([3072, 3072], "BF16"), + "single_blocks.0.attn_out.weight": ([3072, 3072], "BF16"), + "single_blocks.0.k_proj.weight": ([3072, 3072], "BF16"), + "single_blocks.0.mlp_in.weight": ([18432, 3072], "BF16"), + "single_blocks.0.mlp_out.weight": ([3072, 9216], "BF16"), + "single_blocks.0.norm.key_norm.scale": ([128], "BF16"), + "single_blocks.0.norm.query_norm.scale": ([128], "BF16"), + "single_blocks.0.q_proj.weight": ([3072, 3072], "BF16"), + "single_blocks.0.v_proj.weight": ([3072, 3072], "BF16"), + "single_stream_modulations.image.lin.weight": ([9216, 3072], "BF16"), + "single_stream_modulations.image_cond.lin.weight": ([9216, 3072], "BF16"), + "single_stream_modulations.txt.lin.weight": ([9216, 3072], "BF16"), + "time_in.in_layer.weight": ([3072, 256], "BF16"), + "time_in.out_layer.weight": ([3072, 3072], "BF16"), + "txt_in.weight": ([3072, 20480], "BF16"), + "txt_mode_blocks.0.attn_out.weight": ([3072, 3072], "BF16"), + "txt_mode_blocks.0.k_proj.weight": ([3072, 3072], "BF16"), + "txt_mode_blocks.0.mlp_in.weight": ([18432, 3072], "BF16"), + "txt_mode_blocks.0.mlp_out.weight": ([3072, 9216], "BF16"), + "txt_mode_blocks.0.norm.key_norm.scale": ([128], "BF16"), + "txt_mode_blocks.0.norm.query_norm.scale": ([128], "BF16"), + "txt_mode_blocks.0.q_proj.weight": ([3072, 3072], "BF16"), + "txt_mode_blocks.0.v_proj.weight": ([3072, 3072], "BF16"), +} diff --git a/tests/backend/model_manager/test_modular_repo_download_urls.py b/tests/backend/model_manager/test_modular_repo_download_urls.py new file mode 100644 index 00000000000..41089a7b4fc --- /dev/null +++ b/tests/backend/model_manager/test_modular_repo_download_urls.py @@ -0,0 +1,63 @@ +"""Installing a Modular Diffusers repo by id downloads its components and nothing else from the repo.""" + +from pathlib import Path +from unittest.mock import Mock + +from invokeai.backend.model_manager.metadata.metadata_base import HuggingFaceMetadata, RemoteModelFile + +# The component part of black-forest-labs/flux-3-image-klein's modular_model_index.json (2026-10-15): the tokenizer +# loads from `text_encoder/`, the folder that holds its files. +_FLUX3_MODULAR_INDEX = { + "_blocks_class_name": "Flux3DistilledAutoBlocks", + "_class_name": "Flux3DistilledModularPipeline", + "_diffusers_version": "0.41.0.dev0", + "text_encoder": ["transformers", "Qwen3VLForConditionalGeneration", {"subfolder": "text_encoder"}], + "tokenizer": ["transformers", "Qwen3VLProcessor", {"subfolder": "text_encoder"}], + "transformer": ["diffusers", "Flux3Transformer2DModel", {"subfolder": "transformer"}], + "vae": ["diffusers", "AutoencoderKLFlux2", {"subfolder": "vae"}], +} + +_REPO_FILES = [ + "modular_model_index.json", + # BFL's own single-file package and quantized builds sit beside the pipeline in the same repo. + "config.json", + "model.safetensors", + "ae.safetensors", + "variants/fp8r/model.safetensors", + "variants/fp8r/config.json", + "transformer/config.json", + "transformer/diffusion_pytorch_model-00001-of-00002.safetensors", + "transformer/diffusion_pytorch_model-00002-of-00002.safetensors", + "transformer/diffusion_pytorch_model.safetensors.index.json", + "vae/config.json", + "vae/diffusion_pytorch_model.safetensors", + "text_encoder/config.json", + "text_encoder/model-00001-of-00002.safetensors", + "text_encoder/model-00002-of-00002.safetensors", + "text_encoder/model.safetensors.index.json", + "text_encoder/tokenizer.json", + "text_encoder/merges.txt", + "text_encoder/chat_template.json", +] + + +def test_a_modular_repo_downloads_only_its_component_folders() -> None: + session = Mock() + response = Mock(status_code=200) + response.json.return_value = _FLUX3_MODULAR_INDEX + session.get.return_value = response + metadata = HuggingFaceMetadata( + id="black-forest-labs/flux-3-image-klein", + name="flux-3-image-klein", + files=[ + RemoteModelFile(url=f"https://huggingface.co/x/resolve/main/{path}", path=Path(path)) + for path in _REPO_FILES + ], + ) + + selected = {file.path.as_posix() for file in metadata.download_urls(session=session)} + + assert session.get.call_args.args[0].endswith("modular_model_index.json") + assert selected == { + path for path in _REPO_FILES if path.split("/")[0] in {"transformer", "vae", "text_encoder"} + } | {"modular_model_index.json"} From 045e7e3506c9ae5389719a854ca236508b0088a8 Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Sat, 17 Oct 2026 20:07:09 +0200 Subject: [PATCH 2/3] fix(model-install): filter modular repo downloads relative to the repo root Metadata paths carry the repository name, so the modular_model_index.json check never matched and a repo-id install also pulled the root single file and variants/. --- .../model_manager/metadata/metadata_base.py | 7 ++++--- .../test_modular_repo_download_urls.py | 14 ++++++++++---- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/invokeai/backend/model_manager/metadata/metadata_base.py b/invokeai/backend/model_manager/metadata/metadata_base.py index 6dd76ecbcba..a5de7562c9e 100644 --- a/invokeai/backend/model_manager/metadata/metadata_base.py +++ b/invokeai/backend/model_manager/metadata/metadata_base.py @@ -136,10 +136,11 @@ def download_urls( submodels = resp.json() paths = [Path(subfolder or "", x) for x in paths if Path(x).parent.as_posix() in submodels] paths.insert(0, Path(f"{prefix}model_index.json")) - elif not prefix and Path("modular_model_index.json") in paths: + elif not prefix and (repo_root := Path(self.name)) / "modular_model_index.json" in paths: # A Modular Diffusers repo names its components in modular_model_index.json instead. Each one # says which folder it loads from -- FLUX.3's tokenizer lives in `text_encoder/` -- and anything # else in the repo (FLUX.3 also ships BFL's own single-file package at the root) is not part of it. + # File paths start with the repo name (HuggingFaceMetadataFetch.from_id), so folders compare below it. url = hf_hub_url(self.id, filename="modular_model_index.json") try: resp = session.get(url, timeout=HF_METADATA_REQUEST_TIMEOUT_SECONDS) @@ -147,8 +148,8 @@ def download_urls( raise ModelMetadataUnavailableError(f"Could not fetch modular model index for '{self.id}'") from e resp.raise_for_status() component_folders = _modular_component_folders(resp.json()) - paths = [x for x in paths if Path(x).parent.as_posix() in component_folders] - paths.insert(0, Path("modular_model_index.json")) + paths = [x for x in paths if x.parent.relative_to(repo_root).as_posix() in component_folders] + paths.insert(0, repo_root / "modular_model_index.json") return [x for x in self.files if x.path in paths] diff --git a/tests/backend/model_manager/test_modular_repo_download_urls.py b/tests/backend/model_manager/test_modular_repo_download_urls.py index 41089a7b4fc..6588c3b898b 100644 --- a/tests/backend/model_manager/test_modular_repo_download_urls.py +++ b/tests/backend/model_manager/test_modular_repo_download_urls.py @@ -46,12 +46,16 @@ def test_a_modular_repo_downloads_only_its_component_folders() -> None: response = Mock(status_code=200) response.json.return_value = _FLUX3_MODULAR_INDEX session.get.return_value = response + # HuggingFaceMetadataFetch.from_id roots every file path at the repo name. metadata = HuggingFaceMetadata( id="black-forest-labs/flux-3-image-klein", name="flux-3-image-klein", files=[ - RemoteModelFile(url=f"https://huggingface.co/x/resolve/main/{path}", path=Path(path)) - for path in _REPO_FILES + RemoteModelFile( + url=f"https://huggingface.co/black-forest-labs/flux-3-image-klein/resolve/main/{rfilename}", + path=Path("flux-3-image-klein", rfilename), + ) + for rfilename in _REPO_FILES ], ) @@ -59,5 +63,7 @@ def test_a_modular_repo_downloads_only_its_component_folders() -> None: assert session.get.call_args.args[0].endswith("modular_model_index.json") assert selected == { - path for path in _REPO_FILES if path.split("/")[0] in {"transformer", "vae", "text_encoder"} - } | {"modular_model_index.json"} + f"flux-3-image-klein/{rfilename}" + for rfilename in _REPO_FILES + if rfilename.split("/")[0] in {"transformer", "vae", "text_encoder"} + } | {"flux-3-image-klein/modular_model_index.json"} From 63a485042bb5e3781cc036075e7124e5e966b812 Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Fri, 23 Oct 2026 03:25:12 +0200 Subject: [PATCH 3/3] fix(model-install): send the download token with Hugging Face index requests Gated Diffusers repos failed to install because model_index.json and modular_model_index.json were fetched without authorization. The index request now carries the token the install's file downloads send: the explicit token or Hugging Face login, else the matching remote_api_tokens entry. --- .../model_install/model_install_default.py | 24 +++- .../model_manager/metadata/metadata_base.py | 62 ++++++----- .../model_install/test_model_install.py | 104 +++++++++++++++++- .../test_modular_repo_download_urls.py | 60 ++++++++-- 4 files changed, 209 insertions(+), 41 deletions(-) diff --git a/invokeai/app/services/model_install/model_install_default.py b/invokeai/app/services/model_install/model_install_default.py index fee4083d4cf..6f0aabeea71 100644 --- a/invokeai/app/services/model_install/model_install_default.py +++ b/invokeai/app/services/model_install/model_install_default.py @@ -510,14 +510,24 @@ def _download_access_token( return self._single_hf_file_token(source) return source.access_token + def _download_token_for( + self, source: HFModelSource | URLModelSource, trusted_endpoint: Optional[str] = None + ) -> Callable[[str], Optional[str]]: + """The token a download of a URL of this source sends: `_download_access_token`, else the `remote_api_tokens` + entry that the download queue matches against that URL. Requests made to list a repository's files send it + too, so a gated repository that will serve the files also serves its index.""" + return lambda url: self._download_access_token(source, trusted_endpoint) or self._configured_api_token(url) + def _single_hf_file_token(self, source: URLModelSource) -> Optional[str]: """The token a download of this source's file sends: the source's own, else the configured `remote_api_tokens` entry matching the URL as the user gave it. The download URL names a commit instead, so the token is resolved here, once, and sent explicitly.""" - if source.access_token: - return source.access_token + return source.access_token or self._configured_api_token(str(source.url)) + + def _configured_api_token(self, url: str) -> Optional[str]: + """The token of the first `remote_api_tokens` entry whose pattern matches `url`.""" for pair in self._app_config.remote_api_tokens or []: - if re.search(pair.url_regex, str(source.url)): + if re.search(pair.url_regex, url): return pair.token return None @@ -1652,6 +1662,7 @@ def _remote_files_from_source( subfolder=source.subfolder if len(subfolders) <= 1 else None, subfolders=subfolders if len(subfolders) > 1 else None, session=self._session, + access_token_for=self._download_token_for(source, trusted_endpoint), ), metadata, ) @@ -1662,7 +1673,12 @@ def _remote_files_from_source( kwargs: dict[str, Any] = {"session": self._session} metadata = fetcher(**kwargs).from_url(source.url, revision=revision, pin_to_commit=True) assert isinstance(metadata, ModelMetadataWithFiles) - return metadata.download_urls(session=self._session), metadata + return ( + metadata.download_urls( + session=self._session, access_token_for=self._download_token_for(source, trusted_endpoint) + ), + metadata, + ) except ValueError: pass diff --git a/invokeai/backend/model_manager/metadata/metadata_base.py b/invokeai/backend/model_manager/metadata/metadata_base.py index 85dbe2420e0..249deccc926 100644 --- a/invokeai/backend/model_manager/metadata/metadata_base.py +++ b/invokeai/backend/model_manager/metadata/metadata_base.py @@ -14,7 +14,7 @@ import re from pathlib import Path -from typing import Any, List, Literal, Optional, Union +from typing import Any, Callable, List, Literal, Optional, Union from urllib.parse import unquote, urlparse from huggingface_hub import hf_hub_url @@ -152,6 +152,7 @@ def download_urls( subfolder: Optional[Path] = None, subfolders: Optional[List[Path]] = None, session: Optional[Session] = None, + access_token_for: Optional[Callable[[str], Optional[str]]] = None, ) -> List[RemoteModelFile]: """ Return list of downloadable files, filtering by variant and subfolder(s), if any. @@ -160,6 +161,8 @@ def download_urls( :param subfolder: Return model files from the designated subfolder only (deprecated, use subfolders) :param subfolders: Return model files from the designated subfolders :param session: A request.Session object used for internet-free testing + :param access_token_for: The bearer token to send with a request for a URL, or None for none. A gated + repository serves its index files only to an authorized request. Note that there is special variant-filtering behavior here: When the fp16 variant is requested and not available, the @@ -177,22 +180,7 @@ def download_urls( # the next step reads model_index.json to determine which subdirectories belong # to the model (only for single subfolder case) if Path(f"{prefix}model_index.json") in paths: - url = hf_hub_url( - self.id, - filename="model_index.json", - subfolder=str(subfolder) if subfolder else None, - revision=self._revision, - ) - try: - resp = session.get(url, timeout=HF_METADATA_REQUEST_TIMEOUT_SECONDS) - resp.raise_for_status() - except HTTPError as e: - if is_transient_hf_http_error(e): - raise ModelMetadataUnavailableError(f"Could not fetch model index for '{self.id}'") from e - raise - except RequestException as e: - raise ModelMetadataUnavailableError(f"Could not fetch model index for '{self.id}'") from e - submodels = resp.json() + submodels = self._fetch_json(session, "model_index.json", subfolder, access_token_for) paths = [Path(subfolder or "", x) for x in paths if Path(x).parent.as_posix() in submodels] paths.insert(0, Path(f"{prefix}model_index.json")) elif not prefix and (repo_root := Path(self.name)) / "modular_model_index.json" in paths: @@ -200,22 +188,40 @@ def download_urls( # says which folder it loads from -- FLUX.3's tokenizer lives in `text_encoder/` -- and anything # else in the repo (FLUX.3 also ships BFL's own single-file package at the root) is not part of it. # File paths start with the repo name (HuggingFaceMetadataFetch.from_id), so folders compare below it. - url = hf_hub_url(self.id, filename="modular_model_index.json", revision=self._revision) - try: - resp = session.get(url, timeout=HF_METADATA_REQUEST_TIMEOUT_SECONDS) - resp.raise_for_status() - except HTTPError as e: - if is_transient_hf_http_error(e): - raise ModelMetadataUnavailableError(f"Could not fetch modular model index for '{self.id}'") from e - raise - except RequestException as e: - raise ModelMetadataUnavailableError(f"Could not fetch modular model index for '{self.id}'") from e - component_folders = _modular_component_folders(resp.json()) + index = self._fetch_json(session, "modular_model_index.json", None, access_token_for) + component_folders = _modular_component_folders(index) paths = [x for x in paths if x.parent.relative_to(repo_root).as_posix() in component_folders] paths.insert(0, repo_root / "modular_model_index.json") return [x for x in self.files if x.path in paths] + def _fetch_json( + self, + session: Session, + filename: str, + subfolder: Optional[Path], + access_token_for: Optional[Callable[[str], Optional[str]]], + ) -> Any: + """Read a JSON file of this repo at the revision its file URLs name. + + A transient HTTP or transport failure raises `ModelMetadataUnavailableError`; any other HTTP error re-raises. + """ + url = hf_hub_url( + self.id, filename=filename, subfolder=str(subfolder) if subfolder else None, revision=self._revision + ) + token = access_token_for(url) if access_token_for else None + headers = {"Authorization": f"Bearer {token}"} if token else None + try: + resp = session.get(url, headers=headers, timeout=HF_METADATA_REQUEST_TIMEOUT_SECONDS) + resp.raise_for_status() + except HTTPError as e: + if is_transient_hf_http_error(e): + raise ModelMetadataUnavailableError(f"Could not fetch {filename} for '{self.id}'") from e + raise + except RequestException as e: + raise ModelMetadataUnavailableError(f"Could not fetch {filename} for '{self.id}'") from e + return resp.json() + def _modular_component_folders(index: dict[str, Any]) -> set[str]: """The folders the components of a ``modular_model_index.json`` load from.""" diff --git a/tests/app/services/model_install/test_model_install.py b/tests/app/services/model_install/test_model_install.py index a2bfd009326..b1377837a24 100644 --- a/tests/app/services/model_install/test_model_install.py +++ b/tests/app/services/model_install/test_model_install.py @@ -34,7 +34,7 @@ from invokeai.app.invocations.flux.flux_redux import FluxReduxInvocation from invokeai.app.invocations.sd.ip_adapter import IPAdapterInvocation from invokeai.app.services.config import InvokeAIAppConfig -from invokeai.app.services.config.config_default import URLRegexTokenPair +from invokeai.app.services.config.config_default import URLRegexTokenPair, get_config from invokeai.app.services.download import DownloadJob, DownloadJobStatus, MultiFileDownloadJob from invokeai.app.services.events.events_base import EventServiceBase from invokeai.app.services.events.events_common import ( @@ -2961,6 +2961,108 @@ def test_download_authorization_while_logged_in_to_hf( assert adapter.authorizations == [expected_authorization] +_GATED_MODULAR_REPO = "InvokeAI-test/gated-modular-pipeline" +_GATED_MODULAR_COMMIT = "89abcdef0123456789abcdef0123456789abcdef" +_GATED_MODULAR_FILES_URL = f"https://huggingface.co/{_GATED_MODULAR_REPO}/resolve/{_GATED_MODULAR_COMMIT}/" +# A valid safetensors file that holds no tensors: an 8-byte header length, then the space-padded header `{}`. +_EMPTY_SAFETENSORS = (8).to_bytes(8, "little") + b"{} " +# A FLUX.3 Modular Diffusers pipeline, as identification reads it. +_GATED_MODULAR_COMPONENTS = { + "modular_model_index.json": json.dumps( + { + "_class_name": "Flux3DistilledModularPipeline", + "text_encoder": ["transformers", "Qwen3VLForConditionalGeneration", {"subfolder": "text_encoder"}], + "tokenizer": ["transformers", "Qwen3VLProcessor", {"subfolder": "text_encoder"}], + "transformer": ["diffusers", "Flux3Transformer2DModel", {"subfolder": "transformer"}], + "vae": ["diffusers", "AutoencoderKLFlux2", {"subfolder": "vae"}], + } + ).encode(), + "transformer/config.json": json.dumps({"_class_name": "Flux3Transformer2DModel", "flow_map": True}).encode(), + "transformer/diffusion_pytorch_model.safetensors": _EMPTY_SAFETENSORS, + "vae/config.json": json.dumps({"_class_name": "AutoencoderKLFlux2"}).encode(), + "vae/diffusion_pytorch_model.safetensors": _EMPTY_SAFETENSORS, + "text_encoder/config.json": json.dumps({"architectures": ["Qwen3VLForConditionalGeneration"]}).encode(), + "text_encoder/model.safetensors": _EMPTY_SAFETENSORS, + "text_encoder/tokenizer.json": b"{}", +} + + +def _serve_gated_modular_repo(session) -> _AuthorizationAdapter: + """Serve a gated Modular Diffusers repo that also holds BFL's single-file package at its root; return the adapter + of its modular_model_index.json. Like the hub, it lists its files to anyone and serves them only with the token + of a user who accepted its license.""" + files = { + **_GATED_MODULAR_COMPONENTS, + "config.json": b'{"format_version": 1}', + "model.safetensors": _EMPTY_SAFETENSORS, + } + listing = json.dumps( + { + "id": _GATED_MODULAR_REPO, + "sha": _GATED_MODULAR_COMMIT, + "siblings": [{"rfilename": name, "size": len(data)} for name, data in files.items()], + } + ).encode() + session.mount(f"https://huggingface.co/api/models/{_GATED_MODULAR_REPO}", TestAdapter(listing)) + adapters = {name: _AuthorizationAdapter(data, required_token="hf_granted") for name, data in files.items()} + for name, adapter in adapters.items(): + session.mount(_GATED_MODULAR_FILES_URL + name, adapter) + return adapters["modular_model_index.json"] + + +@pytest.mark.parametrize( + ("source", "explicit_token", "hf_login", "remote_api_token"), + [ + (_GATED_MODULAR_REPO, "hf_granted", None, None), + (_GATED_MODULAR_REPO, None, "hf_granted", None), + (f"https://huggingface.co/{_GATED_MODULAR_REPO}", None, None, "hf_granted"), + ], + ids=["explicit_token", "hf_login", "url_source_with_remote_api_token"], +) +@pytest.mark.timeout(timeout=10, method="thread") +def test_a_gated_modular_repo_installs_its_components_with_the_token_its_downloads_send( + mm2_installer: ModelInstallServiceBase, + mm2_session, + monkeypatch: pytest.MonkeyPatch, + source: str, + explicit_token: str | None, + hf_login: str | None, + remote_api_token: str | None, +) -> None: + monkeypatch.setattr(model_install_default, "hf_get_token", lambda: hf_login) + if remote_api_token is not None: + # In production the installer and the download queue read one config; the fixtures give each its own. + for config in (mm2_installer.app_config, get_config()): + monkeypatch.setattr( + config, "remote_api_tokens", [URLRegexTokenPair(url_regex="huggingface.co", token=remote_api_token)] + ) + _serve_gated_modular_repo(mm2_session) + + job = mm2_installer.heuristic_import(source=source, access_token=explicit_token) + mm2_installer.wait_for_installs(timeout=10) + + assert job.complete, job.error + assert job.config_out is not None + model_path = mm2_installer.app_config.models_path / job.config_out.path + assert {path.relative_to(model_path).as_posix() for path in model_path.rglob("*") if path.is_file()} == set( + _GATED_MODULAR_COMPONENTS + ) + + +@pytest.mark.timeout(timeout=10, method="thread") +def test_a_gated_modular_repo_without_a_token_is_refused_as_final_before_an_install_starts( + mm2_installer: ModelInstallServiceBase, mm2_session, monkeypatch: pytest.MonkeyPatch +) -> None: + monkeypatch.setattr(model_install_default, "hf_get_token", lambda: None) + index = _serve_gated_modular_repo(mm2_session) + + with pytest.raises(HTTPError) as refusal: + mm2_installer.heuristic_import(source=_GATED_MODULAR_REPO) + + assert index.authorizations == [None] + assert refusal.value.response.status_code == 401 + + _SDXL_TURBO_SOURCE = HFModelSource(repo_id="stabilityai/sdxl-turbo", variant=ModelRepoVariant.Default) # Installs download from the commit the repository is at when they start. _SDXL_TURBO_FILES_URL = f"https://huggingface.co/stabilityai/sdxl-turbo/resolve/{SDXL_TURBO_COMMIT}/" diff --git a/tests/backend/model_manager/test_modular_repo_download_urls.py b/tests/backend/model_manager/test_modular_repo_download_urls.py index 6757f9483d7..e322212e322 100644 --- a/tests/backend/model_manager/test_modular_repo_download_urls.py +++ b/tests/backend/model_manager/test_modular_repo_download_urls.py @@ -1,10 +1,12 @@ """Installing a Modular Diffusers repo by id downloads its components and nothing else from the repo.""" +import json from pathlib import Path from unittest.mock import Mock import pytest import requests +import requests_testadapter from invokeai.backend.model_manager.metadata.metadata_base import ( HuggingFaceMetadata, @@ -50,6 +52,14 @@ # The commit an install pinned; the modular index must come from it, as the files do. _PINNED_COMMIT = "0123456789abcdef0123456789abcdef01234567" +_INDEX_URL = ( + f"https://huggingface.co/black-forest-labs/flux-3-image-klein/resolve/{_PINNED_COMMIT}/modular_model_index.json" +) +_COMPONENT_FILES = { + f"flux-3-image-klein/{rfilename}" + for rfilename in _REPO_FILES + if rfilename.split("/")[0] in {"transformer", "vae", "text_encoder"} +} | {"flux-3-image-klein/modular_model_index.json"} def _flux3_metadata() -> HuggingFaceMetadata: @@ -75,14 +85,48 @@ def test_a_modular_repo_downloads_only_its_component_folders() -> None: selected = {file.path.as_posix() for file in _flux3_metadata().download_urls(session=session)} - assert session.get.call_args.args[0] == ( - f"https://huggingface.co/black-forest-labs/flux-3-image-klein/resolve/{_PINNED_COMMIT}/modular_model_index.json" - ) - assert selected == { - f"flux-3-image-klein/{rfilename}" - for rfilename in _REPO_FILES - if rfilename.split("/")[0] in {"transformer", "vae", "text_encoder"} - } | {"flux-3-image-klein/modular_model_index.json"} + assert session.get.call_args.args[0] == _INDEX_URL + assert selected == _COMPONENT_FILES + + +class _GatedIndex(requests_testadapter.TestAdapter): + """Serves the index only to a request with the granted token, as a gated repo does; records each Authorization.""" + + def __init__(self) -> None: + super().__init__(json.dumps(_FLUX3_MODULAR_INDEX).encode()) + self.authorizations: list[str | None] = [] + + def send(self, request, **kwargs): + self.authorizations.append(request.headers.get("Authorization")) + if request.headers.get("Authorization") != "Bearer hf_granted": + return requests_testadapter.TestAdapter(b"", status=401).send(request, **kwargs) + return super().send(request, **kwargs) + + +def _gated_index_session() -> tuple[requests_testadapter.TestSession, _GatedIndex]: + session = requests_testadapter.TestSession() + index = _GatedIndex() + session.mount(_INDEX_URL, index) + return session, index + + +def test_a_gated_modular_index_is_read_with_the_token_for_its_url() -> None: + session, index = _gated_index_session() + + files = _flux3_metadata().download_urls(session=session, access_token_for={_INDEX_URL: "hf_granted"}.get) + + assert index.authorizations == ["Bearer hf_granted"] + assert {file.path.as_posix() for file in files} == _COMPONENT_FILES + + +def test_without_a_token_the_modular_index_request_is_unauthenticated_and_its_refusal_is_final() -> None: + session, index = _gated_index_session() + + with pytest.raises(requests.HTTPError) as refusal: + _flux3_metadata().download_urls(session=session) + + assert index.authorizations == [None] + assert refusal.value.response.status_code == 401 def test_a_transient_modular_index_failure_is_retryable() -> None: