diff --git a/invokeai/app/api/dependencies.py b/invokeai/app/api/dependencies.py index b3ba3be75cf..3e9ae338c3d 100644 --- a/invokeai/app/api/dependencies.py +++ b/invokeai/app/api/dependencies.py @@ -69,6 +69,7 @@ FLUXConditioningInfo, Ideogram4ConditioningInfo, Krea2ConditioningInfo, + MiniMaxH3ConditioningInfo, QwenImageConditioningInfo, SD3ConditioningInfo, SDXLConditioningInfo, @@ -173,6 +174,7 @@ def initialize( Krea2ConditioningInfo, AnimaConditioningInfo, WanConditioningInfo, + MiniMaxH3ConditioningInfo, ], ephemeral=True, ), diff --git a/invokeai/app/invocations/fields.py b/invokeai/app/invocations/fields.py index 256b0f20376..8989b8fe98e 100644 --- a/invokeai/app/invocations/fields.py +++ b/invokeai/app/invocations/fields.py @@ -185,6 +185,10 @@ class FieldDescriptions: wan_model = "Wan 2.2 model (Transformer) to load" wan_t5_encoder = "UMT5-XXL tokenizer and text encoder for Wan 2.2" wan_ref_image = "Reference-image (VAE-latent) conditioning for Wan 2.2 I2V." + minimax_h3_model = "MiniMax H3 model (Transformer) to load" + minimax_h3_text_encoder = "Qwen3-VL-32B tokenizer, processor and text encoder for MiniMax H3" + minimax_h3_frame_conditioning = "First/last-keyframe (VAE-latent) conditioning for MiniMax H3" + minimax_h3_audio_vae = "Audio VAE (stereo, 32 kHz) for MiniMax H3" sdxl_main_model = "SDXL Main model (UNet, VAE, CLIP1, CLIP2) to load" sdxl_refiner_model = "SDXL Refiner Main Modde (UNet, VAE, CLIP2) to load" onnx_main_model = "ONNX Main model (UNet, VAE, CLIP) to load" @@ -444,6 +448,33 @@ class WanRefImageConditioningField(BaseModel): ) +class MiniMaxH3ConditioningField(BaseModel): + """A MiniMax H3 conditioning primitive value. + + H3 conditioning is the layer-50 Qwen3-VL hidden state plus the per-row modality tags the + packed-sequence layout is built from (vision-block rows are tagged as video). + """ + + conditioning_name: str = Field(description="The name of conditioning tensor") + + +class MiniMaxH3FrameConditioningField(BaseModel): + """First/last-keyframe conditioning for MiniMax H3 (FL2VA). + + Carries the CLEAN (not yet noise-augmented) packed keyframe conditioning rows; the denoise + node noise-augments them to t=0.999 with the request seed's first draws. Width/height ride + along so the denoise node can reject a canvas mismatch instead of failing inside the + transformer. + """ + + condition_rows_name: str = Field(description="Name of the saved (num_condition_rows, 96) rows tensor.") + keyframe_anchors: list[str] = Field( + description='Which end each keyframe anchors, in packed order ("first" / "last").' + ) + width: int = Field(description="Canvas width used during VAE encoding (matches denoise width).") + height: int = Field(description="Canvas height used during VAE encoding (matches denoise height).") + + class ConditioningField(BaseModel): """A conditioning tensor primitive value""" diff --git a/invokeai/app/invocations/metadata.py b/invokeai/app/invocations/metadata.py index 5c882660b7d..ae55ca8dc77 100644 --- a/invokeai/app/invocations/metadata.py +++ b/invokeai/app/invocations/metadata.py @@ -185,6 +185,9 @@ def invoke(self, context: InvocationContext) -> MetadataOutput: "wan_inpaint", "wan_outpaint", "wan_i2v", + "minimax_h3_t2v", + "minimax_h3_i2v", + "minimax_h3_txt2img", ] diff --git a/invokeai/app/invocations/minimax_h3_denoise.py b/invokeai/app/invocations/minimax_h3_denoise.py new file mode 100644 index 00000000000..2c63fd27d4f --- /dev/null +++ b/invokeai/app/invocations/minimax_h3_denoise.py @@ -0,0 +1,268 @@ +"""MiniMax H3 denoise invocation (T2VA / FL2VA). + +One packed sequence carries the text conditioning, the optional keyframe conditioning rows, +the audio latents and the video latents through a single transformer forward per step; video +and audio step down two different flow schedules (shift 12.0 / 3.0). The checkpoint is +guidance-distilled: no negative prompt, no CFG, one forward per step. +""" + +import torch +from tqdm import tqdm + +from invokeai.app.invocations.baseinvocation import ( + BaseInvocation, + BaseInvocationOutput, + Classification, + invocation, + invocation_output, +) +from invokeai.app.invocations.fields import ( + FieldDescriptions, + Input, + InputField, + LatentsField, + MiniMaxH3ConditioningField, + MiniMaxH3FrameConditioningField, + OutputField, +) +from invokeai.app.invocations.model import MiniMaxH3TransformerField +from invokeai.app.services.shared.invocation_context import InvocationContext +from invokeai.backend.minimax_h3.denoise import denoise +from invokeai.backend.minimax_h3.packing import ( + MINIMAX_H3_CANVAS_MULTIPLE, + MiniMaxH3PackedSequence, + audio_latent_num_frames, + unpack_audio_tokens, + unpatchify_video_tokens, + video_latent_num_frames, +) +from invokeai.backend.minimax_h3.sampling import ( + MINIMAX_H3_PATCH_SIZE, + MINIMAX_H3_SPATIAL_COMPRESSION, + MINIMAX_H3_VAE_LATENT_CHANNELS, + build_denoise_state, + validate_num_frames, +) +from invokeai.backend.minimax_h3.transformer_minimax_h3 import MiniMaxH3Transformer3DModel +from invokeai.backend.model_manager.taxonomy import BaseModelType +from invokeai.backend.stable_diffusion.diffusers_pipeline import PipelineIntermediateState +from invokeai.backend.stable_diffusion.diffusion.conditioning_data import MiniMaxH3ConditioningInfo +from invokeai.backend.util.devices import TorchDevice + + +@invocation_output("minimax_h3_denoise_output") +class MiniMaxH3DenoiseOutput(BaseInvocationOutput): + """Joint video + audio latents from one MiniMax H3 denoise run.""" + + video_latents: LatentsField = OutputField(description="5D video latents [1, 24, T_lat, H/16, W/16].") + audio_latents: LatentsField = OutputField( + description="Audio latents [2, 32, T_audio] (one item per stereo channel)." + ) + width: int = OutputField(description="Pixel width of the video latents.") + height: int = OutputField(description="Pixel height of the video latents.") + num_frames: int = OutputField(description="Pixel-frame count of the video latents.") + + +@invocation( + "minimax_h3_denoise", + title="Denoise - MiniMax H3", + tags=["latents", "video", "audio", "minimax"], + category="latents", + version="1.0.0", + classification=Classification.Prototype, +) +class MiniMaxH3DenoiseInvocation(BaseInvocation): + """Run the MiniMax H3 joint audio-video denoising loop.""" + + transformer: MiniMaxH3TransformerField = InputField( + description="MiniMax H3 FL2VA transformer.", input=Input.Connection, title="Transformer" + ) + positive_conditioning: MiniMaxH3ConditioningField = InputField( + description=FieldDescriptions.positive_cond, input=Input.Connection + ) + frame_conditioning: MiniMaxH3FrameConditioningField | None = InputField( + default=None, + description=FieldDescriptions.minimax_h3_frame_conditioning, + input=Input.Connection, + title="Frame Conditioning", + ) + width: int = InputField( + default=1344, + gt=0, + multiple_of=MINIMAX_H3_CANVAS_MULTIPLE, + description="Width of the generated video. H3's native canvas has a 768px short edge (max 768x1344).", + ) + height: int = InputField( + default=768, + gt=0, + multiple_of=MINIMAX_H3_CANVAS_MULTIPLE, + description="Height of the generated video.", + ) + num_frames: int = InputField( + default=124, + ge=5, + description="Number of output frames at the fixed 24 fps. Must be of the form 17n+5 " + "(5, 22, ..., 124, ...); durations must stay within 5-15 s, except exactly 5 frames " + "for a still image.", + title="Number of Frames", + ) + steps: int = InputField( + default=50, + ge=2, + description="Number of denoising steps (sigma grid points, terminal included: N steps = N-1 model evaluations).", + ) + seed: int = InputField(default=0, description="Randomness seed for reproducibility.") + + @staticmethod + def _estimate_working_memory(layout: MiniMaxH3PackedSequence) -> int: + """Estimate peak transformer activation memory (bytes) so the model cache reserves enough headroom. + + The 61.7 GiB bf16 transformer is partially loaded on most cards; without this hint the cache + reserves only the small default working memory, packs the device with weights, and the first + forward OOMs (a 124-frame 768x1344 t2v is a ~38k-row packed sequence). + + Attention runs through SDPA without materializing scores, so activations scale ~linearly with + the packed row count. The dominant per-row bf16 terms concurrently alive inside one block are + QKV/attention-out at the 7168-wide attention inner dim and the SwiGLU intermediates at + ffn_dim 14336 (~0.16 MiB/row measured together with the residual stream and the fp32 output + heads); 0.25 MiB/row leaves ~1.5x margin. Padding rows additionally materialize a boolean + (seq x seq) attention mask - and SDPA's convert_boolean_attn_mask then allocates an + additive copy at query dtype (2 bytes) plus a possible alignment-pad transient of the same + size, so budget 5 bytes per mask entry, not 1. (No current code path emits padding rows; + this arms the estimate for ref2va-style layouts.) The fixed base covers streamed block + weights arriving on device under partial load (per-op transients up to ~0.5 GiB), the + prompt embeds, rotary tables, per-step preview unpatchify, and allocator slack. + """ + MB = 1024**2 + GB = 1024**3 + estimated = layout.sequence_length * int(0.25 * MB) + if bool((layout.token_tags < 0).any()): + estimated += 5 * layout.sequence_length**2 + estimated += 2 * GB + return estimated + + @torch.no_grad() + def invoke(self, context: InvocationContext) -> MiniMaxH3DenoiseOutput: + validate_num_frames(self.num_frames) + + device = TorchDevice.choose_torch_device() + + cond_data = context.conditioning.load(self.positive_conditioning.conditioning_name) + assert len(cond_data.conditionings) == 1 + cond_info = cond_data.conditionings[0] + assert isinstance(cond_info, MiniMaxH3ConditioningInfo) + + latent_height = self.height // MINIMAX_H3_SPATIAL_COMPRESSION + latent_width = self.width // MINIMAX_H3_SPATIAL_COMPRESSION + num_latent_frames = video_latent_num_frames(self.num_frames) + num_audio_latents = audio_latent_num_frames(self.num_frames) + + keyframe_anchors: tuple[str, ...] = () + clean_condition_rows: torch.Tensor | None = None + if self.frame_conditioning is not None: + if (self.frame_conditioning.width, self.frame_conditioning.height) != (self.width, self.height): + raise ValueError( + f"Frame conditioning canvas ({self.frame_conditioning.width}x" + f"{self.frame_conditioning.height}) must match denoise dimensions " + f"({self.width}x{self.height}). Re-run Frame Conditioning - MiniMax H3." + ) + keyframe_anchors = tuple(self.frame_conditioning.keyframe_anchors) + clean_condition_rows = context.tensors.load(self.frame_conditioning.condition_rows_name) + + # Keyframes must reach the text conditioning (vision context) and the VAE condition + # rows together, on the same canvas — the model was trained with them coupled. + cond_anchors = tuple(cond_info.keyframe_anchors) + if cond_anchors != keyframe_anchors: + raise ValueError( + f"Keyframe mismatch: the prompt was encoded with keyframes {list(cond_anchors) or 'none'} " + f"but frame conditioning provides {list(keyframe_anchors) or 'none'}. Wire the same " + "first/last images to both Prompt - MiniMax H3 and Frame Conditioning - MiniMax H3." + ) + if cond_anchors and (cond_info.width, cond_info.height) != (self.width, self.height): + raise ValueError( + f"The prompt's keyframes were prepared at {cond_info.width}x{cond_info.height} but this " + f"denoise runs at {self.width}x{self.height}. Re-run Prompt - MiniMax H3 with matching " + "width/height." + ) + + state = build_denoise_state( + text_token_tags=cond_info.text_token_tags, + num_latent_frames=num_latent_frames, + latent_height=latent_height, + latent_width=latent_width, + num_audio_latents=num_audio_latents, + num_inference_steps=self.steps, + seed=self.seed, + device=device, + keyframe_anchors=keyframe_anchors, + clean_condition_rows=clean_condition_rows, + ) + + num_condition_video_rows = state.layout.num_condition_video_rows + + def step_callback(step: int, total_steps: int, video_rows: torch.Tensor) -> None: + # Unpack the generated rows to a 5D grid and preview the middle temporal slice. + latents_5d = unpatchify_video_tokens( + video_rows[num_condition_video_rows:], + num_latent_frames, + latent_height, + latent_width, + MINIMAX_H3_VAE_LATENT_CHANNELS, + MINIMAX_H3_PATCH_SIZE, + ) + context.util.sd_step_callback( + PipelineIntermediateState( + step=step, + order=1, + total_steps=total_steps, + timestep=0, + latents=latents_5d[:, :, num_latent_frames // 2], + ), + BaseModelType.MiniMaxH3, + ) + + estimated_working_memory = self._estimate_working_memory(state.layout) + transformer_info = context.models.load(self.transformer.transformer) + with transformer_info.model_on_device(working_mem_bytes=estimated_working_memory) as (_, transformer): + assert isinstance(transformer, MiniMaxH3Transformer3DModel) + context.util.signal_progress("Denoising MiniMax H3 audio-video") + # steps counts sigma grid points (terminal included) -> steps-1 model evaluations. + progress = tqdm(total=len(state.timesteps), desc=f"Denoising MiniMax H3 ({self.num_frames} frames)") + + def callback_with_progress(step: int, total_steps: int, video_rows: torch.Tensor) -> None: + progress.update(1) + step_callback(step, total_steps, video_rows) + + try: + video_rows, audio_rows = denoise( + transformer=transformer, + state=state, + prompt_embeds=cond_info.prompt_embeds.to(device), + step_callback=callback_with_progress, + is_canceled=context.util.is_canceled, + ) + finally: + progress.close() + + video_latents = unpatchify_video_tokens( + video_rows[num_condition_video_rows:], + num_latent_frames, + latent_height, + latent_width, + MINIMAX_H3_VAE_LATENT_CHANNELS, + MINIMAX_H3_PATCH_SIZE, + ) + audio_latents = unpack_audio_tokens(audio_rows[state.layout.num_condition_audio_rows :], num_audio_latents) + + video_latents = video_latents.detach().to(device="cpu", dtype=torch.float32) + audio_latents = audio_latents.detach().to(device="cpu", dtype=torch.float32) + + video_name = context.tensors.save(tensor=video_latents) + audio_name = context.tensors.save(tensor=audio_latents) + return MiniMaxH3DenoiseOutput( + video_latents=LatentsField(latents_name=video_name, seed=self.seed), + audio_latents=LatentsField(latents_name=audio_name, seed=self.seed), + width=self.width, + height=self.height, + num_frames=self.num_frames, + ) diff --git a/invokeai/app/invocations/minimax_h3_frame_conditioning.py b/invokeai/app/invocations/minimax_h3_frame_conditioning.py new file mode 100644 index 00000000000..332a04d239d --- /dev/null +++ b/invokeai/app/invocations/minimax_h3_frame_conditioning.py @@ -0,0 +1,92 @@ +import torch + +from invokeai.app.invocations.baseinvocation import ( + BaseInvocation, + BaseInvocationOutput, + Classification, + invocation, + invocation_output, +) +from invokeai.app.invocations.fields import ( + FieldDescriptions, + ImageField, + Input, + InputField, + MiniMaxH3FrameConditioningField, + OutputField, +) +from invokeai.app.invocations.model import VAEField +from invokeai.app.services.shared.invocation_context import InvocationContext +from invokeai.backend.minimax_h3.autoencoder_kl_minimax_h3 import AutoencoderKLMiniMaxH3 +from invokeai.backend.minimax_h3.keyframe_conditioning import encode_keyframes, prepare_keyframes +from invokeai.backend.minimax_h3.packing import MINIMAX_H3_CANVAS_MULTIPLE +from invokeai.backend.model_manager.load.model_cache.utils import get_effective_device + + +@invocation_output("minimax_h3_frame_conditioning_output") +class MiniMaxH3FrameConditioningOutput(BaseInvocationOutput): + """Output of the MiniMax H3 keyframe VAE-encoder.""" + + frame_conditioning: MiniMaxH3FrameConditioningField = OutputField( + description=FieldDescriptions.minimax_h3_frame_conditioning + ) + + +@invocation( + "minimax_h3_frame_conditioning", + title="Frame Conditioning - MiniMax H3", + tags=["conditioning", "minimax", "video", "i2v"], + category="conditioning", + version="1.0.0", + classification=Classification.Prototype, +) +class MiniMaxH3FrameConditioningInvocation(BaseInvocation): + """VAE-encodes first/last keyframes into MiniMax H3 conditioning rows. + + The rows are clean (the denoise node noise-augments them with the request seed). The same + images and width/height must also be wired to the Prompt - MiniMax H3 node: the keyframes + are part of both the packed sequence and the text conditioning. + """ + + first_image: ImageField | None = InputField( + default=None, description="Keyframe the video starts from (stretched onto the canvas)." + ) + last_image: ImageField | None = InputField( + default=None, description="Keyframe the video ends on (cover-cropped onto the canvas)." + ) + vae: VAEField = InputField(description=FieldDescriptions.vae, input=Input.Connection, title="Video VAE") + width: int = InputField( + default=1344, gt=0, multiple_of=MINIMAX_H3_CANVAS_MULTIPLE, description="Target canvas width." + ) + height: int = InputField( + default=768, gt=0, multiple_of=MINIMAX_H3_CANVAS_MULTIPLE, description="Target canvas height." + ) + + @torch.no_grad() + def invoke(self, context: InvocationContext) -> MiniMaxH3FrameConditioningOutput: + if self.first_image is None and self.last_image is None: + raise ValueError("Frame Conditioning needs a first image, a last image, or both.") + + first = context.images.get_pil(self.first_image.image_name) if self.first_image else None + last = context.images.get_pil(self.last_image.image_name) if self.last_image else None + keyframes, anchors = prepare_keyframes(first, last, self.height, self.width) + + vae_info = context.models.load(self.vae.vae) + if not isinstance(vae_info.model, AutoencoderKLMiniMaxH3): + raise TypeError( + f"Expected AutoencoderKLMiniMaxH3 for the MiniMax H3 video VAE, got {type(vae_info.model).__name__}." + ) + with vae_info.model_on_device() as (_, vae): + assert isinstance(vae, AutoencoderKLMiniMaxH3) + context.util.signal_progress("Encoding MiniMax H3 keyframes") + rows = encode_keyframes(vae, keyframes, device=get_effective_device(vae)) + + name = context.tensors.save(tensor=rows.detach().to("cpu")) + return MiniMaxH3FrameConditioningOutput( + frame_conditioning=MiniMaxH3FrameConditioningField( + condition_rows_name=name, + keyframe_anchors=list(anchors), + width=self.width, + height=self.height, + ) + ) diff --git a/invokeai/app/invocations/minimax_h3_latents_to_image.py b/invokeai/app/invocations/minimax_h3_latents_to_image.py new file mode 100644 index 00000000000..4606920b78f --- /dev/null +++ b/invokeai/app/invocations/minimax_h3_latents_to_image.py @@ -0,0 +1,53 @@ +"""MiniMax H3 latents-to-image invocation: the still-image (frame extraction) path. + +Paired with Denoise - MiniMax H3 at ``num_frames=5`` (the single-block minimum), this is the +text-to-image mode: decode the clip and save one frame as a regular gallery image. +""" + +import torch +from PIL import Image + +from invokeai.app.invocations.baseinvocation import BaseInvocation, Classification, invocation +from invokeai.app.invocations.fields import ( + FieldDescriptions, + Input, + InputField, + LatentsField, + WithBoard, + WithMetadata, +) +from invokeai.app.invocations.minimax_h3_latents_to_video import decode_video_latents +from invokeai.app.invocations.model import VAEField +from invokeai.app.invocations.primitives import ImageOutput +from invokeai.app.services.shared.invocation_context import InvocationContext + + +@invocation( + "minimax_h3_latents_to_image", + title="Latents to Image - MiniMax H3", + tags=["latents", "image", "vae", "l2i", "minimax"], + category="latents", + version="1.0.0", + classification=Classification.Prototype, +) +class MiniMaxH3LatentsToImageInvocation(BaseInvocation, WithMetadata, WithBoard): + """Decode MiniMax H3 video latents and save a single frame as an image.""" + + video_latents: LatentsField = InputField(description=FieldDescriptions.latents, input=Input.Connection) + vae: VAEField = InputField(description=FieldDescriptions.vae, input=Input.Connection, title="Video VAE") + frame_index: int = InputField(default=0, ge=0, description="Which decoded frame to save.") + + @torch.no_grad() + def invoke(self, context: InvocationContext) -> ImageOutput: + latents = context.tensors.load(self.video_latents.latents_name) + decoded = decode_video_latents(context, self.vae, latents) # [C, T, H, W] in [0, 1] + + num_frames = decoded.shape[1] + if self.frame_index >= num_frames: + raise ValueError(f"frame_index {self.frame_index} is out of range for a {num_frames}-frame clip.") + + frame = decoded[:, self.frame_index].permute(1, 2, 0) # [H, W, C] + img_pil = Image.fromarray((255.0 * frame).round().clamp(0, 255).byte().cpu().numpy()) + + image_dto = context.images.save(image=img_pil) + return ImageOutput.build(image_dto) diff --git a/invokeai/app/invocations/minimax_h3_latents_to_video.py b/invokeai/app/invocations/minimax_h3_latents_to_video.py new file mode 100644 index 00000000000..bbaf8e1bc80 --- /dev/null +++ b/invokeai/app/invocations/minimax_h3_latents_to_video.py @@ -0,0 +1,260 @@ +"""MiniMax H3 latents-to-video invocation. + +Decodes the 5D video latents with the H3 video VAE (ImageNet-normalized RGB, reverted here) +and, when audio latents are wired, decodes the stereo waveform with the H3 audio VAE and muxes +it into the MP4 as AAC. The audio is trimmed or zero-padded to exactly the video duration +before muxing: ffmpeg gets no ``-shortest``, so an over-long track would stretch the container. +""" + +import tempfile +from collections.abc import Iterator +from pathlib import Path + +import numpy as np +import torch + +from invokeai.app.invocations.baseinvocation import BaseInvocation, Classification, invocation +from invokeai.app.invocations.fields import ( + FieldDescriptions, + Input, + InputField, + LatentsField, + WithBoard, + WithMetadata, +) +from invokeai.app.invocations.model import VAEField +from invokeai.app.invocations.primitives import VideoOutput +from invokeai.app.invocations.wan_latents_to_video import _write_video_frames +from invokeai.app.services.session_processor.session_processor_common import CanceledException +from invokeai.app.services.shared.invocation_context import InvocationContext +from invokeai.app.util.video_encoding import make_mp4_writer, write_stereo_wav +from invokeai.backend.minimax_h3.autoencoder_kl_minimax_h3 import AutoencoderKLMiniMaxH3 +from invokeai.backend.minimax_h3.autoencoder_kl_minimax_h3_audio import AutoencoderKLMiniMaxH3Audio +from invokeai.backend.minimax_h3.packing import ( + MINIMAX_H3_FPS, + MINIMAX_H3_PIXEL_MEAN, + MINIMAX_H3_PIXEL_STD, +) +from invokeai.backend.model_manager.load.model_cache.utils import get_effective_device +from invokeai.backend.util.devices import TorchDevice +from invokeai.backend.util.vae_working_memory import estimate_vae_working_memory_minimax_h3 + + +def _iter_decoded_frames(decoded: torch.Tensor) -> Iterator[np.ndarray]: + """Yield uint8 HWC frames from a [C, T, H, W] clip already in [0, 1].""" + for index in range(decoded.shape[1]): + frame = decoded[:, index].clamp(0, 1).permute(1, 2, 0).cpu().float() + yield (255.0 * frame).round().clamp(0, 255).byte().numpy() + + +def decode_video_latents( + context: InvocationContext, + vae_field: VAEField, + latents: torch.Tensor, +) -> torch.Tensor: + """Decode 5D H3 video latents to a [C, T, H, W] float clip in [0, 1], on the CPU.""" + if latents.ndim != 5: + raise ValueError(f"MiniMax H3 video latents must be 5D [B, C, T, H, W]; got {tuple(latents.shape)}.") + if latents.shape[0] != 1: + raise ValueError(f"MiniMax H3 latents-to-video requires batch size 1; got {latents.shape[0]}.") + + vae_info = context.models.load(vae_field.vae) + if not isinstance(vae_info.model, AutoencoderKLMiniMaxH3): + raise TypeError( + f"Expected AutoencoderKLMiniMaxH3 for the MiniMax H3 video VAE, got {type(vae_info.model).__name__}." + ) + if latents.shape[1] != vae_info.model.config.latent_channels: + raise ValueError( + f"Latent channel mismatch: these latents have {latents.shape[1]} channels but the " + f"selected VAE expects {vae_info.model.config.latent_channels}." + ) + + _, _, t_lat, h_lat, w_lat = latents.shape + spatial = vae_info.model.spatial_compression_ratio + # 5*n+2 latent frames decode to 17*n+5 pixel frames. + t_pixel = (t_lat - 2) // 5 * 17 + 5 + h_pixel, w_pixel = h_lat * spatial, w_lat * spatial + + estimated_working_memory = estimate_vae_working_memory_minimax_h3( + operation="decode", + vae=vae_info.model, + pixel_height=h_pixel, + pixel_width=w_pixel, + pixel_frames=t_pixel, + ) + + with vae_info.model_on_device(working_mem_bytes=estimated_working_memory) as (_, vae): + assert isinstance(vae, AutoencoderKLMiniMaxH3) + context.logger.info( + f"Running MiniMax H3 VAE decode: {t_lat} latent frames -> {t_pixel} pixel frames at {w_pixel}x{h_pixel}" + ) + context.util.signal_progress("Running MiniMax H3 video VAE decode") + + device = get_effective_device(vae) + vae_dtype = next(iter(vae.parameters())).dtype + latents = latents.to(device=device, dtype=vae_dtype) + + TorchDevice.empty_cache() + + # The H3 VAE tiles spatially by default (256px tiles / 64px overlap) and the released + # frames are the blended-tile ones — never toggle tiling on the shared cached instance: + # it would silently change every later encode/decode using the same cached model. + with torch.inference_mode(): + latents_mean = torch.tensor(vae.config.latents_mean).view(1, -1, 1, 1, 1).to(latents) + latents_std = torch.tensor(vae.config.latents_std).view(1, -1, 1, 1, 1).to(latents) + latents = latents * latents_std + latents_mean + + if device.type == "cuda" and torch.version.hip is None: + # Upstream's verified decode recipe: float16 autocast over the fp32-pinned weights. + with torch.autocast(device_type="cuda", dtype=torch.float16): + decoded = vae.decode(latents, return_dict=False)[0] + else: + # ROCm/MPS/CPU: fp16 autocast is unverified there; decode in the weights' dtype. + decoded = vae.decode(latents, return_dict=False)[0] + del latents, latents_mean, latents_std + + # Move the clip off-device before the full-clip pixel math to keep VRAM at ~one copy. + decoded = decoded[0].float().cpu() # [C, T, H, W] + + TorchDevice.empty_cache() + + # The H3 video VAE emits ImageNet-normalized RGB over a [0, 1] base range; revert it. + pixel_mean = torch.tensor(MINIMAX_H3_PIXEL_MEAN).view(-1, 1, 1, 1) + pixel_std = torch.tensor(MINIMAX_H3_PIXEL_STD).view(-1, 1, 1, 1) + return (decoded * pixel_std + pixel_mean).clamp_(0, 1) + + +@invocation( + "minimax_h3_latents_to_video", + title="Latents to Video - MiniMax H3", + tags=["latents", "video", "audio", "vae", "l2v", "minimax"], + category="latents", + version="1.0.0", + classification=Classification.Prototype, +) +class MiniMaxH3LatentsToVideoInvocation(BaseInvocation, WithMetadata, WithBoard): + """Decode MiniMax H3 video+audio latents and encode an MP4 with an AAC stereo track.""" + + video_latents: LatentsField = InputField(description=FieldDescriptions.latents, input=Input.Connection) + audio_latents: LatentsField | None = InputField( + default=None, + description="Audio latents [2, 32, T_audio] from the denoise node. Omit for a silent video.", + input=Input.Connection, + ) + vae: VAEField = InputField(description=FieldDescriptions.vae, input=Input.Connection, title="Video VAE") + audio_vae: VAEField | None = InputField( + default=None, + description=FieldDescriptions.minimax_h3_audio_vae, + input=Input.Connection, + title="Audio VAE", + ) + + @torch.no_grad() + def invoke(self, context: InvocationContext) -> VideoOutput: + latents = context.tensors.load(self.video_latents.latents_name) + decoded = decode_video_latents(context, self.vae, latents) + + if context.util.is_canceled(): + raise CanceledException + + num_frames = decoded.shape[1] + if num_frames == 0: + raise ValueError("MiniMax H3 VAE decode produced zero frames.") + height, width = decoded.shape[2:] + fps = MINIMAX_H3_FPS + duration = num_frames / float(fps) + + # Decode the soundtrack (if wired) before opening the writer: the WAV must exist and + # be trimmed to the video duration when the muxing writer is constructed. + wav_path: Path | None = None + if self.audio_latents is not None: + if self.audio_vae is None: + raise ValueError("Audio latents are wired but no Audio VAE is connected.") + wav_path = self._decode_audio_to_wav(context, duration) + + tmp = tempfile.NamedTemporaryFile(prefix="invokeai_minimax_h3_video_", suffix=".mp4", delete=False) + tmp.close() + tmp_path = Path(tmp.name) + try: + context.logger.info( + f"Encoding MP4: {num_frames} frames @ {fps} fps ({duration:.2f}s) at {width}x{height}" + + (" + AAC stereo" if wav_path is not None else "") + ) + context.util.signal_progress(f"Encoding MP4 ({num_frames} frames @ {fps} fps)") + writer = make_mp4_writer(tmp_path, float(fps), audio_path=wav_path) + try: + _write_video_frames(writer, _iter_decoded_frames(decoded), context.util.is_canceled) + finally: + writer.close() + del decoded + TorchDevice.empty_cache() + video_dto = context.videos.save( + source_path=tmp_path, + width=int(width), + height=int(height), + duration=duration, + fps=float(fps), + ) + context.logger.info(f"Saved video: {video_dto.video_name}") + return VideoOutput.build(video_dto) + finally: + try: + tmp_path.unlink(missing_ok=True) + except Exception: + pass + if wav_path is not None: + try: + wav_path.unlink(missing_ok=True) + except Exception: + pass + + def _decode_audio_to_wav(self, context: InvocationContext, video_duration_s: float) -> Path: + assert self.audio_latents is not None and self.audio_vae is not None + audio_latents = context.tensors.load(self.audio_latents.latents_name) + if audio_latents.ndim != 3 or audio_latents.shape[0] != 2: + raise ValueError( + f"MiniMax H3 audio latents must be [2, C, T_audio] (one item per stereo channel); " + f"got {tuple(audio_latents.shape)}." + ) + + audio_vae_info = context.models.load(self.audio_vae.vae) + if not isinstance(audio_vae_info.model, AutoencoderKLMiniMaxH3Audio): + raise TypeError( + f"Expected AutoencoderKLMiniMaxH3Audio for the MiniMax H3 audio VAE, " + f"got {type(audio_vae_info.model).__name__}." + ) + + with audio_vae_info.model_on_device() as (_, audio_vae): + assert isinstance(audio_vae, AutoencoderKLMiniMaxH3Audio) + context.util.signal_progress("Running MiniMax H3 audio VAE decode") + device = get_effective_device(audio_vae) + vae_dtype = next(iter(audio_vae.parameters())).dtype + audio_latents = audio_latents.to(device=device, dtype=vae_dtype) + + with torch.inference_mode(): + latents_mean = torch.tensor(audio_vae.config.latents_mean, device=device).view(1, -1, 1) + latents_std = torch.tensor(audio_vae.config.latents_std, device=device).view(1, -1, 1) + audio_latents = audio_latents * latents_std.to(audio_latents) + latents_mean.to(audio_latents) + # The audio VAE is mono; the two stereo channels are two batch items. + waveform = audio_vae.decode(audio_latents, return_dict=False)[0] + + sample_rate = int(audio_vae.config.sampling_rate) + # [2, 1, N] -> [2, N] float on CPU. + waveform = waveform.float().cpu().reshape(2, -1) + + # Trim (or zero-pad: the 40-latents/s grid can come up ~8 ms short when + # num_frames % 3 == 2) to exactly the video duration — no -shortest at mux time. + max_samples = int(round(video_duration_s * sample_rate)) + waveform = waveform[:, :max_samples] + if waveform.shape[1] < max_samples: + waveform = torch.nn.functional.pad(waveform, (0, max_samples - waveform.shape[1])) + + wav = tempfile.NamedTemporaryFile(prefix="invokeai_minimax_h3_audio_", suffix=".wav", delete=False) + wav.close() + wav_path = Path(wav.name) + try: + write_stereo_wav(wav_path, waveform.numpy(), sample_rate) + except Exception: + wav_path.unlink(missing_ok=True) + raise + return wav_path diff --git a/invokeai/app/invocations/minimax_h3_model_loader.py b/invokeai/app/invocations/minimax_h3_model_loader.py new file mode 100644 index 00000000000..e3345f155b7 --- /dev/null +++ b/invokeai/app/invocations/minimax_h3_model_loader.py @@ -0,0 +1,72 @@ +from invokeai.app.invocations.baseinvocation import ( + BaseInvocation, + BaseInvocationOutput, + Classification, + invocation, + invocation_output, +) +from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField +from invokeai.app.invocations.model import ( + MiniMaxH3TextEncoderField, + MiniMaxH3TransformerField, + ModelIdentifierField, + VAEField, +) +from invokeai.app.services.shared.invocation_context import InvocationContext +from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType, SubModelType + + +@invocation_output("minimax_h3_model_loader_output") +class MiniMaxH3ModelLoaderOutput(BaseInvocationOutput): + """MiniMax H3 model loader output.""" + + transformer: MiniMaxH3TransformerField = OutputField( + description="MiniMax H3 FL2VA transformer", title="Transformer" + ) + text_encoder: MiniMaxH3TextEncoderField = OutputField( + description=FieldDescriptions.minimax_h3_text_encoder, title="Qwen3-VL Encoder" + ) + vae: VAEField = OutputField(description=FieldDescriptions.vae, title="Video VAE") + audio_vae: VAEField = OutputField(description=FieldDescriptions.minimax_h3_audio_vae, title="Audio VAE") + + +@invocation( + "minimax_h3_model_loader", + title="Main Model - MiniMax H3", + tags=["model", "minimax", "video"], + category="model", + version="1.0.0", + classification=Classification.Prototype, +) +class MiniMaxH3ModelLoaderInvocation(BaseInvocation): + """Loads a MiniMax H3 (FL2VA) model, outputting its submodels. + + All six submodels (transformer, text encoder, tokenizer, processor, video VAE, audio VAE) + come from the one diffusers-layout install; there is no component mix-and-match yet. + """ + + model: ModelIdentifierField = InputField( + description=FieldDescriptions.minimax_h3_model, + input=Input.Direct, + ui_model_base=BaseModelType.MiniMaxH3, + ui_model_type=ModelType.Main, + title="Model", + ) + + def invoke(self, context: InvocationContext) -> MiniMaxH3ModelLoaderOutput: + if not context.models.exists(self.model.key): + raise ValueError(f"Unknown model: {self.model.key}") + + transformer = self.model.model_copy(update={"submodel_type": SubModelType.Transformer}) + tokenizer = self.model.model_copy(update={"submodel_type": SubModelType.Tokenizer}) + processor = self.model.model_copy(update={"submodel_type": SubModelType.Processor}) + text_encoder = self.model.model_copy(update={"submodel_type": SubModelType.TextEncoder}) + vae = self.model.model_copy(update={"submodel_type": SubModelType.VAE}) + audio_vae = self.model.model_copy(update={"submodel_type": SubModelType.AudioVAE}) + + return MiniMaxH3ModelLoaderOutput( + transformer=MiniMaxH3TransformerField(transformer=transformer), + text_encoder=MiniMaxH3TextEncoderField(tokenizer=tokenizer, processor=processor, text_encoder=text_encoder), + vae=VAEField(vae=vae), + audio_vae=VAEField(vae=audio_vae), + ) diff --git a/invokeai/app/invocations/minimax_h3_text_encoder.py b/invokeai/app/invocations/minimax_h3_text_encoder.py new file mode 100644 index 00000000000..6c1e94dd5a8 --- /dev/null +++ b/invokeai/app/invocations/minimax_h3_text_encoder.py @@ -0,0 +1,106 @@ +import torch + +from invokeai.app.invocations.baseinvocation import BaseInvocation, Classification, invocation +from invokeai.app.invocations.fields import ( + FieldDescriptions, + ImageField, + Input, + InputField, + UIComponent, +) +from invokeai.app.invocations.model import MiniMaxH3TextEncoderField +from invokeai.app.invocations.primitives import MiniMaxH3ConditioningOutput +from invokeai.app.services.shared.invocation_context import InvocationContext +from invokeai.backend.minimax_h3.keyframe_conditioning import prepare_keyframes +from invokeai.backend.minimax_h3.packing import MINIMAX_H3_CANVAS_MULTIPLE +from invokeai.backend.minimax_h3.text_conditioning import encode_prompt +from invokeai.backend.model_manager.load.model_cache.utils import get_effective_device +from invokeai.backend.stable_diffusion.diffusion.conditioning_data import ( + ConditioningFieldData, + MiniMaxH3ConditioningInfo, +) + + +@invocation( + "minimax_h3_text_encoder", + title="Prompt - MiniMax H3", + tags=["prompt", "conditioning", "minimax", "video"], + category="conditioning", + version="1.0.0", + classification=Classification.Prototype, + idle_gpu_offloadable=True, +) +class MiniMaxH3TextEncoderInvocation(BaseInvocation): + """Encodes a prompt (and optional first/last keyframes) for MiniMax H3. + + The conditioning is Qwen3-VL-32B's *unnormalized* layer-50 hidden state. H3 is + guidance-distilled: there is no negative prompt. For first/last-frame video, the keyframes + are ALSO part of the text conditioning (a ": " label plus a vision block per + keyframe), so the same images must be wired here and to the Frame Conditioning node, with + the same width/height as the denoise node. + """ + + prompt: str = InputField(description="Text prompt for MiniMax H3.", ui_component=UIComponent.Textarea) + text_encoder: MiniMaxH3TextEncoderField = InputField( + title="Qwen3-VL Encoder", + description=FieldDescriptions.minimax_h3_text_encoder, + input=Input.Connection, + ) + first_image: ImageField | None = InputField( + default=None, description="Optional keyframe the video starts from (must match Frame Conditioning)." + ) + last_image: ImageField | None = InputField( + default=None, description="Optional keyframe the video ends on (must match Frame Conditioning)." + ) + width: int = InputField( + default=1344, gt=0, multiple_of=MINIMAX_H3_CANVAS_MULTIPLE, description="Target canvas width." + ) + height: int = InputField( + default=768, gt=0, multiple_of=MINIMAX_H3_CANVAS_MULTIPLE, description="Target canvas height." + ) + + @torch.no_grad() + def invoke(self, context: InvocationContext) -> MiniMaxH3ConditioningOutput: + keyframes = [] + anchors: tuple[str, ...] = () + if self.first_image is not None or self.last_image is not None: + first = context.images.get_pil(self.first_image.image_name) if self.first_image else None + last = context.images.get_pil(self.last_image.image_name) if self.last_image else None + keyframes, anchors = prepare_keyframes(first, last, self.height, self.width) + + # Load the largest model first: loading the ~22 GB text encoder evicts unlocked small + # entries from the RAM cache, so tokenizer/processor loaded before it would be dropped + # and re-read ("model loading order is non-optimal", issue #7513). + text_encoder_info = context.models.load(self.text_encoder.text_encoder) + tokenizer_info = context.models.load(self.text_encoder.tokenizer) + processor_info = context.models.load(self.text_encoder.processor) + with ( + tokenizer_info.model_on_device() as (_, tokenizer), + processor_info.model_on_device() as (_, processor), + text_encoder_info.model_on_device() as (_, text_encoder), + ): + device = get_effective_device(text_encoder) + context.util.signal_progress("Running Qwen3-VL text encoder") + prompt_embeds, text_token_tags = encode_prompt( + text_encoder=text_encoder, + tokenizer=tokenizer, + processor=processor, + prompt=self.prompt, + keyframe_images=keyframes, + device=device, + ) + + # Persist on CPU; required by the idle-GPU-offload contract of this node. + conditioning_data = ConditioningFieldData( + conditionings=[ + MiniMaxH3ConditioningInfo( + prompt_embeds=prompt_embeds.detach().to("cpu"), + text_token_tags=text_token_tags.detach().to("cpu"), + keyframe_anchors=anchors, + width=self.width if anchors else None, + height=self.height if anchors else None, + ) + ] + ) + conditioning_name = context.conditioning.save(conditioning_data) + return MiniMaxH3ConditioningOutput.build(conditioning_name) diff --git a/invokeai/app/invocations/model.py b/invokeai/app/invocations/model.py index e178635835f..df20c7744b6 100644 --- a/invokeai/app/invocations/model.py +++ b/invokeai/app/invocations/model.py @@ -117,6 +117,25 @@ class WanT5EncoderField(BaseModel): loras: List[LoRAField] = Field(default_factory=list, description="LoRAs to apply on model loading") +class MiniMaxH3TextEncoderField(BaseModel): + """Field for the Qwen3-VL-32B conditioner used by MiniMax H3 models. + + Unlike :class:`Qwen3VLEncoderField`, H3 also needs the Qwen3VLProcessor — even for + text-only prompts (its multimodal token-type ids drive Qwen3-VL's 3D rotary layout), and + for feeding first/last keyframes to the conditioner as vision context. + """ + + tokenizer: ModelIdentifierField = Field(description="Info to load tokenizer submodel") + processor: ModelIdentifierField = Field(description="Info to load processor submodel") + text_encoder: ModelIdentifierField = Field(description="Info to load text_encoder submodel") + + +class MiniMaxH3TransformerField(BaseModel): + """Transformer field for MiniMax H3 models (FL2VA).""" + + transformer: ModelIdentifierField = Field(description="Info to load Transformer submodel") + + class VAEField(BaseModel): vae: ModelIdentifierField = Field(description="Info to load vae submodel") seamless_axes: List[str] = Field(default_factory=list, description='Axes("x" and "y") to which apply seamless') diff --git a/invokeai/app/invocations/primitives.py b/invokeai/app/invocations/primitives.py index dfe44d0e6e9..272a092377d 100644 --- a/invokeai/app/invocations/primitives.py +++ b/invokeai/app/invocations/primitives.py @@ -27,6 +27,7 @@ InputField, Krea2ConditioningField, LatentsField, + MiniMaxH3ConditioningField, OutputField, QwenImageConditioningField, SD3ConditioningField, @@ -561,6 +562,17 @@ def build(cls, conditioning_name: str) -> "WanConditioningOutput": return cls(conditioning=WanConditioningField(conditioning_name=conditioning_name)) +@invocation_output("minimax_h3_conditioning_output") +class MiniMaxH3ConditioningOutput(BaseInvocationOutput): + """Base class for nodes that output a MiniMax H3 conditioning tensor.""" + + conditioning: MiniMaxH3ConditioningField = OutputField(description=FieldDescriptions.cond) + + @classmethod + def build(cls, conditioning_name: str) -> "MiniMaxH3ConditioningOutput": + return cls(conditioning=MiniMaxH3ConditioningField(conditioning_name=conditioning_name)) + + @invocation_output("wan_ref_image_output") class WanRefImageOutput(BaseInvocationOutput): """Output of a Wan 2.2 reference-image VAE-encoder.""" diff --git a/invokeai/app/util/step_callback.py b/invokeai/app/util/step_callback.py index a6206448e9a..c3a5d578b00 100644 --- a/invokeai/app/util/step_callback.py +++ b/invokeai/app/util/step_callback.py @@ -257,6 +257,12 @@ WAN22_LATENT_RGB_BIAS = [0.0317, -0.0878, -0.1388] +# MiniMax H3's video VAE has 24 latent channels and 16x spatial downscale. No community RGB +# projection exists yet, so previews use a uniform channel-mean (grayscale) fallback. +# TODO(minimax-h3): generate real factors with scripts/generate_vae_linear_approximation.py +# against the H3 video VAE once weights are available locally. +MINIMAX_H3_LATENT_RGB_FACTORS = [[1.0 / 24.0, 1.0 / 24.0, 1.0 / 24.0] for _ in range(24)] + def sample_to_lowres_estimated_image( samples: torch.Tensor, @@ -366,6 +372,9 @@ def diffusion_step_callback( else: latent_rgb_factors = WAN_LATENT_RGB_FACTORS latent_rgb_bias = WAN_LATENT_RGB_BIAS + elif base_model == BaseModelType.MiniMaxH3: + # 24-ch H3 video VAE; grayscale channel-mean fallback until real factors exist. + latent_rgb_factors = MINIMAX_H3_LATENT_RGB_FACTORS else: raise ValueError(f"Unsupported base model: {base_model}") @@ -388,6 +397,8 @@ def diffusion_step_callback( spatial_scale = 8 if base_model == BaseModelType.Wan and sample.shape[-3] == 48: spatial_scale = 16 + elif base_model == BaseModelType.MiniMaxH3: + spatial_scale = 16 width = image.width * spatial_scale height = image.height * spatial_scale percentage = calc_percentage(intermediate_state) diff --git a/invokeai/backend/minimax_h3/__init__.py b/invokeai/backend/minimax_h3/__init__.py index 2500f851e58..aad18767c25 100644 --- a/invokeai/backend/minimax_h3/__init__.py +++ b/invokeai/backend/minimax_h3/__init__.py @@ -2,7 +2,9 @@ Vendored from huggingface/diffusers PR #14355 ("Add MiniMax-H3") at commit abc5e9bf71fd38f53cd471bc3acaa84bc5ecbfdc (branch `minimax-h3`), which is not yet -in any tagged diffusers release. The only local changes are rewriting the +in any tagged diffusers release: the four model/scheduler modules plus +``packing.py`` (the packed-sequence geometry and checkpoint constants, from +``modular_pipelines/minimax_h3``). The only local changes are rewriting the package-relative imports to absolute `diffusers.*` imports (all referenced symbols exist in the pinned diffusers==0.39.0) and ruff import sorting. Keep these files otherwise diff --git a/invokeai/backend/minimax_h3/denoise.py b/invokeai/backend/minimax_h3/denoise.py new file mode 100644 index 00000000000..717f39bdd53 --- /dev/null +++ b/invokeai/backend/minimax_h3/denoise.py @@ -0,0 +1,85 @@ +"""The MiniMax H3 denoising loop (FL2VA / T2VA). + +First-party port of ``modular_pipelines/minimax_h3/denoise.py`` (commit recorded in +``__init__``): one transformer forward per step over the packed sequence — every row at its own +noise level — followed by one scheduler step per modality on the *generated* rows only. The +conditioning rows are never written, so the anchors survive the loop by construction. The +checkpoint is guidance-distilled: no unconditional pass, no CFG. +""" + +from typing import Callable + +import torch + +from invokeai.backend.minimax_h3.sampling import MiniMaxH3DenoiseState +from invokeai.backend.minimax_h3.transformer_minimax_h3 import MiniMaxH3Transformer3DModel + + +def denoise( + transformer: MiniMaxH3Transformer3DModel, + state: MiniMaxH3DenoiseState, + prompt_embeds: torch.Tensor, + step_callback: Callable[[int, int, torch.Tensor], None] | None = None, + is_canceled: Callable[[], bool] | None = None, +) -> tuple[torch.Tensor, torch.Tensor]: + """Run the full denoising schedule over the packed sequence. + + Args: + transformer: The FL2VA transformer. + state: The prepared denoise state (rows, layout, schedules). + prompt_embeds: The layer-50 Qwen3-VL hidden states, shape ``(1, num_text_tokens, text_dim)``. + step_callback: Called after every step with ``(step_index, total_steps, video_rows)`` — + the current video rows including conditioning rows, for previews. + is_canceled: Polled once per step; a True return raises ``KeyboardInterrupt``-free + cancellation by letting the caller's exception type propagate from the callback. + + Returns: + The denoised ``(video_rows, audio_rows)`` (conditioning/reference rows still included). + """ + from invokeai.app.services.session_processor.session_processor_common import CanceledException + + num_condition_video_rows = state.layout.num_condition_video_rows + num_condition_audio_rows = state.layout.num_condition_audio_rows + + latents = state.video_rows + audio_latents = state.audio_rows + prompt_embeds = prompt_embeds.to(latents.device) + + total_steps = len(state.timesteps) + for i, t in enumerate(state.timesteps): + if is_canceled is not None and is_canceled(): + raise CanceledException + + unique_timesteps, timestep_indices = state.row_timestep_plan[i] + noise_pred, audio_noise_pred = transformer( + hidden_states=latents[None], + audio_hidden_states=audio_latents[None], + encoder_hidden_states=prompt_embeds, + timestep=unique_timesteps, + timestep_indices=timestep_indices, + token_tags=state.token_tags, + position_ids=state.position_ids, + video_indices=state.video_indices, + audio_indices=state.audio_indices, + text_indices=state.text_indices, + attention_kwargs=None, + return_dict=False, + ) + + latents[num_condition_video_rows:] = state.scheduler.step( + noise_pred[0, num_condition_video_rows:].float(), + t, + latents[num_condition_video_rows:], + return_dict=False, + )[0] + audio_latents[num_condition_audio_rows:] = state.audio_scheduler.step( + audio_noise_pred[0, num_condition_audio_rows:].float(), + state.audio_timesteps[i], + audio_latents[num_condition_audio_rows:], + return_dict=False, + )[0] + + if step_callback is not None: + step_callback(i + 1, total_steps, latents) + + return latents, audio_latents diff --git a/invokeai/backend/minimax_h3/keyframe_conditioning.py b/invokeai/backend/minimax_h3/keyframe_conditioning.py new file mode 100644 index 00000000000..9618cea38be --- /dev/null +++ b/invokeai/backend/minimax_h3/keyframe_conditioning.py @@ -0,0 +1,80 @@ +"""MiniMax H3 keyframe (first/last frame) VAE conditioning. + +First-party port of ``MiniMaxH3KeyframeVaeEncoderStep`` and the keyframe half of +``MiniMaxH3SetupStep`` from the diffusers MiniMax-H3 integration (commit recorded in +``__init__``). The keyframes are encoded by the video VAE's spatial encoder alone (they are +single frames), the posterior is *sampled* under a generator seeded with 42 independently of +the request seed, and the sampled latent is rounded to float16 before normalization — all +three are part of reproducing the released model's conditioning. + +The rows returned here are CLEAN (not yet noise-augmented): the denoise state noises them to +``t = 0.999`` with the request generator's first draws, keeping the one-generator-three-draws +reproducibility order in one place (see :mod:`invokeai.backend.minimax_h3.sampling`). +""" + +import numpy as np +import torch +from diffusers.models.autoencoders.vae import DiagonalGaussianDistribution +from PIL import Image, ImageOps + +from invokeai.backend.minimax_h3.autoencoder_kl_minimax_h3 import AutoencoderKLMiniMaxH3 +from invokeai.backend.minimax_h3.packing import ( + MINIMAX_H3_KEYFRAME_ENCODE_SEED, + MINIMAX_H3_PIXEL_MEAN, + MINIMAX_H3_PIXEL_STD, + patchify_video_latents, + prepare_keyframe_image, +) +from invokeai.backend.minimax_h3.sampling import MINIMAX_H3_PATCH_SIZE + + +def prepare_keyframes( + first_image: Image.Image | None, + last_image: Image.Image | None, + height: int, + width: int, +) -> tuple[list[Image.Image], tuple[str, ...]]: + """Put the keyframes onto the target canvas, in packed order. + + The first keyframe *in packed order* is the geometry anchor and is stretched onto the + canvas (upstream stretches index 0 even when it is a lone last-frame); any second keyframe + follows the canvas and is cover-cropped. Returns the prepared images and their anchors + (``"first"`` / ``"last"``), both in packed order. Must be applied identically by the text + encoder (vision context) and the VAE conditioning encoder. + """ + keyframes: list[Image.Image] = [] + anchors: list[str] = [] + for anchor, image in (("first", first_image), ("last", last_image)): + if image is None: + continue + prepared = ImageOps.exif_transpose(image).convert("RGB") + keyframes.append(prepare_keyframe_image(prepared, height, width, stretch=len(keyframes) == 0)) + anchors.append(anchor) + return keyframes, tuple(anchors) + + +@torch.no_grad() +def encode_keyframes( + vae: AutoencoderKLMiniMaxH3, + images: list[Image.Image], + device: torch.device, +) -> torch.Tensor: + """Encode prepared keyframes into clean, normalized, packed conditioning rows (float32, CPU).""" + latents_mean = torch.tensor(vae.config.latents_mean).view(1, -1, 1, 1, 1) + latents_std = torch.tensor(vae.config.latents_std).view(1, -1, 1, 1, 1) + pixel_mean = torch.tensor(MINIMAX_H3_PIXEL_MEAN, device=device).view(1, -1, 1, 1, 1) + pixel_std = torch.tensor(MINIMAX_H3_PIXEL_STD, device=device).view(1, -1, 1, 1, 1) + + rows = [] + for image in images: + pixels = torch.from_numpy(np.array(image)).to(device).permute(2, 0, 1)[None, :, None] + pixels = (pixels.to(torch.float32).div(255.0) - pixel_mean) / pixel_std + # A keyframe is one frame: the (tiled) spatial encoder alone, no 17-frame temporal chunking. + moments = vae._encode_clip(pixels) + posterior = DiagonalGaussianDistribution(moments) + latents = posterior.sample(generator=torch.Generator().manual_seed(MINIMAX_H3_KEYFRAME_ENCODE_SEED)) + # The fp16 rounding before normalization is a checkpoint contract (~11 bits of every + # conditioning latent); without it the released model's conditioning is not reproduced. + latents = latents.to(torch.float16).float().cpu() + rows.append(patchify_video_latents((latents - latents_mean) / latents_std, MINIMAX_H3_PATCH_SIZE)) + return torch.cat(rows) diff --git a/invokeai/backend/minimax_h3/packing.py b/invokeai/backend/minimax_h3/packing.py new file mode 100644 index 00000000000..e34de27e74c --- /dev/null +++ b/invokeai/backend/minimax_h3/packing.py @@ -0,0 +1,536 @@ +# Copyright 2026 The MiniMax and HuggingFace Teams. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +r""" +Packed-sequence and conditioning machinery of the MiniMax-H3 blocks. + +This module holds no block of its own: it is the checkpoint's geometry and its constants, imported by every block +of `modular_pipelines.minimax_h3` that has to place a row, so that none of them reimplements it. + +MiniMax-H3 runs its transformer over a single packed 1-D sequence that holds every modality at once. For the +text/keyframe tasks the row order is + +``` +[ text (L) | keyframe conditions (C) | target audio (A) | target video (V) ] +``` + +and every piece of geometry in this module exists to place a row in that sequence and to give it its `(t, h, w)` +rotary coordinate. The coordinates are built in float64 because video and audio share one 40-units-per-second +rotary clock — video advances `5/3` rotary units per pixel frame at 24 fps, audio advances one unit per latent at +40 latents/s — and that shared clock *is* the audio/video alignment. + +The reference implementation pads the packed sequence up to a multiple of 64 and keeps the padding tail as a +separate attention document. Padding therefore cannot influence a live row, and this module builds the sequence +without it: `MiniMaxH3Transformer3DModel` then needs no attention mask, which keeps the unmasked attention +backends available. +""" + +from dataclasses import dataclass + +import numpy as np +import torch +from diffusers.utils.torch_utils import randn_tensor +from PIL import Image + +# Per-row modality tags. They index the transformer's AdaLN table, so the values are a checkpoint contract. +MINIMAX_H3_VIDEO_TAG = 0 +MINIMAX_H3_TEXT_TAG = 1 +MINIMAX_H3_AUDIO_TAG = 2 + +# MiniMax-H3 generates at a fixed 24 fps and was released for a 768 pixel short edge only, with a soft area cap of +# 768x1344 and both axes rounded to a multiple of 32. +MINIMAX_H3_FPS = 24 +MINIMAX_H3_SHORT_EDGE = 768 +MINIMAX_H3_MAX_PIXELS = 768 * 1344 +MINIMAX_H3_CANVAS_MULTIPLE = 32 +MINIMAX_H3_MIN_ASPECT_RATIO = 1 / 4 +MINIMAX_H3_MAX_ASPECT_RATIO = 4 +MINIMAX_H3_MIN_DURATION = 5.0 +MINIMAX_H3_MAX_DURATION = 15.0 + +# The video VAE encodes 17 pixel frames per chunk and drops the 3 trailing latent frames of every chunk, so +# `17 * n + 5` pixel frames map to `5 * n + 2` latent frames. +MINIMAX_H3_FRAMES_PER_CHUNK = 17 +MINIMAX_H3_LATENTS_PER_CHUNK = 5 + +# The pixel convention of the video VAE: ImageNet-normalized RGB over a `[0, 1]` base range. +MINIMAX_H3_PIXEL_MEAN = (0.485, 0.456, 0.406) +MINIMAX_H3_PIXEL_STD = (0.229, 0.224, 0.225) + +# MiniMax-H3 conditions on the *unnormalized* hidden state its Qwen3-VL conditioner produces after the 50th of its 64 +# decoder layers, i.e. `hidden_states[50]` (`hidden_states[0]` being the embedding output). +MINIMAX_H3_TEXT_ENCODER_LAYER = 50 + +# The audio VAE hops 800 samples at 32 kHz, i.e. 40 latents per second. Stereo is carried as two channel-major +# blocks of audio rows (and as two batch items at the audio VAE boundary, which is mono). +MINIMAX_H3_AUDIO_LATENTS_PER_SECOND = 40 +MINIMAX_H3_AUDIO_CHANNELS = 2 + +# Conditioning rows are not fully clean: the released model noises keyframe latents to `t = 0.999` and runs them at +# that timestep for every denoising step. +MINIMAX_H3_KEYFRAME_NOISE_AUG = 0.999 + +# The seeded posterior sample of the keyframe VAE encode. Fixed at 42 independently of the request seed. +MINIMAX_H3_KEYFRAME_ENCODE_SEED = 42 + +# Rotary-time constants. One latent frame spans `5/3 * frames_per_latent` rotary units, where the pattern +# `(1, 4, 4, 4, 4)` mirrors the VAE's 17-pixel-frames-to-5-latent-frames grouping; the spatial axes are normalized +# by the square root of the latent area and scaled by 32. +_ROPE_FRAME_RESCALE = 5.0 / 3.0 +_ROPE_FRAMES_PER_LATENT = (1, 4, 4, 4, 4) +_ROPE_SPATIAL_SCALE = 32 + + +@dataclass +class MiniMaxH3PackedSequence: + r""" + The structural description of one packed MiniMax-H3 sequence. + + Attributes: + sequence_length (`int`): + Total number of rows, `L + C + A + V`. + position_ids (`torch.Tensor` of shape `(sequence_length, 3)`, float64): + The `(t, h, w)` rotary coordinate of every row. + token_tags (`torch.Tensor` of shape `(sequence_length,)`): + The modality tag of every row. + video_indices (`torch.Tensor`): + Sequence positions of the video rows: the keyframe conditioning rows first, then the target rows. + audio_indices (`torch.Tensor`): + Sequence positions of the audio rows: reference rows first (`ref2va` only), then the target rows. + text_indices (`torch.Tensor`): + Sequence positions of the text rows. + num_condition_video_rows (`int`): + How many leading entries of `video_indices` are conditioning rows rather than generated rows. + num_condition_audio_rows (`int`): + How many leading entries of `audio_indices` are reference rows rather than generated rows. + """ + + sequence_length: int + position_ids: torch.Tensor + token_tags: torch.Tensor + video_indices: torch.Tensor + audio_indices: torch.Tensor + text_indices: torch.Tensor + num_condition_video_rows: int + num_condition_audio_rows: int + + +def resolve_canvas_size(aspect_width: float, aspect_height: float) -> tuple[int, int]: + r""" + Resolve a display aspect ratio into a MiniMax-H3 canvas. + + The short edge starts at 768, the area is capped at `768 * 1344` and both axes are then rounded to the nearest + multiple of 32 — so the final area may end up slightly above the pre-rounding budget. Only the ratio of the two + arguments matters; pass either the aspect ratio (`16, 9`) or the source dimensions of a keyframe. + + Args: + aspect_width (`float`): Width of the target ratio. + aspect_height (`float`): Height of the target ratio. + + Returns: + `tuple[int, int]`: the `(height, width)` of the canvas. + """ + if aspect_width <= 0 or aspect_height <= 0: + raise ValueError(f"The aspect ratio must be positive, got {aspect_width}:{aspect_height}.") + + ratio = aspect_width / aspect_height + if not MINIMAX_H3_MIN_ASPECT_RATIO <= ratio <= MINIMAX_H3_MAX_ASPECT_RATIO: + raise ValueError( + f"MiniMax-H3 supports aspect ratios from 1:4 to 4:1, got {aspect_width}:{aspect_height} ({ratio:g})." + ) + + if ratio >= 1.0: + width, height = MINIMAX_H3_SHORT_EDGE * ratio, float(MINIMAX_H3_SHORT_EDGE) + else: + width, height = float(MINIMAX_H3_SHORT_EDGE), MINIMAX_H3_SHORT_EDGE / ratio + + area = width * height + if area > MINIMAX_H3_MAX_PIXELS: + scale = (MINIMAX_H3_MAX_PIXELS / area) ** 0.5 + width, height = width * scale, height * scale + + multiple = MINIMAX_H3_CANVAS_MULTIPLE + return max(multiple, round(height / multiple) * multiple), max(multiple, round(width / multiple) * multiple) + + +def align_num_frames(num_frames: int) -> int: + r""" + Snap a frame count up to the next `17 * n + 5` the video VAE can encode. + + Args: + num_frames (`int`): The requested number of frames. + + Returns: + `int`: The aligned number of frames. + """ + if num_frames < 1: + raise ValueError(f"`num_frames` must be positive, got {num_frames}.") + while num_frames % MINIMAX_H3_FRAMES_PER_CHUNK != MINIMAX_H3_LATENTS_PER_CHUNK: + num_frames += 1 + return num_frames + + +def video_latent_num_frames(num_frames: int) -> int: + r""" + The number of latent frames the video VAE produces for a `17 * n + 5` frame count. + + Args: + num_frames (`int`): An aligned number of frames. + + Returns: + `int`: The number of latent frames, `5 * n + 2`. + """ + if num_frames % MINIMAX_H3_FRAMES_PER_CHUNK != MINIMAX_H3_LATENTS_PER_CHUNK: + raise ValueError(f"`num_frames` must be of the form 17 * n + 5, got {num_frames}.") + return ( + num_frames - MINIMAX_H3_LATENTS_PER_CHUNK + ) // MINIMAX_H3_FRAMES_PER_CHUNK * MINIMAX_H3_LATENTS_PER_CHUNK + 2 + + +def audio_latent_num_frames(num_frames: int) -> int: + r""" + The number of audio latents that covers a video of `num_frames` frames at 24 fps. + + Args: + num_frames (`int`): The number of video frames. + + Returns: + `int`: The number of audio latents, rounded at the 40 Hz latent grid. + """ + return int(round(num_frames / MINIMAX_H3_FPS * MINIMAX_H3_AUDIO_LATENTS_PER_SECOND)) + + +def prepare_keyframe_image(image, height: int, width: int, stretch: bool): + r""" + Put a keyframe onto the target canvas. + + The first keyframe of a request is the geometry anchor and is *stretched* onto the canvas, while a second + keyframe follows that canvas and is cover-cropped (aspect-preserving max-scale LANCZOS resize plus a centre + crop). An image that already is the canvas is returned untouched, without a resampling pass. + + Args: + image (`PIL.Image.Image`): The keyframe, in RGB and already EXIF-transposed. + height (`int`): Canvas height. + width (`int`): Canvas width. + stretch (`bool`): Whether to stretch (geometry anchor) instead of cover-cropping (follower). + + Returns: + `PIL.Image.Image`: The prepared keyframe. + """ + if image.size == (width, height): + return image + if stretch: + return image.resize((width, height), Image.Resampling.LANCZOS) + + scale = max(width / image.size[0], height / image.size[1]) + resized_size = (max(width, round(image.size[0] * scale)), max(height, round(image.size[1] * scale))) + left = max(0, (resized_size[0] - width) // 2) + top = max(0, (resized_size[1] - height) // 2) + resized = image.resize(resized_size, Image.Resampling.LANCZOS) + return resized.crop((left, top, left + width, top + height)) + + +def patchify_video_latents(latents: torch.Tensor, patch_size: tuple[int, int, int]) -> torch.Tensor: + r""" + Pack video latents into transformer rows. + + Args: + latents (`torch.Tensor` of shape `(batch_size, channels, num_frames, height, width)`): + The latents to pack. + patch_size (`tuple[int, int, int]`): The `(t, h, w)` patch. + + Returns: + `torch.Tensor` of shape `(batch_size * num_patches, channels * prod(patch_size))`: The packed rows, ordered + frame-major then row-major. + """ + patch_t, patch_h, patch_w = patch_size + batch_size, channels, num_frames, height, width = latents.shape + if num_frames % patch_t or height % patch_h or width % patch_w: + raise ValueError(f"Latents of shape {tuple(latents.shape)} are not divisible by the patch {patch_size}.") + + latents = latents.reshape( + batch_size, + channels, + num_frames // patch_t, + patch_t, + height // patch_h, + patch_h, + width // patch_w, + patch_w, + ) + latents = latents.permute(0, 2, 4, 6, 1, 3, 5, 7) + return latents.reshape(-1, channels * patch_t * patch_h * patch_w).contiguous() + + +def unpatchify_video_tokens( + rows: torch.Tensor, + num_latent_frames: int, + latent_height: int, + latent_width: int, + channels: int, + patch_size: tuple[int, int, int], +) -> torch.Tensor: + r""" + Unpack transformer rows back into video latents. The inverse of [`patchify_video_latents`]. + + Args: + rows (`torch.Tensor` of shape `(num_patches, channels * prod(patch_size))`): The packed rows. + num_latent_frames (`int`): Number of latent frames. + latent_height (`int`): Latent height. + latent_width (`int`): Latent width. + channels (`int`): Number of latent channels. + patch_size (`tuple[int, int, int]`): The `(t, h, w)` patch. + + Returns: + `torch.Tensor` of shape `(batch_size, channels, num_latent_frames, latent_height, latent_width)`. + """ + patch_t, patch_h, patch_w = patch_size + rows = rows.reshape( + -1, + num_latent_frames // patch_t, + latent_height // patch_h, + latent_width // patch_w, + channels, + patch_t, + patch_h, + patch_w, + ) + rows = rows.permute(0, 4, 1, 5, 2, 6, 3, 7) + return rows.reshape(-1, channels, num_latent_frames, latent_height, latent_width).contiguous() + + +def unpack_audio_tokens(rows: torch.Tensor, num_audio_latents: int) -> torch.Tensor: + r""" + Unpack the channel-major audio rows into audio VAE latents. + + Args: + rows (`torch.Tensor` of shape `(num_audio_latents * 2, latent_channels)`): The packed audio rows. + num_audio_latents (`int`): Number of audio latents per channel. + + Returns: + `torch.Tensor` of shape `(2, latent_channels, num_audio_latents)`: One batch item per stereo channel, which + is what the mono audio VAE consumes. + """ + rows = rows.reshape(MINIMAX_H3_AUDIO_CHANNELS, num_audio_latents, rows.shape[-1]) + return rows.permute(0, 2, 1).contiguous() + + +def _spatial_position_grid(dim: int, patch: int, sqrt_area: float) -> torch.Tensor: + r""" + One aspect-normalized spatial rotary axis: `dim // patch` coordinates centred on the unit interval, scaled up by + 32. The right endpoint is excluded, so a square canvas spans `[0, 32)`. + """ + ratio = dim / sqrt_area + left = (1.0 - ratio) / 2.0 + # Built with numpy: `np.linspace(..., endpoint=False)` is `start + arange(num) * (stop - start) / num`, which is + # not what `torch.linspace` computes, and the float64 grid has to be reproduced exactly. + grid = np.linspace(left, left + ratio, dim // patch, endpoint=False) * _ROPE_SPATIAL_SCALE + return torch.from_numpy(grid).to(torch.float64) + + +def _temporal_position_grid(num_latent_frames: int, origin: float) -> torch.Tensor: + r"""The rotary time of every latent frame, starting at `origin`. Spacing is non-uniform: `5/3 * (1, 4, 4, 4, 4)`.""" + spans = torch.tensor( + [ + _ROPE_FRAME_RESCALE * _ROPE_FRAMES_PER_LATENT[index % len(_ROPE_FRAMES_PER_LATENT)] + for index in range(num_latent_frames) + ], + dtype=torch.float64, + ) + return origin + torch.cat([torch.zeros(1, dtype=torch.float64), spans[:-1].cumsum(0)]) + + +def _temporal_position_span(num_latent_frames: int) -> float: + r""" + The rotary time spanned by `num_latent_frames` latent frames. + + Summed by numpy (pairwise summation) rather than sequentially: the reference computes the keyframe anchor this + way and the two summation orders differ in the last ulp from 16 latent frames onwards. + """ + spans = np.ones(num_latent_frames, dtype=np.float64) * _ROPE_FRAME_RESCALE + for index in range(len(_ROPE_FRAMES_PER_LATENT)): + spans[index :: len(_ROPE_FRAMES_PER_LATENT)] *= _ROPE_FRAMES_PER_LATENT[index] + return float(spans.sum()) + + +def build_packed_sequence( + text_token_tags: torch.Tensor, + num_latent_frames: int, + latent_height: int, + latent_width: int, + num_audio_latents: int, + patch_size: tuple[int, int, int], + keyframe_anchors: tuple[str, ...] = (), +) -> MiniMaxH3PackedSequence: + r""" + Build the `[text | keyframe conditions | target audio | target video]` layout used by the `t2va` and `fl2va` + tasks. + + Args: + text_token_tags (`torch.Tensor` of shape `(num_text_tokens,)`): + The modality tag of every text row. Text is tagged `1`, except for the rows of a keyframe's vision block, + which MiniMax-H3 tags `0` (video). + num_latent_frames (`int`): Number of target latent frames. + latent_height (`int`): Target latent height. + latent_width (`int`): Target latent width. + num_audio_latents (`int`): Number of target audio latents per channel. + patch_size (`tuple[int, int, int]`): The transformer's `(t, h, w)` patch. + keyframe_anchors (`tuple[str, ...]`): + One entry per keyframe conditioning block, in packed order: `"first"` anchors the block at the first + latent frame, `"last"` at the last one. + + Returns: + [`MiniMaxH3PackedSequence`] + """ + _, patch_h, patch_w = patch_size + rows_per_frame = (latent_height // patch_h) * (latent_width // patch_w) + num_text_tokens = text_token_tags.shape[0] + num_condition_rows = len(keyframe_anchors) * rows_per_frame + num_audio_rows = num_audio_latents * MINIMAX_H3_AUDIO_CHANNELS + num_video_rows = num_latent_frames * rows_per_frame + sequence_length = num_text_tokens + num_condition_rows + num_audio_rows + num_video_rows + + condition_start = num_text_tokens + audio_start = condition_start + num_condition_rows + video_start = audio_start + num_audio_rows + + # 1. The (t, h, w) grid. Text rows sit on the time axis at their row index, and the media rows continue the time + # axis from there, so text length shifts the whole media clock. + position_ids = torch.zeros(sequence_length, 3, dtype=torch.float64) + position_ids[:num_text_tokens, 0] = torch.arange(num_text_tokens, dtype=torch.float64) + + sqrt_area = np.sqrt(latent_height * latent_width) + height_grid = _spatial_position_grid(latent_height, patch_h, sqrt_area) + width_grid = _spatial_position_grid(latent_width, patch_w, sqrt_area) + frame_grid = torch.stack([grid.reshape(-1) for grid in torch.meshgrid(height_grid, width_grid, indexing="ij")], -1) + + for index, anchor in enumerate(keyframe_anchors): + if anchor == "first": + anchor_time = float(num_text_tokens) + elif anchor == "last": + anchor_time = float(num_text_tokens) + _temporal_position_span(num_latent_frames) - _ROPE_FRAME_RESCALE + else: + raise ValueError(f"A keyframe anchor must be 'first' or 'last', got {anchor!r}.") + rows = slice(condition_start + index * rows_per_frame, condition_start + (index + 1) * rows_per_frame) + position_ids[rows, 0] = anchor_time + position_ids[rows, 1:] = frame_grid + + # Audio rows are channel-major and share the video's rotary clock: one unit per latent at 40 latents/s equals + # 24 fps * 5/3. They carry no height coordinate and are pinned to the two extremes of the width grid. + audio_time = float(num_text_tokens) + torch.arange(num_audio_latents, dtype=torch.float64) + position_ids[audio_start:video_start, 0] = audio_time.repeat(MINIMAX_H3_AUDIO_CHANNELS) + position_ids[audio_start:video_start, 2] = torch.cat( + [ + torch.full((num_audio_latents,), float(width_grid[0]), dtype=torch.float64), + torch.full((num_audio_rows - num_audio_latents,), float(width_grid[-1]), dtype=torch.float64), + ] + ) + + video_position_ids = torch.empty(num_latent_frames, rows_per_frame, 3, dtype=torch.float64) + video_position_ids[:, :, 0] = _temporal_position_grid(num_latent_frames, float(num_text_tokens))[:, None] + video_position_ids[:, :, 1:] = frame_grid[None] + position_ids[video_start:] = video_position_ids.reshape(-1, 3) + + # 2. Row indices and modality tags. + video_indices = torch.cat([torch.arange(condition_start, audio_start), torch.arange(video_start, sequence_length)]) + audio_indices = torch.arange(audio_start, video_start) + text_indices = torch.arange(num_text_tokens) + + token_tags = torch.empty(sequence_length, dtype=torch.long) + token_tags[text_indices] = text_token_tags.to(torch.long) + token_tags[audio_indices] = MINIMAX_H3_AUDIO_TAG + token_tags[video_indices] = MINIMAX_H3_VIDEO_TAG + + return MiniMaxH3PackedSequence( + sequence_length=sequence_length, + position_ids=position_ids, + token_tags=token_tags, + video_indices=video_indices, + audio_indices=audio_indices, + text_indices=text_indices, + num_condition_video_rows=num_condition_rows, + num_condition_audio_rows=0, + ) + + +def build_row_timesteps( + layout: MiniMaxH3PackedSequence, + video_timestep: float, + audio_timestep: float, + condition_video_timestep: float, + condition_audio_timestep: float, +) -> tuple[torch.Tensor, torch.Tensor]: + r""" + Assign a timestep to every row of the packed sequence and reduce it to the transformer's `(timestep, + timestep_indices)` pair. + + One forward serves rows at different noise levels: the generated video and audio rows step down their own + schedules while the conditioning rows stay pinned at their noise-augmentation level. Text rows never reach an + output head and inherit the video timestep. + + Args: + layout ([`MiniMaxH3PackedSequence`]): The packed layout. + video_timestep (`float`): Timestep of the generated video rows. + audio_timestep (`float`): Timestep of the generated audio rows. + condition_video_timestep (`float`): Timestep of the video conditioning rows. + condition_audio_timestep (`float`): Timestep of the audio reference rows. + + Returns: + `tuple[torch.Tensor, torch.Tensor]`: the distinct timesteps, sorted, and the index of every row into them. + """ + row_timesteps = torch.full((layout.sequence_length,), video_timestep, dtype=torch.float32) + row_timesteps[layout.video_indices[: layout.num_condition_video_rows]] = condition_video_timestep + row_timesteps[layout.audio_indices[layout.num_condition_audio_rows :]] = audio_timestep + row_timesteps[layout.audio_indices[: layout.num_condition_audio_rows]] = condition_audio_timestep + return torch.unique(row_timesteps, sorted=True, return_inverse=True) + + +def keyframe_condition_noise( + condition_latent_shapes: tuple[tuple[int, int, int], ...], + patch_size: tuple[int, int, int], + latent_channels: int, + generator: torch.Generator | list[torch.Generator] | None = None, + device: torch.device | None = None, + dtype: torch.dtype = torch.float32, +) -> torch.Tensor: + r""" + Draw the noise that the keyframe (or reference) conditioning rows are mixed with. + + One draw per condition, in packed order, off the request's generator. The conditioning rows are prepared before + the target rows, so these are the *first* draws of a request, ahead of the video and audio noise of + [`~MiniMaxH3PrepareLatentsStep.prepare_latents`] — the order is part of what a generator reproduces. + + Args: + condition_latent_shapes (`tuple[tuple[int, int, int], ...]`): + The `(num_latent_frames, latent_height, latent_width)` of every condition, in packed order. + patch_size (`tuple[int, int, int]`): The transformer's `(t, h, w)` patch. + latent_channels (`int`): Number of video latent channels. + generator (`torch.Generator`, *optional*): The generator of the request. + device (`torch.device`, *optional*): The device the noise is drawn on. + dtype (`torch.dtype`, defaults to `torch.float32`): The dtype of the noise. + + Returns: + `torch.Tensor` of shape `(num_condition_rows, latent_channels * prod(patch_size))`: the noise rows, + concatenated in packed order. + """ + rows = [] + for num_latent_frames, latent_height, latent_width in condition_latent_shapes: + noise = randn_tensor( + (1, latent_channels, num_latent_frames, latent_height, latent_width), + generator=generator, + device=device, + dtype=dtype, + ) + rows.append(patchify_video_latents(noise, patch_size)) + return torch.cat(rows) diff --git a/invokeai/backend/minimax_h3/sampling.py b/invokeai/backend/minimax_h3/sampling.py new file mode 100644 index 00000000000..3994f7db85b --- /dev/null +++ b/invokeai/backend/minimax_h3/sampling.py @@ -0,0 +1,214 @@ +"""Denoise-state construction for MiniMax H3 (FL2VA / T2VA). + +First-party port of the state-preparation blocks of the diffusers MiniMax-H3 integration +(``modular_pipelines/minimax_h3/before_denoise.py`` at the commit recorded in ``__init__``). +The packed-sequence geometry itself is the vendored :mod:`invokeai.backend.minimax_h3.packing`; +this module only sequences it: noise draws, conditioning-row noise augmentation, schedules and +the per-step row-timestep plan. + +Reproducibility contract (mirrors upstream): a request draws every stream from ONE generator, +in a fixed order — the keyframe conditioning noise first (one draw per keyframe), then the +video noise as a 5D latent tensor that is patchified afterwards, then the audio noise directly +in row layout. A CPU-seeded generator keeps the draws identical across CUDA/ROCm/MPS. +""" + +from dataclasses import dataclass + +import torch +from diffusers.utils.torch_utils import randn_tensor + +from invokeai.backend.minimax_h3.packing import ( + MINIMAX_H3_AUDIO_CHANNELS, + MINIMAX_H3_FPS, + MINIMAX_H3_FRAMES_PER_CHUNK, + MINIMAX_H3_KEYFRAME_NOISE_AUG, + MINIMAX_H3_LATENTS_PER_CHUNK, + MINIMAX_H3_MAX_DURATION, + MINIMAX_H3_MIN_DURATION, + MiniMaxH3PackedSequence, + build_packed_sequence, + build_row_timesteps, + keyframe_condition_noise, + patchify_video_latents, +) +from invokeai.backend.minimax_h3.scheduling_minimax_h3 import MiniMaxH3Scheduler + +# The released FL2VA checkpoint's two sigma shifts (scheduler/ and audio_scheduler/ configs). +MINIMAX_H3_VIDEO_FLOW_SHIFT = 12.0 +MINIMAX_H3_AUDIO_FLOW_SHIFT = 3.0 + +# Transformer geometry of the released checkpoints (transformer/config.json). The vendored +# transformer validates these against its own config at forward time; keeping them as module +# constants lets the state be built without the 33B model in memory. +MINIMAX_H3_PATCH_SIZE = (1, 2, 2) +MINIMAX_H3_VAE_LATENT_CHANNELS = 24 +MINIMAX_H3_AUDIO_LATENT_CHANNELS = 32 +MINIMAX_H3_SPATIAL_COMPRESSION = 16 + +# A single 17-frame-block clip (5 pixel frames, ~0.2 s) is the still-image path: the video VAE +# can decode it, but it sits far below the 5 s floor the model was trained for, so it is only +# offered for frame extraction, not as a video duration. +MINIMAX_H3_STILL_NUM_FRAMES = 5 + + +def validate_num_frames(num_frames: int) -> None: + """Reject frame counts the FL2VA checkpoint cannot generate. + + Valid values are ``17 * n + 5`` (the video VAE's chunk grid). The resulting duration must + lie in the released model's 5-15 s window — except for the single-block minimum of 5 frames, + which is allowed as the still-image (frame-extraction) path. + """ + if num_frames % MINIMAX_H3_FRAMES_PER_CHUNK != MINIMAX_H3_LATENTS_PER_CHUNK: + raise ValueError( + f"num_frames must be of the form 17 * n + 5 for the MiniMax H3 video VAE " + f"(5, 22, 39, ..., 124, ...); got {num_frames}." + ) + if num_frames == MINIMAX_H3_STILL_NUM_FRAMES: + return + duration = num_frames / MINIMAX_H3_FPS + if not MINIMAX_H3_MIN_DURATION <= duration <= MINIMAX_H3_MAX_DURATION: + raise ValueError( + f"MiniMax H3 generates between {MINIMAX_H3_MIN_DURATION:g} and {MINIMAX_H3_MAX_DURATION:g} " + f"seconds at {MINIMAX_H3_FPS} fps ({int(MINIMAX_H3_MIN_DURATION * MINIMAX_H3_FPS)}-" + f"{int(MINIMAX_H3_MAX_DURATION * MINIMAX_H3_FPS)} frames on the 17n+5 grid), or exactly " + f"{MINIMAX_H3_STILL_NUM_FRAMES} frames for a still image; got {num_frames}." + ) + + +def build_schedulers(num_inference_steps: int, device: torch.device) -> tuple[MiniMaxH3Scheduler, MiniMaxH3Scheduler]: + """The two schedules of a request: video (shift 12.0) and audio (shift 3.0).""" + scheduler = MiniMaxH3Scheduler(shift=MINIMAX_H3_VIDEO_FLOW_SHIFT) + audio_scheduler = MiniMaxH3Scheduler(shift=MINIMAX_H3_AUDIO_FLOW_SHIFT) + scheduler.set_timesteps(num_inference_steps, device=device) + audio_scheduler.set_timesteps(num_inference_steps, device=device) + return scheduler, audio_scheduler + + +@dataclass +class MiniMaxH3DenoiseState: + """Everything the denoise loop consumes, on the execution device.""" + + layout: MiniMaxH3PackedSequence + video_rows: torch.Tensor + """Video rows of the packed sequence, conditioning rows first. Shape (C + V, 96), float32.""" + audio_rows: torch.Tensor + """Channel-major audio rows. Shape (A, 32), float32.""" + position_ids: torch.Tensor + token_tags: torch.Tensor + video_indices: torch.Tensor + audio_indices: torch.Tensor + text_indices: torch.Tensor + timesteps: torch.Tensor + audio_timesteps: torch.Tensor + row_timestep_plan: list[tuple[torch.Tensor, torch.Tensor]] + scheduler: MiniMaxH3Scheduler + audio_scheduler: MiniMaxH3Scheduler + + +def build_denoise_state( + text_token_tags: torch.Tensor, + num_latent_frames: int, + latent_height: int, + latent_width: int, + num_audio_latents: int, + num_inference_steps: int, + seed: int, + device: torch.device, + keyframe_anchors: tuple[str, ...] = (), + clean_condition_rows: torch.Tensor | None = None, +) -> MiniMaxH3DenoiseState: + """Build the packed layout, the noise, and the schedules of one FL2VA / T2VA request. + + ``clean_condition_rows`` are the un-noised keyframe conditioning rows (as produced by + :func:`invokeai.backend.minimax_h3.keyframe_conditioning.encode_keyframes`); they are + noise-augmented to ``t = 0.999`` here so that the request's single generator makes its + three draws in upstream's order (keyframe noise, video noise, audio noise). + """ + if (clean_condition_rows is None) != (len(keyframe_anchors) == 0): + raise ValueError("clean_condition_rows and keyframe_anchors must be provided together.") + + layout = build_packed_sequence( + text_token_tags, + num_latent_frames, + latent_height, + latent_width, + num_audio_latents, + MINIMAX_H3_PATCH_SIZE, + keyframe_anchors, + ) + + generator = torch.Generator(device="cpu").manual_seed(seed) + + # Draw 1 (optional): keyframe conditioning noise, one draw per keyframe, in packed order. + condition_rows: torch.Tensor | None = None + if clean_condition_rows is not None: + expected_rows = layout.num_condition_video_rows + if clean_condition_rows.shape[0] != expected_rows: + raise ValueError( + f"Keyframe conditioning carries {clean_condition_rows.shape[0]} rows but the layout " + f"expects {expected_rows}. The frame-conditioning node must be run with the same " + "width/height as the denoise node." + ) + noise = keyframe_condition_noise( + ((1, latent_height, latent_width),) * len(keyframe_anchors), + MINIMAX_H3_PATCH_SIZE, + MINIMAX_H3_VAE_LATENT_CHANNELS, + generator=generator, + device=device, + ) + scale_noise_scheduler = MiniMaxH3Scheduler(shift=MINIMAX_H3_VIDEO_FLOW_SHIFT) + condition_rows = scale_noise_scheduler.scale_noise( + clean_condition_rows.to(device=device, dtype=torch.float32), MINIMAX_H3_KEYFRAME_NOISE_AUG, noise + ) + + # Draw 2: video noise, as a 5D latent tensor, patchified afterwards (upstream order). + video_noise = randn_tensor( + (1, MINIMAX_H3_VAE_LATENT_CHANNELS, num_latent_frames, latent_height, latent_width), + generator=generator, + device=device, + dtype=torch.float32, + ) + video_rows = patchify_video_latents(video_noise, MINIMAX_H3_PATCH_SIZE).to(device) + + # Draw 3: audio noise, directly in row layout. + audio_rows = randn_tensor( + (num_audio_latents * MINIMAX_H3_AUDIO_CHANNELS, MINIMAX_H3_AUDIO_LATENT_CHANNELS), + generator=generator, + device=device, + dtype=torch.float32, + ).to(device) + + if condition_rows is not None: + video_rows = torch.cat([condition_rows, video_rows]) + + scheduler, audio_scheduler = build_schedulers(num_inference_steps, device) + + row_timestep_plan = [ + tuple( + tensor.to(device) + for tensor in build_row_timesteps( + layout, + float(timestep), + float(audio_timestep), + max(float(timestep), MINIMAX_H3_KEYFRAME_NOISE_AUG), + 1.0, + ) + ) + for timestep, audio_timestep in zip(scheduler.timesteps, audio_scheduler.timesteps, strict=True) + ] + + return MiniMaxH3DenoiseState( + layout=layout, + video_rows=video_rows, + audio_rows=audio_rows, + position_ids=layout.position_ids.to(device), + token_tags=layout.token_tags.to(device), + video_indices=layout.video_indices.to(device), + audio_indices=layout.audio_indices.to(device), + text_indices=layout.text_indices.to(device), + timesteps=scheduler.timesteps, + audio_timesteps=audio_scheduler.timesteps, + row_timestep_plan=row_timestep_plan, + scheduler=scheduler, + audio_scheduler=audio_scheduler, + ) diff --git a/invokeai/backend/minimax_h3/text_conditioning.py b/invokeai/backend/minimax_h3/text_conditioning.py new file mode 100644 index 00000000000..ee7b3a163b5 --- /dev/null +++ b/invokeai/backend/minimax_h3/text_conditioning.py @@ -0,0 +1,89 @@ +"""MiniMax H3 text (and keyframe-vision) conditioning. + +First-party port of the FL2VA half of ``modular_pipelines/minimax_h3/encoders.py`` (commit +recorded in ``__init__``). The presentation is the verbatim prompt, preceded by a +``": "`` label and a vision block per keyframe — no chat template, no special +tokens. The conditioning is the *unnormalized* hidden state after the 50th of the Qwen3-VL +conditioner's 64 decoder layers; the language-model head never runs. +""" + +import torch + +from invokeai.backend.minimax_h3.packing import ( + MINIMAX_H3_TEXT_ENCODER_LAYER, + MINIMAX_H3_TEXT_TAG, + MINIMAX_H3_VIDEO_TAG, +) + + +def encode_prompt( + text_encoder, + tokenizer, + processor, + prompt: str, + keyframe_images: list | None = None, + device: torch.device | None = None, +) -> tuple[torch.Tensor, torch.Tensor]: + """Build MiniMax H3's presentation of a request and encode it. + + Args: + text_encoder: A ``Qwen3VLForConditionalGeneration`` (the full released checkpoint). + tokenizer: The Qwen2 fast tokenizer. + processor: The ``Qwen3VLProcessor`` (needed even for text-only requests: it derives + the token-type ids Qwen3-VL's 3D rotary layout keys off). + prompt: The prompt, a single string (H3 packs one request into one sequence). + keyframe_images: The keyframes already prepared onto the target canvas, in packed + order (None or empty for text-to-video). + device: The device to run the conditioner on. + + Returns: + ``(prompt_embeds, text_token_tags)``: the ``(1, num_text_tokens, text_dim)`` hidden + states and the per-row modality tags (vision-block rows are tagged as video). + """ + num_layers = text_encoder.config.text_config.num_hidden_layers + if num_layers <= MINIMAX_H3_TEXT_ENCODER_LAYER: + raise ValueError( + f"MiniMax H3 conditions on hidden_states[{MINIMAX_H3_TEXT_ENCODER_LAYER}] of its Qwen3-VL " + f"conditioner, which needs more than {MINIMAX_H3_TEXT_ENCODER_LAYER} decoder layers; the " + f"selected text encoder has {num_layers}. A truncated stack's last hidden state is post-norm " + "and is not the conditioning MiniMax H3 expects." + ) + + pixel_values, image_grid_thw = None, None + token_ids: list[int] = [] + token_tags: list[int] = [] + if keyframe_images: + vision = processor.image_processor(images=keyframe_images, return_tensors="pt") + pixel_values, image_grid_thw = vision["pixel_values"], vision["image_grid_thw"] + merge_size = processor.image_processor.merge_size**2 + for index in range(len(keyframe_images)): + num_image_tokens = int(image_grid_thw[index].prod()) // merge_size + label_ids = tokenizer(f": ", add_special_tokens=False)["input_ids"] + vision_ids = ( + [tokenizer.convert_tokens_to_ids("<|vision_start|>")] + + [tokenizer.convert_tokens_to_ids("<|image_pad|>")] * num_image_tokens + + [tokenizer.convert_tokens_to_ids("<|vision_end|>")] + ) + token_ids += label_ids + vision_ids + token_tags += [MINIMAX_H3_TEXT_TAG] * len(label_ids) + [MINIMAX_H3_VIDEO_TAG] * len(vision_ids) + prompt_ids = tokenizer(prompt, add_special_tokens=False)["input_ids"] + token_ids += prompt_ids + token_tags += [MINIMAX_H3_TEXT_TAG] * len(prompt_ids) + + input_ids = torch.tensor([token_ids], dtype=torch.long, device=device) + mm_token_type_ids = torch.tensor(processor.create_mm_token_type_ids([token_ids]), dtype=torch.long, device=device) + # Call the language-model submodule directly: MiniMax H3 reads hidden_states[50] and never + # uses the LM head, whose vocabulary-wide projection is all the top-level forward would add. + # (InvokeAI's model cache places the whole module before this is called, so upstream's + # accelerate-hook workaround is not needed here.) + outputs = text_encoder.model( + input_ids=input_ids, + attention_mask=torch.ones_like(input_ids), + mm_token_type_ids=mm_token_type_ids, + pixel_values=None if pixel_values is None else pixel_values.to(device, text_encoder.dtype), + image_grid_thw=None if image_grid_thw is None else image_grid_thw.to(device), + use_cache=False, + output_hidden_states=True, + ) + prompt_embeds = outputs.hidden_states[MINIMAX_H3_TEXT_ENCODER_LAYER] + return prompt_embeds, torch.tensor(token_tags, dtype=torch.long) diff --git a/invokeai/backend/stable_diffusion/diffusion/conditioning_data.py b/invokeai/backend/stable_diffusion/diffusion/conditioning_data.py index 47372ec9d8d..b271addc287 100644 --- a/invokeai/backend/stable_diffusion/diffusion/conditioning_data.py +++ b/invokeai/backend/stable_diffusion/diffusion/conditioning_data.py @@ -181,6 +181,40 @@ def to(self, device: torch.device | None = None, dtype: torch.dtype | None = Non return self +@dataclass +class MiniMaxH3ConditioningInfo: + """MiniMax H3 text conditioning from the Qwen3-VL-32B conditioner. + + ``prompt_embeds`` is the *unnormalized* hidden state after the conditioner's 50th decoder + layer. ``text_token_tags`` is the per-row modality tag of every embedding row (text rows + tagged 1, keyframe vision-block rows tagged 0 = video); the denoise node builds the packed + sequence layout from it, so it must travel with the embeddings. + """ + + prompt_embeds: torch.Tensor + """Qwen3-VL layer-50 hidden states. Shape: (1, num_text_tokens, 5120).""" + + text_token_tags: torch.Tensor + """Per-row modality tags. Shape: (num_text_tokens,), dtype long.""" + + keyframe_anchors: tuple[str, ...] = () + """Which keyframes ("first"/"last", packed order) were part of the vision context. The + denoise node cross-checks this against its frame-conditioning input: keyframes must reach + the text conditioning and the VAE condition rows together, or not at all.""" + + width: int | None = None + """Canvas width the keyframes were prepared at (None when no keyframes).""" + + height: int | None = None + """Canvas height the keyframes were prepared at (None when no keyframes).""" + + def to(self, device: torch.device | None = None, dtype: torch.dtype | None = None): + self.prompt_embeds = self.prompt_embeds.to(device=device, dtype=dtype) + # Tags are structural (long); only the device moves. + self.text_token_tags = self.text_token_tags.to(device=device) + return self + + @dataclass class WanConditioningInfo: """Wan 2.2 text conditioning information from the UMT5-XXL encoder. @@ -220,6 +254,7 @@ class ConditioningFieldData: | List[Krea2ConditioningInfo] | List[AnimaConditioningInfo] | List[WanConditioningInfo] + | List[MiniMaxH3ConditioningInfo] ) diff --git a/invokeai/backend/util/vae_working_memory.py b/invokeai/backend/util/vae_working_memory.py index fbd1c0e1280..e1be5c4c606 100644 --- a/invokeai/backend/util/vae_working_memory.py +++ b/invokeai/backend/util/vae_working_memory.py @@ -125,6 +125,36 @@ def estimate_vae_working_memory_anima( return int(working_memory) +def estimate_vae_working_memory_minimax_h3( + operation: Literal["encode", "decode"], + vae: "torch.nn.Module", + pixel_height: int, + pixel_width: int, + pixel_frames: int, +) -> int: + """Estimate the working memory to encode/decode with the MiniMax H3 video VAE. + + The H3 VAE always tiles spatially (``use_tiling`` defaults to True with 256px tiles / 64px + overlap, and the released frames are the blended-tile ones), so the conv working set is + per-tile, not per-frame: the tile geometry is read from the instance. The full RGB clip is + still assembled on the execution device (fp32 — the VAE's weights are pinned fp32), plus + one transient copy. The Wan per-pixel calibration constant is kept as a conservative + stand-in until an H3-specific calibration exists. + """ + element_size = next(vae.parameters()).element_size() + + scaling_constant = 2900 if operation == "decode" else 1450 + tile_height = min(int(getattr(vae, "tile_sample_min_height", 256)), pixel_height) + tile_width = min(int(getattr(vae, "tile_sample_min_width", 256)), pixel_width) + # 1.25 accounts for tile overlap. + tile_working = tile_height * tile_width * element_size * scaling_constant * 1.25 + + clip_copies = 2 if operation == "decode" else 1 + clip_bytes = clip_copies * 3 * pixel_frames * pixel_height * pixel_width * element_size + + return int(tile_working + clip_bytes) + + def estimate_vae_working_memory_wan( operation: Literal["encode", "decode"], vae: AutoencoderKLWan, diff --git a/invokeai/frontend/web/openapi.json b/invokeai/frontend/web/openapi.json index 2d5b5ee4261..b023b4e09da 100644 --- a/invokeai/frontend/web/openapi.json +++ b/invokeai/frontend/web/openapi.json @@ -22095,7 +22095,10 @@ "wan_img2img", "wan_inpaint", "wan_outpaint", - "wan_i2v" + "wan_i2v", + "minimax_h3_t2v", + "minimax_h3_i2v", + "minimax_h3_txt2img" ], "type": "string" }, @@ -34484,6 +34487,24 @@ { "$ref": "#/components/schemas/MetadataToVAEInvocation" }, + { + "$ref": "#/components/schemas/MiniMaxH3DenoiseInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3FrameConditioningInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3LatentsToImageInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3LatentsToVideoInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3ModelLoaderInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3TextEncoderInvocation" + }, { "$ref": "#/components/schemas/ModelIdentifierInvocation" }, @@ -35051,6 +35072,18 @@ { "$ref": "#/components/schemas/MetadataToSDXLModelOutput" }, + { + "$ref": "#/components/schemas/MiniMaxH3ConditioningOutput" + }, + { + "$ref": "#/components/schemas/MiniMaxH3DenoiseOutput" + }, + { + "$ref": "#/components/schemas/MiniMaxH3FrameConditioningOutput" + }, + { + "$ref": "#/components/schemas/MiniMaxH3ModelLoaderOutput" + }, { "$ref": "#/components/schemas/ModelIdentifierOutput" }, @@ -43001,6 +43034,24 @@ { "$ref": "#/components/schemas/MetadataToVAEInvocation" }, + { + "$ref": "#/components/schemas/MiniMaxH3DenoiseInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3FrameConditioningInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3LatentsToImageInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3LatentsToVideoInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3ModelLoaderInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3TextEncoderInvocation" + }, { "$ref": "#/components/schemas/ModelIdentifierInvocation" }, @@ -43525,6 +43576,18 @@ { "$ref": "#/components/schemas/MetadataToSDXLModelOutput" }, + { + "$ref": "#/components/schemas/MiniMaxH3ConditioningOutput" + }, + { + "$ref": "#/components/schemas/MiniMaxH3DenoiseOutput" + }, + { + "$ref": "#/components/schemas/MiniMaxH3FrameConditioningOutput" + }, + { + "$ref": "#/components/schemas/MiniMaxH3ModelLoaderOutput" + }, { "$ref": "#/components/schemas/ModelIdentifierOutput" }, @@ -44331,6 +44394,24 @@ { "$ref": "#/components/schemas/MetadataToVAEInvocation" }, + { + "$ref": "#/components/schemas/MiniMaxH3DenoiseInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3FrameConditioningInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3LatentsToImageInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3LatentsToVideoInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3ModelLoaderInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3TextEncoderInvocation" + }, { "$ref": "#/components/schemas/ModelIdentifierInvocation" }, @@ -45285,6 +45366,24 @@ "metadata_to_vae": { "$ref": "#/components/schemas/VAEOutput" }, + "minimax_h3_denoise": { + "$ref": "#/components/schemas/MiniMaxH3DenoiseOutput" + }, + "minimax_h3_frame_conditioning": { + "$ref": "#/components/schemas/MiniMaxH3FrameConditioningOutput" + }, + "minimax_h3_latents_to_image": { + "$ref": "#/components/schemas/ImageOutput" + }, + "minimax_h3_latents_to_video": { + "$ref": "#/components/schemas/VideoOutput" + }, + "minimax_h3_model_loader": { + "$ref": "#/components/schemas/MiniMaxH3ModelLoaderOutput" + }, + "minimax_h3_text_encoder": { + "$ref": "#/components/schemas/MiniMaxH3ConditioningOutput" + }, "mlsd_detection": { "$ref": "#/components/schemas/ImageOutput" }, @@ -45790,6 +45889,12 @@ "metadata_to_string_collection", "metadata_to_t2i_adapters", "metadata_to_vae", + "minimax_h3_denoise", + "minimax_h3_frame_conditioning", + "minimax_h3_latents_to_image", + "minimax_h3_latents_to_video", + "minimax_h3_model_loader", + "minimax_h3_text_encoder", "mlsd_detection", "model_identifier", "mul", @@ -46564,6 +46669,24 @@ { "$ref": "#/components/schemas/MetadataToVAEInvocation" }, + { + "$ref": "#/components/schemas/MiniMaxH3DenoiseInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3FrameConditioningInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3LatentsToImageInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3LatentsToVideoInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3ModelLoaderInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3TextEncoderInvocation" + }, { "$ref": "#/components/schemas/ModelIdentifierInvocation" }, @@ -47609,6 +47732,24 @@ { "$ref": "#/components/schemas/MetadataToVAEInvocation" }, + { + "$ref": "#/components/schemas/MiniMaxH3DenoiseInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3FrameConditioningInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3LatentsToImageInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3LatentsToVideoInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3ModelLoaderInvocation" + }, + { + "$ref": "#/components/schemas/MiniMaxH3TextEncoderInvocation" + }, { "$ref": "#/components/schemas/ModelIdentifierInvocation" }, @@ -64608,6 +64749,952 @@ "$ref": "#/components/schemas/VAEOutput" } }, + "MiniMaxH3ConditioningField": { + "description": "A MiniMax H3 conditioning primitive value.\n\nH3 conditioning is the layer-50 Qwen3-VL hidden state plus the per-row modality tags the\npacked-sequence layout is built from (vision-block rows are tagged as video).", + "properties": { + "conditioning_name": { + "description": "The name of conditioning tensor", + "title": "Conditioning Name", + "type": "string" + } + }, + "required": ["conditioning_name"], + "title": "MiniMaxH3ConditioningField", + "type": "object" + }, + "MiniMaxH3ConditioningOutput": { + "class": "output", + "description": "Base class for nodes that output a MiniMax H3 conditioning tensor.", + "properties": { + "conditioning": { + "$ref": "#/components/schemas/MiniMaxH3ConditioningField", + "description": "Conditioning tensor", + "field_kind": "output", + "ui_hidden": false + }, + "type": { + "const": "minimax_h3_conditioning_output", + "default": "minimax_h3_conditioning_output", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["output_meta", "conditioning", "type", "type"], + "title": "MiniMaxH3ConditioningOutput", + "type": "object" + }, + "MiniMaxH3DenoiseInvocation": { + "category": "latents", + "class": "invocation", + "classification": "prototype", + "description": "Run the MiniMax H3 joint audio-video denoising loop.", + "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" + }, + "transformer": { + "anyOf": [ + { + "$ref": "#/components/schemas/MiniMaxH3TransformerField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "MiniMax H3 FL2VA transformer.", + "field_kind": "input", + "input": "connection", + "orig_required": true, + "title": "Transformer" + }, + "positive_conditioning": { + "anyOf": [ + { + "$ref": "#/components/schemas/MiniMaxH3ConditioningField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Positive conditioning tensor", + "field_kind": "input", + "input": "connection", + "orig_required": true + }, + "frame_conditioning": { + "anyOf": [ + { + "$ref": "#/components/schemas/MiniMaxH3FrameConditioningField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "First/last-keyframe (VAE-latent) conditioning for MiniMax H3", + "field_kind": "input", + "input": "connection", + "orig_default": null, + "orig_required": false, + "title": "Frame Conditioning" + }, + "width": { + "default": 1344, + "description": "Width of the generated video. H3's native canvas has a 768px short edge (max 768x1344).", + "exclusiveMinimum": 0, + "field_kind": "input", + "input": "any", + "multipleOf": 32, + "orig_default": 1344, + "orig_required": false, + "title": "Width", + "type": "integer" + }, + "height": { + "default": 768, + "description": "Height of the generated video.", + "exclusiveMinimum": 0, + "field_kind": "input", + "input": "any", + "multipleOf": 32, + "orig_default": 768, + "orig_required": false, + "title": "Height", + "type": "integer" + }, + "num_frames": { + "default": 124, + "description": "Number of output frames at the fixed 24 fps. Must be of the form 17n+5 (5, 22, ..., 124, ...); durations must stay within 5-15 s, except exactly 5 frames for a still image.", + "field_kind": "input", + "input": "any", + "minimum": 5, + "orig_default": 124, + "orig_required": false, + "title": "Number of Frames", + "type": "integer" + }, + "steps": { + "default": 50, + "description": "Number of denoising steps (sigma grid points, terminal included: N steps = N-1 model evaluations).", + "field_kind": "input", + "input": "any", + "minimum": 2, + "orig_default": 50, + "orig_required": false, + "title": "Steps", + "type": "integer" + }, + "seed": { + "default": 0, + "description": "Randomness seed for reproducibility.", + "field_kind": "input", + "input": "any", + "orig_default": 0, + "orig_required": false, + "title": "Seed", + "type": "integer" + }, + "type": { + "const": "minimax_h3_denoise", + "default": "minimax_h3_denoise", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["type", "id"], + "tags": ["latents", "video", "audio", "minimax"], + "title": "Denoise - MiniMax H3", + "type": "object", + "version": "1.0.0", + "output": { + "$ref": "#/components/schemas/MiniMaxH3DenoiseOutput" + } + }, + "MiniMaxH3DenoiseOutput": { + "class": "output", + "description": "Joint video + audio latents from one MiniMax H3 denoise run.", + "properties": { + "video_latents": { + "$ref": "#/components/schemas/LatentsField", + "description": "5D video latents [1, 24, T_lat, H/16, W/16].", + "field_kind": "output", + "ui_hidden": false + }, + "audio_latents": { + "$ref": "#/components/schemas/LatentsField", + "description": "Audio latents [2, 32, T_audio] (one item per stereo channel).", + "field_kind": "output", + "ui_hidden": false + }, + "width": { + "description": "Pixel width of the video latents.", + "field_kind": "output", + "title": "Width", + "type": "integer", + "ui_hidden": false + }, + "height": { + "description": "Pixel height of the video latents.", + "field_kind": "output", + "title": "Height", + "type": "integer", + "ui_hidden": false + }, + "num_frames": { + "description": "Pixel-frame count of the video latents.", + "field_kind": "output", + "title": "Num Frames", + "type": "integer", + "ui_hidden": false + }, + "type": { + "const": "minimax_h3_denoise_output", + "default": "minimax_h3_denoise_output", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["output_meta", "video_latents", "audio_latents", "width", "height", "num_frames", "type", "type"], + "title": "MiniMaxH3DenoiseOutput", + "type": "object" + }, + "MiniMaxH3FrameConditioningField": { + "description": "First/last-keyframe conditioning for MiniMax H3 (FL2VA).\n\nCarries the CLEAN (not yet noise-augmented) packed keyframe conditioning rows; the denoise\nnode noise-augments them to t=0.999 with the request seed's first draws. Width/height ride\nalong so the denoise node can reject a canvas mismatch instead of failing inside the\ntransformer.", + "properties": { + "condition_rows_name": { + "description": "Name of the saved (num_condition_rows, 96) rows tensor.", + "title": "Condition Rows Name", + "type": "string" + }, + "keyframe_anchors": { + "description": "Which end each keyframe anchors, in packed order (\"first\" / \"last\").", + "items": { + "type": "string" + }, + "title": "Keyframe Anchors", + "type": "array" + }, + "width": { + "description": "Canvas width used during VAE encoding (matches denoise width).", + "title": "Width", + "type": "integer" + }, + "height": { + "description": "Canvas height used during VAE encoding (matches denoise height).", + "title": "Height", + "type": "integer" + } + }, + "required": ["condition_rows_name", "keyframe_anchors", "width", "height"], + "title": "MiniMaxH3FrameConditioningField", + "type": "object" + }, + "MiniMaxH3FrameConditioningInvocation": { + "category": "conditioning", + "class": "invocation", + "classification": "prototype", + "description": "VAE-encodes first/last keyframes into MiniMax H3 conditioning rows.\n\nThe rows are clean (the denoise node noise-augments them with the request seed). The same\nimages and width/height must also be wired to the Prompt - MiniMax H3 node: the keyframes\nare part of both the packed sequence and the text conditioning.", + "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" + }, + "first_image": { + "anyOf": [ + { + "$ref": "#/components/schemas/ImageField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Keyframe the video starts from (stretched onto the canvas).", + "field_kind": "input", + "input": "any", + "orig_default": null, + "orig_required": false + }, + "last_image": { + "anyOf": [ + { + "$ref": "#/components/schemas/ImageField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Keyframe the video ends on (cover-cropped onto the canvas).", + "field_kind": "input", + "input": "any", + "orig_default": null, + "orig_required": false + }, + "vae": { + "anyOf": [ + { + "$ref": "#/components/schemas/VAEField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "VAE", + "field_kind": "input", + "input": "connection", + "orig_required": true, + "title": "Video VAE" + }, + "width": { + "default": 1344, + "description": "Target canvas width.", + "exclusiveMinimum": 0, + "field_kind": "input", + "input": "any", + "multipleOf": 32, + "orig_default": 1344, + "orig_required": false, + "title": "Width", + "type": "integer" + }, + "height": { + "default": 768, + "description": "Target canvas height.", + "exclusiveMinimum": 0, + "field_kind": "input", + "input": "any", + "multipleOf": 32, + "orig_default": 768, + "orig_required": false, + "title": "Height", + "type": "integer" + }, + "type": { + "const": "minimax_h3_frame_conditioning", + "default": "minimax_h3_frame_conditioning", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["type", "id"], + "tags": ["conditioning", "minimax", "video", "i2v"], + "title": "Frame Conditioning - MiniMax H3", + "type": "object", + "version": "1.0.0", + "output": { + "$ref": "#/components/schemas/MiniMaxH3FrameConditioningOutput" + } + }, + "MiniMaxH3FrameConditioningOutput": { + "class": "output", + "description": "Output of the MiniMax H3 keyframe VAE-encoder.", + "properties": { + "frame_conditioning": { + "$ref": "#/components/schemas/MiniMaxH3FrameConditioningField", + "description": "First/last-keyframe (VAE-latent) conditioning for MiniMax H3", + "field_kind": "output", + "ui_hidden": false + }, + "type": { + "const": "minimax_h3_frame_conditioning_output", + "default": "minimax_h3_frame_conditioning_output", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["output_meta", "frame_conditioning", "type", "type"], + "title": "MiniMaxH3FrameConditioningOutput", + "type": "object" + }, + "MiniMaxH3LatentsToImageInvocation": { + "category": "latents", + "class": "invocation", + "classification": "prototype", + "description": "Decode MiniMax H3 video latents and save a single frame as an image.", + "node_pack": "invokeai", + "properties": { + "board": { + "anyOf": [ + { + "$ref": "#/components/schemas/BoardField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The board to save the image to", + "field_kind": "internal", + "input": "direct", + "orig_required": false, + "ui_hidden": false + }, + "metadata": { + "anyOf": [ + { + "$ref": "#/components/schemas/MetadataField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional metadata to be saved with the image", + "field_kind": "internal", + "input": "connection", + "orig_required": false, + "ui_hidden": false + }, + "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" + }, + "video_latents": { + "anyOf": [ + { + "$ref": "#/components/schemas/LatentsField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Latents tensor", + "field_kind": "input", + "input": "connection", + "orig_required": true + }, + "vae": { + "anyOf": [ + { + "$ref": "#/components/schemas/VAEField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "VAE", + "field_kind": "input", + "input": "connection", + "orig_required": true, + "title": "Video VAE" + }, + "frame_index": { + "default": 0, + "description": "Which decoded frame to save.", + "field_kind": "input", + "input": "any", + "minimum": 0, + "orig_default": 0, + "orig_required": false, + "title": "Frame Index", + "type": "integer" + }, + "type": { + "const": "minimax_h3_latents_to_image", + "default": "minimax_h3_latents_to_image", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["type", "id"], + "tags": ["latents", "image", "vae", "l2i", "minimax"], + "title": "Latents to Image - MiniMax H3", + "type": "object", + "version": "1.0.0", + "output": { + "$ref": "#/components/schemas/ImageOutput" + } + }, + "MiniMaxH3LatentsToVideoInvocation": { + "category": "latents", + "class": "invocation", + "classification": "prototype", + "description": "Decode MiniMax H3 video+audio latents and encode an MP4 with an AAC stereo track.", + "node_pack": "invokeai", + "properties": { + "board": { + "anyOf": [ + { + "$ref": "#/components/schemas/BoardField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The board to save the image to", + "field_kind": "internal", + "input": "direct", + "orig_required": false, + "ui_hidden": false + }, + "metadata": { + "anyOf": [ + { + "$ref": "#/components/schemas/MetadataField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional metadata to be saved with the image", + "field_kind": "internal", + "input": "connection", + "orig_required": false, + "ui_hidden": false + }, + "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" + }, + "video_latents": { + "anyOf": [ + { + "$ref": "#/components/schemas/LatentsField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Latents tensor", + "field_kind": "input", + "input": "connection", + "orig_required": true + }, + "audio_latents": { + "anyOf": [ + { + "$ref": "#/components/schemas/LatentsField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Audio latents [2, 32, T_audio] from the denoise node. Omit for a silent video.", + "field_kind": "input", + "input": "connection", + "orig_default": null, + "orig_required": false + }, + "vae": { + "anyOf": [ + { + "$ref": "#/components/schemas/VAEField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "VAE", + "field_kind": "input", + "input": "connection", + "orig_required": true, + "title": "Video VAE" + }, + "audio_vae": { + "anyOf": [ + { + "$ref": "#/components/schemas/VAEField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Audio VAE (stereo, 32 kHz) for MiniMax H3", + "field_kind": "input", + "input": "connection", + "orig_default": null, + "orig_required": false, + "title": "Audio VAE" + }, + "type": { + "const": "minimax_h3_latents_to_video", + "default": "minimax_h3_latents_to_video", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["type", "id"], + "tags": ["latents", "video", "audio", "vae", "l2v", "minimax"], + "title": "Latents to Video - MiniMax H3", + "type": "object", + "version": "1.0.0", + "output": { + "$ref": "#/components/schemas/VideoOutput" + } + }, + "MiniMaxH3ModelLoaderInvocation": { + "category": "model", + "class": "invocation", + "classification": "prototype", + "description": "Loads a MiniMax H3 (FL2VA) model, outputting its submodels.\n\nAll six submodels (transformer, text encoder, tokenizer, processor, video VAE, audio VAE)\ncome from the one diffusers-layout install; there is no component mix-and-match yet.", + "node_pack": "invokeai", + "properties": { + "id": { + "description": "The id of this instance of an invocation. Must be unique among all instances of invocations.", + "field_kind": "node_attribute", + "title": "Id", + "type": "string" + }, + "is_intermediate": { + "default": false, + "description": "Whether or not this is an intermediate invocation.", + "field_kind": "node_attribute", + "input": "direct", + "orig_required": true, + "title": "Is Intermediate", + "type": "boolean", + "ui_hidden": false, + "ui_type": "IsIntermediate" + }, + "use_cache": { + "default": true, + "description": "Whether or not to use the cache", + "field_kind": "node_attribute", + "title": "Use Cache", + "type": "boolean" + }, + "model": { + "$ref": "#/components/schemas/ModelIdentifierField", + "description": "MiniMax H3 model (Transformer) to load", + "field_kind": "input", + "input": "direct", + "orig_required": true, + "title": "Model", + "ui_model_base": ["minimax-h3"], + "ui_model_type": ["main"] + }, + "type": { + "const": "minimax_h3_model_loader", + "default": "minimax_h3_model_loader", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["model", "type", "id"], + "tags": ["model", "minimax", "video"], + "title": "Main Model - MiniMax H3", + "type": "object", + "version": "1.0.0", + "output": { + "$ref": "#/components/schemas/MiniMaxH3ModelLoaderOutput" + } + }, + "MiniMaxH3ModelLoaderOutput": { + "class": "output", + "description": "MiniMax H3 model loader output.", + "properties": { + "transformer": { + "$ref": "#/components/schemas/MiniMaxH3TransformerField", + "description": "MiniMax H3 FL2VA transformer", + "field_kind": "output", + "title": "Transformer", + "ui_hidden": false + }, + "text_encoder": { + "$ref": "#/components/schemas/MiniMaxH3TextEncoderField", + "description": "Qwen3-VL-32B tokenizer, processor and text encoder for MiniMax H3", + "field_kind": "output", + "title": "Qwen3-VL Encoder", + "ui_hidden": false + }, + "vae": { + "$ref": "#/components/schemas/VAEField", + "description": "VAE", + "field_kind": "output", + "title": "Video VAE", + "ui_hidden": false + }, + "audio_vae": { + "$ref": "#/components/schemas/VAEField", + "description": "Audio VAE (stereo, 32 kHz) for MiniMax H3", + "field_kind": "output", + "title": "Audio VAE", + "ui_hidden": false + }, + "type": { + "const": "minimax_h3_model_loader_output", + "default": "minimax_h3_model_loader_output", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["output_meta", "transformer", "text_encoder", "vae", "audio_vae", "type", "type"], + "title": "MiniMaxH3ModelLoaderOutput", + "type": "object" + }, + "MiniMaxH3TextEncoderField": { + "description": "Field for the Qwen3-VL-32B conditioner used by MiniMax H3 models.\n\nUnlike :class:`Qwen3VLEncoderField`, H3 also needs the Qwen3VLProcessor \u2014 even for\ntext-only prompts (its multimodal token-type ids drive Qwen3-VL's 3D rotary layout), and\nfor feeding first/last keyframes to the conditioner as vision context.", + "properties": { + "tokenizer": { + "$ref": "#/components/schemas/ModelIdentifierField", + "description": "Info to load tokenizer submodel" + }, + "processor": { + "$ref": "#/components/schemas/ModelIdentifierField", + "description": "Info to load processor submodel" + }, + "text_encoder": { + "$ref": "#/components/schemas/ModelIdentifierField", + "description": "Info to load text_encoder submodel" + } + }, + "required": ["tokenizer", "processor", "text_encoder"], + "title": "MiniMaxH3TextEncoderField", + "type": "object" + }, + "MiniMaxH3TextEncoderInvocation": { + "category": "conditioning", + "class": "invocation", + "classification": "prototype", + "description": "Encodes a prompt (and optional first/last keyframes) for MiniMax H3.\n\nThe conditioning is Qwen3-VL-32B's *unnormalized* layer-50 hidden state. H3 is\nguidance-distilled: there is no negative prompt. For first/last-frame video, the keyframes\nare ALSO part of the text conditioning (a \": \" label plus a vision block per\nkeyframe), so the same images must be wired here and to the Frame Conditioning node, with\nthe same width/height as the denoise node.", + "node_pack": "invokeai", + "properties": { + "id": { + "description": "The id of this instance of an invocation. Must be unique among all instances of invocations.", + "field_kind": "node_attribute", + "title": "Id", + "type": "string" + }, + "is_intermediate": { + "default": false, + "description": "Whether or not this is an intermediate invocation.", + "field_kind": "node_attribute", + "input": "direct", + "orig_required": true, + "title": "Is Intermediate", + "type": "boolean", + "ui_hidden": false, + "ui_type": "IsIntermediate" + }, + "use_cache": { + "default": true, + "description": "Whether or not to use the cache", + "field_kind": "node_attribute", + "title": "Use Cache", + "type": "boolean" + }, + "prompt": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Text prompt for MiniMax H3.", + "field_kind": "input", + "input": "any", + "orig_required": true, + "title": "Prompt", + "ui_component": "textarea" + }, + "text_encoder": { + "anyOf": [ + { + "$ref": "#/components/schemas/MiniMaxH3TextEncoderField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Qwen3-VL-32B tokenizer, processor and text encoder for MiniMax H3", + "field_kind": "input", + "input": "connection", + "orig_required": true, + "title": "Qwen3-VL Encoder" + }, + "first_image": { + "anyOf": [ + { + "$ref": "#/components/schemas/ImageField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional keyframe the video starts from (must match Frame Conditioning).", + "field_kind": "input", + "input": "any", + "orig_default": null, + "orig_required": false + }, + "last_image": { + "anyOf": [ + { + "$ref": "#/components/schemas/ImageField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional keyframe the video ends on (must match Frame Conditioning).", + "field_kind": "input", + "input": "any", + "orig_default": null, + "orig_required": false + }, + "width": { + "default": 1344, + "description": "Target canvas width.", + "exclusiveMinimum": 0, + "field_kind": "input", + "input": "any", + "multipleOf": 32, + "orig_default": 1344, + "orig_required": false, + "title": "Width", + "type": "integer" + }, + "height": { + "default": 768, + "description": "Target canvas height.", + "exclusiveMinimum": 0, + "field_kind": "input", + "input": "any", + "multipleOf": 32, + "orig_default": 768, + "orig_required": false, + "title": "Height", + "type": "integer" + }, + "type": { + "const": "minimax_h3_text_encoder", + "default": "minimax_h3_text_encoder", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["type", "id"], + "tags": ["prompt", "conditioning", "minimax", "video"], + "title": "Prompt - MiniMax H3", + "type": "object", + "version": "1.0.0", + "output": { + "$ref": "#/components/schemas/MiniMaxH3ConditioningOutput" + } + }, + "MiniMaxH3TransformerField": { + "description": "Transformer field for MiniMax H3 models (FL2VA).", + "properties": { + "transformer": { + "$ref": "#/components/schemas/ModelIdentifierField", + "description": "Info to load Transformer submodel" + } + }, + "required": ["transformer"], + "title": "MiniMaxH3TransformerField", + "type": "object" + }, "MiniMaxH3VariantType": { "type": "string", "enum": ["fl2va"], diff --git a/invokeai/frontend/web/src/services/api/schema.ts b/invokeai/frontend/web/src/services/api/schema.ts index 66f90f8950b..09ce344be87 100644 --- a/invokeai/frontend/web/src/services/api/schema.ts +++ b/invokeai/frontend/web/src/services/api/schema.ts @@ -8370,7 +8370,7 @@ export type components = { * @description The generation mode that output this image * @default null */ - generation_mode?: ("txt2img" | "img2img" | "inpaint" | "outpaint" | "sdxl_txt2img" | "sdxl_img2img" | "sdxl_inpaint" | "sdxl_outpaint" | "flux_txt2img" | "flux_img2img" | "flux_inpaint" | "flux_outpaint" | "flux2_txt2img" | "flux2_img2img" | "flux2_inpaint" | "flux2_outpaint" | "sd3_txt2img" | "sd3_img2img" | "sd3_inpaint" | "sd3_outpaint" | "cogview4_txt2img" | "cogview4_img2img" | "cogview4_inpaint" | "cogview4_outpaint" | "z_image_txt2img" | "z_image_img2img" | "z_image_inpaint" | "z_image_outpaint" | "ernie_image_txt2img" | "ideogram4_txt2img" | "qwen_image_txt2img" | "qwen_image_img2img" | "qwen_image_inpaint" | "qwen_image_outpaint" | "anima_txt2img" | "anima_img2img" | "anima_inpaint" | "anima_outpaint" | "krea2_txt2img" | "krea2_img2img" | "krea2_inpaint" | "krea2_outpaint" | "wan_txt2img" | "wan_img2img" | "wan_inpaint" | "wan_outpaint" | "wan_i2v") | null; + generation_mode?: ("txt2img" | "img2img" | "inpaint" | "outpaint" | "sdxl_txt2img" | "sdxl_img2img" | "sdxl_inpaint" | "sdxl_outpaint" | "flux_txt2img" | "flux_img2img" | "flux_inpaint" | "flux_outpaint" | "flux2_txt2img" | "flux2_img2img" | "flux2_inpaint" | "flux2_outpaint" | "sd3_txt2img" | "sd3_img2img" | "sd3_inpaint" | "sd3_outpaint" | "cogview4_txt2img" | "cogview4_img2img" | "cogview4_inpaint" | "cogview4_outpaint" | "z_image_txt2img" | "z_image_img2img" | "z_image_inpaint" | "z_image_outpaint" | "ernie_image_txt2img" | "ideogram4_txt2img" | "qwen_image_txt2img" | "qwen_image_img2img" | "qwen_image_inpaint" | "qwen_image_outpaint" | "anima_txt2img" | "anima_img2img" | "anima_inpaint" | "anima_outpaint" | "krea2_txt2img" | "krea2_img2img" | "krea2_inpaint" | "krea2_outpaint" | "wan_txt2img" | "wan_img2img" | "wan_inpaint" | "wan_outpaint" | "wan_i2v" | "minimax_h3_t2v" | "minimax_h3_i2v" | "minimax_h3_txt2img") | null; /** * Positive Prompt * @description The positive prompt parameter @@ -14223,7 +14223,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"]["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"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | 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"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | 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"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + [key: string]: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["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"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; }; /** * Edges @@ -14260,7 +14260,7 @@ export type components = { * @description The results of node executions */ results: { - [key: string]: components["schemas"]["AnimaConditioningOutput"] | components["schemas"]["AnimaLLLiteOutput"] | components["schemas"]["AnimaLoRALoaderOutput"] | components["schemas"]["AnimaModelLoaderOutput"] | components["schemas"]["BooleanCollectionOutput"] | components["schemas"]["BooleanOutput"] | components["schemas"]["BoundingBoxCollectionOutput"] | components["schemas"]["BoundingBoxOutput"] | components["schemas"]["CLIPOutput"] | components["schemas"]["CLIPSkipInvocationOutput"] | components["schemas"]["CalculateImageTilesOutput"] | components["schemas"]["CogView4ConditioningOutput"] | components["schemas"]["CogView4ModelLoaderOutput"] | components["schemas"]["CollectInvocationOutput"] | components["schemas"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["ErnieImageConditioningOutput"] | components["schemas"]["ErnieImageModelLoaderOutput"] | components["schemas"]["ExtractVideoRangeOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["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"]["Gemma2EncoderOutput"] | components["schemas"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | components["schemas"]["Ideogram4ConditioningOutput"] | components["schemas"]["Ideogram4ModelLoaderOutput"] | components["schemas"]["IfInvocationOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["ImageGeneratorOutput"] | components["schemas"]["ImageOutput"] | components["schemas"]["ImagePanelCoordinateOutput"] | components["schemas"]["IntegerCollectionOutput"] | components["schemas"]["IntegerGeneratorOutput"] | components["schemas"]["IntegerOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["Krea2ConditioningOutput"] | components["schemas"]["Krea2LoRALoaderOutput"] | components["schemas"]["Krea2ModelLoaderOutput"] | components["schemas"]["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"]["PiDDecoderOutput"] | 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"]["VideoOutput"] | components["schemas"]["WanConditioningOutput"] | components["schemas"]["WanLoRALoaderOutput"] | components["schemas"]["WanModelLoaderOutput"] | components["schemas"]["WanRefImageOutput"] | components["schemas"]["WorkflowReturnGetOutput"] | components["schemas"]["WorkflowReturnOutput"] | components["schemas"]["WorkflowReturnValueOutput"] | components["schemas"]["ZImageConditioningOutput"] | components["schemas"]["ZImageControlOutput"] | components["schemas"]["ZImageLoRALoaderOutput"] | components["schemas"]["ZImageModelLoaderOutput"]; + [key: string]: components["schemas"]["AnimaConditioningOutput"] | components["schemas"]["AnimaLLLiteOutput"] | components["schemas"]["AnimaLoRALoaderOutput"] | components["schemas"]["AnimaModelLoaderOutput"] | components["schemas"]["BooleanCollectionOutput"] | components["schemas"]["BooleanOutput"] | components["schemas"]["BoundingBoxCollectionOutput"] | components["schemas"]["BoundingBoxOutput"] | components["schemas"]["CLIPOutput"] | components["schemas"]["CLIPSkipInvocationOutput"] | components["schemas"]["CalculateImageTilesOutput"] | components["schemas"]["CogView4ConditioningOutput"] | components["schemas"]["CogView4ModelLoaderOutput"] | components["schemas"]["CollectInvocationOutput"] | components["schemas"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["ErnieImageConditioningOutput"] | components["schemas"]["ErnieImageModelLoaderOutput"] | components["schemas"]["ExtractVideoRangeOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["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"]["Gemma2EncoderOutput"] | components["schemas"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | components["schemas"]["Ideogram4ConditioningOutput"] | components["schemas"]["Ideogram4ModelLoaderOutput"] | components["schemas"]["IfInvocationOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["ImageGeneratorOutput"] | components["schemas"]["ImageOutput"] | components["schemas"]["ImagePanelCoordinateOutput"] | components["schemas"]["IntegerCollectionOutput"] | components["schemas"]["IntegerGeneratorOutput"] | components["schemas"]["IntegerOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["Krea2ConditioningOutput"] | components["schemas"]["Krea2LoRALoaderOutput"] | components["schemas"]["Krea2ModelLoaderOutput"] | components["schemas"]["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"]["MiniMaxH3ConditioningOutput"] | components["schemas"]["MiniMaxH3DenoiseOutput"] | components["schemas"]["MiniMaxH3FrameConditioningOutput"] | components["schemas"]["MiniMaxH3ModelLoaderOutput"] | components["schemas"]["ModelIdentifierOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["PBRMapsOutput"] | components["schemas"]["PairTileImageOutput"] | components["schemas"]["PiDDecoderOutput"] | 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"]["VideoOutput"] | components["schemas"]["WanConditioningOutput"] | components["schemas"]["WanLoRALoaderOutput"] | components["schemas"]["WanModelLoaderOutput"] | components["schemas"]["WanRefImageOutput"] | components["schemas"]["WorkflowReturnGetOutput"] | components["schemas"]["WorkflowReturnOutput"] | components["schemas"]["WorkflowReturnValueOutput"] | components["schemas"]["ZImageConditioningOutput"] | components["schemas"]["ZImageControlOutput"] | components["schemas"]["ZImageLoRALoaderOutput"] | components["schemas"]["ZImageModelLoaderOutput"]; }; /** * Errors @@ -18048,7 +18048,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"]["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"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | 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"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | 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"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["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"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -18058,7 +18058,7 @@ export type components = { * Result * @description The result of the invocation */ - result: components["schemas"]["AnimaConditioningOutput"] | components["schemas"]["AnimaLLLiteOutput"] | components["schemas"]["AnimaLoRALoaderOutput"] | components["schemas"]["AnimaModelLoaderOutput"] | components["schemas"]["BooleanCollectionOutput"] | components["schemas"]["BooleanOutput"] | components["schemas"]["BoundingBoxCollectionOutput"] | components["schemas"]["BoundingBoxOutput"] | components["schemas"]["CLIPOutput"] | components["schemas"]["CLIPSkipInvocationOutput"] | components["schemas"]["CalculateImageTilesOutput"] | components["schemas"]["CogView4ConditioningOutput"] | components["schemas"]["CogView4ModelLoaderOutput"] | components["schemas"]["CollectInvocationOutput"] | components["schemas"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["ErnieImageConditioningOutput"] | components["schemas"]["ErnieImageModelLoaderOutput"] | components["schemas"]["ExtractVideoRangeOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["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"]["Gemma2EncoderOutput"] | components["schemas"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | components["schemas"]["Ideogram4ConditioningOutput"] | components["schemas"]["Ideogram4ModelLoaderOutput"] | components["schemas"]["IfInvocationOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["ImageGeneratorOutput"] | components["schemas"]["ImageOutput"] | components["schemas"]["ImagePanelCoordinateOutput"] | components["schemas"]["IntegerCollectionOutput"] | components["schemas"]["IntegerGeneratorOutput"] | components["schemas"]["IntegerOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["Krea2ConditioningOutput"] | components["schemas"]["Krea2LoRALoaderOutput"] | components["schemas"]["Krea2ModelLoaderOutput"] | components["schemas"]["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"]["PiDDecoderOutput"] | 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"]["VideoOutput"] | components["schemas"]["WanConditioningOutput"] | components["schemas"]["WanLoRALoaderOutput"] | components["schemas"]["WanModelLoaderOutput"] | components["schemas"]["WanRefImageOutput"] | components["schemas"]["WorkflowReturnGetOutput"] | components["schemas"]["WorkflowReturnOutput"] | components["schemas"]["WorkflowReturnValueOutput"] | components["schemas"]["ZImageConditioningOutput"] | components["schemas"]["ZImageControlOutput"] | components["schemas"]["ZImageLoRALoaderOutput"] | components["schemas"]["ZImageModelLoaderOutput"]; + result: components["schemas"]["AnimaConditioningOutput"] | components["schemas"]["AnimaLLLiteOutput"] | components["schemas"]["AnimaLoRALoaderOutput"] | components["schemas"]["AnimaModelLoaderOutput"] | components["schemas"]["BooleanCollectionOutput"] | components["schemas"]["BooleanOutput"] | components["schemas"]["BoundingBoxCollectionOutput"] | components["schemas"]["BoundingBoxOutput"] | components["schemas"]["CLIPOutput"] | components["schemas"]["CLIPSkipInvocationOutput"] | components["schemas"]["CalculateImageTilesOutput"] | components["schemas"]["CogView4ConditioningOutput"] | components["schemas"]["CogView4ModelLoaderOutput"] | components["schemas"]["CollectInvocationOutput"] | components["schemas"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["ErnieImageConditioningOutput"] | components["schemas"]["ErnieImageModelLoaderOutput"] | components["schemas"]["ExtractVideoRangeOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["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"]["Gemma2EncoderOutput"] | components["schemas"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | components["schemas"]["Ideogram4ConditioningOutput"] | components["schemas"]["Ideogram4ModelLoaderOutput"] | components["schemas"]["IfInvocationOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["ImageGeneratorOutput"] | components["schemas"]["ImageOutput"] | components["schemas"]["ImagePanelCoordinateOutput"] | components["schemas"]["IntegerCollectionOutput"] | components["schemas"]["IntegerGeneratorOutput"] | components["schemas"]["IntegerOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["Krea2ConditioningOutput"] | components["schemas"]["Krea2LoRALoaderOutput"] | components["schemas"]["Krea2ModelLoaderOutput"] | components["schemas"]["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"]["MiniMaxH3ConditioningOutput"] | components["schemas"]["MiniMaxH3DenoiseOutput"] | components["schemas"]["MiniMaxH3FrameConditioningOutput"] | components["schemas"]["MiniMaxH3ModelLoaderOutput"] | components["schemas"]["ModelIdentifierOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["PBRMapsOutput"] | components["schemas"]["PairTileImageOutput"] | components["schemas"]["PiDDecoderOutput"] | 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"]["VideoOutput"] | components["schemas"]["WanConditioningOutput"] | components["schemas"]["WanLoRALoaderOutput"] | components["schemas"]["WanModelLoaderOutput"] | components["schemas"]["WanRefImageOutput"] | components["schemas"]["WorkflowReturnGetOutput"] | components["schemas"]["WorkflowReturnOutput"] | components["schemas"]["WorkflowReturnValueOutput"] | components["schemas"]["ZImageConditioningOutput"] | components["schemas"]["ZImageControlOutput"] | components["schemas"]["ZImageLoRALoaderOutput"] | components["schemas"]["ZImageModelLoaderOutput"]; }; /** * InvocationErrorEvent @@ -18112,7 +18112,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"]["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"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | 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"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | 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"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["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"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -18338,6 +18338,12 @@ export type components = { metadata_to_string_collection: components["schemas"]["StringCollectionOutput"]; metadata_to_t2i_adapters: components["schemas"]["MDT2IAdapterListOutput"]; metadata_to_vae: components["schemas"]["VAEOutput"]; + minimax_h3_denoise: components["schemas"]["MiniMaxH3DenoiseOutput"]; + minimax_h3_frame_conditioning: components["schemas"]["MiniMaxH3FrameConditioningOutput"]; + minimax_h3_latents_to_image: components["schemas"]["ImageOutput"]; + minimax_h3_latents_to_video: components["schemas"]["VideoOutput"]; + minimax_h3_model_loader: components["schemas"]["MiniMaxH3ModelLoaderOutput"]; + minimax_h3_text_encoder: components["schemas"]["MiniMaxH3ConditioningOutput"]; mlsd_detection: components["schemas"]["ImageOutput"]; model_identifier: components["schemas"]["ModelIdentifierOutput"]; mul: components["schemas"]["IntegerOutput"]; @@ -18491,7 +18497,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"]["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"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | 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"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | 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"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["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"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -18572,7 +18578,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"]["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"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | 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"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | 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"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["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"]["CallSavedWorkflowInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ErnieImageDenoiseInvocation"] | components["schemas"]["ErnieImageModelLoaderInvocation"] | components["schemas"]["ErnieImagePromptEnhancerInvocation"] | components["schemas"]["ErnieImageTextEncoderInvocation"] | components["schemas"]["ErnieImageVaeDecodeInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["ExtractVideoRangeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2PiDDecodeInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxPiDDecodeInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["Gemma2EncoderLoaderInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["Ideogram4CaptionBuilderInvocation"] | components["schemas"]["Ideogram4DenoiseInvocation"] | components["schemas"]["Ideogram4LatentsToImageInvocation"] | components["schemas"]["Ideogram4ModelLoaderInvocation"] | components["schemas"]["Ideogram4TextEncoderInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["Krea2ConditioningRebalanceInvocation"] | components["schemas"]["Krea2DenoiseInvocation"] | components["schemas"]["Krea2LoRACollectionLoader"] | components["schemas"]["Krea2LoRALoaderInvocation"] | components["schemas"]["Krea2ModelLoaderInvocation"] | components["schemas"]["Krea2SeedVarianceInvocation"] | components["schemas"]["Krea2TextEncoderInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["MiniMaxH3DenoiseInvocation"] | components["schemas"]["MiniMaxH3FrameConditioningInvocation"] | components["schemas"]["MiniMaxH3LatentsToImageInvocation"] | components["schemas"]["MiniMaxH3LatentsToVideoInvocation"] | components["schemas"]["MiniMaxH3ModelLoaderInvocation"] | components["schemas"]["MiniMaxH3TextEncoderInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDDecoderLoaderInvocation"] | components["schemas"]["PiDUpscaleInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImagePiDDecodeInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SD3PiDDecodeInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLPiDDecodeInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["SaveImageToFileInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TextLLMWithPresetInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["VideoConcatInvocation"] | components["schemas"]["VideoFrameExtractInvocation"] | components["schemas"]["VideoInvocation"] | components["schemas"]["WanDenoiseInvocation"] | components["schemas"]["WanI2VIdealDimensionsInvocation"] | components["schemas"]["WanImageToLatentsInvocation"] | components["schemas"]["WanLatentsToImageInvocation"] | components["schemas"]["WanLatentsToVideoInvocation"] | components["schemas"]["WanLoRACollectionLoader"] | components["schemas"]["WanLoRALoaderInvocation"] | components["schemas"]["WanModelLoaderInvocation"] | components["schemas"]["WanRefImageEncoderInvocation"] | components["schemas"]["WanTI2VIdealDimensionsInvocation"] | components["schemas"]["WanTextEncoderInvocation"] | components["schemas"]["WanVideoDenoiseInvocation"] | components["schemas"]["WorkflowReturnGetInvocation"] | components["schemas"]["WorkflowReturnInvocation"] | components["schemas"]["WorkflowReturnValueInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImagePiDDecodeInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -27347,6 +27353,526 @@ export type components = { */ type: "metadata_to_vae"; }; + /** + * MiniMaxH3ConditioningField + * @description A MiniMax H3 conditioning primitive value. + * + * H3 conditioning is the layer-50 Qwen3-VL hidden state plus the per-row modality tags the + * packed-sequence layout is built from (vision-block rows are tagged as video). + */ + MiniMaxH3ConditioningField: { + /** + * Conditioning Name + * @description The name of conditioning tensor + */ + conditioning_name: string; + }; + /** + * MiniMaxH3ConditioningOutput + * @description Base class for nodes that output a MiniMax H3 conditioning tensor. + */ + MiniMaxH3ConditioningOutput: { + /** @description Conditioning tensor */ + conditioning: components["schemas"]["MiniMaxH3ConditioningField"]; + /** + * type + * @default minimax_h3_conditioning_output + * @constant + */ + type: "minimax_h3_conditioning_output"; + }; + /** + * Denoise - MiniMax H3 + * @description Run the MiniMax H3 joint audio-video denoising loop. + */ + MiniMaxH3DenoiseInvocation: { + /** + * Id + * @description The id of this instance of an invocation. Must be unique among all instances of invocations. + */ + id: string; + /** + * Is Intermediate + * @description Whether or not this is an intermediate invocation. + * @default false + */ + is_intermediate?: boolean; + /** + * Use Cache + * @description Whether or not to use the cache + * @default true + */ + use_cache?: boolean; + /** + * Transformer + * @description MiniMax H3 FL2VA transformer. + * @default null + */ + transformer?: components["schemas"]["MiniMaxH3TransformerField"] | null; + /** + * @description Positive conditioning tensor + * @default null + */ + positive_conditioning?: components["schemas"]["MiniMaxH3ConditioningField"] | null; + /** + * Frame Conditioning + * @description First/last-keyframe (VAE-latent) conditioning for MiniMax H3 + * @default null + */ + frame_conditioning?: components["schemas"]["MiniMaxH3FrameConditioningField"] | null; + /** + * Width + * @description Width of the generated video. H3's native canvas has a 768px short edge (max 768x1344). + * @default 1344 + */ + width?: number; + /** + * Height + * @description Height of the generated video. + * @default 768 + */ + height?: number; + /** + * Number of Frames + * @description Number of output frames at the fixed 24 fps. Must be of the form 17n+5 (5, 22, ..., 124, ...); durations must stay within 5-15 s, except exactly 5 frames for a still image. + * @default 124 + */ + num_frames?: number; + /** + * Steps + * @description Number of denoising steps (sigma grid points, terminal included: N steps = N-1 model evaluations). + * @default 50 + */ + steps?: number; + /** + * Seed + * @description Randomness seed for reproducibility. + * @default 0 + */ + seed?: number; + /** + * type + * @default minimax_h3_denoise + * @constant + */ + type: "minimax_h3_denoise"; + }; + /** + * MiniMaxH3DenoiseOutput + * @description Joint video + audio latents from one MiniMax H3 denoise run. + */ + MiniMaxH3DenoiseOutput: { + /** @description 5D video latents [1, 24, T_lat, H/16, W/16]. */ + video_latents: components["schemas"]["LatentsField"]; + /** @description Audio latents [2, 32, T_audio] (one item per stereo channel). */ + audio_latents: components["schemas"]["LatentsField"]; + /** + * Width + * @description Pixel width of the video latents. + */ + width: number; + /** + * Height + * @description Pixel height of the video latents. + */ + height: number; + /** + * Num Frames + * @description Pixel-frame count of the video latents. + */ + num_frames: number; + /** + * type + * @default minimax_h3_denoise_output + * @constant + */ + type: "minimax_h3_denoise_output"; + }; + /** + * MiniMaxH3FrameConditioningField + * @description First/last-keyframe conditioning for MiniMax H3 (FL2VA). + * + * Carries the CLEAN (not yet noise-augmented) packed keyframe conditioning rows; the denoise + * node noise-augments them to t=0.999 with the request seed's first draws. Width/height ride + * along so the denoise node can reject a canvas mismatch instead of failing inside the + * transformer. + */ + MiniMaxH3FrameConditioningField: { + /** + * Condition Rows Name + * @description Name of the saved (num_condition_rows, 96) rows tensor. + */ + condition_rows_name: string; + /** + * Keyframe Anchors + * @description Which end each keyframe anchors, in packed order ("first" / "last"). + */ + keyframe_anchors: string[]; + /** + * Width + * @description Canvas width used during VAE encoding (matches denoise width). + */ + width: number; + /** + * Height + * @description Canvas height used during VAE encoding (matches denoise height). + */ + height: number; + }; + /** + * Frame Conditioning - MiniMax H3 + * @description VAE-encodes first/last keyframes into MiniMax H3 conditioning rows. + * + * The rows are clean (the denoise node noise-augments them with the request seed). The same + * images and width/height must also be wired to the Prompt - MiniMax H3 node: the keyframes + * are part of both the packed sequence and the text conditioning. + */ + MiniMaxH3FrameConditioningInvocation: { + /** + * 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 Keyframe the video starts from (stretched onto the canvas). + * @default null + */ + first_image?: components["schemas"]["ImageField"] | null; + /** + * @description Keyframe the video ends on (cover-cropped onto the canvas). + * @default null + */ + last_image?: components["schemas"]["ImageField"] | null; + /** + * Video VAE + * @description VAE + * @default null + */ + vae?: components["schemas"]["VAEField"] | null; + /** + * Width + * @description Target canvas width. + * @default 1344 + */ + width?: number; + /** + * Height + * @description Target canvas height. + * @default 768 + */ + height?: number; + /** + * type + * @default minimax_h3_frame_conditioning + * @constant + */ + type: "minimax_h3_frame_conditioning"; + }; + /** + * MiniMaxH3FrameConditioningOutput + * @description Output of the MiniMax H3 keyframe VAE-encoder. + */ + MiniMaxH3FrameConditioningOutput: { + /** @description First/last-keyframe (VAE-latent) conditioning for MiniMax H3 */ + frame_conditioning: components["schemas"]["MiniMaxH3FrameConditioningField"]; + /** + * type + * @default minimax_h3_frame_conditioning_output + * @constant + */ + type: "minimax_h3_frame_conditioning_output"; + }; + /** + * Latents to Image - MiniMax H3 + * @description Decode MiniMax H3 video latents and save a single frame as an image. + */ + MiniMaxH3LatentsToImageInvocation: { + /** + * @description The board to save the image to + * @default null + */ + board?: components["schemas"]["BoardField"] | null; + /** + * @description Optional metadata to be saved with the image + * @default null + */ + metadata?: components["schemas"]["MetadataField"] | null; + /** + * Id + * @description The id of this instance of an invocation. Must be unique among all instances of invocations. + */ + id: string; + /** + * Is Intermediate + * @description Whether or not this is an intermediate invocation. + * @default false + */ + is_intermediate?: boolean; + /** + * Use Cache + * @description Whether or not to use the cache + * @default true + */ + use_cache?: boolean; + /** + * @description Latents tensor + * @default null + */ + video_latents?: components["schemas"]["LatentsField"] | null; + /** + * Video VAE + * @description VAE + * @default null + */ + vae?: components["schemas"]["VAEField"] | null; + /** + * Frame Index + * @description Which decoded frame to save. + * @default 0 + */ + frame_index?: number; + /** + * type + * @default minimax_h3_latents_to_image + * @constant + */ + type: "minimax_h3_latents_to_image"; + }; + /** + * Latents to Video - MiniMax H3 + * @description Decode MiniMax H3 video+audio latents and encode an MP4 with an AAC stereo track. + */ + MiniMaxH3LatentsToVideoInvocation: { + /** + * @description The board to save the image to + * @default null + */ + board?: components["schemas"]["BoardField"] | null; + /** + * @description Optional metadata to be saved with the image + * @default null + */ + metadata?: components["schemas"]["MetadataField"] | null; + /** + * Id + * @description The id of this instance of an invocation. Must be unique among all instances of invocations. + */ + id: string; + /** + * Is Intermediate + * @description Whether or not this is an intermediate invocation. + * @default false + */ + is_intermediate?: boolean; + /** + * Use Cache + * @description Whether or not to use the cache + * @default true + */ + use_cache?: boolean; + /** + * @description Latents tensor + * @default null + */ + video_latents?: components["schemas"]["LatentsField"] | null; + /** + * @description Audio latents [2, 32, T_audio] from the denoise node. Omit for a silent video. + * @default null + */ + audio_latents?: components["schemas"]["LatentsField"] | null; + /** + * Video VAE + * @description VAE + * @default null + */ + vae?: components["schemas"]["VAEField"] | null; + /** + * Audio VAE + * @description Audio VAE (stereo, 32 kHz) for MiniMax H3 + * @default null + */ + audio_vae?: components["schemas"]["VAEField"] | null; + /** + * type + * @default minimax_h3_latents_to_video + * @constant + */ + type: "minimax_h3_latents_to_video"; + }; + /** + * Main Model - MiniMax H3 + * @description Loads a MiniMax H3 (FL2VA) model, outputting its submodels. + * + * All six submodels (transformer, text encoder, tokenizer, processor, video VAE, audio VAE) + * come from the one diffusers-layout install; there is no component mix-and-match yet. + */ + MiniMaxH3ModelLoaderInvocation: { + /** + * 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; + /** + * Model + * @description MiniMax H3 model (Transformer) to load + */ + model: components["schemas"]["ModelIdentifierField"]; + /** + * type + * @default minimax_h3_model_loader + * @constant + */ + type: "minimax_h3_model_loader"; + }; + /** + * MiniMaxH3ModelLoaderOutput + * @description MiniMax H3 model loader output. + */ + MiniMaxH3ModelLoaderOutput: { + /** + * Transformer + * @description MiniMax H3 FL2VA transformer + */ + transformer: components["schemas"]["MiniMaxH3TransformerField"]; + /** + * Qwen3-VL Encoder + * @description Qwen3-VL-32B tokenizer, processor and text encoder for MiniMax H3 + */ + text_encoder: components["schemas"]["MiniMaxH3TextEncoderField"]; + /** + * Video VAE + * @description VAE + */ + vae: components["schemas"]["VAEField"]; + /** + * Audio VAE + * @description Audio VAE (stereo, 32 kHz) for MiniMax H3 + */ + audio_vae: components["schemas"]["VAEField"]; + /** + * type + * @default minimax_h3_model_loader_output + * @constant + */ + type: "minimax_h3_model_loader_output"; + }; + /** + * MiniMaxH3TextEncoderField + * @description Field for the Qwen3-VL-32B conditioner used by MiniMax H3 models. + * + * Unlike :class:`Qwen3VLEncoderField`, H3 also needs the Qwen3VLProcessor — even for + * text-only prompts (its multimodal token-type ids drive Qwen3-VL's 3D rotary layout), and + * for feeding first/last keyframes to the conditioner as vision context. + */ + MiniMaxH3TextEncoderField: { + /** @description Info to load tokenizer submodel */ + tokenizer: components["schemas"]["ModelIdentifierField"]; + /** @description Info to load processor submodel */ + processor: components["schemas"]["ModelIdentifierField"]; + /** @description Info to load text_encoder submodel */ + text_encoder: components["schemas"]["ModelIdentifierField"]; + }; + /** + * Prompt - MiniMax H3 + * @description Encodes a prompt (and optional first/last keyframes) for MiniMax H3. + * + * The conditioning is Qwen3-VL-32B's *unnormalized* layer-50 hidden state. H3 is + * guidance-distilled: there is no negative prompt. For first/last-frame video, the keyframes + * are ALSO part of the text conditioning (a ": " label plus a vision block per + * keyframe), so the same images must be wired here and to the Frame Conditioning node, with + * the same width/height as the denoise node. + */ + MiniMaxH3TextEncoderInvocation: { + /** + * Id + * @description The id of this instance of an invocation. Must be unique among all instances of invocations. + */ + id: string; + /** + * Is Intermediate + * @description Whether or not this is an intermediate invocation. + * @default false + */ + is_intermediate?: boolean; + /** + * Use Cache + * @description Whether or not to use the cache + * @default true + */ + use_cache?: boolean; + /** + * Prompt + * @description Text prompt for MiniMax H3. + * @default null + */ + prompt?: string | null; + /** + * Qwen3-VL Encoder + * @description Qwen3-VL-32B tokenizer, processor and text encoder for MiniMax H3 + * @default null + */ + text_encoder?: components["schemas"]["MiniMaxH3TextEncoderField"] | null; + /** + * @description Optional keyframe the video starts from (must match Frame Conditioning). + * @default null + */ + first_image?: components["schemas"]["ImageField"] | null; + /** + * @description Optional keyframe the video ends on (must match Frame Conditioning). + * @default null + */ + last_image?: components["schemas"]["ImageField"] | null; + /** + * Width + * @description Target canvas width. + * @default 1344 + */ + width?: number; + /** + * Height + * @description Target canvas height. + * @default 768 + */ + height?: number; + /** + * type + * @default minimax_h3_text_encoder + * @constant + */ + type: "minimax_h3_text_encoder"; + }; + /** + * MiniMaxH3TransformerField + * @description Transformer field for MiniMax H3 models (FL2VA). + */ + MiniMaxH3TransformerField: { + /** @description Info to load Transformer submodel */ + transformer: components["schemas"]["ModelIdentifierField"]; + }; /** * MiniMaxH3VariantType * @description MiniMax H3 model variants (task-specific transformer checkpoints sharing every other component). diff --git a/tests/backend/minimax_h3/test_denoise.py b/tests/backend/minimax_h3/test_denoise.py new file mode 100644 index 00000000000..67469f9ba33 --- /dev/null +++ b/tests/backend/minimax_h3/test_denoise.py @@ -0,0 +1,152 @@ +"""Tests for the MiniMax H3 denoising loop, on a micro-config CPU transformer.""" + +import pytest +import torch + +from invokeai.app.services.session_processor.session_processor_common import CanceledException +from invokeai.backend.minimax_h3.denoise import denoise +from invokeai.backend.minimax_h3.sampling import build_denoise_state +from invokeai.backend.minimax_h3.transformer_minimax_h3 import MiniMaxH3Transformer3DModel + +TINY_CONFIG = { + "num_attention_heads": 2, + "attention_head_dim": 16, + "hidden_size": 32, + "num_layers": 1, + "num_refiner_layers": 1, + "ffn_dim": 64, + "in_channels": 24, + "audio_in_channels": 32, + "patch_size": [1, 2, 2], + "text_dim": 8, + "freq_dim": 16, + "time_embed_hidden_dim": 32, + "time_embed_dim": 16, + "rope_freq_dim": 2, + "rope_theta": 10000.0, +} + +# Grid points passed to the scheduler; the loop runs NUM_STEPS - 1 model evaluations +# (num_inference_steps counts sigma grid points, terminal included). +NUM_STEPS = 3 +NUM_EVALS = NUM_STEPS - 1 +TEXT_TAGS = torch.tensor([1, 1, 0], dtype=torch.long) + + +@pytest.fixture(scope="module") +def tiny_transformer() -> MiniMaxH3Transformer3DModel: + torch.manual_seed(0) + model = MiniMaxH3Transformer3DModel(**TINY_CONFIG) + model.eval() + return model + + +def _state(with_keyframe: bool = False): + kwargs = {} + if with_keyframe: + kwargs = {"keyframe_anchors": ("first",), "clean_condition_rows": torch.zeros(4, 96)} + return build_denoise_state( + text_token_tags=TEXT_TAGS, + num_latent_frames=2, + latent_height=4, + latent_width=4, + num_audio_latents=8, + num_inference_steps=NUM_STEPS, + seed=42, + device=torch.device("cpu"), + **kwargs, + ) + + +def test_denoise_output_shapes(tiny_transformer): + state = _state() + prompt_embeds = torch.randn(1, 3, TINY_CONFIG["text_dim"], generator=torch.Generator().manual_seed(1)) + video_rows, audio_rows = denoise(tiny_transformer, state, prompt_embeds) + assert video_rows.shape == (8, 96) + assert audio_rows.shape == (16, 32) + assert torch.isfinite(video_rows).all() + assert torch.isfinite(audio_rows).all() + + +def test_conditioning_rows_survive_the_loop(tiny_transformer): + state = _state(with_keyframe=True) + anchors_before = state.video_rows[:4].clone() + prompt_embeds = torch.randn(1, 3, TINY_CONFIG["text_dim"], generator=torch.Generator().manual_seed(1)) + video_rows, _ = denoise(tiny_transformer, state, prompt_embeds) + # The loop only writes generated rows; the noise-augmented anchors are untouched. + assert torch.equal(video_rows[:4], anchors_before) + assert not torch.equal(video_rows[4:], state.video_rows[4:] * 0) + + +def test_step_callback_called_per_step(tiny_transformer): + state = _state() + calls: list[tuple[int, int]] = [] + prompt_embeds = torch.randn(1, 3, TINY_CONFIG["text_dim"]) + denoise( + tiny_transformer, + state, + prompt_embeds, + step_callback=lambda step, total, rows: calls.append((step, total)), + ) + assert calls == [(i + 1, NUM_EVALS) for i in range(NUM_EVALS)] + + +def test_cancellation_raises(tiny_transformer): + state = _state() + prompt_embeds = torch.randn(1, 3, TINY_CONFIG["text_dim"]) + polls = iter([False, True, True, True]) + with pytest.raises(CanceledException): + denoise(tiny_transformer, state, prompt_embeds, is_canceled=lambda: next(polls)) + + +def test_denoise_is_deterministic(tiny_transformer): + prompt_embeds = torch.randn(1, 3, TINY_CONFIG["text_dim"], generator=torch.Generator().manual_seed(2)) + v1, a1 = denoise(tiny_transformer, _state(), prompt_embeds.clone()) + v2, a2 = denoise(tiny_transformer, _state(), prompt_embeds.clone()) + assert torch.equal(v1, v2) + assert torch.equal(a1, a2) + + +def _layout(sequence_length: int, num_pad_rows: int): + from invokeai.backend.minimax_h3.packing import MiniMaxH3PackedSequence + + token_tags = torch.ones(sequence_length, dtype=torch.long) + if num_pad_rows: + token_tags[-num_pad_rows:] = -1 + empty = torch.empty(0, dtype=torch.long) + return MiniMaxH3PackedSequence( + sequence_length=sequence_length, + position_ids=torch.zeros(sequence_length, 3, dtype=torch.float64), + token_tags=token_tags, + video_indices=empty, + audio_indices=empty, + text_indices=empty, + num_condition_video_rows=0, + num_condition_audio_rows=0, + ) + + +def test_denoise_working_memory_estimate(): + """Pin the reservation formula: per-row activations plus a fixed base, and the padding-mask + term (bool mask + SDPA's additive-copy and alignment-pad transients = 5 bytes/entry) added + only when padding rows exist. The band assertion sanity-checks the default linear-UI video + (124 frames at 768x1344 = ~38k rows): far above the small cache default, below the size of + the weights themselves. Change the constants deliberately - this test is meant to fail on + accidental drift.""" + from invokeai.app.invocations.minimax_h3_denoise import MiniMaxH3DenoiseInvocation + + estimate = MiniMaxH3DenoiseInvocation._estimate_working_memory + + MB = 1024**2 + GB = 1024**3 + per_row_bytes = int(0.25 * MB) + base_bytes = 2 * GB + + assert estimate(_layout(2_000, 0)) == 2_000 * per_row_bytes + base_bytes + + large = estimate(_layout(38_000, 0)) + assert large == 38_000 * per_row_bytes + base_bytes + assert 8 * GB < large < 20 * GB + + padded = estimate(_layout(38_000, 4)) + assert padded == large + 5 * 38_000**2 diff --git a/tests/backend/minimax_h3/test_sampling.py b/tests/backend/minimax_h3/test_sampling.py new file mode 100644 index 00000000000..d8bbe56d3e3 --- /dev/null +++ b/tests/backend/minimax_h3/test_sampling.py @@ -0,0 +1,141 @@ +"""Tests for the MiniMax H3 packed-sequence math and denoise-state construction.""" + +import pytest +import torch + +from invokeai.backend.minimax_h3.packing import ( + align_num_frames, + audio_latent_num_frames, + video_latent_num_frames, +) +from invokeai.backend.minimax_h3.sampling import build_denoise_state, validate_num_frames + + +class TestFrameGrid: + def test_legal_frame_counts_pass(self): + # 345 = 17*20+5 (14.375 s) is the longest legal clip: 362 rounds past the 15 s cap. + for n in (5, 124, 141, 345): + validate_num_frames(n) + + def test_misaligned_frame_counts_rejected(self): + with pytest.raises(ValueError, match="17"): + validate_num_frames(6) + with pytest.raises(ValueError, match="17"): + validate_num_frames(121) + + def test_durations_outside_window_rejected(self): + # 22/39/107 frames are grid-aligned but below the 5 s floor (and not the still path). + for n in (22, 39, 107): + with pytest.raises(ValueError, match="seconds"): + validate_num_frames(n) + # 362 = 17*21+5 is aligned but 15.083 s > 15 s. + with pytest.raises(ValueError, match="seconds"): + validate_num_frames(362) + + def test_still_image_minimum_allowed(self): + validate_num_frames(5) + + def test_align_num_frames(self): + assert align_num_frames(121) == 124 + assert align_num_frames(5) == 5 + assert align_num_frames(1) == 5 + + def test_latent_frame_math(self): + assert video_latent_num_frames(5) == 2 + assert video_latent_num_frames(124) == 37 + with pytest.raises(ValueError): + video_latent_num_frames(6) + + def test_audio_latent_math(self): + # 40 latents/s at 24 fps. + assert audio_latent_num_frames(24) == 40 + assert audio_latent_num_frames(124) == round(124 / 24 * 40) + + +def _build_state(seed: int, with_keyframe: bool = False): + kwargs = {} + if with_keyframe: + # One keyframe -> rows_per_frame = (4//2) * (4//2) = 4 condition rows of width 96. + kwargs = { + "keyframe_anchors": ("first",), + "clean_condition_rows": torch.zeros(4, 96), + } + return build_denoise_state( + text_token_tags=torch.tensor([1, 1, 0], dtype=torch.long), + num_latent_frames=2, + latent_height=4, + latent_width=4, + num_audio_latents=8, + num_inference_steps=4, + seed=seed, + device=torch.device("cpu"), + **kwargs, + ) + + +class TestDenoiseState: + def test_shapes_and_layout(self): + state = _build_state(seed=123) + # 2 latent frames x (4/2 * 4/2) rows/frame = 8 video rows, patch dim 24*1*2*2 = 96. + assert state.video_rows.shape == (8, 96) + # 8 audio latents x 2 stereo channels, 32 channels each. + assert state.audio_rows.shape == (16, 32) + assert state.layout.num_condition_video_rows == 0 + assert state.layout.sequence_length == 3 + 0 + 16 + 8 + # num_inference_steps counts sigma grid points (terminal included): N -> N-1 evals. + assert len(state.row_timestep_plan) == 3 + assert len(state.timesteps) == 3 + + def test_noise_is_deterministic_per_seed(self): + a, b = _build_state(seed=7), _build_state(seed=7) + assert torch.equal(a.video_rows, b.video_rows) + assert torch.equal(a.audio_rows, b.audio_rows) + c = _build_state(seed=8) + assert not torch.equal(a.video_rows, c.video_rows) + assert not torch.equal(a.audio_rows, c.audio_rows) + + def test_keyframe_draw_shifts_generated_noise(self): + # The keyframe conditioning noise is the generator's FIRST draw, so the video/audio + # draws of a keyframed request differ from an unkeyframed one at the same seed. + plain = _build_state(seed=7) + keyframed = _build_state(seed=7, with_keyframe=True) + assert keyframed.layout.num_condition_video_rows == 4 + assert keyframed.video_rows.shape == (12, 96) # 4 condition rows + 8 generated + assert not torch.equal(keyframed.video_rows[4:], plain.video_rows) + + def test_condition_rows_are_noise_augmented(self): + keyframed = _build_state(seed=7, with_keyframe=True) + # Clean rows were zeros; scale_noise(x0=0, t=0.999, noise) = 0.001 * noise != 0. + condition = keyframed.video_rows[:4] + assert not torch.equal(condition, torch.zeros_like(condition)) + assert condition.abs().max() < 0.1 # 0.1% of unit-normal noise + + def test_mismatched_condition_rows_rejected(self): + with pytest.raises(ValueError, match="rows"): + build_denoise_state( + text_token_tags=torch.tensor([1], dtype=torch.long), + num_latent_frames=2, + latent_height=4, + latent_width=4, + num_audio_latents=8, + num_inference_steps=2, + seed=0, + device=torch.device("cpu"), + keyframe_anchors=("first",), + clean_condition_rows=torch.zeros(3, 96), # wrong: layout expects 4 + ) + + def test_anchors_and_rows_must_travel_together(self): + with pytest.raises(ValueError, match="together"): + build_denoise_state( + text_token_tags=torch.tensor([1], dtype=torch.long), + num_latent_frames=2, + latent_height=4, + latent_width=4, + num_audio_latents=8, + num_inference_steps=2, + seed=0, + device=torch.device("cpu"), + keyframe_anchors=("first",), + clean_condition_rows=None, + )