From d0980e957f98ed03c88a56f6d734079407b8f978 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 9 Jun 2026 20:50:15 -0400 Subject: [PATCH 01/10] feat(backend): add Anima ControlNet-LLLite adapter module Port of kohya-ss ControlNet-LLLite v2 for the Anima DiT (from the Apache-2.0 ComfyUI-Anima-LLLite reference), restructured to build from a safetensors state dict + metadata without a transformer instance so it can live in the model cache. Binds to transformer Linears by path regex with guaranteed restore, supports the 4-channel inpainting conditioning (masked RGB + binary mask), and includes the patch-padding-aware cond sizing helpers. Co-Authored-By: Claude Fable 5 --- invokeai/backend/anima/control_net_lllite.py | 546 ++++++++++++++++++ .../backend/anima/test_control_net_lllite.py | 530 +++++++++++++++++ 2 files changed, 1076 insertions(+) create mode 100644 invokeai/backend/anima/control_net_lllite.py create mode 100644 tests/backend/anima/test_control_net_lllite.py diff --git a/invokeai/backend/anima/control_net_lllite.py b/invokeai/backend/anima/control_net_lllite.py new file mode 100644 index 00000000000..db20f0523f0 --- /dev/null +++ b/invokeai/backend/anima/control_net_lllite.py @@ -0,0 +1,546 @@ +"""ControlNet-LLLite adapter for Anima (DiT), v2 weight format. + +A LLLite adapter is a shared conv trunk (``conditioning1``) that encodes a +conditioning image into per-token embeddings, plus one tiny zero-init MLP per +target Linear in the DiT. Each module perturbs its Linear's *input*: +``y = org_forward(x + up(film_mlp(x, cond + depth_embed)) * multiplier)``, so +multiplier 0 or a missing cond image is an exact passthrough. + +On-disk format (v2, named-key): shared trunk under ``lllite_conditioning1.*``, +per-module weights under ``lllite_dit_blocks_{i}_{target}.{down,mid,cond_to_film,up}.*`` +plus a per-module ``.depth_embed``; hyperparams in safetensors metadata +(``lllite.*`` keys) with state-dict-shape fallbacks. + +Unlike the reference implementation, the model is constructed from +``(state_dict, metadata)`` alone — no transformer instance is needed until +:meth:`AnimaControlNetLLLite.apply_to` binds the modules to the target Linears +by their saved names. + +Original source code: +- kohya-ss ControlNet-LLLite for Anima: ComfyUI-Anima-LLLite port + (``control_net_lllite_anima.py``, ``nodes.py``) of kohya-ss/sd-scripts + ``networks/control_net_lllite_anima.py``. + SPDX-License-Identifier: Apache-2.0 +""" + +from __future__ import annotations + +import re +from typing import Callable, Sequence + +import torch +import torch.nn.functional as F +from torch import nn + +ASPP_DEFAULT_DILATIONS: tuple[int, ...] = (1, 2, 4, 8) + +_SAVED_COND_PREFIX = "lllite_conditioning1." +_INTERNAL_COND_PREFIX = "conditioning1." +_INTERNAL_MODULES_PREFIX = "lllite_modules." +_LEGACY_MODULES_PREFIX = "lllite_modules." + +MODULE_NAME_PATTERN = re.compile( + r"^lllite_dit_blocks_(\d+)_(self_attn_q_proj|self_attn_k_proj|self_attn_v_proj|cross_attn_q_proj|mlp_layer1)$" +) + +# Saved module name suffix -> attribute path under transformer.blocks[i]. +_SUFFIX_TO_ATTR_PATH: dict[str, tuple[str, ...]] = { + "self_attn_q_proj": ("self_attn", "q_proj"), + "self_attn_k_proj": ("self_attn", "k_proj"), + "self_attn_v_proj": ("self_attn", "v_proj"), + "cross_attn_q_proj": ("cross_attn", "q_proj"), + "mlp_layer1": ("mlp", "layer1"), +} +_SUFFIX_ORDER = list(_SUFFIX_TO_ATTR_PATH) + + +# ---------------------------------------------------------------------------- +# Conditioning image preprocessing (torch-only, PIL-free) +# ---------------------------------------------------------------------------- + + +def target_cond_hw(latent_h: int, latent_w: int, patch_spatial: int = 2) -> tuple[int, int]: + """Return the (H, W) the cond image / mask must be resized to. + + The LLLite ``conditioning1`` trunk has total conv stride 16, so the cond + image must be sized to ``latent_HW * 8`` in input pixel space (= token_HW + * 16 after DiT patchify with patch_spatial=2). The DiT internally pads the + latent up to a multiple of ``patch_spatial`` before patchify, so the same + rounding is mirrored here — otherwise odd latent dims yield a token-count + mismatch that silently bypasses every LLLite module. + """ + padded_h = ((latent_h + patch_spatial - 1) // patch_spatial) * patch_spatial + padded_w = ((latent_w + patch_spatial - 1) // patch_spatial) * patch_spatial + return padded_h * 8, padded_w * 8 + + +def prepare_cond_image(rgb_bchw_01: torch.Tensor, latent_h: int, latent_w: int, patch_spatial: int = 2) -> torch.Tensor: + """RGB image (B, 3, H, W) in [0, 1] -> (1, 3, H_t, W_t) in [-1, 1].""" + if rgb_bchw_01.ndim != 4 or rgb_bchw_01.shape[1] != 3: + raise ValueError(f"Unexpected cond image shape: {tuple(rgb_bchw_01.shape)} (expected B,3,H,W)") + img = rgb_bchw_01[:1] + target_h, target_w = target_cond_hw(latent_h, latent_w, patch_spatial) + if img.shape[-2] != target_h or img.shape[-1] != target_w: + img = F.interpolate(img, size=(target_h, target_w), mode="bicubic", align_corners=False) + img = img.clamp(0.0, 1.0) + return img * 2.0 - 1.0 + + +def prepare_mask(mask_b1hw_01: torch.Tensor, latent_h: int, latent_w: int, patch_spatial: int = 2) -> torch.Tensor: + """Mask (B, 1, H, W) or (B, H, W) in [0, 1] -> (1, 1, H_t, W_t) in {0.0, 1.0}. + + 1 = inpaint area, 0 = keep. The caller is responsible for the ``*2-1`` + rescale before concat with RGB (see :func:`build_inpaint_cond_image`). + """ + if mask_b1hw_01.ndim == 3: + m = mask_b1hw_01.unsqueeze(1) + elif mask_b1hw_01.ndim == 4 and mask_b1hw_01.shape[1] == 1: + m = mask_b1hw_01 + else: + raise ValueError(f"Unexpected mask shape: {tuple(mask_b1hw_01.shape)} (expected B,H,W or B,1,H,W)") + m = m[:1].float() + target_h, target_w = target_cond_hw(latent_h, latent_w, patch_spatial) + if m.shape[-2] != target_h or m.shape[-1] != target_w: + m = F.interpolate(m, size=(target_h, target_w), mode="nearest") + return (m >= 0.5).float() + + +def build_inpaint_cond_image(rgb_pm1: torch.Tensor, mask01: torch.Tensor, masked_input: bool) -> torch.Tensor: + """rgb_pm1: (1, 3, H, W) in [-1, 1], mask01: (1, 1, H, W) in {0, 1}. Returns (1, 4, H, W). + + The mask channel is rescaled to [-1, +1] (matching the RGB range), and if + ``masked_input`` is set the RGB is zeroed where ``mask >= 0.5``. + """ + if masked_input: + keep = (mask01 < 0.5).to(rgb_pm1.dtype) + rgb_pm1 = rgb_pm1 * keep + mask_pm1 = mask01.to(rgb_pm1.dtype) * 2.0 - 1.0 + return torch.cat([rgb_pm1, mask_pm1], dim=1) + + +# ---------------------------------------------------------------------------- +# Conditioning1 trunk (v2) +# ---------------------------------------------------------------------------- + + +def _gn(channels: int) -> nn.GroupNorm: + g = 8 + while g > 1 and channels % g != 0: + g //= 2 + return nn.GroupNorm(g, channels) + + +class _ResBlock(nn.Module): + def __init__(self, ch: int): + super().__init__() + self.norm1 = _gn(ch) + self.conv1 = nn.Conv2d(ch, ch, kernel_size=3, padding=1) + self.norm2 = _gn(ch) + self.conv2 = nn.Conv2d(ch, ch, kernel_size=3, padding=1) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + h = self.conv1(F.silu(self.norm1(x))) + h = self.conv2(F.silu(self.norm2(h))) + return x + h + + +class _ASPP(nn.Module): + def __init__(self, ch: int, dilations: tuple[int, ...] = ASPP_DEFAULT_DILATIONS): + super().__init__() + assert len(dilations) >= 1, "ASPP needs at least one dilation" + branches = [] + for d in dilations: + if d == 1: + conv = nn.Conv2d(ch, ch, kernel_size=1) + else: + conv = nn.Conv2d(ch, ch, kernel_size=3, padding=d, dilation=d) + branches.append(nn.Sequential(conv, _gn(ch), nn.SiLU())) + self.branches = nn.ModuleList(branches) + + self.global_pool = nn.AdaptiveAvgPool2d(1) + self.global_conv = nn.Sequential(nn.Conv2d(ch, ch, kernel_size=1), _gn(ch), nn.SiLU()) + + n_branches = len(dilations) + 1 + self.proj = nn.Sequential(nn.Conv2d(ch * n_branches, ch, kernel_size=1), _gn(ch), nn.SiLU()) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + h, w = x.shape[-2:] + outs = [b(x) for b in self.branches] + g = self.global_conv(self.global_pool(x)) + g = F.interpolate(g, size=(h, w), mode="bilinear", align_corners=False) + outs.append(g) + return self.proj(torch.cat(outs, dim=1)) + + +class _Conditioning1(nn.Module): + def __init__( + self, + cond_dim: int, + cond_emb_dim: int, + n_resblocks: int, + use_aspp: bool = False, + aspp_dilations: tuple[int, ...] = ASPP_DEFAULT_DILATIONS, + cond_in_channels: int = 3, + ): + super().__init__() + assert cond_dim % 2 == 0, f"cond_dim must be even, got {cond_dim}" + assert cond_in_channels >= 1, f"cond_in_channels must be >= 1, got {cond_in_channels}" + ch_half = cond_dim // 2 + + self.cond_in_channels = cond_in_channels + self.conv1 = nn.Conv2d(cond_in_channels, ch_half, kernel_size=4, stride=4, padding=0) + self.norm1 = _gn(ch_half) + self.conv2 = nn.Conv2d(ch_half, ch_half, kernel_size=3, stride=1, padding=1) + self.norm2 = _gn(ch_half) + self.conv3 = nn.Conv2d(ch_half, cond_dim, kernel_size=4, stride=4, padding=0) + self.norm3 = _gn(cond_dim) + + self.resblocks = nn.ModuleList([_ResBlock(cond_dim) for _ in range(n_resblocks)]) + self.aspp = _ASPP(cond_dim, aspp_dilations) if use_aspp else None + + self.proj = nn.Conv2d(cond_dim, cond_emb_dim, kernel_size=1) + self.out_norm = nn.LayerNorm(cond_emb_dim) + + def forward(self, x: torch.Tensor) -> torch.Tensor: + h = F.silu(self.norm1(self.conv1(x))) + h = F.silu(self.norm2(self.conv2(h))) + h = F.silu(self.norm3(self.conv3(h))) + for rb in self.resblocks: + h = rb(h) + if self.aspp is not None: + h = self.aspp(h) + h = self.proj(h) + b, c, hh, ww = h.shape + h = h.view(b, c, hh * ww).permute(0, 2, 1).contiguous() + h = self.out_norm(h) + return h + + +# ---------------------------------------------------------------------------- +# LLLite module (v2: FiLM + SiLU + 5D path + per-module depth embedding) +# ---------------------------------------------------------------------------- + + +class LLLiteModuleDiT(nn.Module): + def __init__( + self, + name: str, + in_dim: int, + cond_emb_dim: int, + mlp_dim: int, + dropout: float | None = None, + multiplier: float = 1.0, + ): + super().__init__() + self.lllite_name = name + self.in_dim = in_dim + self.cond_emb_dim = cond_emb_dim + self.mlp_dim = mlp_dim + self.dropout = dropout + self.multiplier = multiplier + + self.down = nn.Linear(in_dim, mlp_dim) + self.mid = nn.Linear(mlp_dim + cond_emb_dim, mlp_dim) + + # FiLM: cond_local -> (gamma, beta), zero-init for identity at start. + self.cond_to_film = nn.Linear(cond_emb_dim, 2 * mlp_dim) + nn.init.zeros_(self.cond_to_film.weight) + nn.init.zeros_(self.cond_to_film.bias) + + self.up = nn.Linear(mlp_dim, in_dim) + nn.init.zeros_(self.up.weight) + nn.init.zeros_(self.up.bias) + + self.depth_embed = nn.Parameter(torch.zeros(cond_emb_dim)) + + self.cond_emb: torch.Tensor | None = None + # Wrapped in a list so the original Linear is not registered as a + # submodule and its weights stay out of state_dict. + self._org_module: list[nn.Linear] = [] + self._org_forward: Callable[[torch.Tensor], torch.Tensor] | None = None + self._org_forward_was_instance_attr = False + + def bind(self, org_module: nn.Linear) -> None: + self.unbind() + self._org_module = [org_module] + self._org_forward = org_module.forward + self._org_forward_was_instance_attr = "forward" in org_module.__dict__ + org_module.forward = self.forward # type: ignore[method-assign] + + def unbind(self) -> None: + if self._org_forward is not None: + org_module = self._org_module[0] + if self._org_forward_was_instance_attr: + org_module.forward = self._org_forward # type: ignore[method-assign] + else: + # Restoring by assignment would pin a frozen bound method in the + # instance __dict__, which silently bypasses later class-level + # forward swaps that share the module __dict__ (see + # wrap_custom_layer notes in model_manager/load/load_default.py). + del org_module.__dict__["forward"] + self._org_forward = None + self._org_module = [] + + def forward(self, x: torch.Tensor) -> torch.Tensor: + # Input layouts: + # self/cross attention q/k/v: (B, S, D) — already flattened in the Anima block + # mlp.layer1: (B, T, H, W, D) — passed un-flattened + # Flatten the 5D case to 3D for the LLLite path and reshape on exit. + assert self._org_forward is not None + if self.multiplier == 0.0 or self.cond_emb is None: + return self._org_forward(x) + + orig_shape = x.shape + is_5d = x.dim() == 5 + if is_5d: + b, t, hh, ww, d = orig_shape + x = x.reshape(b, t * hh * ww, d) + + cx = self.cond_emb # (B_c, S, cond_emb_dim) + + # Broadcast cond_emb to the runtime batch (CFG cond+uncond, multi-cond). + if x.shape[0] != cx.shape[0]: + if x.shape[0] % cx.shape[0] != 0: + return self._org_forward(x.reshape(orig_shape) if is_5d else x) + cx = cx.repeat(x.shape[0] // cx.shape[0], 1, 1) + + if x.shape[1] != cx.shape[1]: + return self._org_forward(x.reshape(orig_shape) if is_5d else x) + + # Run the LLLite mini-MLP in its own parameter dtype, then cast the + # correction back to ``x``'s dtype before adding. Robust to autocast + # flows where x and LLLite weights have different dtypes. + param_dtype = self.down.weight.dtype + x_proc = x if x.dtype == param_dtype else x.to(param_dtype) + if cx.dtype != param_dtype or cx.device != x.device: + cx = cx.to(device=x.device, dtype=param_dtype) + + depth_e = self.depth_embed + if depth_e.dtype != param_dtype or depth_e.device != x.device: + depth_e = depth_e.to(device=x.device, dtype=param_dtype) + cond_local = cx + depth_e + + h = F.silu(self.down(x_proc)) + + gb = self.cond_to_film(cond_local) + gamma, beta = gb.chunk(2, dim=-1) + + m = self.mid(torch.cat([cond_local, h], dim=-1)) + m = m * (1 + gamma) + beta + m = F.silu(m) + + if self.dropout is not None and self.training: + m = F.dropout(m, p=self.dropout) + + out = self.up(m) * self.multiplier + if out.dtype != x.dtype: + out = out.to(x.dtype) + + y = self._org_forward(x + out) + + if is_5d: + # org Linear out_features may differ from in_features — recover with -1. + y = y.reshape(orig_shape[0], orig_shape[1], orig_shape[2], orig_shape[3], -1) + return y + + +# ---------------------------------------------------------------------------- +# AnimaControlNetLLLite +# ---------------------------------------------------------------------------- + + +def _meta_int(metadata: dict[str, str], key: str, fallback: int) -> int: + value = metadata.get(key) + return int(value) if value is not None else fallback + + +def _meta_bool(metadata: dict[str, str], key: str, fallback: bool) -> bool: + value = metadata.get(key) + return str(value).lower() == "true" if value is not None else fallback + + +class AnimaControlNetLLLite(nn.Module): + """Self-contained, cacheable LLLite adapter for the Anima transformer. + + Construct via :meth:`from_state_dict`; bind to a transformer with + :meth:`apply_to` and undo with :meth:`restore`. + """ + + def __init__( + self, + module_specs: Sequence[tuple[str, int]], + cond_emb_dim: int, + mlp_dim: int, + cond_dim: int, + cond_resblocks: int, + use_aspp: bool = False, + aspp_dilations: tuple[int, ...] = ASPP_DEFAULT_DILATIONS, + cond_in_channels: int = 3, + inpaint_masked_input: bool = False, + multiplier: float = 1.0, + ): + super().__init__() + self.cond_emb_dim = cond_emb_dim + self.mlp_dim = mlp_dim + self.cond_dim = cond_dim + self.cond_resblocks = cond_resblocks + self.use_aspp = use_aspp + self.cond_in_channels = cond_in_channels + # Training-time RGB-masking policy for cond image preparation; does not + # alter the forward pass. + self.inpaint_masked_input = inpaint_masked_input + self.multiplier = multiplier + + self.conditioning1 = _Conditioning1( + cond_dim, + cond_emb_dim, + cond_resblocks, + use_aspp=use_aspp, + aspp_dilations=aspp_dilations, + cond_in_channels=cond_in_channels, + ) + + modules = [] + for name, in_dim in module_specs: + if MODULE_NAME_PATTERN.match(name) is None: + raise ValueError(f"Unrecognized LLLite module name: '{name}'") + modules.append(LLLiteModuleDiT(name, in_dim, cond_emb_dim, mlp_dim, multiplier=multiplier)) + self.lllite_modules = nn.ModuleList(modules) + + @classmethod + def from_state_dict( + cls, state_dict: dict[str, torch.Tensor], metadata: dict[str, str] | None + ) -> AnimaControlNetLLLite: + """Build the adapter from a saved v2 named-key state dict. + + Hyperparams come from ``lllite.*`` metadata when present, with + state-dict-shape fallbacks. ``inpaint_masked_input`` is metadata-only + (not derivable from shapes; defaults to False). + """ + meta = metadata or {} + + if any(k.startswith(_LEGACY_MODULES_PREFIX) for k in state_dict): + raise ValueError( + f"State dict appears to be in a legacy ControlNet-LLLite weight format (keys starting " + f"with '{_LEGACY_MODULES_PREFIX}'). Only the v2 named-key format is supported." + ) + + module_names: set[str] = set() + for key in state_dict: + head, dot, _tail = key.partition(".") + if dot and MODULE_NAME_PATTERN.match(head): + module_names.add(head) + if not module_names: + raise ValueError("State dict contains no LLLite modules (no 'lllite_dit_blocks_*' keys).") + + def sort_key(name: str) -> tuple[int, int]: + match = MODULE_NAME_PATTERN.match(name) + assert match is not None + return int(match.group(1)), _SUFFIX_ORDER.index(match.group(2)) + + sorted_names = sorted(module_names, key=sort_key) + module_specs: list[tuple[str, int]] = [] + for name in sorted_names: + down_key = f"{name}.down.weight" + if down_key not in state_dict: + raise ValueError(f"LLLite module '{name}' is missing key '{down_key}'") + module_specs.append((name, state_dict[down_key].shape[1])) + + conv1_weight = state_dict[f"{_SAVED_COND_PREFIX}conv1.weight"] + conv3_weight = state_dict[f"{_SAVED_COND_PREFIX}conv3.weight"] + proj_weight = state_dict[f"{_SAVED_COND_PREFIX}proj.weight"] + resblock_indices = { + m.group(1) for m in (re.match(rf"^{_SAVED_COND_PREFIX}resblocks\.(\d+)\.", k) for k in state_dict) if m + } + has_aspp_keys = any(k.startswith(f"{_SAVED_COND_PREFIX}aspp.") for k in state_dict) + + use_aspp = _meta_bool(meta, "lllite.use_aspp", has_aspp_keys) + aspp_dilations_meta = meta.get("lllite.aspp_dilations") + if use_aspp and aspp_dilations_meta: + aspp_dilations = tuple(int(d) for d in aspp_dilations_meta.split(",") if d.strip()) + else: + aspp_dilations = ASPP_DEFAULT_DILATIONS + + model = cls( + module_specs=module_specs, + cond_emb_dim=_meta_int(meta, "lllite.cond_emb_dim", proj_weight.shape[0]), + mlp_dim=_meta_int(meta, "lllite.mlp_dim", state_dict[f"{sorted_names[0]}.down.weight"].shape[0]), + cond_dim=_meta_int(meta, "lllite.cond_dim", conv3_weight.shape[0]), + cond_resblocks=_meta_int(meta, "lllite.cond_resblocks", len(resblock_indices)), + use_aspp=use_aspp, + aspp_dilations=aspp_dilations, + cond_in_channels=_meta_int(meta, "lllite.cond_in_channels", conv1_weight.shape[1]), + inpaint_masked_input=_meta_bool(meta, "lllite.inpaint_masked_input", False), + ) + + name_to_idx = {name: i for i, name in enumerate(sorted_names)} + remapped: dict[str, torch.Tensor] = {} + for key, value in state_dict.items(): + if key.startswith(_SAVED_COND_PREFIX): + remapped[_INTERNAL_COND_PREFIX + key[len(_SAVED_COND_PREFIX) :]] = value + continue + head, dot, tail = key.partition(".") + if dot and head in name_to_idx: + remapped[f"{_INTERNAL_MODULES_PREFIX}{name_to_idx[head]}.{tail}"] = value + else: + # Unknown keys are passed through so strict loading reports them. + remapped[key] = value + + model.load_state_dict(remapped, strict=True) + model.eval().requires_grad_(False) + return model + + def set_cond_image(self, cond: torch.Tensor | None) -> None: + """cond: (B, cond_in_channels, H_t, W_t) in [-1, 1]; ``None`` clears.""" + if cond is None: + for m in self.lllite_modules: + m.cond_emb = None + return + trunk_weight = self.conditioning1.conv1.weight + cond = cond.to(device=trunk_weight.device, dtype=trunk_weight.dtype) + cx = self.conditioning1(cond) # (B, S, cond_emb_dim) + for m in self.lllite_modules: + m.cond_emb = cx + + def clear_cond_image(self) -> None: + self.set_cond_image(None) + + def set_multiplier(self, multiplier: float) -> None: + self.multiplier = multiplier + for m in self.lllite_modules: + m.multiplier = multiplier + + def apply_to(self, transformer: nn.Module) -> None: + """Swap the forward of each target Linear in ``transformer``. Idempotent.""" + self.restore() + for m in self.lllite_modules: + target = self._resolve_target(transformer, m.lllite_name) + if not isinstance(target, nn.Linear): + raise TypeError(f"LLLite target for '{m.lllite_name}' is {type(target).__name__}, expected nn.Linear") + if target.in_features != m.in_dim: + raise ValueError( + f"LLLite module '{m.lllite_name}' was trained for in_features={m.in_dim}, but the " + f"target Linear has in_features={target.in_features}" + ) + m.bind(target) + + def restore(self) -> None: + """Undo :meth:`apply_to`. Safe to call when not applied.""" + for m in self.lllite_modules: + m.unbind() + + @staticmethod + def _resolve_target(transformer: nn.Module, name: str) -> nn.Module: + match = MODULE_NAME_PATTERN.match(name) + if match is None: + raise ValueError(f"Unrecognized LLLite module name: '{name}'") + block_idx = int(match.group(1)) + blocks = transformer.blocks + if block_idx >= len(blocks): + raise ValueError( + f"LLLite module '{name}' targets block {block_idx}, but the transformer has only {len(blocks)} blocks" + ) + target: nn.Module = blocks[block_idx] + for attr in _SUFFIX_TO_ATTR_PATH[match.group(2)]: + target = getattr(target, attr) + return target diff --git a/tests/backend/anima/test_control_net_lllite.py b/tests/backend/anima/test_control_net_lllite.py new file mode 100644 index 00000000000..5817ca9f760 --- /dev/null +++ b/tests/backend/anima/test_control_net_lllite.py @@ -0,0 +1,530 @@ +"""Tests for the Anima ControlNet-LLLite adapter — construction from a saved +state dict, exact-passthrough guarantees, forward-swap binding/restore, and the +conditioning image preprocessing helpers.""" + +import os +from pathlib import Path + +import pytest +import torch +import torch.nn.functional as F +from torch import nn + +from invokeai.backend.anima.control_net_lllite import ( + AnimaControlNetLLLite, + build_inpaint_cond_image, + prepare_cond_image, + prepare_mask, + target_cond_hw, +) + +# Opt-in test against the real adapter weights (anima-lllite-inpainting-v2.safetensors). +_REAL_WEIGHTS_ENV_VAR = "ANIMA_LLLITE_WEIGHTS_PATH" +REAL_WEIGHTS_PATH = Path(os.environ[_REAL_WEIGHTS_ENV_VAR]) if _REAL_WEIGHTS_ENV_VAR in os.environ else None + +COND_DIM = 16 +COND_EMB_DIM = 8 +MLP_DIM = 8 +IN_DIM = 16 +N_BLOCKS = 2 +KINDS = ("self_attn_q_proj", "self_attn_k_proj", "self_attn_v_proj", "mlp_layer1") + + +def make_synthetic_state_dict(seed: int = 0) -> dict[str, torch.Tensor]: + """Saved-format (v2 named-key) state dict for a tiny 2-block adapter with + 4-channel (inpaint) conditioning and one trunk resblock.""" + g = torch.Generator().manual_seed(seed) + + def t(*shape: int) -> torch.Tensor: + return torch.randn(*shape, generator=g) + + ch_half = COND_DIM // 2 + sd = { + "lllite_conditioning1.conv1.weight": t(ch_half, 4, 4, 4), + "lllite_conditioning1.conv1.bias": t(ch_half), + "lllite_conditioning1.norm1.weight": t(ch_half), + "lllite_conditioning1.norm1.bias": t(ch_half), + "lllite_conditioning1.conv2.weight": t(ch_half, ch_half, 3, 3), + "lllite_conditioning1.conv2.bias": t(ch_half), + "lllite_conditioning1.norm2.weight": t(ch_half), + "lllite_conditioning1.norm2.bias": t(ch_half), + "lllite_conditioning1.conv3.weight": t(COND_DIM, ch_half, 4, 4), + "lllite_conditioning1.conv3.bias": t(COND_DIM), + "lllite_conditioning1.norm3.weight": t(COND_DIM), + "lllite_conditioning1.norm3.bias": t(COND_DIM), + "lllite_conditioning1.resblocks.0.norm1.weight": t(COND_DIM), + "lllite_conditioning1.resblocks.0.norm1.bias": t(COND_DIM), + "lllite_conditioning1.resblocks.0.conv1.weight": t(COND_DIM, COND_DIM, 3, 3), + "lllite_conditioning1.resblocks.0.conv1.bias": t(COND_DIM), + "lllite_conditioning1.resblocks.0.norm2.weight": t(COND_DIM), + "lllite_conditioning1.resblocks.0.norm2.bias": t(COND_DIM), + "lllite_conditioning1.resblocks.0.conv2.weight": t(COND_DIM, COND_DIM, 3, 3), + "lllite_conditioning1.resblocks.0.conv2.bias": t(COND_DIM), + "lllite_conditioning1.proj.weight": t(COND_EMB_DIM, COND_DIM, 1, 1), + "lllite_conditioning1.proj.bias": t(COND_EMB_DIM), + "lllite_conditioning1.out_norm.weight": t(COND_EMB_DIM), + "lllite_conditioning1.out_norm.bias": t(COND_EMB_DIM), + } + for i in range(N_BLOCKS): + for kind in KINDS: + p = f"lllite_dit_blocks_{i}_{kind}" + sd[f"{p}.down.weight"] = t(MLP_DIM, IN_DIM) + sd[f"{p}.down.bias"] = t(MLP_DIM) + sd[f"{p}.mid.weight"] = t(MLP_DIM, MLP_DIM + COND_EMB_DIM) + sd[f"{p}.mid.bias"] = t(MLP_DIM) + sd[f"{p}.cond_to_film.weight"] = t(2 * MLP_DIM, COND_EMB_DIM) + sd[f"{p}.cond_to_film.bias"] = t(2 * MLP_DIM) + sd[f"{p}.up.weight"] = t(IN_DIM, MLP_DIM) + sd[f"{p}.up.bias"] = t(IN_DIM) + sd[f"{p}.depth_embed"] = t(COND_EMB_DIM) + return sd + + +class FakeAttention(nn.Module): + def __init__(self, dim: int): + super().__init__() + self.q_proj = nn.Linear(dim, dim, bias=False) + self.k_proj = nn.Linear(dim, dim, bias=False) + self.v_proj = nn.Linear(dim, dim, bias=False) + + +class FakeMlp(nn.Module): + def __init__(self, dim: int): + super().__init__() + self.layer1 = nn.Linear(dim, dim * 2, bias=False) + + +class FakeBlock(nn.Module): + def __init__(self, dim: int): + super().__init__() + self.self_attn = FakeAttention(dim) + self.cross_attn = FakeAttention(dim) + self.mlp = FakeMlp(dim) + + +class FakeTransformer(nn.Module): + def __init__(self, dim: int, n_blocks: int): + super().__init__() + self.blocks = nn.ModuleList([FakeBlock(dim) for _ in range(n_blocks)]) + + +def make_model_and_transformer(dim: int = IN_DIM) -> tuple[AnimaControlNetLLLite, FakeTransformer]: + model = AnimaControlNetLLLite.from_state_dict(make_synthetic_state_dict(), None) + torch.manual_seed(123) + transformer = FakeTransformer(dim, N_BLOCKS) + return model, transformer + + +def matching_cond_image() -> torch.Tensor: + """4ch cond image sized for latent 4x4 -> trunk tokens S = 2*2 = 4.""" + return torch.randn(1, 4, 32, 32, generator=torch.Generator().manual_seed(7)).clamp(-1, 1) + + +def plain_linear(linear: nn.Linear, x: torch.Tensor) -> torch.Tensor: + return F.linear(x, linear.weight, linear.bias) + + +# ---------------------------------------------------------------------------- +# Preprocessing helpers +# ---------------------------------------------------------------------------- + + +def test_target_cond_hw_even_latent() -> None: + assert target_cond_hw(128, 128) == (1024, 1024) + assert target_cond_hw(64, 96) == (512, 768) + + +def test_target_cond_hw_odd_latent_pads_to_patch_multiple() -> None: + assert target_cond_hw(129, 129) == (1040, 1040) + assert target_cond_hw(129, 64) == (1040, 512) + assert target_cond_hw(5, 5, patch_spatial=4) == (64, 64) + + +def test_prepare_cond_image_no_resize_is_exact_rescale() -> None: + rgb = torch.rand(1, 3, 16, 16, generator=torch.Generator().manual_seed(0)) + out = prepare_cond_image(rgb, latent_h=2, latent_w=2) + assert torch.equal(out, rgb * 2.0 - 1.0) + + +def test_prepare_cond_image_resizes_takes_first_frame_and_stays_in_range() -> None: + rgb = torch.rand(2, 3, 100, 100, generator=torch.Generator().manual_seed(1)) + out = prepare_cond_image(rgb, latent_h=9, latent_w=8) + assert out.shape == (1, 3, 80, 64) + assert out.min().item() >= -1.0 + assert out.max().item() <= 1.0 + + +def test_prepare_cond_image_rejects_bad_shape() -> None: + with pytest.raises(ValueError, match="Unexpected cond image shape"): + prepare_cond_image(torch.rand(1, 4, 16, 16), latent_h=2, latent_w=2) + + +def test_prepare_mask_binarizes_at_half() -> None: + mask = torch.full((1, 1, 16, 16), 0.49) + mask[:, :, 8:, :] = 0.5 + out = prepare_mask(mask, latent_h=2, latent_w=2) + assert torch.equal(out[:, :, :8, :], torch.zeros(1, 1, 8, 16)) + assert torch.equal(out[:, :, 8:, :], torch.ones(1, 1, 8, 16)) + + +def test_prepare_mask_accepts_3d_and_resizes_nearest() -> None: + mask = torch.zeros(1, 8, 8) + mask[:, :4, :] = 1.0 + out = prepare_mask(mask, latent_h=4, latent_w=4) + assert out.shape == (1, 1, 32, 32) + assert set(out.unique().tolist()) <= {0.0, 1.0} + assert torch.equal(out[:, :, :16, :], torch.ones(1, 1, 16, 32)) + assert torch.equal(out[:, :, 16:, :], torch.zeros(1, 1, 16, 32)) + + +def test_prepare_mask_rejects_bad_shape() -> None: + with pytest.raises(ValueError, match="Unexpected mask shape"): + prepare_mask(torch.rand(1, 3, 16, 16), latent_h=2, latent_w=2) + + +def test_build_inpaint_cond_image_polarity_and_range() -> None: + rgb = torch.full((1, 3, 4, 4), 0.5) + mask = torch.zeros(1, 1, 4, 4) + mask[:, :, :2, :] = 1.0 # white = inpaint area + + out = build_inpaint_cond_image(rgb, mask, masked_input=True) + assert out.shape == (1, 4, 4, 4) + # RGB zeroed under the inpaint area, untouched elsewhere. + assert torch.equal(out[:, :3, :2, :], torch.zeros(1, 3, 2, 4)) + assert torch.equal(out[:, :3, 2:, :], rgb[:, :, 2:, :]) + # Mask channel rescaled to [-1, 1]: +1 = inpaint, -1 = keep. + assert torch.equal(out[:, 3:, :2, :], torch.ones(1, 1, 2, 4)) + assert torch.equal(out[:, 3:, 2:, :], -torch.ones(1, 1, 2, 4)) + + +def test_build_inpaint_cond_image_without_masked_input_keeps_rgb() -> None: + rgb = torch.full((1, 3, 4, 4), 0.5) + mask = torch.ones(1, 1, 4, 4) + out = build_inpaint_cond_image(rgb, mask, masked_input=False) + assert torch.equal(out[:, :3], rgb) + assert torch.equal(out[:, 3:], torch.ones(1, 1, 4, 4)) + + +# ---------------------------------------------------------------------------- +# Construction from state dict +# ---------------------------------------------------------------------------- + + +def test_from_state_dict_synthetic_shape_fallbacks() -> None: + sd = make_synthetic_state_dict() + model = AnimaControlNetLLLite.from_state_dict(sd, None) + + assert len(model.lllite_modules) == N_BLOCKS * len(KINDS) + assert model.cond_in_channels == 4 + assert model.cond_emb_dim == COND_EMB_DIM + assert model.mlp_dim == MLP_DIM + assert model.cond_dim == COND_DIM + assert model.cond_resblocks == 1 + assert model.use_aspp is False + assert model.inpaint_masked_input is False # metadata-only, defaults False + + # Weights actually landed where they belong. + assert torch.equal(model.conditioning1.conv1.weight, sd["lllite_conditioning1.conv1.weight"]) + by_name = {m.lllite_name: m for m in model.lllite_modules} + m0 = by_name["lllite_dit_blocks_0_self_attn_q_proj"] + assert torch.equal(m0.depth_embed, sd["lllite_dit_blocks_0_self_attn_q_proj.depth_embed"]) + assert torch.equal(m0.up.weight, sd["lllite_dit_blocks_0_self_attn_q_proj.up.weight"]) + m1 = by_name["lllite_dit_blocks_1_mlp_layer1"] + assert torch.equal(m1.down.weight, sd["lllite_dit_blocks_1_mlp_layer1.down.weight"]) + + assert not any(p.requires_grad for p in model.parameters()) + assert not model.training + + +def test_from_state_dict_metadata_wins() -> None: + metadata = { + "lllite.cond_emb_dim": str(COND_EMB_DIM), + "lllite.mlp_dim": str(MLP_DIM), + "lllite.cond_dim": str(COND_DIM), + "lllite.cond_resblocks": "1", + "lllite.use_aspp": "false", + "lllite.cond_in_channels": "4", + "lllite.inpaint_masked_input": "true", + } + model = AnimaControlNetLLLite.from_state_dict(make_synthetic_state_dict(), metadata) + assert model.inpaint_masked_input is True + assert model.cond_in_channels == 4 + + +def test_from_state_dict_rejects_legacy_format() -> None: + sd = make_synthetic_state_dict() + sd["lllite_modules.0.down.weight"] = torch.zeros(MLP_DIM, IN_DIM) + with pytest.raises(ValueError, match="legacy"): + AnimaControlNetLLLite.from_state_dict(sd, None) + + +def test_from_state_dict_strict_on_unknown_keys() -> None: + sd = make_synthetic_state_dict() + sd["some_unrelated_key"] = torch.zeros(1) + with pytest.raises(RuntimeError, match="some_unrelated_key"): + AnimaControlNetLLLite.from_state_dict(sd, None) + + sd = make_synthetic_state_dict() + sd["lllite_dit_blocks_0_self_attn_q_proj.extra.weight"] = torch.zeros(1) + with pytest.raises(RuntimeError, match="extra"): + AnimaControlNetLLLite.from_state_dict(sd, None) + + +def test_from_state_dict_strict_on_missing_keys() -> None: + sd = make_synthetic_state_dict() + del sd["lllite_dit_blocks_0_self_attn_q_proj.depth_embed"] + with pytest.raises(RuntimeError, match="depth_embed"): + AnimaControlNetLLLite.from_state_dict(sd, None) + + +def test_from_state_dict_requires_modules() -> None: + sd = {k: v for k, v in make_synthetic_state_dict().items() if k.startswith("lllite_conditioning1.")} + with pytest.raises(ValueError, match="no LLLite modules"): + AnimaControlNetLLLite.from_state_dict(sd, None) + + +def test_from_state_dict_missing_down_weight_raises_value_error() -> None: + sd = make_synthetic_state_dict() + del sd["lllite_dit_blocks_0_self_attn_q_proj.down.weight"] + with pytest.raises(ValueError, match="missing key 'lllite_dit_blocks_0_self_attn_q_proj.down.weight'"): + AnimaControlNetLLLite.from_state_dict(sd, None) + + +# ---------------------------------------------------------------------------- +# Binding / restore +# ---------------------------------------------------------------------------- + + +def test_apply_to_swaps_forward_and_restore_is_bit_exact() -> None: + model, transformer = make_model_and_transformer() + x = torch.randn(1, 4, IN_DIM, generator=torch.Generator().manual_seed(2)) + q_proj = transformer.blocks[0].self_attn.q_proj + expected = plain_linear(q_proj, x) + + model.apply_to(transformer) + model.set_multiplier(1.0) + model.set_cond_image(matching_cond_image()) + assert not torch.equal(q_proj(x), expected) + + model.restore() + assert torch.equal(q_proj(x), expected) + + +def test_apply_to_is_idempotent() -> None: + model, transformer = make_model_and_transformer() + x = torch.randn(1, 4, IN_DIM, generator=torch.Generator().manual_seed(3)) + v_proj = transformer.blocks[1].self_attn.v_proj + expected = plain_linear(v_proj, x) + + model.apply_to(transformer) + model.apply_to(transformer) # must not double-wrap + model.restore() + assert torch.equal(v_proj(x), expected) + + +def test_restore_without_apply_is_safe() -> None: + model, _ = make_model_and_transformer() + model.restore() + model.restore() + + +def test_restore_does_not_pin_instance_level_forward() -> None: + # An instance-level `forward` left behind after restore() would silently + # bypass class-level forward swaps that share the module __dict__ (see + # wrap_custom_layer notes in model_manager/load/load_default.py). + model, transformer = make_model_and_transformer() + q_proj = transformer.blocks[0].self_attn.q_proj + assert "forward" not in q_proj.__dict__ + + model.apply_to(transformer) + assert "forward" in q_proj.__dict__ + model.restore() + assert "forward" not in q_proj.__dict__ + + +def test_restore_preserves_preexisting_instance_level_forward() -> None: + model, transformer = make_model_and_transformer() + q_proj = transformer.blocks[0].self_attn.q_proj + sentinel = q_proj.forward + q_proj.forward = sentinel # pre-existing instance-level forward + + model.apply_to(transformer) + model.restore() + assert q_proj.__dict__.get("forward") is sentinel + + +def test_apply_to_rejects_in_features_mismatch() -> None: + model, _ = make_model_and_transformer() + transformer = FakeTransformer(IN_DIM * 2, N_BLOCKS) + with pytest.raises(ValueError, match="in_features"): + model.apply_to(transformer) + + +def test_apply_to_rejects_missing_block() -> None: + model, _ = make_model_and_transformer() + transformer = FakeTransformer(IN_DIM, 1) + with pytest.raises(ValueError, match="block"): + model.apply_to(transformer) + + +# ---------------------------------------------------------------------------- +# Forward: passthrough guarantees and active path +# ---------------------------------------------------------------------------- + + +def test_passthrough_multiplier_zero_is_bit_exact() -> None: + model, transformer = make_model_and_transformer() + model.apply_to(transformer) + model.set_cond_image(matching_cond_image()) + model.set_multiplier(0.0) + x = torch.randn(1, 4, IN_DIM, generator=torch.Generator().manual_seed(4)) + for block in transformer.blocks: + for linear in (block.self_attn.q_proj, block.self_attn.k_proj, block.self_attn.v_proj): + assert torch.equal(linear(x), plain_linear(linear, x)) + + +def test_passthrough_no_cond_is_bit_exact() -> None: + model, transformer = make_model_and_transformer() + model.apply_to(transformer) + model.set_multiplier(1.0) + q_proj = transformer.blocks[0].self_attn.q_proj + x = torch.randn(1, 4, IN_DIM, generator=torch.Generator().manual_seed(5)) + assert torch.equal(q_proj(x), plain_linear(q_proj, x)) + + model.set_cond_image(matching_cond_image()) + assert not torch.equal(q_proj(x), plain_linear(q_proj, x)) + model.set_cond_image(None) # clearing re-enables passthrough + assert torch.equal(q_proj(x), plain_linear(q_proj, x)) + + +def test_passthrough_on_seq_len_mismatch_is_bit_exact() -> None: + model, transformer = make_model_and_transformer() + model.apply_to(transformer) + model.set_multiplier(1.0) + # Cond image for latent 6x6 -> S = 3*3 = 9, but x has S = 4. + model.set_cond_image(torch.randn(1, 4, 48, 48, generator=torch.Generator().manual_seed(6))) + q_proj = transformer.blocks[0].self_attn.q_proj + x = torch.randn(1, 4, IN_DIM, generator=torch.Generator().manual_seed(7)) + assert torch.equal(q_proj(x), plain_linear(q_proj, x)) + + +def test_passthrough_on_non_divisible_batch_is_bit_exact() -> None: + model, transformer = make_model_and_transformer() + model.apply_to(transformer) + model.set_multiplier(1.0) + model.set_cond_image(matching_cond_image().repeat(2, 1, 1, 1)) # cond batch 2 + q_proj = transformer.blocks[0].self_attn.q_proj + x = torch.randn(3, 4, IN_DIM, generator=torch.Generator().manual_seed(8)) # 3 % 2 != 0 + assert torch.equal(q_proj(x), plain_linear(q_proj, x)) + + +def test_cfg_batch_broadcast_matches_single_sample() -> None: + model, transformer = make_model_and_transformer() + model.apply_to(transformer) + model.set_multiplier(1.0) + model.set_cond_image(matching_cond_image()) # cond batch 1 + q_proj = transformer.blocks[0].self_attn.q_proj + xa = torch.randn(1, 4, IN_DIM, generator=torch.Generator().manual_seed(9)) + xb = torch.randn(1, 4, IN_DIM, generator=torch.Generator().manual_seed(10)) + y_batched = q_proj(torch.cat([xa, xb], dim=0)) + assert not torch.equal(y_batched, plain_linear(q_proj, torch.cat([xa, xb], dim=0))) + assert torch.allclose(y_batched[0:1], q_proj(xa), rtol=1e-5, atol=1e-6) + assert torch.allclose(y_batched[1:2], q_proj(xb), rtol=1e-5, atol=1e-6) + + +def test_5d_mlp_input_matches_flattened_3d_path() -> None: + model, transformer = make_model_and_transformer() + model.apply_to(transformer) + model.set_multiplier(1.0) + model.set_cond_image(matching_cond_image()) + layer1 = transformer.blocks[0].mlp.layer1 + x5 = torch.randn(1, 1, 2, 2, IN_DIM, generator=torch.Generator().manual_seed(11)) + y5 = layer1(x5) + assert y5.shape == (1, 1, 2, 2, IN_DIM * 2) + y3 = layer1(x5.reshape(1, 4, IN_DIM)) + assert torch.equal(y5, y3.reshape(1, 1, 2, 2, -1)) + assert not torch.equal(y5, plain_linear(layer1, x5)) + + +def test_5d_passthrough_keeps_shape() -> None: + model, transformer = make_model_and_transformer() + model.apply_to(transformer) + model.set_multiplier(1.0) + # Seq mismatch: trunk S = 9, x flattened S = 4 -> identity fallback. + model.set_cond_image(torch.randn(1, 4, 48, 48, generator=torch.Generator().manual_seed(12))) + layer1 = transformer.blocks[0].mlp.layer1 + x5 = torch.randn(1, 1, 2, 2, IN_DIM, generator=torch.Generator().manual_seed(13)) + assert torch.equal(layer1(x5), plain_linear(layer1, x5)) + + +def test_forward_casts_mismatched_input_dtype() -> None: + model, transformer = make_model_and_transformer() + model.apply_to(transformer) + model.set_multiplier(1.0) + model.set_cond_image(matching_cond_image()) + transformer.to(torch.bfloat16) + x = torch.randn(1, 4, IN_DIM, generator=torch.Generator().manual_seed(14)).to(torch.bfloat16) + q_proj = transformer.blocks[0].self_attn.q_proj + y = q_proj(x) + assert y.dtype == torch.bfloat16 + assert not torch.equal(y, plain_linear(q_proj, x)) + + +# ---------------------------------------------------------------------------- +# Real weight file (optional; skipped when the file is not present) +# ---------------------------------------------------------------------------- + + +@pytest.mark.skipif( + REAL_WEIGHTS_PATH is None or not REAL_WEIGHTS_PATH.is_file(), + reason=f"set {_REAL_WEIGHTS_ENV_VAR} to the real LLLite weights file to run", +) +def test_from_state_dict_real_file() -> None: + from safetensors import safe_open + from safetensors.torch import load_file + + assert REAL_WEIGHTS_PATH is not None + sd = load_file(str(REAL_WEIGHTS_PATH)) + with safe_open(str(REAL_WEIGHTS_PATH), framework="pt") as f: + metadata = f.metadata() + + model = AnimaControlNetLLLite.from_state_dict(sd, metadata) + + assert len(model.lllite_modules) == 112 + assert model.cond_in_channels == 4 + assert model.inpaint_masked_input is True + assert model.cond_emb_dim == 64 + assert model.mlp_dim == 64 + assert model.cond_dim == 128 + assert model.cond_resblocks == 4 + assert model.use_aspp is False + + for m in model.lllite_modules: + assert m.in_dim == 2048 + assert m.down.weight.shape == (64, 2048) + assert m.mid.weight.shape == (64, 128) + assert m.cond_to_film.weight.shape == (128, 64) + assert m.up.weight.shape == (2048, 64) + assert m.depth_embed.shape == (64,) + + # Strict loading consumed every saved key (1056 = 48 trunk + 112 * 9). + assert len(model.state_dict()) == len(sd) == 1056 + + # Forward smoke test on one module bound to a 2048-wide Linear. + model = model.to(torch.float32) + linear = nn.Linear(2048, 2048) + module = model.lllite_modules[0] + module.bind(linear) + try: + model.set_multiplier(1.0) + # Cond image for latent 4x4 -> S = 2*2 = 4 trunk tokens. + model.set_cond_image(torch.randn(1, 4, 32, 32, generator=torch.Generator().manual_seed(15))) + assert module.cond_emb is not None + assert module.cond_emb.shape == (1, 4, 64) + x = torch.randn(1, 4, 2048, generator=torch.Generator().manual_seed(16)) + y = linear(x) + assert y.shape == (1, 4, 2048) + assert torch.isfinite(y).all() + assert not torch.equal(y, plain_linear(linear, x)) + finally: + module.unbind() From 1212221a5afd1f88c81e5fbc761203136ce99610 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 9 Jun 2026 20:50:39 -0400 Subject: [PATCH 02/10] feat(model_manager): register Anima ControlNet-LLLite checkpoints New ControlNet_Checkpoint_Anima_Config probed on the lllite_conditioning1./ lllite_dit_blocks_ key namespace (no overlap with SDXL LLLite or Z-Image control), a loader that builds the adapter from metadata at the Anima inference dtype, and an Anima LLLite Inpainting starter model entry for kohya-ss/Anima-LLLite. Co-Authored-By: Claude Fable 5 --- .../model_manager/configs/controlnet.py | 42 ++++++ .../backend/model_manager/configs/factory.py | 2 + .../model_manager/load/model_loaders/anima.py | 40 ++++++ .../backend/model_manager/starter_models.py | 11 ++ .../configs/test_anima_controlnet_config.py | 133 ++++++++++++++++++ 5 files changed, 228 insertions(+) create mode 100644 tests/backend/model_manager/configs/test_anima_controlnet_config.py diff --git a/invokeai/backend/model_manager/configs/controlnet.py b/invokeai/backend/model_manager/configs/controlnet.py index 1c73df41209..eee4204ba67 100644 --- a/invokeai/backend/model_manager/configs/controlnet.py +++ b/invokeai/backend/model_manager/configs/controlnet.py @@ -278,3 +278,45 @@ def _validate_looks_like_z_image_control(cls, mod: ModelOnDisk) -> None: state_dict = mod.load_state_dict() if not _has_z_image_control_keys(state_dict): raise NotAMatchError("state dict does not look like a Z-Image Control model") + + +def _has_anima_lllite_keys(state_dict: dict) -> bool: + """Check if state dict contains Anima ControlNet-LLLite specific keys. + + Anima LLLite adapters (v2 named-key format) have a shared conditioning trunk under + `lllite_conditioning1.*` and per-module weights under `lllite_dit_blocks_*`. SDXL + ControlNet-LLLite models use `lllite_unet_*` keys instead and do not match. + """ + return state_dict_has_any_keys_starting_with( + state_dict, "lllite_conditioning1." + ) and state_dict_has_any_keys_starting_with(state_dict, "lllite_dit_blocks_") + + +class ControlNet_Checkpoint_Anima_Config(Checkpoint_Config_Base, Config_Base): + """Model config for Anima ControlNet-LLLite adapter models (Safetensors checkpoint). + + Anima LLLite adapters are standalone adapters consisting of a shared conditioning trunk + (lllite_conditioning1) that encodes a conditioning image, plus tiny per-Linear modules + (lllite_dit_blocks_*) that perturb the inputs of target Linears in the Anima DiT. + """ + + type: Literal[ModelType.ControlNet] = Field(default=ModelType.ControlNet) + format: Literal[ModelFormat.Checkpoint] = Field(default=ModelFormat.Checkpoint) + base: Literal[BaseModelType.Anima] = Field(default=BaseModelType.Anima) + default_settings: ControlAdapterDefaultSettings | None = Field(None) + + @classmethod + def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) -> Self: + raise_if_not_file(mod) + + raise_for_override_fields(cls, override_fields) + + cls._validate_looks_like_anima_lllite(mod) + + return cls(**override_fields) + + @classmethod + def _validate_looks_like_anima_lllite(cls, mod: ModelOnDisk) -> None: + state_dict = mod.load_state_dict() + if not _has_anima_lllite_keys(state_dict): + raise NotAMatchError("state dict does not look like an Anima ControlNet-LLLite model") diff --git a/invokeai/backend/model_manager/configs/factory.py b/invokeai/backend/model_manager/configs/factory.py index 985cb982d30..effb22fcb24 100644 --- a/invokeai/backend/model_manager/configs/factory.py +++ b/invokeai/backend/model_manager/configs/factory.py @@ -16,6 +16,7 @@ from invokeai.backend.model_manager.configs.clip_vision import CLIPVision_Diffusers_Config from invokeai.backend.model_manager.configs.controlnet import ( ControlAdapterDefaultSettings, + ControlNet_Checkpoint_Anima_Config, ControlNet_Checkpoint_FLUX_Config, ControlNet_Checkpoint_SD1_Config, ControlNet_Checkpoint_SD2_Config, @@ -211,6 +212,7 @@ Annotated[ControlNet_Checkpoint_SDXL_Config, ControlNet_Checkpoint_SDXL_Config.get_tag()], Annotated[ControlNet_Checkpoint_FLUX_Config, ControlNet_Checkpoint_FLUX_Config.get_tag()], Annotated[ControlNet_Checkpoint_ZImage_Config, ControlNet_Checkpoint_ZImage_Config.get_tag()], + Annotated[ControlNet_Checkpoint_Anima_Config, ControlNet_Checkpoint_Anima_Config.get_tag()], # ControlNet - diffusers format Annotated[ControlNet_Diffusers_SD1_Config, ControlNet_Diffusers_SD1_Config.get_tag()], Annotated[ControlNet_Diffusers_SD2_Config, ControlNet_Diffusers_SD2_Config.get_tag()], diff --git a/invokeai/backend/model_manager/load/model_loaders/anima.py b/invokeai/backend/model_manager/load/model_loaders/anima.py index 8d068f5468c..5cbb0066762 100644 --- a/invokeai/backend/model_manager/load/model_loaders/anima.py +++ b/invokeai/backend/model_manager/load/model_loaders/anima.py @@ -7,6 +7,7 @@ import accelerate from invokeai.backend.model_manager.configs.base import Checkpoint_Config_Base +from invokeai.backend.model_manager.configs.controlnet import ControlNet_Checkpoint_Anima_Config from invokeai.backend.model_manager.configs.factory import AnyModelConfig from invokeai.backend.model_manager.configs.main import Main_Checkpoint_Anima_Config from invokeai.backend.model_manager.load.load_default import ModelLoader @@ -156,3 +157,42 @@ def _load_from_singlefile( f"(expected for inv_freq buffers). First 5: {load_result.missing_keys[:5]}" ) return model + + +@ModelLoaderRegistry.register(base=BaseModelType.Anima, type=ModelType.ControlNet, format=ModelFormat.Checkpoint) +class AnimaControlNetLLLiteModel(ModelLoader): + """Class to load Anima ControlNet-LLLite adapter models from safetensors checkpoints. + + LLLite adapters are standalone files holding a shared conditioning trunk + (lllite_conditioning1) plus tiny per-Linear modules (lllite_dit_blocks_*). + Hyperparameters are stored in the safetensors metadata (`lllite.*` keys) with + state-dict-shape fallbacks. + """ + + def _load_model( + self, + config: AnyModelConfig, + submodel_type: Optional[SubModelType] = None, + ) -> AnyModel: + from safetensors import safe_open + from safetensors.torch import load_file + + from invokeai.backend.anima.control_net_lllite import AnimaControlNetLLLite + + if not isinstance(config, ControlNet_Checkpoint_Anima_Config): + raise ValueError("Only ControlNet_Checkpoint_Anima_Config models are supported here.") + + # ControlNet type models don't use submodel_type - load the adapter directly + model_path = Path(config.path) + + sd = load_file(model_path) + with safe_open(model_path, framework="pt", device="cpu") as f: + metadata = f.metadata() + + model = AnimaControlNetLLLite.from_state_dict(sd, metadata) + + target_device = TorchDevice.choose_torch_device() + model_dtype = TorchDevice.choose_anima_inference_dtype(target_device) + model.to(dtype=model_dtype) + + return model diff --git a/invokeai/backend/model_manager/starter_models.py b/invokeai/backend/model_manager/starter_models.py index 9bc58e44269..124cef35abb 100644 --- a/invokeai/backend/model_manager/starter_models.py +++ b/invokeai/backend/model_manager/starter_models.py @@ -1572,6 +1572,15 @@ def _gemini_3_resolution_presets( format=ModelFormat.Checkpoint, dependencies=[anima_qwen3_encoder, anima_vae], ) + +anima_lllite_inpainting = StarterModel( + name="Anima LLLite Inpainting", + base=BaseModelType.Anima, + source="https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-inpainting-v2.safetensors", + description="ControlNet-LLLite inpainting adapter for Anima by kohya-ss. Conditions the model on the masked image content during inpainting/outpainting. ~66MB", + type=ModelType.ControlNet, + format=ModelFormat.Checkpoint, +) # endregion # List of starter models, displayed on the frontend. @@ -1710,6 +1719,7 @@ def _gemini_3_resolution_presets( anima_base, anima_qwen3_encoder, anima_vae, + anima_lllite_inpainting, ] sd1_bundle: list[StarterModel] = [ @@ -1797,6 +1807,7 @@ def _gemini_3_resolution_presets( anima_base, anima_qwen3_encoder, anima_vae, + anima_lllite_inpainting, ] STARTER_BUNDLES: dict[str, StarterModelBundle] = { diff --git a/tests/backend/model_manager/configs/test_anima_controlnet_config.py b/tests/backend/model_manager/configs/test_anima_controlnet_config.py new file mode 100644 index 00000000000..6b7f1d215b5 --- /dev/null +++ b/tests/backend/model_manager/configs/test_anima_controlnet_config.py @@ -0,0 +1,133 @@ +"""Tests for Anima ControlNet-LLLite config probing. + +Anima LLLite adapters (v2 named-key format) are identified by the presence of both the shared +conditioning trunk (`lllite_conditioning1.*`) and per-module weights (`lllite_dit_blocks_*`). +SDXL ControlNet-LLLite models (`lllite_unet_*`) and Z-Image Control adapters +(`control_layers.*` etc.) must not match. +""" + +import os +from pathlib import Path +from unittest.mock import MagicMock + +import pytest + +from invokeai.backend.model_manager.configs.controlnet import ( + ControlNet_Checkpoint_Anima_Config, + _has_anima_lllite_keys, +) +from invokeai.backend.model_manager.configs.identification_utils import NotAMatchError +from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelFormat, ModelType + +# Opt-in test against the real adapter weights (anima-lllite-inpainting-v2.safetensors). +_REAL_WEIGHTS_ENV_VAR = "ANIMA_LLLITE_WEIGHTS_PATH" +REAL_WEIGHTS_PATH = Path(os.environ[_REAL_WEIGHTS_ENV_VAR]) if _REAL_WEIGHTS_ENV_VAR in os.environ else None + +_OVERRIDE_FIELDS: dict[str, object] = { + "hash": "blake3:fakehash", + "path": "/fake/models/anima-lllite.safetensors", + "file_size": 1000, + "name": "anima-lllite", + "description": "test", + "source": "test", + "source_type": "path", + "key": "test-key", +} + +ANIMA_LLLITE_KEYS = [ + "lllite_conditioning1.conv1.weight", + "lllite_conditioning1.conv1.bias", + "lllite_conditioning1.proj.weight", + "lllite_conditioning1.out_norm.weight", + "lllite_dit_blocks_0_self_attn_q_proj.down.weight", + "lllite_dit_blocks_0_self_attn_q_proj.depth_embed", + "lllite_dit_blocks_27_mlp_layer1.up.weight", +] + +SDXL_LLLITE_KEYS = [ + "lllite_unet_input_blocks_4_1_transformer_blocks_0_attn1_to_q.cond_emb.weight", + "lllite_unet_input_blocks_4_1_transformer_blocks_0_attn1_to_q.down.0.weight", + "lllite_unet_middle_block_1_transformer_blocks_0_attn1_to_q.up.0.weight", + "lllite_unet_output_blocks_0_1_transformer_blocks_0_attn1_to_q.mid.0.weight", +] + +Z_IMAGE_CONTROL_KEYS = [ + "control_layers.0.attention.qkv.weight", + "control_layers.1.attention.out.weight", + "control_all_x_embedder.2-1.weight", + "control_noise_refiner.0.attention.qkv.weight", +] + + +def _make_state_dict(keys: list[str]) -> dict[str, object]: + return dict.fromkeys(keys) + + +def _make_mod(state_dict: dict[str, object]) -> MagicMock: + mod = MagicMock() + mod.load_state_dict.return_value = state_dict + return mod + + +class TestHasAnimaLLLiteKeys: + """Tests for the _has_anima_lllite_keys heuristic used during model identification.""" + + def test_anima_lllite_keys(self): + assert _has_anima_lllite_keys(_make_state_dict(ANIMA_LLLITE_KEYS)) is True + + def test_trunk_only_does_not_match(self): + sd = _make_state_dict([k for k in ANIMA_LLLITE_KEYS if k.startswith("lllite_conditioning1.")]) + assert _has_anima_lllite_keys(sd) is False + + def test_modules_only_does_not_match(self): + sd = _make_state_dict([k for k in ANIMA_LLLITE_KEYS if k.startswith("lllite_dit_blocks_")]) + assert _has_anima_lllite_keys(sd) is False + + def test_sdxl_lllite_does_not_match(self): + assert _has_anima_lllite_keys(_make_state_dict(SDXL_LLLITE_KEYS)) is False + + def test_z_image_control_does_not_match(self): + assert _has_anima_lllite_keys(_make_state_dict(Z_IMAGE_CONTROL_KEYS)) is False + + def test_empty_state_dict(self): + assert _has_anima_lllite_keys({}) is False + + +class TestAnimaControlNetConfigProbe: + """Tests for ControlNet_Checkpoint_Anima_Config.from_model_on_disk.""" + + def test_matches_anima_lllite(self): + mod = _make_mod(_make_state_dict(ANIMA_LLLITE_KEYS)) + + config = ControlNet_Checkpoint_Anima_Config.from_model_on_disk(mod, dict(_OVERRIDE_FIELDS)) + + assert config.base is BaseModelType.Anima + assert config.type is ModelType.ControlNet + assert config.format is ModelFormat.Checkpoint + + @pytest.mark.parametrize( + "keys", + [SDXL_LLLITE_KEYS, Z_IMAGE_CONTROL_KEYS, []], + ids=["sdxl_lllite", "z_image_control", "empty"], + ) + def test_rejects_non_anima_lllite(self, keys: list[str]): + mod = _make_mod(_make_state_dict(keys)) + + with pytest.raises(NotAMatchError, match="does not look like an Anima ControlNet-LLLite"): + ControlNet_Checkpoint_Anima_Config.from_model_on_disk(mod, dict(_OVERRIDE_FIELDS)) + + +@pytest.mark.skipif( + REAL_WEIGHTS_PATH is None or not REAL_WEIGHTS_PATH.is_file(), + reason=f"set {_REAL_WEIGHTS_ENV_VAR} to the real LLLite weights file to run", +) +def test_real_file_classifies_as_anima_controlnet(): + """The real adapter file must classify uniquely as an Anima ControlNet via the full factory.""" + from invokeai.backend.model_manager.configs.factory import ModelConfigFactory + + assert REAL_WEIGHTS_PATH is not None + result = ModelConfigFactory.from_model_on_disk(REAL_WEIGHTS_PATH, allow_unknown=False) + + assert result.config is not None + assert isinstance(result.config, ControlNet_Checkpoint_Anima_Config) + assert result.match_count == 1 From df0ee504774d53deca75dc29f7aca854a0f45c02 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 9 Jun 2026 20:50:49 -0400 Subject: [PATCH 03/10] feat(nodes): add Anima ControlNet-LLLite invocation and denoise wiring New anima_lllite invocation (image + optional mask + model + weight + step range) and an optional control_lllite input on anima_denoise (v1.7.0). The conditioning image is built once per generation from the actual latent dims, the adapter binds after LoRA patching, the multiplier is step-range gated in both the Euler and scheduler-driver paths, and restore/clear always run on exit since the adapter instance is shared via the model cache. Co-Authored-By: Claude Fable 5 --- invokeai/app/invocations/anima_denoise.py | 258 +++++++++++++++------- invokeai/app/invocations/anima_lllite.py | 119 ++++++++++ 2 files changed, 300 insertions(+), 77 deletions(-) create mode 100644 invokeai/app/invocations/anima_lllite.py diff --git a/invokeai/app/invocations/anima_denoise.py b/invokeai/app/invocations/anima_denoise.py index 9fa4b3fb07a..4116603eb96 100644 --- a/invokeai/app/invocations/anima_denoise.py +++ b/invokeai/app/invocations/anima_denoise.py @@ -23,8 +23,10 @@ import torch import torchvision.transforms as tv_transforms from torchvision.transforms.functional import resize as tv_resize +from torchvision.transforms.functional import to_tensor from tqdm import tqdm +from invokeai.app.invocations.anima_lllite import AnimaLLLiteField from invokeai.app.invocations.baseinvocation import BaseInvocation, Classification, invocation from invokeai.app.invocations.fields import ( AnimaConditioningField, @@ -40,6 +42,12 @@ from invokeai.app.services.shared.invocation_context import InvocationContext from invokeai.backend.anima.anima_transformer_patch import patch_anima_for_regional_prompting from invokeai.backend.anima.conditioning_data import AnimaRegionalTextConditioning, AnimaTextConditioning +from invokeai.backend.anima.control_net_lllite import ( + AnimaControlNetLLLite, + build_inpaint_cond_image, + prepare_cond_image, + prepare_mask, +) from invokeai.backend.anima.regional_prompting import AnimaRegionalPromptingExtension from invokeai.backend.anima.scheduler_driver import AnimaSchedulerDriver from invokeai.backend.flux.schedulers import ( @@ -167,7 +175,7 @@ def merge_intermediate_latents_with_init_latents( title="Denoise - Anima", tags=["image", "anima"], category="image", - version="1.6.0", + version="1.7.0", classification=Classification.Prototype, ) class AnimaDenoiseInvocation(BaseInvocation): @@ -212,6 +220,12 @@ class AnimaDenoiseInvocation(BaseInvocation): height: int = InputField(default=1024, multiple_of=8, description="Height of the generated image.") steps: int = InputField(default=30, gt=0, description="Number of denoising steps. 30 recommended for Anima.") seed: int = InputField(default=0, description="Randomness seed for reproducibility.") + # ControlNet-LLLite support (e.g. model-level inpaint conditioning) + control_lllite: Optional[AnimaLLLiteField] = InputField( + default=None, + description="Anima ControlNet-LLLite conditioning (e.g. inpaint adapter).", + input=Input.Connection, + ) scheduler: ANIMA_SCHEDULER_NAME_VALUES = InputField( default="euler", description="Scheduler (sampler) for the denoising process.", @@ -249,6 +263,63 @@ def _prep_inpaint_mask(self, context: InvocationContext, latents: torch.Tensor) mask = mask.to(device=latents.device, dtype=latents.dtype) return mask + def _build_lllite_cond_image( + self, + context: InvocationContext, + lllite_model: AnimaControlNetLLLite, + latents: torch.Tensor, + patch_spatial: int = 2, + ) -> torch.Tensor: + """Build the LLLite conditioning image tensor (once per generation). + + The cond image is sized from the ACTUAL latent H/W (mirroring the DiT's + patch padding) — see target_cond_hw in the backend module. + """ + assert self.control_lllite is not None + latent_h, latent_w = latents.shape[-2], latents.shape[-1] + + image_pil = context.images.get_pil(self.control_lllite.image_name, "RGB") + rgb_01 = to_tensor(image_pil).unsqueeze(0) # (1, 3, H, W) in [0, 1] + rgb_pm1 = prepare_cond_image(rgb_01, latent_h, latent_w, patch_spatial) + + if lllite_model.cond_in_channels == 4: + if self.control_lllite.mask_name is None: + raise ValueError( + "This Anima ControlNet-LLLite adapter is an inpainting adapter (4-channel conditioning) and " + "requires a mask. Connect a mask (white = inpaint area) to the Anima ControlNet-LLLite node." + ) + mask_pil = context.images.get_pil(self.control_lllite.mask_name, "L") + mask_01 = to_tensor(mask_pil).unsqueeze(0) # (1, 1, H, W) in [0, 1] + mask_01 = prepare_mask(mask_01, latent_h, latent_w, patch_spatial) + return build_inpaint_cond_image(rgb_pm1, mask_01, lllite_model.inpaint_masked_input) + + if lllite_model.cond_in_channels != 3: + raise ValueError( + f"Unsupported Anima ControlNet-LLLite adapter: expected 3 or 4 conditioning channels, got " + f"{lllite_model.cond_in_channels}." + ) + if self.control_lllite.mask_name is not None: + context.logger.warning( + "The selected Anima ControlNet-LLLite adapter does not use a mask (3-channel conditioning); the " + "connected mask will be ignored." + ) + return rgb_pm1 + + def _get_lllite_multiplier(self, step_index: int, total_steps: int) -> float: + """Step-range gate for the LLLite adapter multiplier. + + Uses the same user-facing step-index/percent convention as + BaseControlNetExtension._get_weight. + """ + assert self.control_lllite is not None + first_step = math.floor(self.control_lllite.begin_step_percent * total_steps) + last_step = math.ceil(self.control_lllite.end_step_percent * total_steps) + + if step_index < first_step or step_index > last_step: + return 0.0 + + return self.control_lllite.weight + def _get_noise( self, height: int, @@ -530,6 +601,19 @@ def _run_diffusion(self, context: InvocationContext) -> torch.Tensor: with ExitStack() as exit_stack: (cached_weights, transformer) = exit_stack.enter_context(transformer_info.model_on_device()) + # Prepare the ControlNet-LLLite adapter if provided. The conditioning + # image is built ONCE per generation (not per step). + lllite_model: AnimaControlNetLLLite | None = None + lllite_cond: torch.Tensor | None = None + if self.control_lllite is not None: + lllite_info = context.models.load(self.control_lllite.control_model) + (_, lllite_adapter) = exit_stack.enter_context(lllite_info.model_on_device()) + assert isinstance(lllite_adapter, AnimaControlNetLLLite) + lllite_model = lllite_adapter + lllite_cond = self._build_lllite_cond_image( + context, lllite_model, latents, patch_spatial=int(getattr(transformer, "patch_spatial", 2)) + ) + # Apply LoRA models to the transformer. # Note: We apply the LoRA after the transformer has been moved to its target device for faster patching. exit_stack.enter_context( @@ -606,95 +690,115 @@ def _run_transformer(ctx: torch.Tensor, x: torch.Tensor, t: torch.Tensor) -> tor # t5xxl_ids=None skips the LLM Adapter — context is already pre-computed ) - if driver is not None: - user_step = 0 - pbar = tqdm(total=total_steps, desc="Denoising (Anima)") - for it in driver.iterations(): - timestep = torch.tensor( - [it.sigma_curr * ANIMA_MULTIPLIER], device=device, dtype=inference_dtype - ).expand(latents.shape[0]) - - noise_pred_cond = _run_transformer(pos_context, latents, timestep).float() - - if do_cfg and neg_context is not None: - noise_pred_uncond = _run_transformer(neg_context, latents, timestep).float() - noise_pred = noise_pred_uncond + self.guidance_scale * (noise_pred_cond - noise_pred_uncond) - else: - noise_pred = noise_pred_cond - - latents_preview = self._estimate_preview_latents( - latents=latents, - sigma=it.sigma_curr, - noise_pred=noise_pred, - ) + try: + if lllite_model is not None: + # Bind AFTER LoRA patching so the LLLite modules wrap the patched forwards. + lllite_model.apply_to(transformer) + lllite_model.set_cond_image(lllite_cond) + + if driver is not None: + user_step = 0 + pbar = tqdm(total=total_steps, desc="Denoising (Anima)") + for it in driver.iterations(): + # Gate on the user-facing step index so both halves of a + # multi-pass step (e.g. Heun pairs) share one gate value. + if lllite_model is not None: + lllite_model.set_multiplier(self._get_lllite_multiplier(user_step, total_steps)) + + timestep = torch.tensor( + [it.sigma_curr * ANIMA_MULTIPLIER], device=device, dtype=inference_dtype + ).expand(latents.shape[0]) + + noise_pred_cond = _run_transformer(pos_context, latents, timestep).float() + + if do_cfg and neg_context is not None: + noise_pred_uncond = _run_transformer(neg_context, latents, timestep).float() + noise_pred = noise_pred_uncond + self.guidance_scale * (noise_pred_cond - noise_pred_uncond) + else: + noise_pred = noise_pred_cond + + latents_preview = self._estimate_preview_latents( + latents=latents, + sigma=it.sigma_curr, + noise_pred=noise_pred, + ) - latents = driver.step(model_output=noise_pred, timestep=it.sched_timestep, sample=latents) + latents = driver.step(model_output=noise_pred, timestep=it.sched_timestep, sample=latents) + + if it.completes_user_step: + # RectifiedFlowInpaintExtension expects this once per user step (its + # docstring), so for Heun we skip the FO half of each pair to avoid + # corrupting the second-order corrector's input. + if inpaint_extension is not None: + latents_4d = latents.squeeze(2) + latents_4d = inpaint_extension.merge_intermediate_latents_with_init_latents( + latents_4d, it.sigma_prev + ) + latents = latents_4d.unsqueeze(2) + + user_step += 1 + pbar.update(1) + step_callback( + PipelineIntermediateState( + step=user_step, + order=it.order, + total_steps=total_steps, + timestep=int(it.sigma_curr * 1000), + latents=latents_preview.squeeze(2), + ) + ) + pbar.close() + else: + # Built-in Euler implementation (default for Anima) + for step_idx in tqdm(range(total_steps), desc="Denoising (Anima)"): + if lllite_model is not None: + lllite_model.set_multiplier(self._get_lllite_multiplier(step_idx, total_steps)) + + sigma_curr = sigmas[step_idx] + sigma_prev = sigmas[step_idx + 1] + + timestep = torch.tensor( + [sigma_curr * ANIMA_MULTIPLIER], device=device, dtype=inference_dtype + ).expand(latents.shape[0]) + + noise_pred_cond = _run_transformer(pos_context, latents, timestep).float() + + if do_cfg and neg_context is not None: + noise_pred_uncond = _run_transformer(neg_context, latents, timestep).float() + noise_pred = noise_pred_uncond + self.guidance_scale * (noise_pred_cond - noise_pred_uncond) + else: + noise_pred = noise_pred_cond + + latents_dtype = latents.dtype + latents = latents.to(dtype=torch.float32) + latents = latents + (sigma_prev - sigma_curr) * noise_pred + latents = latents.to(dtype=latents_dtype) + latents_preview = self._estimate_preview_latents( + latents=latents, sigma=sigma_prev, noise_pred=noise_pred + ) - if it.completes_user_step: - # RectifiedFlowInpaintExtension expects this once per user step (its - # docstring), so for Heun we skip the FO half of each pair to avoid - # corrupting the second-order corrector's input. if inpaint_extension is not None: latents_4d = latents.squeeze(2) latents_4d = inpaint_extension.merge_intermediate_latents_with_init_latents( - latents_4d, it.sigma_prev + latents_4d, sigma_prev ) latents = latents_4d.unsqueeze(2) - user_step += 1 - pbar.update(1) step_callback( PipelineIntermediateState( - step=user_step, - order=it.order, + step=step_idx + 1, + order=1, total_steps=total_steps, - timestep=int(it.sigma_curr * 1000), + timestep=int(sigma_curr * 1000), latents=latents_preview.squeeze(2), - ) + ), ) - pbar.close() - else: - # Built-in Euler implementation (default for Anima) - for step_idx in tqdm(range(total_steps), desc="Denoising (Anima)"): - sigma_curr = sigmas[step_idx] - sigma_prev = sigmas[step_idx + 1] - - timestep = torch.tensor( - [sigma_curr * ANIMA_MULTIPLIER], device=device, dtype=inference_dtype - ).expand(latents.shape[0]) - - noise_pred_cond = _run_transformer(pos_context, latents, timestep).float() - - if do_cfg and neg_context is not None: - noise_pred_uncond = _run_transformer(neg_context, latents, timestep).float() - noise_pred = noise_pred_uncond + self.guidance_scale * (noise_pred_cond - noise_pred_uncond) - else: - noise_pred = noise_pred_cond - - latents_dtype = latents.dtype - latents = latents.to(dtype=torch.float32) - latents = latents + (sigma_prev - sigma_curr) * noise_pred - latents = latents.to(dtype=latents_dtype) - latents_preview = self._estimate_preview_latents( - latents=latents, sigma=sigma_prev, noise_pred=noise_pred - ) - - if inpaint_extension is not None: - latents_4d = latents.squeeze(2) - latents_4d = inpaint_extension.merge_intermediate_latents_with_init_latents( - latents_4d, sigma_prev - ) - latents = latents_4d.unsqueeze(2) - - step_callback( - PipelineIntermediateState( - step=step_idx + 1, - order=1, - total_steps=total_steps, - timestep=int(sigma_curr * 1000), - latents=latents_preview.squeeze(2), - ), - ) + finally: + # The adapter model is shared via the model cache — always undo the + # forward swaps and drop the per-run cond state. + if lllite_model is not None: + lllite_model.restore() + lllite_model.clear_cond_image() # Remove temporal dimension for output: [B, C, 1, H, W] -> [B, C, H, W] return latents.squeeze(2) diff --git a/invokeai/app/invocations/anima_lllite.py b/invokeai/app/invocations/anima_lllite.py new file mode 100644 index 00000000000..55028947c47 --- /dev/null +++ b/invokeai/app/invocations/anima_lllite.py @@ -0,0 +1,119 @@ +"""Anima ControlNet-LLLite invocation for model-level inpaint conditioning.""" + +from typing import Optional + +from pydantic import BaseModel, Field + +from invokeai.app.invocations.baseinvocation import ( + BaseInvocation, + BaseInvocationOutput, + Classification, + invocation, + invocation_output, +) +from invokeai.app.invocations.fields import ( + FieldDescriptions, + ImageField, + InputField, + OutputField, +) +from invokeai.app.invocations.model import ModelIdentifierField +from invokeai.app.services.shared.invocation_context import InvocationContext +from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType + + +class AnimaLLLiteField(BaseModel): + """An Anima ControlNet-LLLite conditioning field (e.g. inpaint adapter).""" + + image_name: str = Field(description="The name of the conditioning image (the initial/raster image)") + mask_name: str | None = Field( + default=None, + description="The name of the inpaint mask image (white = inpaint area)", + ) + control_model: ModelIdentifierField = Field(description="The Anima ControlNet-LLLite adapter model") + weight: float = Field( + default=1.0, + ge=-10.0, + le=10.0, + description="The strength of the LLLite adapter", + ) + begin_step_percent: float = Field( + default=0.0, + ge=0.0, + le=1.0, + description="When the adapter is first applied (% of total steps)", + ) + end_step_percent: float = Field( + default=1.0, + ge=0.0, + le=1.0, + description="When the adapter is last applied (% of total steps)", + ) + + +@invocation_output("anima_lllite_output") +class AnimaLLLiteOutput(BaseInvocationOutput): + """Anima ControlNet-LLLite output containing adapter configuration.""" + + control: AnimaLLLiteField = OutputField(description="Anima ControlNet-LLLite conditioning") + + +@invocation( + "anima_lllite", + title="Anima ControlNet-LLLite", + tags=["image", "anima", "control", "controlnet", "inpaint"], + category="conditioning", + version="1.0.0", + classification=Classification.Prototype, +) +class AnimaLLLiteInvocation(BaseInvocation): + """Configure an Anima ControlNet-LLLite adapter for model-level conditioning. + + Takes a conditioning image (the initial/raster image), an optional inpaint + mask (white = area to inpaint), and a LLLite adapter model. Inpainting + adapters (4-channel conditioning) require a mask; other adapters ignore it. + """ + + image: ImageField = InputField( + description="The conditioning image (the initial/raster image for inpainting)", + ) + mask: Optional[ImageField] = InputField( + default=None, + description="The inpaint mask (white = area to inpaint). Required by inpainting adapters.", + ) + control_model: ModelIdentifierField = InputField( + description=FieldDescriptions.controlnet_model, + title="Control Model", + ui_model_base=BaseModelType.Anima, + ui_model_type=ModelType.ControlNet, + ) + weight: float = InputField( + default=1.0, + ge=-10.0, + le=10.0, + description="Strength of the LLLite adapter.", + ) + begin_step_percent: float = InputField( + default=0.0, + ge=0.0, + le=1.0, + description="When the adapter is first applied (% of total steps)", + ) + end_step_percent: float = InputField( + default=1.0, + ge=0.0, + le=1.0, + description="When the adapter is last applied (% of total steps)", + ) + + def invoke(self, context: InvocationContext) -> AnimaLLLiteOutput: + return AnimaLLLiteOutput( + control=AnimaLLLiteField( + image_name=self.image.image_name, + mask_name=self.mask.image_name if self.mask is not None else None, + control_model=self.control_model, + weight=self.weight, + begin_step_percent=self.begin_step_percent, + end_step_percent=self.end_step_percent, + ) + ) From 24528a97ee9ed154633ad0ffcf380ca29c9dcad3 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 9 Jun 2026 20:50:49 -0400 Subject: [PATCH 04/10] feat(ui): Anima inpaint adapter selection and canvas graph wiring Adds an Inpaint Adapter model picker + weight control to the Anima advanced settings, and wires anima_lllite into the canvas inpaint and outpaint graphs (all scaled/unscaled branches). The canvas denoise-limit mask is white = keep, while LLLite expects white = inpaint, so the mask is inverted via img_lerp before it reaches the adapter. Co-Authored-By: Claude Fable 5 --- invokeai/frontend/web/public/locales/en.json | 4 + .../controlLayers/store/paramsSlice.ts | 21 +- .../src/features/controlLayers/store/types.ts | 4 + .../nodes/util/graph/generation/addInpaint.ts | 42 +++ .../util/graph/generation/addOutpaint.ts | 42 +++ .../Advanced/ParamAnimaModelSelect.tsx | 136 +++++++++- .../src/services/api/hooks/modelsByType.ts | 2 + .../frontend/web/src/services/api/schema.ts | 248 ++++++++++++++++-- .../frontend/web/src/services/api/types.ts | 4 + 9 files changed, 479 insertions(+), 24 deletions(-) diff --git a/invokeai/frontend/web/public/locales/en.json b/invokeai/frontend/web/public/locales/en.json index 75367a502db..e14eb84f299 100644 --- a/invokeai/frontend/web/public/locales/en.json +++ b/invokeai/frontend/web/public/locales/en.json @@ -1359,6 +1359,10 @@ "animaVaePlaceholder": "Select Anima-compatible VAE", "animaQwen3Encoder": "Qwen3 0.6B Encoder", "animaQwen3EncoderPlaceholder": "Select Qwen3 0.6B encoder", + "animaInpaintAdapter": "Inpaint Adapter", + "animaInpaintAdapterPlaceholder": "Select inpaint adapter (optional)", + "animaInpaintAdapterHelper": "Only used when inpainting or outpainting on Canvas.", + "animaInpaintAdapterWeight": "Adapter Weight", "zImageVae": "VAE (optional)", "zImageVaePlaceholder": "From VAE source model", "zImageQwen3Encoder": "Qwen3 Encoder (optional)", diff --git a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts index c4c90cf98e7..b7b1a6ef1c0 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts @@ -27,7 +27,7 @@ import { SUPPORTS_OPTIMIZED_DENOISING_BASE_MODELS, SUPPORTS_REF_IMAGES_BASE_MODELS, } from 'features/modelManagerV2/models'; -import type { BaseModelType } from 'features/nodes/types/common'; +import type { BaseModelType, ModelIdentifierField } from 'features/nodes/types/common'; import { CLIP_SKIP_MAP } from 'features/parameters/types/constants'; import type { ParameterCanvasCoherenceMode, @@ -237,6 +237,20 @@ const slice = createSlice({ } state.animaQwen3EncoderModel = result.data; }, + animaLLLiteModelSelected: (state, action: PayloadAction) => { + const result = zParamsState.shape.animaLLLiteModel.safeParse(action.payload); + if (!result.success) { + return; + } + state.animaLLLiteModel = result.data; + }, + animaLLLiteWeightChanged: (state, action: PayloadAction) => { + const result = zParamsState.shape.animaLLLiteWeight.safeParse(action.payload); + if (!result.success) { + return; + } + state.animaLLLiteWeight = result.data; + }, setAnimaScheduler: ( state, action: PayloadAction<'euler' | 'heun' | 'dpmpp_2m' | 'dpmpp_2m_sde' | 'er_sde' | 'lcm'> @@ -614,6 +628,7 @@ const resetState = (state: ParamsState): ParamsState => { newState.zImageQwen3SourceModel = oldState.zImageQwen3SourceModel; newState.animaVaeModel = oldState.animaVaeModel; newState.animaQwen3EncoderModel = oldState.animaQwen3EncoderModel; + newState.animaLLLiteModel = oldState.animaLLLiteModel; newState.kleinVaeModel = oldState.kleinVaeModel; newState.kleinQwen3EncoderModel = oldState.kleinQwen3EncoderModel; newState.qwenImageComponentSource = oldState.qwenImageComponentSource; @@ -713,6 +728,8 @@ export const { paramsRecalled, animaVaeModelSelected, animaQwen3EncoderModelSelected, + animaLLLiteModelSelected, + animaLLLiteWeightChanged, setAnimaScheduler, } = slice.actions; @@ -785,6 +802,8 @@ export const selectZImageQwen3SourceModel = createParamsSelector((params) => par export const selectAnimaVaeModel = createParamsSelector((params) => params.animaVaeModel); export const selectAnimaQwen3EncoderModel = createParamsSelector((params) => params.animaQwen3EncoderModel); export const selectAnimaScheduler = createParamsSelector((params) => params.animaScheduler); +export const selectAnimaLLLiteModel = createParamsSelector((params) => params.animaLLLiteModel); +export const selectAnimaLLLiteWeight = createParamsSelector((params) => params.animaLLLiteWeight); export const selectKleinVaeModel = createParamsSelector((params) => params.kleinVaeModel); export const selectKleinQwen3EncoderModel = createParamsSelector((params) => params.kleinQwen3EncoderModel); export const selectQwenImageComponentSource = createParamsSelector((params) => params.qwenImageComponentSource); diff --git a/invokeai/frontend/web/src/features/controlLayers/store/types.ts b/invokeai/frontend/web/src/features/controlLayers/store/types.ts index 09ce177ab0f..920c123dc60 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/types.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/types.ts @@ -841,6 +841,8 @@ export const zParamsState = z.object({ animaVaeModel: zParameterVAEModel.nullable(), // Optional: Separate QwenImage/FLUX VAE for Anima animaQwen3EncoderModel: zModelIdentifierField.nullable(), // Optional: Separate Qwen3 0.6B Encoder for Anima animaScheduler: zParameterAnimaScheduler, + animaLLLiteModel: zModelIdentifierField.nullable().default(null), // Optional: ControlNet-LLLite inpaint adapter for Anima + animaLLLiteWeight: z.number().min(-10).max(10).default(1), // Flux2 Klein model components - uses Qwen3 instead of CLIP+T5 kleinVaeModel: zParameterVAEModel.nullable(), // Optional: Separate FLUX.2 VAE for Klein kleinQwen3EncoderModel: zModelIdentifierField.nullable(), // Optional: Separate Qwen3 Encoder for Klein @@ -927,6 +929,8 @@ export const getInitialParamsState = (): ParamsState => ({ animaVaeModel: null, animaQwen3EncoderModel: null, animaScheduler: 'euler', + animaLLLiteModel: null, + animaLLLiteWeight: 1, kleinVaeModel: null, kleinQwen3EncoderModel: null, qwenImageComponentSource: null, diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addInpaint.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addInpaint.ts index fa01db67e60..1d7b2da5731 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addInpaint.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addInpaint.ts @@ -197,6 +197,27 @@ export const addInpaint = async ({ g.addEdge(createGradientMask, 'denoise_mask', denoise, 'denoise_mask'); + if (denoise.type === 'anima_denoise' && params.animaLLLiteModel) { + // The canvas denoise-limit composite is white = keep / black = inpaint, but the LLLite + // adapter expects white = inpaint — invert before wiring. + const invertAnimaLLLiteMask = g.addNode({ + type: 'img_lerp', + id: getPrefixedId('invert_anima_lllite_mask'), + min: 255, + max: 0, + }); + g.addEdge(resizeMaskToScaledSize, 'image', invertAnimaLLLiteMask, 'image'); + const animaLLLite = g.addNode({ + type: 'anima_lllite', + id: getPrefixedId('anima_lllite'), + control_model: params.animaLLLiteModel, + weight: params.animaLLLiteWeight, + }); + g.addEdge(resizeImageToScaledSize, 'image', animaLLLite, 'image'); + g.addEdge(invertAnimaLLLiteMask, 'image', animaLLLite, 'mask'); + g.addEdge(animaLLLite, 'control', denoise, 'control_lllite'); + } + // After denoising, resize the image and mask back to original size g.addEdge(l2i, 'image', resizeImageToOriginalSize, 'image'); g.addEdge(createGradientMask, 'expanded_mask_area', expandMask, 'mask'); @@ -269,6 +290,27 @@ export const addInpaint = async ({ } g.addEdge(createGradientMask, 'denoise_mask', denoise, 'denoise_mask'); + if (denoise.type === 'anima_denoise' && params.animaLLLiteModel) { + // The canvas denoise-limit composite is white = keep / black = inpaint, but the LLLite + // adapter expects white = inpaint — invert before wiring. + const invertAnimaLLLiteMask = g.addNode({ + type: 'img_lerp', + id: getPrefixedId('invert_anima_lllite_mask'), + image: { image_name: maskImage.image_name }, + min: 255, + max: 0, + }); + const animaLLLite = g.addNode({ + type: 'anima_lllite', + id: getPrefixedId('anima_lllite'), + image: { image_name: initialImage.image_name }, + control_model: params.animaLLLiteModel, + weight: params.animaLLLiteWeight, + }); + g.addEdge(invertAnimaLLLiteMask, 'image', animaLLLite, 'mask'); + g.addEdge(animaLLLite, 'control', denoise, 'control_lllite'); + } + const expandMask = g.addNode({ type: 'expand_mask_with_fade', id: getPrefixedId('expand_mask_with_fade'), diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addOutpaint.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addOutpaint.ts index 0c57087eaad..c7ab8be2b7e 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addOutpaint.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addOutpaint.ts @@ -164,6 +164,27 @@ export const addOutpaint = async ({ g.addEdge(createGradientMask, 'denoise_mask', denoise, 'denoise_mask'); + if (denoise.type === 'anima_denoise' && params.animaLLLiteModel) { + // The combined canvas mask is white = keep / black = region-to-generate, but the LLLite + // adapter expects white = inpaint — invert before wiring. + const invertAnimaLLLiteMask = g.addNode({ + type: 'img_lerp', + id: getPrefixedId('invert_anima_lllite_mask'), + min: 255, + max: 0, + }); + g.addEdge(resizeInputMaskToScaledSize, 'image', invertAnimaLLLiteMask, 'image'); + const animaLLLite = g.addNode({ + type: 'anima_lllite', + id: getPrefixedId('anima_lllite'), + control_model: params.animaLLLiteModel, + weight: params.animaLLLiteWeight, + }); + g.addEdge(infill, 'image', animaLLLite, 'image'); + g.addEdge(invertAnimaLLLiteMask, 'image', animaLLLite, 'mask'); + g.addEdge(animaLLLite, 'control', denoise, 'control_lllite'); + } + // If we have a noise mask, apply it to the input image before i2l conversion if (noiseMaskImage) { // Resize the noise mask to match the scaled size @@ -291,6 +312,27 @@ export const addOutpaint = async ({ g.addEdge(createGradientMask, 'denoise_mask', denoise, 'denoise_mask'); + if (denoise.type === 'anima_denoise' && params.animaLLLiteModel) { + // The combined canvas mask is white = keep / black = region-to-generate, but the LLLite + // adapter expects white = inpaint — invert before wiring. + const invertAnimaLLLiteMask = g.addNode({ + type: 'img_lerp', + id: getPrefixedId('invert_anima_lllite_mask'), + min: 255, + max: 0, + }); + g.addEdge(maskCombine, 'image', invertAnimaLLLiteMask, 'image'); + const animaLLLite = g.addNode({ + type: 'anima_lllite', + id: getPrefixedId('anima_lllite'), + control_model: params.animaLLLiteModel, + weight: params.animaLLLiteWeight, + }); + g.addEdge(infill, 'image', animaLLLite, 'image'); + g.addEdge(invertAnimaLLLiteMask, 'image', animaLLLite, 'mask'); + g.addEdge(animaLLLite, 'control', denoise, 'control_lllite'); + } + const expandMask = g.addNode({ type: 'expand_mask_with_fade', id: getPrefixedId('expand_mask_with_fade'), diff --git a/invokeai/frontend/web/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx b/invokeai/frontend/web/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx index 6df9d008d6c..99fed8c019d 100644 --- a/invokeai/frontend/web/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx +++ b/invokeai/frontend/web/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx @@ -1,17 +1,34 @@ -import { Combobox, FormControl, FormLabel } from '@invoke-ai/ui-library'; +import { + Box, + Combobox, + CompositeNumberInput, + CompositeSlider, + Flex, + FormControl, + FormHelperText, + FormLabel, +} from '@invoke-ai/ui-library'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useModelCombobox } from 'common/hooks/useModelCombobox'; import { + animaLLLiteModelSelected, + animaLLLiteWeightChanged, animaQwen3EncoderModelSelected, animaVaeModelSelected, + selectAnimaLLLiteModel, + selectAnimaLLLiteWeight, selectAnimaQwen3EncoderModel, selectAnimaVaeModel, } from 'features/controlLayers/store/paramsSlice'; import { zModelIdentifierField } from 'features/nodes/types/common'; import { memo, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; -import { useAnimaQwen3EncoderModels, useAnimaVAEModels } from 'services/api/hooks/modelsByType'; -import type { Qwen3EncoderModelConfig, VAEModelConfig } from 'services/api/types'; +import { + useAnimaControlNetModels, + useAnimaQwen3EncoderModels, + useAnimaVAEModels, +} from 'services/api/hooks/modelsByType'; +import type { ControlNetModelConfig, Qwen3EncoderModelConfig, VAEModelConfig } from 'services/api/types'; /** * Anima VAE Model Select - uses Anima-base VAE models (QwenImage/Wan 2.1 VAE) @@ -102,13 +119,124 @@ const ParamAnimaQwen3EncoderModelSelect = memo(() => { ParamAnimaQwen3EncoderModelSelect.displayName = 'ParamAnimaQwen3EncoderModelSelect'; /** - * Combined component for Anima model selection (VAE + Qwen3 Encoder) + * Anima ControlNet-LLLite Inpaint Adapter Model Select (optional) + */ +const ParamAnimaLLLiteModelSelect = memo(() => { + const dispatch = useAppDispatch(); + const { t } = useTranslation(); + const animaLLLiteModel = useAppSelector(selectAnimaLLLiteModel); + const [modelConfigs, { isLoading }] = useAnimaControlNetModels(); + + const _onChange = useCallback( + (model: ControlNetModelConfig | null) => { + if (model) { + dispatch(animaLLLiteModelSelected(zModelIdentifierField.parse(model))); + } else { + dispatch(animaLLLiteModelSelected(null)); + } + }, + [dispatch] + ); + + const { options, value, onChange, noOptionsMessage } = useModelCombobox({ + modelConfigs, + onChange: _onChange, + selectedModel: animaLLLiteModel, + isLoading, + }); + + return ( + + + {t('modelManager.animaInpaintAdapter')} + + + + + {t('modelManager.animaInpaintAdapterHelper')} + + ); +}); + +ParamAnimaLLLiteModelSelect.displayName = 'ParamAnimaLLLiteModelSelect'; + +const WEIGHT_CONSTRAINTS = { + initial: 1, + sliderMin: 0, + sliderMax: 2, + numberInputMin: -10, + numberInputMax: 10, + fineStep: 0.01, + coarseStep: 0.05, +}; + +const weightMarks = [0, 1, 2]; +const formatWeight = (v: number) => v.toFixed(2); + +/** + * Anima ControlNet-LLLite Inpaint Adapter Weight + */ +const ParamAnimaLLLiteWeight = memo(() => { + const dispatch = useAppDispatch(); + const { t } = useTranslation(); + const animaLLLiteWeight = useAppSelector(selectAnimaLLLiteWeight); + + const onChange = useCallback( + (v: number) => { + dispatch(animaLLLiteWeightChanged(v)); + }, + [dispatch] + ); + + return ( + + {t('modelManager.animaInpaintAdapterWeight')} + + + + ); +}); + +ParamAnimaLLLiteWeight.displayName = 'ParamAnimaLLLiteWeight'; + +/** + * Combined component for Anima model selection (VAE + Qwen3 Encoder + optional Inpaint Adapter) */ const ParamAnimaModelSelect = () => { + const animaLLLiteModel = useAppSelector(selectAnimaLLLiteModel); + return ( <> + + {animaLLLiteModel !== null && } ); }; diff --git a/invokeai/frontend/web/src/services/api/hooks/modelsByType.ts b/invokeai/frontend/web/src/services/api/hooks/modelsByType.ts index ca886789cea..e495b998652 100644 --- a/invokeai/frontend/web/src/services/api/hooks/modelsByType.ts +++ b/invokeai/frontend/web/src/services/api/hooks/modelsByType.ts @@ -11,6 +11,7 @@ import { } from 'services/api/endpoints/models'; import type { AnyModelConfig, AnyModelConfigWithExternal, MainOrExternalModelConfig } from 'services/api/types'; import { + isAnimaControlNetModelConfig, isAnimaQwen3EncoderModelConfig, isAnimaVAEModelConfig, isCLIPEmbedModelConfigOrSubmodel, @@ -105,6 +106,7 @@ export const useFlux1VAEModels = () => buildModelsHook(isFlux1VAEModelConfig)(); export const useFlux2VAEModels = () => buildModelsHook(isFlux2VAEModelConfig)(); export const useAnimaVAEModels = () => buildModelsHook(isAnimaVAEModelConfig)(); export const useAnimaQwen3EncoderModels = () => buildModelsHook(isAnimaQwen3EncoderModelConfig)(); +export const useAnimaControlNetModels = () => buildModelsHook(isAnimaControlNetModelConfig)(); export const useZImageDiffusersModels = () => buildModelsHook(isZImageDiffusersMainModelConfig)(); export const useFlux2DiffusersModels = () => buildModelsHook(isFlux2DiffusersMainModelConfig)(); export const useQwenImageDiffusersModels = () => buildModelsHook(isQwenImageDiffusersMainModelConfig)(); diff --git a/invokeai/frontend/web/src/services/api/schema.ts b/invokeai/frontend/web/src/services/api/schema.ts index 0930b8f7dd4..7d9c8c23966 100644 --- a/invokeai/frontend/web/src/services/api/schema.ts +++ b/invokeai/frontend/web/src/services/api/schema.ts @@ -3181,6 +3181,11 @@ export type components = { * @default 0 */ seed?: number; + /** + * @description Anima ControlNet-LLLite conditioning (e.g. inpaint adapter). + * @default null + */ + control_lllite?: components["schemas"]["AnimaLLLiteField"] | null; /** * Scheduler * @description Scheduler (sampler) for the denoising process. @@ -3244,6 +3249,124 @@ export type components = { */ type: "anima_i2l"; }; + /** + * AnimaLLLiteField + * @description An Anima ControlNet-LLLite conditioning field (e.g. inpaint adapter). + */ + AnimaLLLiteField: { + /** + * Image Name + * @description The name of the conditioning image (the initial/raster image) + */ + image_name: string; + /** + * Mask Name + * @description The name of the inpaint mask image (white = inpaint area) + * @default null + */ + mask_name?: string | null; + /** @description The Anima ControlNet-LLLite adapter model */ + control_model: components["schemas"]["ModelIdentifierField"]; + /** + * Weight + * @description The strength of the LLLite adapter + * @default 1 + */ + weight?: number; + /** + * Begin Step Percent + * @description When the adapter is first applied (% of total steps) + * @default 0 + */ + begin_step_percent?: number; + /** + * End Step Percent + * @description When the adapter is last applied (% of total steps) + * @default 1 + */ + end_step_percent?: number; + }; + /** + * Anima ControlNet-LLLite + * @description Configure an Anima ControlNet-LLLite adapter for model-level conditioning. + * + * Takes a conditioning image (the initial/raster image), an optional inpaint + * mask (white = area to inpaint), and a LLLite adapter model. Inpainting + * adapters (4-channel conditioning) require a mask; other adapters ignore it. + */ + AnimaLLLiteInvocation: { + /** + * Id + * @description The id of this instance of an invocation. Must be unique among all instances of invocations. + */ + id: string; + /** + * Is Intermediate + * @description Whether or not this is an intermediate invocation. + * @default false + */ + is_intermediate?: boolean; + /** + * Use Cache + * @description Whether or not to use the cache + * @default true + */ + use_cache?: boolean; + /** + * @description The conditioning image (the initial/raster image for inpainting) + * @default null + */ + image?: components["schemas"]["ImageField"] | null; + /** + * @description The inpaint mask (white = area to inpaint). Required by inpainting adapters. + * @default null + */ + mask?: components["schemas"]["ImageField"] | null; + /** + * Control Model + * @description ControlNet model to load + * @default null + */ + control_model?: components["schemas"]["ModelIdentifierField"] | null; + /** + * Weight + * @description Strength of the LLLite adapter. + * @default 1 + */ + weight?: number; + /** + * Begin Step Percent + * @description When the adapter is first applied (% of total steps) + * @default 0 + */ + begin_step_percent?: number; + /** + * End Step Percent + * @description When the adapter is last applied (% of total steps) + * @default 1 + */ + end_step_percent?: number; + /** + * type + * @default anima_lllite + * @constant + */ + type: "anima_lllite"; + }; + /** + * AnimaLLLiteOutput + * @description Anima ControlNet-LLLite output containing adapter configuration. + */ + AnimaLLLiteOutput: { + /** @description Anima ControlNet-LLLite conditioning */ + control: components["schemas"]["AnimaLLLiteField"]; + /** + * type + * @default anima_lllite_output + * @constant + */ + type: "anima_lllite_output"; + }; /** * Latents to Image - Anima * @description Generates an image from latents using the Anima VAE. @@ -3549,7 +3672,7 @@ export type components = { */ type: "anima_text_encoder"; }; - 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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; /** * AppVersion * @description App Version Response @@ -6794,6 +6917,92 @@ export type components = { */ control_mode?: ("balanced" | "more_prompt" | "more_control") | null; }; + /** + * ControlNet_Checkpoint_Anima_Config + * @description Model config for Anima ControlNet-LLLite adapter models (Safetensors checkpoint). + * + * Anima LLLite adapters are standalone adapters consisting of a shared conditioning trunk + * (lllite_conditioning1) that encodes a conditioning image, plus tiny per-Linear modules + * (lllite_dit_blocks_*) that perturb the inputs of target Linears in the Anima DiT. + */ + ControlNet_Checkpoint_Anima_Config: { + /** + * Key + * @description A unique key for this model. + */ + key: string; + /** + * Hash + * @description The hash of the model file(s). + */ + hash: string; + /** + * Path + * @description Path to the model on the filesystem. Relative paths are relative to the Invoke root directory. + */ + path: string; + /** + * File Size + * @description The size of the model in bytes. + */ + file_size: number; + /** + * Name + * @description Name of the model. + */ + name: string; + /** + * Description + * @description Model description + */ + description: string | null; + /** + * Source + * @description The original source of the model (path, URL or repo_id). + */ + source: string; + /** @description The type of source */ + source_type: components["schemas"]["ModelSourceType"]; + /** + * Source Api Response + * @description The original API response from the source, as stringified JSON. + */ + source_api_response: string | null; + /** + * Source Url + * @description Optional URL for the model (e.g. download page or model page). + */ + source_url: string | null; + /** + * Cover Image + * @description Url for image to preview model + */ + cover_image: string | null; + /** + * Config Path + * @description Path to the config for this model, if any. + */ + config_path: string | null; + /** + * Type + * @default controlnet + * @constant + */ + type: "controlnet"; + /** + * Format + * @default checkpoint + * @constant + */ + format: "checkpoint"; + /** + * Base + * @default anima + * @constant + */ + base: "anima"; + default_settings: components["schemas"]["ControlAdapterDefaultSettings"] | null; + }; /** ControlNet_Checkpoint_FLUX_Config */ ControlNet_Checkpoint_FLUX_Config: { /** @@ -12264,7 +12473,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"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | 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"]["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"]["ExpandMaskWithFadeInvocation"] | 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"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | 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"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | 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"]["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"]["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"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | 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"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | 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"]["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"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | 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"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + [key: string]: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | 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"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | 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"]["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"]["ExpandMaskWithFadeInvocation"] | 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"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | 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"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | 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"]["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"]["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"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | 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"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | 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"]["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"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | 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"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; }; /** * Edges @@ -12301,7 +12510,7 @@ export type components = { * @description The results of node executions */ results: { - [key: string]: components["schemas"]["AnimaConditioningOutput"] | 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"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | 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"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | 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"]["LatentsCollectionOutput"] | components["schemas"]["LatentsMetaOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["LoRALoaderOutput"] | components["schemas"]["LoRASelectorOutput"] | 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"]["ModelIdentifierOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["PBRMapsOutput"] | components["schemas"]["PairTileImageOutput"] | components["schemas"]["PromptTemplateOutput"] | 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"]["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"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | 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"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | 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"]["LatentsCollectionOutput"] | components["schemas"]["LatentsMetaOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["LoRALoaderOutput"] | components["schemas"]["LoRASelectorOutput"] | 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"]["ModelIdentifierOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["PBRMapsOutput"] | components["schemas"]["PairTileImageOutput"] | components["schemas"]["PromptTemplateOutput"] | 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"]["ZImageConditioningOutput"] | components["schemas"]["ZImageControlOutput"] | components["schemas"]["ZImageLoRALoaderOutput"] | components["schemas"]["ZImageModelLoaderOutput"]; }; /** * Errors @@ -15662,7 +15871,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"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | 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"]["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"]["ExpandMaskWithFadeInvocation"] | 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"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | 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"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | 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"]["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"]["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"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | 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"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | 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"]["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"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | 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"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | 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"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | 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"]["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"]["ExpandMaskWithFadeInvocation"] | 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"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | 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"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | 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"]["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"]["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"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | 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"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | 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"]["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"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | 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"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -15672,7 +15881,7 @@ export type components = { * Result * @description The result of the invocation */ - result: components["schemas"]["AnimaConditioningOutput"] | 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"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | 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"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | 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"]["LatentsCollectionOutput"] | components["schemas"]["LatentsMetaOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["LoRALoaderOutput"] | components["schemas"]["LoRASelectorOutput"] | 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"]["ModelIdentifierOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["PBRMapsOutput"] | components["schemas"]["PairTileImageOutput"] | components["schemas"]["PromptTemplateOutput"] | 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"]["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"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | 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"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | 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"]["LatentsCollectionOutput"] | components["schemas"]["LatentsMetaOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["LoRALoaderOutput"] | components["schemas"]["LoRASelectorOutput"] | 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"]["ModelIdentifierOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["PBRMapsOutput"] | components["schemas"]["PairTileImageOutput"] | components["schemas"]["PromptTemplateOutput"] | 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"]["ZImageConditioningOutput"] | components["schemas"]["ZImageControlOutput"] | components["schemas"]["ZImageLoRALoaderOutput"] | components["schemas"]["ZImageModelLoaderOutput"]; }; /** * InvocationErrorEvent @@ -15726,7 +15935,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"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | 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"]["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"]["ExpandMaskWithFadeInvocation"] | 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"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | 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"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | 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"]["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"]["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"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | 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"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | 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"]["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"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | 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"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | 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"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | 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"]["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"]["ExpandMaskWithFadeInvocation"] | 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"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | 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"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | 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"]["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"]["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"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | 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"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | 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"]["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"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | 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"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -15755,6 +15964,7 @@ export type components = { anima_denoise: components["schemas"]["LatentsOutput"]; anima_i2l: components["schemas"]["LatentsOutput"]; anima_l2i: components["schemas"]["ImageOutput"]; + anima_lllite: components["schemas"]["AnimaLLLiteOutput"]; anima_lora_collection_loader: components["schemas"]["AnimaLoRALoaderOutput"]; anima_lora_loader: components["schemas"]["AnimaLoRALoaderOutput"]; anima_model_loader: components["schemas"]["AnimaModelLoaderOutput"]; @@ -16057,7 +16267,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"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | 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"]["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"]["ExpandMaskWithFadeInvocation"] | 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"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | 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"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | 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"]["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"]["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"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | 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"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | 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"]["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"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | 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"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | 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"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | 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"]["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"]["ExpandMaskWithFadeInvocation"] | 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"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | 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"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | 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"]["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"]["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"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | 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"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | 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"]["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"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | 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"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -16132,7 +16342,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"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | 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"]["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"]["ExpandMaskWithFadeInvocation"] | 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"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | 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"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | 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"]["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"]["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"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | 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"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | 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"]["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"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | 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"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | 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"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | 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"]["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"]["ExpandMaskWithFadeInvocation"] | 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"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | 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"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | 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"]["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"]["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"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | 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"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | 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"]["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"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | 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"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -23379,7 +23589,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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; /** * ModelInstallDownloadProgressEvent @@ -23545,7 +23755,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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_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 @@ -23631,7 +23841,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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_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 @@ -23652,7 +23862,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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_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 @@ -23849,7 +24059,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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"])[]; }; /** * Multiply Integers @@ -33479,7 +33689,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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; }; /** @description Validation Error */ @@ -33511,7 +33721,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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; }; /** @description Validation Error */ @@ -33561,7 +33771,7 @@ export interface operations { * "repo_variant": "fp16", * "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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; }; /** @description Bad request */ @@ -33666,7 +33876,7 @@ export interface operations { * "repo_variant": "fp16", * "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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; }; /** @description Bad request */ @@ -33737,7 +33947,7 @@ export interface operations { * "repo_variant": "fp16", * "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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; }; /** @description Bad request */ @@ -34470,7 +34680,7 @@ export interface operations { * "repo_variant": "fp16", * "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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_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_ZImage_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_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_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_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_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_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_QwenImage_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"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_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"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_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/web/src/services/api/types.ts b/invokeai/frontend/web/src/services/api/types.ts index 27c6fcbf3c3..54c622575ba 100644 --- a/invokeai/frontend/web/src/services/api/types.ts +++ b/invokeai/frontend/web/src/services/api/types.ts @@ -325,6 +325,10 @@ export const isControlNetModelConfig = (config: AnyModelConfig): config is Contr return config.type === 'controlnet'; }; +export const isAnimaControlNetModelConfig = (config: AnyModelConfig): config is ControlNetModelConfig => { + return config.type === 'controlnet' && config.base === 'anima'; +}; + export const isControlLayerModelConfig = ( config: AnyModelConfig ): config is ControlNetModelConfig | T2IAdapterModelConfig | ControlLoRAModelConfig => { From ef65b1c8e9230addec541b158c0aa57593c3813f Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 10 Jun 2026 00:52:56 -0400 Subject: [PATCH 05/10] feat(model_manager): tag Anima LLLite configs with conditioning channels ControlNet_Checkpoint_Anima_Config records cond_in_channels at probe time (metadata with conv1-shape fallback) so the UI can route inpaint (4ch) and general control (3ch) variants to different surfaces; null means installed before this field existed. Adds starter entries for the remaining LLLite variants: Sketch (any-test-like-v2) plus the Preview3-era depth, scribble, lineart and pose adapters. Co-Authored-By: Claude Fable 5 --- .../model_manager/configs/controlnet.py | 22 +++++- .../backend/model_manager/starter_models.py | 51 ++++++++++++++ .../configs/test_anima_controlnet_config.py | 68 +++++++++++++++++-- 3 files changed, 136 insertions(+), 5 deletions(-) diff --git a/invokeai/backend/model_manager/configs/controlnet.py b/invokeai/backend/model_manager/configs/controlnet.py index eee4204ba67..890172e00fb 100644 --- a/invokeai/backend/model_manager/configs/controlnet.py +++ b/invokeai/backend/model_manager/configs/controlnet.py @@ -304,6 +304,11 @@ class ControlNet_Checkpoint_Anima_Config(Checkpoint_Config_Base, Config_Base): format: Literal[ModelFormat.Checkpoint] = Field(default=ModelFormat.Checkpoint) base: Literal[BaseModelType.Anima] = Field(default=BaseModelType.Anima) default_settings: ControlAdapterDefaultSettings | None = Field(None) + cond_in_channels: int | None = Field( + default=None, + description="Number of conditioning image channels (3 = RGB control image, 4 = RGB + inpaint mask). None for " + "models installed before this field was recorded.", + ) @classmethod def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) -> Self: @@ -313,7 +318,22 @@ def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) - cls._validate_looks_like_anima_lllite(mod) - return cls(**override_fields) + args = dict(override_fields) + if "cond_in_channels" not in args: + args["cond_in_channels"] = cls._get_cond_in_channels(mod) + return cls(**args) + + @classmethod + def _get_cond_in_channels(cls, mod: ModelOnDisk) -> int: + # Mirrors AnimaControlNetLLLite.from_state_dict: prefer the saved `lllite.*` hyperparam, falling back to + # the conv1 weight shape (ch_half, cond_in_channels, 4, 4). + meta_value = mod.metadata().get("lllite.cond_in_channels") + if meta_value is not None: + return int(meta_value) + conv1_weight = mod.load_state_dict().get("lllite_conditioning1.conv1.weight") + if conv1_weight is None: + raise NotAMatchError("state dict has Anima ControlNet-LLLite keys but no lllite_conditioning1.conv1.weight") + return int(conv1_weight.shape[1]) @classmethod def _validate_looks_like_anima_lllite(cls, mod: ModelOnDisk) -> None: diff --git a/invokeai/backend/model_manager/starter_models.py b/invokeai/backend/model_manager/starter_models.py index 124cef35abb..64f099554a7 100644 --- a/invokeai/backend/model_manager/starter_models.py +++ b/invokeai/backend/model_manager/starter_models.py @@ -1581,6 +1581,51 @@ def _gemini_3_resolution_presets( type=ModelType.ControlNet, format=ModelFormat.Checkpoint, ) + +anima_lllite_sketch = StarterModel( + name="Anima LLLite Sketch", + base=BaseModelType.Anima, + source="https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-any-test-like-v2.safetensors", + description="ControlNet-LLLite control adapter for Anima by kohya-ss. Trained on mixed scribble/HED/lineart/grayscale conditioning images. ~16MB", + type=ModelType.ControlNet, + format=ModelFormat.Checkpoint, +) + +anima_lllite_depth_preview3 = StarterModel( + name="Anima LLLite Depth (Preview3)", + base=BaseModelType.Anima, + source="https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-depth-1.safetensors", + description="ControlNet-LLLite depth adapter for Anima by kohya-ss. Trained on the Preview3 build; reduced quality on Anima Base 1.0. ~8MB", + type=ModelType.ControlNet, + format=ModelFormat.Checkpoint, +) + +anima_lllite_scribble_preview3 = StarterModel( + name="Anima LLLite Scribble (Preview3)", + base=BaseModelType.Anima, + source="https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-scribble-1.safetensors", + description="ControlNet-LLLite scribble adapter for Anima by kohya-ss. Trained on the Preview3 build; reduced quality on Anima Base 1.0. ~8MB", + type=ModelType.ControlNet, + format=ModelFormat.Checkpoint, +) + +anima_lllite_lineart_preview3 = StarterModel( + name="Anima LLLite Lineart (Preview3)", + base=BaseModelType.Anima, + source="https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-lineart-1.safetensors", + description="ControlNet-LLLite lineart adapter for Anima by kohya-ss. Trained on the Preview3 build; reduced quality on Anima Base 1.0. ~8MB", + type=ModelType.ControlNet, + format=ModelFormat.Checkpoint, +) + +anima_lllite_pose_preview3 = StarterModel( + name="Anima LLLite Pose (Preview3)", + base=BaseModelType.Anima, + source="https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-pose-1.safetensors", + description="ControlNet-LLLite pose adapter for Anima by kohya-ss. Trained on the Preview3 build; notably weak on Anima Base 1.0. ~23MB", + type=ModelType.ControlNet, + format=ModelFormat.Checkpoint, +) # endregion # List of starter models, displayed on the frontend. @@ -1720,6 +1765,11 @@ def _gemini_3_resolution_presets( anima_qwen3_encoder, anima_vae, anima_lllite_inpainting, + anima_lllite_sketch, + anima_lllite_depth_preview3, + anima_lllite_scribble_preview3, + anima_lllite_lineart_preview3, + anima_lllite_pose_preview3, ] sd1_bundle: list[StarterModel] = [ @@ -1808,6 +1858,7 @@ def _gemini_3_resolution_presets( anima_qwen3_encoder, anima_vae, anima_lllite_inpainting, + anima_lllite_sketch, ] STARTER_BUNDLES: dict[str, StarterModelBundle] = { diff --git a/tests/backend/model_manager/configs/test_anima_controlnet_config.py b/tests/backend/model_manager/configs/test_anima_controlnet_config.py index 6b7f1d215b5..e1eeedeff54 100644 --- a/tests/backend/model_manager/configs/test_anima_controlnet_config.py +++ b/tests/backend/model_manager/configs/test_anima_controlnet_config.py @@ -8,6 +8,7 @@ import os from pathlib import Path +from types import SimpleNamespace from unittest.mock import MagicMock import pytest @@ -59,13 +60,17 @@ ] -def _make_state_dict(keys: list[str]) -> dict[str, object]: - return dict.fromkeys(keys) +def _make_state_dict(keys: list[str], conv1_in_channels: int = 3) -> dict[str, object]: + sd: dict[str, object] = dict.fromkeys(keys) + if "lllite_conditioning1.conv1.weight" in sd: + sd["lllite_conditioning1.conv1.weight"] = SimpleNamespace(shape=(160, conv1_in_channels, 4, 4)) + return sd -def _make_mod(state_dict: dict[str, object]) -> MagicMock: +def _make_mod(state_dict: dict[str, object], metadata: dict[str, str] | None = None) -> MagicMock: mod = MagicMock() mod.load_state_dict.return_value = state_dict + mod.metadata.return_value = metadata or {} return mod @@ -117,8 +122,60 @@ def test_rejects_non_anima_lllite(self, keys: list[str]): ControlNet_Checkpoint_Anima_Config.from_model_on_disk(mod, dict(_OVERRIDE_FIELDS)) +class TestCondInChannels: + """Tests for the cond_in_channels field (metadata, conv1-shape fallback, old-JSON rehydration).""" + + def test_populated_from_metadata(self): + mod = _make_mod( + _make_state_dict(ANIMA_LLLITE_KEYS, conv1_in_channels=3), + metadata={"lllite.cond_in_channels": "4"}, + ) + + config = ControlNet_Checkpoint_Anima_Config.from_model_on_disk(mod, dict(_OVERRIDE_FIELDS)) + + assert config.cond_in_channels == 4 + + def test_fallback_to_conv1_shape_when_metadata_absent(self): + mod = _make_mod(_make_state_dict(ANIMA_LLLITE_KEYS, conv1_in_channels=4)) + + config = ControlNet_Checkpoint_Anima_Config.from_model_on_disk(mod, dict(_OVERRIDE_FIELDS)) + + assert config.cond_in_channels == 4 + + def test_old_json_rehydrates_with_none(self): + """Configs stored before the field existed must still validate, with cond_in_channels=None.""" + mod = _make_mod(_make_state_dict(ANIMA_LLLITE_KEYS)) + config = ControlNet_Checkpoint_Anima_Config.from_model_on_disk(mod, dict(_OVERRIDE_FIELDS)) + assert config.cond_in_channels == 3 + + stored = config.model_dump(mode="json") + del stored["cond_in_channels"] + rehydrated = ControlNet_Checkpoint_Anima_Config.model_validate(stored) + + assert rehydrated.cond_in_channels is None + + def test_override_skips_probe(self): + """An explicit override must win without probing the state dict (which may be unprobeable).""" + keys = [k for k in ANIMA_LLLITE_KEYS if k != "lllite_conditioning1.conv1.weight"] + mod = _make_mod(_make_state_dict(keys)) + + config = ControlNet_Checkpoint_Anima_Config.from_model_on_disk( + mod, dict(_OVERRIDE_FIELDS) | {"cond_in_channels": 4} + ) + + assert config.cond_in_channels == 4 + + def test_missing_conv1_without_metadata_is_not_a_match(self): + """A malformed file with LLLite keys but no conv1.weight must raise NotAMatchError, not KeyError.""" + keys = [k for k in ANIMA_LLLITE_KEYS if k != "lllite_conditioning1.conv1.weight"] + mod = _make_mod(_make_state_dict(keys)) + + with pytest.raises(NotAMatchError, match="no lllite_conditioning1.conv1.weight"): + ControlNet_Checkpoint_Anima_Config.from_model_on_disk(mod, dict(_OVERRIDE_FIELDS)) + + @pytest.mark.skipif( - REAL_WEIGHTS_PATH is None or not REAL_WEIGHTS_PATH.is_file(), + REAL_WEIGHTS_PATH is None, reason=f"set {_REAL_WEIGHTS_ENV_VAR} to the real LLLite weights file to run", ) def test_real_file_classifies_as_anima_controlnet(): @@ -126,8 +183,11 @@ def test_real_file_classifies_as_anima_controlnet(): from invokeai.backend.model_manager.configs.factory import ModelConfigFactory assert REAL_WEIGHTS_PATH is not None + # A stale path must fail loudly, not silently skip. + assert REAL_WEIGHTS_PATH.is_file(), f"{_REAL_WEIGHTS_ENV_VAR} points to a missing file: {REAL_WEIGHTS_PATH}" result = ModelConfigFactory.from_model_on_disk(REAL_WEIGHTS_PATH, allow_unknown=False) assert result.config is not None assert isinstance(result.config, ControlNet_Checkpoint_Anima_Config) assert result.match_count == 1 + assert result.config.cond_in_channels == 4 From 131944bcb07a72e7395b772b41910fd7dd5898df Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 10 Jun 2026 00:52:56 -0400 Subject: [PATCH 06/10] feat(nodes): accept multiple ControlNet-LLLite adapters in Anima denoise control_lllite now takes a single field or a list (v1.8.0). Adapters are sorted by model key for deterministic composition, applied in order after LoRA patching, gated per-step by their own weight and step range, and restored in reverse order with per-adapter exception isolation since the bind chain is only safe to unwind LIFO. Duplicate adapter models are rejected because the model cache shares one instance per key. Co-Authored-By: Claude Fable 5 --- invokeai/app/invocations/anima_denoise.py | 132 ++++++++---- invokeai/backend/anima/control_net_lllite.py | 9 +- .../backend/anima/test_control_net_lllite.py | 204 +++++++++++++++++- 3 files changed, 296 insertions(+), 49 deletions(-) diff --git a/invokeai/app/invocations/anima_denoise.py b/invokeai/app/invocations/anima_denoise.py index 4116603eb96..0a929186681 100644 --- a/invokeai/app/invocations/anima_denoise.py +++ b/invokeai/app/invocations/anima_denoise.py @@ -175,7 +175,7 @@ def merge_intermediate_latents_with_init_latents( title="Denoise - Anima", tags=["image", "anima"], category="image", - version="1.7.0", + version="1.8.0", classification=Classification.Prototype, ) class AnimaDenoiseInvocation(BaseInvocation): @@ -220,10 +220,11 @@ class AnimaDenoiseInvocation(BaseInvocation): height: int = InputField(default=1024, multiple_of=8, description="Height of the generated image.") steps: int = InputField(default=30, gt=0, description="Number of denoising steps. 30 recommended for Anima.") seed: int = InputField(default=0, description="Randomness seed for reproducibility.") - # ControlNet-LLLite support (e.g. model-level inpaint conditioning) - control_lllite: Optional[AnimaLLLiteField] = InputField( + # ControlNet-LLLite support (e.g. model-level inpaint conditioning, control layers) + control_lllite: AnimaLLLiteField | list[AnimaLLLiteField] | None = InputField( default=None, - description="Anima ControlNet-LLLite conditioning (e.g. inpaint adapter).", + description="Anima ControlNet-LLLite conditioning (e.g. inpaint adapter, control layers). Adapters are " + "applied in a deterministic order (sorted by model key); each model may be used at most once.", input=Input.Connection, ) scheduler: ANIMA_SCHEDULER_NAME_VALUES = InputField( @@ -263,32 +264,69 @@ def _prep_inpaint_mask(self, context: InvocationContext, latents: torch.Tensor) mask = mask.to(device=latents.device, dtype=latents.dtype) return mask + @staticmethod + def _normalize_control_lllite( + control_lllite: AnimaLLLiteField | list[AnimaLLLiteField] | None, + ) -> list[AnimaLLLiteField]: + """Normalize the control_lllite input to a sorted list and reject duplicate models. + + The model cache returns ONE shared AnimaControlNetLLLite instance per + model key, so two adapters using the same model in one run would share + cond/multiplier state and clobber each other's bindings. + + The list is sorted by model key: the frontend fans adapters into a + `collect` node whose output order follows graph node ids (random + UUIDs), not user intent, and composition is weakly order-sensitive + (each adapter's delta sees the perturbations of adapters applied after + it). Sorting makes the cascade deterministic and reproducible. + """ + if control_lllite is None: + lllite_fields: list[AnimaLLLiteField] = [] + elif isinstance(control_lllite, AnimaLLLiteField): + lllite_fields = [control_lllite] + elif isinstance(control_lllite, list): + lllite_fields = control_lllite + else: + raise ValueError(f"Unsupported control_lllite type: {type(control_lllite)}") + + seen_keys: set[str] = set() + for lllite_field in lllite_fields: + key = lllite_field.control_model.key + if key in seen_keys: + raise ValueError( + f"The Anima ControlNet-LLLite model '{lllite_field.control_model.name}' is used by more than " + "one control input. Each LLLite model can only be applied once per generation — remove the " + "duplicate, or select a different model for it." + ) + seen_keys.add(key) + return sorted(lllite_fields, key=lambda f: f.control_model.key) + def _build_lllite_cond_image( self, context: InvocationContext, + lllite_field: AnimaLLLiteField, lllite_model: AnimaControlNetLLLite, latents: torch.Tensor, patch_spatial: int = 2, ) -> torch.Tensor: - """Build the LLLite conditioning image tensor (once per generation). + """Build one adapter's LLLite conditioning image tensor (once per generation). The cond image is sized from the ACTUAL latent H/W (mirroring the DiT's patch padding) — see target_cond_hw in the backend module. """ - assert self.control_lllite is not None latent_h, latent_w = latents.shape[-2], latents.shape[-1] - image_pil = context.images.get_pil(self.control_lllite.image_name, "RGB") + image_pil = context.images.get_pil(lllite_field.image_name, "RGB") rgb_01 = to_tensor(image_pil).unsqueeze(0) # (1, 3, H, W) in [0, 1] rgb_pm1 = prepare_cond_image(rgb_01, latent_h, latent_w, patch_spatial) if lllite_model.cond_in_channels == 4: - if self.control_lllite.mask_name is None: + if lllite_field.mask_name is None: raise ValueError( "This Anima ControlNet-LLLite adapter is an inpainting adapter (4-channel conditioning) and " "requires a mask. Connect a mask (white = inpaint area) to the Anima ControlNet-LLLite node." ) - mask_pil = context.images.get_pil(self.control_lllite.mask_name, "L") + mask_pil = context.images.get_pil(lllite_field.mask_name, "L") mask_01 = to_tensor(mask_pil).unsqueeze(0) # (1, 1, H, W) in [0, 1] mask_01 = prepare_mask(mask_01, latent_h, latent_w, patch_spatial) return build_inpaint_cond_image(rgb_pm1, mask_01, lllite_model.inpaint_masked_input) @@ -298,27 +336,27 @@ def _build_lllite_cond_image( f"Unsupported Anima ControlNet-LLLite adapter: expected 3 or 4 conditioning channels, got " f"{lllite_model.cond_in_channels}." ) - if self.control_lllite.mask_name is not None: + if lllite_field.mask_name is not None: context.logger.warning( "The selected Anima ControlNet-LLLite adapter does not use a mask (3-channel conditioning); the " "connected mask will be ignored." ) return rgb_pm1 - def _get_lllite_multiplier(self, step_index: int, total_steps: int) -> float: - """Step-range gate for the LLLite adapter multiplier. + @staticmethod + def _get_lllite_multiplier(lllite_field: AnimaLLLiteField, step_index: int, total_steps: int) -> float: + """Step-range gate for one LLLite adapter's multiplier. Uses the same user-facing step-index/percent convention as BaseControlNetExtension._get_weight. """ - assert self.control_lllite is not None - first_step = math.floor(self.control_lllite.begin_step_percent * total_steps) - last_step = math.ceil(self.control_lllite.end_step_percent * total_steps) + first_step = math.floor(lllite_field.begin_step_percent * total_steps) + last_step = math.ceil(lllite_field.end_step_percent * total_steps) if step_index < first_step or step_index > last_step: return 0.0 - return self.control_lllite.weight + return lllite_field.weight def _get_noise( self, @@ -478,6 +516,8 @@ def _run_diffusion(self, context: InvocationContext) -> torch.Tensor: f"denoising_start ({self.denoising_start}) must be less than denoising_end ({self.denoising_end})." ) + lllite_fields = self._normalize_control_lllite(self.control_lllite) + transformer_info = context.models.load(self.transformer.transformer) # Compute image token grid dimensions for regional prompting @@ -601,18 +641,21 @@ def _run_diffusion(self, context: InvocationContext) -> torch.Tensor: with ExitStack() as exit_stack: (cached_weights, transformer) = exit_stack.enter_context(transformer_info.model_on_device()) - # Prepare the ControlNet-LLLite adapter if provided. The conditioning - # image is built ONCE per generation (not per step). - lllite_model: AnimaControlNetLLLite | None = None - lllite_cond: torch.Tensor | None = None - if self.control_lllite is not None: - lllite_info = context.models.load(self.control_lllite.control_model) - (_, lllite_adapter) = exit_stack.enter_context(lllite_info.model_on_device()) - assert isinstance(lllite_adapter, AnimaControlNetLLLite) - lllite_model = lllite_adapter + # Prepare the ControlNet-LLLite adapters if provided. Each adapter's + # conditioning image is built ONCE per generation (not per step). + lllite_adapters: list[tuple[AnimaLLLiteField, AnimaControlNetLLLite, torch.Tensor]] = [] + for lllite_field in lllite_fields: + lllite_info = context.models.load(lllite_field.control_model) + (_, lllite_model) = exit_stack.enter_context(lllite_info.model_on_device()) + assert isinstance(lllite_model, AnimaControlNetLLLite) lllite_cond = self._build_lllite_cond_image( - context, lllite_model, latents, patch_spatial=int(getattr(transformer, "patch_spatial", 2)) + context, + lllite_field, + lllite_model, + latents, + patch_spatial=int(getattr(transformer, "patch_spatial", 2)), ) + lllite_adapters.append((lllite_field, lllite_model, lllite_cond)) # Apply LoRA models to the transformer. # Note: We apply the LoRA after the transformer has been moved to its target device for faster patching. @@ -691,8 +734,9 @@ def _run_transformer(ctx: torch.Tensor, x: torch.Tensor, t: torch.Tensor) -> tor ) try: - if lllite_model is not None: - # Bind AFTER LoRA patching so the LLLite modules wrap the patched forwards. + # Bind AFTER LoRA patching so the LLLite modules wrap the patched + # forwards. List order = apply order; restore must be the reverse. + for _, lllite_model, lllite_cond in lllite_adapters: lllite_model.apply_to(transformer) lllite_model.set_cond_image(lllite_cond) @@ -702,8 +746,10 @@ def _run_transformer(ctx: torch.Tensor, x: torch.Tensor, t: torch.Tensor) -> tor for it in driver.iterations(): # Gate on the user-facing step index so both halves of a # multi-pass step (e.g. Heun pairs) share one gate value. - if lllite_model is not None: - lllite_model.set_multiplier(self._get_lllite_multiplier(user_step, total_steps)) + for lllite_field, lllite_model, _ in lllite_adapters: + lllite_model.set_multiplier( + self._get_lllite_multiplier(lllite_field, user_step, total_steps) + ) timestep = torch.tensor( [it.sigma_curr * ANIMA_MULTIPLIER], device=device, dtype=inference_dtype @@ -751,8 +797,10 @@ def _run_transformer(ctx: torch.Tensor, x: torch.Tensor, t: torch.Tensor) -> tor else: # Built-in Euler implementation (default for Anima) for step_idx in tqdm(range(total_steps), desc="Denoising (Anima)"): - if lllite_model is not None: - lllite_model.set_multiplier(self._get_lllite_multiplier(step_idx, total_steps)) + for lllite_field, lllite_model, _ in lllite_adapters: + lllite_model.set_multiplier( + self._get_lllite_multiplier(lllite_field, step_idx, total_steps) + ) sigma_curr = sigmas[step_idx] sigma_prev = sigmas[step_idx + 1] @@ -794,11 +842,21 @@ def _run_transformer(ctx: torch.Tensor, x: torch.Tensor, t: torch.Tensor) -> tor ), ) finally: - # The adapter model is shared via the model cache — always undo the - # forward swaps and drop the per-run cond state. - if lllite_model is not None: - lllite_model.restore() - lllite_model.clear_cond_image() + # The adapter models are shared via the model cache — always undo + # the forward swaps and drop the per-run cond state. unbind() is + # only correct LIFO, so restore in REVERSE apply order (see + # AnimaControlNetLLLite.restore). Each restore is isolated so one + # failure cannot leave the remaining adapters bound to the + # cache-shared transformer. + for lllite_field, lllite_model, _ in reversed(lllite_adapters): + try: + lllite_model.restore() + lllite_model.clear_cond_image() + except Exception as e: + context.logger.error( + f"Failed to restore Anima ControlNet-LLLite adapter " + f"'{lllite_field.control_model.name}': {e}" + ) # Remove temporal dimension for output: [B, C, 1, H, W] -> [B, C, H, W] return latents.squeeze(2) diff --git a/invokeai/backend/anima/control_net_lllite.py b/invokeai/backend/anima/control_net_lllite.py index db20f0523f0..dd36f2e5b2f 100644 --- a/invokeai/backend/anima/control_net_lllite.py +++ b/invokeai/backend/anima/control_net_lllite.py @@ -525,7 +525,14 @@ def apply_to(self, transformer: nn.Module) -> None: m.bind(target) def restore(self) -> None: - """Undo :meth:`apply_to`. Safe to call when not applied.""" + """Undo :meth:`apply_to`. Safe to call when not applied. + + LIFO contract: each bind saves the forward that was CURRENT at bind + time, so when multiple adapters are stacked on one transformer they + must be restored in reverse apply order. Restoring an earlier adapter + first would delete a later adapter's wrapper and re-pin the earlier + one's saved forward. + """ for m in self.lllite_modules: m.unbind() diff --git a/tests/backend/anima/test_control_net_lllite.py b/tests/backend/anima/test_control_net_lllite.py index 5817ca9f760..70b86f66c54 100644 --- a/tests/backend/anima/test_control_net_lllite.py +++ b/tests/backend/anima/test_control_net_lllite.py @@ -1,6 +1,6 @@ """Tests for the Anima ControlNet-LLLite adapter — construction from a saved -state dict, exact-passthrough guarantees, forward-swap binding/restore, and the -conditioning image preprocessing helpers.""" +state dict, exact-passthrough guarantees, forward-swap binding/restore, +multi-adapter composition, and the conditioning image preprocessing helpers.""" import os from pathlib import Path @@ -10,6 +10,9 @@ import torch.nn.functional as F from torch import nn +from invokeai.app.invocations.anima_denoise import AnimaDenoiseInvocation +from invokeai.app.invocations.anima_lllite import AnimaLLLiteField +from invokeai.app.invocations.model import ModelIdentifierField from invokeai.backend.anima.control_net_lllite import ( AnimaControlNetLLLite, build_inpaint_cond_image, @@ -17,6 +20,7 @@ prepare_mask, target_cond_hw, ) +from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType # Opt-in test against the real adapter weights (anima-lllite-inpainting-v2.safetensors). _REAL_WEIGHTS_ENV_VAR = "ANIMA_LLLITE_WEIGHTS_PATH" @@ -30,7 +34,7 @@ KINDS = ("self_attn_q_proj", "self_attn_k_proj", "self_attn_v_proj", "mlp_layer1") -def make_synthetic_state_dict(seed: int = 0) -> dict[str, torch.Tensor]: +def make_synthetic_state_dict(seed: int = 0, mlp_dim: int = MLP_DIM) -> dict[str, torch.Tensor]: """Saved-format (v2 named-key) state dict for a tiny 2-block adapter with 4-channel (inpaint) conditioning and one trunk resblock.""" g = torch.Generator().manual_seed(seed) @@ -68,13 +72,13 @@ def t(*shape: int) -> torch.Tensor: for i in range(N_BLOCKS): for kind in KINDS: p = f"lllite_dit_blocks_{i}_{kind}" - sd[f"{p}.down.weight"] = t(MLP_DIM, IN_DIM) - sd[f"{p}.down.bias"] = t(MLP_DIM) - sd[f"{p}.mid.weight"] = t(MLP_DIM, MLP_DIM + COND_EMB_DIM) - sd[f"{p}.mid.bias"] = t(MLP_DIM) - sd[f"{p}.cond_to_film.weight"] = t(2 * MLP_DIM, COND_EMB_DIM) - sd[f"{p}.cond_to_film.bias"] = t(2 * MLP_DIM) - sd[f"{p}.up.weight"] = t(IN_DIM, MLP_DIM) + sd[f"{p}.down.weight"] = t(mlp_dim, IN_DIM) + sd[f"{p}.down.bias"] = t(mlp_dim) + sd[f"{p}.mid.weight"] = t(mlp_dim, mlp_dim + COND_EMB_DIM) + sd[f"{p}.mid.bias"] = t(mlp_dim) + sd[f"{p}.cond_to_film.weight"] = t(2 * mlp_dim, COND_EMB_DIM) + sd[f"{p}.cond_to_film.bias"] = t(2 * mlp_dim) + sd[f"{p}.up.weight"] = t(IN_DIM, mlp_dim) sd[f"{p}.up.bias"] = t(IN_DIM) sd[f"{p}.depth_embed"] = t(COND_EMB_DIM) return sd @@ -470,13 +474,189 @@ def test_forward_casts_mismatched_input_dtype() -> None: assert not torch.equal(y, plain_linear(q_proj, x)) +# ---------------------------------------------------------------------------- +# Multi-adapter composition (denoise applies in list order, restores LIFO) +# ---------------------------------------------------------------------------- + + +class _IdentityCapture(nn.Linear): + """nn.Linear whose forward returns its input unchanged — binding a LLLite + module to it reads out the perturbed input the module passes to the + forward it wrapped.""" + + def forward(self, x: torch.Tensor) -> torch.Tensor: + return x + + +def make_two_adapters() -> tuple[AnimaControlNetLLLite, AnimaControlNetLLLite, FakeTransformer]: + """Two adapters with different mlp dims (8 and 16) plus one fake tree.""" + model_a = AnimaControlNetLLLite.from_state_dict(make_synthetic_state_dict(seed=0, mlp_dim=8), None) + model_b = AnimaControlNetLLLite.from_state_dict(make_synthetic_state_dict(seed=1, mlp_dim=16), None) + torch.manual_seed(123) + transformer = FakeTransformer(IN_DIM, N_BLOCKS) + return model_a, model_b, transformer + + +def cond_image_for(seed: int) -> torch.Tensor: + return torch.randn(1, 4, 32, 32, generator=torch.Generator().manual_seed(seed)).clamp(-1, 1) + + +def test_two_adapters_chain_with_second_wrapping_first() -> None: + model_a, model_b, transformer = make_two_adapters() + assert model_a.mlp_dim != model_b.mlp_dim + q_proj = transformer.blocks[0].self_attn.q_proj + x = torch.randn(1, 4, IN_DIM, generator=torch.Generator().manual_seed(20)) + + model_a.set_multiplier(1.0) + model_a.set_cond_image(cond_image_for(30)) + model_b.set_multiplier(1.0) + model_b.set_cond_image(cond_image_for(31)) + + # Capture x + delta_B(x): the input B hands to the forward it wrapped. + capture = _IdentityCapture(IN_DIM, IN_DIM, bias=False) + module_b = next(m for m in model_b.lllite_modules if m.lllite_name == "lllite_dit_blocks_0_self_attn_q_proj") + module_b.bind(capture) + try: + x_plus_delta_b = capture(x) + finally: + module_b.unbind() + assert not torch.equal(x_plus_delta_b, x) + + model_a.apply_to(transformer) + expected = q_proj(x_plus_delta_b) # A's wrapped forward on B's perturbed input + + model_b.apply_to(transformer) # B wraps A + assert torch.equal(q_proj(x), expected) + + model_b.restore() + model_a.restore() + + +def test_two_adapters_reverse_restore_returns_pristine_dispatch() -> None: + model_a, model_b, transformer = make_two_adapters() + x = torch.randn(1, 4, IN_DIM, generator=torch.Generator().manual_seed(21)) + + targets = [ + linear + for block in transformer.blocks + for linear in (block.self_attn.q_proj, block.self_attn.k_proj, block.self_attn.v_proj, block.mlp.layer1) + ] + pre_outputs = [linear(x) for linear in targets] + + for model, seed in ((model_a, 32), (model_b, 33)): + model.apply_to(transformer) + model.set_multiplier(1.0) + model.set_cond_image(cond_image_for(seed)) + assert all("forward" in linear.__dict__ for linear in targets) + + # LIFO: the last adapter applied is restored first. + model_b.restore() + model_a.restore() + + for linear, expected in zip(targets, pre_outputs, strict=True): + assert "forward" not in linear.__dict__ + assert torch.equal(linear(x), expected) + + +def test_each_adapter_multiplier_gates_only_its_own_contribution() -> None: + model_a, model_b, transformer = make_two_adapters() + q_proj = transformer.blocks[0].self_attn.q_proj + x = torch.randn(1, 4, IN_DIM, generator=torch.Generator().manual_seed(22)) + y_plain = plain_linear(q_proj, x) + cond_a = cond_image_for(34) + cond_b = cond_image_for(35) + + # Single-adapter baselines. + model_a.apply_to(transformer) + model_a.set_multiplier(1.0) + model_a.set_cond_image(cond_a) + y_a_only = q_proj(x) + model_a.restore() + + model_b.apply_to(transformer) + model_b.set_multiplier(1.0) + model_b.set_cond_image(cond_b) + y_b_only = q_proj(x) + model_b.restore() + + assert not torch.equal(y_a_only, y_plain) + assert not torch.equal(y_b_only, y_plain) + assert not torch.equal(y_a_only, y_b_only) + + # Both applied: zeroing one adapter's multiplier removes exactly its contribution. + model_a.apply_to(transformer) + model_b.apply_to(transformer) + model_a.set_cond_image(cond_a) + model_b.set_cond_image(cond_b) + + model_a.set_multiplier(1.0) + model_b.set_multiplier(0.0) + assert torch.equal(q_proj(x), y_a_only) + + model_a.set_multiplier(0.0) + model_b.set_multiplier(1.0) + assert torch.equal(q_proj(x), y_b_only) + + model_a.set_multiplier(0.0) + model_b.set_multiplier(0.0) + assert torch.equal(q_proj(x), y_plain) + + model_a.set_multiplier(1.0) + model_b.set_multiplier(1.0) + y_both = q_proj(x) + assert not torch.equal(y_both, y_a_only) + assert not torch.equal(y_both, y_b_only) + + model_b.restore() + model_a.restore() + + +# ---------------------------------------------------------------------------- +# Denoise input normalization (duplicate models share one cached instance) +# ---------------------------------------------------------------------------- + + +def _lllite_field(key: str) -> AnimaLLLiteField: + return AnimaLLLiteField( + image_name="cond_image", + control_model=ModelIdentifierField( + key=key, + hash="blake3:0000", + name=f"adapter-{key}", + base=BaseModelType.Anima, + type=ModelType.ControlNet, + ), + ) + + +def test_normalize_control_lllite_to_list() -> None: + assert AnimaDenoiseInvocation._normalize_control_lllite(None) == [] + single = _lllite_field("key-a") + assert AnimaDenoiseInvocation._normalize_control_lllite(single) == [single] + pair = [_lllite_field("key-a"), _lllite_field("key-b")] + assert AnimaDenoiseInvocation._normalize_control_lllite(pair) == pair + + +def test_normalize_control_lllite_sorts_by_model_key() -> None: + """Apply order must be deterministic: collect-node input order follows random node ids.""" + field_a = _lllite_field("key-a") + field_b = _lllite_field("key-b") + assert AnimaDenoiseInvocation._normalize_control_lllite([field_b, field_a]) == [field_a, field_b] + + +def test_normalize_control_lllite_rejects_duplicate_model_keys() -> None: + pair = [_lllite_field("key-a"), _lllite_field("key-a")] + with pytest.raises(ValueError, match="used by more than one"): + AnimaDenoiseInvocation._normalize_control_lllite(pair) + + # ---------------------------------------------------------------------------- # Real weight file (optional; skipped when the file is not present) # ---------------------------------------------------------------------------- @pytest.mark.skipif( - REAL_WEIGHTS_PATH is None or not REAL_WEIGHTS_PATH.is_file(), + REAL_WEIGHTS_PATH is None, reason=f"set {_REAL_WEIGHTS_ENV_VAR} to the real LLLite weights file to run", ) def test_from_state_dict_real_file() -> None: @@ -484,6 +664,8 @@ def test_from_state_dict_real_file() -> None: from safetensors.torch import load_file assert REAL_WEIGHTS_PATH is not None + # A stale path must fail loudly, not silently skip. + assert REAL_WEIGHTS_PATH.is_file(), f"{_REAL_WEIGHTS_ENV_VAR} points to a missing file: {REAL_WEIGHTS_PATH}" sd = load_file(str(REAL_WEIGHTS_PATH)) with safe_open(str(REAL_WEIGHTS_PATH), framework="pt") as f: metadata = f.metadata() From 18120c7425a44ebdecdb03e2e5e3c22d7bd310b1 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 10 Jun 2026 00:52:57 -0400 Subject: [PATCH 07/10] feat(ui): Anima ControlNet-LLLite canvas control layers Adds the anima_lllite control-adapter type to control layers, lifts the hard unsupported-base block for Anima (t2i/control-lora still warn), and routes models by conditioning channels: 3ch adapters appear in control layers, 4ch and legacy installs in the Inpaint Adapter picker. Control layers and the inpaint adapter feed a shared collect node into the denoise list input across all generation modes, and duplicate adapter models block Invoke with a per-layer warning. Co-Authored-By: Claude Fable 5 --- invokeai/frontend/web/public/locales/en.json | 1 + .../ControlLayerControlAdapterModel.tsx | 6 ++ .../common/CanvasEntityHeaderWarnings.tsx | 2 +- .../controlLayers/store/canvasSlice.ts | 20 ++++- .../src/features/controlLayers/store/types.ts | 9 +++ .../src/features/controlLayers/store/util.ts | 7 ++ .../controlLayers/store/validators.ts | 24 +++++- .../graph/generation/addControlAdapters.ts | 74 +++++++++++++++++++ .../nodes/util/graph/generation/addInpaint.ts | 9 ++- .../util/graph/generation/addOutpaint.ts | 9 ++- .../util/graph/generation/buildAnimaGraph.ts | 44 +++++++++++ .../Advanced/ParamAnimaModelSelect.tsx | 4 +- .../web/src/features/queue/store/readiness.ts | 2 +- .../src/services/api/hooks/modelsByType.ts | 4 +- .../frontend/web/src/services/api/schema.ts | 10 ++- .../frontend/web/src/services/api/types.ts | 16 +++- 16 files changed, 224 insertions(+), 17 deletions(-) diff --git a/invokeai/frontend/web/public/locales/en.json b/invokeai/frontend/web/public/locales/en.json index e14eb84f299..627eb1b7241 100644 --- a/invokeai/frontend/web/public/locales/en.json +++ b/invokeai/frontend/web/public/locales/en.json @@ -2868,6 +2868,7 @@ "rgAutoNegativeNotSupported": "Auto-Negative not supported for selected base model", "rgNoRegion": "no region drawn", "fluxFillIncompatibleWithControlLoRA": "Control LoRA is not compatible with FLUX Fill", + "controlAdapterDuplicateAnimaLLLiteModel": "each Anima control model can only be used by one Control Layer", "bboxHidden": "Bounding box is hidden (shift+o to toggle)" }, "errors": { diff --git a/invokeai/frontend/web/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapterModel.tsx b/invokeai/frontend/web/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapterModel.tsx index 34f1607b954..d3fa9be66b4 100644 --- a/invokeai/frontend/web/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapterModel.tsx +++ b/invokeai/frontend/web/src/features/controlLayers/components/ControlLayer/ControlLayerControlAdapterModel.tsx @@ -11,6 +11,7 @@ import type { ControlNetModelConfig, T2IAdapterModelConfig, } from 'services/api/types'; +import { isAnimaControlNetModelConfig } from 'services/api/types'; type Props = { modelKey: string | null; @@ -35,6 +36,11 @@ export const ControlLayerControlAdapterModel = memo(({ modelKey, onChange: onCha const getIsDisabled = useCallback( (model: AnyModelConfig): boolean => { + if (isAnimaControlNetModelConfig(model) && model.cond_in_channels !== 3) { + // Anima inpaint-adapter variants (4-channel or legacy null cond_in_channels) are not control layers. + // Defense-in-depth: useControlLayerModels (isControlLayerModelConfig) already excludes these. + return true; + } const isCompatible = currentBaseModel === model.base; const hasMainModel = Boolean(currentBaseModel); return !hasMainModel || !isCompatible; diff --git a/invokeai/frontend/web/src/features/controlLayers/components/common/CanvasEntityHeaderWarnings.tsx b/invokeai/frontend/web/src/features/controlLayers/components/common/CanvasEntityHeaderWarnings.tsx index 2e524eddf36..37ae4cb4dcb 100644 --- a/invokeai/frontend/web/src/features/controlLayers/components/common/CanvasEntityHeaderWarnings.tsx +++ b/invokeai/frontend/web/src/features/controlLayers/components/common/CanvasEntityHeaderWarnings.tsx @@ -33,7 +33,7 @@ const buildSelectWarnings = (entityIdentifier: CanvasEntityIdentifier, t: TFunct const entityType = entity.type; if (entityType === 'control_layer') { - warnings = getControlLayerWarnings(entity, model); + warnings = getControlLayerWarnings(entity, model, canvas.controlLayers.entities); } else if (entityType === 'regional_guidance') { warnings = getRegionalGuidanceWarnings(entity, model); } else if (entityType === 'inpaint_mask') { diff --git a/invokeai/frontend/web/src/features/controlLayers/store/canvasSlice.ts b/invokeai/frontend/web/src/features/controlLayers/store/canvasSlice.ts index a18a6ed308f..c2c9b3a858b 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/canvasSlice.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/canvasSlice.ts @@ -53,6 +53,7 @@ import { } from 'services/api/types'; import type { + AnimaLLLiteConfig, AspectRatioID, BoundingBoxScaleMethod, CanvasControlLayerState, @@ -91,6 +92,7 @@ import { getRasterLayerState, getRegionalGuidanceState, imageDTOToImageWithDims, + initialAnimaLLLite, initialControlLoRA, initialControlNet, initialFLUXRedux, @@ -636,6 +638,8 @@ const slice = createSlice({ case 'controlnet': { // Check if this is a Z-Image ControlNet (base === 'z-image') const isZImageControl = layer.controlAdapter.model?.base === 'z-image'; + // Check if this is an Anima ControlNet-LLLite (base === 'anima') + const isAnimaLLLite = layer.controlAdapter.model?.base === 'anima'; if (isZImageControl) { // Convert to Z-Image Control adapter @@ -647,6 +651,15 @@ const slice = createSlice({ }; layer.controlAdapter = zImageControlConfig; } + } else if (isAnimaLLLite) { + // Convert to Anima ControlNet-LLLite adapter + if (layer.controlAdapter.type !== 'anima_lllite') { + const animaLLLiteConfig: AnimaLLLiteConfig = { + ...initialAnimaLLLite, + model: layer.controlAdapter.model, + }; + layer.controlAdapter = animaLLLiteConfig; + } } else { // Regular SD/SDXL/Flux ControlNet if (layer.controlAdapter.type === 't2i_adapter') { @@ -665,8 +678,11 @@ const slice = createSlice({ type: 'controlnet', }; layer.controlAdapter = controlNetConfig; - } else if (layer.controlAdapter.type === 'z_image_control') { - // Converting from Z-Image Control to regular ControlNet + } else if ( + layer.controlAdapter.type === 'z_image_control' || + layer.controlAdapter.type === 'anima_lllite' + ) { + // Converting from Z-Image Control or Anima ControlNet-LLLite to regular ControlNet const controlNetConfig: ControlNetConfig = { ...initialControlNet, model: layer.controlAdapter.model, diff --git a/invokeai/frontend/web/src/features/controlLayers/store/types.ts b/invokeai/frontend/web/src/features/controlLayers/store/types.ts index 920c123dc60..f09d0ae9624 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/types.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/types.ts @@ -530,6 +530,14 @@ const zZImageControlConfig = z.object({ }); export type ZImageControlConfig = z.infer; +const zAnimaLLLiteConfig = z.object({ + type: z.literal('anima_lllite'), + model: zModelIdentifierField.nullable(), + weight: z.number().gte(0).lte(2), + beginEndStepPct: zBeginEndStepPct, +}); +export type AnimaLLLiteConfig = z.infer; + /** * All simple params normalized to `[-1, 1]` except sharpness `[0, 1]`. * @@ -652,6 +660,7 @@ const zCanvasControlLayerState = zCanvasRasterLayerState.extend({ zT2IAdapterConfig, zControlLoRAConfig, zZImageControlConfig, + zAnimaLLLiteConfig, ]), }); export type CanvasControlLayerState = z.infer; diff --git a/invokeai/frontend/web/src/features/controlLayers/store/util.ts b/invokeai/frontend/web/src/features/controlLayers/store/util.ts index c8cb49dde3f..b28d74d7b54 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/util.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/util.ts @@ -2,6 +2,7 @@ import { deepClone } from 'common/util/deepClone'; import { merge } from 'es-toolkit/compat'; import { getPrefixedId } from 'features/controlLayers/konva/util'; import type { + AnimaLLLiteConfig, CanvasControlLayerState, CanvasImageState, CanvasInpaintMaskState, @@ -146,6 +147,12 @@ export const initialZImageControl: ZImageControlConfig = { weight: 0.75, // control_context_scale, recommended 0.65-0.80 beginEndStepPct: [0, 1], }; +export const initialAnimaLLLite: AnimaLLLiteConfig = { + type: 'anima_lllite', + model: null, + weight: 1, + beginEndStepPct: [0, 1], +}; export const makeDefaultRasterLayerAdjustments = (mode: 'simple' | 'curves' = 'simple'): RasterLayerAdjustments => ({ version: 1, diff --git a/invokeai/frontend/web/src/features/controlLayers/store/validators.ts b/invokeai/frontend/web/src/features/controlLayers/store/validators.ts index db5ad4f7662..504280861e6 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/validators.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/validators.ts @@ -26,6 +26,7 @@ const WARNINGS = { CONTROL_ADAPTER_INCOMPATIBLE_BASE_MODEL: 'controlLayers.warnings.controlAdapterIncompatibleBaseModel', CONTROL_ADAPTER_NO_CONTROL: 'controlLayers.warnings.controlAdapterNoControl', FLUX_FILL_NO_WORKY_WITH_CONTROL_LORA: 'controlLayers.warnings.fluxFillIncompatibleWithControlLoRA', + CONTROL_ADAPTER_DUPLICATE_ANIMA_LLLITE_MODEL: 'controlLayers.warnings.controlAdapterDuplicateAnimaLLLiteModel', } as const; type WarningTKey = (typeof WARNINGS)[keyof typeof WARNINGS]; @@ -171,7 +172,8 @@ export const getGlobalReferenceImageWarnings = ( export const getControlLayerWarnings = ( entity: CanvasControlLayerState, - model: MainOrExternalModelConfig | null | undefined + model: MainOrExternalModelConfig | null | undefined, + controlLayers?: CanvasControlLayerState[] ): WarningTKey[] => { const warnings: WarningTKey[] = []; @@ -184,9 +186,14 @@ export const getControlLayerWarnings = ( // No model selected warnings.push(WARNINGS.CONTROL_ADAPTER_NO_MODEL_SELECTED); } else if (model) { - if (model.base === 'sd-3' || model.base === 'sd-2' || model.base === 'anima') { + if (model.base === 'sd-3' || model.base === 'sd-2') { // Unsupported model architecture warnings.push(WARNINGS.UNSUPPORTED_MODEL); + } else if (model.base === 'anima' && entity.controlAdapter.type !== 'anima_lllite') { + // Anima only supports ControlNet-LLLite control layers. This also catches layers persisted with type + // 'controlnet' before the anima_lllite adapter type existed - the graph builder ignores them, so they must + // warn instead of silently no-oping. + warnings.push(WARNINGS.UNSUPPORTED_MODEL); } else if (entity.controlAdapter.model.base !== model.base) { // Supported model architecture but doesn't match warnings.push(WARNINGS.CONTROL_ADAPTER_INCOMPATIBLE_BASE_MODEL); @@ -197,6 +204,19 @@ export const getControlLayerWarnings = ( ) { // FLUX inpaint variants are FLUX Fill models - not compatible w/ Control LoRA warnings.push(WARNINGS.FLUX_FILL_NO_WORKY_WITH_CONTROL_LORA); + } else if (entity.controlAdapter.type === 'anima_lllite' && controlLayers) { + // Each Anima ControlNet-LLLite model may only be applied once per generation - the backend rejects duplicates + const modelKey = entity.controlAdapter.model.key; + const hasDuplicate = controlLayers.some( + (other) => + other.id !== entity.id && + other.isEnabled && + other.controlAdapter.type === 'anima_lllite' && + other.controlAdapter.model?.key === modelKey + ); + if (hasDuplicate) { + warnings.push(WARNINGS.CONTROL_ADAPTER_DUPLICATE_ANIMA_LLLITE_MODEL); + } } } diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addControlAdapters.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addControlAdapters.ts index f867ff5c41e..e0521cf6fef 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addControlAdapters.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addControlAdapters.ts @@ -281,3 +281,77 @@ const addZImageControlToGraph = ( g.addEdge(zImageControl, 'control', denoise, 'control'); }; + +type AddAnimaLLLiteControlArg = { + manager: CanvasManager; + entities: CanvasControlLayerState[]; + g: Graph; + rect: Rect; + collect: Invocation<'collect'>; + model: MainModelConfig; +}; + +type AddAnimaLLLiteControlResult = { + addedAnimaLLLiteControls: number; +}; + +export const addAnimaLLLiteControl = async ({ + manager, + entities, + g, + rect, + collect, + model, +}: AddAnimaLLLiteControlArg): Promise => { + const validControlLayers = entities + .filter((entity) => entity.isEnabled) + .filter((entity) => entity.controlAdapter.type === 'anima_lllite') + .filter((entity) => getControlLayerWarnings(entity, model, entities).length === 0); + + const result: AddAnimaLLLiteControlResult = { + addedAnimaLLLiteControls: 0, + }; + + for (const layer of validControlLayers) { + const getImageDTOResult = await withResultAsync(() => { + const adapter = manager.adapters.controlLayers.get(layer.id); + assert(adapter, 'Adapter not found'); + return adapter.renderer.rasterize({ rect, attrs: { opacity: 1, filters: [] }, bg: 'black' }); + }); + if (getImageDTOResult.isErr()) { + log.warn({ error: serializeError(getImageDTOResult.error) }, 'Error rasterizing Anima control layer'); + continue; + } + + const imageDTO = getImageDTOResult.value; + addAnimaLLLiteControlToGraph(g, layer, imageDTO, collect); + result.addedAnimaLLLiteControls++; + } + + return result; +}; + +const addAnimaLLLiteControlToGraph = ( + g: Graph, + layer: CanvasControlLayerState, + imageDTO: ImageDTO, + collect: Invocation<'collect'> +) => { + const { id, controlAdapter } = layer; + assert(controlAdapter.type === 'anima_lllite'); + const { model, weight, beginEndStepPct } = controlAdapter; + assert(model !== null); + const { image_name } = imageDTO; + + const animaLLLite = g.addNode({ + id: `anima_lllite_${id}`, + type: 'anima_lllite', + control_model: model, + weight, + begin_step_percent: beginEndStepPct[0], + end_step_percent: beginEndStepPct[1], + image: { image_name }, + }); + + g.addEdge(animaLLLite, 'control', collect, 'item'); +}; diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addInpaint.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addInpaint.ts index 1d7b2da5731..51ac7c8d6b3 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addInpaint.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addInpaint.ts @@ -39,6 +39,8 @@ type AddInpaintArg = { vaeSource: Invocation; modelLoader: Invocation; seed: Invocation<'integer'>; + // Collect node that fans LLLite adapters into denoise.control_lllite (Anima only) + controlLLLiteCollect?: Invocation<'collect'> | null; }; export const addInpaint = async ({ @@ -52,6 +54,7 @@ export const addInpaint = async ({ vaeSource, modelLoader, seed, + controlLLLiteCollect, }: AddInpaintArg): Promise> => { const { denoising_start, denoising_end } = getDenoisingStartAndEnd(state); denoise.denoising_start = denoising_start; @@ -198,6 +201,7 @@ export const addInpaint = async ({ g.addEdge(createGradientMask, 'denoise_mask', denoise, 'denoise_mask'); if (denoise.type === 'anima_denoise' && params.animaLLLiteModel) { + assert(controlLLLiteCollect, 'A control_lllite collect node is required for the Anima inpaint adapter'); // The canvas denoise-limit composite is white = keep / black = inpaint, but the LLLite // adapter expects white = inpaint — invert before wiring. const invertAnimaLLLiteMask = g.addNode({ @@ -215,7 +219,7 @@ export const addInpaint = async ({ }); g.addEdge(resizeImageToScaledSize, 'image', animaLLLite, 'image'); g.addEdge(invertAnimaLLLiteMask, 'image', animaLLLite, 'mask'); - g.addEdge(animaLLLite, 'control', denoise, 'control_lllite'); + g.addEdge(animaLLLite, 'control', controlLLLiteCollect, 'item'); } // After denoising, resize the image and mask back to original size @@ -291,6 +295,7 @@ export const addInpaint = async ({ g.addEdge(createGradientMask, 'denoise_mask', denoise, 'denoise_mask'); if (denoise.type === 'anima_denoise' && params.animaLLLiteModel) { + assert(controlLLLiteCollect, 'A control_lllite collect node is required for the Anima inpaint adapter'); // The canvas denoise-limit composite is white = keep / black = inpaint, but the LLLite // adapter expects white = inpaint — invert before wiring. const invertAnimaLLLiteMask = g.addNode({ @@ -308,7 +313,7 @@ export const addInpaint = async ({ weight: params.animaLLLiteWeight, }); g.addEdge(invertAnimaLLLiteMask, 'image', animaLLLite, 'mask'); - g.addEdge(animaLLLite, 'control', denoise, 'control_lllite'); + g.addEdge(animaLLLite, 'control', controlLLLiteCollect, 'item'); } const expandMask = g.addNode({ diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addOutpaint.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addOutpaint.ts index c7ab8be2b7e..fa362fb095e 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addOutpaint.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addOutpaint.ts @@ -32,6 +32,8 @@ type AddOutpaintArg = { vaeSource: Invocation; modelLoader: Invocation; seed: Invocation<'integer'>; + // Collect node that fans LLLite adapters into denoise.control_lllite (Anima only) + controlLLLiteCollect?: Invocation<'collect'> | null; }; export const addOutpaint = async ({ @@ -45,6 +47,7 @@ export const addOutpaint = async ({ vaeSource, modelLoader, seed, + controlLLLiteCollect, }: AddOutpaintArg): Promise> => { const { denoising_start, denoising_end } = getDenoisingStartAndEnd(state); denoise.denoising_start = denoising_start; @@ -165,6 +168,7 @@ export const addOutpaint = async ({ g.addEdge(createGradientMask, 'denoise_mask', denoise, 'denoise_mask'); if (denoise.type === 'anima_denoise' && params.animaLLLiteModel) { + assert(controlLLLiteCollect, 'A control_lllite collect node is required for the Anima inpaint adapter'); // The combined canvas mask is white = keep / black = region-to-generate, but the LLLite // adapter expects white = inpaint — invert before wiring. const invertAnimaLLLiteMask = g.addNode({ @@ -182,7 +186,7 @@ export const addOutpaint = async ({ }); g.addEdge(infill, 'image', animaLLLite, 'image'); g.addEdge(invertAnimaLLLiteMask, 'image', animaLLLite, 'mask'); - g.addEdge(animaLLLite, 'control', denoise, 'control_lllite'); + g.addEdge(animaLLLite, 'control', controlLLLiteCollect, 'item'); } // If we have a noise mask, apply it to the input image before i2l conversion @@ -313,6 +317,7 @@ export const addOutpaint = async ({ g.addEdge(createGradientMask, 'denoise_mask', denoise, 'denoise_mask'); if (denoise.type === 'anima_denoise' && params.animaLLLiteModel) { + assert(controlLLLiteCollect, 'A control_lllite collect node is required for the Anima inpaint adapter'); // The combined canvas mask is white = keep / black = region-to-generate, but the LLLite // adapter expects white = inpaint — invert before wiring. const invertAnimaLLLiteMask = g.addNode({ @@ -330,7 +335,7 @@ export const addOutpaint = async ({ }); g.addEdge(infill, 'image', animaLLLite, 'image'); g.addEdge(invertAnimaLLLiteMask, 'image', animaLLLite, 'mask'); - g.addEdge(animaLLLite, 'control', denoise, 'control_lllite'); + g.addEdge(animaLLLite, 'control', controlLLLiteCollect, 'item'); } const expandMask = g.addNode({ diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildAnimaGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildAnimaGraph.ts index 793ddb21b86..b48db252f12 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildAnimaGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildAnimaGraph.ts @@ -10,6 +10,7 @@ import { import { selectCanvasMetadata, selectCanvasSlice } from 'features/controlLayers/store/selectors'; import { fetchModelConfigWithTypeGuard } from 'features/metadata/util/modelFetchingHelpers'; import { addAnimaLoRAs } from 'features/nodes/util/graph/generation/addAnimaLoRAs'; +import { addAnimaLLLiteControl } from 'features/nodes/util/graph/generation/addControlAdapters'; import { addImageToImage } from 'features/nodes/util/graph/generation/addImageToImage'; import { addInpaint } from 'features/nodes/util/graph/generation/addInpaint'; import { addNSFWChecker } from 'features/nodes/util/graph/generation/addNSFWChecker'; @@ -175,6 +176,25 @@ export const buildAnimaGraph = async (arg: GraphBuilderArg): Promise + entity.isEnabled && entity.controlAdapter.type === 'anima_lllite' && entity.controlAdapter.model !== null + ); + const hasInpaintAdapter = + (generationMode === 'inpaint' || generationMode === 'outpaint') && params.animaLLLiteModel !== null; + + let controlLLLiteCollect: Invocation<'collect'> | null = null; + if (hasAnimaControlLayers || hasInpaintAdapter) { + controlLLLiteCollect = g.addNode({ + type: 'collect', + id: getPrefixedId('control_lllite_collect'), + }); + } + let canvasOutput: Invocation = l2i; if (generationMode === 'txt2img') { @@ -219,6 +239,7 @@ export const buildAnimaGraph = async (arg: GraphBuilderArg): Promise>(false); } + // Add control layers for all generation modes, then wire the collect node into the denoise node. + // The inpaint adapter (if any) was already wired into the collect node by addInpaint/addOutpaint. + if (controlLLLiteCollect !== null) { + let addedLLLiteAdapters = hasInpaintAdapter ? 1 : 0; + if (manager !== null) { + const animaControlResult = await addAnimaLLLiteControl({ + manager, + entities: canvas.controlLayers.entities, + g, + rect: canvas.bbox.rect, + collect: controlLLLiteCollect, + model, + }); + addedLLLiteAdapters += animaControlResult.addedAnimaLLLiteControls; + } + if (addedLLLiteAdapters > 0) { + g.addEdge(controlLLLiteCollect, 'collection', denoise, 'control_lllite'); + } else { + g.deleteNode(controlLLLiteCollect.id); + } + } + if (state.system.shouldUseNSFWChecker) { canvasOutput = addNSFWChecker(g, canvasOutput); } diff --git a/invokeai/frontend/web/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx b/invokeai/frontend/web/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx index 99fed8c019d..f7db015abbd 100644 --- a/invokeai/frontend/web/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx +++ b/invokeai/frontend/web/src/features/parameters/components/Advanced/ParamAnimaModelSelect.tsx @@ -24,7 +24,7 @@ import { zModelIdentifierField } from 'features/nodes/types/common'; import { memo, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import { - useAnimaControlNetModels, + useAnimaInpaintControlNetModels, useAnimaQwen3EncoderModels, useAnimaVAEModels, } from 'services/api/hooks/modelsByType'; @@ -125,7 +125,7 @@ const ParamAnimaLLLiteModelSelect = memo(() => { const dispatch = useAppDispatch(); const { t } = useTranslation(); const animaLLLiteModel = useAppSelector(selectAnimaLLLiteModel); - const [modelConfigs, { isLoading }] = useAnimaControlNetModels(); + const [modelConfigs, { isLoading }] = useAnimaInpaintControlNetModels(); const _onChange = useCallback( (model: ControlNetModelConfig | null) => { diff --git a/invokeai/frontend/web/src/features/queue/store/readiness.ts b/invokeai/frontend/web/src/features/queue/store/readiness.ts index 84bc374158f..1e40cc6ce18 100644 --- a/invokeai/frontend/web/src/features/queue/store/readiness.ts +++ b/invokeai/frontend/web/src/features/queue/store/readiness.ts @@ -819,7 +819,7 @@ export const getReasonsWhyCannotEnqueueCanvasTab = (arg: { const layerNumber = i + 1; const layerType = i18n.t(LAYER_TYPE_TO_TKEY['control_layer']); const prefix = `${layerLiteral} #${layerNumber} (${layerType})`; - const problems = getControlLayerWarnings(controlLayer, model); + const problems = getControlLayerWarnings(controlLayer, model, enabledControlLayers); if (problems.length) { const content = upperFirst(problems.map((p) => i18n.t(p)).join(', ')); diff --git a/invokeai/frontend/web/src/services/api/hooks/modelsByType.ts b/invokeai/frontend/web/src/services/api/hooks/modelsByType.ts index e495b998652..07e89a305d4 100644 --- a/invokeai/frontend/web/src/services/api/hooks/modelsByType.ts +++ b/invokeai/frontend/web/src/services/api/hooks/modelsByType.ts @@ -11,7 +11,7 @@ import { } from 'services/api/endpoints/models'; import type { AnyModelConfig, AnyModelConfigWithExternal, MainOrExternalModelConfig } from 'services/api/types'; import { - isAnimaControlNetModelConfig, + isAnimaInpaintControlNetModelConfig, isAnimaQwen3EncoderModelConfig, isAnimaVAEModelConfig, isCLIPEmbedModelConfigOrSubmodel, @@ -106,7 +106,7 @@ export const useFlux1VAEModels = () => buildModelsHook(isFlux1VAEModelConfig)(); export const useFlux2VAEModels = () => buildModelsHook(isFlux2VAEModelConfig)(); export const useAnimaVAEModels = () => buildModelsHook(isAnimaVAEModelConfig)(); export const useAnimaQwen3EncoderModels = () => buildModelsHook(isAnimaQwen3EncoderModelConfig)(); -export const useAnimaControlNetModels = () => buildModelsHook(isAnimaControlNetModelConfig)(); +export const useAnimaInpaintControlNetModels = () => buildModelsHook(isAnimaInpaintControlNetModelConfig)(); export const useZImageDiffusersModels = () => buildModelsHook(isZImageDiffusersMainModelConfig)(); export const useFlux2DiffusersModels = () => buildModelsHook(isFlux2DiffusersMainModelConfig)(); export const useQwenImageDiffusersModels = () => buildModelsHook(isQwenImageDiffusersMainModelConfig)(); diff --git a/invokeai/frontend/web/src/services/api/schema.ts b/invokeai/frontend/web/src/services/api/schema.ts index 7d9c8c23966..489eee5fb67 100644 --- a/invokeai/frontend/web/src/services/api/schema.ts +++ b/invokeai/frontend/web/src/services/api/schema.ts @@ -3182,10 +3182,11 @@ export type components = { */ seed?: number; /** - * @description Anima ControlNet-LLLite conditioning (e.g. inpaint adapter). + * Control Lllite + * @description Anima ControlNet-LLLite conditioning (e.g. inpaint adapter, control layers). Adapters are applied in a deterministic order (sorted by model key); each model may be used at most once. * @default null */ - control_lllite?: components["schemas"]["AnimaLLLiteField"] | null; + control_lllite?: components["schemas"]["AnimaLLLiteField"] | components["schemas"]["AnimaLLLiteField"][] | null; /** * Scheduler * @description Scheduler (sampler) for the denoising process. @@ -7002,6 +7003,11 @@ export type components = { */ base: "anima"; default_settings: components["schemas"]["ControlAdapterDefaultSettings"] | null; + /** + * Cond In Channels + * @description Number of conditioning image channels (3 = RGB control image, 4 = RGB + inpaint mask). None for models installed before this field was recorded. + */ + cond_in_channels: number | null; }; /** ControlNet_Checkpoint_FLUX_Config */ ControlNet_Checkpoint_FLUX_Config: { diff --git a/invokeai/frontend/web/src/services/api/types.ts b/invokeai/frontend/web/src/services/api/types.ts index 54c622575ba..34d0470db45 100644 --- a/invokeai/frontend/web/src/services/api/types.ts +++ b/invokeai/frontend/web/src/services/api/types.ts @@ -103,6 +103,7 @@ export type ControlLoRAModelConfig = Extract; export type VAEModelConfig = Extract; export type ControlNetModelConfig = Extract; +type AnimaControlNetModelConfig = Extract; export type IPAdapterModelConfig = Extract; export type T2IAdapterModelConfig = Extract; export type CLIPLEmbedModelConfig = Extract; @@ -325,13 +326,26 @@ export const isControlNetModelConfig = (config: AnyModelConfig): config is Contr return config.type === 'controlnet'; }; -export const isAnimaControlNetModelConfig = (config: AnyModelConfig): config is ControlNetModelConfig => { +export const isAnimaControlNetModelConfig = (config: AnyModelConfig): config is AnimaControlNetModelConfig => { return config.type === 'controlnet' && config.base === 'anima'; }; +export const isAnimaInpaintControlNetModelConfig = (config: AnyModelConfig): config is AnimaControlNetModelConfig => { + // 4-channel (RGB + mask) variants are inpaint adapters. Models with a null cond_in_channels were installed before + // the field was recorded - only the inpaint variant predates it, so treat them as inpaint adapters too. (A 3ch + // model installed from a pre-release dev build also reads as null and must be reinstalled to register as a + // control layer model.) + return isAnimaControlNetModelConfig(config) && config.cond_in_channels !== 3; +}; + export const isControlLayerModelConfig = ( config: AnyModelConfig ): config is ControlNetModelConfig | T2IAdapterModelConfig | ControlLoRAModelConfig => { + if (isAnimaControlNetModelConfig(config)) { + // Only the 3-channel (general control) Anima ControlNet-LLLite variants are usable as control layers; 4-channel + // and legacy (null cond_in_channels) variants are inpaint adapters. + return config.cond_in_channels === 3; + } return config.type === 'controlnet' || config.type === 't2i_adapter' || config.type === 'control_lora'; }; From 0d5eca0c5b5dc273222c98787b3fc7be6e630e1d Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 10 Jun 2026 01:20:06 -0400 Subject: [PATCH 08/10] chore: regenerate openapi.json for Anima LLLite schemas Co-Authored-By: Claude Fable 5 --- invokeai/frontend/web/openapi.json | 455 ++++++++++++++++++++++++++++- 1 file changed, 454 insertions(+), 1 deletion(-) diff --git a/invokeai/frontend/web/openapi.json b/invokeai/frontend/web/openapi.json index 4d47961d594..5a5f15e9459 100644 --- a/invokeai/frontend/web/openapi.json +++ b/invokeai/frontend/web/openapi.json @@ -888,6 +888,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_ZImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -1206,6 +1209,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_ZImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -1524,6 +1530,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_ZImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -1892,6 +1901,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_ZImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -2284,6 +2296,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_ZImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -3496,6 +3511,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_ZImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -10609,6 +10627,29 @@ "title": "Seed", "type": "integer" }, + "control_lllite": { + "anyOf": [ + { + "$ref": "#/components/schemas/AnimaLLLiteField" + }, + { + "items": { + "$ref": "#/components/schemas/AnimaLLLiteField" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Anima ControlNet-LLLite conditioning (e.g. inpaint adapter, control layers). Adapters are applied in a deterministic order (sorted by model key); each model may be used at most once.", + "field_kind": "input", + "input": "connection", + "orig_default": null, + "orig_required": false, + "title": "Control Lllite" + }, "scheduler": { "default": "euler", "description": "Scheduler (sampler) for the denoising process.", @@ -10640,7 +10681,7 @@ "tags": ["image", "anima"], "title": "Denoise - Anima", "type": "object", - "version": "1.6.0", + "version": "1.8.0", "output": { "$ref": "#/components/schemas/LatentsOutput" } @@ -10755,6 +10796,215 @@ "$ref": "#/components/schemas/LatentsOutput" } }, + "AnimaLLLiteField": { + "description": "An Anima ControlNet-LLLite conditioning field (e.g. inpaint adapter).", + "properties": { + "image_name": { + "description": "The name of the conditioning image (the initial/raster image)", + "title": "Image Name", + "type": "string" + }, + "mask_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The name of the inpaint mask image (white = inpaint area)", + "title": "Mask Name" + }, + "control_model": { + "$ref": "#/components/schemas/ModelIdentifierField", + "description": "The Anima ControlNet-LLLite adapter model" + }, + "weight": { + "default": 1.0, + "description": "The strength of the LLLite adapter", + "maximum": 10.0, + "minimum": -10.0, + "title": "Weight", + "type": "number" + }, + "begin_step_percent": { + "default": 0.0, + "description": "When the adapter is first applied (% of total steps)", + "maximum": 1.0, + "minimum": 0.0, + "title": "Begin Step Percent", + "type": "number" + }, + "end_step_percent": { + "default": 1.0, + "description": "When the adapter is last applied (% of total steps)", + "maximum": 1.0, + "minimum": 0.0, + "title": "End Step Percent", + "type": "number" + } + }, + "required": ["image_name", "control_model"], + "title": "AnimaLLLiteField", + "type": "object" + }, + "AnimaLLLiteInvocation": { + "category": "conditioning", + "class": "invocation", + "classification": "prototype", + "description": "Configure an Anima ControlNet-LLLite adapter for model-level conditioning.\n\nTakes a conditioning image (the initial/raster image), an optional inpaint\nmask (white = area to inpaint), and a LLLite adapter model. Inpainting\nadapters (4-channel conditioning) require a mask; other adapters ignore it.", + "node_pack": "invokeai", + "properties": { + "id": { + "description": "The id of this instance of an invocation. Must be unique among all instances of invocations.", + "field_kind": "node_attribute", + "title": "Id", + "type": "string" + }, + "is_intermediate": { + "default": false, + "description": "Whether or not this is an intermediate invocation.", + "field_kind": "node_attribute", + "input": "direct", + "orig_required": true, + "title": "Is Intermediate", + "type": "boolean", + "ui_hidden": false, + "ui_type": "IsIntermediate" + }, + "use_cache": { + "default": true, + "description": "Whether or not to use the cache", + "field_kind": "node_attribute", + "title": "Use Cache", + "type": "boolean" + }, + "image": { + "anyOf": [ + { + "$ref": "#/components/schemas/ImageField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The conditioning image (the initial/raster image for inpainting)", + "field_kind": "input", + "input": "any", + "orig_required": true + }, + "mask": { + "anyOf": [ + { + "$ref": "#/components/schemas/ImageField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The inpaint mask (white = area to inpaint). Required by inpainting adapters.", + "field_kind": "input", + "input": "any", + "orig_default": null, + "orig_required": false + }, + "control_model": { + "anyOf": [ + { + "$ref": "#/components/schemas/ModelIdentifierField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "ControlNet model to load", + "field_kind": "input", + "input": "any", + "orig_required": true, + "title": "Control Model", + "ui_model_base": ["anima"], + "ui_model_type": ["controlnet"] + }, + "weight": { + "default": 1.0, + "description": "Strength of the LLLite adapter.", + "field_kind": "input", + "input": "any", + "maximum": 10.0, + "minimum": -10.0, + "orig_default": 1.0, + "orig_required": false, + "title": "Weight", + "type": "number" + }, + "begin_step_percent": { + "default": 0.0, + "description": "When the adapter is first applied (% of total steps)", + "field_kind": "input", + "input": "any", + "maximum": 1.0, + "minimum": 0.0, + "orig_default": 0.0, + "orig_required": false, + "title": "Begin Step Percent", + "type": "number" + }, + "end_step_percent": { + "default": 1.0, + "description": "When the adapter is last applied (% of total steps)", + "field_kind": "input", + "input": "any", + "maximum": 1.0, + "minimum": 0.0, + "orig_default": 1.0, + "orig_required": false, + "title": "End Step Percent", + "type": "number" + }, + "type": { + "const": "anima_lllite", + "default": "anima_lllite", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["type", "id"], + "tags": ["image", "anima", "control", "controlnet", "inpaint"], + "title": "Anima ControlNet-LLLite", + "type": "object", + "version": "1.0.0", + "output": { + "$ref": "#/components/schemas/AnimaLLLiteOutput" + } + }, + "AnimaLLLiteOutput": { + "class": "output", + "description": "Anima ControlNet-LLLite output containing adapter configuration.", + "properties": { + "control": { + "$ref": "#/components/schemas/AnimaLLLiteField", + "description": "Anima ControlNet-LLLite conditioning", + "field_kind": "output", + "ui_hidden": false + }, + "type": { + "const": "anima_lllite_output", + "default": "anima_lllite_output", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["output_meta", "control", "type", "type"], + "title": "AnimaLLLiteOutput", + "type": "object" + }, "AnimaLatentsToImageInvocation": { "category": "latents", "class": "invocation", @@ -11452,6 +11702,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_ZImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -17436,6 +17689,166 @@ "title": "ControlNetRecallParameter", "description": "ControlNet configuration for recall" }, + "ControlNet_Checkpoint_Anima_Config": { + "properties": { + "key": { + "type": "string", + "title": "Key", + "description": "A unique key for this model." + }, + "hash": { + "type": "string", + "title": "Hash", + "description": "The hash of the model file(s)." + }, + "path": { + "type": "string", + "title": "Path", + "description": "Path to the model on the filesystem. Relative paths are relative to the Invoke root directory." + }, + "file_size": { + "type": "integer", + "title": "File Size", + "description": "The size of the model in bytes." + }, + "name": { + "type": "string", + "title": "Name", + "description": "Name of the model." + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description", + "description": "Model description" + }, + "source": { + "type": "string", + "title": "Source", + "description": "The original source of the model (path, URL or repo_id)." + }, + "source_type": { + "$ref": "#/components/schemas/ModelSourceType", + "description": "The type of source" + }, + "source_api_response": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Source Api Response", + "description": "The original API response from the source, as stringified JSON." + }, + "source_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Source Url", + "description": "Optional URL for the model (e.g. download page or model page)." + }, + "cover_image": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Cover Image", + "description": "Url for image to preview model" + }, + "config_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Config Path", + "description": "Path to the config for this model, if any." + }, + "type": { + "type": "string", + "const": "controlnet", + "title": "Type", + "default": "controlnet" + }, + "format": { + "type": "string", + "const": "checkpoint", + "title": "Format", + "default": "checkpoint" + }, + "base": { + "type": "string", + "const": "anima", + "title": "Base", + "default": "anima" + }, + "default_settings": { + "anyOf": [ + { + "$ref": "#/components/schemas/ControlAdapterDefaultSettings" + }, + { + "type": "null" + } + ] + }, + "cond_in_channels": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Cond In Channels", + "description": "Number of conditioning image channels (3 = RGB control image, 4 = RGB + inpaint mask). None for models installed before this field was recorded." + } + }, + "type": "object", + "required": [ + "key", + "hash", + "path", + "file_size", + "name", + "description", + "source", + "source_type", + "source_api_response", + "source_url", + "cover_image", + "config_path", + "type", + "format", + "base", + "default_settings", + "cond_in_channels" + ], + "title": "ControlNet_Checkpoint_Anima_Config", + "description": "Model config for Anima ControlNet-LLLite adapter models (Safetensors checkpoint).\n\nAnima LLLite adapters are standalone adapters consisting of a shared conditioning trunk\n(lllite_conditioning1) that encodes a conditioning image, plus tiny per-Linear modules\n(lllite_dit_blocks_*) that perturb the inputs of target Linears in the Anima DiT." + }, "ControlNet_Checkpoint_FLUX_Config": { "properties": { "key": { @@ -28589,6 +29002,9 @@ { "$ref": "#/components/schemas/AnimaImageToLatentsInvocation" }, + { + "$ref": "#/components/schemas/AnimaLLLiteInvocation" + }, { "$ref": "#/components/schemas/AnimaLatentsToImageInvocation" }, @@ -29396,6 +29812,9 @@ { "$ref": "#/components/schemas/AnimaConditioningOutput" }, + { + "$ref": "#/components/schemas/AnimaLLLiteOutput" + }, { "$ref": "#/components/schemas/AnimaLoRALoaderOutput" }, @@ -36077,6 +36496,9 @@ { "$ref": "#/components/schemas/AnimaImageToLatentsInvocation" }, + { + "$ref": "#/components/schemas/AnimaLLLiteInvocation" + }, { "$ref": "#/components/schemas/AnimaLatentsToImageInvocation" }, @@ -36841,6 +37263,9 @@ { "$ref": "#/components/schemas/AnimaConditioningOutput" }, + { + "$ref": "#/components/schemas/AnimaLLLiteOutput" + }, { "$ref": "#/components/schemas/AnimaLoRALoaderOutput" }, @@ -37206,6 +37631,9 @@ { "$ref": "#/components/schemas/AnimaImageToLatentsInvocation" }, + { + "$ref": "#/components/schemas/AnimaLLLiteInvocation" + }, { "$ref": "#/components/schemas/AnimaLatentsToImageInvocation" }, @@ -38019,6 +38447,9 @@ "anima_l2i": { "$ref": "#/components/schemas/ImageOutput" }, + "anima_lllite": { + "$ref": "#/components/schemas/AnimaLLLiteOutput" + }, "anima_lora_collection_loader": { "$ref": "#/components/schemas/AnimaLoRALoaderOutput" }, @@ -38774,6 +39205,7 @@ "anima_denoise", "anima_i2l", "anima_l2i", + "anima_lllite", "anima_lora_collection_loader", "anima_lora_loader", "anima_model_loader", @@ -39103,6 +39535,9 @@ { "$ref": "#/components/schemas/AnimaImageToLatentsInvocation" }, + { + "$ref": "#/components/schemas/AnimaLLLiteInvocation" + }, { "$ref": "#/components/schemas/AnimaLatentsToImageInvocation" }, @@ -39990,6 +40425,9 @@ { "$ref": "#/components/schemas/AnimaImageToLatentsInvocation" }, + { + "$ref": "#/components/schemas/AnimaLLLiteInvocation" + }, { "$ref": "#/components/schemas/AnimaLatentsToImageInvocation" }, @@ -54746,6 +55184,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_ZImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -55315,6 +55756,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_ZImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -55769,6 +56213,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_ZImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -56073,6 +56520,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_ZImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, @@ -56826,6 +57276,9 @@ { "$ref": "#/components/schemas/ControlNet_Checkpoint_ZImage_Config" }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_Anima_Config" + }, { "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" }, From ab29e89c6ed92eb30b75ad6873d623d36f0f61d6 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 18 Jun 2026 00:52:41 -0400 Subject: [PATCH 09/10] test(anima): cover LLLite step-range gate and control_lllite collect-node wiring MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backend: add tests for AnimaDenoiseInvocation._get_lllite_multiplier covering the floor/ceil step-window boundaries and inclusive endpoints. Frontend: add tests for the buildAnimaGraph control_lllite collect-node lifecycle — wired into denoise.control_lllite when an inpaint adapter is present, and not created when there is neither an adapter nor control layers. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../graph/generation/buildAnimaGraph.test.ts | 76 ++++++++++++++++++- .../backend/anima/test_control_net_lllite.py | 52 +++++++++++++ 2 files changed, 127 insertions(+), 1 deletion(-) diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildAnimaGraph.test.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildAnimaGraph.test.ts index 7bd93a99cd5..0adc4908a93 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildAnimaGraph.test.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildAnimaGraph.test.ts @@ -1,4 +1,4 @@ -import { afterEach, describe, expect, it, vi } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; vi.mock('app/logging/logger', () => ({ logger: () => ({ @@ -101,6 +101,9 @@ vi.mock('services/api/types', async () => { }; }); +import { selectCanvasSlice } from 'features/controlLayers/store/selectors'; +import { addInpaint } from 'features/nodes/util/graph/generation/addInpaint'; + import { buildAnimaGraph } from './buildAnimaGraph'; describe('buildAnimaGraph', () => { @@ -213,4 +216,75 @@ describe('buildAnimaGraph', () => { expect(nodeTypes).toContain('anima_denoise'); }); }); + + // The collect-node lifecycle in buildAnimaGraph: a single control_lllite collect node is created + // when an inpaint adapter and/or control layers are present, wired into denoise.control_lllite when + // it has at least one feeder, and otherwise never created. The per-adapter edges (image + inverted + // mask) live inside addInpaint/addOutpaint, which are mocked here, so they are not asserted. + describe('Anima LLLite collect node', () => { + // Non-null manager triggers the inpaint branch; entities are empty so addAnimaLLLiteControl adds + // nothing and never touches the manager. + const manager = { id: 'test-manager' } as never; + const inpaintCanvas = { + controlLayers: { entities: [] }, + regionalGuidance: { entities: [] }, + bbox: { rect: { x: 0, y: 0, width: 512, height: 512 } }, + }; + + const buildInpaintGraph = () => + buildAnimaGraph({ + generationMode: 'inpaint', + manager, + state: { + system: { + shouldUseNSFWChecker: false, + shouldUseWatermarker: false, + }, + }, + } as never); + + beforeEach(() => { + vi.mocked(selectCanvasSlice).mockReturnValue(inpaintCanvas as never); + // addInpaint is mocked; return the real l2i node it receives so it is a valid canvas output. + vi.mocked(addInpaint).mockImplementation((async ({ l2i }) => l2i) as never); + }); + + afterEach(() => { + vi.mocked(selectCanvasSlice).mockReturnValue({} as never); + vi.mocked(addInpaint).mockReset(); + }); + + it('wires the collect node into denoise.control_lllite when an inpaint adapter is present', async () => { + params = { ...defaultParams, animaLLLiteModel: { key: 'lllite-key' } } as never; + + const { g } = await buildInpaintGraph(); + + const graph = g.getGraph(); + const collectId = Object.keys(graph.nodes).find((id) => id.startsWith('control_lllite_collect:')); + const denoiseId = Object.keys(graph.nodes).find((id) => id.startsWith('denoise_latents:')); + expect(collectId).toBeDefined(); + expect(denoiseId).toBeDefined(); + + const hasEdgeToDenoise = graph.edges.some( + (edge) => + edge.source.node_id === collectId && + edge.source.field === 'collection' && + edge.destination.node_id === denoiseId && + edge.destination.field === 'control_lllite' + ); + expect(hasEdgeToDenoise).toBe(true); + }); + + it('creates no collect node when there is no adapter and no control layers', async () => { + params = { ...defaultParams, animaLLLiteModel: null } as never; + + const { g } = await buildInpaintGraph(); + + const graph = g.getGraph(); + const hasCollectNode = Object.keys(graph.nodes).some((id) => id.startsWith('control_lllite_collect:')); + const hasControlLLLiteEdge = graph.edges.some((edge) => edge.destination.field === 'control_lllite'); + expect(hasCollectNode).toBe(false); + expect(hasControlLLLiteEdge).toBe(false); + }); + }); }); diff --git a/tests/backend/anima/test_control_net_lllite.py b/tests/backend/anima/test_control_net_lllite.py index 70b86f66c54..7b399c5f9b1 100644 --- a/tests/backend/anima/test_control_net_lllite.py +++ b/tests/backend/anima/test_control_net_lllite.py @@ -650,6 +650,58 @@ def test_normalize_control_lllite_rejects_duplicate_model_keys() -> None: AnimaDenoiseInvocation._normalize_control_lllite(pair) +# ---------------------------------------------------------------------------- +# Step-range gate (_get_lllite_multiplier) +# ---------------------------------------------------------------------------- + + +def _stepped_field(weight: float, begin_step_percent: float, end_step_percent: float) -> AnimaLLLiteField: + return AnimaLLLiteField( + image_name="cond_image", + control_model=ModelIdentifierField( + key="key-a", + hash="blake3:0000", + name="adapter", + base=BaseModelType.Anima, + type=ModelType.ControlNet, + ), + weight=weight, + begin_step_percent=begin_step_percent, + end_step_percent=end_step_percent, + ) + + +def test_lllite_multiplier_full_range_returns_weight() -> None: + """A 0%..100% window returns the field weight at every step, boundaries included.""" + field = _stepped_field(weight=0.7, begin_step_percent=0.0, end_step_percent=1.0) + for step_index in (0, 1, 10, 19, 20): + assert AnimaDenoiseInvocation._get_lllite_multiplier(field, step_index, total_steps=20) == 0.7 + + +def test_lllite_multiplier_zero_outside_window() -> None: + """A 25%..75% window over 20 steps gates to first_step=5, last_step=15 (both inclusive).""" + field = _stepped_field(weight=0.5, begin_step_percent=0.25, end_step_percent=0.75) + # Below the window. + assert AnimaDenoiseInvocation._get_lllite_multiplier(field, 4, total_steps=20) == 0.0 + # First applied step (floor(0.25 * 20) = 5) is inclusive. + assert AnimaDenoiseInvocation._get_lllite_multiplier(field, 5, total_steps=20) == 0.5 + assert AnimaDenoiseInvocation._get_lllite_multiplier(field, 10, total_steps=20) == 0.5 + # Last applied step (ceil(0.75 * 20) = 15) is inclusive. + assert AnimaDenoiseInvocation._get_lllite_multiplier(field, 15, total_steps=20) == 0.5 + # Above the window. + assert AnimaDenoiseInvocation._get_lllite_multiplier(field, 16, total_steps=20) == 0.0 + + +def test_lllite_multiplier_floor_ceil_rounding() -> None: + """A non-integer step boundary floors the start and ceils the end (widening, not truncating).""" + # 0.34 * 10 = 3.4 -> first_step = floor(3.4) = 3, last_step = ceil(3.4) = 4. + field = _stepped_field(weight=1.0, begin_step_percent=0.34, end_step_percent=0.34) + assert AnimaDenoiseInvocation._get_lllite_multiplier(field, 2, total_steps=10) == 0.0 + assert AnimaDenoiseInvocation._get_lllite_multiplier(field, 3, total_steps=10) == 1.0 + assert AnimaDenoiseInvocation._get_lllite_multiplier(field, 4, total_steps=10) == 1.0 + assert AnimaDenoiseInvocation._get_lllite_multiplier(field, 5, total_steps=10) == 0.0 + + # ---------------------------------------------------------------------------- # Real weight file (optional; skipped when the file is not present) # ---------------------------------------------------------------------------- From f4fa8fb569355a648d192c8ca97c992d7dd0d40a Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 18 Jun 2026 01:01:55 -0400 Subject: [PATCH 10/10] fix(test): type the addInpaint mock so lint:tsc passes The `as never` cast on the whole mock implementation erased the contextual type of its parameter, tripping no-implicit-any under `tsc --noEmit`. Type the arg via the real addInpaint signature and cast only the returned stand-in node; return a resolved Promise to avoid require-await. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../nodes/util/graph/generation/buildAnimaGraph.test.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildAnimaGraph.test.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildAnimaGraph.test.ts index 0adc4908a93..38b560ff60b 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildAnimaGraph.test.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildAnimaGraph.test.ts @@ -246,7 +246,9 @@ describe('buildAnimaGraph', () => { beforeEach(() => { vi.mocked(selectCanvasSlice).mockReturnValue(inpaintCanvas as never); // addInpaint is mocked; return the real l2i node it receives so it is a valid canvas output. - vi.mocked(addInpaint).mockImplementation((async ({ l2i }) => l2i) as never); + // addInpaint really returns the paste-back node; for the test the l2i node it receives is a + // sufficient (and valid) stand-in canvas output, hence the return cast. + vi.mocked(addInpaint).mockImplementation((arg) => Promise.resolve(arg.l2i as never)); }); afterEach(() => {