From 5ecfc2f8b95fb28c81d6fe0f8f4df6dcc5613ab5 Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Mon, 25 May 2026 06:11:40 +0200 Subject: [PATCH 01/25] feat(flux2): add FLUX.2 [dev] support Adds end-to-end support for FLUX.2 [dev] alongside the existing Klein implementation. Dev uses Mistral Small 3.1 (24B) as its sole text encoder instead of Klein's Qwen3, with joint_attention_dim=15360 and the guidance-distilled 32B transformer. Backend - taxonomy: Flux2VariantType.Dev, ModelType.MistralEncoder, ModelFormat.MistralEncoder, MistralVariantType - configs: probe dev via context_in_dim=15360 (main + LoRA); new mistral_encoder.py with Diffusers / Checkpoint / GGUF configs; Main_Diffusers_Flux2_Config accepts Flux2Pipeline class name - loaders: new mistral_encoder.py (AutoModel for Diffusers folder, MistralModel for single-file + GGUF with llama.cpp key conversion). Existing Klein transformer loaders are generic enough for dev - ModelRecordChanges.variant union extended with MistralVariantType Invocations - flux2_dev_model_loader, flux2_dev_text_encoder (Mistral chat-template with FLUX2_DEV_SYSTEM_MESSAGE and layer-stacking 10/20/30), flux2_dev_lora_loader (+ collection variant) - MistralEncoderField on model.py; flux2_denoise / flux2_vae_decode / flux2_vae_encode reused unchanged (already model-agnostic) Frontend - types/hooks/selectors for MistralEncoder, isFlux2DevMainModelConfig, selectFlux2DevDiffusersModels, useMistralEncoderModels - params slice fields flux2DevVaeModel / flux2DevMistralEncoderModel / flux2DevSourceModel + reducers, selectIsFlux2Dev / selectIsFlux2Klein - ParamFlux2DevModelSelect component, wired into AdvancedSettingsAccordion - buildFLUXGraph dev branch with full txt2img / img2img / inpaint / outpaint + multi-reference image editing (same flux_kontext + collect chain as Klein, since Flux2RefImageExtension is model-agnostic) - addFlux2DevLoRAs helper for dev LoRA wiring - zModelType / zModelFormat / zFlux2VariantType extended for mistral_encoder / mistral_small_3_1 / dev - OpenAPI schema regenerated, TS types updated Starter models - FLUX.2 [dev] Diffusers (bf16 + NF4), three GGUFs (Q4/Q6/Q8), Mistral encoder (bf16 + NF4) --- invokeai/app/invocations/fields.py | 2 + .../app/invocations/flux2_dev_lora_loader.py | 176 +++++ .../app/invocations/flux2_dev_model_loader.py | 179 +++++ .../app/invocations/flux2_dev_text_encoder.py | 230 +++++++ invokeai/app/invocations/model.py | 12 + .../model_records/model_records_base.py | 2 + .../backend/model_manager/configs/factory.py | 9 + .../backend/model_manager/configs/lora.py | 193 ++---- .../backend/model_manager/configs/main.py | 43 +- .../model_manager/configs/mistral_encoder.py | 219 ++++++ .../load/model_loaders/mistral_encoder.py | 448 +++++++++++++ .../backend/model_manager/starter_models.py | 77 +++ invokeai/backend/model_manager/taxonomy.py | 17 +- .../listeners/modelSelected.test.ts | 3 + .../controlLayers/store/paramsSlice.ts | 49 ++ .../src/features/controlLayers/store/types.ts | 7 + .../web/src/features/modelManagerV2/models.ts | 9 + .../ModelManagerPanel/ModelFormatBadge.tsx | 2 + .../web/src/features/nodes/types/common.ts | 6 +- .../util/graph/generation/addFlux2DevLoRAs.ts | 62 ++ .../nodes/util/graph/generation/addRegions.ts | 2 + .../graph/generation/buildFLUXGraph.test.ts | 3 + .../util/graph/generation/buildFLUXGraph.ts | 196 +++++- .../nodes/util/graph/graphBuilderUtils.ts | 1 + .../src/features/nodes/util/graph/types.ts | 1 + .../Advanced/ParamFlux2DevModelSelect.tsx | 146 ++++ .../AdvancedSettingsAccordion.tsx | 10 +- .../src/services/api/hooks/modelsByType.ts | 6 + .../frontend/web/src/services/api/schema.ts | 632 +++++++++++++++++- .../frontend/web/src/services/api/types.ts | 15 +- 30 files changed, 2578 insertions(+), 179 deletions(-) create mode 100644 invokeai/app/invocations/flux2_dev_lora_loader.py create mode 100644 invokeai/app/invocations/flux2_dev_model_loader.py create mode 100644 invokeai/app/invocations/flux2_dev_text_encoder.py create mode 100644 invokeai/backend/model_manager/configs/mistral_encoder.py create mode 100644 invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py create mode 100644 invokeai/frontend/web/src/features/nodes/util/graph/generation/addFlux2DevLoRAs.ts create mode 100644 invokeai/frontend/web/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx diff --git a/invokeai/app/invocations/fields.py b/invokeai/app/invocations/fields.py index e53aeb417b2..cc80af8f966 100644 --- a/invokeai/app/invocations/fields.py +++ b/invokeai/app/invocations/fields.py @@ -155,6 +155,7 @@ class FieldDescriptions: t5_encoder = "T5 tokenizer and text encoder" glm_encoder = "GLM (THUDM) tokenizer and text encoder" qwen3_encoder = "Qwen3 tokenizer and text encoder" + mistral_encoder = "Mistral tokenizer/processor and text encoder" clip_embed_model = "CLIP Embed loader" clip_g_model = "CLIP-G Embed loader" unet = "UNet (scheduler, LoRAs)" @@ -171,6 +172,7 @@ class FieldDescriptions: sd3_model = "SD3 model (MMDiTX) to load" cogview4_model = "CogView4 model (Transformer) to load" z_image_model = "Z-Image model (Transformer) to load" + flux2_dev_model = "FLUX.2 [dev] model (Transformer) to load" qwen_image_model = "Qwen Image Edit model (Transformer) to load" qwen_vl_encoder = "Qwen2.5-VL tokenizer, processor and text/vision encoder" sdxl_main_model = "SDXL Main model (UNet, VAE, CLIP1, CLIP2) to load" diff --git a/invokeai/app/invocations/flux2_dev_lora_loader.py b/invokeai/app/invocations/flux2_dev_lora_loader.py new file mode 100644 index 00000000000..a87d3b9a054 --- /dev/null +++ b/invokeai/app/invocations/flux2_dev_lora_loader.py @@ -0,0 +1,176 @@ +"""FLUX.2 [dev] LoRA loader invocations. + +Mirror of the Klein LoRA loader, but routes encoder LoRAs to the Mistral text +encoder rather than the Qwen3 encoder. +""" + +from typing import Optional + +from invokeai.app.invocations.baseinvocation import ( + BaseInvocation, + BaseInvocationOutput, + Classification, + invocation, + invocation_output, +) +from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField +from invokeai.app.invocations.model import ( + LoRAField, + MistralEncoderField, + ModelIdentifierField, + TransformerField, +) +from invokeai.app.services.shared.invocation_context import InvocationContext +from invokeai.backend.model_manager.taxonomy import BaseModelType, Flux2VariantType, ModelType + + +@invocation_output("flux2_dev_lora_loader_output") +class Flux2DevLoRALoaderOutput(BaseInvocationOutput): + """FLUX.2 [dev] LoRA loader output.""" + + transformer: Optional[TransformerField] = OutputField( + default=None, description=FieldDescriptions.transformer, title="Transformer" + ) + mistral_encoder: Optional[MistralEncoderField] = OutputField( + default=None, description=FieldDescriptions.mistral_encoder, title="Mistral Encoder" + ) + + +@invocation( + "flux2_dev_lora_loader", + title="Apply LoRA - FLUX.2 [dev]", + tags=["lora", "model", "flux", "flux2", "dev"], + category="model", + version="1.0.0", + classification=Classification.Prototype, +) +class Flux2DevLoRALoaderInvocation(BaseInvocation): + """Apply a LoRA to a FLUX.2 [dev] transformer and/or its Mistral text encoder.""" + + lora: ModelIdentifierField = InputField( + description=FieldDescriptions.lora_model, + title="LoRA", + ui_model_base=BaseModelType.Flux2, + ui_model_type=ModelType.LoRA, + ) + weight: float = InputField(default=0.75, description=FieldDescriptions.lora_weight) + transformer: TransformerField | None = InputField( + default=None, + description=FieldDescriptions.transformer, + input=Input.Connection, + title="Transformer", + ) + mistral_encoder: MistralEncoderField | None = InputField( + default=None, + title="Mistral Encoder", + description=FieldDescriptions.mistral_encoder, + input=Input.Connection, + ) + + def invoke(self, context: InvocationContext) -> Flux2DevLoRALoaderOutput: + lora_key = self.lora.key + if not context.models.exists(lora_key): + raise ValueError(f"Unknown lora: {lora_key}!") + + lora_config = context.models.get_config(lora_key) + lora_variant = getattr(lora_config, "variant", None) + + # Warn if LoRA variant doesn't match transformer variant. A Klein LoRA on a + # dev transformer is virtually guaranteed to produce shape errors. + if lora_variant and self.transformer is not None: + transformer_config = context.models.get_config(self.transformer.transformer.key) + transformer_variant = getattr(transformer_config, "variant", None) + if transformer_variant and lora_variant != transformer_variant: + context.logger.warning( + f"LoRA variant mismatch: LoRA '{lora_config.name}' is for {lora_variant.value} " + f"but transformer is {transformer_variant.value}. This may cause shape errors." + ) + if lora_variant != Flux2VariantType.Dev: + context.logger.warning( + f"LoRA '{lora_config.name}' is a {lora_variant.value} LoRA but is being applied " + "via the FLUX.2 [dev] loader. Use the Klein loader for Klein LoRAs." + ) + + # Check for duplicate keys. + if self.transformer and any(existing.lora.key == lora_key for existing in self.transformer.loras): + raise ValueError(f'LoRA "{lora_key}" already applied to transformer.') + if self.mistral_encoder and any(existing.lora.key == lora_key for existing in self.mistral_encoder.loras): + raise ValueError(f'LoRA "{lora_key}" already applied to Mistral encoder.') + + output = Flux2DevLoRALoaderOutput() + if self.transformer is not None: + output.transformer = self.transformer.model_copy(deep=True) + output.transformer.loras.append(LoRAField(lora=self.lora, weight=self.weight)) + if self.mistral_encoder is not None: + output.mistral_encoder = self.mistral_encoder.model_copy(deep=True) + output.mistral_encoder.loras.append(LoRAField(lora=self.lora, weight=self.weight)) + return output + + +@invocation( + "flux2_dev_lora_collection_loader", + title="Apply LoRA Collection - FLUX.2 [dev]", + tags=["lora", "model", "flux", "flux2", "dev"], + category="model", + version="1.0.0", + classification=Classification.Prototype, +) +class Flux2DevLoRACollectionLoader(BaseInvocation): + """Apply a collection of LoRAs to a FLUX.2 [dev] transformer and/or Mistral encoder.""" + + loras: Optional[LoRAField | list[LoRAField]] = InputField( + default=None, + description="LoRA models and weights. May be a single LoRA or collection.", + title="LoRAs", + ) + transformer: Optional[TransformerField] = InputField( + default=None, + description=FieldDescriptions.transformer, + input=Input.Connection, + title="Transformer", + ) + mistral_encoder: MistralEncoderField | None = InputField( + default=None, + title="Mistral Encoder", + description=FieldDescriptions.mistral_encoder, + input=Input.Connection, + ) + + def invoke(self, context: InvocationContext) -> Flux2DevLoRALoaderOutput: + output = Flux2DevLoRALoaderOutput() + loras = self.loras if isinstance(self.loras, list) else [self.loras] + added_loras: list[str] = [] + + if self.transformer is not None: + output.transformer = self.transformer.model_copy(deep=True) + if self.mistral_encoder is not None: + output.mistral_encoder = self.mistral_encoder.model_copy(deep=True) + + for lora in loras: + if lora is None: + continue + if lora.lora.key in added_loras: + continue + if not context.models.exists(lora.lora.key): + raise Exception(f"Unknown lora: {lora.lora.key}!") + assert lora.lora.base in (BaseModelType.Flux, BaseModelType.Flux2) + + lora_config = context.models.get_config(lora.lora.key) + lora_variant = getattr(lora_config, "variant", None) + if lora_variant and self.transformer is not None: + transformer_config = context.models.get_config(self.transformer.transformer.key) + transformer_variant = getattr(transformer_config, "variant", None) + if transformer_variant and lora_variant != transformer_variant: + context.logger.warning( + f"LoRA variant mismatch: LoRA '{lora_config.name}' is for {lora_variant.value} " + f"but transformer is {transformer_variant.value}. This may cause shape errors." + ) + + added_loras.append(lora.lora.key) + + if self.transformer is not None and output.transformer is not None: + output.transformer.loras.append(lora) + if self.mistral_encoder is not None and output.mistral_encoder is not None: + output.mistral_encoder.loras.append(lora) + + return output diff --git a/invokeai/app/invocations/flux2_dev_model_loader.py b/invokeai/app/invocations/flux2_dev_model_loader.py new file mode 100644 index 00000000000..1ed3cd8b34b --- /dev/null +++ b/invokeai/app/invocations/flux2_dev_model_loader.py @@ -0,0 +1,179 @@ +"""FLUX.2 [dev] model loader invocation. + +Loads a FLUX.2 [dev] transformer with its Mistral Small 3.1 text encoder and the +shared FLUX.2 32-channel VAE. +""" + +from typing import Literal, Optional + +from invokeai.app.invocations.baseinvocation import ( + BaseInvocation, + BaseInvocationOutput, + Classification, + invocation, + invocation_output, +) +from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField +from invokeai.app.invocations.model import ( + MistralEncoderField, + ModelIdentifierField, + TransformerField, + VAEField, +) +from invokeai.app.services.shared.invocation_context import InvocationContext +from invokeai.backend.model_manager.taxonomy import ( + BaseModelType, + Flux2VariantType, + ModelFormat, + ModelType, + SubModelType, +) + + +@invocation_output("flux2_dev_model_loader_output") +class Flux2DevModelLoaderOutput(BaseInvocationOutput): + """FLUX.2 [dev] model loader output.""" + + transformer: TransformerField = OutputField(description=FieldDescriptions.transformer, title="Transformer") + mistral_encoder: MistralEncoderField = OutputField( + description=FieldDescriptions.mistral_encoder, title="Mistral Encoder" + ) + vae: VAEField = OutputField(description=FieldDescriptions.vae, title="VAE") + max_seq_len: Literal[256, 512] = OutputField( + description="Max sequence length for the Mistral encoder.", + title="Max Seq Length", + ) + + +@invocation( + "flux2_dev_model_loader", + title="Main Model - FLUX.2 [dev]", + tags=["model", "flux", "flux2", "dev", "mistral"], + category="model", + version="1.0.0", + classification=Classification.Prototype, +) +class Flux2DevModelLoaderInvocation(BaseInvocation): + """Load a FLUX.2 [dev] transformer plus its Mistral text encoder and VAE. + + FLUX.2 [dev] is a 32B guidance-distilled rectified flow transformer that uses + Mistral Small 3.1 (24B) as its sole text encoder, sharing the 32-channel + AutoencoderKLFlux2 VAE with FLUX.2 Klein. + + When the transformer is a Diffusers-format checkpoint, both VAE and Mistral + encoder can be extracted directly from the main model. For single-file + safetensors or GGUF transformers, you must supply standalone VAE and + Mistral encoder models, or point at a Diffusers FLUX.2 [dev] checkout for + sub-model extraction. + """ + + model: ModelIdentifierField = InputField( + description=FieldDescriptions.flux2_dev_model, + input=Input.Direct, + ui_model_base=BaseModelType.Flux2, + ui_model_type=ModelType.Main, + title="Transformer", + ) + + vae_model: Optional[ModelIdentifierField] = InputField( + default=None, + description="Standalone FLUX.2 VAE (AutoencoderKLFlux2). " + "If not provided, the VAE is extracted from the Diffusers source model.", + input=Input.Direct, + ui_model_base=BaseModelType.Flux2, + ui_model_type=ModelType.VAE, + title="VAE", + ) + + mistral_encoder_model: Optional[ModelIdentifierField] = InputField( + default=None, + description="Standalone Mistral text encoder. Required when the transformer is " + "a single-file safetensors or GGUF without a sibling Diffusers source.", + input=Input.Direct, + ui_model_type=ModelType.MistralEncoder, + title="Mistral Encoder", + ) + + mistral_source_model: Optional[ModelIdentifierField] = InputField( + default=None, + description="Diffusers FLUX.2 [dev] model to extract VAE and/or Mistral encoder from. " + "Use this if you don't have separate VAE / Mistral encoder models. " + "Ignored if both are provided separately.", + input=Input.Direct, + ui_model_base=BaseModelType.Flux2, + ui_model_type=ModelType.Main, + ui_model_format=ModelFormat.Diffusers, + title="Mistral Source (Diffusers)", + ) + + max_seq_len: Literal[256, 512] = InputField( + default=512, + description="Max sequence length for the Mistral encoder. FLUX.2 [dev] uses 512 by default.", + title="Max Seq Length", + ) + + def invoke(self, context: InvocationContext) -> Flux2DevModelLoaderOutput: + # Validate the selected main model is FLUX.2 [dev], not Klein. + main_config = context.models.get_config(self.model) + variant = getattr(main_config, "variant", None) + if variant is not None and variant != Flux2VariantType.Dev: + raise ValueError( + f"FLUX.2 [dev] loader requires a FLUX.2 [dev] transformer, " + f"but the selected model is variant '{variant.value}'. " + "Use the FLUX.2 Klein loader for Klein variants." + ) + + transformer = self.model.model_copy(update={"submodel_type": SubModelType.Transformer}) + main_is_diffusers = main_config.format == ModelFormat.Diffusers + + # Resolve VAE. + if self.vae_model is not None: + vae = self.vae_model.model_copy(update={"submodel_type": SubModelType.VAE}) + elif main_is_diffusers: + vae = self.model.model_copy(update={"submodel_type": SubModelType.VAE}) + elif self.mistral_source_model is not None: + self._validate_diffusers_format(context, self.mistral_source_model, "Mistral Source") + vae = self.mistral_source_model.model_copy(update={"submodel_type": SubModelType.VAE}) + else: + raise ValueError( + "No VAE source provided. Single-file / GGUF transformers require a separate VAE. " + "Options:\n" + " 1. Set 'VAE' to a standalone FLUX.2 VAE model\n" + " 2. Set 'Mistral Source' to a Diffusers FLUX.2 [dev] model to extract the VAE from" + ) + + # Resolve Mistral encoder. + if self.mistral_encoder_model is not None: + tokenizer = self.mistral_encoder_model.model_copy(update={"submodel_type": SubModelType.Tokenizer}) + text_encoder = self.mistral_encoder_model.model_copy(update={"submodel_type": SubModelType.TextEncoder}) + elif main_is_diffusers: + tokenizer = self.model.model_copy(update={"submodel_type": SubModelType.Tokenizer}) + text_encoder = self.model.model_copy(update={"submodel_type": SubModelType.TextEncoder}) + elif self.mistral_source_model is not None: + self._validate_diffusers_format(context, self.mistral_source_model, "Mistral Source") + tokenizer = self.mistral_source_model.model_copy(update={"submodel_type": SubModelType.Tokenizer}) + text_encoder = self.mistral_source_model.model_copy(update={"submodel_type": SubModelType.TextEncoder}) + else: + raise ValueError( + "No Mistral encoder source provided. Single-file / GGUF transformers require a separate " + "text encoder. Options:\n" + " 1. Set 'Mistral Encoder' to a standalone Mistral Small 3.1 text encoder model\n" + " 2. Set 'Mistral Source' to a Diffusers FLUX.2 [dev] model to extract the encoder from" + ) + + return Flux2DevModelLoaderOutput( + transformer=TransformerField(transformer=transformer, loras=[]), + mistral_encoder=MistralEncoderField(tokenizer=tokenizer, text_encoder=text_encoder), + vae=VAEField(vae=vae), + max_seq_len=self.max_seq_len, + ) + + def _validate_diffusers_format( + self, context: InvocationContext, model: ModelIdentifierField, model_name: str + ) -> None: + config = context.models.get_config(model) + if config.format != ModelFormat.Diffusers: + raise ValueError( + f"The {model_name} model must be a Diffusers format model. " + f"The selected model '{config.name}' is in {config.format.value} format." + ) diff --git a/invokeai/app/invocations/flux2_dev_text_encoder.py b/invokeai/app/invocations/flux2_dev_text_encoder.py new file mode 100644 index 00000000000..046601545d6 --- /dev/null +++ b/invokeai/app/invocations/flux2_dev_text_encoder.py @@ -0,0 +1,230 @@ +"""FLUX.2 [dev] text encoder invocation. + +FLUX.2 [dev] uses Mistral Small 3.1 as its sole text encoder, following the +diffusers Flux2Pipeline reference implementation: + +- A fixed system message biases the model toward structured image descriptions. +- The user prompt is wrapped in Mistral's chat template via the multimodal + AutoProcessor. +- Three intermediate hidden states (layers 10, 20, 30 in the 30-layer model) are + stacked and flattened to produce a (B, seq, 3 * hidden_size) tensor — for + Mistral Small 3.1 that is 3 * 5120 = 15360, matching the transformer's + joint_attention_dim. +""" + +from contextlib import ExitStack +from typing import Iterator, Literal, Optional, Tuple + +import torch +from transformers import PreTrainedModel + +from invokeai.app.invocations.baseinvocation import BaseInvocation, Classification, invocation +from invokeai.app.invocations.fields import ( + FieldDescriptions, + FluxConditioningField, + Input, + InputField, + TensorField, + UIComponent, +) +from invokeai.app.invocations.model import MistralEncoderField +from invokeai.app.invocations.primitives import FluxConditioningOutput +from invokeai.app.services.shared.invocation_context import InvocationContext +from invokeai.backend.model_manager.load.model_cache.utils import get_effective_device +from invokeai.backend.patches.layer_patcher import LayerPatcher +from invokeai.backend.patches.lora_conversions.flux_lora_constants import FLUX_LORA_T5_PREFIX +from invokeai.backend.patches.model_patch_raw import ModelPatchRaw +from invokeai.backend.stable_diffusion.diffusion.conditioning_data import ConditioningFieldData, FLUXConditioningInfo +from invokeai.backend.util.devices import TorchDevice + +# System prompt used by the FLUX.2 [dev] reference pipeline. Biasing the model +# toward structured image descriptions produces the embedding distribution the +# transformer was trained to consume. +FLUX2_DEV_SYSTEM_MESSAGE = ( + "You are an AI that reasons about image descriptions. You give structured " + "responses focusing on object relationships, object attribution and actions " + "without speculation." +) + +# Diffusers / BFL extract hidden states from these layers and stack them. +# Indices are 1-based into hidden_states[] (hidden_states[0] is the embedding layer). +# Mistral Small 3.1 has 40 transformer layers (so up to hidden_states[40]); the +# reference pipeline uses (10, 20, 30) and we scale proportionally if the model +# has fewer layers. +DEV_EXTRACTION_LAYERS = (10, 20, 30) + +# Default max sequence length for FLUX.2 [dev]. The reference pipeline caps at 512. +DEV_MAX_SEQ_LEN = 512 + + +@invocation( + "flux2_dev_text_encoder", + title="Prompt - FLUX.2 [dev]", + tags=["prompt", "conditioning", "flux", "flux2", "dev", "mistral"], + category="prompt", + version="1.0.0", + classification=Classification.Prototype, +) +class Flux2DevTextEncoderInvocation(BaseInvocation): + """Encode a prompt for FLUX.2 [dev] using its Mistral Small 3.1 text encoder.""" + + prompt: str = InputField(description="Text prompt to encode.", ui_component=UIComponent.Textarea) + mistral_encoder: MistralEncoderField = InputField( + title="Mistral Encoder", + description=FieldDescriptions.mistral_encoder, + input=Input.Connection, + ) + max_seq_len: Literal[256, 512] = InputField( + default=DEV_MAX_SEQ_LEN, + description="Max sequence length for the Mistral encoder.", + ) + mask: Optional[TensorField] = InputField( + default=None, + description="A mask defining the region that this conditioning prompt applies to.", + ) + + @torch.no_grad() + def invoke(self, context: InvocationContext) -> FluxConditioningOutput: + with ExitStack() as exit_stack: + mistral_embeds = self._encode_prompt(context, exit_stack) + + # FLUX.2 [dev] does not consume a pooled / CLIP-style embedding; we + # reuse the FLUX conditioning structure (Klein does the same) and put + # the Mistral hidden states in the `t5_embeds` slot, which the + # FLUX.2 denoise loop already wires into `encoder_hidden_states`. + conditioning_data = ConditioningFieldData( + conditionings=[ + FLUXConditioningInfo( + clip_embeds=torch.zeros(1, device=mistral_embeds.device, dtype=mistral_embeds.dtype), + t5_embeds=mistral_embeds, + ) + ] + ) + conditioning_name = context.conditioning.save(conditioning_data) + return FluxConditioningOutput( + conditioning=FluxConditioningField(conditioning_name=conditioning_name, mask=self.mask) + ) + + def _encode_prompt(self, context: InvocationContext, exit_stack: ExitStack) -> torch.Tensor: + text_encoder_info = context.models.load(self.mistral_encoder.text_encoder) + (cached_weights, text_encoder) = exit_stack.enter_context(text_encoder_info.model_on_device()) + + processor_info = context.models.load(self.mistral_encoder.tokenizer) + (_, processor) = exit_stack.enter_context(processor_info.model_on_device()) + + repaired_tensors = text_encoder_info.repair_required_tensors_on_device() + device = get_effective_device(text_encoder) + if repaired_tensors > 0: + context.logger.warning( + f"Recovered {repaired_tensors} required Mistral tensor(s) on {device} after a partial device mismatch." + ) + + # Apply any LoRAs attached to the text encoder. + lora_dtype = TorchDevice.choose_bfloat16_safe_dtype(device) + exit_stack.enter_context( + LayerPatcher.apply_smart_model_patches( + model=text_encoder, + patches=self._lora_iterator(context), + prefix=FLUX_LORA_T5_PREFIX, + dtype=lora_dtype, + cached_weights=cached_weights, + ) + ) + + context.util.signal_progress("Running Mistral text encoder (FLUX.2 [dev])") + + if not isinstance(text_encoder, PreTrainedModel): + raise TypeError( + f"Expected PreTrainedModel for text encoder, got {type(text_encoder).__name__}. " + "The Mistral encoder model may be corrupted or incompatible." + ) + + # Build the chat-template messages. The processor may be either a full + # AutoProcessor (for Mistral3ForConditionalGeneration) or a bare tokenizer + # (for text-only single-file/GGUF loaders); both expose `apply_chat_template`. + messages = [ + { + "role": "system", + "content": [{"type": "text", "text": FLUX2_DEV_SYSTEM_MESSAGE}], + }, + { + "role": "user", + "content": [{"type": "text", "text": self.prompt}], + }, + ] + + tokenize_kwargs = { + "tokenize": True, + "return_dict": True, + "return_tensors": "pt", + "add_generation_prompt": False, + "padding": "max_length", + "truncation": True, + "max_length": self.max_seq_len, + } + + try: + inputs = processor.apply_chat_template(messages, **tokenize_kwargs) + except (AttributeError, ValueError): + # Fallback path: processor has no chat template (single-file + # tokenizer download). Format the prompt manually using Mistral's + # [INST]...[/INST] convention. + text = f"[INST] {FLUX2_DEV_SYSTEM_MESSAGE}\n\n{self.prompt} [/INST]" + inputs = processor( + text, + return_tensors="pt", + padding="max_length", + truncation=True, + max_length=self.max_seq_len, + ) + + input_ids = inputs["input_ids"].to(device) + attention_mask = inputs["attention_mask"].to(device) + + # Mistral3ForConditionalGeneration wraps the LM under `.language_model`. + # For pure text encoding, run that sub-module to skip the (unused) vision + # tower and to avoid emitting a generation; for plain MistralModel / + # MistralForCausalLM, run the model directly. + forward_target = getattr(text_encoder, "language_model", None) or text_encoder + + outputs = forward_target( + input_ids=input_ids, + attention_mask=attention_mask, + output_hidden_states=True, + use_cache=False, + ) + if not hasattr(outputs, "hidden_states") or outputs.hidden_states is None: + raise RuntimeError( + "Mistral encoder did not return hidden_states. " + "Ensure output_hidden_states=True is supported by this model." + ) + num_hidden_states = len(outputs.hidden_states) # = num_hidden_layers + 1 (embedding output) + + # Scale extraction layer indices if the model is smaller than the reference. + # hidden_states[0] is the embedding output, hidden_states[i] is the output of layer i. + if num_hidden_states - 1 < max(DEV_EXTRACTION_LAYERS): + n = num_hidden_states - 1 # number of transformer layers + scaled = (max(1, n // 3), max(1, (2 * n) // 3), n) + extraction_layers = scaled + else: + extraction_layers = DEV_EXTRACTION_LAYERS + + stacked = torch.stack([outputs.hidden_states[i] for i in extraction_layers], dim=1) + # stacked: (B, 3, seq, hidden_size) -> (B, seq, 3 * hidden_size) + batch_size, num_layers, seq_len, hidden_dim = stacked.shape + prompt_embeds = stacked.permute(0, 2, 1, 3).reshape(batch_size, seq_len, num_layers * hidden_dim) + prompt_embeds = prompt_embeds.to(dtype=text_encoder.dtype, device=device) + + return prompt_embeds + + def _lora_iterator(self, context: InvocationContext) -> Iterator[Tuple[ModelPatchRaw, float]]: + """Iterate over LoRAs to apply to the Mistral encoder.""" + for lora in self.mistral_encoder.loras: + lora_info = context.models.load(lora.lora) + if not isinstance(lora_info.model, ModelPatchRaw): + raise TypeError( + f"Expected ModelPatchRaw for LoRA '{lora.lora.key}', got {type(lora_info.model).__name__}. " + "The LoRA model may be corrupted or incompatible." + ) + yield (lora_info.model, lora.weight) + del lora_info diff --git a/invokeai/app/invocations/model.py b/invokeai/app/invocations/model.py index 0c96cdb1d9d..2c7bac04140 100644 --- a/invokeai/app/invocations/model.py +++ b/invokeai/app/invocations/model.py @@ -87,6 +87,18 @@ class Qwen3EncoderField(BaseModel): loras: List[LoRAField] = Field(default_factory=list, description="LoRAs to apply on model loading") +class MistralEncoderField(BaseModel): + """Field for the Mistral text encoder used by FLUX.2 [dev]. + + The "tokenizer" submodel actually points to the multimodal processor (AutoProcessor / + Mistral3Processor), which wraps the tokenizer plus the chat template needed by FLUX.2. + """ + + tokenizer: ModelIdentifierField = Field(description="Info to load tokenizer / processor submodel") + text_encoder: ModelIdentifierField = Field(description="Info to load text_encoder submodel") + loras: List[LoRAField] = Field(default_factory=list, description="LoRAs to apply on model loading") + + 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/services/model_records/model_records_base.py b/invokeai/app/services/model_records/model_records_base.py index e06f8f2df91..0699de9a606 100644 --- a/invokeai/app/services/model_records/model_records_base.py +++ b/invokeai/app/services/model_records/model_records_base.py @@ -26,6 +26,7 @@ ClipVariantType, Flux2VariantType, FluxVariantType, + MistralVariantType, ModelFormat, ModelSourceType, ModelType, @@ -135,6 +136,7 @@ def validate_source_url(cls, v: Any) -> Optional[str]: | ZImageVariantType | QwenImageVariantType | Qwen3VariantType + | MistralVariantType ] = Field(description="The variant of the model.", default=None) prediction_type: Optional[SchedulerPredictionType] = Field( description="The prediction type of the model.", default=None diff --git a/invokeai/backend/model_manager/configs/factory.py b/invokeai/backend/model_manager/configs/factory.py index 985cb982d30..5cfdd3da8fb 100644 --- a/invokeai/backend/model_manager/configs/factory.py +++ b/invokeai/backend/model_manager/configs/factory.py @@ -85,6 +85,11 @@ Main_GGUF_ZImage_Config, MainModelDefaultSettings, ) +from invokeai.backend.model_manager.configs.mistral_encoder import ( + MistralEncoder_Checkpoint_Config, + MistralEncoder_Diffusers_Config, + MistralEncoder_GGUF_Config, +) from invokeai.backend.model_manager.configs.qwen3_encoder import ( Qwen3Encoder_Checkpoint_Config, Qwen3Encoder_GGUF_Config, @@ -248,6 +253,10 @@ Annotated[Qwen3Encoder_Qwen3Encoder_Config, Qwen3Encoder_Qwen3Encoder_Config.get_tag()], Annotated[Qwen3Encoder_Checkpoint_Config, Qwen3Encoder_Checkpoint_Config.get_tag()], Annotated[Qwen3Encoder_GGUF_Config, Qwen3Encoder_GGUF_Config.get_tag()], + # Mistral Encoder (used by FLUX.2 [dev]) + Annotated[MistralEncoder_Diffusers_Config, MistralEncoder_Diffusers_Config.get_tag()], + Annotated[MistralEncoder_Checkpoint_Config, MistralEncoder_Checkpoint_Config.get_tag()], + Annotated[MistralEncoder_GGUF_Config, MistralEncoder_GGUF_Config.get_tag()], # Qwen VL Encoder (Qwen2.5-VL multimodal encoder for Qwen Image) Annotated[QwenVLEncoder_Diffusers_Config, QwenVLEncoder_Diffusers_Config.get_tag()], Annotated[QwenVLEncoder_Checkpoint_Config, QwenVLEncoder_Checkpoint_Config.get_tag()], diff --git a/invokeai/backend/model_manager/configs/lora.py b/invokeai/backend/model_manager/configs/lora.py index 46606a3c0d5..7a3b8d2d668 100644 --- a/invokeai/backend/model_manager/configs/lora.py +++ b/invokeai/backend/model_manager/configs/lora.py @@ -66,15 +66,15 @@ def _get_flux_lora_format(mod: ModelOnDisk) -> FluxLoRAFormat | None: return value -# FLUX.2 Klein context_in_dim values: 3 * Qwen3 hidden_size -# Klein 4B: 3 * 2560 = 7680, Klein 9B: 3 * 4096 = 12288 -_FLUX2_CONTEXT_IN_DIMS = {7680, 12288} +# FLUX.2 context_in_dim values: 3 * text encoder hidden_size +# Klein 4B: 3 * 2560 = 7680, Klein 9B: 3 * 4096 = 12288, Dev: 3 * 5120 = 15360 (Mistral) +_FLUX2_CONTEXT_IN_DIMS = {7680, 12288, 15360} -# FLUX.2 Klein vec_in_dim values: Qwen3 hidden_size -# Klein 4B: 2560 (Qwen3-4B), Klein 9B: 4096 (Qwen3-8B) -_FLUX2_VEC_IN_DIMS = {2560, 4096} +# FLUX.2 vec_in_dim values: text encoder hidden_size +# Klein 4B: 2560 (Qwen3-4B), Klein 9B: 4096 (Qwen3-8B), Dev: 5120 (Mistral Small 3.1) +_FLUX2_VEC_IN_DIMS = {2560, 4096, 5120} -# FLUX.1 hidden_size is 3072. Klein 9B uses hidden_size=4096. +# FLUX.1 hidden_size is 3072. Klein 9B uses 4096, FLUX.2 [dev] uses 6144 (48 heads × 128 head_dim). # Klein 4B also uses 3072, so hidden_size alone can't distinguish Klein 4B from FLUX.1. _FLUX1_HIDDEN_SIZE = 3072 @@ -293,74 +293,79 @@ def _is_flux2_lora_state_dict(state_dict: dict[str | int, Any]) -> bool: def _get_flux2_lora_variant(state_dict: dict[str | int, Any]) -> Flux2VariantType | None: - """Determine FLUX.2 Klein variant (4B vs 9B) from a LoRA state dict. + """Determine FLUX.2 variant (Klein 4B/9B or Dev) from a LoRA state dict. - Detection is based on tensor dimensions that differ between Klein 4B and Klein 9B: - - hidden_size from attention projection: 3072 = Klein 4B, 4096 = Klein 9B - - context_in_dim from context embedder: 7680 = Klein 4B, 12288 = Klein 9B - - vec_in_dim from vector embedder: 2560 = Klein 4B, 4096 = Klein 9B + Detection is based on tensor dimensions that differ between variants: + - hidden_size from attention projection: 3072 = Klein 4B, 4096 = Klein 9B, 6144 = Dev + - context_in_dim from context embedder: 7680 = Klein 4B, 12288 = Klein 9B, 15360 = Dev + - vec_in_dim from vector embedder: 2560 = Klein 4B, 4096 = Klein 9B, 5120 = Dev Returns None if the variant cannot be determined (e.g. LoRA only targets layers with identical dimensions across variants). """ KLEIN_4B_CONTEXT_DIM = 7680 # 3 * 2560 KLEIN_9B_CONTEXT_DIM = 12288 # 3 * 4096 + DEV_CONTEXT_DIM = 15360 # 3 * 5120 KLEIN_4B_VEC_DIM = 2560 KLEIN_9B_VEC_DIM = 4096 + DEV_VEC_DIM = 5120 KLEIN_4B_HIDDEN_SIZE = 3072 KLEIN_9B_HIDDEN_SIZE = 4096 + DEV_HIDDEN_SIZE = 6144 # 48 heads × 128 head_dim + + def _variant_from_context_dim(dim: int) -> Flux2VariantType | None: + if dim == DEV_CONTEXT_DIM: + return Flux2VariantType.Dev + if dim == KLEIN_9B_CONTEXT_DIM: + return Flux2VariantType.Klein9B + if dim == KLEIN_4B_CONTEXT_DIM: + return Flux2VariantType.Klein4B + return None + + def _variant_from_vec_dim(dim: int) -> Flux2VariantType | None: + if dim == DEV_VEC_DIM: + return Flux2VariantType.Dev + if dim == KLEIN_9B_VEC_DIM: + return Flux2VariantType.Klein9B + if dim == KLEIN_4B_VEC_DIM: + return Flux2VariantType.Klein4B + return None + + def _variant_from_hidden_size(dim: int) -> Flux2VariantType | None: + if dim == DEV_HIDDEN_SIZE: + return Flux2VariantType.Dev + if dim == KLEIN_9B_HIDDEN_SIZE: + return Flux2VariantType.Klein9B + if dim == KLEIN_4B_HIDDEN_SIZE: + return Flux2VariantType.Klein4B + return None # Check diffusers/PEFT format keys for prefix in ["transformer.", "base_model.model.", ""]: # Context embedder (txt_in) dimensions ctx_key_a = f"{prefix}context_embedder.lora_A.weight" if ctx_key_a in state_dict: - dim = state_dict[ctx_key_a].shape[1] - if dim == KLEIN_4B_CONTEXT_DIM: - return Flux2VariantType.Klein4B - if dim == KLEIN_9B_CONTEXT_DIM: - return Flux2VariantType.Klein9B - return None + return _variant_from_context_dim(state_dict[ctx_key_a].shape[1]) # Vector embedder dimensions vec_key_a = f"{prefix}time_text_embed.text_embedder.linear_1.lora_A.weight" if vec_key_a in state_dict: - dim = state_dict[vec_key_a].shape[1] - if dim == KLEIN_4B_VEC_DIM: - return Flux2VariantType.Klein4B - if dim == KLEIN_9B_VEC_DIM: - return Flux2VariantType.Klein9B - return None + return _variant_from_vec_dim(state_dict[vec_key_a].shape[1]) # Attention projection hidden_size (Flux.1 diffusers naming) attn_key_a = f"{prefix}transformer_blocks.0.attn.to_out.0.lora_A.weight" if attn_key_a in state_dict: - dim = state_dict[attn_key_a].shape[1] - if dim == KLEIN_4B_HIDDEN_SIZE: - return Flux2VariantType.Klein4B - if dim == KLEIN_9B_HIDDEN_SIZE: - return Flux2VariantType.Klein9B - return None - - # Attention projection hidden_size (Flux2 Klein diffusers naming) + return _variant_from_hidden_size(state_dict[attn_key_a].shape[1]) + + # Attention projection hidden_size (Flux2 diffusers naming) attn_key_a2 = f"{prefix}transformer_blocks.0.attn.to_add_out.lora_A.weight" if attn_key_a2 in state_dict: - dim = state_dict[attn_key_a2].shape[1] - if dim == KLEIN_4B_HIDDEN_SIZE: - return Flux2VariantType.Klein4B - if dim == KLEIN_9B_HIDDEN_SIZE: - return Flux2VariantType.Klein9B - return None - - # Fused QKV+MLP hidden_size (Flux2 Klein diffusers naming) + return _variant_from_hidden_size(state_dict[attn_key_a2].shape[1]) + + # Fused QKV+MLP hidden_size (Flux2 diffusers naming) fused_key_a = f"{prefix}single_transformer_blocks.0.attn.to_qkv_mlp_proj.lora_A.weight" if fused_key_a in state_dict: - dim = state_dict[fused_key_a].shape[1] - if dim == KLEIN_4B_HIDDEN_SIZE: - return Flux2VariantType.Klein4B - if dim == KLEIN_9B_HIDDEN_SIZE: - return Flux2VariantType.Klein9B - return None + return _variant_from_hidden_size(state_dict[fused_key_a].shape[1]) # Check BFL PEFT/LyCORIS format (diffusion_model.* or base_model.model.* prefix with BFL names) _bfl_prefixes = ("diffusion_model.", "base_model.model.") @@ -372,63 +377,33 @@ def _get_flux2_lora_variant(state_dict: dict[str | int, Any]) -> Flux2VariantTyp # BFL PEFT: context embedder (txt_in) if "txt_in" in key and key.endswith("lora_A.weight"): - dim = state_dict[key].shape[1] - if dim == KLEIN_4B_CONTEXT_DIM: - return Flux2VariantType.Klein4B - if dim == KLEIN_9B_CONTEXT_DIM: - return Flux2VariantType.Klein9B - return None + return _variant_from_context_dim(state_dict[key].shape[1]) # BFL PEFT: vector embedder (vector_in) if "vector_in" in key and key.endswith("lora_A.weight"): - dim = state_dict[key].shape[1] - if dim == KLEIN_4B_VEC_DIM: - return Flux2VariantType.Klein4B - if dim == KLEIN_9B_VEC_DIM: - return Flux2VariantType.Klein9B - return None + return _variant_from_vec_dim(state_dict[key].shape[1]) # BFL PEFT: attention projection if key.endswith(".img_attn.proj.lora_A.weight"): - dim = state_dict[key].shape[1] - if dim == KLEIN_4B_HIDDEN_SIZE: - return Flux2VariantType.Klein4B - if dim == KLEIN_9B_HIDDEN_SIZE: - return Flux2VariantType.Klein9B - return None + return _variant_from_hidden_size(state_dict[key].shape[1]) # BFL LyCORIS (LoKR): context embedder (txt_in) if "txt_in" in key and key.endswith((".lokr_w1", ".lokr_w1_b")): - layer_prefix = key.rsplit(".", 1)[0] - in_dim = _lokr_in_dim(state_dict, layer_prefix) + in_dim = _lokr_in_dim(state_dict, key.rsplit(".", 1)[0]) if in_dim is not None: - if in_dim == KLEIN_4B_CONTEXT_DIM: - return Flux2VariantType.Klein4B - if in_dim == KLEIN_9B_CONTEXT_DIM: - return Flux2VariantType.Klein9B - return None + return _variant_from_context_dim(in_dim) # BFL LyCORIS (LoKR): vector embedder (vector_in) if "vector_in" in key and key.endswith((".lokr_w1", ".lokr_w1_b")): - layer_prefix = key.rsplit(".", 1)[0] - in_dim = _lokr_in_dim(state_dict, layer_prefix) + in_dim = _lokr_in_dim(state_dict, key.rsplit(".", 1)[0]) if in_dim is not None: - if in_dim == KLEIN_4B_VEC_DIM: - return Flux2VariantType.Klein4B - if in_dim == KLEIN_9B_VEC_DIM: - return Flux2VariantType.Klein9B - return None + return _variant_from_vec_dim(in_dim) # BFL LyCORIS (LoKR): attention projection if key.endswith((".img_attn.proj.lokr_w1", ".img_attn.proj.lokr_w1_b")): - layer_prefix = key.rsplit(".", 1)[0] - in_dim = _lokr_in_dim(state_dict, layer_prefix) + in_dim = _lokr_in_dim(state_dict, key.rsplit(".", 1)[0]) if in_dim is not None: - if in_dim == KLEIN_4B_HIDDEN_SIZE: - return Flux2VariantType.Klein4B - if in_dim == KLEIN_9B_HIDDEN_SIZE: - return Flux2VariantType.Klein9B - return None + return _variant_from_hidden_size(in_dim) # Check kohya format for key in state_dict: @@ -436,40 +411,20 @@ def _get_flux2_lora_variant(state_dict: dict[str | int, Any]) -> Flux2VariantTyp continue if key.startswith("lora_unet_txt_in.") or key.startswith("lora_unet_context_embedder."): if key.endswith("lora_down.weight"): - dim = state_dict[key].shape[1] - if dim == KLEIN_4B_CONTEXT_DIM: - return Flux2VariantType.Klein4B - if dim == KLEIN_9B_CONTEXT_DIM: - return Flux2VariantType.Klein9B - return None + return _variant_from_context_dim(state_dict[key].shape[1]) # Kohya LyCORIS (LoKR) elif key.endswith((".lokr_w1", ".lokr_w1_b")): - layer_prefix = key.rsplit(".", 1)[0] - in_dim = _lokr_in_dim(state_dict, layer_prefix) + in_dim = _lokr_in_dim(state_dict, key.rsplit(".", 1)[0]) if in_dim is not None: - if in_dim == KLEIN_4B_CONTEXT_DIM: - return Flux2VariantType.Klein4B - if in_dim == KLEIN_9B_CONTEXT_DIM: - return Flux2VariantType.Klein9B - return None + return _variant_from_context_dim(in_dim) if key.startswith("lora_unet_vector_in.") or key.startswith("lora_unet_time_text_embed_text_embedder_"): if key.endswith("lora_down.weight"): - dim = state_dict[key].shape[1] - if dim == KLEIN_4B_VEC_DIM: - return Flux2VariantType.Klein4B - if dim == KLEIN_9B_VEC_DIM: - return Flux2VariantType.Klein9B - return None + return _variant_from_vec_dim(state_dict[key].shape[1]) # Kohya LyCORIS (LoKR) elif key.endswith((".lokr_w1", ".lokr_w1_b")): - layer_prefix = key.rsplit(".", 1)[0] - in_dim = _lokr_in_dim(state_dict, layer_prefix) + in_dim = _lokr_in_dim(state_dict, key.rsplit(".", 1)[0]) if in_dim is not None: - if in_dim == KLEIN_4B_VEC_DIM: - return Flux2VariantType.Klein4B - if in_dim == KLEIN_9B_VEC_DIM: - return Flux2VariantType.Klein9B - return None + return _variant_from_vec_dim(in_dim) # Kohya format: check transformer block dimensions (hidden_size from img_attn_proj). # This handles LoRAs that only target transformer blocks (no txt_in/vector_in/context_embedder). @@ -481,22 +436,12 @@ def _get_flux2_lora_variant(state_dict: dict[str | int, Any]) -> Flux2VariantTyp # Check img_attn_proj hidden_size if "_img_attn_proj." in key and key.endswith("lora_down.weight"): - dim = state_dict[key].shape[1] - if dim == KLEIN_4B_HIDDEN_SIZE: - return Flux2VariantType.Klein4B - if dim == KLEIN_9B_HIDDEN_SIZE: - return Flux2VariantType.Klein9B - return None + return _variant_from_hidden_size(state_dict[key].shape[1]) # LoKR variant elif "_img_attn_proj." in key and key.endswith((".lokr_w1", ".lokr_w1_b")): - layer_prefix = key.rsplit(".", 1)[0] - in_dim = _lokr_in_dim(state_dict, layer_prefix) + in_dim = _lokr_in_dim(state_dict, key.rsplit(".", 1)[0]) if in_dim is not None: - if in_dim == KLEIN_4B_HIDDEN_SIZE: - return Flux2VariantType.Klein4B - if in_dim == KLEIN_9B_HIDDEN_SIZE: - return Flux2VariantType.Klein9B - return None + return _variant_from_hidden_size(in_dim) return None diff --git a/invokeai/backend/model_manager/configs/main.py b/invokeai/backend/model_manager/configs/main.py index e1e408a3483..104156fcb91 100644 --- a/invokeai/backend/model_manager/configs/main.py +++ b/invokeai/backend/model_manager/configs/main.py @@ -85,7 +85,10 @@ def from_base( return cls(steps=35, cfg_scale=4.5, width=1024, height=1024) case BaseModelType.Flux2: # Different defaults based on variant - if variant in (Flux2VariantType.Klein4BBase, Flux2VariantType.Klein9BBase): + if variant == Flux2VariantType.Dev: + # FLUX.2 [dev] is guidance-distilled (recommended guidance=3.5, 28 steps, CFG disabled) + return cls(steps=28, cfg_scale=1.0, guidance=3.5, width=1024, height=1024) + elif variant in (Flux2VariantType.Klein4BBase, Flux2VariantType.Klein9BBase): # Undistilled base models need more steps return cls(steps=28, cfg_scale=1.0, width=1024, height=1024) else: @@ -350,9 +353,10 @@ def _filename_suggests_base(name: str) -> bool: def _get_flux2_variant(state_dict: dict[str | int, Any]) -> Flux2VariantType | None: """Determine FLUX.2 variant from state dict. - Distinguishes between Klein 4B and Klein 9B based on context embedding dimension: + Distinguishes between variants based on context embedding dimension: - Klein 4B: context_in_dim = 7680 (3 × Qwen3-4B hidden_size 2560) - Klein 9B: context_in_dim = 12288 (3 × Qwen3-8B hidden_size 4096) + - Dev: context_in_dim = 15360 (3 × Mistral Small 3.1 hidden_size 5120) Note: Klein 9B (distilled) and Klein 9B Base (undistilled) have identical architectures and cannot be distinguished from the state dict alone. This function defaults to Klein9B @@ -365,6 +369,7 @@ def _get_flux2_variant(state_dict: dict[str | int, Any]) -> Flux2VariantType | N # Context dimensions for each variant KLEIN_4B_CONTEXT_DIM = 7680 # 3 × 2560 KLEIN_9B_CONTEXT_DIM = 12288 # 3 × 4096 + DEV_CONTEXT_DIM = 15360 # 3 × 5120 (Mistral Small 3.1) # Check context_embedder to determine variant # Support both BFL format (txt_in.weight) and diffusers format (context_embedder.weight) @@ -389,7 +394,9 @@ def _get_flux2_variant(state_dict: dict[str | int, Any]) -> Flux2VariantType | N if len(shape) >= 2: context_in_dim = shape[1] # Determine variant based on context dimension - if context_in_dim == KLEIN_9B_CONTEXT_DIM: + if context_in_dim == DEV_CONTEXT_DIM: + return Flux2VariantType.Dev + elif context_in_dim == KLEIN_9B_CONTEXT_DIM: # Default to Klein9B - callers use filename heuristics to detect Klein9BBase return Flux2VariantType.Klein9B elif context_in_dim == KLEIN_4B_CONTEXT_DIM: @@ -831,7 +838,7 @@ def _get_variant_or_raise(cls, mod: ModelOnDisk) -> FluxVariantType: class Main_Diffusers_Flux2_Config(Diffusers_Config_Base, Main_Config_Base, Config_Base): - """Model config for FLUX.2 models in diffusers format (e.g. FLUX.2 Klein).""" + """Model config for FLUX.2 models in diffusers format (FLUX.2 Klein and FLUX.2 [dev]).""" base: Literal[BaseModelType.Flux2] = Field(BaseModelType.Flux2) variant: Flux2VariantType = Field() @@ -847,6 +854,8 @@ def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) - common_config_paths(mod.path), { "Flux2KleinPipeline", + "Flux2Pipeline", + "Flux2Transformer2DModel", }, ) @@ -864,21 +873,33 @@ def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) - def _get_variant_or_raise(cls, mod: ModelOnDisk) -> Flux2VariantType: """Determine the FLUX.2 variant from the transformer config. - FLUX.2 Klein uses Qwen3 text encoder with larger joint_attention_dim: - - Klein 4B/4B Base: joint_attention_dim = 7680 (3×Qwen3-4B hidden size) - - Klein 9B/9B Base: joint_attention_dim = 12288 (3×Qwen3-8B hidden size) + FLUX.2 variants are distinguished by joint_attention_dim (= 3 × text encoder hidden_size): + - Klein 4B/4B Base: 7680 (3 × Qwen3-4B 2560) + - Klein 9B/9B Base: 12288 (3 × Qwen3-8B 4096) + - Dev: 15360 (3 × Mistral Small 3.1 5120) - Distilled and Base variants share identical architectures. We use a filename heuristic to detect Base models. + Klein distilled and Base variants share identical architectures; the Base variant + is detected by a filename heuristic. """ KLEIN_4B_CONTEXT_DIM = 7680 # 3 × 2560 KLEIN_9B_CONTEXT_DIM = 12288 # 3 × 4096 - - transformer_config = get_config_dict_or_raise(mod.path / "transformer" / "config.json") + DEV_CONTEXT_DIM = 15360 # 3 × 5120 + + # Try transformer/config.json first (full pipeline), fall back to root config.json + # (loose transformer-only checkouts). + transformer_config_path = mod.path / "transformer" / "config.json" + root_config_path = mod.path / "config.json" + if transformer_config_path.exists(): + transformer_config = get_config_dict_or_raise(transformer_config_path) + else: + transformer_config = get_config_dict_or_raise(root_config_path) joint_attention_dim = transformer_config.get("joint_attention_dim", 4096) # Determine variant based on joint_attention_dim - if joint_attention_dim == KLEIN_9B_CONTEXT_DIM: + if joint_attention_dim == DEV_CONTEXT_DIM: + return Flux2VariantType.Dev + elif joint_attention_dim == KLEIN_9B_CONTEXT_DIM: if _filename_suggests_base(mod.name): return Flux2VariantType.Klein9BBase return Flux2VariantType.Klein9B diff --git a/invokeai/backend/model_manager/configs/mistral_encoder.py b/invokeai/backend/model_manager/configs/mistral_encoder.py new file mode 100644 index 00000000000..19d01729468 --- /dev/null +++ b/invokeai/backend/model_manager/configs/mistral_encoder.py @@ -0,0 +1,219 @@ +import json +from typing import Any, Literal, Optional, Self + +from pydantic import Field + +from invokeai.backend.model_manager.configs.base import Checkpoint_Config_Base, Config_Base +from invokeai.backend.model_manager.configs.identification_utils import ( + NotAMatchError, + raise_for_class_name, + raise_for_override_fields, + raise_if_not_dir, + raise_if_not_file, +) +from invokeai.backend.model_manager.model_on_disk import ModelOnDisk +from invokeai.backend.model_manager.taxonomy import BaseModelType, MistralVariantType, ModelFormat, ModelType +from invokeai.backend.quantization.gguf.ggml_tensor import GGMLTensor + +# Mistral Small 3.1 hidden_size. Used by FLUX.2 [dev]. +_MISTRAL_SMALL_3_1_HIDDEN_SIZE = 5120 + + +def _has_mistral_keys(state_dict: dict[str | int, Any]) -> bool: + """Check if a state dict looks like a Mistral causal-LM / multimodal model. + + Supports both: + - PyTorch/diffusers/transformers format: model.layers.0., model.embed_tokens.weight + (with optional language_model. prefix for multimodal Mistral3ForConditionalGeneration) + - GGUF/llama.cpp format: blk.0., token_embd.weight + """ + pytorch_indicators = ( + "model.layers.", + "model.embed_tokens.weight", + "language_model.model.layers.", + "language_model.model.embed_tokens.weight", + ) + gguf_indicators = ("blk.", "token_embd.weight") + + for key in state_dict.keys(): + if not isinstance(key, str): + continue + if key.startswith(pytorch_indicators): + return True + if key.startswith(gguf_indicators): + return True + return False + + +def _has_ggml_tensors(state_dict: dict[str | int, Any]) -> bool: + """Check if state dict contains GGML tensors (GGUF quantized).""" + return any(isinstance(v, GGMLTensor) for v in state_dict.values()) + + +def _embed_hidden_size(state_dict: dict[str | int, Any]) -> int | None: + """Read the embedding hidden size from a Mistral-like state dict. + + Returns None if no recognized embedding tensor is present. + """ + candidate_keys = ( + "model.embed_tokens.weight", + "language_model.model.embed_tokens.weight", + "token_embd.weight", + ) + for key in candidate_keys: + if key not in state_dict: + continue + tensor = state_dict[key] + if isinstance(tensor, GGMLTensor): + shape = getattr(tensor, "tensor_shape", None) or getattr(tensor, "shape", None) + else: + shape = getattr(tensor, "shape", None) + if shape is not None and len(shape) >= 2: + return int(shape[1]) + return None + + +def _get_mistral_variant_from_state_dict(state_dict: dict[str | int, Any]) -> Optional[MistralVariantType]: + """Determine the Mistral variant from a state dict based on hidden_size. + + Only Mistral Small 3.1 (hidden_size=5120) is currently recognized. + """ + hidden_size = _embed_hidden_size(state_dict) + if hidden_size == _MISTRAL_SMALL_3_1_HIDDEN_SIZE: + return MistralVariantType.Small3_1 + return None + + +def _get_mistral_variant_from_config(config_path) -> MistralVariantType: + """Determine Mistral variant from a config.json (hidden_size or text_config.hidden_size).""" + try: + with open(config_path, "r", encoding="utf-8") as f: + config = json.load(f) + except (json.JSONDecodeError, OSError): + return MistralVariantType.Small3_1 + + # Mistral3ForConditionalGeneration nests the LM config under text_config. + hidden_size = config.get("hidden_size") + if hidden_size is None: + text_config = config.get("text_config") or {} + hidden_size = text_config.get("hidden_size") + + if hidden_size == _MISTRAL_SMALL_3_1_HIDDEN_SIZE: + return MistralVariantType.Small3_1 + return MistralVariantType.Small3_1 + + +class MistralEncoder_Diffusers_Config(Config_Base): + """Configuration for a Mistral text encoder in HuggingFace transformers/diffusers folder layout. + + Matches: + - Full pipelines downloaded as just the `text_encoder/` subfolder + (e.g. `black-forest-labs/FLUX.2-dev/text_encoder/`) + - Quantized variants such as `diffusers/FLUX.2-dev-bnb-4bit/text_encoder/` + + Does NOT match a full FLUX.2 pipeline directory — those are picked up by the + `Main_Diffusers_Flux2_Config` instead. + """ + + base: Literal[BaseModelType.Any] = Field(default=BaseModelType.Any) + type: Literal[ModelType.MistralEncoder] = Field(default=ModelType.MistralEncoder) + format: Literal[ModelFormat.MistralEncoder] = Field(default=ModelFormat.MistralEncoder) + cpu_only: bool | None = Field(default=None, description="Whether this model should run on CPU only") + variant: MistralVariantType = Field(description="Mistral text encoder variant") + + @classmethod + def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) -> Self: + raise_if_not_dir(mod) + + raise_for_override_fields(cls, override_fields) + + # Exclude full pipeline models; those should match Main_Diffusers_Flux2_Config. + if (mod.path / "model_index.json").exists() or (mod.path / "transformer").exists(): + raise NotAMatchError( + "directory looks like a full diffusers pipeline (has model_index.json or transformer/), " + "not a standalone Mistral encoder" + ) + + # Find config.json: either nested under text_encoder/ or at the directory root. + config_path_nested = mod.path / "text_encoder" / "config.json" + config_path_direct = mod.path / "config.json" + if config_path_nested.exists(): + expected_config_path = config_path_nested + elif config_path_direct.exists(): + expected_config_path = config_path_direct + else: + raise NotAMatchError(f"no config.json found at {config_path_nested} or {config_path_direct}") + + raise_for_class_name( + expected_config_path, + { + "Mistral3ForConditionalGeneration", + "MistralModel", + "MistralForCausalLM", + }, + ) + + variant = _get_mistral_variant_from_config(expected_config_path) + + return cls(variant=variant, **override_fields) + + +class MistralEncoder_Checkpoint_Config(Checkpoint_Config_Base, Config_Base): + """Configuration for a single-file Mistral text encoder (safetensors).""" + + base: Literal[BaseModelType.Any] = Field(default=BaseModelType.Any) + type: Literal[ModelType.MistralEncoder] = Field(default=ModelType.MistralEncoder) + format: Literal[ModelFormat.Checkpoint] = Field(default=ModelFormat.Checkpoint) + cpu_only: bool | None = Field(default=None, description="Whether this model should run on CPU only") + variant: MistralVariantType = Field(description="Mistral text encoder variant") + + @classmethod + def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) -> Self: + raise_if_not_file(mod) + + raise_for_override_fields(cls, override_fields) + + state_dict = mod.load_state_dict() + + if not _has_mistral_keys(state_dict): + raise NotAMatchError("state dict does not look like a Mistral encoder") + + if _has_ggml_tensors(state_dict): + raise NotAMatchError("state dict looks like GGUF quantized") + + variant = _get_mistral_variant_from_state_dict(state_dict) + if variant is None: + raise NotAMatchError("hidden size does not match a known Mistral variant") + + return cls(variant=variant, **override_fields) + + +class MistralEncoder_GGUF_Config(Checkpoint_Config_Base, Config_Base): + """Configuration for a GGUF-quantized Mistral text encoder.""" + + base: Literal[BaseModelType.Any] = Field(default=BaseModelType.Any) + type: Literal[ModelType.MistralEncoder] = Field(default=ModelType.MistralEncoder) + format: Literal[ModelFormat.GGUFQuantized] = Field(default=ModelFormat.GGUFQuantized) + cpu_only: bool | None = Field(default=None, description="Whether this model should run on CPU only") + variant: MistralVariantType = Field(description="Mistral text encoder variant") + + @classmethod + def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) -> Self: + raise_if_not_file(mod) + + raise_for_override_fields(cls, override_fields) + + state_dict = mod.load_state_dict() + + if not _has_mistral_keys(state_dict): + raise NotAMatchError("state dict does not look like a Mistral encoder") + + if not _has_ggml_tensors(state_dict): + raise NotAMatchError("state dict does not look like GGUF quantized") + + variant = _get_mistral_variant_from_state_dict(state_dict) + if variant is None: + # Fall back to Small 3.1 — this is the only Mistral encoder used by FLUX.2 today. + variant = MistralVariantType.Small3_1 + + return cls(variant=variant, **override_fields) diff --git a/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py b/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py new file mode 100644 index 00000000000..ad4f38753dc --- /dev/null +++ b/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py @@ -0,0 +1,448 @@ +# Copyright (c) 2026, The InvokeAI Development Team +"""Model loaders for the Mistral text encoder used by FLUX.2 [dev]. + +FLUX.2 [dev] uses Mistral Small 3.1 (24B) as its sole text encoder. The diffusers +release ships it as the multimodal `Mistral3ForConditionalGeneration`; standalone +single-file safetensors and GGUF redistributions typically contain only the text +tower, which we load as an encoder-only `MistralModel`. +""" + +from pathlib import Path +from typing import Any, Optional + +import accelerate +import torch +from transformers import AutoProcessor, MistralConfig, MistralModel + +from invokeai.backend.model_manager.configs.factory import AnyModelConfig +from invokeai.backend.model_manager.configs.mistral_encoder import ( + MistralEncoder_Checkpoint_Config, + MistralEncoder_Diffusers_Config, + MistralEncoder_GGUF_Config, +) +from invokeai.backend.model_manager.load.load_default import ModelLoader +from invokeai.backend.model_manager.load.model_loader_registry import ModelLoaderRegistry +from invokeai.backend.model_manager.taxonomy import ( + AnyModel, + BaseModelType, + ModelFormat, + ModelType, + SubModelType, +) +from invokeai.backend.quantization.gguf.ggml_tensor import GGMLTensor +from invokeai.backend.quantization.gguf.loaders import gguf_sd_loader +from invokeai.backend.util.devices import TorchDevice +from invokeai.backend.util.logging import InvokeAILogger + +# Architecture constants for Mistral Small 3.1 (used by FLUX.2 [dev]). +# Sourced from the FLUX.2-dev `text_encoder/config.json` (text-model side of the +# Mistral3 multimodal stack). Layers/heads/head_dim are needed when reconstructing +# the model from a state dict (single-file or GGUF) because the architecture is +# not embedded in those files. +_MISTRAL_SMALL_3_1_HIDDEN_SIZE = 5120 +_MISTRAL_SMALL_3_1_INTERMEDIATE_SIZE = 32768 +_MISTRAL_SMALL_3_1_NUM_HIDDEN_LAYERS = 40 +_MISTRAL_SMALL_3_1_NUM_ATTENTION_HEADS = 32 +_MISTRAL_SMALL_3_1_NUM_KV_HEADS = 8 # grouped-query attention +_MISTRAL_SMALL_3_1_HEAD_DIM = 128 +_MISTRAL_SMALL_3_1_VOCAB_SIZE = 131072 +_MISTRAL_SMALL_3_1_MAX_POSITION_EMBEDDINGS = 131072 +_MISTRAL_SMALL_3_1_ROPE_THETA = 1000000.0 +_MISTRAL_SMALL_3_1_RMS_NORM_EPS = 1e-5 + +# Default tokenizer / processor source. The official Mistral repo requires +# accepting a license; FLUX.2-dev embeds the same processor under `tokenizer/` +# and is the canonical companion for image-generation use. +_DEFAULT_PROCESSOR_SOURCE = "black-forest-labs/FLUX.2-dev" +_DEFAULT_PROCESSOR_SUBFOLDER = "tokenizer" + + +def _build_mistral_config( + state_dict: dict[str, Any], + torch_dtype: torch.dtype, +) -> MistralConfig: + """Build a transformers ``MistralConfig`` from a Mistral Small 3.1 state dict. + + Reads the bulk shapes from the state dict (vocab, hidden, heads, kv_heads, + intermediate, layer count) so we can also handle non-Small-3.1 Mistrals that + happen to be wired through this loader. + """ + # Vocab and hidden_size come from embed_tokens. + embed_key = "model.embed_tokens.weight" if "model.embed_tokens.weight" in state_dict else None + if embed_key is None: + raise ValueError("State dict does not contain model.embed_tokens.weight") + embed = state_dict[embed_key] + embed_shape = embed.tensor_shape if isinstance(embed, GGMLTensor) else embed.shape + vocab_size, hidden_size = int(embed_shape[0]), int(embed_shape[1]) + + # Count layers by scanning self_attn.q_proj keys. + layer_indices: set[int] = set() + for key in state_dict.keys(): + if not isinstance(key, str): + continue + if key.startswith("model.layers.") and ".self_attn.q_proj.weight" in key: + try: + layer_indices.add(int(key.split(".")[2])) + except (ValueError, IndexError): + pass + num_hidden_layers = (max(layer_indices) + 1) if layer_indices else _MISTRAL_SMALL_3_1_NUM_HIDDEN_LAYERS + + # Derive head counts from the first layer's attention projections. + q_proj = state_dict.get("model.layers.0.self_attn.q_proj.weight") + k_proj = state_dict.get("model.layers.0.self_attn.k_proj.weight") + gate_proj = state_dict.get("model.layers.0.mlp.gate_proj.weight") + head_dim = _MISTRAL_SMALL_3_1_HEAD_DIM + if q_proj is not None and k_proj is not None and gate_proj is not None: + q_shape = q_proj.tensor_shape if isinstance(q_proj, GGMLTensor) else q_proj.shape + k_shape = k_proj.tensor_shape if isinstance(k_proj, GGMLTensor) else k_proj.shape + gate_shape = gate_proj.tensor_shape if isinstance(gate_proj, GGMLTensor) else gate_proj.shape + num_attention_heads = int(q_shape[0]) // head_dim + num_key_value_heads = int(k_shape[0]) // head_dim + intermediate_size = int(gate_shape[0]) + else: + num_attention_heads = _MISTRAL_SMALL_3_1_NUM_ATTENTION_HEADS + num_key_value_heads = _MISTRAL_SMALL_3_1_NUM_KV_HEADS + intermediate_size = _MISTRAL_SMALL_3_1_INTERMEDIATE_SIZE + + return MistralConfig( + vocab_size=vocab_size, + hidden_size=hidden_size, + intermediate_size=intermediate_size, + num_hidden_layers=num_hidden_layers, + num_attention_heads=num_attention_heads, + num_key_value_heads=num_key_value_heads, + head_dim=head_dim, + max_position_embeddings=_MISTRAL_SMALL_3_1_MAX_POSITION_EMBEDDINGS, + rms_norm_eps=_MISTRAL_SMALL_3_1_RMS_NORM_EPS, + tie_word_embeddings=False, + rope_theta=_MISTRAL_SMALL_3_1_ROPE_THETA, + attention_bias=False, + attention_dropout=0.0, + torch_dtype=torch_dtype, + ) + + +def _strip_known_prefixes(sd: dict[str, Any]) -> dict[str, Any]: + """Strip wrapper prefixes used by some FLUX.2 single-file redistributions. + + Comfy-Org and similar packagers sometimes prefix Mistral keys with + ``text_encoder.`` or ``language_model.`` (the latter coming from the + multimodal Mistral3 stack). We normalize everything to plain ``model.*``. + """ + out: dict[str, Any] = {} + for key, value in sd.items(): + if not isinstance(key, str): + out[key] = value + continue + new_key = key + for prefix in ("text_encoder.", "language_model."): + if new_key.startswith(prefix): + new_key = new_key[len(prefix) :] + break + out[new_key] = value + return out + + +def _drop_quantization_metadata(sd: dict[str, Any], logger) -> dict[str, Any]: + """Dequantize Comfy-Org-style FP8/FP4 weights and drop their metadata keys. + + Comfy-Org's Mistral FLUX.2 redistributions store quantized weights alongside + ``*.weight_scale`` (and occasionally ``*.input_scale``) tensors. We apply the + scale in-place and remove the metadata so transformers can load the result. + """ + weight_scale_keys = [k for k in sd.keys() if isinstance(k, str) and k.endswith(".weight_scale")] + dequantized = 0 + for scale_key in weight_scale_keys: + weight_key = scale_key[: -len(".weight_scale")] + ".weight" + if weight_key not in sd: + continue + weight = sd[weight_key].float() + scale = sd[scale_key].float() + if scale.shape != weight.shape and scale.numel() > 1: + for dim in range(len(weight.shape)): + if dim < len(scale.shape) and scale.shape[dim] != weight.shape[dim]: + block = weight.shape[dim] // scale.shape[dim] + if block > 1: + scale = scale.repeat_interleave(block, dim=dim) + sd[weight_key] = weight * scale + dequantized += 1 + if dequantized: + logger.info(f"Dequantized {dequantized} Comfy-Org-style quantized weights") + + drop_suffixes = (".weight_scale", ".input_scale", ".scale") + drop_keys = [ + k + for k in sd.keys() + if isinstance(k, str) and (k.endswith(drop_suffixes) or "comfy_quant" in k or k.startswith("scaled_fp8")) + ] + for k in drop_keys: + del sd[k] + return sd + + +def _load_processor_with_offline_fallback() -> AnyModel: + """Load the FLUX.2 Mistral processor (tokenizer + chat template) from cache, else HF.""" + try: + return AutoProcessor.from_pretrained( + _DEFAULT_PROCESSOR_SOURCE, + subfolder=_DEFAULT_PROCESSOR_SUBFOLDER, + local_files_only=True, + ) + except (OSError, EnvironmentError): + return AutoProcessor.from_pretrained( + _DEFAULT_PROCESSOR_SOURCE, + subfolder=_DEFAULT_PROCESSOR_SUBFOLDER, + ) + + +@ModelLoaderRegistry.register( + base=BaseModelType.Any, + type=ModelType.MistralEncoder, + format=ModelFormat.MistralEncoder, +) +class MistralEncoderDiffusersLoader(ModelLoader): + """Load a Mistral text encoder from a HuggingFace folder layout. + + Handles both the full FLUX.2-dev pipeline layout (with sibling ``tokenizer/``) + and a standalone download where ``text_encoder/`` files live at the root. + """ + + def _load_model( + self, + config: AnyModelConfig, + submodel_type: Optional[SubModelType] = None, + ) -> AnyModel: + if not isinstance(config, MistralEncoder_Diffusers_Config): + raise ValueError("Only MistralEncoder_Diffusers_Config models are supported here.") + + model_path = Path(config.path) + text_encoder_path = model_path / "text_encoder" + tokenizer_path = model_path / "tokenizer" + + # Standalone download: text_encoder files at the root. + if not text_encoder_path.exists() and (model_path / "config.json").exists(): + text_encoder_path = model_path + if not tokenizer_path.exists(): + # If tokenizer was not co-downloaded, fall back to root (some standalone + # downloads include processor files alongside the encoder weights). + tokenizer_path = model_path + + target_device = TorchDevice.choose_torch_device() + model_dtype = TorchDevice.choose_bfloat16_safe_dtype(target_device) + + match submodel_type: + case SubModelType.Tokenizer: + try: + return AutoProcessor.from_pretrained(tokenizer_path, local_files_only=True) + except (OSError, EnvironmentError): + # Fall back to the canonical FLUX.2-dev tokenizer subfolder on HF. + return _load_processor_with_offline_fallback() + case SubModelType.TextEncoder: + # Lazy import: transformers may load `Mistral3ForConditionalGeneration` + # only when the diffusers/transformers version supports it. + from transformers import AutoModel + + return AutoModel.from_pretrained( + text_encoder_path, + torch_dtype=model_dtype, + low_cpu_mem_usage=True, + local_files_only=True, + ) + + raise ValueError( + "Only Tokenizer and TextEncoder submodels are supported. " + f"Received: {submodel_type.value if submodel_type else 'None'}" + ) + + +@ModelLoaderRegistry.register( + base=BaseModelType.Any, + type=ModelType.MistralEncoder, + format=ModelFormat.Checkpoint, +) +class MistralEncoderCheckpointLoader(ModelLoader): + """Load a Mistral encoder from a single safetensors file (text-only).""" + + def _load_model( + self, + config: AnyModelConfig, + submodel_type: Optional[SubModelType] = None, + ) -> AnyModel: + if not isinstance(config, MistralEncoder_Checkpoint_Config): + raise ValueError("Only MistralEncoder_Checkpoint_Config models are supported here.") + + match submodel_type: + case SubModelType.TextEncoder: + return self._load_text_encoder(config) + case SubModelType.Tokenizer: + return _load_processor_with_offline_fallback() + + raise ValueError( + "Only Tokenizer and TextEncoder submodels are supported. " + f"Received: {submodel_type.value if submodel_type else 'None'}" + ) + + def _load_text_encoder(self, config: MistralEncoder_Checkpoint_Config) -> AnyModel: + from safetensors.torch import load_file + + logger = InvokeAILogger.get_logger(self.__class__.__name__) + target_device = TorchDevice.choose_torch_device() + model_dtype = TorchDevice.choose_bfloat16_safe_dtype(target_device) + + sd = load_file(Path(config.path)) + sd = _strip_known_prefixes(sd) + sd = _drop_quantization_metadata(sd, logger) + + mistral_config = _build_mistral_config(sd, torch_dtype=model_dtype) + logger.info( + f"Mistral encoder config (checkpoint): layers={mistral_config.num_hidden_layers}, " + f"hidden={mistral_config.hidden_size}, heads={mistral_config.num_attention_heads}, " + f"kv_heads={mistral_config.num_key_value_heads}, intermediate={mistral_config.intermediate_size}" + ) + + # Cast tensors to compute dtype before loading. + for k in list(sd.keys()): + sd[k] = sd[k].to(model_dtype) + + with accelerate.init_empty_weights(): + model = MistralModel(mistral_config) + + missing, unexpected = model.load_state_dict(sd, strict=False, assign=True) + if unexpected: + logger.debug(f"Mistral encoder: ignored {len(unexpected)} unexpected keys") + if missing: + # Re-initialize any RMSNorm weights that may have been pruned during repackaging. + for name in missing: + if name.endswith(".weight") and "norm" in name: + try: + parent_name, attr = name.rsplit(".", 1) + parent = model.get_submodule(parent_name) + param = getattr(parent, attr) + if param.is_meta: + setattr( + parent, + attr, + torch.nn.Parameter(torch.ones(param.shape, dtype=model_dtype), requires_grad=False), + ) + except (AttributeError, ValueError): + continue + + # Re-init any remaining meta buffers (e.g. RoPE inv_freq is computed from config). + for name, buffer in list(model.named_buffers()): + if buffer.is_meta and name.endswith("inv_freq"): + parts = name.rsplit(".", 1) + parent = model.get_submodule(parts[0]) if len(parts) == 2 else model + inv_freq = 1.0 / ( + mistral_config.rope_theta + ** (torch.arange(0, mistral_config.head_dim, 2, dtype=torch.float32) / mistral_config.head_dim) + ) + parent.register_buffer(parts[-1], inv_freq.to(model_dtype), persistent=False) + + return model + + +@ModelLoaderRegistry.register( + base=BaseModelType.Any, + type=ModelType.MistralEncoder, + format=ModelFormat.GGUFQuantized, +) +class MistralEncoderGGUFLoader(ModelLoader): + """Load a GGUF-quantized Mistral encoder (text-only).""" + + def _load_model( + self, + config: AnyModelConfig, + submodel_type: Optional[SubModelType] = None, + ) -> AnyModel: + if not isinstance(config, MistralEncoder_GGUF_Config): + raise ValueError("Only MistralEncoder_GGUF_Config models are supported here.") + + match submodel_type: + case SubModelType.TextEncoder: + return self._load_from_gguf(config) + case SubModelType.Tokenizer: + return _load_processor_with_offline_fallback() + + raise ValueError( + "Only Tokenizer and TextEncoder submodels are supported. " + f"Received: {submodel_type.value if submodel_type else 'None'}" + ) + + def _load_from_gguf(self, config: MistralEncoder_GGUF_Config) -> AnyModel: + logger = InvokeAILogger.get_logger(self.__class__.__name__) + target_device = TorchDevice.choose_torch_device() + compute_dtype = TorchDevice.choose_bfloat16_safe_dtype(target_device) + + sd = gguf_sd_loader(Path(config.path), compute_dtype=compute_dtype) + + # llama.cpp stores layers as `blk.N.*`. Normalize to transformers' `model.layers.N.*` if needed. + is_llamacpp = any(isinstance(k, str) and k.startswith("blk.") for k in sd.keys()) + if is_llamacpp: + logger.info("Detected llama.cpp GGUF format, converting keys to transformers format") + sd = _convert_llamacpp_mistral_to_pytorch(sd) + + sd = _strip_known_prefixes(sd) + + mistral_config = _build_mistral_config(sd, torch_dtype=compute_dtype) + logger.info( + f"Mistral encoder config (GGUF): layers={mistral_config.num_hidden_layers}, " + f"hidden={mistral_config.hidden_size}, heads={mistral_config.num_attention_heads}, " + f"kv_heads={mistral_config.num_key_value_heads}, intermediate={mistral_config.intermediate_size}" + ) + + with accelerate.init_empty_weights(): + model = MistralModel(mistral_config) + + model.load_state_dict(sd, strict=False, assign=True) + + # Embedding lookups require an indexable tensor — dequantize the GGMLTensor for embed_tokens. + embed_weight = model.embed_tokens.weight + if isinstance(embed_weight, GGMLTensor): + model.embed_tokens.weight = torch.nn.Parameter(embed_weight.get_dequantized_tensor(), requires_grad=False) + + for name, buffer in list(model.named_buffers()): + if buffer.is_meta and name.endswith("inv_freq"): + parts = name.rsplit(".", 1) + parent = model.get_submodule(parts[0]) if len(parts) == 2 else model + inv_freq = 1.0 / ( + mistral_config.rope_theta + ** (torch.arange(0, mistral_config.head_dim, 2, dtype=torch.float32) / mistral_config.head_dim) + ) + parent.register_buffer(parts[-1], inv_freq.to(compute_dtype), persistent=False) + + return model + + +def _convert_llamacpp_mistral_to_pytorch(sd: dict[str, Any]) -> dict[str, Any]: + """Rename llama.cpp Mistral keys to the transformers layout.""" + key_map = { + "token_embd.weight": "model.embed_tokens.weight", + "output_norm.weight": "model.norm.weight", + "output.weight": "lm_head.weight", + } + out: dict[str, Any] = {} + for key, value in sd.items(): + if not isinstance(key, str): + out[key] = value + continue + if key in key_map: + out[key_map[key]] = value + continue + # Per-layer keys: `blk.N.` -> `model.layers.N.` + if key.startswith("blk."): + parts = key.split(".", 2) # ["blk", "", ""] + if len(parts) == 3: + rest = parts[2] + rest = rest.replace("attn_q.", "self_attn.q_proj.") + rest = rest.replace("attn_k.", "self_attn.k_proj.") + rest = rest.replace("attn_v.", "self_attn.v_proj.") + rest = rest.replace("attn_output.", "self_attn.o_proj.") + rest = rest.replace("attn_norm.", "input_layernorm.") + rest = rest.replace("ffn_norm.", "post_attention_layernorm.") + rest = rest.replace("ffn_gate.", "mlp.gate_proj.") + rest = rest.replace("ffn_up.", "mlp.up_proj.") + rest = rest.replace("ffn_down.", "mlp.down_proj.") + out[f"model.layers.{parts[1]}.{rest}"] = value + continue + out[key] = value + return out diff --git a/invokeai/backend/model_manager/starter_models.py b/invokeai/backend/model_manager/starter_models.py index 2ab3b2767ee..82c213f7689 100644 --- a/invokeai/backend/model_manager/starter_models.py +++ b/invokeai/backend/model_manager/starter_models.py @@ -1022,6 +1022,76 @@ class StarterModelBundle(BaseModel): ) # endregion +# region FLUX.2 [dev] +# +# FLUX.2 [dev] is BFL's 32B guidance-distilled rectified-flow model and uses Mistral +# Small 3.1 (24B) as its sole text encoder. The transformer alone is ~64 GB at full +# bf16, so we surface several quantized variants. All FLUX.2 [dev] releases are +# governed by the FLUX.2 Non-Commercial License. + +flux2_dev_mistral_encoder = StarterModel( + name="FLUX.2 [dev] Mistral Encoder", + base=BaseModelType.Any, + source="black-forest-labs/FLUX.2-dev::text_encoder+tokenizer", + description="Mistral Small 3.1 (24B) text encoder + tokenizer for FLUX.2 [dev]. ~48GB bf16", + type=ModelType.MistralEncoder, +) + +flux2_dev_mistral_encoder_nf4 = StarterModel( + name="FLUX.2 [dev] Mistral Encoder (NF4)", + base=BaseModelType.Any, + source="diffusers/FLUX.2-dev-bnb-4bit::text_encoder+tokenizer", + description="NF4-quantized Mistral Small 3.1 text encoder for FLUX.2 [dev]. ~12GB", + type=ModelType.MistralEncoder, +) + +flux2_dev_diffusers = StarterModel( + name="FLUX.2 [dev] (Diffusers)", + base=BaseModelType.Flux2, + source="black-forest-labs/FLUX.2-dev", + description="FLUX.2 [dev] full Diffusers pipeline - includes transformer, VAE, and Mistral text encoder. ~80GB. Non-Commercial License.", + type=ModelType.Main, +) + +flux2_dev_diffusers_nf4 = StarterModel( + name="FLUX.2 [dev] (Diffusers, NF4)", + base=BaseModelType.Flux2, + source="diffusers/FLUX.2-dev-bnb-4bit", + description="FLUX.2 [dev] with NF4-quantized DiT and text encoder - runs on ~18GB VRAM with offload. Non-Commercial License.", + type=ModelType.Main, +) + +flux2_dev_gguf_q4 = StarterModel( + name="FLUX.2 [dev] (GGUF Q4)", + base=BaseModelType.Flux2, + source="https://huggingface.co/city96/FLUX.2-dev-gguf/resolve/main/flux2_dev_Q4_K_M.gguf", + description="FLUX.2 [dev] transformer, GGUF Q4_K_M - ~18.7GB. Requires a separate FLUX.2 VAE and a Mistral encoder.", + type=ModelType.Main, + format=ModelFormat.GGUFQuantized, + dependencies=[flux2_vae, flux2_dev_mistral_encoder_nf4], +) + +flux2_dev_gguf_q6 = StarterModel( + name="FLUX.2 [dev] (GGUF Q6)", + base=BaseModelType.Flux2, + source="https://huggingface.co/city96/FLUX.2-dev-gguf/resolve/main/flux2_dev_Q6_K.gguf", + description="FLUX.2 [dev] transformer, GGUF Q6_K - ~26.7GB. Requires a separate FLUX.2 VAE and a Mistral encoder.", + type=ModelType.Main, + format=ModelFormat.GGUFQuantized, + dependencies=[flux2_vae, flux2_dev_mistral_encoder_nf4], +) + +flux2_dev_gguf_q8 = StarterModel( + name="FLUX.2 [dev] (GGUF Q8)", + base=BaseModelType.Flux2, + source="https://huggingface.co/city96/FLUX.2-dev-gguf/resolve/main/flux2_dev_Q8_0.gguf", + description="FLUX.2 [dev] transformer, GGUF Q8_0 - ~34.5GB. Requires a separate FLUX.2 VAE and a Mistral encoder.", + type=ModelType.Main, + format=ModelFormat.GGUFQuantized, + dependencies=[flux2_vae, flux2_dev_mistral_encoder_nf4], +) +# endregion + # region Z-Image z_image_qwen3_encoder = StarterModel( name="Z-Image Qwen3 Text Encoder", @@ -1663,6 +1733,13 @@ def _gemini_3_resolution_presets( flux2_klein_9b_gguf_q8, flux2_klein_qwen3_4b_encoder, flux2_klein_qwen3_8b_encoder, + flux2_dev_mistral_encoder, + flux2_dev_mistral_encoder_nf4, + flux2_dev_diffusers, + flux2_dev_diffusers_nf4, + flux2_dev_gguf_q4, + flux2_dev_gguf_q6, + flux2_dev_gguf_q8, cogview4, qwen_image_vae, qwen_vl_encoder_fp8, diff --git a/invokeai/backend/model_manager/taxonomy.py b/invokeai/backend/model_manager/taxonomy.py index a2e4e58bdc4..a7bcfff286f 100644 --- a/invokeai/backend/model_manager/taxonomy.py +++ b/invokeai/backend/model_manager/taxonomy.py @@ -47,7 +47,7 @@ class BaseModelType(str, Enum): Flux = "flux" """Indicates the model is associated with FLUX.1 model architecture, including FLUX Dev, Schnell and Fill.""" Flux2 = "flux2" - """Indicates the model is associated with FLUX.2 model architecture, including FLUX2 Klein.""" + """Indicates the model is associated with FLUX.2 model architecture, including FLUX.2 Klein and FLUX.2 [dev].""" CogView4 = "cogview4" """Indicates the model is associated with CogView 4 model architecture.""" ZImage = "z-image" @@ -79,6 +79,7 @@ class ModelType(str, Enum): T5Encoder = "t5_encoder" Qwen3Encoder = "qwen3_encoder" QwenVLEncoder = "qwen_vl_encoder" + MistralEncoder = "mistral_encoder" SpandrelImageToImage = "spandrel_image_to_image" SigLIP = "siglip" FluxRedux = "flux_redux" @@ -144,6 +145,9 @@ class Flux2VariantType(str, Enum): Klein9BBase = "klein_9b_base" """Flux2 Klein 9B Base variant - undistilled foundation model using Qwen3 8B text encoder.""" + Dev = "dev" + """FLUX.2 [dev] - 32B rectified flow transformer using Mistral Small 3.1 text encoder (guidance-distilled).""" + class ZImageVariantType(str, Enum): """Z-Image model variants.""" @@ -178,6 +182,13 @@ class Qwen3VariantType(str, Enum): """Qwen3 0.6B text encoder (hidden_size=1024). Used by Anima.""" +class MistralVariantType(str, Enum): + """Mistral text encoder variants used by FLUX.2 [dev].""" + + Small3_1 = "mistral_small_3_1" + """Mistral Small 3.1 (24B, hidden_size=5120). Used by FLUX.2 [dev].""" + + class ModelFormat(str, Enum): """Storage format of model.""" @@ -193,6 +204,7 @@ class ModelFormat(str, Enum): T5Encoder = "t5_encoder" Qwen3Encoder = "qwen3_encoder" QwenVLEncoder = "qwen_vl_encoder" + MistralEncoder = "mistral_encoder" BnbQuantizedLlmInt8b = "bnb_quantized_int8b" BnbQuantizednf4b = "bnb_quantized_nf4b" GGUFQuantized = "gguf_quantized" @@ -249,6 +261,7 @@ class FluxLoRAFormat(str, Enum): ZImageVariantType, QwenImageVariantType, Qwen3VariantType, + MistralVariantType, ] variant_type_adapter = TypeAdapter[ ModelVariantType @@ -258,6 +271,7 @@ class FluxLoRAFormat(str, Enum): | ZImageVariantType | QwenImageVariantType | Qwen3VariantType + | MistralVariantType ]( ModelVariantType | ClipVariantType @@ -266,4 +280,5 @@ class FluxLoRAFormat(str, Enum): | ZImageVariantType | QwenImageVariantType | Qwen3VariantType + | MistralVariantType ) diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.test.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.test.ts index 9443001c2d7..64f284c5703 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.test.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.test.ts @@ -184,6 +184,9 @@ function buildMockState(overrides: Record = {}) { animaScheduler: 'euler', kleinVaeModel: null, kleinQwen3EncoderModel: null, + flux2DevVaeModel: null, + flux2DevMistralEncoderModel: null, + flux2DevSourceModel: null, zImageScheduler: 'euler', ...overrides, }, diff --git a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts index a5200ef1ff8..312b857c3a7 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts @@ -261,6 +261,30 @@ const slice = createSlice({ } state.kleinQwen3EncoderModel = result.data; }, + flux2DevVaeModelSelected: (state, action: PayloadAction) => { + const result = zParamsState.shape.flux2DevVaeModel.safeParse(action.payload); + if (!result.success) { + return; + } + state.flux2DevVaeModel = result.data; + }, + flux2DevMistralEncoderModelSelected: ( + state, + action: PayloadAction<{ key: string; name: string; base: string } | null> + ) => { + const result = zParamsState.shape.flux2DevMistralEncoderModel.safeParse(action.payload); + if (!result.success) { + return; + } + state.flux2DevMistralEncoderModel = result.data; + }, + flux2DevSourceModelSelected: (state, action: PayloadAction) => { + const result = zParamsState.shape.flux2DevSourceModel.safeParse(action.payload); + if (!result.success) { + return; + } + state.flux2DevSourceModel = result.data; + }, qwenImageComponentSourceSelected: (state, action: PayloadAction) => { const result = zParamsState.shape.qwenImageComponentSource.safeParse(action.payload); if (!result.success) { @@ -605,6 +629,9 @@ const resetState = (state: ParamsState): ParamsState => { newState.animaT5EncoderModel = oldState.animaT5EncoderModel; newState.kleinVaeModel = oldState.kleinVaeModel; newState.kleinQwen3EncoderModel = oldState.kleinQwen3EncoderModel; + newState.flux2DevVaeModel = oldState.flux2DevVaeModel; + newState.flux2DevMistralEncoderModel = oldState.flux2DevMistralEncoderModel; + newState.flux2DevSourceModel = oldState.flux2DevSourceModel; newState.qwenImageComponentSource = oldState.qwenImageComponentSource; newState.qwenImageVaeModel = oldState.qwenImageVaeModel; newState.qwenImageQwenVLEncoderModel = oldState.qwenImageQwenVLEncoderModel; @@ -657,6 +684,9 @@ export const { zImageQwen3SourceModelSelected, kleinVaeModelSelected, kleinQwen3EncoderModelSelected, + flux2DevVaeModelSelected, + flux2DevMistralEncoderModelSelected, + flux2DevSourceModelSelected, qwenImageComponentSourceSelected, qwenImageVaeModelSelected, qwenImageQwenVLEncoderModelSelected, @@ -778,6 +808,11 @@ export const selectAnimaT5EncoderModel = createParamsSelector((params) => params export const selectAnimaScheduler = createParamsSelector((params) => params.animaScheduler); export const selectKleinVaeModel = createParamsSelector((params) => params.kleinVaeModel); export const selectKleinQwen3EncoderModel = createParamsSelector((params) => params.kleinQwen3EncoderModel); +export const selectFlux2DevVaeModel = createParamsSelector((params) => params.flux2DevVaeModel); +export const selectFlux2DevMistralEncoderModel = createParamsSelector( + (params) => params.flux2DevMistralEncoderModel +); +export const selectFlux2DevSourceModel = createParamsSelector((params) => params.flux2DevSourceModel); export const selectQwenImageComponentSource = createParamsSelector((params) => params.qwenImageComponentSource); export const selectQwenImageVaeModel = createParamsSelector((params) => params.qwenImageVaeModel); export const selectQwenImageQwenVLEncoderModel = createParamsSelector((params) => params.qwenImageQwenVLEncoderModel); @@ -984,3 +1019,17 @@ export const selectMainModelConfig = createSelector(selectModelConfig, (modelCon } return modelConfig; }); + +export const selectIsFlux2Dev = createSelector(selectMainModelConfig, (modelConfig) => { + if (!modelConfig || modelConfig.base !== 'flux2') { + return false; + } + return 'variant' in modelConfig && modelConfig.variant === 'dev'; +}); + +export const selectIsFlux2Klein = createSelector(selectMainModelConfig, (modelConfig) => { + if (!modelConfig || modelConfig.base !== 'flux2') { + return false; + } + return !('variant' in modelConfig) || modelConfig.variant !== 'dev'; +}); diff --git a/invokeai/frontend/web/src/features/controlLayers/store/types.ts b/invokeai/frontend/web/src/features/controlLayers/store/types.ts index cbeccdfa930..9fc90ac5dc4 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/types.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/types.ts @@ -837,6 +837,10 @@ export const zParamsState = z.object({ // Flux2 Klein model components - uses Qwen3 instead of CLIP+T5 kleinVaeModel: zParameterVAEModel.nullable(), // Optional: Separate FLUX.2 VAE for Klein kleinQwen3EncoderModel: zModelIdentifierField.nullable(), // Optional: Separate Qwen3 Encoder for Klein + // Flux2 [dev] model components - uses Mistral Small 3.1 (24B) text encoder + flux2DevVaeModel: zParameterVAEModel.nullable(), // Optional: Separate FLUX.2 VAE for [dev] + flux2DevMistralEncoderModel: zModelIdentifierField.nullable(), // Optional: Standalone Mistral encoder for [dev] + flux2DevSourceModel: zParameterModel.nullable(), // Diffusers FLUX.2 [dev] (fallback for VAE/Encoder) // Qwen Image Edit model components - GGUF transformer needs a Diffusers source for VAE/encoder qwenImageComponentSource: zParameterModel.nullable(), // Diffusers model providing VAE + text encoder qwenImageVaeModel: zParameterVAEModel.nullable(), // Optional: Standalone Qwen Image VAE checkpoint @@ -923,6 +927,9 @@ export const getInitialParamsState = (): ParamsState => ({ animaScheduler: 'euler', kleinVaeModel: null, kleinQwen3EncoderModel: null, + flux2DevVaeModel: null, + flux2DevMistralEncoderModel: null, + flux2DevSourceModel: null, qwenImageComponentSource: null, qwenImageVaeModel: null, qwenImageQwenVLEncoderModel: null, diff --git a/invokeai/frontend/web/src/features/modelManagerV2/models.ts b/invokeai/frontend/web/src/features/modelManagerV2/models.ts index cf295c9af6a..f86a39bb675 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/models.ts +++ b/invokeai/frontend/web/src/features/modelManagerV2/models.ts @@ -11,6 +11,7 @@ import { isIPAdapterModelConfig, isLLaVAModelConfig, isLoRAModelConfig, + isMistralEncoderModelConfig, isNonRefinerMainModelConfig, isQwen3EncoderModelConfig, isQwenVLEncoderModelConfig, @@ -85,6 +86,11 @@ const MODEL_CATEGORIES: Record = { i18nKey: 'modelManager.qwenVLEncoder', filter: isQwenVLEncoderModelConfig, }, + mistral_encoder: { + category: 'mistral_encoder', + i18nKey: 'modelManager.mistralEncoder', + filter: isMistralEncoderModelConfig, + }, control_lora: { category: 'control_lora', i18nKey: 'modelManager.controlLora', @@ -187,6 +193,7 @@ export const MODEL_TYPE_TO_LONG_NAME: Record = { t5_encoder: 'T5 Encoder', qwen3_encoder: 'Qwen3 Encoder', qwen_vl_encoder: 'Qwen2.5-VL Encoder', + mistral_encoder: 'Mistral Encoder', clip_embed: 'CLIP Embed', siglip: 'SigLIP', flux_redux: 'FLUX Redux', @@ -255,6 +262,7 @@ export const MODEL_VARIANT_TO_LONG_NAME: Record = { qwen3_4b: 'Qwen3 4B', qwen3_8b: 'Qwen3 8B', qwen3_06b: 'Qwen3 0.6B', + mistral_small_3_1: 'Mistral Small 3.1', }; export const MODEL_FORMAT_TO_LONG_NAME: Record = { @@ -271,6 +279,7 @@ export const MODEL_FORMAT_TO_LONG_NAME: Record = { t5_encoder: 'T5 Encoder', qwen3_encoder: 'Qwen3 Encoder', qwen_vl_encoder: 'Qwen2.5-VL Encoder', + mistral_encoder: 'Mistral Encoder', bnb_quantized_int8b: 'BNB Quantized (int8b)', bnb_quantized_nf4b: 'BNB Quantized (nf4b)', gguf_quantized: 'GGUF Quantized', diff --git a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelFormatBadge.tsx b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelFormatBadge.tsx index 71d2efe0e45..d1868a1e221 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelFormatBadge.tsx +++ b/invokeai/frontend/web/src/features/modelManagerV2/subpanels/ModelManagerPanel/ModelFormatBadge.tsx @@ -16,6 +16,7 @@ const FORMAT_NAME_MAP: Record = { t5_encoder: 't5_encoder', qwen3_encoder: 'qwen3_encoder', qwen_vl_encoder: 'qwen_vl_encoder', + mistral_encoder: 'mistral_encoder', bnb_quantized_int8b: 'bnb_quantized_int8b', bnb_quantized_nf4b: 'quantized', gguf_quantized: 'gguf', @@ -37,6 +38,7 @@ const FORMAT_COLOR_MAP: Record = { t5_encoder: 'base', qwen3_encoder: 'base', qwen_vl_encoder: 'base', + mistral_encoder: 'base', bnb_quantized_int8b: 'base', bnb_quantized_nf4b: 'base', gguf_quantized: 'base', diff --git a/invokeai/frontend/web/src/features/nodes/types/common.ts b/invokeai/frontend/web/src/features/nodes/types/common.ts index fb2a1ce946a..b4a46b5af99 100644 --- a/invokeai/frontend/web/src/features/nodes/types/common.ts +++ b/invokeai/frontend/web/src/features/nodes/types/common.ts @@ -134,6 +134,7 @@ export const zModelType = z.enum([ 't5_encoder', 'qwen3_encoder', 'qwen_vl_encoder', + 'mistral_encoder', 'clip_embed', 'siglip', 'flux_redux', @@ -160,10 +161,11 @@ export const zSubModelType = z.enum([ export const zClipVariantType = z.enum(['large', 'gigantic']); export const zModelVariantType = z.enum(['normal', 'inpaint', 'depth']); export const zFluxVariantType = z.enum(['dev', 'dev_fill', 'schnell']); -export const zFlux2VariantType = z.enum(['klein_4b', 'klein_4b_base', 'klein_9b', 'klein_9b_base']); +export const zFlux2VariantType = z.enum(['klein_4b', 'klein_4b_base', 'klein_9b', 'klein_9b_base', 'dev']); export const zZImageVariantType = z.enum(['turbo', 'zbase']); const zQwenImageVariantType = z.enum(['generate', 'edit']); export const zQwen3VariantType = z.enum(['qwen3_4b', 'qwen3_8b', 'qwen3_06b']); +export const zMistralVariantType = z.enum(['mistral_small_3_1']); export const zAnyModelVariant = z.union([ zModelVariantType, zClipVariantType, @@ -172,6 +174,7 @@ export const zAnyModelVariant = z.union([ zZImageVariantType, zQwenImageVariantType, zQwen3VariantType, + zMistralVariantType, ]); export type AnyModelVariant = z.infer; export const zModelFormat = z.enum([ @@ -187,6 +190,7 @@ export const zModelFormat = z.enum([ 't5_encoder', 'qwen3_encoder', 'qwen_vl_encoder', + 'mistral_encoder', 'bnb_quantized_int8b', 'bnb_quantized_nf4b', 'gguf_quantized', diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addFlux2DevLoRAs.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addFlux2DevLoRAs.ts new file mode 100644 index 00000000000..50c307dc49a --- /dev/null +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addFlux2DevLoRAs.ts @@ -0,0 +1,62 @@ +import type { RootState } from 'app/store/store'; +import { getPrefixedId } from 'features/controlLayers/konva/util'; +import { zModelIdentifierField } from 'features/nodes/types/common'; +import type { Graph } from 'features/nodes/util/graph/generation/Graph'; +import type { Invocation, S } from 'services/api/types'; + +/** + * Wire any enabled FLUX.2 LoRAs through a `flux2_dev_lora_collection_loader`, + * patching both the transformer and the Mistral text encoder. + */ +export const addFlux2DevLoRAs = ( + state: RootState, + g: Graph, + denoise: Invocation<'flux2_denoise'>, + modelLoader: Invocation<'flux2_dev_model_loader'>, + textEncoder: Invocation<'flux2_dev_text_encoder'> +): void => { + // Currently all `flux2` LoRAs share a single base value (the variant guard happens + // server-side in the dev LoRA loader, which warns on mismatches). + const enabledLoRAs = state.loras.loras.filter((l) => l.isEnabled && l.model.base === 'flux2'); + if (enabledLoRAs.length === 0) { + return; + } + + const loraMetadata: S['LoRAMetadataField'][] = []; + + const loraCollector = g.addNode({ + id: getPrefixedId('lora_collector'), + type: 'collect', + }); + const loraCollectionLoader = g.addNode({ + type: 'flux2_dev_lora_collection_loader', + id: getPrefixedId('flux2_dev_lora_collection_loader'), + }); + + g.addEdge(loraCollector, 'collection', loraCollectionLoader, 'loras'); + g.addEdge(modelLoader, 'transformer', loraCollectionLoader, 'transformer'); + g.addEdge(modelLoader, 'mistral_encoder', loraCollectionLoader, 'mistral_encoder'); + // Reroute the patched outputs back into the denoise / text encoder. + g.deleteEdgesTo(denoise, ['transformer']); + g.deleteEdgesTo(textEncoder, ['mistral_encoder']); + g.addEdge(loraCollectionLoader, 'transformer', denoise, 'transformer'); + g.addEdge(loraCollectionLoader, 'mistral_encoder', textEncoder, 'mistral_encoder'); + + for (const lora of enabledLoRAs) { + const { weight } = lora; + const parsedModel = zModelIdentifierField.parse(lora.model); + + const loraSelector = g.addNode({ + type: 'lora_selector', + id: getPrefixedId('lora_selector'), + lora: parsedModel, + weight, + }); + + loraMetadata.push({ model: parsedModel, weight }); + + g.addEdge(loraSelector, 'lora', loraCollector, 'item'); + } + + g.upsertMetadata({ loras: loraMetadata }); +}; diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addRegions.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addRegions.ts index bbe4adf7387..c5fe02b7cd4 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addRegions.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addRegions.ts @@ -37,6 +37,7 @@ type AddRegionsArg = { | 'sdxl_compel_prompt' | 'flux_text_encoder' | 'flux2_klein_text_encoder' + | 'flux2_dev_text_encoder' | 'z_image_text_encoder' | 'anima_text_encoder' >; @@ -45,6 +46,7 @@ type AddRegionsArg = { | 'sdxl_compel_prompt' | 'flux_text_encoder' | 'flux2_klein_text_encoder' + | 'flux2_dev_text_encoder' | 'z_image_text_encoder' | 'anima_text_encoder' > | null; diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.test.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.test.ts index 5b9f3d0a468..86be4eb51ec 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.test.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.test.ts @@ -116,6 +116,8 @@ vi.mock('features/controlLayers/store/paramsSlice', () => ({ selectParamsSlice: vi.fn(() => mockParams), selectKleinVaeModel: vi.fn(() => currentKleinVae), selectKleinQwen3EncoderModel: vi.fn(() => currentKleinQwen3), + selectFlux2DevVaeModel: vi.fn(() => null), + selectFlux2DevMistralEncoderModel: vi.fn(() => null), })); vi.mock('features/controlLayers/store/refImagesSlice', () => ({ @@ -186,6 +188,7 @@ vi.mock('features/nodes/util/graph/generation/addIPAdapters', () => ({ vi.mock('services/api/hooks/modelsByType', () => ({ selectFlux2DiffusersModels: vi.fn(() => diffusersModels), + selectFlux2DevDiffusersModels: vi.fn(() => []), })); vi.mock('services/api/types', async () => { diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts index dafcd9310ec..ed9fefa1e44 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts @@ -1,6 +1,8 @@ import { logger } from 'app/logging/logger'; import { getPrefixedId } from 'features/controlLayers/konva/util'; import { + selectFlux2DevMistralEncoderModel, + selectFlux2DevVaeModel, selectKleinQwen3EncoderModel, selectKleinVaeModel, selectMainModelConfig, @@ -12,6 +14,7 @@ import { isFlux2ReferenceImageConfig, isFluxKontextReferenceImageConfig } from ' import { getGlobalReferenceImageWarnings } from 'features/controlLayers/store/validators'; import type { ModelIdentifierField } from 'features/nodes/types/common'; import { zImageField, zModelIdentifierField } from 'features/nodes/types/common'; +import { addFlux2DevLoRAs } from 'features/nodes/util/graph/generation/addFlux2DevLoRAs'; import { addFlux2KleinLoRAs } from 'features/nodes/util/graph/generation/addFlux2KleinLoRAs'; import { addFLUXFill } from 'features/nodes/util/graph/generation/addFLUXFill'; import { addFLUXLoRAs } from 'features/nodes/util/graph/generation/addFLUXLoRAs'; @@ -30,7 +33,7 @@ import { UnsupportedGenerationModeError } from 'features/nodes/util/graph/types' import { isFlux2KleinQwen3Compatible } from 'features/parameters/util/flux2Klein'; import { selectActiveTab } from 'features/ui/store/uiSelectors'; import { t } from 'i18next'; -import { selectFlux2DiffusersModels } from 'services/api/hooks/modelsByType'; +import { selectFlux2DevDiffusersModels, selectFlux2DiffusersModels } from 'services/api/hooks/modelsByType'; import type { Invocation } from 'services/api/types'; import type { Equals } from 'tsafe'; import { assert } from 'tsafe'; @@ -64,11 +67,15 @@ export const buildFLUXGraph = async (arg: GraphBuilderArg): Promise | Invocation<'flux2_klein_model_loader'>; - let posCond: Invocation<'flux_text_encoder'> | Invocation<'flux2_klein_text_encoder'>; + // Create model loader and text encoder nodes based on variant: + // - Standard FLUX uses CLIP + T5 + // - FLUX.2 Klein uses Qwen3 + // - FLUX.2 [dev] uses Mistral Small 3.1 + let modelLoader: + | Invocation<'flux_model_loader'> + | Invocation<'flux2_klein_model_loader'> + | Invocation<'flux2_dev_model_loader'>; + let posCond: + | Invocation<'flux_text_encoder'> + | Invocation<'flux2_klein_text_encoder'> + | Invocation<'flux2_dev_text_encoder'>; let denoise: Invocation<'flux_denoise'> | Invocation<'flux2_denoise'>; let posCondCollect: Invocation<'collect'> | null = null; @@ -142,7 +157,48 @@ export const buildFLUXGraph = async (arg: GraphBuilderArg): Promise; + const devCond = posCond as Invocation<'flux2_dev_text_encoder'>; + g.addEdge(devLoader, 'mistral_encoder', devCond, 'mistral_encoder'); + g.addEdge(devLoader, 'max_seq_len', devCond, 'max_seq_len'); + g.addEdge(devLoader, 'transformer', denoise, 'transformer'); + g.addEdge(devLoader, 'vae', l2i, 'vae'); + g.addEdge(positivePrompt, 'value', devCond, 'prompt'); + g.addEdge(devCond, 'conditioning', denoise, 'positive_text_conditioning'); + } else if (isFlux2Klein) { // Flux2 Klein: Use Qwen3-based model loader, text encoder, and dedicated denoise node // VAE and Qwen3 encoder can be extracted from the main Diffusers model or selected separately. // For non-diffusers main models, find a diffusers flux2 model to use as the source for VAE/encoder. @@ -244,7 +300,21 @@ export const buildFLUXGraph = async (arg: GraphBuilderArg): Promise = { + model: Graph.getModelMetadataField(model), + steps, + scheduler: fluxScheduler, + guidance, + }; + if (flux2DevVaeModel) { + flux2DevMetadata.vae = flux2DevVaeModel; + } + if (flux2DevMistralEncoderModel) { + flux2DevMetadata.mistral_encoder = flux2DevMistralEncoderModel; + } + g.upsertMetadata(flux2DevMetadata); + } else if (isFlux2) { // VAE and Qwen3 encoder can come from the main model or be selected separately const flux2Metadata: Record = { model: Graph.getModelMetadataField(model), @@ -277,8 +347,112 @@ export const buildFLUXGraph = async (arg: GraphBuilderArg): Promise = l2i; - // Flux2 Klein path - if (isFlux2) { + // FLUX.2 [dev] path. Mirrors the Klein wiring but with the dev model loader / encoder. + if (isFlux2Dev) { + const flux2Denoise = denoise as Invocation<'flux2_denoise'>; + const flux2DevLoader = modelLoader as Invocation<'flux2_dev_model_loader'>; + const flux2L2i = l2i as Invocation<'flux2_vae_decode'>; + const flux2DevCond = posCond as Invocation<'flux2_dev_text_encoder'>; + + addFlux2DevLoRAs(state, g, flux2Denoise, flux2DevLoader, flux2DevCond); + + // FLUX.2 [dev] has the same multi-reference image editing support as Klein + // (32-channel VAE encode + 4D RoPE position IDs are model-agnostic; the + // backend Flux2RefImageExtension handles both). + const validFlux2DevRefImageConfigs = selectRefImagesSlice(state) + .entities.filter((entity) => entity.isEnabled) + .filter((entity) => isFlux2ReferenceImageConfig(entity.config)) + .filter((entity) => getGlobalReferenceImageWarnings(entity, model).length === 0); + + if (validFlux2DevRefImageConfigs.length > 0) { + let prevCollect: Invocation<'collect'> | null = null; + for (const { config } of validFlux2DevRefImageConfigs) { + const kontextConditioning = g.addNode({ + type: 'flux_kontext', + id: getPrefixedId('flux_kontext'), + image: zImageField.parse(config.image?.crop?.image ?? config.image?.original.image), + }); + const collectNode = g.addNode({ + type: 'collect', + id: getPrefixedId('flux2_kontext_collect'), + }); + g.addEdge(kontextConditioning, 'kontext_cond', collectNode, 'item'); + if (prevCollect !== null) { + g.addEdge(prevCollect, 'collection', collectNode, 'collection'); + } + prevCollect = collectNode; + } + assert(prevCollect !== null); + g.addEdge(prevCollect, 'collection', flux2Denoise, 'kontext_conditioning'); + + g.upsertMetadata({ ref_images: validFlux2DevRefImageConfigs }, 'merge'); + } + + if (generationMode === 'txt2img') { + canvasOutput = addTextToImage({ + g, + state, + denoise: flux2Denoise, + l2i: flux2L2i, + }); + g.upsertMetadata({ generation_mode: 'flux2_txt2img' }); + } else if (generationMode === 'img2img') { + assert(manager !== null); + const i2l = g.addNode({ + type: 'flux2_vae_encode', + id: getPrefixedId('flux2_vae_encode'), + }); + canvasOutput = await addImageToImage({ + g, + state, + manager, + l2i: flux2L2i, + i2l, + denoise: flux2Denoise, + vaeSource: flux2DevLoader, + }); + g.upsertMetadata({ generation_mode: 'flux2_img2img' }); + } else if (generationMode === 'inpaint') { + assert(manager !== null); + const i2l = g.addNode({ + type: 'flux2_vae_encode', + id: getPrefixedId('flux2_vae_encode'), + }); + canvasOutput = await addInpaint({ + g, + state, + manager, + l2i: flux2L2i, + i2l, + denoise: flux2Denoise, + vaeSource: flux2DevLoader, + modelLoader: flux2DevLoader, + seed, + }); + g.upsertMetadata({ generation_mode: 'flux2_inpaint' }); + } else if (generationMode === 'outpaint') { + assert(manager !== null); + const i2l = g.addNode({ + type: 'flux2_vae_encode', + id: getPrefixedId('flux2_vae_encode'), + }); + canvasOutput = await addOutpaint({ + g, + state, + manager, + l2i: flux2L2i, + i2l, + denoise: flux2Denoise, + vaeSource: flux2DevLoader, + modelLoader: flux2DevLoader, + seed, + }); + g.upsertMetadata({ generation_mode: 'flux2_outpaint' }); + } else { + assert>(false); + } + } else if (isFlux2) { + // Flux2 Klein path const flux2Denoise = denoise as Invocation<'flux2_denoise'>; const flux2ModelLoader = modelLoader as Invocation<'flux2_klein_model_loader'>; const flux2L2i = l2i as Invocation<'flux2_vae_decode'>; diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/graphBuilderUtils.ts b/invokeai/frontend/web/src/features/nodes/util/graph/graphBuilderUtils.ts index 28aa74db5ec..860ba39f439 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/graphBuilderUtils.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/graphBuilderUtils.ts @@ -213,6 +213,7 @@ export const isMainModelWithoutUnet = (modelLoader: Invocation { + const dispatch = useAppDispatch(); + const { t } = useTranslation(); + const flux2DevVaeModel = useAppSelector(selectFlux2DevVaeModel); + const mainModelConfig = useAppSelector(selectMainModelConfig); + const [modelConfigs, { isLoading }] = useFlux2VAEModels(); + const [diffusersModels] = useFlux2DevDiffusersModels(); + + const _onChange = useCallback( + (model: VAEModelConfig | null) => { + if (model) { + dispatch(flux2DevVaeModelSelected(zModelIdentifierField.parse(model))); + } else { + dispatch(flux2DevVaeModelSelected(null)); + } + }, + [dispatch] + ); + + const { options, value, onChange, noOptionsMessage } = useModelCombobox({ + modelConfigs, + onChange: _onChange, + selectedModel: flux2DevVaeModel, + isLoading, + }); + + const hasDiffusersSource = mainModelConfig?.format === 'diffusers' || diffusersModels.length > 0; + const placeholder = hasDiffusersSource + ? t('modelManager.flux2DevVaePlaceholder', { defaultValue: 'Auto (from Diffusers source)' }) + : t('modelManager.flux2DevVaeNoModelPlaceholder', { defaultValue: 'Select a FLUX.2 VAE model' }); + + return ( + + {t('modelManager.flux2DevVae', { defaultValue: 'FLUX.2 [dev] VAE' })} + + + ); +}); + +ParamFlux2DevVaeModelSelect.displayName = 'ParamFlux2DevVaeModelSelect'; + +/** + * FLUX.2 [dev] Mistral Encoder Model Select. + * + * Selects the Mistral Small 3.1 text encoder used by FLUX.2 [dev]. Only needed + * when the main model is a single-file safetensors or GGUF without a Diffusers + * companion to extract the encoder from. + */ +const ParamFlux2DevMistralEncoderModelSelect = memo(() => { + const dispatch = useAppDispatch(); + const { t } = useTranslation(); + const mistralEncoderModel = useAppSelector(selectFlux2DevMistralEncoderModel); + const mainModelConfig = useAppSelector(selectMainModelConfig); + const [modelConfigs, { isLoading }] = useMistralEncoderModels(); + const [diffusersModels] = useFlux2DevDiffusersModels(); + + const _onChange = useCallback( + (model: MistralEncoderModelConfig | null) => { + if (model) { + dispatch(flux2DevMistralEncoderModelSelected(zModelIdentifierField.parse(model))); + } else { + dispatch(flux2DevMistralEncoderModelSelected(null)); + } + }, + [dispatch] + ); + + const { options, value, onChange, noOptionsMessage } = useModelCombobox({ + modelConfigs, + onChange: _onChange, + selectedModel: mistralEncoderModel, + isLoading, + }); + + const hasDiffusersSource = mainModelConfig?.format === 'diffusers' || diffusersModels.length > 0; + const placeholder = hasDiffusersSource + ? t('modelManager.flux2DevMistralEncoderPlaceholder', { defaultValue: 'Auto (from Diffusers source)' }) + : t('modelManager.flux2DevMistralEncoderNoModelPlaceholder', { + defaultValue: 'Select a Mistral text encoder', + }); + + return ( + + + {t('modelManager.flux2DevMistralEncoder', { defaultValue: 'FLUX.2 [dev] Mistral Encoder' })} + + + + ); +}); + +ParamFlux2DevMistralEncoderModelSelect.displayName = 'ParamFlux2DevMistralEncoderModelSelect'; + +/** + * Combined component for FLUX.2 [dev] companion model selection. + */ +const ParamFlux2DevModelSelects = () => { + return ( + <> + + + + ); +}; + +export default memo(ParamFlux2DevModelSelects); diff --git a/invokeai/frontend/web/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx b/invokeai/frontend/web/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx index bfb69b945c8..26bb8c6f59a 100644 --- a/invokeai/frontend/web/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx +++ b/invokeai/frontend/web/src/features/settingsAccordions/components/AdvancedSettingsAccordion/AdvancedSettingsAccordion.tsx @@ -8,6 +8,7 @@ import { selectIsExternal, selectIsFLUX, selectIsFlux2, + selectIsFlux2Dev, selectIsQwenImage, selectIsSD3, selectIsZImage, @@ -20,6 +21,7 @@ import ParamCLIPEmbedModelSelect from 'features/parameters/components/Advanced/P import ParamCLIPGEmbedModelSelect from 'features/parameters/components/Advanced/ParamCLIPGEmbedModelSelect'; import ParamCLIPLEmbedModelSelect from 'features/parameters/components/Advanced/ParamCLIPLEmbedModelSelect'; import ParamClipSkip from 'features/parameters/components/Advanced/ParamClipSkip'; +import ParamFlux2DevModelSelect from 'features/parameters/components/Advanced/ParamFlux2DevModelSelect'; import ParamFlux2KleinModelSelect from 'features/parameters/components/Advanced/ParamFlux2KleinModelSelect'; import ParamQwenImageComponentSourceSelect from 'features/parameters/components/Advanced/ParamQwenImageComponentSourceSelect'; import ParamQwenImageQuantization from 'features/parameters/components/Advanced/ParamQwenImageQuantization'; @@ -49,6 +51,7 @@ export const AdvancedSettingsAccordion = memo(() => { const { currentData: vaeConfig } = useGetModelConfigQuery(vaeKey ?? skipToken); const isFLUX = useAppSelector(selectIsFLUX); const isFlux2 = useAppSelector(selectIsFlux2); + const isFlux2Dev = useAppSelector(selectIsFlux2Dev); const isSD3 = useAppSelector(selectIsSD3); const isZImage = useAppSelector(selectIsZImage); const isExternal = useAppSelector(selectIsExternal); @@ -138,11 +141,16 @@ export const AdvancedSettingsAccordion = memo(() => { )} - {isFlux2 && ( + {isFlux2 && !isFlux2Dev && ( )} + {isFlux2Dev && ( + + + + )} {isSD3 && ( diff --git a/invokeai/frontend/web/src/services/api/hooks/modelsByType.ts b/invokeai/frontend/web/src/services/api/hooks/modelsByType.ts index bd1ac088138..ca704574e8c 100644 --- a/invokeai/frontend/web/src/services/api/hooks/modelsByType.ts +++ b/invokeai/frontend/web/src/services/api/hooks/modelsByType.ts @@ -18,6 +18,7 @@ import { isControlNetModelConfig, isExternalApiModelConfig, isFlux1VAEModelConfig, + isFlux2DevDiffusersMainModelConfig, isFlux2DiffusersMainModelConfig, isFlux2VAEModelConfig, isFluxKontextModelConfig, @@ -27,6 +28,7 @@ import { isLLaVAModelConfig, isLoRAModelConfig, isMainOrExternalModelConfig, + isMistralEncoderModelConfig, isQwen3EncoderModelConfig, isQwenImageDiffusersMainModelConfig, isQwenImageVAEModelConfig, @@ -107,6 +109,8 @@ export const useAnimaVAEModels = () => buildModelsHook(isAnimaVAEModelConfig)(); export const useAnimaQwen3EncoderModels = () => buildModelsHook(isAnimaQwen3EncoderModelConfig)(); export const useZImageDiffusersModels = () => buildModelsHook(isZImageDiffusersMainModelConfig)(); export const useFlux2DiffusersModels = () => buildModelsHook(isFlux2DiffusersMainModelConfig)(); +export const useFlux2DevDiffusersModels = () => buildModelsHook(isFlux2DevDiffusersMainModelConfig)(); +export const useMistralEncoderModels = () => buildModelsHook(isMistralEncoderModelConfig)(); export const useQwenImageDiffusersModels = () => buildModelsHook(isQwenImageDiffusersMainModelConfig)(); export const useQwenImageVAEModels = () => buildModelsHook(isQwenImageVAEModelConfig)(); export const useQwenVLEncoderModels = () => buildModelsHook(isQwenVLEncoderModelConfig)(); @@ -151,6 +155,8 @@ export const selectQwenImageVAEModels = buildModelsSelector(isQwenImageVAEModelC export const selectQwenVLEncoderModels = buildModelsSelector(isQwenVLEncoderModelConfig); export const selectZImageDiffusersModels = buildModelsSelector(isZImageDiffusersMainModelConfig); export const selectFlux2DiffusersModels = buildModelsSelector(isFlux2DiffusersMainModelConfig); +export const selectFlux2DevDiffusersModels = buildModelsSelector(isFlux2DevDiffusersMainModelConfig); +export const selectMistralEncoderModels = buildModelsSelector(isMistralEncoderModelConfig); export const selectFluxVAEModels = buildModelsSelector(isFluxVAEModelConfig); export const selectAnimaVAEModels = buildModelsSelector(isAnimaVAEModelConfig); export const selectT5EncoderModels = buildModelsSelector(isT5EncoderModelConfigOrSubmodel); diff --git a/invokeai/frontend/web/src/services/api/schema.ts b/invokeai/frontend/web/src/services/api/schema.ts index 7ca0f26fe9f..1cb1ad27d5c 100644 --- a/invokeai/frontend/web/src/services/api/schema.ts +++ b/invokeai/frontend/web/src/services/api/schema.ts @@ -3563,7 +3563,7 @@ export type components = { */ type: "anima_text_encoder"; }; - AnyModelConfig: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + AnyModelConfig: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; /** * AppVersion * @description App Version Response @@ -10291,6 +10291,285 @@ export type components = { */ type: "flux2_denoise"; }; + /** + * Apply LoRA Collection - FLUX.2 [dev] + * @description Apply a collection of LoRAs to a FLUX.2 [dev] transformer and/or Mistral encoder. + */ + Flux2DevLoRACollectionLoader: { + /** + * 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; + /** + * LoRAs + * @description LoRA models and weights. May be a single LoRA or collection. + * @default null + */ + loras?: components["schemas"]["LoRAField"] | components["schemas"]["LoRAField"][] | null; + /** + * Transformer + * @description Transformer + * @default null + */ + transformer?: components["schemas"]["TransformerField"] | null; + /** + * Mistral Encoder + * @description Mistral tokenizer/processor and text encoder + * @default null + */ + mistral_encoder?: components["schemas"]["MistralEncoderField"] | null; + /** + * type + * @default flux2_dev_lora_collection_loader + * @constant + */ + type: "flux2_dev_lora_collection_loader"; + }; + /** + * Apply LoRA - FLUX.2 [dev] + * @description Apply a LoRA to a FLUX.2 [dev] transformer and/or its Mistral text encoder. + */ + Flux2DevLoRALoaderInvocation: { + /** + * 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; + /** + * LoRA + * @description LoRA model to load + * @default null + */ + lora?: components["schemas"]["ModelIdentifierField"] | null; + /** + * Weight + * @description The weight at which the LoRA is applied to each model + * @default 0.75 + */ + weight?: number; + /** + * Transformer + * @description Transformer + * @default null + */ + transformer?: components["schemas"]["TransformerField"] | null; + /** + * Mistral Encoder + * @description Mistral tokenizer/processor and text encoder + * @default null + */ + mistral_encoder?: components["schemas"]["MistralEncoderField"] | null; + /** + * type + * @default flux2_dev_lora_loader + * @constant + */ + type: "flux2_dev_lora_loader"; + }; + /** + * Flux2DevLoRALoaderOutput + * @description FLUX.2 [dev] LoRA loader output. + */ + Flux2DevLoRALoaderOutput: { + /** + * Transformer + * @description Transformer + * @default null + */ + transformer: components["schemas"]["TransformerField"] | null; + /** + * Mistral Encoder + * @description Mistral tokenizer/processor and text encoder + * @default null + */ + mistral_encoder: components["schemas"]["MistralEncoderField"] | null; + /** + * type + * @default flux2_dev_lora_loader_output + * @constant + */ + type: "flux2_dev_lora_loader_output"; + }; + /** + * Main Model - FLUX.2 [dev] + * @description Load a FLUX.2 [dev] transformer plus its Mistral text encoder and VAE. + * + * FLUX.2 [dev] is a 32B guidance-distilled rectified flow transformer that uses + * Mistral Small 3.1 (24B) as its sole text encoder, sharing the 32-channel + * AutoencoderKLFlux2 VAE with FLUX.2 Klein. + * + * When the transformer is a Diffusers-format checkpoint, both VAE and Mistral + * encoder can be extracted directly from the main model. For single-file + * safetensors or GGUF transformers, you must supply standalone VAE and + * Mistral encoder models, or point at a Diffusers FLUX.2 [dev] checkout for + * sub-model extraction. + */ + Flux2DevModelLoaderInvocation: { + /** + * Id + * @description The id of this instance of an invocation. Must be unique among all instances of invocations. + */ + id: string; + /** + * Is Intermediate + * @description Whether or not this is an intermediate invocation. + * @default false + */ + is_intermediate?: boolean; + /** + * Use Cache + * @description Whether or not to use the cache + * @default true + */ + use_cache?: boolean; + /** + * Transformer + * @description FLUX.2 [dev] model (Transformer) to load + */ + model: components["schemas"]["ModelIdentifierField"]; + /** + * VAE + * @description Standalone FLUX.2 VAE (AutoencoderKLFlux2). If not provided, the VAE is extracted from the Diffusers source model. + * @default null + */ + vae_model?: components["schemas"]["ModelIdentifierField"] | null; + /** + * Mistral Encoder + * @description Standalone Mistral text encoder. Required when the transformer is a single-file safetensors or GGUF without a sibling Diffusers source. + * @default null + */ + mistral_encoder_model?: components["schemas"]["ModelIdentifierField"] | null; + /** + * Mistral Source (Diffusers) + * @description Diffusers FLUX.2 [dev] model to extract VAE and/or Mistral encoder from. Use this if you don't have separate VAE / Mistral encoder models. Ignored if both are provided separately. + * @default null + */ + mistral_source_model?: components["schemas"]["ModelIdentifierField"] | null; + /** + * Max Seq Length + * @description Max sequence length for the Mistral encoder. FLUX.2 [dev] uses 512 by default. + * @default 512 + * @enum {integer} + */ + max_seq_len?: 256 | 512; + /** + * type + * @default flux2_dev_model_loader + * @constant + */ + type: "flux2_dev_model_loader"; + }; + /** + * Flux2DevModelLoaderOutput + * @description FLUX.2 [dev] model loader output. + */ + Flux2DevModelLoaderOutput: { + /** + * Transformer + * @description Transformer + */ + transformer: components["schemas"]["TransformerField"]; + /** + * Mistral Encoder + * @description Mistral tokenizer/processor and text encoder + */ + mistral_encoder: components["schemas"]["MistralEncoderField"]; + /** + * VAE + * @description VAE + */ + vae: components["schemas"]["VAEField"]; + /** + * Max Seq Length + * @description Max sequence length for the Mistral encoder. + * @enum {integer} + */ + max_seq_len: 256 | 512; + /** + * type + * @default flux2_dev_model_loader_output + * @constant + */ + type: "flux2_dev_model_loader_output"; + }; + /** + * Prompt - FLUX.2 [dev] + * @description Encode a prompt for FLUX.2 [dev] using its Mistral Small 3.1 text encoder. + */ + Flux2DevTextEncoderInvocation: { + /** + * 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 to encode. + * @default null + */ + prompt?: string | null; + /** + * Mistral Encoder + * @description Mistral tokenizer/processor and text encoder + * @default null + */ + mistral_encoder?: components["schemas"]["MistralEncoderField"] | null; + /** + * Max Seq Len + * @description Max sequence length for the Mistral encoder. + * @default 512 + * @enum {integer} + */ + max_seq_len?: 256 | 512; + /** + * @description A mask defining the region that this conditioning prompt applies to. + * @default null + */ + mask?: components["schemas"]["TensorField"] | null; + /** + * type + * @default flux2_dev_text_encoder + * @constant + */ + type: "flux2_dev_text_encoder"; + }; /** * Apply LoRA Collection - Flux2 Klein * @description Applies a collection of LoRAs to a FLUX.2 Klein transformer and/or Qwen3 text encoder. @@ -10666,7 +10945,7 @@ export type components = { * @description FLUX.2 model variants. * @enum {string} */ - Flux2VariantType: "klein_4b" | "klein_4b_base" | "klein_9b" | "klein_9b_base"; + Flux2VariantType: "klein_4b" | "klein_4b_base" | "klein_9b" | "klein_9b_base" | "dev"; /** * FluxConditioningCollectionOutput * @description Base class for nodes that output a collection of conditioning tensors @@ -12278,7 +12557,7 @@ export type components = { * @description The nodes in this graph */ nodes?: { - [key: string]: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + [key: string]: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; }; /** * Edges @@ -12315,7 +12594,7 @@ export type components = { * @description The results of node executions */ results: { - [key: string]: components["schemas"]["AnimaConditioningOutput"] | components["schemas"]["AnimaLoRALoaderOutput"] | components["schemas"]["AnimaModelLoaderOutput"] | components["schemas"]["BooleanCollectionOutput"] | components["schemas"]["BooleanOutput"] | components["schemas"]["BoundingBoxCollectionOutput"] | components["schemas"]["BoundingBoxOutput"] | components["schemas"]["CLIPOutput"] | components["schemas"]["CLIPSkipInvocationOutput"] | components["schemas"]["CalculateImageTilesOutput"] | components["schemas"]["CogView4ConditioningOutput"] | components["schemas"]["CogView4ModelLoaderOutput"] | components["schemas"]["CollectInvocationOutput"] | components["schemas"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["Flux2KleinLoRALoaderOutput"] | components["schemas"]["Flux2KleinModelLoaderOutput"] | components["schemas"]["FluxConditioningCollectionOutput"] | components["schemas"]["FluxConditioningOutput"] | components["schemas"]["FluxControlLoRALoaderOutput"] | components["schemas"]["FluxControlNetOutput"] | components["schemas"]["FluxFillOutput"] | components["schemas"]["FluxKontextOutput"] | components["schemas"]["FluxLoRALoaderOutput"] | components["schemas"]["FluxModelLoaderOutput"] | components["schemas"]["FluxReduxOutput"] | components["schemas"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | components["schemas"]["IfInvocationOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["ImageGeneratorOutput"] | components["schemas"]["ImageOutput"] | components["schemas"]["ImagePanelCoordinateOutput"] | components["schemas"]["IntegerCollectionOutput"] | components["schemas"]["IntegerGeneratorOutput"] | components["schemas"]["IntegerOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["LatentsCollectionOutput"] | components["schemas"]["LatentsMetaOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["LoRALoaderOutput"] | components["schemas"]["LoRASelectorOutput"] | components["schemas"]["MDControlListOutput"] | components["schemas"]["MDIPAdapterListOutput"] | components["schemas"]["MDT2IAdapterListOutput"] | components["schemas"]["MaskOutput"] | components["schemas"]["MetadataItemOutput"] | components["schemas"]["MetadataOutput"] | components["schemas"]["MetadataToLorasCollectionOutput"] | components["schemas"]["MetadataToModelOutput"] | components["schemas"]["MetadataToSDXLModelOutput"] | components["schemas"]["ModelIdentifierOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["PBRMapsOutput"] | components["schemas"]["PairTileImageOutput"] | components["schemas"]["PromptTemplateOutput"] | components["schemas"]["QwenImageConditioningOutput"] | components["schemas"]["QwenImageLoRALoaderOutput"] | components["schemas"]["QwenImageModelLoaderOutput"] | components["schemas"]["SD3ConditioningOutput"] | components["schemas"]["SDXLLoRALoaderOutput"] | components["schemas"]["SDXLModelLoaderOutput"] | components["schemas"]["SDXLRefinerModelLoaderOutput"] | components["schemas"]["SchedulerOutput"] | components["schemas"]["Sd3ModelLoaderOutput"] | components["schemas"]["SeamlessModeOutput"] | components["schemas"]["String2Output"] | components["schemas"]["StringCollectionOutput"] | components["schemas"]["StringGeneratorOutput"] | components["schemas"]["StringOutput"] | components["schemas"]["StringPosNegOutput"] | components["schemas"]["T2IAdapterOutput"] | components["schemas"]["TileToPropertiesOutput"] | components["schemas"]["UNetOutput"] | components["schemas"]["VAEOutput"] | components["schemas"]["ZImageConditioningOutput"] | components["schemas"]["ZImageControlOutput"] | components["schemas"]["ZImageLoRALoaderOutput"] | components["schemas"]["ZImageModelLoaderOutput"]; + [key: string]: components["schemas"]["AnimaConditioningOutput"] | components["schemas"]["AnimaLoRALoaderOutput"] | components["schemas"]["AnimaModelLoaderOutput"] | components["schemas"]["BooleanCollectionOutput"] | components["schemas"]["BooleanOutput"] | components["schemas"]["BoundingBoxCollectionOutput"] | components["schemas"]["BoundingBoxOutput"] | components["schemas"]["CLIPOutput"] | components["schemas"]["CLIPSkipInvocationOutput"] | components["schemas"]["CalculateImageTilesOutput"] | components["schemas"]["CogView4ConditioningOutput"] | components["schemas"]["CogView4ModelLoaderOutput"] | components["schemas"]["CollectInvocationOutput"] | components["schemas"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["Flux2DevLoRALoaderOutput"] | components["schemas"]["Flux2DevModelLoaderOutput"] | components["schemas"]["Flux2KleinLoRALoaderOutput"] | components["schemas"]["Flux2KleinModelLoaderOutput"] | components["schemas"]["FluxConditioningCollectionOutput"] | components["schemas"]["FluxConditioningOutput"] | components["schemas"]["FluxControlLoRALoaderOutput"] | components["schemas"]["FluxControlNetOutput"] | components["schemas"]["FluxFillOutput"] | components["schemas"]["FluxKontextOutput"] | components["schemas"]["FluxLoRALoaderOutput"] | components["schemas"]["FluxModelLoaderOutput"] | components["schemas"]["FluxReduxOutput"] | components["schemas"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | components["schemas"]["IfInvocationOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["ImageGeneratorOutput"] | components["schemas"]["ImageOutput"] | components["schemas"]["ImagePanelCoordinateOutput"] | components["schemas"]["IntegerCollectionOutput"] | components["schemas"]["IntegerGeneratorOutput"] | components["schemas"]["IntegerOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["LatentsCollectionOutput"] | components["schemas"]["LatentsMetaOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["LoRALoaderOutput"] | components["schemas"]["LoRASelectorOutput"] | components["schemas"]["MDControlListOutput"] | components["schemas"]["MDIPAdapterListOutput"] | components["schemas"]["MDT2IAdapterListOutput"] | components["schemas"]["MaskOutput"] | components["schemas"]["MetadataItemOutput"] | components["schemas"]["MetadataOutput"] | components["schemas"]["MetadataToLorasCollectionOutput"] | components["schemas"]["MetadataToModelOutput"] | components["schemas"]["MetadataToSDXLModelOutput"] | components["schemas"]["ModelIdentifierOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["PBRMapsOutput"] | components["schemas"]["PairTileImageOutput"] | components["schemas"]["PromptTemplateOutput"] | components["schemas"]["QwenImageConditioningOutput"] | components["schemas"]["QwenImageLoRALoaderOutput"] | components["schemas"]["QwenImageModelLoaderOutput"] | components["schemas"]["SD3ConditioningOutput"] | components["schemas"]["SDXLLoRALoaderOutput"] | components["schemas"]["SDXLModelLoaderOutput"] | components["schemas"]["SDXLRefinerModelLoaderOutput"] | components["schemas"]["SchedulerOutput"] | components["schemas"]["Sd3ModelLoaderOutput"] | components["schemas"]["SeamlessModeOutput"] | components["schemas"]["String2Output"] | components["schemas"]["StringCollectionOutput"] | components["schemas"]["StringGeneratorOutput"] | components["schemas"]["StringOutput"] | components["schemas"]["StringPosNegOutput"] | components["schemas"]["T2IAdapterOutput"] | components["schemas"]["TileToPropertiesOutput"] | components["schemas"]["UNetOutput"] | components["schemas"]["VAEOutput"] | components["schemas"]["ZImageConditioningOutput"] | components["schemas"]["ZImageControlOutput"] | components["schemas"]["ZImageLoRALoaderOutput"] | components["schemas"]["ZImageModelLoaderOutput"]; }; /** * Errors @@ -15676,7 +15955,7 @@ export type components = { * Invocation * @description The ID of the invocation */ - invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -15686,7 +15965,7 @@ export type components = { * Result * @description The result of the invocation */ - result: components["schemas"]["AnimaConditioningOutput"] | components["schemas"]["AnimaLoRALoaderOutput"] | components["schemas"]["AnimaModelLoaderOutput"] | components["schemas"]["BooleanCollectionOutput"] | components["schemas"]["BooleanOutput"] | components["schemas"]["BoundingBoxCollectionOutput"] | components["schemas"]["BoundingBoxOutput"] | components["schemas"]["CLIPOutput"] | components["schemas"]["CLIPSkipInvocationOutput"] | components["schemas"]["CalculateImageTilesOutput"] | components["schemas"]["CogView4ConditioningOutput"] | components["schemas"]["CogView4ModelLoaderOutput"] | components["schemas"]["CollectInvocationOutput"] | components["schemas"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["Flux2KleinLoRALoaderOutput"] | components["schemas"]["Flux2KleinModelLoaderOutput"] | components["schemas"]["FluxConditioningCollectionOutput"] | components["schemas"]["FluxConditioningOutput"] | components["schemas"]["FluxControlLoRALoaderOutput"] | components["schemas"]["FluxControlNetOutput"] | components["schemas"]["FluxFillOutput"] | components["schemas"]["FluxKontextOutput"] | components["schemas"]["FluxLoRALoaderOutput"] | components["schemas"]["FluxModelLoaderOutput"] | components["schemas"]["FluxReduxOutput"] | components["schemas"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | components["schemas"]["IfInvocationOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["ImageGeneratorOutput"] | components["schemas"]["ImageOutput"] | components["schemas"]["ImagePanelCoordinateOutput"] | components["schemas"]["IntegerCollectionOutput"] | components["schemas"]["IntegerGeneratorOutput"] | components["schemas"]["IntegerOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["LatentsCollectionOutput"] | components["schemas"]["LatentsMetaOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["LoRALoaderOutput"] | components["schemas"]["LoRASelectorOutput"] | components["schemas"]["MDControlListOutput"] | components["schemas"]["MDIPAdapterListOutput"] | components["schemas"]["MDT2IAdapterListOutput"] | components["schemas"]["MaskOutput"] | components["schemas"]["MetadataItemOutput"] | components["schemas"]["MetadataOutput"] | components["schemas"]["MetadataToLorasCollectionOutput"] | components["schemas"]["MetadataToModelOutput"] | components["schemas"]["MetadataToSDXLModelOutput"] | components["schemas"]["ModelIdentifierOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["PBRMapsOutput"] | components["schemas"]["PairTileImageOutput"] | components["schemas"]["PromptTemplateOutput"] | components["schemas"]["QwenImageConditioningOutput"] | components["schemas"]["QwenImageLoRALoaderOutput"] | components["schemas"]["QwenImageModelLoaderOutput"] | components["schemas"]["SD3ConditioningOutput"] | components["schemas"]["SDXLLoRALoaderOutput"] | components["schemas"]["SDXLModelLoaderOutput"] | components["schemas"]["SDXLRefinerModelLoaderOutput"] | components["schemas"]["SchedulerOutput"] | components["schemas"]["Sd3ModelLoaderOutput"] | components["schemas"]["SeamlessModeOutput"] | components["schemas"]["String2Output"] | components["schemas"]["StringCollectionOutput"] | components["schemas"]["StringGeneratorOutput"] | components["schemas"]["StringOutput"] | components["schemas"]["StringPosNegOutput"] | components["schemas"]["T2IAdapterOutput"] | components["schemas"]["TileToPropertiesOutput"] | components["schemas"]["UNetOutput"] | components["schemas"]["VAEOutput"] | components["schemas"]["ZImageConditioningOutput"] | components["schemas"]["ZImageControlOutput"] | components["schemas"]["ZImageLoRALoaderOutput"] | components["schemas"]["ZImageModelLoaderOutput"]; + result: components["schemas"]["AnimaConditioningOutput"] | components["schemas"]["AnimaLoRALoaderOutput"] | components["schemas"]["AnimaModelLoaderOutput"] | components["schemas"]["BooleanCollectionOutput"] | components["schemas"]["BooleanOutput"] | components["schemas"]["BoundingBoxCollectionOutput"] | components["schemas"]["BoundingBoxOutput"] | components["schemas"]["CLIPOutput"] | components["schemas"]["CLIPSkipInvocationOutput"] | components["schemas"]["CalculateImageTilesOutput"] | components["schemas"]["CogView4ConditioningOutput"] | components["schemas"]["CogView4ModelLoaderOutput"] | components["schemas"]["CollectInvocationOutput"] | components["schemas"]["ColorCollectionOutput"] | components["schemas"]["ColorOutput"] | components["schemas"]["ConditioningCollectionOutput"] | components["schemas"]["ConditioningOutput"] | components["schemas"]["ControlOutput"] | components["schemas"]["DenoiseMaskOutput"] | components["schemas"]["FaceMaskOutput"] | components["schemas"]["FaceOffOutput"] | components["schemas"]["FloatCollectionOutput"] | components["schemas"]["FloatGeneratorOutput"] | components["schemas"]["FloatOutput"] | components["schemas"]["Flux2DevLoRALoaderOutput"] | components["schemas"]["Flux2DevModelLoaderOutput"] | components["schemas"]["Flux2KleinLoRALoaderOutput"] | components["schemas"]["Flux2KleinModelLoaderOutput"] | components["schemas"]["FluxConditioningCollectionOutput"] | components["schemas"]["FluxConditioningOutput"] | components["schemas"]["FluxControlLoRALoaderOutput"] | components["schemas"]["FluxControlNetOutput"] | components["schemas"]["FluxFillOutput"] | components["schemas"]["FluxKontextOutput"] | components["schemas"]["FluxLoRALoaderOutput"] | components["schemas"]["FluxModelLoaderOutput"] | components["schemas"]["FluxReduxOutput"] | components["schemas"]["GradientMaskOutput"] | components["schemas"]["IPAdapterOutput"] | components["schemas"]["IdealSizeOutput"] | components["schemas"]["IfInvocationOutput"] | components["schemas"]["ImageCollectionOutput"] | components["schemas"]["ImageGeneratorOutput"] | components["schemas"]["ImageOutput"] | components["schemas"]["ImagePanelCoordinateOutput"] | components["schemas"]["IntegerCollectionOutput"] | components["schemas"]["IntegerGeneratorOutput"] | components["schemas"]["IntegerOutput"] | components["schemas"]["IterateInvocationOutput"] | components["schemas"]["LatentsCollectionOutput"] | components["schemas"]["LatentsMetaOutput"] | components["schemas"]["LatentsOutput"] | components["schemas"]["LoRALoaderOutput"] | components["schemas"]["LoRASelectorOutput"] | components["schemas"]["MDControlListOutput"] | components["schemas"]["MDIPAdapterListOutput"] | components["schemas"]["MDT2IAdapterListOutput"] | components["schemas"]["MaskOutput"] | components["schemas"]["MetadataItemOutput"] | components["schemas"]["MetadataOutput"] | components["schemas"]["MetadataToLorasCollectionOutput"] | components["schemas"]["MetadataToModelOutput"] | components["schemas"]["MetadataToSDXLModelOutput"] | components["schemas"]["ModelIdentifierOutput"] | components["schemas"]["ModelLoaderOutput"] | components["schemas"]["NoiseOutput"] | components["schemas"]["PBRMapsOutput"] | components["schemas"]["PairTileImageOutput"] | components["schemas"]["PromptTemplateOutput"] | components["schemas"]["QwenImageConditioningOutput"] | components["schemas"]["QwenImageLoRALoaderOutput"] | components["schemas"]["QwenImageModelLoaderOutput"] | components["schemas"]["SD3ConditioningOutput"] | components["schemas"]["SDXLLoRALoaderOutput"] | components["schemas"]["SDXLModelLoaderOutput"] | components["schemas"]["SDXLRefinerModelLoaderOutput"] | components["schemas"]["SchedulerOutput"] | components["schemas"]["Sd3ModelLoaderOutput"] | components["schemas"]["SeamlessModeOutput"] | components["schemas"]["String2Output"] | components["schemas"]["StringCollectionOutput"] | components["schemas"]["StringGeneratorOutput"] | components["schemas"]["StringOutput"] | components["schemas"]["StringPosNegOutput"] | components["schemas"]["T2IAdapterOutput"] | components["schemas"]["TileToPropertiesOutput"] | components["schemas"]["UNetOutput"] | components["schemas"]["VAEOutput"] | components["schemas"]["ZImageConditioningOutput"] | components["schemas"]["ZImageControlOutput"] | components["schemas"]["ZImageLoRALoaderOutput"] | components["schemas"]["ZImageModelLoaderOutput"]; }; /** * InvocationErrorEvent @@ -15740,7 +16019,7 @@ export type components = { * Invocation * @description The ID of the invocation */ - invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -15827,6 +16106,10 @@ export type components = { float_range: components["schemas"]["FloatCollectionOutput"]; float_to_int: components["schemas"]["IntegerOutput"]; flux2_denoise: components["schemas"]["LatentsOutput"]; + flux2_dev_lora_collection_loader: components["schemas"]["Flux2DevLoRALoaderOutput"]; + flux2_dev_lora_loader: components["schemas"]["Flux2DevLoRALoaderOutput"]; + flux2_dev_model_loader: components["schemas"]["Flux2DevModelLoaderOutput"]; + flux2_dev_text_encoder: components["schemas"]["FluxConditioningOutput"]; flux2_klein_lora_collection_loader: components["schemas"]["Flux2KleinLoRALoaderOutput"]; flux2_klein_lora_loader: components["schemas"]["Flux2KleinLoRALoaderOutput"]; flux2_klein_model_loader: components["schemas"]["Flux2KleinModelLoaderOutput"]; @@ -16070,7 +16353,7 @@ export type components = { * Invocation * @description The ID of the invocation */ - invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -16145,7 +16428,7 @@ export type components = { * Invocation * @description The ID of the invocation */ - invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; + invocation: components["schemas"]["AddInvocation"] | components["schemas"]["AlibabaCloudImageGenerationInvocation"] | components["schemas"]["AlphaMaskToTensorInvocation"] | components["schemas"]["AnimaDenoiseInvocation"] | components["schemas"]["AnimaImageToLatentsInvocation"] | components["schemas"]["AnimaLatentsToImageInvocation"] | components["schemas"]["AnimaLoRACollectionLoader"] | components["schemas"]["AnimaLoRALoaderInvocation"] | components["schemas"]["AnimaModelLoaderInvocation"] | components["schemas"]["AnimaTextEncoderInvocation"] | components["schemas"]["ApplyMaskTensorToImageInvocation"] | components["schemas"]["ApplyMaskToImageInvocation"] | components["schemas"]["BlankImageInvocation"] | components["schemas"]["BlendLatentsInvocation"] | components["schemas"]["BooleanCollectionInvocation"] | components["schemas"]["BooleanInvocation"] | components["schemas"]["BoundingBoxInvocation"] | components["schemas"]["CLIPSkipInvocation"] | components["schemas"]["CV2InfillInvocation"] | components["schemas"]["CalculateImageTilesEvenSplitInvocation"] | components["schemas"]["CalculateImageTilesInvocation"] | components["schemas"]["CalculateImageTilesMinimumOverlapInvocation"] | components["schemas"]["CannyEdgeDetectionInvocation"] | components["schemas"]["CanvasOutputInvocation"] | components["schemas"]["CanvasPasteBackInvocation"] | components["schemas"]["CanvasV2MaskAndCropInvocation"] | components["schemas"]["CenterPadCropInvocation"] | components["schemas"]["CogView4DenoiseInvocation"] | components["schemas"]["CogView4ImageToLatentsInvocation"] | components["schemas"]["CogView4LatentsToImageInvocation"] | components["schemas"]["CogView4ModelLoaderInvocation"] | components["schemas"]["CogView4TextEncoderInvocation"] | components["schemas"]["CollectInvocation"] | components["schemas"]["ColorCorrectInvocation"] | components["schemas"]["ColorInvocation"] | components["schemas"]["ColorMapInvocation"] | components["schemas"]["CompelInvocation"] | components["schemas"]["ConditioningCollectionInvocation"] | components["schemas"]["ConditioningInvocation"] | components["schemas"]["ContentShuffleInvocation"] | components["schemas"]["ControlNetInvocation"] | components["schemas"]["CoreMetadataInvocation"] | components["schemas"]["CreateDenoiseMaskInvocation"] | components["schemas"]["CreateGradientMaskInvocation"] | components["schemas"]["CropImageToBoundingBoxInvocation"] | components["schemas"]["CropLatentsCoreInvocation"] | components["schemas"]["CvInpaintInvocation"] | components["schemas"]["DWOpenposeDetectionInvocation"] | components["schemas"]["DecodeInvisibleWatermarkInvocation"] | components["schemas"]["DenoiseLatentsInvocation"] | components["schemas"]["DenoiseLatentsMetaInvocation"] | components["schemas"]["DepthAnythingDepthEstimationInvocation"] | components["schemas"]["DivideInvocation"] | components["schemas"]["DynamicPromptInvocation"] | components["schemas"]["ESRGANInvocation"] | components["schemas"]["ExpandMaskWithFadeInvocation"] | components["schemas"]["FLUXLoRACollectionLoader"] | components["schemas"]["FaceIdentifierInvocation"] | components["schemas"]["FaceMaskInvocation"] | components["schemas"]["FaceOffInvocation"] | components["schemas"]["FloatBatchInvocation"] | components["schemas"]["FloatCollectionInvocation"] | components["schemas"]["FloatGenerator"] | components["schemas"]["FloatInvocation"] | components["schemas"]["FloatLinearRangeInvocation"] | components["schemas"]["FloatMathInvocation"] | components["schemas"]["FloatToIntegerInvocation"] | components["schemas"]["Flux2DenoiseInvocation"] | components["schemas"]["Flux2DevLoRACollectionLoader"] | components["schemas"]["Flux2DevLoRALoaderInvocation"] | components["schemas"]["Flux2DevModelLoaderInvocation"] | components["schemas"]["Flux2DevTextEncoderInvocation"] | components["schemas"]["Flux2KleinLoRACollectionLoader"] | components["schemas"]["Flux2KleinLoRALoaderInvocation"] | components["schemas"]["Flux2KleinModelLoaderInvocation"] | components["schemas"]["Flux2KleinTextEncoderInvocation"] | components["schemas"]["Flux2VaeDecodeInvocation"] | components["schemas"]["Flux2VaeEncodeInvocation"] | components["schemas"]["FluxControlLoRALoaderInvocation"] | components["schemas"]["FluxControlNetInvocation"] | components["schemas"]["FluxDenoiseInvocation"] | components["schemas"]["FluxDenoiseLatentsMetaInvocation"] | components["schemas"]["FluxFillInvocation"] | components["schemas"]["FluxIPAdapterInvocation"] | components["schemas"]["FluxKontextConcatenateImagesInvocation"] | components["schemas"]["FluxKontextInvocation"] | components["schemas"]["FluxLoRALoaderInvocation"] | components["schemas"]["FluxModelLoaderInvocation"] | components["schemas"]["FluxReduxInvocation"] | components["schemas"]["FluxTextEncoderInvocation"] | components["schemas"]["FluxVaeDecodeInvocation"] | components["schemas"]["FluxVaeEncodeInvocation"] | components["schemas"]["FreeUInvocation"] | components["schemas"]["GeminiImageGenerationInvocation"] | components["schemas"]["GetMaskBoundingBoxInvocation"] | components["schemas"]["GroundingDinoInvocation"] | components["schemas"]["HEDEdgeDetectionInvocation"] | components["schemas"]["HeuristicResizeInvocation"] | components["schemas"]["IPAdapterInvocation"] | components["schemas"]["IdealSizeInvocation"] | components["schemas"]["IfInvocation"] | components["schemas"]["ImageBatchInvocation"] | components["schemas"]["ImageBlurInvocation"] | components["schemas"]["ImageChannelInvocation"] | components["schemas"]["ImageChannelMultiplyInvocation"] | components["schemas"]["ImageChannelOffsetInvocation"] | components["schemas"]["ImageCollectionInvocation"] | components["schemas"]["ImageConvertInvocation"] | components["schemas"]["ImageCropInvocation"] | components["schemas"]["ImageGenerator"] | components["schemas"]["ImageHueAdjustmentInvocation"] | components["schemas"]["ImageInverseLerpInvocation"] | components["schemas"]["ImageInvocation"] | components["schemas"]["ImageLerpInvocation"] | components["schemas"]["ImageMaskToTensorInvocation"] | components["schemas"]["ImageMultiplyInvocation"] | components["schemas"]["ImageNSFWBlurInvocation"] | components["schemas"]["ImageNoiseInvocation"] | components["schemas"]["ImagePanelLayoutInvocation"] | components["schemas"]["ImagePasteInvocation"] | components["schemas"]["ImageResizeInvocation"] | components["schemas"]["ImageScaleInvocation"] | components["schemas"]["ImageToLatentsInvocation"] | components["schemas"]["ImageWatermarkInvocation"] | components["schemas"]["InfillColorInvocation"] | components["schemas"]["InfillPatchMatchInvocation"] | components["schemas"]["InfillTileInvocation"] | components["schemas"]["IntegerBatchInvocation"] | components["schemas"]["IntegerCollectionInvocation"] | components["schemas"]["IntegerGenerator"] | components["schemas"]["IntegerInvocation"] | components["schemas"]["IntegerMathInvocation"] | components["schemas"]["InvertTensorMaskInvocation"] | components["schemas"]["InvokeAdjustImageHuePlusInvocation"] | components["schemas"]["InvokeEquivalentAchromaticLightnessInvocation"] | components["schemas"]["InvokeImageBlendInvocation"] | components["schemas"]["InvokeImageCompositorInvocation"] | components["schemas"]["InvokeImageDilateOrErodeInvocation"] | components["schemas"]["InvokeImageEnhanceInvocation"] | components["schemas"]["InvokeImageValueThresholdsInvocation"] | components["schemas"]["IterateInvocation"] | components["schemas"]["LaMaInfillInvocation"] | components["schemas"]["LatentsCollectionInvocation"] | components["schemas"]["LatentsInvocation"] | components["schemas"]["LatentsToImageInvocation"] | components["schemas"]["LineartAnimeEdgeDetectionInvocation"] | components["schemas"]["LineartEdgeDetectionInvocation"] | components["schemas"]["LlavaOnevisionVllmInvocation"] | components["schemas"]["LoRACollectionLoader"] | components["schemas"]["LoRALoaderInvocation"] | components["schemas"]["LoRASelectorInvocation"] | components["schemas"]["MLSDDetectionInvocation"] | components["schemas"]["MainModelLoaderInvocation"] | components["schemas"]["MaskCombineInvocation"] | components["schemas"]["MaskEdgeInvocation"] | components["schemas"]["MaskFromAlphaInvocation"] | components["schemas"]["MaskFromIDInvocation"] | components["schemas"]["MaskTensorToImageInvocation"] | components["schemas"]["MediaPipeFaceDetectionInvocation"] | components["schemas"]["MergeMetadataInvocation"] | components["schemas"]["MergeTilesToImageInvocation"] | components["schemas"]["MetadataFieldExtractorInvocation"] | components["schemas"]["MetadataFromImageInvocation"] | components["schemas"]["MetadataInvocation"] | components["schemas"]["MetadataItemInvocation"] | components["schemas"]["MetadataItemLinkedInvocation"] | components["schemas"]["MetadataToBoolCollectionInvocation"] | components["schemas"]["MetadataToBoolInvocation"] | components["schemas"]["MetadataToControlnetsInvocation"] | components["schemas"]["MetadataToFloatCollectionInvocation"] | components["schemas"]["MetadataToFloatInvocation"] | components["schemas"]["MetadataToIPAdaptersInvocation"] | components["schemas"]["MetadataToIntegerCollectionInvocation"] | components["schemas"]["MetadataToIntegerInvocation"] | components["schemas"]["MetadataToLorasCollectionInvocation"] | components["schemas"]["MetadataToLorasInvocation"] | components["schemas"]["MetadataToModelInvocation"] | components["schemas"]["MetadataToSDXLLorasInvocation"] | components["schemas"]["MetadataToSDXLModelInvocation"] | components["schemas"]["MetadataToSchedulerInvocation"] | components["schemas"]["MetadataToStringCollectionInvocation"] | components["schemas"]["MetadataToStringInvocation"] | components["schemas"]["MetadataToT2IAdaptersInvocation"] | components["schemas"]["MetadataToVAEInvocation"] | components["schemas"]["ModelIdentifierInvocation"] | components["schemas"]["MultiplyInvocation"] | components["schemas"]["NoiseInvocation"] | components["schemas"]["NormalMapInvocation"] | components["schemas"]["OklabUnsharpMaskInvocation"] | components["schemas"]["OklchImageHueAdjustmentInvocation"] | components["schemas"]["OpenAIImageGenerationInvocation"] | components["schemas"]["PBRMapsInvocation"] | components["schemas"]["PairTileImageInvocation"] | components["schemas"]["PasteImageIntoBoundingBoxInvocation"] | components["schemas"]["PiDiNetEdgeDetectionInvocation"] | components["schemas"]["PromptTemplateInvocation"] | components["schemas"]["PromptsFromFileInvocation"] | components["schemas"]["QwenImageDenoiseInvocation"] | components["schemas"]["QwenImageImageToLatentsInvocation"] | components["schemas"]["QwenImageLatentsToImageInvocation"] | components["schemas"]["QwenImageLoRACollectionLoader"] | components["schemas"]["QwenImageLoRALoaderInvocation"] | components["schemas"]["QwenImageModelLoaderInvocation"] | components["schemas"]["QwenImageTextEncoderInvocation"] | components["schemas"]["RandomFloatInvocation"] | components["schemas"]["RandomIntInvocation"] | components["schemas"]["RandomRangeInvocation"] | components["schemas"]["RangeInvocation"] | components["schemas"]["RangeOfSizeInvocation"] | components["schemas"]["RectangleMaskInvocation"] | components["schemas"]["ResizeLatentsInvocation"] | components["schemas"]["RoundInvocation"] | components["schemas"]["SD3DenoiseInvocation"] | components["schemas"]["SD3ImageToLatentsInvocation"] | components["schemas"]["SD3LatentsToImageInvocation"] | components["schemas"]["SDXLCompelPromptInvocation"] | components["schemas"]["SDXLLoRACollectionLoader"] | components["schemas"]["SDXLLoRALoaderInvocation"] | components["schemas"]["SDXLModelLoaderInvocation"] | components["schemas"]["SDXLRefinerCompelPromptInvocation"] | components["schemas"]["SDXLRefinerModelLoaderInvocation"] | components["schemas"]["SaveImageInvocation"] | components["schemas"]["ScaleLatentsInvocation"] | components["schemas"]["SchedulerInvocation"] | components["schemas"]["Sd3ModelLoaderInvocation"] | components["schemas"]["Sd3TextEncoderInvocation"] | components["schemas"]["SeamlessModeInvocation"] | components["schemas"]["SeedreamImageGenerationInvocation"] | components["schemas"]["SegmentAnythingInvocation"] | components["schemas"]["ShowImageInvocation"] | components["schemas"]["SpandrelImageToImageAutoscaleInvocation"] | components["schemas"]["SpandrelImageToImageInvocation"] | components["schemas"]["StringBatchInvocation"] | components["schemas"]["StringCollectionInvocation"] | components["schemas"]["StringGenerator"] | components["schemas"]["StringInvocation"] | components["schemas"]["StringJoinInvocation"] | components["schemas"]["StringJoinThreeInvocation"] | components["schemas"]["StringReplaceInvocation"] | components["schemas"]["StringSplitInvocation"] | components["schemas"]["StringSplitNegInvocation"] | components["schemas"]["SubtractInvocation"] | components["schemas"]["T2IAdapterInvocation"] | components["schemas"]["TextLLMInvocation"] | components["schemas"]["TileToPropertiesInvocation"] | components["schemas"]["TiledMultiDiffusionDenoiseLatents"] | components["schemas"]["UnsharpMaskInvocation"] | components["schemas"]["VAELoaderInvocation"] | components["schemas"]["ZImageControlInvocation"] | components["schemas"]["ZImageDenoiseInvocation"] | components["schemas"]["ZImageDenoiseMetaInvocation"] | components["schemas"]["ZImageImageToLatentsInvocation"] | components["schemas"]["ZImageLatentsToImageInvocation"] | components["schemas"]["ZImageLoRACollectionLoader"] | components["schemas"]["ZImageLoRALoaderInvocation"] | components["schemas"]["ZImageModelLoaderInvocation"] | components["schemas"]["ZImageSeedVarianceEnhancerInvocation"] | components["schemas"]["ZImageTextEncoderInvocation"]; /** * Invocation Source Id * @description The ID of the prepared invocation's source node @@ -16314,14 +16597,14 @@ export type components = { * Convert Cache Dir * Format: path * @description Path to the converted models cache directory (DEPRECATED, but do not delete because it is needed for migration from previous versions). - * @default models/.convert_cache + * @default models\.convert_cache */ convert_cache_dir?: string; /** * Download Cache Dir * Format: path * @description Path to the directory that contains dynamically downloaded models. - * @default models/.download_cache + * @default models\.download_cache */ download_cache_dir?: string; /** @@ -20527,7 +20810,7 @@ export type components = { }; /** * Main_Diffusers_Flux2_Config - * @description Model config for FLUX.2 models in diffusers format (e.g. FLUX.2 Klein). + * @description Model config for FLUX.2 models in diffusers format (FLUX.2 Klein and FLUX.2 [dev]). */ Main_Diffusers_Flux2_Config: { /** @@ -23250,12 +23533,303 @@ export type components = { */ type: "metadata_to_vae"; }; + /** + * MistralEncoderField + * @description Field for the Mistral text encoder used by FLUX.2 [dev]. + * + * The "tokenizer" submodel actually points to the multimodal processor (AutoProcessor / + * Mistral3Processor), which wraps the tokenizer plus the chat template needed by FLUX.2. + */ + MistralEncoderField: { + /** @description Info to load tokenizer / processor submodel */ + tokenizer: components["schemas"]["ModelIdentifierField"]; + /** @description Info to load text_encoder submodel */ + text_encoder: components["schemas"]["ModelIdentifierField"]; + /** + * Loras + * @description LoRAs to apply on model loading + */ + loras?: components["schemas"]["LoRAField"][]; + }; + /** + * MistralEncoder_Checkpoint_Config + * @description Configuration for a single-file Mistral text encoder (safetensors). + */ + MistralEncoder_Checkpoint_Config: { + /** + * Key + * @description A unique key for this model. + */ + key: string; + /** + * Hash + * @description The hash of the model file(s). + */ + hash: string; + /** + * Path + * @description Path to the model on the filesystem. Relative paths are relative to the Invoke root directory. + */ + path: string; + /** + * File Size + * @description The size of the model in bytes. + */ + file_size: number; + /** + * Name + * @description Name of the model. + */ + name: string; + /** + * Description + * @description Model description + */ + description: string | null; + /** + * Source + * @description The original source of the model (path, URL or repo_id). + */ + source: string; + /** @description The type of source */ + source_type: components["schemas"]["ModelSourceType"]; + /** + * Source Api Response + * @description The original API response from the source, as stringified JSON. + */ + source_api_response: string | null; + /** + * Source Url + * @description Optional URL for the model (e.g. download page or model page). + */ + source_url: string | null; + /** + * Cover Image + * @description Url for image to preview model + */ + cover_image: string | null; + /** + * Config Path + * @description Path to the config for this model, if any. + */ + config_path: string | null; + /** + * Base + * @default any + * @constant + */ + base: "any"; + /** + * Type + * @default mistral_encoder + * @constant + */ + type: "mistral_encoder"; + /** + * Format + * @default checkpoint + * @constant + */ + format: "checkpoint"; + /** + * Cpu Only + * @description Whether this model should run on CPU only + */ + cpu_only: boolean | null; + /** @description Mistral text encoder variant */ + variant: components["schemas"]["MistralVariantType"]; + }; + /** + * MistralEncoder_Diffusers_Config + * @description Configuration for a Mistral text encoder in HuggingFace transformers/diffusers folder layout. + * + * Matches: + * - Full pipelines downloaded as just the `text_encoder/` subfolder + * (e.g. `black-forest-labs/FLUX.2-dev/text_encoder/`) + * - Quantized variants such as `diffusers/FLUX.2-dev-bnb-4bit/text_encoder/` + * + * Does NOT match a full FLUX.2 pipeline directory — those are picked up by the + * `Main_Diffusers_Flux2_Config` instead. + */ + MistralEncoder_Diffusers_Config: { + /** + * Key + * @description A unique key for this model. + */ + key: string; + /** + * Hash + * @description The hash of the model file(s). + */ + hash: string; + /** + * Path + * @description Path to the model on the filesystem. Relative paths are relative to the Invoke root directory. + */ + path: string; + /** + * File Size + * @description The size of the model in bytes. + */ + file_size: number; + /** + * Name + * @description Name of the model. + */ + name: string; + /** + * Description + * @description Model description + */ + description: string | null; + /** + * Source + * @description The original source of the model (path, URL or repo_id). + */ + source: string; + /** @description The type of source */ + source_type: components["schemas"]["ModelSourceType"]; + /** + * Source Api Response + * @description The original API response from the source, as stringified JSON. + */ + source_api_response: string | null; + /** + * Source Url + * @description Optional URL for the model (e.g. download page or model page). + */ + source_url: string | null; + /** + * Cover Image + * @description Url for image to preview model + */ + cover_image: string | null; + /** + * Base + * @default any + * @constant + */ + base: "any"; + /** + * Type + * @default mistral_encoder + * @constant + */ + type: "mistral_encoder"; + /** + * Format + * @default mistral_encoder + * @constant + */ + format: "mistral_encoder"; + /** + * Cpu Only + * @description Whether this model should run on CPU only + */ + cpu_only: boolean | null; + /** @description Mistral text encoder variant */ + variant: components["schemas"]["MistralVariantType"]; + }; + /** + * MistralEncoder_GGUF_Config + * @description Configuration for a GGUF-quantized Mistral text encoder. + */ + MistralEncoder_GGUF_Config: { + /** + * Key + * @description A unique key for this model. + */ + key: string; + /** + * Hash + * @description The hash of the model file(s). + */ + hash: string; + /** + * Path + * @description Path to the model on the filesystem. Relative paths are relative to the Invoke root directory. + */ + path: string; + /** + * File Size + * @description The size of the model in bytes. + */ + file_size: number; + /** + * Name + * @description Name of the model. + */ + name: string; + /** + * Description + * @description Model description + */ + description: string | null; + /** + * Source + * @description The original source of the model (path, URL or repo_id). + */ + source: string; + /** @description The type of source */ + source_type: components["schemas"]["ModelSourceType"]; + /** + * Source Api Response + * @description The original API response from the source, as stringified JSON. + */ + source_api_response: string | null; + /** + * Source Url + * @description Optional URL for the model (e.g. download page or model page). + */ + source_url: string | null; + /** + * Cover Image + * @description Url for image to preview model + */ + cover_image: string | null; + /** + * Config Path + * @description Path to the config for this model, if any. + */ + config_path: string | null; + /** + * Base + * @default any + * @constant + */ + base: "any"; + /** + * Type + * @default mistral_encoder + * @constant + */ + type: "mistral_encoder"; + /** + * Format + * @default gguf_quantized + * @constant + */ + format: "gguf_quantized"; + /** + * Cpu Only + * @description Whether this model should run on CPU only + */ + cpu_only: boolean | null; + /** @description Mistral text encoder variant */ + variant: components["schemas"]["MistralVariantType"]; + }; + /** + * MistralVariantType + * @description Mistral text encoder variants used by FLUX.2 [dev]. + * @enum {string} + */ + MistralVariantType: "mistral_small_3_1"; /** * ModelFormat * @description Storage format of model. * @enum {string} */ - ModelFormat: "omi" | "diffusers" | "checkpoint" | "lycoris" | "onnx" | "olive" | "embedding_file" | "embedding_folder" | "invokeai" | "t5_encoder" | "qwen3_encoder" | "qwen_vl_encoder" | "bnb_quantized_int8b" | "bnb_quantized_nf4b" | "gguf_quantized" | "external_api" | "unknown"; + ModelFormat: "omi" | "diffusers" | "checkpoint" | "lycoris" | "onnx" | "olive" | "embedding_file" | "embedding_folder" | "invokeai" | "t5_encoder" | "qwen3_encoder" | "qwen_vl_encoder" | "mistral_encoder" | "bnb_quantized_int8b" | "bnb_quantized_nf4b" | "gguf_quantized" | "external_api" | "unknown"; /** ModelIdentifierField */ ModelIdentifierField: { /** @@ -23392,7 +23966,7 @@ export type components = { * Config * @description The installed model's config */ - config: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + config: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; /** * ModelInstallDownloadProgressEvent @@ -23558,7 +24132,7 @@ export type components = { * Config Out * @description After successful installation, this will hold the configuration object. */ - config_out?: (components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]) | null; + config_out?: (components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]) | null; /** * Inplace * @description Leave model in its current location; otherwise install under models directory @@ -23644,7 +24218,7 @@ export type components = { * Config * @description The model's config */ - config: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + config: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; /** * @description The submodel type, if any * @default null @@ -23665,7 +24239,7 @@ export type components = { * Config * @description The model's config */ - config: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + config: components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; /** * @description The submodel type, if any * @default null @@ -23791,7 +24365,7 @@ export type components = { * Variant * @description The variant of the model. */ - variant?: components["schemas"]["ModelVariantType"] | components["schemas"]["ClipVariantType"] | components["schemas"]["FluxVariantType"] | components["schemas"]["Flux2VariantType"] | components["schemas"]["ZImageVariantType"] | components["schemas"]["QwenImageVariantType"] | components["schemas"]["Qwen3VariantType"] | null; + variant?: components["schemas"]["ModelVariantType"] | components["schemas"]["ClipVariantType"] | components["schemas"]["FluxVariantType"] | components["schemas"]["Flux2VariantType"] | components["schemas"]["ZImageVariantType"] | components["schemas"]["QwenImageVariantType"] | components["schemas"]["Qwen3VariantType"] | components["schemas"]["MistralVariantType"] | null; /** @description The prediction type of the model. */ prediction_type?: components["schemas"]["SchedulerPredictionType"] | null; /** @@ -23849,7 +24423,7 @@ export type components = { * @description Model type. * @enum {string} */ - ModelType: "onnx" | "main" | "vae" | "lora" | "control_lora" | "controlnet" | "embedding" | "ip_adapter" | "clip_vision" | "clip_embed" | "t2i_adapter" | "t5_encoder" | "qwen3_encoder" | "qwen_vl_encoder" | "spandrel_image_to_image" | "siglip" | "flux_redux" | "llava_onevision" | "text_llm" | "external_image_generator" | "unknown"; + ModelType: "onnx" | "main" | "vae" | "lora" | "control_lora" | "controlnet" | "embedding" | "ip_adapter" | "clip_vision" | "clip_embed" | "t2i_adapter" | "t5_encoder" | "qwen3_encoder" | "qwen_vl_encoder" | "mistral_encoder" | "spandrel_image_to_image" | "siglip" | "flux_redux" | "llava_onevision" | "text_llm" | "external_image_generator" | "unknown"; /** * ModelVariantType * @description Variant type. @@ -23862,7 +24436,7 @@ export type components = { */ ModelsList: { /** Models */ - models: (components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"])[]; + models: (components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"])[]; }; /** * Multiply Integers @@ -28526,7 +29100,7 @@ export type components = { type: components["schemas"]["ModelType"]; format?: components["schemas"]["ModelFormat"] | null; /** Variant */ - variant?: components["schemas"]["ModelVariantType"] | components["schemas"]["ClipVariantType"] | components["schemas"]["FluxVariantType"] | components["schemas"]["Flux2VariantType"] | components["schemas"]["ZImageVariantType"] | components["schemas"]["QwenImageVariantType"] | components["schemas"]["Qwen3VariantType"] | null; + variant?: components["schemas"]["ModelVariantType"] | components["schemas"]["ClipVariantType"] | components["schemas"]["FluxVariantType"] | components["schemas"]["Flux2VariantType"] | components["schemas"]["ZImageVariantType"] | components["schemas"]["QwenImageVariantType"] | components["schemas"]["Qwen3VariantType"] | components["schemas"]["MistralVariantType"] | null; /** * Is Installed * @default false @@ -28571,7 +29145,7 @@ export type components = { type: components["schemas"]["ModelType"]; format?: components["schemas"]["ModelFormat"] | null; /** Variant */ - variant?: components["schemas"]["ModelVariantType"] | components["schemas"]["ClipVariantType"] | components["schemas"]["FluxVariantType"] | components["schemas"]["Flux2VariantType"] | components["schemas"]["ZImageVariantType"] | components["schemas"]["QwenImageVariantType"] | components["schemas"]["Qwen3VariantType"] | null; + variant?: components["schemas"]["ModelVariantType"] | components["schemas"]["ClipVariantType"] | components["schemas"]["FluxVariantType"] | components["schemas"]["Flux2VariantType"] | components["schemas"]["ZImageVariantType"] | components["schemas"]["QwenImageVariantType"] | components["schemas"]["Qwen3VariantType"] | components["schemas"]["MistralVariantType"] | null; /** * Is Installed * @default false @@ -29102,7 +29676,7 @@ export type components = { path_or_prefix: string; model_type: components["schemas"]["ModelType"]; /** Variant */ - variant?: components["schemas"]["ModelVariantType"] | components["schemas"]["ClipVariantType"] | components["schemas"]["FluxVariantType"] | components["schemas"]["Flux2VariantType"] | components["schemas"]["ZImageVariantType"] | components["schemas"]["QwenImageVariantType"] | components["schemas"]["Qwen3VariantType"] | null; + variant?: components["schemas"]["ModelVariantType"] | components["schemas"]["ClipVariantType"] | components["schemas"]["FluxVariantType"] | components["schemas"]["Flux2VariantType"] | components["schemas"]["ZImageVariantType"] | components["schemas"]["QwenImageVariantType"] | components["schemas"]["Qwen3VariantType"] | components["schemas"]["MistralVariantType"] | null; }; /** * Subtract Integers @@ -33408,7 +33982,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; }; /** @description Validation Error */ @@ -33440,7 +34014,7 @@ export interface operations { [name: string]: unknown; }; content: { - "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; }; /** @description Validation Error */ @@ -33490,7 +34064,7 @@ export interface operations { * "repo_variant": "fp16", * "upcast_attention": false * } */ - "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; }; /** @description Bad request */ @@ -33595,7 +34169,7 @@ export interface operations { * "repo_variant": "fp16", * "upcast_attention": false * } */ - "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; }; /** @description Bad request */ @@ -33666,7 +34240,7 @@ export interface operations { * "repo_variant": "fp16", * "upcast_attention": false * } */ - "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; }; /** @description Bad request */ @@ -34399,7 +34973,7 @@ export interface operations { * "repo_variant": "fp16", * "upcast_attention": false * } */ - "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; + "application/json": components["schemas"]["Main_Diffusers_SD1_Config"] | components["schemas"]["Main_Diffusers_SD2_Config"] | components["schemas"]["Main_Diffusers_SDXL_Config"] | components["schemas"]["Main_Diffusers_SDXLRefiner_Config"] | components["schemas"]["Main_Diffusers_SD3_Config"] | components["schemas"]["Main_Diffusers_FLUX_Config"] | components["schemas"]["Main_Diffusers_Flux2_Config"] | components["schemas"]["Main_Diffusers_CogView4_Config"] | components["schemas"]["Main_Diffusers_QwenImage_Config"] | components["schemas"]["Main_Diffusers_ZImage_Config"] | components["schemas"]["Main_Checkpoint_SD1_Config"] | components["schemas"]["Main_Checkpoint_SD2_Config"] | components["schemas"]["Main_Checkpoint_SDXL_Config"] | components["schemas"]["Main_Checkpoint_SDXLRefiner_Config"] | components["schemas"]["Main_Checkpoint_Flux2_Config"] | components["schemas"]["Main_Checkpoint_FLUX_Config"] | components["schemas"]["Main_Checkpoint_ZImage_Config"] | components["schemas"]["Main_Checkpoint_Anima_Config"] | components["schemas"]["Main_BnBNF4_FLUX_Config"] | components["schemas"]["Main_GGUF_Flux2_Config"] | components["schemas"]["Main_GGUF_FLUX_Config"] | components["schemas"]["Main_GGUF_QwenImage_Config"] | components["schemas"]["Main_GGUF_ZImage_Config"] | components["schemas"]["VAE_Checkpoint_SD1_Config"] | components["schemas"]["VAE_Checkpoint_SD2_Config"] | components["schemas"]["VAE_Checkpoint_SDXL_Config"] | components["schemas"]["VAE_Checkpoint_FLUX_Config"] | components["schemas"]["VAE_Checkpoint_Flux2_Config"] | components["schemas"]["VAE_Checkpoint_QwenImage_Config"] | components["schemas"]["VAE_Checkpoint_Anima_Config"] | components["schemas"]["VAE_Diffusers_SD1_Config"] | components["schemas"]["VAE_Diffusers_SDXL_Config"] | components["schemas"]["VAE_Diffusers_Flux2_Config"] | components["schemas"]["ControlNet_Checkpoint_SD1_Config"] | components["schemas"]["ControlNet_Checkpoint_SD2_Config"] | components["schemas"]["ControlNet_Checkpoint_SDXL_Config"] | components["schemas"]["ControlNet_Checkpoint_FLUX_Config"] | components["schemas"]["ControlNet_Checkpoint_ZImage_Config"] | components["schemas"]["ControlNet_Diffusers_SD1_Config"] | components["schemas"]["ControlNet_Diffusers_SD2_Config"] | components["schemas"]["ControlNet_Diffusers_SDXL_Config"] | components["schemas"]["ControlNet_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_SD1_Config"] | components["schemas"]["LoRA_LyCORIS_SD2_Config"] | components["schemas"]["LoRA_LyCORIS_SDXL_Config"] | components["schemas"]["LoRA_LyCORIS_Flux2_Config"] | components["schemas"]["LoRA_LyCORIS_FLUX_Config"] | components["schemas"]["LoRA_LyCORIS_ZImage_Config"] | components["schemas"]["LoRA_LyCORIS_QwenImage_Config"] | components["schemas"]["LoRA_LyCORIS_Anima_Config"] | components["schemas"]["LoRA_OMI_SDXL_Config"] | components["schemas"]["LoRA_OMI_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_SD1_Config"] | components["schemas"]["LoRA_Diffusers_SD2_Config"] | components["schemas"]["LoRA_Diffusers_SDXL_Config"] | components["schemas"]["LoRA_Diffusers_Flux2_Config"] | components["schemas"]["LoRA_Diffusers_FLUX_Config"] | components["schemas"]["LoRA_Diffusers_ZImage_Config"] | components["schemas"]["ControlLoRA_LyCORIS_FLUX_Config"] | components["schemas"]["T5Encoder_T5Encoder_Config"] | components["schemas"]["T5Encoder_BnBLLMint8_Config"] | components["schemas"]["Qwen3Encoder_Qwen3Encoder_Config"] | components["schemas"]["Qwen3Encoder_Checkpoint_Config"] | components["schemas"]["Qwen3Encoder_GGUF_Config"] | components["schemas"]["MistralEncoder_Diffusers_Config"] | components["schemas"]["MistralEncoder_Checkpoint_Config"] | components["schemas"]["MistralEncoder_GGUF_Config"] | components["schemas"]["QwenVLEncoder_Diffusers_Config"] | components["schemas"]["QwenVLEncoder_Checkpoint_Config"] | components["schemas"]["TI_File_SD1_Config"] | components["schemas"]["TI_File_SD2_Config"] | components["schemas"]["TI_File_SDXL_Config"] | components["schemas"]["TI_Folder_SD1_Config"] | components["schemas"]["TI_Folder_SD2_Config"] | components["schemas"]["TI_Folder_SDXL_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD1_Config"] | components["schemas"]["IPAdapter_InvokeAI_SD2_Config"] | components["schemas"]["IPAdapter_InvokeAI_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD1_Config"] | components["schemas"]["IPAdapter_Checkpoint_SD2_Config"] | components["schemas"]["IPAdapter_Checkpoint_SDXL_Config"] | components["schemas"]["IPAdapter_Checkpoint_FLUX_Config"] | components["schemas"]["T2IAdapter_Diffusers_SD1_Config"] | components["schemas"]["T2IAdapter_Diffusers_SDXL_Config"] | components["schemas"]["Spandrel_Checkpoint_Config"] | components["schemas"]["CLIPEmbed_Diffusers_G_Config"] | components["schemas"]["CLIPEmbed_Diffusers_L_Config"] | components["schemas"]["CLIPVision_Diffusers_Config"] | components["schemas"]["SigLIP_Diffusers_Config"] | components["schemas"]["FLUXRedux_Checkpoint_Config"] | components["schemas"]["LlavaOnevision_Diffusers_Config"] | components["schemas"]["TextLLM_Diffusers_Config"] | components["schemas"]["ExternalApiModelConfig"] | components["schemas"]["Unknown_Config"]; }; }; /** @description Bad request */ diff --git a/invokeai/frontend/web/src/services/api/types.ts b/invokeai/frontend/web/src/services/api/types.ts index 27c6fcbf3c3..08a2c8b2208 100644 --- a/invokeai/frontend/web/src/services/api/types.ts +++ b/invokeai/frontend/web/src/services/api/types.ts @@ -116,6 +116,7 @@ export type T5EncoderBnbQuantizedLlmInt8bModelConfig = Extract< { type: 't5_encoder'; format: 'bnb_quantized_int8b' } >; export type Qwen3EncoderModelConfig = Extract; +export type MistralEncoderModelConfig = Extract; export type QwenVLEncoderModelConfig = Extract; export type SpandrelImageToImageModelConfig = Extract; export type CheckpointModelConfig = Extract; @@ -375,6 +376,10 @@ export const isAnimaQwen3EncoderModelConfig = (config: AnyModelConfig): config i return config.type === 'qwen3_encoder' && config.variant === 'qwen3_06b'; }; +export const isMistralEncoderModelConfig = (config: AnyModelConfig): config is MistralEncoderModelConfig => { + return config.type === 'mistral_encoder'; +}; + export const isQwenVLEncoderModelConfig = (config: AnyModelConfig): config is QwenVLEncoderModelConfig => { return config.type === 'qwen_vl_encoder'; }; @@ -466,8 +471,16 @@ const isFlux2Klein9BMainModelConfig = (config: AnyModelConfig): config is MainMo return config.type === 'main' && config.base === 'flux2' && config.name.toLowerCase().includes('9b'); }; +export const isFlux2DevMainModelConfig = (config: AnyModelConfig): config is MainModelConfig => { + return config.type === 'main' && config.base === 'flux2' && config.variant === 'dev'; +}; + +export const isFlux2DevDiffusersMainModelConfig = (config: AnyModelConfig): config is MainModelConfig => { + return isFlux2DevMainModelConfig(config) && config.format === 'diffusers'; +}; + export const isNonCommercialMainModelConfig = (config: AnyModelConfig): config is MainModelConfig => { - return isFluxDevMainModelConfig(config) || isFlux2Klein9BMainModelConfig(config); + return isFluxDevMainModelConfig(config) || isFlux2Klein9BMainModelConfig(config) || isFlux2DevMainModelConfig(config); }; export const isFluxFillMainModelModelConfig = (config: AnyModelConfig): config is MainModelConfig => { From 0e7373d46c8a21d8e2f11ca8d993ad51a0246466 Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Mon, 25 May 2026 22:07:51 +0200 Subject: [PATCH 02/25] fix(flux2): wire dev path end-to-end, harden Mistral encoder loader MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow-up fixes after first end-to-end run with FLUX.2 [dev] GGUF + Mistral 3.x GGUF + standalone FLUX.2 VAE. Frontend - buildFLUXGraph: wire dev model loader's vae into both flux2_denoise (required for BN statistics / inpaint) and flux2_vae_decode; missing edge was raising RequiredConnectionException at runtime - readiness.ts: variant-aware FLUX.2 readiness check — dev requires flux2DevVaeModel + flux2DevMistralEncoderModel (or a Dev diffusers source); Klein keeps Qwen3/VAE check. Threads hasFlux2DevDiffusersSource through generate + canvas tabs and updates buildGenerateTabArg / buildCanvasTabArg test helpers - en.json: noFlux2DevVaeModelSelected, noFlux2DevMistralEncoderModelSelected Mistral encoder loader (GGUF / single-file) - Fix "Cannot copy out of meta tensor": llama.cpp conversion produced `model.*` keys but loader instantiated bare MistralModel (no `model.` prefix). Add _convert_for_bare_mistral_model to strip the prefix and drop lm_head before load_state_dict - _materialize_remaining_meta_tensors: after load_state_dict, replace any still-meta parameters (norms→ones, others→zeros) and buffers so the cache→VRAM move can't fail on partial state dicts, with a warning listing what was missing - llama.cpp converter: map attn_q_norm/attn_k_norm (Mistral 3.x qk-norm variants), with ordering before attn_q/attn_k to avoid bad rewrites Tokenizer / processor fallback - _load_processor_with_offline_fallback walks a list of sources (black-forest-labs/FLUX.2-dev tokenizer subfolder, then mistralai/Mistral-Small-3.1-… and 3.2-…), trying AutoProcessor then AutoTokenizer for each, cache-first then online. Final error spells out the three workarounds (install Diffusers folder, set HF_ENDPOINT, pre-cache the tokenizer) - flux2_dev_text_encoder: try multimodal `[{type, text}]` chat template first (PixtralProcessor / Mistral3Processor), fall back to plain string content (AutoTokenizer), then to manual [INST]…[/INST] Qwen3 encoder probe strictness - _get_qwen3_variant_from_state_dict and _get_variant_from_config now return None / raise NotAMatchError for unknown hidden_size instead of silently defaulting to qwen3_4b. The old fallback meant any llama.cpp GGUF causal LM (Mistral, Llama, …) was wrongly classified as Qwen3 — visible when the Mistral 3.x GGUF was identified as a Qwen3-4B encoder - Checkpoint / GGUF / Diffusers loaders propagate the strictness --- .../app/invocations/flux2_dev_text_encoder.py | 49 +++--- .../model_manager/configs/qwen3_encoder.py | 51 +++--- .../load/model_loaders/mistral_encoder.py | 152 +++++++++++++++--- invokeai/frontend/web/public/locales/en.json | 2 + .../controlLayers/store/paramsSlice.ts | 4 +- .../util/graph/generation/buildFLUXGraph.ts | 1 + .../features/queue/store/readiness.test.ts | 4 + .../web/src/features/queue/store/readiness.ts | 60 +++++-- 8 files changed, 246 insertions(+), 77 deletions(-) diff --git a/invokeai/app/invocations/flux2_dev_text_encoder.py b/invokeai/app/invocations/flux2_dev_text_encoder.py index 046601545d6..2a8af851b96 100644 --- a/invokeai/app/invocations/flux2_dev_text_encoder.py +++ b/invokeai/app/invocations/flux2_dev_text_encoder.py @@ -139,18 +139,21 @@ def _encode_prompt(self, context: InvocationContext, exit_stack: ExitStack) -> t "The Mistral encoder model may be corrupted or incompatible." ) - # Build the chat-template messages. The processor may be either a full - # AutoProcessor (for Mistral3ForConditionalGeneration) or a bare tokenizer - # (for text-only single-file/GGUF loaders); both expose `apply_chat_template`. - messages = [ - { - "role": "system", - "content": [{"type": "text", "text": FLUX2_DEV_SYSTEM_MESSAGE}], - }, - { - "role": "user", - "content": [{"type": "text", "text": self.prompt}], - }, + # Two valid chat-template content shapes depending on the loaded artifact: + # - Multimodal Mistral3 processors (PixtralProcessor / Mistral3Processor) want + # `[{type: "text", text: ...}]` even for text-only prompts and crash on a + # plain string with `string indices must be integers`. + # - Plain AutoTokenizer / MistralTokenizer want simple string content and + # may fail on the dict-list form depending on the template. + # We try multimodal first (matches BFL's canonical FLUX.2-dev processor), + # then fall back to string content, then to manual [INST]...[/INST] format. + multimodal_messages = [ + {"role": "system", "content": [{"type": "text", "text": FLUX2_DEV_SYSTEM_MESSAGE}]}, + {"role": "user", "content": [{"type": "text", "text": self.prompt}]}, + ] + plain_messages = [ + {"role": "system", "content": FLUX2_DEV_SYSTEM_MESSAGE}, + {"role": "user", "content": self.prompt}, ] tokenize_kwargs = { @@ -163,12 +166,22 @@ def _encode_prompt(self, context: InvocationContext, exit_stack: ExitStack) -> t "max_length": self.max_seq_len, } - try: - inputs = processor.apply_chat_template(messages, **tokenize_kwargs) - except (AttributeError, ValueError): - # Fallback path: processor has no chat template (single-file - # tokenizer download). Format the prompt manually using Mistral's - # [INST]...[/INST] convention. + inputs = None + last_error: Exception | None = None + for messages in (multimodal_messages, plain_messages): + try: + inputs = processor.apply_chat_template(messages, **tokenize_kwargs) + break + except (AttributeError, ValueError, TypeError, KeyError) as e: + last_error = e + + if inputs is None: + # Fallback: no usable chat template. Format the prompt manually using + # Mistral's classic [INST]...[/INST] convention. + context.logger.debug( + f"Mistral chat template failed ({type(last_error).__name__}: {last_error}); " + "falling back to manual [INST] formatting." + ) text = f"[INST] {FLUX2_DEV_SYSTEM_MESSAGE}\n\n{self.prompt} [/INST]" inputs = processor( text, diff --git a/invokeai/backend/model_manager/configs/qwen3_encoder.py b/invokeai/backend/model_manager/configs/qwen3_encoder.py index 308539aa354..49ed34a8fba 100644 --- a/invokeai/backend/model_manager/configs/qwen3_encoder.py +++ b/invokeai/backend/model_manager/configs/qwen3_encoder.py @@ -92,16 +92,16 @@ def _get_qwen3_variant_from_state_dict(state_dict: dict[str | int, Any]) -> Opti else: return None - # Determine variant based on hidden_size + # Determine variant based on hidden_size. Unknown sizes mean this is NOT a + # recognized Qwen3 variant (could be another causal LM in GGUF format such as + # Mistral or Llama, which use identical llama.cpp key naming). if hidden_size == QWEN3_06B_HIDDEN_SIZE: return Qwen3VariantType.Qwen3_06B elif hidden_size == QWEN3_4B_HIDDEN_SIZE: return Qwen3VariantType.Qwen3_4B elif hidden_size == QWEN3_8B_HIDDEN_SIZE: return Qwen3VariantType.Qwen3_8B - else: - # Unknown size, default to 4B (more common) - return Qwen3VariantType.Qwen3_4B + return None class Qwen3Encoder_Checkpoint_Config(Checkpoint_Config_Base, Config_Base): @@ -130,10 +130,16 @@ def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) - @classmethod def _get_variant_or_default(cls, mod: ModelOnDisk) -> Qwen3VariantType: - """Get variant from state dict, defaulting to 4B if unknown.""" + """Get the variant from state dict, raising NotAMatch when the size does not match a known Qwen3 variant. + + We previously defaulted to 4B for unknown sizes, but that swallowed other causal-LM GGUFs + (Mistral, Llama, ...) which share llama.cpp tensor naming with Qwen3. + """ state_dict = mod.load_state_dict() variant = _get_qwen3_variant_from_state_dict(state_dict) - return variant if variant is not None else Qwen3VariantType.Qwen3_4B + if variant is None: + raise NotAMatchError("hidden size does not match a known Qwen3 variant") + return variant @classmethod def _validate_looks_like_qwen3_model(cls, mod: ModelOnDisk) -> None: @@ -217,7 +223,7 @@ def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) - @classmethod def _get_variant_from_config(cls, config_path) -> Qwen3VariantType: - """Get variant from config.json based on hidden_size.""" + """Get variant from config.json based on hidden_size, or raise NotAMatch if unknown.""" QWEN3_06B_HIDDEN_SIZE = 1024 QWEN3_4B_HIDDEN_SIZE = 2560 QWEN3_8B_HIDDEN_SIZE = 4096 @@ -225,18 +231,17 @@ def _get_variant_from_config(cls, config_path) -> Qwen3VariantType: try: with open(config_path, "r", encoding="utf-8") as f: config = json.load(f) - hidden_size = config.get("hidden_size") - if hidden_size == QWEN3_8B_HIDDEN_SIZE: - return Qwen3VariantType.Qwen3_8B - elif hidden_size == QWEN3_4B_HIDDEN_SIZE: - return Qwen3VariantType.Qwen3_4B - elif hidden_size == QWEN3_06B_HIDDEN_SIZE: - return Qwen3VariantType.Qwen3_06B - else: - # Default to 4B for unknown sizes - return Qwen3VariantType.Qwen3_4B - except (json.JSONDecodeError, OSError): + except (json.JSONDecodeError, OSError) as e: + raise NotAMatchError(f"unable to read Qwen3 config.json: {e}") from e + + hidden_size = config.get("hidden_size") + if hidden_size == QWEN3_8B_HIDDEN_SIZE: + return Qwen3VariantType.Qwen3_8B + elif hidden_size == QWEN3_4B_HIDDEN_SIZE: return Qwen3VariantType.Qwen3_4B + elif hidden_size == QWEN3_06B_HIDDEN_SIZE: + return Qwen3VariantType.Qwen3_06B + raise NotAMatchError(f"hidden_size {hidden_size} does not match a known Qwen3 variant") class Qwen3Encoder_GGUF_Config(Checkpoint_Config_Base, Config_Base): @@ -265,10 +270,16 @@ def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) - @classmethod def _get_variant_or_default(cls, mod: ModelOnDisk) -> Qwen3VariantType: - """Get variant from state dict, defaulting to 4B if unknown.""" + """Get the variant from state dict, raising NotAMatch when the size does not match a known Qwen3 variant. + + We previously defaulted to 4B for unknown sizes, but that swallowed other causal-LM GGUFs + (Mistral, Llama, ...) which share llama.cpp tensor naming with Qwen3. + """ state_dict = mod.load_state_dict() variant = _get_qwen3_variant_from_state_dict(state_dict) - return variant if variant is not None else Qwen3VariantType.Qwen3_4B + if variant is None: + raise NotAMatchError("hidden size does not match a known Qwen3 variant") + return variant @classmethod def _validate_looks_like_qwen3_model(cls, mod: ModelOnDisk) -> None: diff --git a/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py b/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py index ad4f38753dc..3ff30433059 100644 --- a/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py +++ b/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py @@ -12,7 +12,7 @@ import accelerate import torch -from transformers import AutoProcessor, MistralConfig, MistralModel +from transformers import AutoProcessor, AutoTokenizer, MistralConfig, MistralModel from invokeai.backend.model_manager.configs.factory import AnyModelConfig from invokeai.backend.model_manager.configs.mistral_encoder import ( @@ -50,11 +50,20 @@ _MISTRAL_SMALL_3_1_ROPE_THETA = 1000000.0 _MISTRAL_SMALL_3_1_RMS_NORM_EPS = 1e-5 -# Default tokenizer / processor source. The official Mistral repo requires -# accepting a license; FLUX.2-dev embeds the same processor under `tokenizer/` -# and is the canonical companion for image-generation use. -_DEFAULT_PROCESSOR_SOURCE = "black-forest-labs/FLUX.2-dev" -_DEFAULT_PROCESSOR_SUBFOLDER = "tokenizer" +# Fallback tokenizer/processor sources for single-file / GGUF Mistral encoders. +# The GGUF format doesn't bundle a tokenizer; we have to fetch one. We try each +# source in order, preferring the local HuggingFace cache before any network +# lookup, and use AutoTokenizer (text-only, simpler config requirements) so the +# offline fallback works even when HF Hub is unreachable. +# +# - ``black-forest-labs/FLUX.2-dev`` (subfolder=``tokenizer``): canonical FLUX.2 processor +# - ``mistralai/Mistral-Small-3.1-24B-Instruct-2503``: official Mistral 3.1, the version FLUX.2 was trained on +# - ``mistralai/Mistral-Small-3.2-24B-Instruct-2506``: drop-in 3.2 (same chat template) +_TOKENIZER_FALLBACK_SOURCES: tuple[tuple[str, Optional[str]], ...] = ( + ("black-forest-labs/FLUX.2-dev", "tokenizer"), + ("mistralai/Mistral-Small-3.1-24B-Instruct-2503", None), + ("mistralai/Mistral-Small-3.2-24B-Instruct-2506", None), +) def _build_mistral_config( @@ -143,6 +152,62 @@ def _strip_known_prefixes(sd: dict[str, Any]) -> dict[str, Any]: return out +def _convert_for_bare_mistral_model(sd: dict[str, Any]) -> dict[str, Any]: + """Rewrite a `model.*` causal-LM state dict for direct loading into ``MistralModel``. + + Transformers' ``MistralForCausalLM`` exposes its decoder under ``model.`` and adds + an ``lm_head``; bare ``MistralModel`` has the decoder modules at the top level + (``embed_tokens``, ``layers``, ``norm``) and no LM head. Our state dicts come from + GGUF / safetensors that target the CausalLM layout, so we strip the prefix and + drop the LM head before calling ``MistralModel.load_state_dict``. + """ + out: dict[str, Any] = {} + for key, value in sd.items(): + if not isinstance(key, str): + out[key] = value + continue + if key.startswith("lm_head."): + continue + if key.startswith("model."): + out[key[len("model.") :]] = value + else: + out[key] = value + return out + + +def _materialize_remaining_meta_tensors(model: torch.nn.Module, dtype: torch.dtype, logger) -> None: + """Replace any parameters/buffers still on the meta device after load_state_dict. + + A meta tensor in the final model triggers ``Cannot copy out of meta tensor`` when + the model cache moves the weights to the compute device. We can't recover the + actual values for missing weights, but we can at least give the model a real + tensor — norms get ones, everything else gets zeros — so the load completes and + obvious errors are easier to debug than a low-level move failure. + """ + materialized: list[str] = [] + for name, param in list(model.named_parameters()): + if not param.is_meta: + continue + is_norm = "norm" in name.split(".") or name.endswith("_norm.weight") + new_tensor = torch.ones(param.shape, dtype=dtype) if is_norm else torch.zeros(param.shape, dtype=dtype) + parent_name, _, attr = name.rpartition(".") + parent = model.get_submodule(parent_name) if parent_name else model + setattr(parent, attr, torch.nn.Parameter(new_tensor, requires_grad=False)) + materialized.append(name) + for name, buffer in list(model.named_buffers()): + if not buffer.is_meta: + continue + parent_name, _, attr = name.rpartition(".") + parent = model.get_submodule(parent_name) if parent_name else model + parent.register_buffer(attr, torch.zeros(buffer.shape, dtype=dtype), persistent=False) + materialized.append(f"{name} (buffer)") + if materialized: + logger.warning( + f"Mistral encoder: materialized {len(materialized)} meta tensor(s) with default values " + f"(this usually means a key was missing from the checkpoint). First 5: {materialized[:5]}" + ) + + def _drop_quantization_metadata(sd: dict[str, Any], logger) -> dict[str, Any]: """Dequantize Comfy-Org-style FP8/FP4 weights and drop their metadata keys. @@ -181,18 +246,47 @@ def _drop_quantization_metadata(sd: dict[str, Any], logger) -> dict[str, Any]: def _load_processor_with_offline_fallback() -> AnyModel: - """Load the FLUX.2 Mistral processor (tokenizer + chat template) from cache, else HF.""" - try: - return AutoProcessor.from_pretrained( - _DEFAULT_PROCESSOR_SOURCE, - subfolder=_DEFAULT_PROCESSOR_SUBFOLDER, - local_files_only=True, - ) - except (OSError, EnvironmentError): - return AutoProcessor.from_pretrained( - _DEFAULT_PROCESSOR_SOURCE, - subfolder=_DEFAULT_PROCESSOR_SUBFOLDER, - ) + """Load a Mistral tokenizer / processor for FLUX.2 [dev] text encoding. + + Strategy: walk the fallback source list twice — first looking only at the + local HuggingFace cache, then with network lookups enabled. For each entry + we try ``AutoProcessor`` (multimodal Mistral3 processor, includes the + ``apply_chat_template`` we use) and then ``AutoTokenizer`` (text-only, used + when the source ships only tokenizer files without the multimodal + ``processor_config.json``). The first match wins. + """ + attempts: list[str] = [] + + def _try(source: str, subfolder: Optional[str], local_only: bool) -> Optional[AnyModel]: + kwargs: dict[str, Any] = {"local_files_only": local_only} + if subfolder is not None: + kwargs["subfolder"] = subfolder + for loader_cls in (AutoProcessor, AutoTokenizer): + try: + return loader_cls.from_pretrained(source, **kwargs) + except (OSError, EnvironmentError, ValueError) as e: + attempts.append( + f"{loader_cls.__name__}({source}, subfolder={subfolder}, local_only={local_only}): {type(e).__name__}" + ) + return None + + for local_only in (True, False): + for source, subfolder in _TOKENIZER_FALLBACK_SOURCES: + result = _try(source, subfolder, local_only) + if result is not None: + return result + + sources_str = ", ".join(f"{s}{f':{f}' if f else ''}" for s, f in _TOKENIZER_FALLBACK_SOURCES) + raise RuntimeError( + "Could not load a Mistral tokenizer/processor for FLUX.2 [dev]. " + f"Tried (cached + online): {sources_str}. " + "Workarounds: (1) install the full FLUX.2-dev diffusers folder as a model in InvokeAI " + "(it bundles the tokenizer), (2) point HF_ENDPOINT at a reachable HuggingFace mirror " + "or run once with internet access to populate the local cache, " + "or (3) pre-cache the tokenizer with: " + "`huggingface-cli download black-forest-labs/FLUX.2-dev --include 'tokenizer/*'`. " + f"Attempt details: {'; '.join(attempts[-6:])}" + ) @ModelLoaderRegistry.register( @@ -304,6 +398,9 @@ def _load_text_encoder(self, config: MistralEncoder_Checkpoint_Config) -> AnyMod for k in list(sd.keys()): sd[k] = sd[k].to(model_dtype) + # Adapt CausalLM-prefixed keys for bare MistralModel. + sd = _convert_for_bare_mistral_model(sd) + with accelerate.init_empty_weights(): model = MistralModel(mistral_config) @@ -338,6 +435,8 @@ def _load_text_encoder(self, config: MistralEncoder_Checkpoint_Config) -> AnyMod ) parent.register_buffer(parts[-1], inv_freq.to(model_dtype), persistent=False) + _materialize_remaining_meta_tensors(model, model_dtype, logger) + return model @@ -390,10 +489,19 @@ def _load_from_gguf(self, config: MistralEncoder_GGUF_Config) -> AnyModel: f"kv_heads={mistral_config.num_key_value_heads}, intermediate={mistral_config.intermediate_size}" ) + # Adapt CausalLM-prefixed keys for bare MistralModel. + sd = _convert_for_bare_mistral_model(sd) + with accelerate.init_empty_weights(): model = MistralModel(mistral_config) - model.load_state_dict(sd, strict=False, assign=True) + missing, unexpected = model.load_state_dict(sd, strict=False, assign=True) + if unexpected: + logger.debug(f"Mistral encoder (GGUF): ignored {len(unexpected)} unexpected keys") + if missing: + logger.debug( + f"Mistral encoder (GGUF): {len(missing)} keys missing from state dict (first 5: {missing[:5]})" + ) # Embedding lookups require an indexable tensor — dequantize the GGMLTensor for embed_tokens. embed_weight = model.embed_tokens.weight @@ -410,6 +518,8 @@ def _load_from_gguf(self, config: MistralEncoder_GGUF_Config) -> AnyModel: ) parent.register_buffer(parts[-1], inv_freq.to(compute_dtype), persistent=False) + _materialize_remaining_meta_tensors(model, compute_dtype, logger) + return model @@ -433,6 +543,10 @@ def _convert_llamacpp_mistral_to_pytorch(sd: dict[str, Any]) -> dict[str, Any]: parts = key.split(".", 2) # ["blk", "", ""] if len(parts) == 3: rest = parts[2] + # Order matters: q_norm/k_norm must be checked BEFORE attn_q/attn_k + # so we don't rewrite "attn_q_norm" -> "self_attn.q_proj_norm". + rest = rest.replace("attn_q_norm.", "self_attn.q_norm.") + rest = rest.replace("attn_k_norm.", "self_attn.k_norm.") rest = rest.replace("attn_q.", "self_attn.q_proj.") rest = rest.replace("attn_k.", "self_attn.k_proj.") rest = rest.replace("attn_v.", "self_attn.v_proj.") diff --git a/invokeai/frontend/web/public/locales/en.json b/invokeai/frontend/web/public/locales/en.json index 3e88d460e55..5f37034b624 100644 --- a/invokeai/frontend/web/public/locales/en.json +++ b/invokeai/frontend/web/public/locales/en.json @@ -1678,6 +1678,8 @@ "noQwen3EncoderModelSelected": "No Qwen3 Encoder model selected for FLUX2 Klein generation", "noFlux2KleinVaeModelSelected": "No VAE selected. Non-diffusers FLUX.2 Klein models require a standalone VAE", "noFlux2KleinQwen3EncoderModelSelected": "No Qwen3 Encoder selected. Non-diffusers FLUX.2 Klein models require a standalone Qwen3 Encoder", + "noFlux2DevVaeModelSelected": "No VAE selected. Non-diffusers FLUX.2 [dev] models require a standalone FLUX.2 VAE", + "noFlux2DevMistralEncoderModelSelected": "No Mistral Encoder selected. Non-diffusers FLUX.2 [dev] models require a standalone Mistral text encoder", "noQwenImageComponentSourceSelected": "GGUF Qwen Image models require a Diffusers Component Source for VAE/encoder", "noZImageVaeSourceSelected": "No VAE source: Select VAE (FLUX) or Qwen3 Source model", "noZImageQwen3EncoderSourceSelected": "No Qwen3 Encoder source: Select Qwen3 Encoder or Qwen3 Source model", diff --git a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts index 312b857c3a7..954e9662eda 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts @@ -809,9 +809,7 @@ export const selectAnimaScheduler = createParamsSelector((params) => params.anim export const selectKleinVaeModel = createParamsSelector((params) => params.kleinVaeModel); export const selectKleinQwen3EncoderModel = createParamsSelector((params) => params.kleinQwen3EncoderModel); export const selectFlux2DevVaeModel = createParamsSelector((params) => params.flux2DevVaeModel); -export const selectFlux2DevMistralEncoderModel = createParamsSelector( - (params) => params.flux2DevMistralEncoderModel -); +export const selectFlux2DevMistralEncoderModel = createParamsSelector((params) => params.flux2DevMistralEncoderModel); export const selectFlux2DevSourceModel = createParamsSelector((params) => params.flux2DevSourceModel); export const selectQwenImageComponentSource = createParamsSelector((params) => params.qwenImageComponentSource); export const selectQwenImageVaeModel = createParamsSelector((params) => params.qwenImageVaeModel); diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts index ed9fefa1e44..a7df1ab031d 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts @@ -195,6 +195,7 @@ export const buildFLUXGraph = async (arg: GraphBuilderArg): Promise ({ isConnected: true, model: overrides.model ?? flux2DiffusersModel, @@ -94,6 +95,7 @@ const buildGenerateTabArg = (overrides: { dynamicPrompts: baseDynamicPrompts, hasFlux2DiffusersVaeSource: overrides.hasFlux2DiffusersVaeSource ?? false, hasFlux2DiffusersQwen3Source: overrides.hasFlux2DiffusersQwen3Source ?? false, + hasFlux2DevDiffusersSource: overrides.hasFlux2DevDiffusersSource ?? false, }); const buildCanvasTabArg = (overrides: { @@ -102,6 +104,7 @@ const buildCanvasTabArg = (overrides: { kleinQwen3EncoderModel?: unknown; hasFlux2DiffusersVaeSource?: boolean; hasFlux2DiffusersQwen3Source?: boolean; + hasFlux2DevDiffusersSource?: boolean; }) => ({ isConnected: true, model: overrides.model ?? flux2DiffusersModel, @@ -131,6 +134,7 @@ const buildCanvasTabArg = (overrides: { canvasIsSelectingObject: false, hasFlux2DiffusersVaeSource: overrides.hasFlux2DiffusersVaeSource ?? false, hasFlux2DiffusersQwen3Source: overrides.hasFlux2DiffusersQwen3Source ?? false, + hasFlux2DevDiffusersSource: overrides.hasFlux2DevDiffusersSource ?? false, }); const hasFlux2VaeReason = (reasons: { content: string }[]) => diff --git a/invokeai/frontend/web/src/features/queue/store/readiness.ts b/invokeai/frontend/web/src/features/queue/store/readiness.ts index 230fa3348d6..313f5d1cc44 100644 --- a/invokeai/frontend/web/src/features/queue/store/readiness.ts +++ b/invokeai/frontend/web/src/features/queue/store/readiness.ts @@ -40,7 +40,7 @@ import type { TabName } from 'features/ui/store/uiTypes'; import i18n from 'i18next'; import { atom, computed } from 'nanostores'; import { useEffect } from 'react'; -import { selectFlux2DiffusersModels } from 'services/api/hooks/modelsByType'; +import { selectFlux2DevDiffusersModels, selectFlux2DiffusersModels } from 'services/api/hooks/modelsByType'; import type { MainOrExternalModelConfig } from 'services/api/types'; import { isExternalApiModelConfig } from 'services/api/types'; import { $isConnected } from 'services/events/stores'; @@ -117,6 +117,7 @@ const debouncedUpdateReasons = debounce(async (arg: UpdateReasonsArg) => { const hasFlux2DiffusersQwen3Source = flux2DiffusersModels.some( (m) => 'variant' in m && isFlux2KleinQwen3Compatible(m.variant, modelVariant) ); + const hasFlux2DevDiffusersSource = selectFlux2DevDiffusersModels(store.getState()).length > 0; const reasons = await getReasonsWhyCannotEnqueueGenerateTab({ isConnected, model, @@ -126,6 +127,7 @@ const debouncedUpdateReasons = debounce(async (arg: UpdateReasonsArg) => { loras, hasFlux2DiffusersVaeSource, hasFlux2DiffusersQwen3Source, + hasFlux2DevDiffusersSource, }); $reasonsWhyCannotEnqueue.set(reasons); } else if (tab === 'canvas') { @@ -136,6 +138,7 @@ const debouncedUpdateReasons = debounce(async (arg: UpdateReasonsArg) => { const hasFlux2DiffusersQwen3Source = flux2DiffusersModels.some( (m) => 'variant' in m && isFlux2KleinQwen3Compatible(m.variant, modelVariant) ); + const hasFlux2DevDiffusersSource = selectFlux2DevDiffusersModels(store.getState()).length > 0; const reasons = await getReasonsWhyCannotEnqueueCanvasTab({ isConnected, model, @@ -151,6 +154,7 @@ const debouncedUpdateReasons = debounce(async (arg: UpdateReasonsArg) => { loras, hasFlux2DiffusersVaeSource, hasFlux2DiffusersQwen3Source, + hasFlux2DevDiffusersSource, }); $reasonsWhyCannotEnqueue.set(reasons); } else if (tab === 'workflows') { @@ -247,6 +251,7 @@ export const getReasonsWhyCannotEnqueueGenerateTab = (arg: { dynamicPrompts: DynamicPromptsState; hasFlux2DiffusersVaeSource: boolean; hasFlux2DiffusersQwen3Source: boolean; + hasFlux2DevDiffusersSource: boolean; }) => { const { isConnected, @@ -257,6 +262,7 @@ export const getReasonsWhyCannotEnqueueGenerateTab = (arg: { dynamicPrompts, hasFlux2DiffusersVaeSource, hasFlux2DiffusersQwen3Source, + hasFlux2DevDiffusersSource, } = arg; const { positivePrompt } = params; const reasons: Reason[] = []; @@ -290,14 +296,24 @@ export const getReasonsWhyCannotEnqueueGenerateTab = (arg: { } if (model?.base === 'flux2' && model.format !== 'diffusers') { - // Non-diffusers FLUX.2 Klein models require standalone VAE and Qwen3 Encoder - // unless a diffusers flux2 model is available to extract them from. - // VAE is shared across variants, but Qwen3 encoder requires a variant-matching diffusers model. - if (!params.kleinVaeModel && !hasFlux2DiffusersVaeSource) { - reasons.push({ content: i18n.t('parameters.invoke.noFlux2KleinVaeModelSelected') }); - } - if (!params.kleinQwen3EncoderModel && !hasFlux2DiffusersQwen3Source) { - reasons.push({ content: i18n.t('parameters.invoke.noFlux2KleinQwen3EncoderModelSelected') }); + // Non-diffusers FLUX.2 models need standalone VAE + text encoder unless a Diffusers + // pipeline of the matching variant family is installed to extract from. + if ('variant' in model && model.variant === 'dev') { + // FLUX.2 [dev]: needs FLUX.2 VAE + Mistral text encoder. + if (!params.flux2DevVaeModel && !hasFlux2DevDiffusersSource) { + reasons.push({ content: i18n.t('parameters.invoke.noFlux2DevVaeModelSelected') }); + } + if (!params.flux2DevMistralEncoderModel && !hasFlux2DevDiffusersSource) { + reasons.push({ content: i18n.t('parameters.invoke.noFlux2DevMistralEncoderModelSelected') }); + } + } else { + // FLUX.2 Klein: needs FLUX.2 VAE + Qwen3 text encoder (variant-matched). + if (!params.kleinVaeModel && !hasFlux2DiffusersVaeSource) { + reasons.push({ content: i18n.t('parameters.invoke.noFlux2KleinVaeModelSelected') }); + } + if (!params.kleinQwen3EncoderModel && !hasFlux2DiffusersQwen3Source) { + reasons.push({ content: i18n.t('parameters.invoke.noFlux2KleinQwen3EncoderModelSelected') }); + } } } @@ -510,6 +526,7 @@ export const getReasonsWhyCannotEnqueueCanvasTab = (arg: { canvasIsSelectingObject: boolean; hasFlux2DiffusersVaeSource: boolean; hasFlux2DiffusersQwen3Source: boolean; + hasFlux2DevDiffusersSource: boolean; }) => { const { isConnected, @@ -526,6 +543,7 @@ export const getReasonsWhyCannotEnqueueCanvasTab = (arg: { canvasIsSelectingObject, hasFlux2DiffusersVaeSource, hasFlux2DiffusersQwen3Source, + hasFlux2DevDiffusersSource, } = arg; const { positivePrompt } = params; const reasons: Reason[] = []; @@ -618,15 +636,23 @@ export const getReasonsWhyCannotEnqueueCanvasTab = (arg: { } if (model?.base === 'flux2') { - // Non-diffusers FLUX.2 Klein models require standalone VAE and Qwen3 Encoder - // unless a diffusers flux2 model is available to extract them from. - // VAE is shared across variants, but Qwen3 encoder requires a variant-matching diffusers model. + // Non-diffusers FLUX.2 models need standalone VAE + text encoder unless a Diffusers + // pipeline of the matching variant family is installed to extract from. if (model.format !== 'diffusers') { - if (!params.kleinVaeModel && !hasFlux2DiffusersVaeSource) { - reasons.push({ content: i18n.t('parameters.invoke.noFlux2KleinVaeModelSelected') }); - } - if (!params.kleinQwen3EncoderModel && !hasFlux2DiffusersQwen3Source) { - reasons.push({ content: i18n.t('parameters.invoke.noFlux2KleinQwen3EncoderModelSelected') }); + if ('variant' in model && model.variant === 'dev') { + if (!params.flux2DevVaeModel && !hasFlux2DevDiffusersSource) { + reasons.push({ content: i18n.t('parameters.invoke.noFlux2DevVaeModelSelected') }); + } + if (!params.flux2DevMistralEncoderModel && !hasFlux2DevDiffusersSource) { + reasons.push({ content: i18n.t('parameters.invoke.noFlux2DevMistralEncoderModelSelected') }); + } + } else { + if (!params.kleinVaeModel && !hasFlux2DiffusersVaeSource) { + reasons.push({ content: i18n.t('parameters.invoke.noFlux2KleinVaeModelSelected') }); + } + if (!params.kleinQwen3EncoderModel && !hasFlux2DiffusersQwen3Source) { + reasons.push({ content: i18n.t('parameters.invoke.noFlux2KleinQwen3EncoderModelSelected') }); + } } } From 684d7d500ded0a69832be162e1b8ab85784b50da Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Mon, 25 May 2026 22:34:59 +0200 Subject: [PATCH 03/25] Chore Path fix --- invokeai/frontend/web/src/services/api/schema.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/invokeai/frontend/web/src/services/api/schema.ts b/invokeai/frontend/web/src/services/api/schema.ts index 1cb1ad27d5c..cebbf3e2643 100644 --- a/invokeai/frontend/web/src/services/api/schema.ts +++ b/invokeai/frontend/web/src/services/api/schema.ts @@ -16597,14 +16597,14 @@ export type components = { * Convert Cache Dir * Format: path * @description Path to the converted models cache directory (DEPRECATED, but do not delete because it is needed for migration from previous versions). - * @default models\.convert_cache + * @default models/.convert_cache */ convert_cache_dir?: string; /** * Download Cache Dir * Format: path * @description Path to the directory that contains dynamically downloaded models. - * @default models\.download_cache + * @default models/.download_cache */ download_cache_dir?: string; /** From b8579510f37489bdd0cac7c3b05c8a163191b55c Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Sat, 6 Jun 2026 02:25:16 +0200 Subject: [PATCH 04/25] FLUX.2 [dev]: restrict Mistral encoder to 30-layer cow + add recall handlers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Upstream Mistral Small 3.1/3.2 (40 layers) produces off-distribution embeddings under FLUX.2's static (10, 20, 30) hidden-state extraction. The joint attention was actually trained against BFL's 30-layer cow-mistral3-small distillation — both Comfy-Org's safetensors and gguf-org's cow GGUFs ship the same 30-layer weights, just packaged differently. - Probing (configs/mistral_encoder.py) now rejects non-cow Mistrals across all three formats (Diffusers / Checkpoint / GGUF) with a clear error. - Loader (load/model_loaders/mistral_encoder.py) extracts the embedded Tekken tokenizer from the `tekken_model` U8 (safetensors) / fp16-per-byte (cow GGUF) tensor via mistral_common, falling back to the BFL HF tokenizer. Removes the INVOKEAI_MISTRAL_TOKENIZER_SOURCE env var. - Starter models: drop upstream Mistral 3.x entries, add Comfy-Org bf16/fp8/fp4 variants alongside the cow GGUFs. - MistralVariantType: drop Small3_1, keep only Cow. - pyproject.toml: add mistral-common dependency. Frontend recall: - Add Flux2DevVAEModel + Flux2DevMistralEncoderModel handlers, disambiguating Klein vs dev via presence of `mistral_encoder` / `qwen3_encoder` metadata fields (both bases are `flux2`). - Wire both into the Recall Parameters panel (hardcoded list was missing them). - Add `metadata.mistralEncoder` i18n key + colocated tests. --- .../app/invocations/flux2_dev_text_encoder.py | 36 +- .../model_manager/configs/mistral_encoder.py | 117 +++-- .../load/model_loaders/mistral_encoder.py | 429 ++++++++++++++---- .../backend/model_manager/starter_models.py | 145 ++++-- invokeai/backend/model_manager/taxonomy.py | 9 +- invokeai/frontend/web/public/locales/en.json | 1 + .../ImageMetadataActions.tsx | 2 + .../src/features/metadata/parsing.test.tsx | 99 +++- .../web/src/features/metadata/parsing.tsx | 71 ++- .../web/src/features/modelManagerV2/models.ts | 2 +- .../web/src/features/nodes/types/common.ts | 2 +- .../frontend/web/src/services/api/schema.ts | 12 +- pyproject.toml | 1 + 13 files changed, 744 insertions(+), 182 deletions(-) diff --git a/invokeai/app/invocations/flux2_dev_text_encoder.py b/invokeai/app/invocations/flux2_dev_text_encoder.py index 2a8af851b96..22beb6c8e22 100644 --- a/invokeai/app/invocations/flux2_dev_text_encoder.py +++ b/invokeai/app/invocations/flux2_dev_text_encoder.py @@ -1,15 +1,18 @@ """FLUX.2 [dev] text encoder invocation. -FLUX.2 [dev] uses Mistral Small 3.1 as its sole text encoder, following the -diffusers Flux2Pipeline reference implementation: +FLUX.2 [dev] uses the BFL "cow-mistral3-small" 30-layer Mistral distillation as +its sole text encoder (sometimes referred to as "Mistral Small 3" in BFL's +documentation, but the shipped weights are the 30-layer cow variant — upstream +40-layer Mistral Small 3.1 / 3.2 does not work): - A fixed system message biases the model toward structured image descriptions. - The user prompt is wrapped in Mistral's chat template via the multimodal AutoProcessor. -- Three intermediate hidden states (layers 10, 20, 30 in the 30-layer model) are - stacked and flattened to produce a (B, seq, 3 * hidden_size) tensor — for - Mistral Small 3.1 that is 3 * 5120 = 15360, matching the transformer's - joint_attention_dim. +- Three intermediate hidden states (layers 10, 20, 30) are stacked and flattened + to produce a (B, seq, 3 * hidden_size) = (B, seq, 15360) tensor matching the + FLUX.2 transformer's joint_attention_dim. For the 30-layer cow model those + indices map to (1/3, 2/3, last) — exactly what BFL's joint attention was + trained to consume. """ from contextlib import ExitStack @@ -46,11 +49,11 @@ "without speculation." ) -# Diffusers / BFL extract hidden states from these layers and stack them. -# Indices are 1-based into hidden_states[] (hidden_states[0] is the embedding layer). -# Mistral Small 3.1 has 40 transformer layers (so up to hidden_states[40]); the -# reference pipeline uses (10, 20, 30) and we scale proportionally if the model -# has fewer layers. +# Indices into hidden_states[] (hidden_states[0] is the embedding output) that +# FLUX.2 [dev]'s joint attention was trained to consume. Hard-coded to the +# 30-layer cow Mistral — (10, 20, 30) hits (1/3, 2/3, last) for that depth. +# The model loaders reject anything other than 30-layer cow weights, so we don't +# need a scaling fallback here. DEV_EXTRACTION_LAYERS = (10, 20, 30) # Default max sequence length for FLUX.2 [dev]. The reference pipeline caps at 512. @@ -213,12 +216,13 @@ def _encode_prompt(self, context: InvocationContext, exit_stack: ExitStack) -> t ) num_hidden_states = len(outputs.hidden_states) # = num_hidden_layers + 1 (embedding output) - # Scale extraction layer indices if the model is smaller than the reference. - # hidden_states[0] is the embedding output, hidden_states[i] is the output of layer i. + # Safety check: the model loaders only accept 30-layer cow weights, so + # hidden_states[] should have ≥ 31 entries (embedding output + 30 layers). + # Fall back to a scaled tuple only if a non-cow encoder somehow slipped + # past the loaders, so we don't crash with an IndexError. if num_hidden_states - 1 < max(DEV_EXTRACTION_LAYERS): - n = num_hidden_states - 1 # number of transformer layers - scaled = (max(1, n // 3), max(1, (2 * n) // 3), n) - extraction_layers = scaled + n = num_hidden_states - 1 + extraction_layers = (max(1, n // 3), max(1, (2 * n) // 3), n) else: extraction_layers = DEV_EXTRACTION_LAYERS diff --git a/invokeai/backend/model_manager/configs/mistral_encoder.py b/invokeai/backend/model_manager/configs/mistral_encoder.py index 19d01729468..6bf8bd634f1 100644 --- a/invokeai/backend/model_manager/configs/mistral_encoder.py +++ b/invokeai/backend/model_manager/configs/mistral_encoder.py @@ -1,5 +1,5 @@ import json -from typing import Any, Literal, Optional, Self +from typing import Any, Literal, Self from pydantic import Field @@ -15,8 +15,15 @@ from invokeai.backend.model_manager.taxonomy import BaseModelType, MistralVariantType, ModelFormat, ModelType from invokeai.backend.quantization.gguf.ggml_tensor import GGMLTensor -# Mistral Small 3.1 hidden_size. Used by FLUX.2 [dev]. -_MISTRAL_SMALL_3_1_HIDDEN_SIZE = 5120 +# Mistral cow distillation hidden_size. Used by FLUX.2 [dev]. +_COW_HIDDEN_SIZE = 5120 + +# Layer count of the BFL "cow-mistral3-small" distillation. FLUX.2 [dev]'s joint +# attention was trained with hidden-state indices (10, 20, 30) — for a 30-layer +# Mistral that's (1/3, 2/3, last). Upstream Mistral Small 3.1 / 3.2 (40 layers) +# sample at different relative depths and produce off-distribution embeddings, +# so we reject anything but 30-layer cow encoders. +_COW_NUM_LAYERS = 30 def _has_mistral_keys(state_dict: dict[str | int, Any]) -> bool: @@ -50,6 +57,30 @@ def _has_ggml_tensors(state_dict: dict[str | int, Any]) -> bool: return any(isinstance(v, GGMLTensor) for v in state_dict.values()) +def _count_mistral_layers(state_dict: dict[str | int, Any]) -> int: + """Count transformer layers in a Mistral state dict. + + Supports both transformers' ``model.layers.N.*`` layout and llama.cpp's + ``blk.N.*`` layout. Returns 0 if no per-layer keys are present. + """ + indices: set[int] = set() + for key in state_dict.keys(): + if not isinstance(key, str): + continue + # transformers / diffusers: model.layers.N.* or language_model.model.layers.N.* + if ".layers." in key: + parts = key.split(".layers.", 1)[1].split(".", 1) + if parts and parts[0].isdigit(): + indices.add(int(parts[0])) + continue + # llama.cpp GGUF: blk.N.* + if key.startswith("blk."): + parts = key.split(".", 2) + if len(parts) >= 2 and parts[1].isdigit(): + indices.add(int(parts[1])) + return (max(indices) + 1) if indices else 0 + + def _embed_hidden_size(state_dict: dict[str | int, Any]) -> int | None: """Read the embedding hidden size from a Mistral-like state dict. @@ -73,34 +104,37 @@ def _embed_hidden_size(state_dict: dict[str | int, Any]) -> int | None: return None -def _get_mistral_variant_from_state_dict(state_dict: dict[str | int, Any]) -> Optional[MistralVariantType]: - """Determine the Mistral variant from a state dict based on hidden_size. +def _is_cow_state_dict(state_dict: dict[str | int, Any]) -> bool: + """Check whether a state dict matches the 30-layer cow distillation. - Only Mistral Small 3.1 (hidden_size=5120) is currently recognized. + FLUX.2 [dev] only works with the 30-layer cow-mistral3-small weights — upstream + Mistral Small 3.1 / 3.2 (40 layers) produce off-distribution embeddings under + the (10, 20, 30) hidden-state extraction the joint attention was trained for. """ - hidden_size = _embed_hidden_size(state_dict) - if hidden_size == _MISTRAL_SMALL_3_1_HIDDEN_SIZE: - return MistralVariantType.Small3_1 - return None + if _embed_hidden_size(state_dict) != _COW_HIDDEN_SIZE: + return False + return _count_mistral_layers(state_dict) == _COW_NUM_LAYERS -def _get_mistral_variant_from_config(config_path) -> MistralVariantType: - """Determine Mistral variant from a config.json (hidden_size or text_config.hidden_size).""" +def _is_cow_config(config_path) -> bool: + """Check a HF ``config.json`` for the 30-layer cow Mistral signature.""" try: with open(config_path, "r", encoding="utf-8") as f: config = json.load(f) except (json.JSONDecodeError, OSError): - return MistralVariantType.Small3_1 + return False # Mistral3ForConditionalGeneration nests the LM config under text_config. hidden_size = config.get("hidden_size") - if hidden_size is None: + num_layers = config.get("num_hidden_layers") + if hidden_size is None or num_layers is None: text_config = config.get("text_config") or {} - hidden_size = text_config.get("hidden_size") + if hidden_size is None: + hidden_size = text_config.get("hidden_size") + if num_layers is None: + num_layers = text_config.get("num_hidden_layers") - if hidden_size == _MISTRAL_SMALL_3_1_HIDDEN_SIZE: - return MistralVariantType.Small3_1 - return MistralVariantType.Small3_1 + return hidden_size == _COW_HIDDEN_SIZE and num_layers == _COW_NUM_LAYERS class MistralEncoder_Diffusers_Config(Config_Base): @@ -113,6 +147,10 @@ class MistralEncoder_Diffusers_Config(Config_Base): Does NOT match a full FLUX.2 pipeline directory — those are picked up by the `Main_Diffusers_Flux2_Config` instead. + + Only the 30-layer cow distillation is accepted; upstream Mistral Small 3.1 / 3.2 + (40 layers) produces off-distribution embeddings under FLUX.2's (10, 20, 30) + hidden-state extraction. """ base: Literal[BaseModelType.Any] = Field(default=BaseModelType.Any) @@ -153,13 +191,22 @@ def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) - }, ) - variant = _get_mistral_variant_from_config(expected_config_path) + if not _is_cow_config(expected_config_path): + raise NotAMatchError( + "config.json describes a non-cow Mistral (expected hidden_size=5120, num_hidden_layers=30). " + "Only the 30-layer cow-mistral3-small distillation is supported for FLUX.2 [dev]." + ) - return cls(variant=variant, **override_fields) + return cls(variant=MistralVariantType.Cow, **override_fields) class MistralEncoder_Checkpoint_Config(Checkpoint_Config_Base, Config_Base): - """Configuration for a single-file Mistral text encoder (safetensors).""" + """Configuration for a single-file Mistral text encoder (safetensors). + + Only the 30-layer cow distillation is accepted (e.g. Comfy-Org's bf16/fp8/fp4 + files). Upstream Mistral Small 3.1 / 3.2 single-files are rejected — they have + 40 layers and produce off-distribution embeddings for FLUX.2's joint attention. + """ base: Literal[BaseModelType.Any] = Field(default=BaseModelType.Any) type: Literal[ModelType.MistralEncoder] = Field(default=ModelType.MistralEncoder) @@ -181,15 +228,21 @@ def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) - if _has_ggml_tensors(state_dict): raise NotAMatchError("state dict looks like GGUF quantized") - variant = _get_mistral_variant_from_state_dict(state_dict) - if variant is None: - raise NotAMatchError("hidden size does not match a known Mistral variant") + if not _is_cow_state_dict(state_dict): + raise NotAMatchError( + f"not a 30-layer cow-mistral3-small (got hidden_size={_embed_hidden_size(state_dict)}, " + f"layers={_count_mistral_layers(state_dict)}). FLUX.2 [dev] only works with the 30-layer " + "cow distillation — upstream Mistral Small 3.1 / 3.2 (40 layers) produces wrong embeddings." + ) - return cls(variant=variant, **override_fields) + return cls(variant=MistralVariantType.Cow, **override_fields) class MistralEncoder_GGUF_Config(Checkpoint_Config_Base, Config_Base): - """Configuration for a GGUF-quantized Mistral text encoder.""" + """Configuration for a GGUF-quantized Mistral text encoder. + + Only the 30-layer cow distillation is accepted — see ``MistralEncoder_Checkpoint_Config``. + """ base: Literal[BaseModelType.Any] = Field(default=BaseModelType.Any) type: Literal[ModelType.MistralEncoder] = Field(default=ModelType.MistralEncoder) @@ -211,9 +264,11 @@ def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) - if not _has_ggml_tensors(state_dict): raise NotAMatchError("state dict does not look like GGUF quantized") - variant = _get_mistral_variant_from_state_dict(state_dict) - if variant is None: - # Fall back to Small 3.1 — this is the only Mistral encoder used by FLUX.2 today. - variant = MistralVariantType.Small3_1 + if not _is_cow_state_dict(state_dict): + raise NotAMatchError( + f"not a 30-layer cow-mistral3-small (got hidden_size={_embed_hidden_size(state_dict)}, " + f"layers={_count_mistral_layers(state_dict)}). FLUX.2 [dev] only works with the 30-layer " + "cow distillation — upstream Mistral Small 3.1 / 3.2 (40 layers) produces wrong embeddings." + ) - return cls(variant=variant, **override_fields) + return cls(variant=MistralVariantType.Cow, **override_fields) diff --git a/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py b/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py index 3ff30433059..457528a5ffb 100644 --- a/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py +++ b/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py @@ -1,10 +1,16 @@ # Copyright (c) 2026, The InvokeAI Development Team """Model loaders for the Mistral text encoder used by FLUX.2 [dev]. -FLUX.2 [dev] uses Mistral Small 3.1 (24B) as its sole text encoder. The diffusers -release ships it as the multimodal `Mistral3ForConditionalGeneration`; standalone -single-file safetensors and GGUF redistributions typically contain only the text -tower, which we load as an encoder-only `MistralModel`. +FLUX.2 [dev] uses BFL's 30-layer "cow-mistral3-small" distillation as its sole +text encoder. The diffusers release wraps it in the multimodal +``Mistral3ForConditionalGeneration``; standalone single-file safetensors +(Comfy-Org bf16/fp8/fp4) and GGUF redistributions (gguf-org cow variants) ship +only the text tower, which we load as an encoder-only ``MistralModel``. + +Both single-file packagings embed the canonical Tekken tokenizer as a U8 tensor +named ``tekken_model`` (~19 MB). When ``mistral_common`` is installed we use +that embedded tokenizer directly; otherwise we fall back to fetching the +tokenizer from ``black-forest-labs/FLUX.2-dev`` via HuggingFace. """ from pathlib import Path @@ -34,47 +40,41 @@ from invokeai.backend.util.devices import TorchDevice from invokeai.backend.util.logging import InvokeAILogger -# Architecture constants for Mistral Small 3.1 (used by FLUX.2 [dev]). -# Sourced from the FLUX.2-dev `text_encoder/config.json` (text-model side of the -# Mistral3 multimodal stack). Layers/heads/head_dim are needed when reconstructing -# the model from a state dict (single-file or GGUF) because the architecture is -# not embedded in those files. -_MISTRAL_SMALL_3_1_HIDDEN_SIZE = 5120 -_MISTRAL_SMALL_3_1_INTERMEDIATE_SIZE = 32768 -_MISTRAL_SMALL_3_1_NUM_HIDDEN_LAYERS = 40 -_MISTRAL_SMALL_3_1_NUM_ATTENTION_HEADS = 32 -_MISTRAL_SMALL_3_1_NUM_KV_HEADS = 8 # grouped-query attention -_MISTRAL_SMALL_3_1_HEAD_DIM = 128 -_MISTRAL_SMALL_3_1_VOCAB_SIZE = 131072 -_MISTRAL_SMALL_3_1_MAX_POSITION_EMBEDDINGS = 131072 -_MISTRAL_SMALL_3_1_ROPE_THETA = 1000000.0 -_MISTRAL_SMALL_3_1_RMS_NORM_EPS = 1e-5 - -# Fallback tokenizer/processor sources for single-file / GGUF Mistral encoders. -# The GGUF format doesn't bundle a tokenizer; we have to fetch one. We try each -# source in order, preferring the local HuggingFace cache before any network -# lookup, and use AutoTokenizer (text-only, simpler config requirements) so the -# offline fallback works even when HF Hub is unreachable. -# -# - ``black-forest-labs/FLUX.2-dev`` (subfolder=``tokenizer``): canonical FLUX.2 processor -# - ``mistralai/Mistral-Small-3.1-24B-Instruct-2503``: official Mistral 3.1, the version FLUX.2 was trained on -# - ``mistralai/Mistral-Small-3.2-24B-Instruct-2506``: drop-in 3.2 (same chat template) -_TOKENIZER_FALLBACK_SOURCES: tuple[tuple[str, Optional[str]], ...] = ( - ("black-forest-labs/FLUX.2-dev", "tokenizer"), - ("mistralai/Mistral-Small-3.1-24B-Instruct-2503", None), - ("mistralai/Mistral-Small-3.2-24B-Instruct-2506", None), -) +# Architecture constants for the 30-layer cow-mistral3-small distillation. +# Sourced from BFL's FLUX.2-dev ``text_encoder/config.json`` (text-model side of +# the Mistral3 multimodal stack) with the layer count adjusted to the cow depth. +# Hidden / head / KV / RoPE settings match upstream Mistral Small 3 because the +# cow distillation only changes depth (40 → 30), not width. +_COW_HIDDEN_SIZE = 5120 +_COW_INTERMEDIATE_SIZE = 32768 +_COW_NUM_HIDDEN_LAYERS = 30 +_COW_NUM_ATTENTION_HEADS = 32 +_COW_NUM_KV_HEADS = 8 # grouped-query attention +_COW_HEAD_DIM = 128 +_COW_VOCAB_SIZE = 131072 +_COW_MAX_POSITION_EMBEDDINGS = 131072 +_COW_ROPE_THETA = 1000000000.0 # 1e9 — matches BFL FLUX.2-dev/text_encoder/config.json +_COW_RMS_NORM_EPS = 1e-5 + +# HuggingFace fallback for the tokenizer when the model file doesn't embed +# tekken_model (older cow GGUFs without the embedded blob, or a diffusers folder +# without a sibling tokenizer/). We only need the BFL canonical source — upstream +# Mistral tokenizers (3.1 / 3.2) don't match BFL's chat template exactly. +_TOKENIZER_FALLBACK_SOURCE: tuple[str, str] = ("black-forest-labs/FLUX.2-dev", "tokenizer") def _build_mistral_config( state_dict: dict[str, Any], torch_dtype: torch.dtype, + rope_theta: float | None = None, + max_position_embeddings: int | None = None, ) -> MistralConfig: - """Build a transformers ``MistralConfig`` from a Mistral Small 3.1 state dict. + """Build a transformers ``MistralConfig`` from a cow-mistral3-small state dict. Reads the bulk shapes from the state dict (vocab, hidden, heads, kv_heads, - intermediate, layer count) so we can also handle non-Small-3.1 Mistrals that - happen to be wired through this loader. + intermediate, layer count). ``rope_theta`` and ``max_position_embeddings`` can + be passed explicitly when an out-of-band source is available (e.g. GGUF + metadata); otherwise we fall back to cow defaults. """ # Vocab and hidden_size come from embed_tokens. embed_key = "model.embed_tokens.weight" if "model.embed_tokens.weight" in state_dict else None @@ -94,13 +94,13 @@ def _build_mistral_config( layer_indices.add(int(key.split(".")[2])) except (ValueError, IndexError): pass - num_hidden_layers = (max(layer_indices) + 1) if layer_indices else _MISTRAL_SMALL_3_1_NUM_HIDDEN_LAYERS + num_hidden_layers = (max(layer_indices) + 1) if layer_indices else _COW_NUM_HIDDEN_LAYERS # Derive head counts from the first layer's attention projections. q_proj = state_dict.get("model.layers.0.self_attn.q_proj.weight") k_proj = state_dict.get("model.layers.0.self_attn.k_proj.weight") gate_proj = state_dict.get("model.layers.0.mlp.gate_proj.weight") - head_dim = _MISTRAL_SMALL_3_1_HEAD_DIM + head_dim = _COW_HEAD_DIM if q_proj is not None and k_proj is not None and gate_proj is not None: q_shape = q_proj.tensor_shape if isinstance(q_proj, GGMLTensor) else q_proj.shape k_shape = k_proj.tensor_shape if isinstance(k_proj, GGMLTensor) else k_proj.shape @@ -109,9 +109,9 @@ def _build_mistral_config( num_key_value_heads = int(k_shape[0]) // head_dim intermediate_size = int(gate_shape[0]) else: - num_attention_heads = _MISTRAL_SMALL_3_1_NUM_ATTENTION_HEADS - num_key_value_heads = _MISTRAL_SMALL_3_1_NUM_KV_HEADS - intermediate_size = _MISTRAL_SMALL_3_1_INTERMEDIATE_SIZE + num_attention_heads = _COW_NUM_ATTENTION_HEADS + num_key_value_heads = _COW_NUM_KV_HEADS + intermediate_size = _COW_INTERMEDIATE_SIZE return MistralConfig( vocab_size=vocab_size, @@ -121,16 +121,62 @@ def _build_mistral_config( num_attention_heads=num_attention_heads, num_key_value_heads=num_key_value_heads, head_dim=head_dim, - max_position_embeddings=_MISTRAL_SMALL_3_1_MAX_POSITION_EMBEDDINGS, - rms_norm_eps=_MISTRAL_SMALL_3_1_RMS_NORM_EPS, + max_position_embeddings=max_position_embeddings or _COW_MAX_POSITION_EMBEDDINGS, + rms_norm_eps=_COW_RMS_NORM_EPS, tie_word_embeddings=False, - rope_theta=_MISTRAL_SMALL_3_1_ROPE_THETA, + rope_theta=rope_theta or _COW_ROPE_THETA, attention_bias=False, attention_dropout=0.0, torch_dtype=torch_dtype, ) +def _read_gguf_metadata_value(path: Path, key: str) -> Any | None: + """Read a single named field from a GGUF file's metadata header. + + Returns ``None`` if the key is missing or the file/header can't be read — + callers must treat the return as best-effort and fall back to defaults. + """ + try: + import gguf + + reader = gguf.GGUFReader(path) + except Exception: + return None + field = reader.fields.get(key) + if field is None: + return None + try: + # GGUFReader exposes scalar fields under `.contents()` in recent gguf releases. + # Fall back to parts decoding for older versions. + if hasattr(field, "contents"): + return field.contents() + except Exception: + pass + import struct + + try: + if field.types[0].name in ("FLOAT32",): + return struct.unpack(" float | None: + value = _read_gguf_metadata_value(path, key) + return float(value) if isinstance(value, (int, float)) else None + + +def _read_gguf_metadata_int(path: Path, key: str) -> int | None: + value = _read_gguf_metadata_value(path, key) + return int(value) if isinstance(value, (int, float)) else None + + def _strip_known_prefixes(sd: dict[str, Any]) -> dict[str, Any]: """Strip wrapper prefixes used by some FLUX.2 single-file redistributions. @@ -245,50 +291,242 @@ def _drop_quantization_metadata(sd: dict[str, Any], logger) -> dict[str, Any]: return sd -def _load_processor_with_offline_fallback() -> AnyModel: - """Load a Mistral tokenizer / processor for FLUX.2 [dev] text encoding. +def _flatten_message_content(content: Any) -> str: + """Reduce HF chat-template content (str or [{type:"text", text:"..."}]) to plain text.""" + if isinstance(content, str): + return content + if isinstance(content, list): + parts: list[str] = [] + for item in content: + if isinstance(item, dict) and item.get("type") == "text": + parts.append(str(item.get("text", ""))) + return "".join(parts) + return str(content) + - Strategy: walk the fallback source list twice — first looking only at the - local HuggingFace cache, then with network lookups enabled. For each entry - we try ``AutoProcessor`` (multimodal Mistral3 processor, includes the - ``apply_chat_template`` we use) and then ``AutoTokenizer`` (text-only, used - when the source ships only tokenizer files without the multimodal - ``processor_config.json``). The first match wins. +class _TekkenChatTemplateAdapter: + """Expose HuggingFace's ``apply_chat_template`` surface backed by + ``mistral_common.MistralTokenizer``. + + The FLUX.2 [dev] invocation only calls ``apply_chat_template(messages, + tokenize=True, return_tensors='pt', padding='max_length', max_length=N)``, + so only that surface is implemented. """ - attempts: list[str] = [] - def _try(source: str, subfolder: Optional[str], local_only: bool) -> Optional[AnyModel]: - kwargs: dict[str, Any] = {"local_files_only": local_only} - if subfolder is not None: - kwargs["subfolder"] = subfolder - for loader_cls in (AutoProcessor, AutoTokenizer): - try: - return loader_cls.from_pretrained(source, **kwargs) - except (OSError, EnvironmentError, ValueError) as e: - attempts.append( - f"{loader_cls.__name__}({source}, subfolder={subfolder}, local_only={local_only}): {type(e).__name__}" - ) + def __init__(self, mistral_tokenizer: Any): + self._tok = mistral_tokenizer + # Mistral Small 3's id (token 11 in the Tekken vocab). + self.pad_token_id = 11 + + def apply_chat_template( + self, + messages: list[dict[str, Any]], + *, + tokenize: bool = True, + return_dict: bool = True, + return_tensors: str = "pt", + add_generation_prompt: bool = False, + padding: str | bool = "max_length", + truncation: bool = True, + max_length: int = 512, + **_kwargs: Any, + ) -> dict[str, torch.Tensor]: + if not tokenize or return_tensors != "pt": + raise NotImplementedError( + "_TekkenChatTemplateAdapter only supports tokenize=True / return_tensors='pt' " + f"(got tokenize={tokenize}, return_tensors={return_tensors})" + ) + + from mistral_common.protocol.instruct.messages import SystemMessage, UserMessage + from mistral_common.protocol.instruct.request import ChatCompletionRequest + + msgs: list[Any] = [] + for msg in messages: + role = msg.get("role") + content = _flatten_message_content(msg.get("content")) + if role == "system": + msgs.append(SystemMessage(content=content)) + elif role == "user": + msgs.append(UserMessage(content=content)) + + encoded = self._tok.encode_chat_completion(ChatCompletionRequest(messages=msgs)) + tokens: list[int] = list(encoded.tokens) + + if truncation and len(tokens) > max_length: + tokens = tokens[:max_length] + attention: list[int] = [1] * len(tokens) + + if padding == "max_length": + pad_needed = max_length - len(tokens) + if pad_needed > 0: + tokens.extend([self.pad_token_id] * pad_needed) + attention.extend([0] * pad_needed) + + return { + "input_ids": torch.tensor([tokens], dtype=torch.long), + "attention_mask": torch.tensor([attention], dtype=torch.long), + } + + +def _extract_tekken_bytes(model_path: Path) -> Optional[bytes]: + """Return the bytes of the embedded ``tekken_model`` blob if the file has one. + + Both Comfy-Org's safetensors and gguf-org's cow GGUFs ship the canonical + Tekken JSON inside a tensor named ``tekken_model``, but in incompatible + layouts: + + - **Comfy safetensors**: U8 tensor, raw bytes, ``shape=(N,)`` — direct read. + - **gguf-org cow GGUFs**: F16 tensor with one half-float per original byte + (so the float values are 0..255 cast to fp16, and ``shape=(N,)``). We + recover by casting each fp16 back to ``uint8``. + + Returns ``None`` if the file isn't a recognized container, doesn't embed + the blob, or reading fails. + """ + suffix = model_path.suffix.lower() + try: + if suffix == ".safetensors": + from safetensors import safe_open + + with safe_open(str(model_path), framework="pt") as f: + if "tekken_model" in f.keys(): + return f.get_tensor("tekken_model").cpu().numpy().tobytes() + elif suffix == ".gguf": + import gguf + import numpy as np + + reader = gguf.GGUFReader(str(model_path)) + for tensor in reader.tensors: + if tensor.name != "tekken_model": + continue + data = tensor.data + if data.dtype == np.uint8: + return data.tobytes() + # cow GGUFs (and friends) store one byte per fp16 value. + return np.clip(np.rint(data.astype(np.float32)), 0, 255).astype(np.uint8).tobytes() + except Exception: return None + return None + +def _try_load_embedded_tekken(model_path: Path, logger: Any) -> Optional[AnyModel]: + """Extract the embedded Tekken tokenizer and wrap it in the HF-compatible adapter. + + Returns ``None`` (so callers fall through to HF) if: + - the file isn't a single-file container, or + - no ``tekken_model`` blob is embedded, or + - ``mistral_common`` isn't installed, or + - the blob can't be parsed. + """ + if not model_path.is_file(): + return None + + tekken_bytes = _extract_tekken_bytes(model_path) + if tekken_bytes is None: + return None + + try: + from mistral_common.tokens.tokenizers.mistral import MistralTokenizer + except ImportError: + logger.info( + "Found embedded Tekken tokenizer in %s but mistral_common is not installed. " + "Run `pip install mistral-common` (or `uv add mistral-common`) to skip the " + "HuggingFace tokenizer fetch.", + model_path.name, + ) + return None + + import os + import tempfile + + fd, tmp_path = tempfile.mkstemp(suffix=".json", prefix="invokeai-tekken-") + try: + with os.fdopen(fd, "wb") as f: + f.write(tekken_bytes) + mistral_tok = MistralTokenizer.from_file(tmp_path) + except Exception as e: + logger.warning( + f"Failed to load embedded Tekken tokenizer from {model_path.name}: {type(e).__name__}: {e}. " + "Falling back to the HuggingFace BFL tokenizer." + ) + return None + finally: + try: + os.unlink(tmp_path) + except OSError: + pass + + logger.info(f"Loaded embedded Tekken tokenizer from {model_path.name}") + return _TekkenChatTemplateAdapter(mistral_tok) + + +def _load_tokenizer_from_hf(logger: Any) -> AnyModel: + """Download / load the BFL canonical FLUX.2 tokenizer from HuggingFace.""" + source, subfolder = _TOKENIZER_FALLBACK_SOURCE + attempts: list[str] = [] for local_only in (True, False): - for source, subfolder in _TOKENIZER_FALLBACK_SOURCES: - result = _try(source, subfolder, local_only) - if result is not None: - return result + for loader_cls in (AutoProcessor, AutoTokenizer): + try: + obj = loader_cls.from_pretrained(source, subfolder=subfolder, local_files_only=local_only) + logger.info( + f"Loaded Mistral processor/tokenizer: {type(obj).__name__} from " + f"{source}:{subfolder} (local_only={local_only})" + ) + return obj + except (OSError, EnvironmentError, ValueError) as e: + attempts.append(f"{loader_cls.__name__}(local_only={local_only}): {type(e).__name__}") - sources_str = ", ".join(f"{s}{f':{f}' if f else ''}" for s, f in _TOKENIZER_FALLBACK_SOURCES) raise RuntimeError( - "Could not load a Mistral tokenizer/processor for FLUX.2 [dev]. " - f"Tried (cached + online): {sources_str}. " - "Workarounds: (1) install the full FLUX.2-dev diffusers folder as a model in InvokeAI " - "(it bundles the tokenizer), (2) point HF_ENDPOINT at a reachable HuggingFace mirror " - "or run once with internet access to populate the local cache, " - "or (3) pre-cache the tokenizer with: " + f"Could not load FLUX.2 Mistral tokenizer from {source}:{subfolder}. " + "Workarounds: (1) install a Mistral encoder that embeds the Tekken tokenizer " + "(Comfy-Org safetensors or gguf-org cow GGUFs) and `pip install mistral-common`, " + "(2) run once with internet access to populate the HF cache, or " + "(3) pre-cache the tokenizer: " "`huggingface-cli download black-forest-labs/FLUX.2-dev --include 'tokenizer/*'`. " - f"Attempt details: {'; '.join(attempts[-6:])}" + f"Tried: {'; '.join(attempts)}" ) +def _load_tokenizer_for_model(model_path: Path, logger: Any) -> AnyModel: + """Load a tokenizer matching the given Mistral encoder model path. + + Strategy (first hit wins): + + 1. **Embedded Tekken** — Comfy-Org safetensors and gguf-org cow GGUFs ship + the canonical Tekken JSON as a ``tekken_model`` U8 tensor; we extract it + and wrap it via ``mistral_common``. + 2. **Sibling ``tokenizer/`` folder** — diffusers-style HuggingFace layouts. + 3. **BFL HuggingFace fallback** — fetches the canonical tokenizer from + ``black-forest-labs/FLUX.2-dev/tokenizer``. + """ + # 1. Single-file with embedded Tekken + embedded = _try_load_embedded_tekken(model_path, logger) + if embedded is not None: + return embedded + + # 2. Diffusers folder with sibling tokenizer/ + if model_path.is_dir(): + tokenizer_dir = model_path / "tokenizer" + if tokenizer_dir.exists(): + try: + obj = AutoProcessor.from_pretrained(tokenizer_dir, local_files_only=True) + logger.info(f"Loaded Mistral tokenizer from sibling tokenizer/: {type(obj).__name__}") + return obj + except (OSError, EnvironmentError, ValueError): + pass + # Some diffusers folders ship the encoder weights as text_encoder/*.safetensors + # which may embed Tekken — probe each in turn. + text_encoder_dir = model_path / "text_encoder" + if text_encoder_dir.is_dir(): + for st in sorted(text_encoder_dir.glob("*.safetensors")): + embedded = _try_load_embedded_tekken(st, logger) + if embedded is not None: + return embedded + + # 3. HF fallback + return _load_tokenizer_from_hf(logger) + + @ModelLoaderRegistry.register( base=BaseModelType.Any, type=ModelType.MistralEncoder, @@ -326,11 +564,15 @@ def _load_model( match submodel_type: case SubModelType.Tokenizer: - try: - return AutoProcessor.from_pretrained(tokenizer_path, local_files_only=True) - except (OSError, EnvironmentError): - # Fall back to the canonical FLUX.2-dev tokenizer subfolder on HF. - return _load_processor_with_offline_fallback() + logger = InvokeAILogger.get_logger("MistralEncoderProcessor") + # Try the sibling tokenizer/ first when the diffusers folder ships one, + # else fall through to the multi-strategy loader (embedded Tekken / HF). + if tokenizer_path.exists() and tokenizer_path != model_path: + try: + return AutoProcessor.from_pretrained(tokenizer_path, local_files_only=True) + except (OSError, EnvironmentError): + pass + return _load_tokenizer_for_model(model_path, logger) case SubModelType.TextEncoder: # Lazy import: transformers may load `Mistral3ForConditionalGeneration` # only when the diffusers/transformers version supports it. @@ -369,7 +611,8 @@ def _load_model( case SubModelType.TextEncoder: return self._load_text_encoder(config) case SubModelType.Tokenizer: - return _load_processor_with_offline_fallback() + logger = InvokeAILogger.get_logger("MistralEncoderProcessor") + return _load_tokenizer_for_model(Path(config.path), logger) raise ValueError( "Only Tokenizer and TextEncoder submodels are supported. " @@ -460,7 +703,8 @@ def _load_model( case SubModelType.TextEncoder: return self._load_from_gguf(config) case SubModelType.Tokenizer: - return _load_processor_with_offline_fallback() + logger = InvokeAILogger.get_logger("MistralEncoderProcessor") + return _load_tokenizer_for_model(Path(config.path), logger) raise ValueError( "Only Tokenizer and TextEncoder submodels are supported. " @@ -474,6 +718,16 @@ def _load_from_gguf(self, config: MistralEncoder_GGUF_Config) -> AnyModel: sd = gguf_sd_loader(Path(config.path), compute_dtype=compute_dtype) + # Read RoPE / context hyperparameters from the GGUF metadata before key + # conversion strips them. Mistral GGUFs use the llama.* prefix because + # they share llama.cpp's architecture family. Falling back silently is OK: + # `_build_mistral_config` defaults to Mistral Small 3.1 values when the + # override is None. + rope_theta = _read_gguf_metadata_float(Path(config.path), "llama.rope.freq_base") + max_pos = _read_gguf_metadata_int(Path(config.path), "llama.context_length") + if rope_theta is not None: + logger.info(f"GGUF metadata: rope_theta={rope_theta}, max_position={max_pos}") + # llama.cpp stores layers as `blk.N.*`. Normalize to transformers' `model.layers.N.*` if needed. is_llamacpp = any(isinstance(k, str) and k.startswith("blk.") for k in sd.keys()) if is_llamacpp: @@ -482,7 +736,12 @@ def _load_from_gguf(self, config: MistralEncoder_GGUF_Config) -> AnyModel: sd = _strip_known_prefixes(sd) - mistral_config = _build_mistral_config(sd, torch_dtype=compute_dtype) + mistral_config = _build_mistral_config( + sd, + torch_dtype=compute_dtype, + rope_theta=rope_theta, + max_position_embeddings=max_pos, + ) logger.info( f"Mistral encoder config (GGUF): layers={mistral_config.num_hidden_layers}, " f"hidden={mistral_config.hidden_size}, heads={mistral_config.num_attention_heads}, " diff --git a/invokeai/backend/model_manager/starter_models.py b/invokeai/backend/model_manager/starter_models.py index 82c213f7689..7aed1b342a2 100644 --- a/invokeai/backend/model_manager/starter_models.py +++ b/invokeai/backend/model_manager/starter_models.py @@ -1024,27 +1024,79 @@ class StarterModelBundle(BaseModel): # region FLUX.2 [dev] # -# FLUX.2 [dev] is BFL's 32B guidance-distilled rectified-flow model and uses Mistral -# Small 3.1 (24B) as its sole text encoder. The transformer alone is ~64 GB at full -# bf16, so we surface several quantized variants. All FLUX.2 [dev] releases are -# governed by the FLUX.2 Non-Commercial License. +# FLUX.2 [dev] is BFL's 32B guidance-distilled rectified-flow model. The bf16 +# transformer alone is ~64 GB, so most users want the GGUF quantizations from +# the curated `gguf-org/flux2-dev-gguf` repo (the same repo also ships the +# matching "cow-mistral3-small" text encoder — a FLUX.2-specific 30-layer +# Mistral distillation that BFL trained the joint attention against; the +# README notes "Q2 works, but use a higher tier encoder for better prompt +# adherence"). All FLUX.2 [dev] releases are governed by the FLUX.2 +# Non-Commercial License. + +# --- Text encoders --- +# Only the 30-layer "cow-mistral3-small" distillation works for FLUX.2 [dev]. +# BFL's joint attention was trained against hidden states at indices (10, 20, 30) +# of a 30-layer Mistral — extracting from upstream Mistral Small 3.1 / 3.2 (40 +# layers) samples at different relative depths and produces off-distribution +# embeddings. Both the gguf-org cow GGUFs and Comfy-Org's safetensors are the +# same 30-layer cow weights, just packaged differently. + +# Comfy-Org safetensors (single-file, 30-layer cow, with embedded Tekken tokenizer). +# Higher precision than the cow GGUFs and avoids the Tekken-via-HF-Hub fetch. +flux2_dev_comfy_mistral_fp8 = StarterModel( + name="FLUX.2 [dev] Mistral Encoder (Comfy FP8)", + base=BaseModelType.Any, + source="https://huggingface.co/Comfy-Org/flux2-dev/resolve/main/split_files/text_encoders/mistral_3_small_flux2_fp8.safetensors", + description="Comfy-Org FP8 of BFL's 30-layer cow-mistral3-small. Best quality/size for prompt adherence; embeds Tekken tokenizer (no HF fetch needed). ~18GB", + type=ModelType.MistralEncoder, +) + +flux2_dev_comfy_mistral_bf16 = StarterModel( + name="FLUX.2 [dev] Mistral Encoder (Comfy BF16)", + base=BaseModelType.Any, + source="https://huggingface.co/Comfy-Org/flux2-dev/resolve/main/split_files/text_encoders/mistral_3_small_flux2_bf16.safetensors", + description="Comfy-Org BF16 of BFL's 30-layer cow-mistral3-small. Reference precision; embeds Tekken tokenizer. ~35.6GB", + type=ModelType.MistralEncoder, +) + +flux2_dev_comfy_mistral_fp4 = StarterModel( + name="FLUX.2 [dev] Mistral Encoder (Comfy FP4 mixed)", + base=BaseModelType.Any, + source="https://huggingface.co/Comfy-Org/flux2-dev/resolve/main/split_files/text_encoders/mistral_3_small_flux2_fp4_mixed.safetensors", + description="Comfy-Org FP4-mixed of BFL's 30-layer cow-mistral3-small. Smallest safetensors variant; embeds Tekken tokenizer. ~12.3GB", + type=ModelType.MistralEncoder, +) + +# gguf-org cow GGUF variants (30-layer cow, llama.cpp packaging, also embed Tekken). +# Lower memory footprint than the Comfy safetensors but slightly lower fidelity. +flux2_dev_cow_mistral_q4 = StarterModel( + name="FLUX.2 [dev] cow Mistral Encoder (GGUF Q4)", + base=BaseModelType.Any, + source="https://huggingface.co/gguf-org/flux2-dev-gguf/resolve/main/cow-mistral3-small-q4_0.gguf", + description="cow-mistral3-small Q4_0 — 30-layer cow distillation BFL trained against. ~11.6GB", + type=ModelType.MistralEncoder, + format=ModelFormat.GGUFQuantized, +) -flux2_dev_mistral_encoder = StarterModel( - name="FLUX.2 [dev] Mistral Encoder", +flux2_dev_cow_mistral_q8 = StarterModel( + name="FLUX.2 [dev] cow Mistral Encoder (GGUF Q8)", base=BaseModelType.Any, - source="black-forest-labs/FLUX.2-dev::text_encoder+tokenizer", - description="Mistral Small 3.1 (24B) text encoder + tokenizer for FLUX.2 [dev]. ~48GB bf16", + source="https://huggingface.co/gguf-org/flux2-dev-gguf/resolve/main/cow-mistral3-small-q8_0.gguf", + description="cow-mistral3-small Q8_0 — best prompt adherence among cow GGUF quants. ~20GB", type=ModelType.MistralEncoder, + format=ModelFormat.GGUFQuantized, ) -flux2_dev_mistral_encoder_nf4 = StarterModel( - name="FLUX.2 [dev] Mistral Encoder (NF4)", +flux2_dev_cow_mistral_iq4_xs = StarterModel( + name="FLUX.2 [dev] cow Mistral Encoder (GGUF IQ4_XS)", base=BaseModelType.Any, - source="diffusers/FLUX.2-dev-bnb-4bit::text_encoder+tokenizer", - description="NF4-quantized Mistral Small 3.1 text encoder for FLUX.2 [dev]. ~12GB", + source="https://huggingface.co/gguf-org/flux2-dev-gguf/resolve/main/cow-mistral3-small-iq4_xs.gguf", + description="cow-mistral3-small IQ4_XS — smallest usable quant with reasonable adherence. ~11.1GB", type=ModelType.MistralEncoder, + format=ModelFormat.GGUFQuantized, ) +# --- Diffusers transformer --- flux2_dev_diffusers = StarterModel( name="FLUX.2 [dev] (Diffusers)", base=BaseModelType.Flux2, @@ -1061,34 +1113,57 @@ class StarterModelBundle(BaseModel): type=ModelType.Main, ) -flux2_dev_gguf_q4 = StarterModel( - name="FLUX.2 [dev] (GGUF Q4)", +# --- GGUF transformers from gguf-org/flux2-dev-gguf (canonical repo) --- +# These are the GGUFs BFL/community curate for cow-paired inference. Default +# encoder dependency is cow Q4 to make starter installs work out of the box. +flux2_dev_gguf_q3_k_m = StarterModel( + name="FLUX.2 [dev] Transformer (GGUF Q3_K_M)", + base=BaseModelType.Flux2, + source="https://huggingface.co/gguf-org/flux2-dev-gguf/resolve/main/flux2-dev-q3_k_m.gguf", + description="FLUX.2 [dev] transformer Q3_K_M — fits ~12GB VRAM with offload. ~15.9GB", + type=ModelType.Main, + format=ModelFormat.GGUFQuantized, + dependencies=[flux2_vae, flux2_dev_cow_mistral_q4], +) + +flux2_dev_gguf_q4_k_m = StarterModel( + name="FLUX.2 [dev] Transformer (GGUF Q4_K_M)", + base=BaseModelType.Flux2, + source="https://huggingface.co/gguf-org/flux2-dev-gguf/resolve/main/flux2-dev-q4_k_m.gguf", + description="FLUX.2 [dev] transformer Q4_K_M — good quality / size tradeoff. ~20GB", + type=ModelType.Main, + format=ModelFormat.GGUFQuantized, + dependencies=[flux2_vae, flux2_dev_cow_mistral_q4], +) + +flux2_dev_gguf_q5_k_m = StarterModel( + name="FLUX.2 [dev] Transformer (GGUF Q5_K_M)", base=BaseModelType.Flux2, - source="https://huggingface.co/city96/FLUX.2-dev-gguf/resolve/main/flux2_dev_Q4_K_M.gguf", - description="FLUX.2 [dev] transformer, GGUF Q4_K_M - ~18.7GB. Requires a separate FLUX.2 VAE and a Mistral encoder.", + source="https://huggingface.co/gguf-org/flux2-dev-gguf/resolve/main/flux2-dev-q5_k_m.gguf", + description="FLUX.2 [dev] transformer Q5_K_M — higher fidelity than Q4. ~24GB", type=ModelType.Main, format=ModelFormat.GGUFQuantized, - dependencies=[flux2_vae, flux2_dev_mistral_encoder_nf4], + dependencies=[flux2_vae, flux2_dev_cow_mistral_q8], ) -flux2_dev_gguf_q6 = StarterModel( - name="FLUX.2 [dev] (GGUF Q6)", +flux2_dev_gguf_q6_k = StarterModel( + name="FLUX.2 [dev] Transformer (GGUF Q6_K)", base=BaseModelType.Flux2, - source="https://huggingface.co/city96/FLUX.2-dev-gguf/resolve/main/flux2_dev_Q6_K.gguf", - description="FLUX.2 [dev] transformer, GGUF Q6_K - ~26.7GB. Requires a separate FLUX.2 VAE and a Mistral encoder.", + source="https://huggingface.co/gguf-org/flux2-dev-gguf/resolve/main/flux2-dev-q6_k.gguf", + description="FLUX.2 [dev] transformer Q6_K — near-Q8 quality at lower size. ~27.9GB", type=ModelType.Main, format=ModelFormat.GGUFQuantized, - dependencies=[flux2_vae, flux2_dev_mistral_encoder_nf4], + dependencies=[flux2_vae, flux2_dev_cow_mistral_q8], ) -flux2_dev_gguf_q8 = StarterModel( - name="FLUX.2 [dev] (GGUF Q8)", +flux2_dev_gguf_q8_0 = StarterModel( + name="FLUX.2 [dev] Transformer (GGUF Q8_0)", base=BaseModelType.Flux2, - source="https://huggingface.co/city96/FLUX.2-dev-gguf/resolve/main/flux2_dev_Q8_0.gguf", - description="FLUX.2 [dev] transformer, GGUF Q8_0 - ~34.5GB. Requires a separate FLUX.2 VAE and a Mistral encoder.", + source="https://huggingface.co/gguf-org/flux2-dev-gguf/resolve/main/flux2-dev-q8_0.gguf", + description="FLUX.2 [dev] transformer Q8_0 — highest GGUF fidelity. ~35.5GB", type=ModelType.Main, format=ModelFormat.GGUFQuantized, - dependencies=[flux2_vae, flux2_dev_mistral_encoder_nf4], + dependencies=[flux2_vae, flux2_dev_cow_mistral_q8], ) # endregion @@ -1733,13 +1808,19 @@ def _gemini_3_resolution_presets( flux2_klein_9b_gguf_q8, flux2_klein_qwen3_4b_encoder, flux2_klein_qwen3_8b_encoder, - flux2_dev_mistral_encoder, - flux2_dev_mistral_encoder_nf4, + flux2_dev_comfy_mistral_bf16, + flux2_dev_comfy_mistral_fp4, + flux2_dev_comfy_mistral_fp8, + flux2_dev_cow_mistral_iq4_xs, + flux2_dev_cow_mistral_q4, + flux2_dev_cow_mistral_q8, flux2_dev_diffusers, flux2_dev_diffusers_nf4, - flux2_dev_gguf_q4, - flux2_dev_gguf_q6, - flux2_dev_gguf_q8, + flux2_dev_gguf_q3_k_m, + flux2_dev_gguf_q4_k_m, + flux2_dev_gguf_q5_k_m, + flux2_dev_gguf_q6_k, + flux2_dev_gguf_q8_0, cogview4, qwen_image_vae, qwen_vl_encoder_fp8, diff --git a/invokeai/backend/model_manager/taxonomy.py b/invokeai/backend/model_manager/taxonomy.py index a7bcfff286f..15c0e305642 100644 --- a/invokeai/backend/model_manager/taxonomy.py +++ b/invokeai/backend/model_manager/taxonomy.py @@ -185,8 +185,13 @@ class Qwen3VariantType(str, Enum): class MistralVariantType(str, Enum): """Mistral text encoder variants used by FLUX.2 [dev].""" - Small3_1 = "mistral_small_3_1" - """Mistral Small 3.1 (24B, hidden_size=5120). Used by FLUX.2 [dev].""" + Cow = "cow_mistral3_small" + """The 30-layer BFL "cow-mistral3-small" distillation (hidden_size=5120) — + the only Mistral variant FLUX.2 [dev]'s joint attention was trained against. + Hidden states are sampled at indices (10, 20, 30) which on a 30-layer model + hit 1/3, 2/3, and the final layer. Upstream Mistral Small 3.1 / 3.2 (40 + layers) sample at different relative depths and produce off-distribution + embeddings, so they are not accepted as FLUX.2 text encoders.""" class ModelFormat(str, Enum): diff --git a/invokeai/frontend/web/public/locales/en.json b/invokeai/frontend/web/public/locales/en.json index 5f37034b624..685ee64b255 100644 --- a/invokeai/frontend/web/public/locales/en.json +++ b/invokeai/frontend/web/public/locales/en.json @@ -1036,6 +1036,7 @@ "noRecallParameters": "No parameters to recall found", "parameterSet": "Parameter {{parameter}} set", "parsingFailed": "Parsing Failed", + "mistralEncoder": "Mistral Encoder", "positivePrompt": "Positive Prompt", "qwen3Encoder": "Qwen3 Encoder", "qwen3Source": "Qwen3 Source", diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx index d24ff27323c..85a5896158d 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx @@ -66,6 +66,8 @@ export const ImageMetadataActions = memo((props: Props) => { + + ); diff --git a/invokeai/frontend/web/src/features/metadata/parsing.test.tsx b/invokeai/frontend/web/src/features/metadata/parsing.test.tsx index bb295303273..0cd7122b8d6 100644 --- a/invokeai/frontend/web/src/features/metadata/parsing.test.tsx +++ b/invokeai/frontend/web/src/features/metadata/parsing.test.tsx @@ -8,11 +8,12 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; // Module mocks // // We are testing only the *gating* logic of the model-related metadata -// handlers (`VAEModel`, `KleinVAEModel`, `KleinQwen3EncoderModel`). The actual -// model lookup goes through `parseModelIdentifier`, which dispatches RTK -// Query thunks. We stub the models endpoint so that any lookup resolves to a -// canned model identifier — the parse step then succeeds and the assertions -// inside each handler become observable. +// handlers (`VAEModel`, `KleinVAEModel`, `KleinQwen3EncoderModel`, +// `Flux2DevVAEModel`, `Flux2DevMistralEncoderModel`). The model lookup goes +// through `parseModelIdentifier`, which dispatches an RTK Query thunk. We stub +// the models endpoint so any lookup resolves to a canned model identifier — +// the parse step then succeeds and the assertions inside each handler become +// observable. // --------------------------------------------------------------------------- let currentBase: string | null = 'flux2'; @@ -22,7 +23,7 @@ vi.mock('features/controlLayers/store/paramsSlice', async (importOriginal) => { return { ...mod, selectBase: () => currentBase }; }); -const fakeModel = (type: 'vae' | 'qwen3_encoder', base: string) => ({ +const fakeModel = (type: 'vae' | 'qwen3_encoder' | 'mistral_encoder', base: string) => ({ key: `${type}-key`, hash: 'hash', name: `Some ${type}`, @@ -61,7 +62,7 @@ beforeEach(() => { describe('ImageMetadataHandlers — Klein recall gating', () => { describe('KleinVAEModel', () => { - it('parses metadata.vae when the current main model is FLUX.2 Klein', async () => { + it('parses metadata.vae for Klein images (no mistral_encoder field) when base is flux2', async () => { currentBase = 'flux2'; nextResolved = fakeModel('vae', 'flux2'); const store = makeStore(); @@ -72,17 +73,67 @@ describe('ImageMetadataHandlers — Klein recall gating', () => { expect(parsed.type).toBe('vae'); }); - it('rejects parsing when the current main model is not FLUX.2 Klein', async () => { + it('rejects when base is not flux2', async () => { currentBase = 'sdxl'; nextResolved = fakeModel('vae', 'flux2'); const store = makeStore(); await expect(ImageMetadataHandlers.KleinVAEModel.parse({ vae: nextResolved }, store)).rejects.toThrow(); }); + + it('rejects FLUX.2 [dev] images (mistral_encoder field present)', async () => { + currentBase = 'flux2'; + nextResolved = fakeModel('vae', 'flux2'); + const store = makeStore(); + + await expect( + ImageMetadataHandlers.KleinVAEModel.parse( + { vae: nextResolved, mistral_encoder: fakeModel('mistral_encoder', 'flux2') }, + store + ) + ).rejects.toThrow(); + }); + }); + + describe('Flux2DevVAEModel', () => { + it('parses metadata.vae for [dev] images (mistral_encoder field present)', async () => { + currentBase = 'flux2'; + nextResolved = fakeModel('vae', 'flux2'); + const store = makeStore(); + + const parsed = await ImageMetadataHandlers.Flux2DevVAEModel.parse( + { vae: nextResolved, mistral_encoder: fakeModel('mistral_encoder', 'flux2') }, + store + ); + + expect(parsed.key).toBe('vae-key'); + expect(parsed.type).toBe('vae'); + }); + + it('rejects Klein images (no mistral_encoder field)', async () => { + currentBase = 'flux2'; + nextResolved = fakeModel('vae', 'flux2'); + const store = makeStore(); + + await expect(ImageMetadataHandlers.Flux2DevVAEModel.parse({ vae: nextResolved }, store)).rejects.toThrow(); + }); + + it('rejects when base is not flux2', async () => { + currentBase = 'sdxl'; + nextResolved = fakeModel('vae', 'flux2'); + const store = makeStore(); + + await expect( + ImageMetadataHandlers.Flux2DevVAEModel.parse( + { vae: nextResolved, mistral_encoder: fakeModel('mistral_encoder', 'flux2') }, + store + ) + ).rejects.toThrow(); + }); }); describe('KleinQwen3EncoderModel', () => { - it('parses metadata.qwen3_encoder when the current main model is FLUX.2 Klein', async () => { + it('parses metadata.qwen3_encoder when base is flux2', async () => { currentBase = 'flux2'; nextResolved = fakeModel('qwen3_encoder', 'flux2'); const store = makeStore(); @@ -93,7 +144,7 @@ describe('ImageMetadataHandlers — Klein recall gating', () => { expect(parsed.type).toBe('qwen3_encoder'); }); - it('rejects parsing when the current main model is not FLUX.2 Klein', async () => { + it('rejects when base is not flux2', async () => { currentBase = 'sdxl'; nextResolved = fakeModel('qwen3_encoder', 'flux2'); const store = makeStore(); @@ -104,10 +155,36 @@ describe('ImageMetadataHandlers — Klein recall gating', () => { }); }); + describe('Flux2DevMistralEncoderModel', () => { + it('parses metadata.mistral_encoder when base is flux2', async () => { + currentBase = 'flux2'; + nextResolved = fakeModel('mistral_encoder', 'flux2'); + const store = makeStore(); + + const parsed = await ImageMetadataHandlers.Flux2DevMistralEncoderModel.parse( + { mistral_encoder: nextResolved }, + store + ); + + expect(parsed.key).toBe('mistral_encoder-key'); + expect(parsed.type).toBe('mistral_encoder'); + }); + + it('rejects when base is not flux2', async () => { + currentBase = 'sdxl'; + nextResolved = fakeModel('mistral_encoder', 'flux2'); + const store = makeStore(); + + await expect( + ImageMetadataHandlers.Flux2DevMistralEncoderModel.parse({ mistral_encoder: nextResolved }, store) + ).rejects.toThrow(); + }); + }); + describe('VAEModel (generic)', () => { // The generic VAEModel handler must NOT also fire for FLUX.2 / Z-Image // images, otherwise the metadata viewer renders duplicate VAE rows next - // to the dedicated KleinVAEModel / ZImageVAEModel handlers. + // to the dedicated KleinVAEModel / Flux2DevVAEModel / ZImageVAEModel handlers. it.each(['flux2', 'z-image'])('rejects parsing when current base is %s', async (base) => { currentBase = base; nextResolved = fakeModel('vae', base); diff --git a/invokeai/frontend/web/src/features/metadata/parsing.tsx b/invokeai/frontend/web/src/features/metadata/parsing.tsx index 60c6ba49fcb..29d45cb83ef 100644 --- a/invokeai/frontend/web/src/features/metadata/parsing.tsx +++ b/invokeai/frontend/web/src/features/metadata/parsing.tsx @@ -11,6 +11,8 @@ import { animaQwen3EncoderModelSelected, animaT5EncoderModelSelected, animaVaeModelSelected, + flux2DevMistralEncoderModelSelected, + flux2DevVaeModelSelected, geminiTemperatureChanged, geminiThinkingLevelChanged, heightChanged, @@ -1215,9 +1217,16 @@ const KleinVAEModel: SingleMetadataHandler = { const raw = getProperty(metadata, 'vae'); const parsed = await parseModelIdentifier(raw, store, 'vae'); assert(parsed.type === 'vae'); - // Only recall if the current main model is FLUX.2 Klein + // FLUX.2 Klein and FLUX.2 [dev] both have base `flux2` and write the VAE + // under `metadata.vae`. They use the presence of `mistral_encoder` (dev + // only) vs `qwen3_encoder` (Klein only) as a distinguisher so each VAE + // handler dispatches into its own slice. const base = selectBase(store.getState()); assert(base === 'flux2', 'KleinVAEModel handler only works with FLUX.2 Klein models'); + assert( + getProperty(metadata, 'mistral_encoder') === undefined, + 'KleinVAEModel does not handle FLUX.2 [dev] images (mistral_encoder present)' + ); return Promise.resolve(parsed); }, recall: (value, store) => { @@ -1231,6 +1240,36 @@ const KleinVAEModel: SingleMetadataHandler = { }; //#endregion KleinVAEModel +//#region Flux2DevVAEModel +const Flux2DevVAEModel: SingleMetadataHandler = { + [SingleMetadataKey]: true, + type: 'Flux2DevVAEModel', + parse: async (metadata, store) => { + const raw = getProperty(metadata, 'vae'); + const parsed = await parseModelIdentifier(raw, store, 'vae'); + assert(parsed.type === 'vae'); + const base = selectBase(store.getState()); + assert(base === 'flux2', 'Flux2DevVAEModel handler only works with FLUX.2 models'); + // FLUX.2 [dev] images always carry a `mistral_encoder` field; Klein images + // carry `qwen3_encoder` instead. This is the disambiguator that keeps dev's + // VAE recall from clobbering Klein's slice (and vice versa). + assert( + getProperty(metadata, 'mistral_encoder') !== undefined, + 'Flux2DevVAEModel handler only fires on FLUX.2 [dev] images (mistral_encoder must be present)' + ); + return Promise.resolve(parsed); + }, + recall: (value, store) => { + store.dispatch(flux2DevVaeModelSelected(value)); + }, + i18nKey: 'metadata.vae', + LabelComponent: MetadataLabel, + ValueComponent: ({ value }: SingleMetadataValueProps) => ( + + ), +}; +//#endregion Flux2DevVAEModel + //#region KleinQwen3EncoderModel const KleinQwen3EncoderModel: SingleMetadataHandler = { [SingleMetadataKey]: true, @@ -1239,7 +1278,8 @@ const KleinQwen3EncoderModel: SingleMetadataHandler = { const raw = getProperty(metadata, 'qwen3_encoder'); const parsed = await parseModelIdentifier(raw, store, 'qwen3_encoder'); assert(parsed.type === 'qwen3_encoder'); - // Only recall if the current main model is FLUX.2 Klein + // qwen3_encoder is Klein-only metadata; dev never writes it. Just gate on + // base. (parseModelIdentifier already rejects when the field is absent.) const base = selectBase(store.getState()); assert(base === 'flux2', 'KleinQwen3EncoderModel handler only works with FLUX.2 Klein models'); return Promise.resolve(parsed); @@ -1255,6 +1295,31 @@ const KleinQwen3EncoderModel: SingleMetadataHandler = { }; //#endregion KleinQwen3EncoderModel +//#region Flux2DevMistralEncoderModel +const Flux2DevMistralEncoderModel: SingleMetadataHandler = { + [SingleMetadataKey]: true, + type: 'Flux2DevMistralEncoderModel', + parse: async (metadata, store) => { + const raw = getProperty(metadata, 'mistral_encoder'); + const parsed = await parseModelIdentifier(raw, store, 'mistral_encoder'); + assert(parsed.type === 'mistral_encoder'); + // mistral_encoder is dev-only metadata; Klein never writes it. Just gate on + // base. (parseModelIdentifier already rejects when the field is absent.) + const base = selectBase(store.getState()); + assert(base === 'flux2', 'Flux2DevMistralEncoderModel handler only works with FLUX.2 models'); + return Promise.resolve(parsed); + }, + recall: (value, store) => { + store.dispatch(flux2DevMistralEncoderModelSelected(value)); + }, + i18nKey: 'metadata.mistralEncoder', + LabelComponent: MetadataLabel, + ValueComponent: ({ value }: SingleMetadataValueProps) => ( + + ), +}; +//#endregion Flux2DevMistralEncoderModel + //#region LoRAs const LoRAs: CollectionMetadataHandler = { [CollectionMetadataKey]: true, @@ -1657,6 +1722,8 @@ export const ImageMetadataHandlers = { AnimaT5EncoderModel, KleinVAEModel, KleinQwen3EncoderModel, + Flux2DevVAEModel, + Flux2DevMistralEncoderModel, ZImageSeedVarianceEnabled, ZImageSeedVarianceStrength, ZImageSeedVarianceRandomizePercent, diff --git a/invokeai/frontend/web/src/features/modelManagerV2/models.ts b/invokeai/frontend/web/src/features/modelManagerV2/models.ts index f86a39bb675..b34986f58f2 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/models.ts +++ b/invokeai/frontend/web/src/features/modelManagerV2/models.ts @@ -262,7 +262,7 @@ export const MODEL_VARIANT_TO_LONG_NAME: Record = { qwen3_4b: 'Qwen3 4B', qwen3_8b: 'Qwen3 8B', qwen3_06b: 'Qwen3 0.6B', - mistral_small_3_1: 'Mistral Small 3.1', + cow_mistral3_small: 'cow-mistral3-small (FLUX.2)', }; export const MODEL_FORMAT_TO_LONG_NAME: Record = { diff --git a/invokeai/frontend/web/src/features/nodes/types/common.ts b/invokeai/frontend/web/src/features/nodes/types/common.ts index b4a46b5af99..ab335f61f8c 100644 --- a/invokeai/frontend/web/src/features/nodes/types/common.ts +++ b/invokeai/frontend/web/src/features/nodes/types/common.ts @@ -165,7 +165,7 @@ export const zFlux2VariantType = z.enum(['klein_4b', 'klein_4b_base', 'klein_9b' export const zZImageVariantType = z.enum(['turbo', 'zbase']); const zQwenImageVariantType = z.enum(['generate', 'edit']); export const zQwen3VariantType = z.enum(['qwen3_4b', 'qwen3_8b', 'qwen3_06b']); -export const zMistralVariantType = z.enum(['mistral_small_3_1']); +export const zMistralVariantType = z.enum(['cow_mistral3_small']); export const zAnyModelVariant = z.union([ zModelVariantType, zClipVariantType, diff --git a/invokeai/frontend/web/src/services/api/schema.ts b/invokeai/frontend/web/src/services/api/schema.ts index cebbf3e2643..ce790b571d7 100644 --- a/invokeai/frontend/web/src/services/api/schema.ts +++ b/invokeai/frontend/web/src/services/api/schema.ts @@ -23554,6 +23554,10 @@ export type components = { /** * MistralEncoder_Checkpoint_Config * @description Configuration for a single-file Mistral text encoder (safetensors). + * + * Only the 30-layer cow distillation is accepted (e.g. Comfy-Org's bf16/fp8/fp4 + * files). Upstream Mistral Small 3.1 / 3.2 single-files are rejected — they have + * 40 layers and produce off-distribution embeddings for FLUX.2's joint attention. */ MistralEncoder_Checkpoint_Config: { /** @@ -23650,6 +23654,10 @@ export type components = { * * Does NOT match a full FLUX.2 pipeline directory — those are picked up by the * `Main_Diffusers_Flux2_Config` instead. + * + * Only the 30-layer cow distillation is accepted; upstream Mistral Small 3.1 / 3.2 + * (40 layers) produces off-distribution embeddings under FLUX.2's (10, 20, 30) + * hidden-state extraction. */ MistralEncoder_Diffusers_Config: { /** @@ -23733,6 +23741,8 @@ export type components = { /** * MistralEncoder_GGUF_Config * @description Configuration for a GGUF-quantized Mistral text encoder. + * + * Only the 30-layer cow distillation is accepted — see ``MistralEncoder_Checkpoint_Config``. */ MistralEncoder_GGUF_Config: { /** @@ -23823,7 +23833,7 @@ export type components = { * @description Mistral text encoder variants used by FLUX.2 [dev]. * @enum {string} */ - MistralVariantType: "mistral_small_3_1"; + MistralVariantType: "cow_mistral3_small"; /** * ModelFormat * @description Storage format of model. diff --git a/pyproject.toml b/pyproject.toml index 155471d9067..1c175224b6a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,6 +39,7 @@ dependencies = [ "diffusers[torch]==0.37.0", "gguf", "mediapipe==0.10.14", # needed for "mediapipeface" controlnet model + "mistral-common", # canonical Tekken tokenizer for FLUX.2 [dev] Mistral encoder "numpy<2.0.0", "onnx==1.16.1", "onnxruntime==1.19.2", From 95f810e478e27476ed905b002c8694e6e94e5401 Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Sat, 6 Jun 2026 03:50:13 +0200 Subject: [PATCH 05/25] feat(flux2-dev): match ComfyUI's Mistral reference + accept 40-layer encoders MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After studying ComfyUI's `Flux2Tokenizer` / `Mistral3_24BModel` reference implementation, align the FLUX.2 [dev] text-encoder path with their setup: - Probing now accepts both 30-layer (cow distillation) and 40-layer (Mistral Small 3, BFL canonical / upstream) Mistrals. Re-adds `MistralVariantType.Mistral24B` alongside `Cow`. All three configs (Diffusers / Checkpoint / GGUF) updated. - Loaders strip `model.norm` (replace with Identity) when the loaded weights are the 30-layer cow distillation. Matches Comfy's `final_norm=False` for the pruned variant; for transformers' `MistralModel` the final RMSNorm is always built but the cow was trained against the raw post-layer-29 state. - 40-layer loads now log a clear warning that upstream Mistral 3.1 / 3.2 is NOT what FLUX.2's joint attention was trained against and recommends the Comfy-Org bf16/fp8/fp4 or gguf-org cow GGUF variants. BFL's canonical bundled text_encoder is also 40-layer so we don't hard-reject; the warning is opt-in self-discipline. - Text encoder invocation switches from `apply_chat_template(messages, ...)` to a raw text template `[SYSTEM_PROMPT]{sys}[/SYSTEM_PROMPT][INST]{prompt}[/INST]` fed straight to the tokenizer — byte-for-byte matches Comfy's `Flux2Tokenizer.llama_template.format(text)`. System prompt now includes the literal `\n` between "object" and "attribution" Comfy ships. - `_TekkenChatTemplateAdapter` renamed to `_TekkenRawTextAdapter` and exposes a `__call__(text, padding_side='left', ...)` interface that Tekken-encodes the raw string (BOS=1, no EOS) and left-pads with token id 11. Matches Comfy's `pad_left=True` / `pad_token=11` settings. Frontend types extended for the new `mistral3_24b` variant (zMistralVariantType, MODEL_VARIANT_TO_LONG_NAME, schema.ts). --- .../app/invocations/flux2_dev_text_encoder.py | 103 +++++------ .../model_manager/configs/mistral_encoder.py | 104 ++++++----- .../load/model_loaders/mistral_encoder.py | 166 ++++++++++++------ invokeai/backend/model_manager/taxonomy.py | 18 +- .../web/src/features/modelManagerV2/models.ts | 1 + .../web/src/features/nodes/types/common.ts | 2 +- .../frontend/web/src/services/api/schema.ts | 2 +- 7 files changed, 237 insertions(+), 159 deletions(-) diff --git a/invokeai/app/invocations/flux2_dev_text_encoder.py b/invokeai/app/invocations/flux2_dev_text_encoder.py index 22beb6c8e22..049070f1fcb 100644 --- a/invokeai/app/invocations/flux2_dev_text_encoder.py +++ b/invokeai/app/invocations/flux2_dev_text_encoder.py @@ -16,7 +16,7 @@ """ from contextlib import ExitStack -from typing import Iterator, Literal, Optional, Tuple +from typing import Any, Iterator, Literal, Optional, Tuple, cast import torch from transformers import PreTrainedModel @@ -40,20 +40,27 @@ from invokeai.backend.stable_diffusion.diffusion.conditioning_data import ConditioningFieldData, FLUXConditioningInfo from invokeai.backend.util.devices import TorchDevice -# System prompt used by the FLUX.2 [dev] reference pipeline. Biasing the model -# toward structured image descriptions produces the embedding distribution the -# transformer was trained to consume. +# System prompt used by the FLUX.2 [dev] reference pipeline. Byte-for-byte +# identical to ComfyUI's ``Flux2Tokenizer.llama_template`` — note the literal +# ``\n`` between "object" and "attribution"; that's part of the trained-against +# token sequence, not a formatting artifact. FLUX2_DEV_SYSTEM_MESSAGE = ( "You are an AI that reasons about image descriptions. You give structured " - "responses focusing on object relationships, object attribution and actions " + "responses focusing on object relationships, object\nattribution and actions " "without speculation." ) +# Raw chat template fed straight to the tokenizer — matches Comfy's approach +# (no ``apply_chat_template`` indirection). ``[SYSTEM_PROMPT]`` / ``[INST]`` are +# special tokens in Mistral Small 3's Tekken vocab, so the encoder produces the +# exact token sequence BFL trained the joint attention against. +FLUX2_DEV_PROMPT_TEMPLATE = "[SYSTEM_PROMPT]{system}[/SYSTEM_PROMPT][INST]{prompt}[/INST]" + # Indices into hidden_states[] (hidden_states[0] is the embedding output) that -# FLUX.2 [dev]'s joint attention was trained to consume. Hard-coded to the -# 30-layer cow Mistral — (10, 20, 30) hits (1/3, 2/3, last) for that depth. -# The model loaders reject anything other than 30-layer cow weights, so we don't -# need a scaling fallback here. +# FLUX.2 [dev]'s joint attention was trained to consume. ComfyUI uses these +# same indices for both the 30-layer cow distillation and the 40-layer Mistral +# Small 3; for cow they hit (1/3, 2/3, last), and the loader strips the final +# RMSNorm so the layer-30 readout is the raw post-layer-29 state. DEV_EXTRACTION_LAYERS = (10, 20, 30) # Default max sequence length for FLUX.2 [dev]. The reference pipeline caps at 512. @@ -142,58 +149,32 @@ def _encode_prompt(self, context: InvocationContext, exit_stack: ExitStack) -> t "The Mistral encoder model may be corrupted or incompatible." ) - # Two valid chat-template content shapes depending on the loaded artifact: - # - Multimodal Mistral3 processors (PixtralProcessor / Mistral3Processor) want - # `[{type: "text", text: ...}]` even for text-only prompts and crash on a - # plain string with `string indices must be integers`. - # - Plain AutoTokenizer / MistralTokenizer want simple string content and - # may fail on the dict-list form depending on the template. - # We try multimodal first (matches BFL's canonical FLUX.2-dev processor), - # then fall back to string content, then to manual [INST]...[/INST] format. - multimodal_messages = [ - {"role": "system", "content": [{"type": "text", "text": FLUX2_DEV_SYSTEM_MESSAGE}]}, - {"role": "user", "content": [{"type": "text", "text": self.prompt}]}, - ] - plain_messages = [ - {"role": "system", "content": FLUX2_DEV_SYSTEM_MESSAGE}, - {"role": "user", "content": self.prompt}, - ] - - tokenize_kwargs = { - "tokenize": True, - "return_dict": True, - "return_tensors": "pt", - "add_generation_prompt": False, - "padding": "max_length", - "truncation": True, - "max_length": self.max_seq_len, - } - - inputs = None - last_error: Exception | None = None - for messages in (multimodal_messages, plain_messages): - try: - inputs = processor.apply_chat_template(messages, **tokenize_kwargs) - break - except (AttributeError, ValueError, TypeError, KeyError) as e: - last_error = e - - if inputs is None: - # Fallback: no usable chat template. Format the prompt manually using - # Mistral's classic [INST]...[/INST] convention. - context.logger.debug( - f"Mistral chat template failed ({type(last_error).__name__}: {last_error}); " - "falling back to manual [INST] formatting." - ) - text = f"[INST] {FLUX2_DEV_SYSTEM_MESSAGE}\n\n{self.prompt} [/INST]" - inputs = processor( - text, - return_tensors="pt", - padding="max_length", - truncation=True, - max_length=self.max_seq_len, - ) - + # Build the raw FLUX.2 [dev] prompt template — matches ComfyUI's + # `Flux2Tokenizer.llama_template.format(text)` byte-for-byte. `[SYSTEM_PROMPT]`, + # `[/SYSTEM_PROMPT]`, `[INST]`, `[/INST]` are Tekken special tokens, so any of + # the three processors we can land on (Pixtral/Mistral3 processor, plain HF + # LlamaTokenizerFast, our embedded-Tekken adapter) emit the same sequence. + text = FLUX2_DEV_PROMPT_TEMPLATE.format(system=FLUX2_DEV_SYSTEM_MESSAGE, prompt=self.prompt) + + # Comfy pads on the LEFT (`pad_left=True`), keeping the meaningful tokens + # at the right edge of the sequence. HF processors expose this via the + # `padding_side` attribute on their underlying tokenizer; we set it + # explicitly so the call matches Comfy's behavior regardless of the + # tokenizer's default. `processor` is typed as the `AnyModel` union; + # narrow to `Any` for the duration of the tokenizer call. + proc = cast(Any, processor) + tokenizer = getattr(proc, "tokenizer", proc) + if hasattr(tokenizer, "padding_side"): + tokenizer.padding_side = "left" + + inputs = proc( + text, + return_tensors="pt", + padding="max_length", + padding_side="left", + truncation=True, + max_length=self.max_seq_len, + ) input_ids = inputs["input_ids"].to(device) attention_mask = inputs["attention_mask"].to(device) diff --git a/invokeai/backend/model_manager/configs/mistral_encoder.py b/invokeai/backend/model_manager/configs/mistral_encoder.py index 6bf8bd634f1..d14f7003f18 100644 --- a/invokeai/backend/model_manager/configs/mistral_encoder.py +++ b/invokeai/backend/model_manager/configs/mistral_encoder.py @@ -15,15 +15,18 @@ from invokeai.backend.model_manager.taxonomy import BaseModelType, MistralVariantType, ModelFormat, ModelType from invokeai.backend.quantization.gguf.ggml_tensor import GGMLTensor -# Mistral cow distillation hidden_size. Used by FLUX.2 [dev]. -_COW_HIDDEN_SIZE = 5120 - -# Layer count of the BFL "cow-mistral3-small" distillation. FLUX.2 [dev]'s joint -# attention was trained with hidden-state indices (10, 20, 30) — for a 30-layer -# Mistral that's (1/3, 2/3, last). Upstream Mistral Small 3.1 / 3.2 (40 layers) -# sample at different relative depths and produce off-distribution embeddings, -# so we reject anything but 30-layer cow encoders. +# Mistral Small 3 family hidden_size — both the BFL canonical 40-layer encoder +# (``black-forest-labs/FLUX.2-dev/text_encoder``) and the 30-layer "cow" community +# distillation share this. Anything else is rejected as not a FLUX.2 encoder. +_MISTRAL_3_HIDDEN_SIZE = 5120 + +# Layer counts ComfyUI's reference implementation accepts: +# - 40 layers → BFL canonical (Mistral3_24B), keep final RMSNorm enabled. +# - 30 layers → BFL "cow" distillation, final RMSNorm dropped at load time. +# Anything else is rejected. +_MISTRAL_24B_NUM_LAYERS = 40 _COW_NUM_LAYERS = 30 +_ACCEPTED_NUM_LAYERS = (_COW_NUM_LAYERS, _MISTRAL_24B_NUM_LAYERS) def _has_mistral_keys(state_dict: dict[str | int, Any]) -> bool: @@ -104,25 +107,30 @@ def _embed_hidden_size(state_dict: dict[str | int, Any]) -> int | None: return None -def _is_cow_state_dict(state_dict: dict[str | int, Any]) -> bool: - """Check whether a state dict matches the 30-layer cow distillation. +def _get_mistral_variant_from_state_dict(state_dict: dict[str | int, Any]) -> MistralVariantType | None: + """Return the Mistral variant for a state dict, or ``None`` if unrecognized. - FLUX.2 [dev] only works with the 30-layer cow-mistral3-small weights — upstream - Mistral Small 3.1 / 3.2 (40 layers) produce off-distribution embeddings under - the (10, 20, 30) hidden-state extraction the joint attention was trained for. + Recognized variants: + - 30-layer + hidden_size=5120 → ``MistralVariantType.Cow`` (BFL distillation) + - 40-layer + hidden_size=5120 → ``MistralVariantType.Mistral24B`` (BFL canonical / upstream Mistral Small 3.x) """ - if _embed_hidden_size(state_dict) != _COW_HIDDEN_SIZE: - return False - return _count_mistral_layers(state_dict) == _COW_NUM_LAYERS + if _embed_hidden_size(state_dict) != _MISTRAL_3_HIDDEN_SIZE: + return None + num_layers = _count_mistral_layers(state_dict) + if num_layers == _COW_NUM_LAYERS: + return MistralVariantType.Cow + if num_layers == _MISTRAL_24B_NUM_LAYERS: + return MistralVariantType.Mistral24B + return None -def _is_cow_config(config_path) -> bool: - """Check a HF ``config.json`` for the 30-layer cow Mistral signature.""" +def _get_mistral_variant_from_config(config_path) -> MistralVariantType | None: + """Return the Mistral variant for a HF ``config.json``, or ``None`` if unrecognized.""" try: with open(config_path, "r", encoding="utf-8") as f: config = json.load(f) except (json.JSONDecodeError, OSError): - return False + return None # Mistral3ForConditionalGeneration nests the LM config under text_config. hidden_size = config.get("hidden_size") @@ -134,7 +142,13 @@ def _is_cow_config(config_path) -> bool: if num_layers is None: num_layers = text_config.get("num_hidden_layers") - return hidden_size == _COW_HIDDEN_SIZE and num_layers == _COW_NUM_LAYERS + if hidden_size != _MISTRAL_3_HIDDEN_SIZE: + return None + if num_layers == _COW_NUM_LAYERS: + return MistralVariantType.Cow + if num_layers == _MISTRAL_24B_NUM_LAYERS: + return MistralVariantType.Mistral24B + return None class MistralEncoder_Diffusers_Config(Config_Base): @@ -148,9 +162,13 @@ class MistralEncoder_Diffusers_Config(Config_Base): Does NOT match a full FLUX.2 pipeline directory — those are picked up by the `Main_Diffusers_Flux2_Config` instead. - Only the 30-layer cow distillation is accepted; upstream Mistral Small 3.1 / 3.2 - (40 layers) produces off-distribution embeddings under FLUX.2's (10, 20, 30) - hidden-state extraction. + Accepts both: + - 30-layer "cow" distillation (recommended, produces the cleanest output) + - 40-layer Mistral Small 3 (BFL canonical / upstream Mistral 3.x — also works, + slightly weaker prompt adherence than cow in our tests) + + The variant field records which one was probed so the loader can decide + whether to keep the final RMSNorm (40-layer) or strip it (30-layer cow). """ base: Literal[BaseModelType.Any] = Field(default=BaseModelType.Any) @@ -191,21 +209,22 @@ def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) - }, ) - if not _is_cow_config(expected_config_path): + variant = _get_mistral_variant_from_config(expected_config_path) + if variant is None: raise NotAMatchError( - "config.json describes a non-cow Mistral (expected hidden_size=5120, num_hidden_layers=30). " - "Only the 30-layer cow-mistral3-small distillation is supported for FLUX.2 [dev]." + f"config.json does not describe a recognized Mistral variant " + f"(expected hidden_size={_MISTRAL_3_HIDDEN_SIZE} and num_hidden_layers in {_ACCEPTED_NUM_LAYERS})." ) - return cls(variant=MistralVariantType.Cow, **override_fields) + return cls(variant=variant, **override_fields) class MistralEncoder_Checkpoint_Config(Checkpoint_Config_Base, Config_Base): """Configuration for a single-file Mistral text encoder (safetensors). - Only the 30-layer cow distillation is accepted (e.g. Comfy-Org's bf16/fp8/fp4 - files). Upstream Mistral Small 3.1 / 3.2 single-files are rejected — they have - 40 layers and produce off-distribution embeddings for FLUX.2's joint attention. + Accepts both 30-layer cow (Comfy-Org bf16/fp8/fp4) and 40-layer Mistral Small 3 + (BFL canonical / upstream Mistral 3.x single-files). The loader uses the + detected variant to decide whether to keep or strip the final RMSNorm. """ base: Literal[BaseModelType.Any] = Field(default=BaseModelType.Any) @@ -228,20 +247,22 @@ def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) - if _has_ggml_tensors(state_dict): raise NotAMatchError("state dict looks like GGUF quantized") - if not _is_cow_state_dict(state_dict): + variant = _get_mistral_variant_from_state_dict(state_dict) + if variant is None: raise NotAMatchError( - f"not a 30-layer cow-mistral3-small (got hidden_size={_embed_hidden_size(state_dict)}, " - f"layers={_count_mistral_layers(state_dict)}). FLUX.2 [dev] only works with the 30-layer " - "cow distillation — upstream Mistral Small 3.1 / 3.2 (40 layers) produces wrong embeddings." + f"unrecognized Mistral geometry (got hidden_size={_embed_hidden_size(state_dict)}, " + f"layers={_count_mistral_layers(state_dict)}). Expected hidden_size={_MISTRAL_3_HIDDEN_SIZE} " + f"and num_hidden_layers in {_ACCEPTED_NUM_LAYERS}." ) - return cls(variant=MistralVariantType.Cow, **override_fields) + return cls(variant=variant, **override_fields) class MistralEncoder_GGUF_Config(Checkpoint_Config_Base, Config_Base): """Configuration for a GGUF-quantized Mistral text encoder. - Only the 30-layer cow distillation is accepted — see ``MistralEncoder_Checkpoint_Config``. + Accepts both 30-layer cow GGUFs and 40-layer Mistral Small 3 GGUFs — see + ``MistralEncoder_Checkpoint_Config`` for variant handling. """ base: Literal[BaseModelType.Any] = Field(default=BaseModelType.Any) @@ -264,11 +285,12 @@ def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) - if not _has_ggml_tensors(state_dict): raise NotAMatchError("state dict does not look like GGUF quantized") - if not _is_cow_state_dict(state_dict): + variant = _get_mistral_variant_from_state_dict(state_dict) + if variant is None: raise NotAMatchError( - f"not a 30-layer cow-mistral3-small (got hidden_size={_embed_hidden_size(state_dict)}, " - f"layers={_count_mistral_layers(state_dict)}). FLUX.2 [dev] only works with the 30-layer " - "cow distillation — upstream Mistral Small 3.1 / 3.2 (40 layers) produces wrong embeddings." + f"unrecognized Mistral geometry (got hidden_size={_embed_hidden_size(state_dict)}, " + f"layers={_count_mistral_layers(state_dict)}). Expected hidden_size={_MISTRAL_3_HIDDEN_SIZE} " + f"and num_hidden_layers in {_ACCEPTED_NUM_LAYERS}." ) - return cls(variant=MistralVariantType.Cow, **override_fields) + return cls(variant=variant, **override_fields) diff --git a/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py b/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py index 457528a5ffb..c91dd6b3bcf 100644 --- a/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py +++ b/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py @@ -48,6 +48,7 @@ _COW_HIDDEN_SIZE = 5120 _COW_INTERMEDIATE_SIZE = 32768 _COW_NUM_HIDDEN_LAYERS = 30 +_MISTRAL_24B_NUM_HIDDEN_LAYERS = 40 _COW_NUM_ATTENTION_HEADS = 32 _COW_NUM_KV_HEADS = 8 # grouped-query attention _COW_HEAD_DIM = 128 @@ -254,6 +255,53 @@ def _materialize_remaining_meta_tensors(model: torch.nn.Module, dtype: torch.dty ) +def _strip_final_norm_for_cow(model: torch.nn.Module, num_hidden_layers: int, logger: Any) -> None: + """Replace ``model.norm`` with ``Identity`` for the 30-layer cow distillation. + + ComfyUI's reference implementation (``Mistral3_24BModel`` with ``num_layers=30``) + sets ``final_norm=False``, so the hidden state at extraction index 30 is the + raw output of layer 29 — NOT the final-RMSNorm'd version. Transformers' + ``MistralModel`` always builds a final ``model.norm`` and applies it to + ``hidden_states[-1]`` when ``output_hidden_states=True``, which produces + off-distribution embeddings for the cow weights. Swap the norm out for an + identity here so our extraction matches Comfy / BFL. + + The 40-layer Mistral Small 3 variant keeps the final norm. + """ + if num_hidden_layers != _COW_NUM_HIDDEN_LAYERS: + return + if not hasattr(model, "norm"): + return + model.norm = torch.nn.Identity() + logger.info("Replaced model.norm with Identity for 30-layer cow Mistral (final_norm=False).") + + +def _warn_if_40_layer_mistral(num_hidden_layers: int, logger: Any) -> None: + """Warn when a 40-layer Mistral Small 3 is loaded as a FLUX.2 [dev] text encoder. + + Architecturally, BFL's canonical ``black-forest-labs/FLUX.2-dev/text_encoder`` + (40-layer, fine-tuned by BFL) and upstream ``mistralai/Mistral-Small-3.x`` + GGUFs / safetensors (40-layer, base weights) are indistinguishable. In + practice only the BFL bundle produces clean output — upstream Mistral 3.1/3.2 + at any quantization level gives visibly degraded prompt adherence because + the joint attention was not trained against those weights. + + We accept both at probe time and emit this warning at load time so users who + install a non-BFL 40-layer Mistral see the issue called out in the log + instead of just getting weird images. + """ + if num_hidden_layers != _MISTRAL_24B_NUM_HIDDEN_LAYERS: + return + logger.warning( + "Loaded a 40-layer Mistral Small 3 text encoder. " + "If this is NOT BFL's canonical FLUX.2-dev/text_encoder, expect degraded " + "prompt adherence — upstream Mistral 3.1 / 3.2 weights (GGUFs from " + "unsloth, gguf-org, etc.) are not what FLUX.2's joint attention was " + "trained against. Recommended encoders: Comfy-Org bf16/fp8/fp4 or " + "gguf-org cow-mistral3-small quants (all 30-layer cow distillation)." + ) + + def _drop_quantization_metadata(sd: dict[str, Any], logger) -> dict[str, Any]: """Dequantize Comfy-Org-style FP8/FP4 weights and drop their metadata keys. @@ -291,76 +339,79 @@ def _drop_quantization_metadata(sd: dict[str, Any], logger) -> dict[str, Any]: return sd -def _flatten_message_content(content: Any) -> str: - """Reduce HF chat-template content (str or [{type:"text", text:"..."}]) to plain text.""" - if isinstance(content, str): - return content - if isinstance(content, list): - parts: list[str] = [] - for item in content: - if isinstance(item, dict) and item.get("type") == "text": - parts.append(str(item.get("text", ""))) - return "".join(parts) - return str(content) - +class _TekkenRawTextAdapter: + """Expose a HuggingFace-tokenizer-like ``__call__`` over a ``mistral_common`` + Tekkenizer. -class _TekkenChatTemplateAdapter: - """Expose HuggingFace's ``apply_chat_template`` surface backed by - ``mistral_common.MistralTokenizer``. + FLUX.2 [dev]'s reference encoder pipeline (matching ComfyUI's + ``Mistral3Tokenizer`` + ``Flux2Tokenizer``) feeds a pre-formatted raw string + — ``[SYSTEM_PROMPT]…[/SYSTEM_PROMPT][INST]{prompt}[/INST]`` — straight into + the BPE encoder rather than going through ``apply_chat_template``. The + Tekken special tokens (``[SYSTEM_PROMPT]``, ``[/SYSTEM_PROMPT]``, ``[INST]``, + ``[/INST]``) are part of the vocab so the encode call produces the right + token IDs without any chat-template indirection. - The FLUX.2 [dev] invocation only calls ``apply_chat_template(messages, - tokenize=True, return_tensors='pt', padding='max_length', max_length=N)``, - so only that surface is implemented. + Padding defaults to **left** to match Comfy's ``pad_left=True`` — this keeps + the meaningful tokens at the right edge of the sequence, where the + transformer's joint attention was trained to consume them. """ + # Default special tokens for Mistral Small 3 Tekken vocab. + _BOS_ID = 1 # + _PAD_ID = 11 # + def __init__(self, mistral_tokenizer: Any): self._tok = mistral_tokenizer - # Mistral Small 3's id (token 11 in the Tekken vocab). - self.pad_token_id = 11 - - def apply_chat_template( + self.pad_token_id = self._PAD_ID + + def _encode(self, text: str) -> list[int]: + """Encode raw text via the underlying Tekkenizer (adds BOS, no EOS). + + ``mistral_common`` exposes the BPE under + ``MistralTokenizer.instruct_tokenizer.tokenizer`` (the inner Tekkenizer). + Different mistral-common versions name the encode entrypoint slightly + differently; we try the documented one first and fall back to the + wrapper's own encode method. + """ + inner = getattr(getattr(self._tok, "instruct_tokenizer", None), "tokenizer", None) + if inner is not None and hasattr(inner, "encode"): + # Tekkenizer.encode(text, bos: bool, eos: bool) → list[int] + return list(inner.encode(text, bos=True, eos=False)) + # Older mistral-common releases expose .encode on the top-level wrapper. + return list(self._tok.encode(text, add_bos=True, add_eos=False)) + + def __call__( self, - messages: list[dict[str, Any]], + text: str, *, - tokenize: bool = True, - return_dict: bool = True, - return_tensors: str = "pt", - add_generation_prompt: bool = False, padding: str | bool = "max_length", + padding_side: str = "left", truncation: bool = True, max_length: int = 512, + return_tensors: str = "pt", **_kwargs: Any, ) -> dict[str, torch.Tensor]: - if not tokenize or return_tensors != "pt": + if return_tensors != "pt": raise NotImplementedError( - "_TekkenChatTemplateAdapter only supports tokenize=True / return_tensors='pt' " - f"(got tokenize={tokenize}, return_tensors={return_tensors})" + "_TekkenRawTextAdapter only supports return_tensors='pt' " f"(got {return_tensors})" ) - from mistral_common.protocol.instruct.messages import SystemMessage, UserMessage - from mistral_common.protocol.instruct.request import ChatCompletionRequest - - msgs: list[Any] = [] - for msg in messages: - role = msg.get("role") - content = _flatten_message_content(msg.get("content")) - if role == "system": - msgs.append(SystemMessage(content=content)) - elif role == "user": - msgs.append(UserMessage(content=content)) - - encoded = self._tok.encode_chat_completion(ChatCompletionRequest(messages=msgs)) - tokens: list[int] = list(encoded.tokens) - + tokens = self._encode(text) if truncation and len(tokens) > max_length: tokens = tokens[:max_length] - attention: list[int] = [1] * len(tokens) + attention = [1] * len(tokens) if padding == "max_length": pad_needed = max_length - len(tokens) if pad_needed > 0: - tokens.extend([self.pad_token_id] * pad_needed) - attention.extend([0] * pad_needed) + pad_tokens = [self.pad_token_id] * pad_needed + pad_attn = [0] * pad_needed + if padding_side == "left": + tokens = pad_tokens + tokens + attention = pad_attn + attention + else: + tokens = tokens + pad_tokens + attention = attention + pad_attn return { "input_ids": torch.tensor([tokens], dtype=torch.long), @@ -457,7 +508,7 @@ def _try_load_embedded_tekken(model_path: Path, logger: Any) -> Optional[AnyMode pass logger.info(f"Loaded embedded Tekken tokenizer from {model_path.name}") - return _TekkenChatTemplateAdapter(mistral_tok) + return _TekkenRawTextAdapter(mistral_tok) def _load_tokenizer_from_hf(logger: Any) -> AnyModel: @@ -578,12 +629,23 @@ def _load_model( # only when the diffusers/transformers version supports it. from transformers import AutoModel - return AutoModel.from_pretrained( + model = AutoModel.from_pretrained( text_encoder_path, torch_dtype=model_dtype, low_cpu_mem_usage=True, local_files_only=True, ) + # `MistralModel.norm` is always built by transformers, but the + # 30-layer cow distillation was trained against the post-layer-29 + # state *without* the final norm — swap it for Identity to match + # ComfyUI's reference implementation. ``Mistral3ForConditionalGeneration`` + # nests the LM under ``.language_model``; handle both layouts. + inner = getattr(model, "language_model", None) or model + num_layers = int(getattr(getattr(inner, "config", None), "num_hidden_layers", 0)) + logger = InvokeAILogger.get_logger("MistralEncoderDiffusersLoader") + _strip_final_norm_for_cow(inner, num_layers, logger) + _warn_if_40_layer_mistral(num_layers, logger) + return model raise ValueError( "Only Tokenizer and TextEncoder submodels are supported. " @@ -679,6 +741,8 @@ def _load_text_encoder(self, config: MistralEncoder_Checkpoint_Config) -> AnyMod parent.register_buffer(parts[-1], inv_freq.to(model_dtype), persistent=False) _materialize_remaining_meta_tensors(model, model_dtype, logger) + _strip_final_norm_for_cow(model, mistral_config.num_hidden_layers, logger) + _warn_if_40_layer_mistral(mistral_config.num_hidden_layers, logger) return model @@ -778,6 +842,8 @@ def _load_from_gguf(self, config: MistralEncoder_GGUF_Config) -> AnyModel: parent.register_buffer(parts[-1], inv_freq.to(compute_dtype), persistent=False) _materialize_remaining_meta_tensors(model, compute_dtype, logger) + _strip_final_norm_for_cow(model, mistral_config.num_hidden_layers, logger) + _warn_if_40_layer_mistral(mistral_config.num_hidden_layers, logger) return model diff --git a/invokeai/backend/model_manager/taxonomy.py b/invokeai/backend/model_manager/taxonomy.py index 15c0e305642..fc934f5cf5b 100644 --- a/invokeai/backend/model_manager/taxonomy.py +++ b/invokeai/backend/model_manager/taxonomy.py @@ -186,12 +186,20 @@ class MistralVariantType(str, Enum): """Mistral text encoder variants used by FLUX.2 [dev].""" Cow = "cow_mistral3_small" - """The 30-layer BFL "cow-mistral3-small" distillation (hidden_size=5120) — - the only Mistral variant FLUX.2 [dev]'s joint attention was trained against. + """The 30-layer BFL "cow-mistral3-small" distillation (hidden_size=5120). Hidden states are sampled at indices (10, 20, 30) which on a 30-layer model - hit 1/3, 2/3, and the final layer. Upstream Mistral Small 3.1 / 3.2 (40 - layers) sample at different relative depths and produce off-distribution - embeddings, so they are not accepted as FLUX.2 text encoders.""" + hit 1/3, 2/3, and the final layer. ComfyUI's reference implementation + drops the final RMSNorm for this variant (``final_norm=False``), so the + loader strips ``model.norm`` after loading the weights.""" + + Mistral24B = "mistral3_24b" + """The 40-layer Mistral Small 3 (24B, hidden_size=5120) text encoder BFL + ships in the canonical ``black-forest-labs/FLUX.2-dev/text_encoder``. Same + extraction indices (10, 20, 30), final RMSNorm kept enabled. Architecturally + identical to upstream ``mistralai/Mistral-Small-3.1/3.2`` — installing one + of those instead of BFL's release will load fine but produces visibly + weaker prompt adherence than the cow distillation, so the cow variants + remain the recommended default.""" class ModelFormat(str, Enum): diff --git a/invokeai/frontend/web/src/features/modelManagerV2/models.ts b/invokeai/frontend/web/src/features/modelManagerV2/models.ts index b34986f58f2..ee440b6941b 100644 --- a/invokeai/frontend/web/src/features/modelManagerV2/models.ts +++ b/invokeai/frontend/web/src/features/modelManagerV2/models.ts @@ -263,6 +263,7 @@ export const MODEL_VARIANT_TO_LONG_NAME: Record = { qwen3_8b: 'Qwen3 8B', qwen3_06b: 'Qwen3 0.6B', cow_mistral3_small: 'cow-mistral3-small (FLUX.2)', + mistral3_24b: 'Mistral Small 3 (24B, FLUX.2)', }; export const MODEL_FORMAT_TO_LONG_NAME: Record = { diff --git a/invokeai/frontend/web/src/features/nodes/types/common.ts b/invokeai/frontend/web/src/features/nodes/types/common.ts index ab335f61f8c..4d9a2bb5050 100644 --- a/invokeai/frontend/web/src/features/nodes/types/common.ts +++ b/invokeai/frontend/web/src/features/nodes/types/common.ts @@ -165,7 +165,7 @@ export const zFlux2VariantType = z.enum(['klein_4b', 'klein_4b_base', 'klein_9b' export const zZImageVariantType = z.enum(['turbo', 'zbase']); const zQwenImageVariantType = z.enum(['generate', 'edit']); export const zQwen3VariantType = z.enum(['qwen3_4b', 'qwen3_8b', 'qwen3_06b']); -export const zMistralVariantType = z.enum(['cow_mistral3_small']); +export const zMistralVariantType = z.enum(['cow_mistral3_small', 'mistral3_24b']); export const zAnyModelVariant = z.union([ zModelVariantType, zClipVariantType, diff --git a/invokeai/frontend/web/src/services/api/schema.ts b/invokeai/frontend/web/src/services/api/schema.ts index 7d81b425305..c8e222d3ee0 100644 --- a/invokeai/frontend/web/src/services/api/schema.ts +++ b/invokeai/frontend/web/src/services/api/schema.ts @@ -23820,7 +23820,7 @@ export type components = { * @description Mistral text encoder variants used by FLUX.2 [dev]. * @enum {string} */ - MistralVariantType: "cow_mistral3_small"; + MistralVariantType: "cow_mistral3_small" | "mistral3_24b"; /** * ModelFormat * @description Storage format of model. From 0afef9d3b8fecda561935d3a2f8baa39dc632ab8 Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Fri, 10 Jul 2026 03:08:43 +0200 Subject: [PATCH 06/25] fix(ui): remove unused exports flagged by knip on FLUX.2 [dev] branch Knip reported 6 unused exports. Each was dead code rather than incomplete wiring, verified against the actual consumers: - Drop the vestigial `flux2DevSourceModel` param end-to-end (state field, default, migration, reducer, action, selector, test). The FLUX graph builder auto-picks the diffusers source itself and never read this param; no UI set it. Mirrors how the Klein path already works. - Delete `selectIsFlux2Klein`; the graph builder computes this locally and only `selectIsFlux2Dev` is consumed. - Un-export `zMistralVariantType`; used only in the local `zAnyModelVariant` union, like `zQwenImageVariantType`. - Delete `selectMistralEncoderModels`; components use the `useMistralEncoderModels` hook instead. - Un-export `isFlux2DevMainModelConfig`; used only within types.ts, like its `isFluxDevMainModelConfig` / `isFlux2Klein9BMainModelConfig` siblings. --- .../listeners/modelSelected.test.ts | 1 - .../features/controlLayers/store/paramsSlice.ts | 17 ----------------- .../src/features/controlLayers/store/types.ts | 2 -- .../web/src/features/nodes/types/common.ts | 2 +- .../web/src/services/api/hooks/modelsByType.ts | 1 - invokeai/frontend/web/src/services/api/types.ts | 2 +- 6 files changed, 2 insertions(+), 23 deletions(-) diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.test.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.test.ts index b78ca91baa1..80bb0773f7f 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.test.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.test.ts @@ -172,7 +172,6 @@ function buildMockState(overrides: Record = {}) { kleinQwen3EncoderModel: null, flux2DevVaeModel: null, flux2DevMistralEncoderModel: null, - flux2DevSourceModel: null, zImageScheduler: 'euler', ...overrides, }, diff --git a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts index 1cfe79f58f0..17e8144673d 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts @@ -277,13 +277,6 @@ const slice = createSlice({ } state.flux2DevMistralEncoderModel = result.data; }, - flux2DevSourceModelSelected: (state, action: PayloadAction) => { - const result = zParamsState.shape.flux2DevSourceModel.safeParse(action.payload); - if (!result.success) { - return; - } - state.flux2DevSourceModel = result.data; - }, qwenImageComponentSourceSelected: (state, action: PayloadAction) => { const result = zParamsState.shape.qwenImageComponentSource.safeParse(action.payload); if (!result.success) { @@ -642,7 +635,6 @@ const resetState = (state: ParamsState): ParamsState => { newState.kleinQwen3EncoderModel = oldState.kleinQwen3EncoderModel; newState.flux2DevVaeModel = oldState.flux2DevVaeModel; newState.flux2DevMistralEncoderModel = oldState.flux2DevMistralEncoderModel; - newState.flux2DevSourceModel = oldState.flux2DevSourceModel; newState.qwenImageComponentSource = oldState.qwenImageComponentSource; newState.qwenImageVaeModel = oldState.qwenImageVaeModel; newState.qwenImageQwenVLEncoderModel = oldState.qwenImageQwenVLEncoderModel; @@ -697,7 +689,6 @@ export const { kleinQwen3EncoderModelSelected, flux2DevVaeModelSelected, flux2DevMistralEncoderModelSelected, - flux2DevSourceModelSelected, qwenImageComponentSourceSelected, qwenImageVaeModelSelected, qwenImageQwenVLEncoderModelSelected, @@ -819,7 +810,6 @@ export const selectKleinVaeModel = createParamsSelector((params) => params.klein export const selectKleinQwen3EncoderModel = createParamsSelector((params) => params.kleinQwen3EncoderModel); export const selectFlux2DevVaeModel = createParamsSelector((params) => params.flux2DevVaeModel); export const selectFlux2DevMistralEncoderModel = createParamsSelector((params) => params.flux2DevMistralEncoderModel); -export const selectFlux2DevSourceModel = createParamsSelector((params) => params.flux2DevSourceModel); export const selectQwenImageComponentSource = createParamsSelector((params) => params.qwenImageComponentSource); export const selectQwenImageVaeModel = createParamsSelector((params) => params.qwenImageVaeModel); export const selectQwenImageQwenVLEncoderModel = createParamsSelector((params) => params.qwenImageQwenVLEncoderModel); @@ -1033,10 +1023,3 @@ export const selectIsFlux2Dev = createSelector(selectMainModelConfig, (modelConf } return 'variant' in modelConfig && modelConfig.variant === 'dev'; }); - -export const selectIsFlux2Klein = createSelector(selectMainModelConfig, (modelConfig) => { - if (!modelConfig || modelConfig.base !== 'flux2') { - return false; - } - return !('variant' in modelConfig) || modelConfig.variant !== 'dev'; -}); diff --git a/invokeai/frontend/web/src/features/controlLayers/store/types.ts b/invokeai/frontend/web/src/features/controlLayers/store/types.ts index a11d3751172..fe4bd001fee 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/types.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/types.ts @@ -847,7 +847,6 @@ export const zParamsState = z.object({ // Flux2 [dev] model components - uses Mistral Small 3.1 (24B) text encoder flux2DevVaeModel: zParameterVAEModel.nullable(), // Optional: Separate FLUX.2 VAE for [dev] flux2DevMistralEncoderModel: zModelIdentifierField.nullable(), // Optional: Standalone Mistral encoder for [dev] - flux2DevSourceModel: zParameterModel.nullable(), // Diffusers FLUX.2 [dev] (fallback for VAE/Encoder) // Qwen Image Edit model components - GGUF transformer needs a Diffusers source for VAE/encoder qwenImageComponentSource: zParameterModel.nullable(), // Diffusers model providing VAE + text encoder qwenImageVaeModel: zParameterVAEModel.nullable(), // Optional: Standalone Qwen Image VAE checkpoint @@ -935,7 +934,6 @@ export const getInitialParamsState = (): ParamsState => ({ kleinQwen3EncoderModel: null, flux2DevVaeModel: null, flux2DevMistralEncoderModel: null, - flux2DevSourceModel: null, qwenImageComponentSource: null, qwenImageVaeModel: null, qwenImageQwenVLEncoderModel: null, diff --git a/invokeai/frontend/web/src/features/nodes/types/common.ts b/invokeai/frontend/web/src/features/nodes/types/common.ts index 4d9a2bb5050..3c1679ec0d8 100644 --- a/invokeai/frontend/web/src/features/nodes/types/common.ts +++ b/invokeai/frontend/web/src/features/nodes/types/common.ts @@ -165,7 +165,7 @@ export const zFlux2VariantType = z.enum(['klein_4b', 'klein_4b_base', 'klein_9b' export const zZImageVariantType = z.enum(['turbo', 'zbase']); const zQwenImageVariantType = z.enum(['generate', 'edit']); export const zQwen3VariantType = z.enum(['qwen3_4b', 'qwen3_8b', 'qwen3_06b']); -export const zMistralVariantType = z.enum(['cow_mistral3_small', 'mistral3_24b']); +const zMistralVariantType = z.enum(['cow_mistral3_small', 'mistral3_24b']); export const zAnyModelVariant = z.union([ zModelVariantType, zClipVariantType, diff --git a/invokeai/frontend/web/src/services/api/hooks/modelsByType.ts b/invokeai/frontend/web/src/services/api/hooks/modelsByType.ts index 1e61222d970..c568efdbb7c 100644 --- a/invokeai/frontend/web/src/services/api/hooks/modelsByType.ts +++ b/invokeai/frontend/web/src/services/api/hooks/modelsByType.ts @@ -156,7 +156,6 @@ export const selectQwenVLEncoderModels = buildModelsSelector(isQwenVLEncoderMode export const selectZImageDiffusersModels = buildModelsSelector(isZImageDiffusersMainModelConfig); export const selectFlux2DiffusersModels = buildModelsSelector(isFlux2DiffusersMainModelConfig); export const selectFlux2DevDiffusersModels = buildModelsSelector(isFlux2DevDiffusersMainModelConfig); -export const selectMistralEncoderModels = buildModelsSelector(isMistralEncoderModelConfig); export const selectFluxVAEModels = buildModelsSelector(isFluxVAEModelConfig); export const selectAnimaVAEModels = buildModelsSelector(isAnimaVAEModelConfig); export const useTextLLMModels = () => buildModelsHook(isTextLLMModelConfig)(); diff --git a/invokeai/frontend/web/src/services/api/types.ts b/invokeai/frontend/web/src/services/api/types.ts index 08a2c8b2208..9d75c233dbe 100644 --- a/invokeai/frontend/web/src/services/api/types.ts +++ b/invokeai/frontend/web/src/services/api/types.ts @@ -471,7 +471,7 @@ const isFlux2Klein9BMainModelConfig = (config: AnyModelConfig): config is MainMo return config.type === 'main' && config.base === 'flux2' && config.name.toLowerCase().includes('9b'); }; -export const isFlux2DevMainModelConfig = (config: AnyModelConfig): config is MainModelConfig => { +const isFlux2DevMainModelConfig = (config: AnyModelConfig): config is MainModelConfig => { return config.type === 'main' && config.base === 'flux2' && config.variant === 'dev'; }; From 0a87bc4eaceaa0c099b2dc52b54e62b723ec4b4d Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Fri, 10 Jul 2026 03:14:45 +0200 Subject: [PATCH 07/25] Chore OpenApi --- invokeai/frontend/web/openapi.json | 2049 ++++++++++++++++++++++------ 1 file changed, 1639 insertions(+), 410 deletions(-) diff --git a/invokeai/frontend/web/openapi.json b/invokeai/frontend/web/openapi.json index 13a3185b23b..8c517af70a8 100644 --- a/invokeai/frontend/web/openapi.json +++ b/invokeai/frontend/web/openapi.json @@ -969,6 +969,15 @@ { "$ref": "#/components/schemas/Qwen3Encoder_GGUF_Config" }, + { + "$ref": "#/components/schemas/MistralEncoder_Diffusers_Config" + }, + { + "$ref": "#/components/schemas/MistralEncoder_Checkpoint_Config" + }, + { + "$ref": "#/components/schemas/MistralEncoder_GGUF_Config" + }, { "$ref": "#/components/schemas/QwenVLEncoder_Diffusers_Config" }, @@ -1290,6 +1299,15 @@ { "$ref": "#/components/schemas/Qwen3Encoder_GGUF_Config" }, + { + "$ref": "#/components/schemas/MistralEncoder_Diffusers_Config" + }, + { + "$ref": "#/components/schemas/MistralEncoder_Checkpoint_Config" + }, + { + "$ref": "#/components/schemas/MistralEncoder_GGUF_Config" + }, { "$ref": "#/components/schemas/QwenVLEncoder_Diffusers_Config" }, @@ -1611,6 +1629,15 @@ { "$ref": "#/components/schemas/Qwen3Encoder_GGUF_Config" }, + { + "$ref": "#/components/schemas/MistralEncoder_Diffusers_Config" + }, + { + "$ref": "#/components/schemas/MistralEncoder_Checkpoint_Config" + }, + { + "$ref": "#/components/schemas/MistralEncoder_GGUF_Config" + }, { "$ref": "#/components/schemas/QwenVLEncoder_Diffusers_Config" }, @@ -1982,6 +2009,15 @@ { "$ref": "#/components/schemas/Qwen3Encoder_GGUF_Config" }, + { + "$ref": "#/components/schemas/MistralEncoder_Diffusers_Config" + }, + { + "$ref": "#/components/schemas/MistralEncoder_Checkpoint_Config" + }, + { + "$ref": "#/components/schemas/MistralEncoder_GGUF_Config" + }, { "$ref": "#/components/schemas/QwenVLEncoder_Diffusers_Config" }, @@ -2377,6 +2413,15 @@ { "$ref": "#/components/schemas/Qwen3Encoder_GGUF_Config" }, + { + "$ref": "#/components/schemas/MistralEncoder_Diffusers_Config" + }, + { + "$ref": "#/components/schemas/MistralEncoder_Checkpoint_Config" + }, + { + "$ref": "#/components/schemas/MistralEncoder_GGUF_Config" + }, { "$ref": "#/components/schemas/QwenVLEncoder_Diffusers_Config" }, @@ -3592,6 +3637,15 @@ { "$ref": "#/components/schemas/Qwen3Encoder_GGUF_Config" }, + { + "$ref": "#/components/schemas/MistralEncoder_Diffusers_Config" + }, + { + "$ref": "#/components/schemas/MistralEncoder_Checkpoint_Config" + }, + { + "$ref": "#/components/schemas/MistralEncoder_GGUF_Config" + }, { "$ref": "#/components/schemas/QwenVLEncoder_Diffusers_Config" }, @@ -11637,6 +11691,15 @@ { "$ref": "#/components/schemas/Qwen3Encoder_GGUF_Config" }, + { + "$ref": "#/components/schemas/MistralEncoder_Diffusers_Config" + }, + { + "$ref": "#/components/schemas/MistralEncoder_Checkpoint_Config" + }, + { + "$ref": "#/components/schemas/MistralEncoder_GGUF_Config" + }, { "$ref": "#/components/schemas/QwenVLEncoder_Diffusers_Config" }, @@ -24678,11 +24741,11 @@ "$ref": "#/components/schemas/LatentsOutput" } }, - "Flux2KleinLoRACollectionLoader": { + "Flux2DevLoRACollectionLoader": { "category": "model", "class": "invocation", "classification": "prototype", - "description": "Applies a collection of LoRAs to a FLUX.2 Klein transformer and/or Qwen3 text encoder.", + "description": "Apply a collection of LoRAs to a FLUX.2 [dev] transformer and/or Mistral encoder.", "node_pack": "invokeai", "properties": { "id": { @@ -24730,9 +24793,7 @@ "input": "any", "orig_default": null, "orig_required": false, - "title": "LoRAs", - "ui_model_base": ["flux2"], - "ui_model_type": ["lora"] + "title": "LoRAs" }, "transformer": { "anyOf": [ @@ -24751,45 +24812,45 @@ "orig_required": false, "title": "Transformer" }, - "qwen3_encoder": { + "mistral_encoder": { "anyOf": [ { - "$ref": "#/components/schemas/Qwen3EncoderField" + "$ref": "#/components/schemas/MistralEncoderField" }, { "type": "null" } ], "default": null, - "description": "Qwen3 tokenizer and text encoder", + "description": "Mistral tokenizer/processor and text encoder", "field_kind": "input", "input": "connection", "orig_default": null, "orig_required": false, - "title": "Qwen3 Encoder" + "title": "Mistral Encoder" }, "type": { - "const": "flux2_klein_lora_collection_loader", - "default": "flux2_klein_lora_collection_loader", + "const": "flux2_dev_lora_collection_loader", + "default": "flux2_dev_lora_collection_loader", "field_kind": "node_attribute", "title": "type", "type": "string" } }, "required": ["type", "id"], - "tags": ["lora", "model", "flux", "klein", "flux2"], - "title": "Apply LoRA Collection - Flux2 Klein", + "tags": ["lora", "model", "flux", "flux2", "dev"], + "title": "Apply LoRA Collection - FLUX.2 [dev]", "type": "object", - "version": "1.0.1", + "version": "1.0.0", "output": { - "$ref": "#/components/schemas/Flux2KleinLoRALoaderOutput" + "$ref": "#/components/schemas/Flux2DevLoRALoaderOutput" } }, - "Flux2KleinLoRALoaderInvocation": { + "Flux2DevLoRALoaderInvocation": { "category": "model", "class": "invocation", "classification": "prototype", - "description": "Apply a LoRA model to a FLUX.2 Klein transformer and/or Qwen3 text encoder.", + "description": "Apply a LoRA to a FLUX.2 [dev] transformer and/or its Mistral text encoder.", "node_pack": "invokeai", "properties": { "id": { @@ -24861,43 +24922,43 @@ "orig_required": false, "title": "Transformer" }, - "qwen3_encoder": { + "mistral_encoder": { "anyOf": [ { - "$ref": "#/components/schemas/Qwen3EncoderField" + "$ref": "#/components/schemas/MistralEncoderField" }, { "type": "null" } ], "default": null, - "description": "Qwen3 tokenizer and text encoder", + "description": "Mistral tokenizer/processor and text encoder", "field_kind": "input", "input": "connection", "orig_default": null, "orig_required": false, - "title": "Qwen3 Encoder" + "title": "Mistral Encoder" }, "type": { - "const": "flux2_klein_lora_loader", - "default": "flux2_klein_lora_loader", + "const": "flux2_dev_lora_loader", + "default": "flux2_dev_lora_loader", "field_kind": "node_attribute", "title": "type", "type": "string" } }, "required": ["type", "id"], - "tags": ["lora", "model", "flux", "klein", "flux2"], - "title": "Apply LoRA - Flux2 Klein", + "tags": ["lora", "model", "flux", "flux2", "dev"], + "title": "Apply LoRA - FLUX.2 [dev]", "type": "object", "version": "1.0.0", "output": { - "$ref": "#/components/schemas/Flux2KleinLoRALoaderOutput" + "$ref": "#/components/schemas/Flux2DevLoRALoaderOutput" } }, - "Flux2KleinLoRALoaderOutput": { + "Flux2DevLoRALoaderOutput": { "class": "output", - "description": "FLUX.2 Klein LoRA Loader Output", + "description": "FLUX.2 [dev] LoRA loader output.", "properties": { "transformer": { "anyOf": [ @@ -24914,38 +24975,38 @@ "title": "Transformer", "ui_hidden": false }, - "qwen3_encoder": { + "mistral_encoder": { "anyOf": [ { - "$ref": "#/components/schemas/Qwen3EncoderField" + "$ref": "#/components/schemas/MistralEncoderField" }, { "type": "null" } ], "default": null, - "description": "Qwen3 tokenizer and text encoder", + "description": "Mistral tokenizer/processor and text encoder", "field_kind": "output", - "title": "Qwen3 Encoder", + "title": "Mistral Encoder", "ui_hidden": false }, "type": { - "const": "flux2_klein_lora_loader_output", - "default": "flux2_klein_lora_loader_output", + "const": "flux2_dev_lora_loader_output", + "default": "flux2_dev_lora_loader_output", "field_kind": "node_attribute", "title": "type", "type": "string" } }, - "required": ["output_meta", "transformer", "qwen3_encoder", "type", "type"], - "title": "Flux2KleinLoRALoaderOutput", + "required": ["output_meta", "transformer", "mistral_encoder", "type", "type"], + "title": "Flux2DevLoRALoaderOutput", "type": "object" }, - "Flux2KleinModelLoaderInvocation": { + "Flux2DevModelLoaderInvocation": { "category": "model", "class": "invocation", "classification": "prototype", - "description": "Loads a Flux2 Klein model, outputting its submodels.\n\nFlux2 Klein uses Qwen3 as the text encoder instead of CLIP+T5.\nIt uses a 32-channel VAE (AutoencoderKLFlux2) instead of the 16-channel FLUX.1 VAE.\n\nWhen using a Diffusers format model, both VAE and Qwen3 encoder are extracted\nautomatically from the main model. You can override with standalone models:\n- Transformer: Always from Flux2 Klein main model\n- VAE: From main model (Diffusers) or standalone VAE\n- Qwen3 Encoder: From main model (Diffusers) or standalone Qwen3 model", + "description": "Load a FLUX.2 [dev] transformer plus its Mistral text encoder and VAE.\n\nFLUX.2 [dev] is a 32B guidance-distilled rectified flow transformer that uses\nMistral Small 3.1 (24B) as its sole text encoder, sharing the 32-channel\nAutoencoderKLFlux2 VAE with FLUX.2 Klein.\n\nWhen the transformer is a Diffusers-format checkpoint, both VAE and Mistral\nencoder can be extracted directly from the main model. For single-file\nsafetensors or GGUF transformers, you must supply standalone VAE and\nMistral encoder models, or point at a Diffusers FLUX.2 [dev] checkout for\nsub-model extraction.", "node_pack": "invokeai", "properties": { "id": { @@ -24974,7 +25035,7 @@ }, "model": { "$ref": "#/components/schemas/ModelIdentifierField", - "description": "Flux model (Transformer) to load", + "description": "FLUX.2 [dev] model (Transformer) to load", "field_kind": "input", "input": "direct", "orig_required": true, @@ -24992,16 +25053,16 @@ } ], "default": null, - "description": "Standalone VAE model. Flux2 Klein uses the same VAE as FLUX (16-channel). If not provided, VAE will be loaded from the Qwen3 Source model.", + "description": "Standalone FLUX.2 VAE (AutoencoderKLFlux2). If not provided, the VAE is extracted from the Diffusers source model.", "field_kind": "input", "input": "direct", "orig_default": null, "orig_required": false, "title": "VAE", - "ui_model_base": ["flux", "flux2"], + "ui_model_base": ["flux2"], "ui_model_type": ["vae"] }, - "qwen3_encoder_model": { + "mistral_encoder_model": { "anyOf": [ { "$ref": "#/components/schemas/ModelIdentifierField" @@ -25011,15 +25072,15 @@ } ], "default": null, - "description": "Standalone Qwen3 Encoder model. If not provided, encoder will be loaded from the Qwen3 Source model.", + "description": "Standalone Mistral text encoder. Required when the transformer is a single-file safetensors or GGUF without a sibling Diffusers source.", "field_kind": "input", "input": "direct", "orig_default": null, "orig_required": false, - "title": "Qwen3 Encoder", - "ui_model_type": ["qwen3_encoder"] + "title": "Mistral Encoder", + "ui_model_type": ["mistral_encoder"] }, - "qwen3_source_model": { + "mistral_source_model": { "anyOf": [ { "$ref": "#/components/schemas/ModelIdentifierField" @@ -25029,19 +25090,19 @@ } ], "default": null, - "description": "Diffusers Flux2 Klein model to extract VAE and/or Qwen3 encoder from. Use this if you don't have separate VAE/Qwen3 models. Ignored if both VAE and Qwen3 Encoder are provided separately.", + "description": "Diffusers FLUX.2 [dev] model to extract VAE and/or Mistral encoder from. Use this if you don't have separate VAE / Mistral encoder models. Ignored if both are provided separately.", "field_kind": "input", "input": "direct", "orig_default": null, "orig_required": false, - "title": "Qwen3 Source (Diffusers)", + "title": "Mistral Source (Diffusers)", "ui_model_base": ["flux2"], "ui_model_format": ["diffusers"], "ui_model_type": ["main"] }, "max_seq_len": { "default": 512, - "description": "Max sequence length for the Qwen3 encoder.", + "description": "Max sequence length for the Mistral encoder. FLUX.2 [dev] uses 512 by default.", "enum": [256, 512], "field_kind": "input", "input": "any", @@ -25051,25 +25112,25 @@ "type": "integer" }, "type": { - "const": "flux2_klein_model_loader", - "default": "flux2_klein_model_loader", + "const": "flux2_dev_model_loader", + "default": "flux2_dev_model_loader", "field_kind": "node_attribute", "title": "type", "type": "string" } }, "required": ["model", "type", "id"], - "tags": ["model", "flux", "klein", "qwen3"], - "title": "Main Model - Flux2 Klein", + "tags": ["model", "flux", "flux2", "dev", "mistral"], + "title": "Main Model - FLUX.2 [dev]", "type": "object", "version": "1.0.0", "output": { - "$ref": "#/components/schemas/Flux2KleinModelLoaderOutput" + "$ref": "#/components/schemas/Flux2DevModelLoaderOutput" } }, - "Flux2KleinModelLoaderOutput": { + "Flux2DevModelLoaderOutput": { "class": "output", - "description": "Flux2 Klein model loader output.", + "description": "FLUX.2 [dev] model loader output.", "properties": { "transformer": { "$ref": "#/components/schemas/TransformerField", @@ -25078,11 +25139,11 @@ "title": "Transformer", "ui_hidden": false }, - "qwen3_encoder": { - "$ref": "#/components/schemas/Qwen3EncoderField", - "description": "Qwen3 tokenizer and text encoder", + "mistral_encoder": { + "$ref": "#/components/schemas/MistralEncoderField", + "description": "Mistral tokenizer/processor and text encoder", "field_kind": "output", - "title": "Qwen3 Encoder", + "title": "Mistral Encoder", "ui_hidden": false }, "vae": { @@ -25093,7 +25154,7 @@ "ui_hidden": false }, "max_seq_len": { - "description": "The max sequence length for the Qwen3 encoder.", + "description": "Max sequence length for the Mistral encoder.", "enum": [256, 512], "field_kind": "output", "title": "Max Seq Length", @@ -25101,22 +25162,22 @@ "ui_hidden": false }, "type": { - "const": "flux2_klein_model_loader_output", - "default": "flux2_klein_model_loader_output", + "const": "flux2_dev_model_loader_output", + "default": "flux2_dev_model_loader_output", "field_kind": "node_attribute", "title": "type", "type": "string" } }, - "required": ["output_meta", "transformer", "qwen3_encoder", "vae", "max_seq_len", "type", "type"], - "title": "Flux2KleinModelLoaderOutput", + "required": ["output_meta", "transformer", "mistral_encoder", "vae", "max_seq_len", "type", "type"], + "title": "Flux2DevModelLoaderOutput", "type": "object" }, - "Flux2KleinTextEncoderInvocation": { + "Flux2DevTextEncoderInvocation": { "category": "prompt", "class": "invocation", "classification": "prototype", - "description": "Encodes and preps a prompt for Flux2 Klein image generation.\n\nFlux2 Klein uses Qwen3 as the text encoder, extracting hidden states from\nlayers (9, 18, 27) and stacking them for richer text representations.\nThis matches the diffusers Flux2KleinPipeline implementation exactly.", + "description": "Encode a prompt for FLUX.2 [dev] using its Mistral Small 3.1 text encoder.", "node_pack": "invokeai", "properties": { "id": { @@ -25160,25 +25221,25 @@ "title": "Prompt", "ui_component": "textarea" }, - "qwen3_encoder": { + "mistral_encoder": { "anyOf": [ { - "$ref": "#/components/schemas/Qwen3EncoderField" + "$ref": "#/components/schemas/MistralEncoderField" }, { "type": "null" } ], "default": null, - "description": "Qwen3 tokenizer and text encoder", + "description": "Mistral tokenizer/processor and text encoder", "field_kind": "input", "input": "connection", "orig_required": true, - "title": "Qwen3 Encoder" + "title": "Mistral Encoder" }, "max_seq_len": { "default": 512, - "description": "Max sequence length for the Qwen3 encoder.", + "description": "Max sequence length for the Mistral encoder.", "enum": [256, 512], "field_kind": "input", "input": "any", @@ -25204,61 +25265,136 @@ "orig_required": false }, "type": { - "const": "flux2_klein_text_encoder", - "default": "flux2_klein_text_encoder", + "const": "flux2_dev_text_encoder", + "default": "flux2_dev_text_encoder", "field_kind": "node_attribute", "title": "type", "type": "string" } }, "required": ["type", "id"], - "tags": ["prompt", "conditioning", "flux", "klein", "qwen3"], - "title": "Prompt - Flux2 Klein", + "tags": ["prompt", "conditioning", "flux", "flux2", "dev", "mistral"], + "title": "Prompt - FLUX.2 [dev]", "type": "object", - "version": "1.1.1", + "version": "1.0.0", "output": { "$ref": "#/components/schemas/FluxConditioningOutput" } }, - "Flux2VaeDecodeInvocation": { - "category": "latents", + "Flux2KleinLoRACollectionLoader": { + "category": "model", "class": "invocation", "classification": "prototype", - "description": "Generates an image from latents using FLUX.2 Klein's 32-channel VAE.", + "description": "Applies a collection of LoRAs to a FLUX.2 Klein transformer and/or Qwen3 text encoder.", "node_pack": "invokeai", "properties": { - "board": { + "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" + }, + "loras": { "anyOf": [ { - "$ref": "#/components/schemas/BoardField" + "$ref": "#/components/schemas/LoRAField" + }, + { + "items": { + "$ref": "#/components/schemas/LoRAField" + }, + "type": "array" }, { "type": "null" } ], "default": null, - "description": "The board to save the image to", - "field_kind": "internal", - "input": "direct", + "description": "LoRA models and weights. May be a single LoRA or collection.", + "field_kind": "input", + "input": "any", + "orig_default": null, "orig_required": false, - "ui_hidden": false + "title": "LoRAs", + "ui_model_base": ["flux2"], + "ui_model_type": ["lora"] }, - "metadata": { + "transformer": { "anyOf": [ { - "$ref": "#/components/schemas/MetadataField" + "$ref": "#/components/schemas/TransformerField" }, { "type": "null" } ], "default": null, - "description": "Optional metadata to be saved with the image", - "field_kind": "internal", + "description": "Transformer", + "field_kind": "input", "input": "connection", + "orig_default": null, "orig_required": false, - "ui_hidden": false + "title": "Transformer" + }, + "qwen3_encoder": { + "anyOf": [ + { + "$ref": "#/components/schemas/Qwen3EncoderField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Qwen3 tokenizer and text encoder", + "field_kind": "input", + "input": "connection", + "orig_default": null, + "orig_required": false, + "title": "Qwen3 Encoder" }, + "type": { + "const": "flux2_klein_lora_collection_loader", + "default": "flux2_klein_lora_collection_loader", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["type", "id"], + "tags": ["lora", "model", "flux", "klein", "flux2"], + "title": "Apply LoRA Collection - Flux2 Klein", + "type": "object", + "version": "1.0.1", + "output": { + "$ref": "#/components/schemas/Flux2KleinLoRALoaderOutput" + } + }, + "Flux2KleinLoRALoaderInvocation": { + "category": "model", + "class": "invocation", + "classification": "prototype", + "description": "Apply a LoRA model to a FLUX.2 Klein transformer and/or Qwen3 text encoder.", + "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", @@ -25283,58 +25419,525 @@ "title": "Use Cache", "type": "boolean" }, - "latents": { + "lora": { "anyOf": [ { - "$ref": "#/components/schemas/LatentsField" + "$ref": "#/components/schemas/ModelIdentifierField" }, { "type": "null" } ], "default": null, - "description": "Latents tensor", + "description": "LoRA model to load", + "field_kind": "input", + "input": "any", + "orig_required": true, + "title": "LoRA", + "ui_model_base": ["flux2"], + "ui_model_type": ["lora"] + }, + "weight": { + "default": 0.75, + "description": "The weight at which the LoRA is applied to each model", + "field_kind": "input", + "input": "any", + "orig_default": 0.75, + "orig_required": false, + "title": "Weight", + "type": "number" + }, + "transformer": { + "anyOf": [ + { + "$ref": "#/components/schemas/TransformerField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Transformer", "field_kind": "input", "input": "connection", - "orig_required": true + "orig_default": null, + "orig_required": false, + "title": "Transformer" }, - "vae": { + "qwen3_encoder": { "anyOf": [ { - "$ref": "#/components/schemas/VAEField" + "$ref": "#/components/schemas/Qwen3EncoderField" }, { "type": "null" } ], "default": null, - "description": "VAE", + "description": "Qwen3 tokenizer and text encoder", "field_kind": "input", "input": "connection", - "orig_required": true + "orig_default": null, + "orig_required": false, + "title": "Qwen3 Encoder" }, "type": { - "const": "flux2_vae_decode", - "default": "flux2_vae_decode", + "const": "flux2_klein_lora_loader", + "default": "flux2_klein_lora_loader", "field_kind": "node_attribute", "title": "type", "type": "string" } }, "required": ["type", "id"], - "tags": ["latents", "image", "vae", "l2i", "flux2", "klein"], - "title": "Latents to Image - FLUX2", + "tags": ["lora", "model", "flux", "klein", "flux2"], + "title": "Apply LoRA - Flux2 Klein", "type": "object", "version": "1.0.0", "output": { - "$ref": "#/components/schemas/ImageOutput" + "$ref": "#/components/schemas/Flux2KleinLoRALoaderOutput" } }, - "Flux2VaeEncodeInvocation": { - "category": "latents", + "Flux2KleinLoRALoaderOutput": { + "class": "output", + "description": "FLUX.2 Klein LoRA Loader Output", + "properties": { + "transformer": { + "anyOf": [ + { + "$ref": "#/components/schemas/TransformerField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Transformer", + "field_kind": "output", + "title": "Transformer", + "ui_hidden": false + }, + "qwen3_encoder": { + "anyOf": [ + { + "$ref": "#/components/schemas/Qwen3EncoderField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Qwen3 tokenizer and text encoder", + "field_kind": "output", + "title": "Qwen3 Encoder", + "ui_hidden": false + }, + "type": { + "const": "flux2_klein_lora_loader_output", + "default": "flux2_klein_lora_loader_output", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["output_meta", "transformer", "qwen3_encoder", "type", "type"], + "title": "Flux2KleinLoRALoaderOutput", + "type": "object" + }, + "Flux2KleinModelLoaderInvocation": { + "category": "model", "class": "invocation", "classification": "prototype", - "description": "Encodes an image into latents using FLUX.2 Klein's 32-channel VAE.", + "description": "Loads a Flux2 Klein model, outputting its submodels.\n\nFlux2 Klein uses Qwen3 as the text encoder instead of CLIP+T5.\nIt uses a 32-channel VAE (AutoencoderKLFlux2) instead of the 16-channel FLUX.1 VAE.\n\nWhen using a Diffusers format model, both VAE and Qwen3 encoder are extracted\nautomatically from the main model. You can override with standalone models:\n- Transformer: Always from Flux2 Klein main model\n- VAE: From main model (Diffusers) or standalone VAE\n- Qwen3 Encoder: From main model (Diffusers) or standalone Qwen3 model", + "node_pack": "invokeai", + "properties": { + "id": { + "description": "The id of this instance of an invocation. Must be unique among all instances of invocations.", + "field_kind": "node_attribute", + "title": "Id", + "type": "string" + }, + "is_intermediate": { + "default": false, + "description": "Whether or not this is an intermediate invocation.", + "field_kind": "node_attribute", + "input": "direct", + "orig_required": true, + "title": "Is Intermediate", + "type": "boolean", + "ui_hidden": false, + "ui_type": "IsIntermediate" + }, + "use_cache": { + "default": true, + "description": "Whether or not to use the cache", + "field_kind": "node_attribute", + "title": "Use Cache", + "type": "boolean" + }, + "model": { + "$ref": "#/components/schemas/ModelIdentifierField", + "description": "Flux model (Transformer) to load", + "field_kind": "input", + "input": "direct", + "orig_required": true, + "title": "Transformer", + "ui_model_base": ["flux2"], + "ui_model_type": ["main"] + }, + "vae_model": { + "anyOf": [ + { + "$ref": "#/components/schemas/ModelIdentifierField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Standalone VAE model. Flux2 Klein uses the same VAE as FLUX (16-channel). If not provided, VAE will be loaded from the Qwen3 Source model.", + "field_kind": "input", + "input": "direct", + "orig_default": null, + "orig_required": false, + "title": "VAE", + "ui_model_base": ["flux", "flux2"], + "ui_model_type": ["vae"] + }, + "qwen3_encoder_model": { + "anyOf": [ + { + "$ref": "#/components/schemas/ModelIdentifierField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Standalone Qwen3 Encoder model. If not provided, encoder will be loaded from the Qwen3 Source model.", + "field_kind": "input", + "input": "direct", + "orig_default": null, + "orig_required": false, + "title": "Qwen3 Encoder", + "ui_model_type": ["qwen3_encoder"] + }, + "qwen3_source_model": { + "anyOf": [ + { + "$ref": "#/components/schemas/ModelIdentifierField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Diffusers Flux2 Klein model to extract VAE and/or Qwen3 encoder from. Use this if you don't have separate VAE/Qwen3 models. Ignored if both VAE and Qwen3 Encoder are provided separately.", + "field_kind": "input", + "input": "direct", + "orig_default": null, + "orig_required": false, + "title": "Qwen3 Source (Diffusers)", + "ui_model_base": ["flux2"], + "ui_model_format": ["diffusers"], + "ui_model_type": ["main"] + }, + "max_seq_len": { + "default": 512, + "description": "Max sequence length for the Qwen3 encoder.", + "enum": [256, 512], + "field_kind": "input", + "input": "any", + "orig_default": 512, + "orig_required": false, + "title": "Max Seq Length", + "type": "integer" + }, + "type": { + "const": "flux2_klein_model_loader", + "default": "flux2_klein_model_loader", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["model", "type", "id"], + "tags": ["model", "flux", "klein", "qwen3"], + "title": "Main Model - Flux2 Klein", + "type": "object", + "version": "1.0.0", + "output": { + "$ref": "#/components/schemas/Flux2KleinModelLoaderOutput" + } + }, + "Flux2KleinModelLoaderOutput": { + "class": "output", + "description": "Flux2 Klein model loader output.", + "properties": { + "transformer": { + "$ref": "#/components/schemas/TransformerField", + "description": "Transformer", + "field_kind": "output", + "title": "Transformer", + "ui_hidden": false + }, + "qwen3_encoder": { + "$ref": "#/components/schemas/Qwen3EncoderField", + "description": "Qwen3 tokenizer and text encoder", + "field_kind": "output", + "title": "Qwen3 Encoder", + "ui_hidden": false + }, + "vae": { + "$ref": "#/components/schemas/VAEField", + "description": "VAE", + "field_kind": "output", + "title": "VAE", + "ui_hidden": false + }, + "max_seq_len": { + "description": "The max sequence length for the Qwen3 encoder.", + "enum": [256, 512], + "field_kind": "output", + "title": "Max Seq Length", + "type": "integer", + "ui_hidden": false + }, + "type": { + "const": "flux2_klein_model_loader_output", + "default": "flux2_klein_model_loader_output", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["output_meta", "transformer", "qwen3_encoder", "vae", "max_seq_len", "type", "type"], + "title": "Flux2KleinModelLoaderOutput", + "type": "object" + }, + "Flux2KleinTextEncoderInvocation": { + "category": "prompt", + "class": "invocation", + "classification": "prototype", + "description": "Encodes and preps a prompt for Flux2 Klein image generation.\n\nFlux2 Klein uses Qwen3 as the text encoder, extracting hidden states from\nlayers (9, 18, 27) and stacking them for richer text representations.\nThis matches the diffusers Flux2KleinPipeline implementation exactly.", + "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 to encode.", + "field_kind": "input", + "input": "any", + "orig_required": true, + "title": "Prompt", + "ui_component": "textarea" + }, + "qwen3_encoder": { + "anyOf": [ + { + "$ref": "#/components/schemas/Qwen3EncoderField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Qwen3 tokenizer and text encoder", + "field_kind": "input", + "input": "connection", + "orig_required": true, + "title": "Qwen3 Encoder" + }, + "max_seq_len": { + "default": 512, + "description": "Max sequence length for the Qwen3 encoder.", + "enum": [256, 512], + "field_kind": "input", + "input": "any", + "orig_default": 512, + "orig_required": false, + "title": "Max Seq Len", + "type": "integer" + }, + "mask": { + "anyOf": [ + { + "$ref": "#/components/schemas/TensorField" + }, + { + "type": "null" + } + ], + "default": null, + "description": "A mask defining the region that this conditioning prompt applies to.", + "field_kind": "input", + "input": "any", + "orig_default": null, + "orig_required": false + }, + "type": { + "const": "flux2_klein_text_encoder", + "default": "flux2_klein_text_encoder", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["type", "id"], + "tags": ["prompt", "conditioning", "flux", "klein", "qwen3"], + "title": "Prompt - Flux2 Klein", + "type": "object", + "version": "1.1.1", + "output": { + "$ref": "#/components/schemas/FluxConditioningOutput" + } + }, + "Flux2VaeDecodeInvocation": { + "category": "latents", + "class": "invocation", + "classification": "prototype", + "description": "Generates an image from latents using FLUX.2 Klein's 32-channel VAE.", + "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" + }, + "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 + }, + "type": { + "const": "flux2_vae_decode", + "default": "flux2_vae_decode", + "field_kind": "node_attribute", + "title": "type", + "type": "string" + } + }, + "required": ["type", "id"], + "tags": ["latents", "image", "vae", "l2i", "flux2", "klein"], + "title": "Latents to Image - FLUX2", + "type": "object", + "version": "1.0.0", + "output": { + "$ref": "#/components/schemas/ImageOutput" + } + }, + "Flux2VaeEncodeInvocation": { + "category": "latents", + "class": "invocation", + "classification": "prototype", + "description": "Encodes an image into latents using FLUX.2 Klein's 32-channel VAE.", "node_pack": "invokeai", "properties": { "id": { @@ -25410,7 +26013,7 @@ }, "Flux2VariantType": { "type": "string", - "enum": ["klein_4b", "klein_4b_base", "klein_9b", "klein_9b_base"], + "enum": ["klein_4b", "klein_4b_base", "klein_9b", "klein_9b_base", "dev"], "title": "Flux2VariantType", "description": "FLUX.2 model variants." }, @@ -28989,6 +29592,18 @@ { "$ref": "#/components/schemas/Flux2DenoiseInvocation" }, + { + "$ref": "#/components/schemas/Flux2DevLoRACollectionLoader" + }, + { + "$ref": "#/components/schemas/Flux2DevLoRALoaderInvocation" + }, + { + "$ref": "#/components/schemas/Flux2DevModelLoaderInvocation" + }, + { + "$ref": "#/components/schemas/Flux2DevTextEncoderInvocation" + }, { "$ref": "#/components/schemas/Flux2KleinLoRACollectionLoader" }, @@ -29685,6 +30300,12 @@ { "$ref": "#/components/schemas/FloatOutput" }, + { + "$ref": "#/components/schemas/Flux2DevLoRALoaderOutput" + }, + { + "$ref": "#/components/schemas/Flux2DevModelLoaderOutput" + }, { "$ref": "#/components/schemas/Flux2KleinLoRALoaderOutput" }, @@ -36685,6 +37306,18 @@ { "$ref": "#/components/schemas/Flux2DenoiseInvocation" }, + { + "$ref": "#/components/schemas/Flux2DevLoRACollectionLoader" + }, + { + "$ref": "#/components/schemas/Flux2DevLoRALoaderInvocation" + }, + { + "$ref": "#/components/schemas/Flux2DevModelLoaderInvocation" + }, + { + "$ref": "#/components/schemas/Flux2DevTextEncoderInvocation" + }, { "$ref": "#/components/schemas/Flux2KleinLoRACollectionLoader" }, @@ -37338,6 +37971,12 @@ { "$ref": "#/components/schemas/FloatOutput" }, + { + "$ref": "#/components/schemas/Flux2DevLoRALoaderOutput" + }, + { + "$ref": "#/components/schemas/Flux2DevModelLoaderOutput" + }, { "$ref": "#/components/schemas/Flux2KleinLoRALoaderOutput" }, @@ -37835,6 +38474,18 @@ { "$ref": "#/components/schemas/Flux2DenoiseInvocation" }, + { + "$ref": "#/components/schemas/Flux2DevLoRACollectionLoader" + }, + { + "$ref": "#/components/schemas/Flux2DevLoRALoaderInvocation" + }, + { + "$ref": "#/components/schemas/Flux2DevModelLoaderInvocation" + }, + { + "$ref": "#/components/schemas/Flux2DevTextEncoderInvocation" + }, { "$ref": "#/components/schemas/Flux2KleinLoRACollectionLoader" }, @@ -38645,6 +39296,18 @@ "flux2_denoise": { "$ref": "#/components/schemas/LatentsOutput" }, + "flux2_dev_lora_collection_loader": { + "$ref": "#/components/schemas/Flux2DevLoRALoaderOutput" + }, + "flux2_dev_lora_loader": { + "$ref": "#/components/schemas/Flux2DevLoRALoaderOutput" + }, + "flux2_dev_model_loader": { + "$ref": "#/components/schemas/Flux2DevModelLoaderOutput" + }, + "flux2_dev_text_encoder": { + "$ref": "#/components/schemas/FluxConditioningOutput" + }, "flux2_klein_lora_collection_loader": { "$ref": "#/components/schemas/Flux2KleinLoRALoaderOutput" }, @@ -39294,6 +39957,10 @@ "float_range", "float_to_int", "flux2_denoise", + "flux2_dev_lora_collection_loader", + "flux2_dev_lora_loader", + "flux2_dev_model_loader", + "flux2_dev_text_encoder", "flux2_klein_lora_collection_loader", "flux2_klein_lora_loader", "flux2_klein_model_loader", @@ -39760,6 +40427,18 @@ { "$ref": "#/components/schemas/Flux2DenoiseInvocation" }, + { + "$ref": "#/components/schemas/Flux2DevLoRACollectionLoader" + }, + { + "$ref": "#/components/schemas/Flux2DevLoRALoaderInvocation" + }, + { + "$ref": "#/components/schemas/Flux2DevModelLoaderInvocation" + }, + { + "$ref": "#/components/schemas/Flux2DevTextEncoderInvocation" + }, { "$ref": "#/components/schemas/Flux2KleinLoRACollectionLoader" }, @@ -40659,6 +41338,18 @@ { "$ref": "#/components/schemas/Flux2DenoiseInvocation" }, + { + "$ref": "#/components/schemas/Flux2DevLoRACollectionLoader" + }, + { + "$ref": "#/components/schemas/Flux2DevLoRALoaderInvocation" + }, + { + "$ref": "#/components/schemas/Flux2DevModelLoaderInvocation" + }, + { + "$ref": "#/components/schemas/Flux2DevTextEncoderInvocation" + }, { "$ref": "#/components/schemas/Flux2KleinLoRACollectionLoader" }, @@ -49729,7 +50420,7 @@ "variant" ], "title": "Main_Diffusers_Flux2_Config", - "description": "Model config for FLUX.2 models in diffusers format (e.g. FLUX.2 Klein)." + "description": "Model config for FLUX.2 models in diffusers format (FLUX.2 Klein and FLUX.2 [dev])." }, "Main_Diffusers_QwenImage_Config": { "properties": { @@ -55070,6 +55761,485 @@ "$ref": "#/components/schemas/VAEOutput" } }, + "MistralEncoderField": { + "description": "Field for the Mistral text encoder used by FLUX.2 [dev].\n\nThe \"tokenizer\" submodel actually points to the multimodal processor (AutoProcessor /\nMistral3Processor), which wraps the tokenizer plus the chat template needed by FLUX.2.", + "properties": { + "tokenizer": { + "$ref": "#/components/schemas/ModelIdentifierField", + "description": "Info to load tokenizer / processor submodel" + }, + "text_encoder": { + "$ref": "#/components/schemas/ModelIdentifierField", + "description": "Info to load text_encoder submodel" + }, + "loras": { + "description": "LoRAs to apply on model loading", + "items": { + "$ref": "#/components/schemas/LoRAField" + }, + "title": "Loras", + "type": "array" + } + }, + "required": ["tokenizer", "text_encoder"], + "title": "MistralEncoderField", + "type": "object" + }, + "MistralEncoder_Checkpoint_Config": { + "properties": { + "key": { + "type": "string", + "title": "Key", + "description": "A unique key for this model." + }, + "hash": { + "type": "string", + "title": "Hash", + "description": "The hash of the model file(s)." + }, + "path": { + "type": "string", + "title": "Path", + "description": "Path to the model on the filesystem. Relative paths are relative to the Invoke root directory." + }, + "file_size": { + "type": "integer", + "title": "File Size", + "description": "The size of the model in bytes." + }, + "name": { + "type": "string", + "title": "Name", + "description": "Name of the model." + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description", + "description": "Model description" + }, + "source": { + "type": "string", + "title": "Source", + "description": "The original source of the model (path, URL or repo_id)." + }, + "source_type": { + "$ref": "#/components/schemas/ModelSourceType", + "description": "The type of source" + }, + "source_api_response": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Source Api Response", + "description": "The original API response from the source, as stringified JSON." + }, + "source_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Source Url", + "description": "Optional URL for the model (e.g. download page or model page)." + }, + "cover_image": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Cover Image", + "description": "Url for image to preview model" + }, + "config_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Config Path", + "description": "Path to the config for this model, if any." + }, + "base": { + "type": "string", + "const": "any", + "title": "Base", + "default": "any" + }, + "type": { + "type": "string", + "const": "mistral_encoder", + "title": "Type", + "default": "mistral_encoder" + }, + "format": { + "type": "string", + "const": "checkpoint", + "title": "Format", + "default": "checkpoint" + }, + "cpu_only": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Cpu Only", + "description": "Whether this model should run on CPU only" + }, + "variant": { + "$ref": "#/components/schemas/MistralVariantType", + "description": "Mistral text encoder variant" + } + }, + "type": "object", + "required": [ + "key", + "hash", + "path", + "file_size", + "name", + "description", + "source", + "source_type", + "source_api_response", + "source_url", + "cover_image", + "config_path", + "base", + "type", + "format", + "cpu_only", + "variant" + ], + "title": "MistralEncoder_Checkpoint_Config", + "description": "Configuration for a single-file Mistral text encoder (safetensors).\n\nAccepts both 30-layer cow (Comfy-Org bf16/fp8/fp4) and 40-layer Mistral Small 3\n(BFL canonical / upstream Mistral 3.x single-files). The loader uses the\ndetected variant to decide whether to keep or strip the final RMSNorm." + }, + "MistralEncoder_Diffusers_Config": { + "properties": { + "key": { + "type": "string", + "title": "Key", + "description": "A unique key for this model." + }, + "hash": { + "type": "string", + "title": "Hash", + "description": "The hash of the model file(s)." + }, + "path": { + "type": "string", + "title": "Path", + "description": "Path to the model on the filesystem. Relative paths are relative to the Invoke root directory." + }, + "file_size": { + "type": "integer", + "title": "File Size", + "description": "The size of the model in bytes." + }, + "name": { + "type": "string", + "title": "Name", + "description": "Name of the model." + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description", + "description": "Model description" + }, + "source": { + "type": "string", + "title": "Source", + "description": "The original source of the model (path, URL or repo_id)." + }, + "source_type": { + "$ref": "#/components/schemas/ModelSourceType", + "description": "The type of source" + }, + "source_api_response": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Source Api Response", + "description": "The original API response from the source, as stringified JSON." + }, + "source_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Source Url", + "description": "Optional URL for the model (e.g. download page or model page)." + }, + "cover_image": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Cover Image", + "description": "Url for image to preview model" + }, + "base": { + "type": "string", + "const": "any", + "title": "Base", + "default": "any" + }, + "type": { + "type": "string", + "const": "mistral_encoder", + "title": "Type", + "default": "mistral_encoder" + }, + "format": { + "type": "string", + "const": "mistral_encoder", + "title": "Format", + "default": "mistral_encoder" + }, + "cpu_only": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Cpu Only", + "description": "Whether this model should run on CPU only" + }, + "variant": { + "$ref": "#/components/schemas/MistralVariantType", + "description": "Mistral text encoder variant" + } + }, + "type": "object", + "required": [ + "key", + "hash", + "path", + "file_size", + "name", + "description", + "source", + "source_type", + "source_api_response", + "source_url", + "cover_image", + "base", + "type", + "format", + "cpu_only", + "variant" + ], + "title": "MistralEncoder_Diffusers_Config", + "description": "Configuration for a Mistral text encoder in HuggingFace transformers/diffusers folder layout.\n\nMatches:\n- Full pipelines downloaded as just the `text_encoder/` subfolder\n (e.g. `black-forest-labs/FLUX.2-dev/text_encoder/`)\n- Quantized variants such as `diffusers/FLUX.2-dev-bnb-4bit/text_encoder/`\n\nDoes NOT match a full FLUX.2 pipeline directory \u2014 those are picked up by the\n`Main_Diffusers_Flux2_Config` instead.\n\nAccepts both:\n- 30-layer \"cow\" distillation (recommended, produces the cleanest output)\n- 40-layer Mistral Small 3 (BFL canonical / upstream Mistral 3.x \u2014 also works,\n slightly weaker prompt adherence than cow in our tests)\n\nThe variant field records which one was probed so the loader can decide\nwhether to keep the final RMSNorm (40-layer) or strip it (30-layer cow)." + }, + "MistralEncoder_GGUF_Config": { + "properties": { + "key": { + "type": "string", + "title": "Key", + "description": "A unique key for this model." + }, + "hash": { + "type": "string", + "title": "Hash", + "description": "The hash of the model file(s)." + }, + "path": { + "type": "string", + "title": "Path", + "description": "Path to the model on the filesystem. Relative paths are relative to the Invoke root directory." + }, + "file_size": { + "type": "integer", + "title": "File Size", + "description": "The size of the model in bytes." + }, + "name": { + "type": "string", + "title": "Name", + "description": "Name of the model." + }, + "description": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Description", + "description": "Model description" + }, + "source": { + "type": "string", + "title": "Source", + "description": "The original source of the model (path, URL or repo_id)." + }, + "source_type": { + "$ref": "#/components/schemas/ModelSourceType", + "description": "The type of source" + }, + "source_api_response": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Source Api Response", + "description": "The original API response from the source, as stringified JSON." + }, + "source_url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Source Url", + "description": "Optional URL for the model (e.g. download page or model page)." + }, + "cover_image": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Cover Image", + "description": "Url for image to preview model" + }, + "config_path": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Config Path", + "description": "Path to the config for this model, if any." + }, + "base": { + "type": "string", + "const": "any", + "title": "Base", + "default": "any" + }, + "type": { + "type": "string", + "const": "mistral_encoder", + "title": "Type", + "default": "mistral_encoder" + }, + "format": { + "type": "string", + "const": "gguf_quantized", + "title": "Format", + "default": "gguf_quantized" + }, + "cpu_only": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Cpu Only", + "description": "Whether this model should run on CPU only" + }, + "variant": { + "$ref": "#/components/schemas/MistralVariantType", + "description": "Mistral text encoder variant" + } + }, + "type": "object", + "required": [ + "key", + "hash", + "path", + "file_size", + "name", + "description", + "source", + "source_type", + "source_api_response", + "source_url", + "cover_image", + "config_path", + "base", + "type", + "format", + "cpu_only", + "variant" + ], + "title": "MistralEncoder_GGUF_Config", + "description": "Configuration for a GGUF-quantized Mistral text encoder.\n\nAccepts both 30-layer cow GGUFs and 40-layer Mistral Small 3 GGUFs \u2014 see\n``MistralEncoder_Checkpoint_Config`` for variant handling." + }, + "MistralVariantType": { + "type": "string", + "enum": ["cow_mistral3_small", "mistral3_24b"], + "title": "MistralVariantType", + "description": "Mistral text encoder variants used by FLUX.2 [dev]." + }, "ModelFormat": { "type": "string", "enum": [ @@ -55085,6 +56255,7 @@ "t5_encoder", "qwen3_encoder", "qwen_vl_encoder", + "mistral_encoder", "bnb_quantized_int8b", "bnb_quantized_nf4b", "gguf_quantized", @@ -55523,6 +56694,15 @@ { "$ref": "#/components/schemas/Qwen3Encoder_GGUF_Config" }, + { + "$ref": "#/components/schemas/MistralEncoder_Diffusers_Config" + }, + { + "$ref": "#/components/schemas/MistralEncoder_Checkpoint_Config" + }, + { + "$ref": "#/components/schemas/MistralEncoder_GGUF_Config" + }, { "$ref": "#/components/schemas/QwenVLEncoder_Diffusers_Config" }, @@ -56095,6 +57275,15 @@ { "$ref": "#/components/schemas/Qwen3Encoder_GGUF_Config" }, + { + "$ref": "#/components/schemas/MistralEncoder_Diffusers_Config" + }, + { + "$ref": "#/components/schemas/MistralEncoder_Checkpoint_Config" + }, + { + "$ref": "#/components/schemas/MistralEncoder_GGUF_Config" + }, { "$ref": "#/components/schemas/QwenVLEncoder_Diffusers_Config" }, @@ -56553,311 +57742,329 @@ "$ref": "#/components/schemas/Qwen3Encoder_GGUF_Config" }, { - "$ref": "#/components/schemas/QwenVLEncoder_Diffusers_Config" - }, - { - "$ref": "#/components/schemas/QwenVLEncoder_Checkpoint_Config" - }, - { - "$ref": "#/components/schemas/TI_File_SD1_Config" - }, - { - "$ref": "#/components/schemas/TI_File_SD2_Config" - }, - { - "$ref": "#/components/schemas/TI_File_SDXL_Config" - }, - { - "$ref": "#/components/schemas/TI_Folder_SD1_Config" - }, - { - "$ref": "#/components/schemas/TI_Folder_SD2_Config" - }, - { - "$ref": "#/components/schemas/TI_Folder_SDXL_Config" - }, - { - "$ref": "#/components/schemas/IPAdapter_InvokeAI_SD1_Config" - }, - { - "$ref": "#/components/schemas/IPAdapter_InvokeAI_SD2_Config" - }, - { - "$ref": "#/components/schemas/IPAdapter_InvokeAI_SDXL_Config" - }, - { - "$ref": "#/components/schemas/IPAdapter_Checkpoint_SD1_Config" - }, - { - "$ref": "#/components/schemas/IPAdapter_Checkpoint_SD2_Config" - }, - { - "$ref": "#/components/schemas/IPAdapter_Checkpoint_SDXL_Config" - }, - { - "$ref": "#/components/schemas/IPAdapter_Checkpoint_FLUX_Config" - }, - { - "$ref": "#/components/schemas/T2IAdapter_Diffusers_SD1_Config" - }, - { - "$ref": "#/components/schemas/T2IAdapter_Diffusers_SDXL_Config" - }, - { - "$ref": "#/components/schemas/Spandrel_Checkpoint_Config" - }, - { - "$ref": "#/components/schemas/CLIPEmbed_Diffusers_G_Config" - }, - { - "$ref": "#/components/schemas/CLIPEmbed_Diffusers_L_Config" - }, - { - "$ref": "#/components/schemas/CLIPVision_Diffusers_Config" - }, - { - "$ref": "#/components/schemas/SigLIP_Diffusers_Config" - }, - { - "$ref": "#/components/schemas/FLUXRedux_Checkpoint_Config" - }, - { - "$ref": "#/components/schemas/LlavaOnevision_Diffusers_Config" - }, - { - "$ref": "#/components/schemas/TextLLM_Diffusers_Config" - }, - { - "$ref": "#/components/schemas/ExternalApiModelConfig" - }, - { - "$ref": "#/components/schemas/Unknown_Config" - } - ], - "title": "Config" - }, - "submodel_type": { - "anyOf": [ - { - "$ref": "#/components/schemas/SubModelType" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The submodel type, if any" - } - }, - "required": ["timestamp", "config", "submodel_type"], - "title": "ModelLoadCompleteEvent", - "type": "object" - }, - "ModelLoadStartedEvent": { - "description": "Event model for model_load_started", - "properties": { - "timestamp": { - "description": "The timestamp of the event", - "title": "Timestamp", - "type": "integer" - }, - "config": { - "description": "The model's config", - "oneOf": [ - { - "$ref": "#/components/schemas/Main_Diffusers_SD1_Config" - }, - { - "$ref": "#/components/schemas/Main_Diffusers_SD2_Config" + "$ref": "#/components/schemas/MistralEncoder_Diffusers_Config" + }, + { + "$ref": "#/components/schemas/MistralEncoder_Checkpoint_Config" + }, + { + "$ref": "#/components/schemas/MistralEncoder_GGUF_Config" + }, + { + "$ref": "#/components/schemas/QwenVLEncoder_Diffusers_Config" + }, + { + "$ref": "#/components/schemas/QwenVLEncoder_Checkpoint_Config" + }, + { + "$ref": "#/components/schemas/TI_File_SD1_Config" + }, + { + "$ref": "#/components/schemas/TI_File_SD2_Config" + }, + { + "$ref": "#/components/schemas/TI_File_SDXL_Config" + }, + { + "$ref": "#/components/schemas/TI_Folder_SD1_Config" + }, + { + "$ref": "#/components/schemas/TI_Folder_SD2_Config" + }, + { + "$ref": "#/components/schemas/TI_Folder_SDXL_Config" + }, + { + "$ref": "#/components/schemas/IPAdapter_InvokeAI_SD1_Config" + }, + { + "$ref": "#/components/schemas/IPAdapter_InvokeAI_SD2_Config" + }, + { + "$ref": "#/components/schemas/IPAdapter_InvokeAI_SDXL_Config" + }, + { + "$ref": "#/components/schemas/IPAdapter_Checkpoint_SD1_Config" + }, + { + "$ref": "#/components/schemas/IPAdapter_Checkpoint_SD2_Config" + }, + { + "$ref": "#/components/schemas/IPAdapter_Checkpoint_SDXL_Config" + }, + { + "$ref": "#/components/schemas/IPAdapter_Checkpoint_FLUX_Config" + }, + { + "$ref": "#/components/schemas/T2IAdapter_Diffusers_SD1_Config" + }, + { + "$ref": "#/components/schemas/T2IAdapter_Diffusers_SDXL_Config" + }, + { + "$ref": "#/components/schemas/Spandrel_Checkpoint_Config" + }, + { + "$ref": "#/components/schemas/CLIPEmbed_Diffusers_G_Config" + }, + { + "$ref": "#/components/schemas/CLIPEmbed_Diffusers_L_Config" + }, + { + "$ref": "#/components/schemas/CLIPVision_Diffusers_Config" + }, + { + "$ref": "#/components/schemas/SigLIP_Diffusers_Config" + }, + { + "$ref": "#/components/schemas/FLUXRedux_Checkpoint_Config" + }, + { + "$ref": "#/components/schemas/LlavaOnevision_Diffusers_Config" + }, + { + "$ref": "#/components/schemas/TextLLM_Diffusers_Config" + }, + { + "$ref": "#/components/schemas/ExternalApiModelConfig" + }, + { + "$ref": "#/components/schemas/Unknown_Config" + } + ], + "title": "Config" + }, + "submodel_type": { + "anyOf": [ + { + "$ref": "#/components/schemas/SubModelType" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The submodel type, if any" + } + }, + "required": ["timestamp", "config", "submodel_type"], + "title": "ModelLoadCompleteEvent", + "type": "object" + }, + "ModelLoadStartedEvent": { + "description": "Event model for model_load_started", + "properties": { + "timestamp": { + "description": "The timestamp of the event", + "title": "Timestamp", + "type": "integer" + }, + "config": { + "description": "The model's config", + "oneOf": [ + { + "$ref": "#/components/schemas/Main_Diffusers_SD1_Config" + }, + { + "$ref": "#/components/schemas/Main_Diffusers_SD2_Config" + }, + { + "$ref": "#/components/schemas/Main_Diffusers_SDXL_Config" + }, + { + "$ref": "#/components/schemas/Main_Diffusers_SDXLRefiner_Config" + }, + { + "$ref": "#/components/schemas/Main_Diffusers_SD3_Config" + }, + { + "$ref": "#/components/schemas/Main_Diffusers_FLUX_Config" + }, + { + "$ref": "#/components/schemas/Main_Diffusers_Flux2_Config" + }, + { + "$ref": "#/components/schemas/Main_Diffusers_CogView4_Config" + }, + { + "$ref": "#/components/schemas/Main_Diffusers_QwenImage_Config" + }, + { + "$ref": "#/components/schemas/Main_Diffusers_ZImage_Config" + }, + { + "$ref": "#/components/schemas/Main_Checkpoint_SD1_Config" + }, + { + "$ref": "#/components/schemas/Main_Checkpoint_SD2_Config" + }, + { + "$ref": "#/components/schemas/Main_Checkpoint_SDXL_Config" + }, + { + "$ref": "#/components/schemas/Main_Checkpoint_SDXLRefiner_Config" + }, + { + "$ref": "#/components/schemas/Main_Checkpoint_Flux2_Config" + }, + { + "$ref": "#/components/schemas/Main_Checkpoint_FLUX_Config" + }, + { + "$ref": "#/components/schemas/Main_Checkpoint_QwenImage_Config" + }, + { + "$ref": "#/components/schemas/Main_Checkpoint_ZImage_Config" + }, + { + "$ref": "#/components/schemas/Main_Checkpoint_Anima_Config" + }, + { + "$ref": "#/components/schemas/Main_BnBNF4_FLUX_Config" + }, + { + "$ref": "#/components/schemas/Main_GGUF_Flux2_Config" + }, + { + "$ref": "#/components/schemas/Main_GGUF_FLUX_Config" + }, + { + "$ref": "#/components/schemas/Main_GGUF_QwenImage_Config" + }, + { + "$ref": "#/components/schemas/Main_GGUF_ZImage_Config" + }, + { + "$ref": "#/components/schemas/VAE_Checkpoint_SD1_Config" + }, + { + "$ref": "#/components/schemas/VAE_Checkpoint_SD2_Config" + }, + { + "$ref": "#/components/schemas/VAE_Checkpoint_SDXL_Config" + }, + { + "$ref": "#/components/schemas/VAE_Checkpoint_FLUX_Config" + }, + { + "$ref": "#/components/schemas/VAE_Checkpoint_Flux2_Config" + }, + { + "$ref": "#/components/schemas/VAE_Checkpoint_QwenImage_Config" + }, + { + "$ref": "#/components/schemas/VAE_Checkpoint_Anima_Config" + }, + { + "$ref": "#/components/schemas/VAE_Diffusers_SD1_Config" + }, + { + "$ref": "#/components/schemas/VAE_Diffusers_SDXL_Config" + }, + { + "$ref": "#/components/schemas/VAE_Diffusers_Flux2_Config" + }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_SD1_Config" + }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_SD2_Config" + }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_SDXL_Config" + }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_FLUX_Config" + }, + { + "$ref": "#/components/schemas/ControlNet_Checkpoint_ZImage_Config" + }, + { + "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" + }, + { + "$ref": "#/components/schemas/ControlNet_Diffusers_SD2_Config" + }, + { + "$ref": "#/components/schemas/ControlNet_Diffusers_SDXL_Config" + }, + { + "$ref": "#/components/schemas/ControlNet_Diffusers_FLUX_Config" + }, + { + "$ref": "#/components/schemas/LoRA_LyCORIS_SD1_Config" + }, + { + "$ref": "#/components/schemas/LoRA_LyCORIS_SD2_Config" + }, + { + "$ref": "#/components/schemas/LoRA_LyCORIS_SDXL_Config" + }, + { + "$ref": "#/components/schemas/LoRA_LyCORIS_Flux2_Config" + }, + { + "$ref": "#/components/schemas/LoRA_LyCORIS_FLUX_Config" + }, + { + "$ref": "#/components/schemas/LoRA_LyCORIS_ZImage_Config" + }, + { + "$ref": "#/components/schemas/LoRA_LyCORIS_QwenImage_Config" + }, + { + "$ref": "#/components/schemas/LoRA_LyCORIS_Anima_Config" + }, + { + "$ref": "#/components/schemas/LoRA_OMI_SDXL_Config" + }, + { + "$ref": "#/components/schemas/LoRA_OMI_FLUX_Config" + }, + { + "$ref": "#/components/schemas/LoRA_Diffusers_SD1_Config" + }, + { + "$ref": "#/components/schemas/LoRA_Diffusers_SD2_Config" + }, + { + "$ref": "#/components/schemas/LoRA_Diffusers_SDXL_Config" + }, + { + "$ref": "#/components/schemas/LoRA_Diffusers_Flux2_Config" + }, + { + "$ref": "#/components/schemas/LoRA_Diffusers_FLUX_Config" + }, + { + "$ref": "#/components/schemas/LoRA_Diffusers_ZImage_Config" + }, + { + "$ref": "#/components/schemas/ControlLoRA_LyCORIS_FLUX_Config" + }, + { + "$ref": "#/components/schemas/T5Encoder_T5Encoder_Config" + }, + { + "$ref": "#/components/schemas/T5Encoder_BnBLLMint8_Config" + }, + { + "$ref": "#/components/schemas/Qwen3Encoder_Qwen3Encoder_Config" + }, + { + "$ref": "#/components/schemas/Qwen3Encoder_Checkpoint_Config" + }, + { + "$ref": "#/components/schemas/Qwen3Encoder_GGUF_Config" + }, + { + "$ref": "#/components/schemas/MistralEncoder_Diffusers_Config" }, { - "$ref": "#/components/schemas/Main_Diffusers_SDXL_Config" + "$ref": "#/components/schemas/MistralEncoder_Checkpoint_Config" }, { - "$ref": "#/components/schemas/Main_Diffusers_SDXLRefiner_Config" - }, - { - "$ref": "#/components/schemas/Main_Diffusers_SD3_Config" - }, - { - "$ref": "#/components/schemas/Main_Diffusers_FLUX_Config" - }, - { - "$ref": "#/components/schemas/Main_Diffusers_Flux2_Config" - }, - { - "$ref": "#/components/schemas/Main_Diffusers_CogView4_Config" - }, - { - "$ref": "#/components/schemas/Main_Diffusers_QwenImage_Config" - }, - { - "$ref": "#/components/schemas/Main_Diffusers_ZImage_Config" - }, - { - "$ref": "#/components/schemas/Main_Checkpoint_SD1_Config" - }, - { - "$ref": "#/components/schemas/Main_Checkpoint_SD2_Config" - }, - { - "$ref": "#/components/schemas/Main_Checkpoint_SDXL_Config" - }, - { - "$ref": "#/components/schemas/Main_Checkpoint_SDXLRefiner_Config" - }, - { - "$ref": "#/components/schemas/Main_Checkpoint_Flux2_Config" - }, - { - "$ref": "#/components/schemas/Main_Checkpoint_FLUX_Config" - }, - { - "$ref": "#/components/schemas/Main_Checkpoint_QwenImage_Config" - }, - { - "$ref": "#/components/schemas/Main_Checkpoint_ZImage_Config" - }, - { - "$ref": "#/components/schemas/Main_Checkpoint_Anima_Config" - }, - { - "$ref": "#/components/schemas/Main_BnBNF4_FLUX_Config" - }, - { - "$ref": "#/components/schemas/Main_GGUF_Flux2_Config" - }, - { - "$ref": "#/components/schemas/Main_GGUF_FLUX_Config" - }, - { - "$ref": "#/components/schemas/Main_GGUF_QwenImage_Config" - }, - { - "$ref": "#/components/schemas/Main_GGUF_ZImage_Config" - }, - { - "$ref": "#/components/schemas/VAE_Checkpoint_SD1_Config" - }, - { - "$ref": "#/components/schemas/VAE_Checkpoint_SD2_Config" - }, - { - "$ref": "#/components/schemas/VAE_Checkpoint_SDXL_Config" - }, - { - "$ref": "#/components/schemas/VAE_Checkpoint_FLUX_Config" - }, - { - "$ref": "#/components/schemas/VAE_Checkpoint_Flux2_Config" - }, - { - "$ref": "#/components/schemas/VAE_Checkpoint_QwenImage_Config" - }, - { - "$ref": "#/components/schemas/VAE_Checkpoint_Anima_Config" - }, - { - "$ref": "#/components/schemas/VAE_Diffusers_SD1_Config" - }, - { - "$ref": "#/components/schemas/VAE_Diffusers_SDXL_Config" - }, - { - "$ref": "#/components/schemas/VAE_Diffusers_Flux2_Config" - }, - { - "$ref": "#/components/schemas/ControlNet_Checkpoint_SD1_Config" - }, - { - "$ref": "#/components/schemas/ControlNet_Checkpoint_SD2_Config" - }, - { - "$ref": "#/components/schemas/ControlNet_Checkpoint_SDXL_Config" - }, - { - "$ref": "#/components/schemas/ControlNet_Checkpoint_FLUX_Config" - }, - { - "$ref": "#/components/schemas/ControlNet_Checkpoint_ZImage_Config" - }, - { - "$ref": "#/components/schemas/ControlNet_Diffusers_SD1_Config" - }, - { - "$ref": "#/components/schemas/ControlNet_Diffusers_SD2_Config" - }, - { - "$ref": "#/components/schemas/ControlNet_Diffusers_SDXL_Config" - }, - { - "$ref": "#/components/schemas/ControlNet_Diffusers_FLUX_Config" - }, - { - "$ref": "#/components/schemas/LoRA_LyCORIS_SD1_Config" - }, - { - "$ref": "#/components/schemas/LoRA_LyCORIS_SD2_Config" - }, - { - "$ref": "#/components/schemas/LoRA_LyCORIS_SDXL_Config" - }, - { - "$ref": "#/components/schemas/LoRA_LyCORIS_Flux2_Config" - }, - { - "$ref": "#/components/schemas/LoRA_LyCORIS_FLUX_Config" - }, - { - "$ref": "#/components/schemas/LoRA_LyCORIS_ZImage_Config" - }, - { - "$ref": "#/components/schemas/LoRA_LyCORIS_QwenImage_Config" - }, - { - "$ref": "#/components/schemas/LoRA_LyCORIS_Anima_Config" - }, - { - "$ref": "#/components/schemas/LoRA_OMI_SDXL_Config" - }, - { - "$ref": "#/components/schemas/LoRA_OMI_FLUX_Config" - }, - { - "$ref": "#/components/schemas/LoRA_Diffusers_SD1_Config" - }, - { - "$ref": "#/components/schemas/LoRA_Diffusers_SD2_Config" - }, - { - "$ref": "#/components/schemas/LoRA_Diffusers_SDXL_Config" - }, - { - "$ref": "#/components/schemas/LoRA_Diffusers_Flux2_Config" - }, - { - "$ref": "#/components/schemas/LoRA_Diffusers_FLUX_Config" - }, - { - "$ref": "#/components/schemas/LoRA_Diffusers_ZImage_Config" - }, - { - "$ref": "#/components/schemas/ControlLoRA_LyCORIS_FLUX_Config" - }, - { - "$ref": "#/components/schemas/T5Encoder_T5Encoder_Config" - }, - { - "$ref": "#/components/schemas/T5Encoder_BnBLLMint8_Config" - }, - { - "$ref": "#/components/schemas/Qwen3Encoder_Qwen3Encoder_Config" - }, - { - "$ref": "#/components/schemas/Qwen3Encoder_Checkpoint_Config" - }, - { - "$ref": "#/components/schemas/Qwen3Encoder_GGUF_Config" + "$ref": "#/components/schemas/MistralEncoder_GGUF_Config" }, { "$ref": "#/components/schemas/QwenVLEncoder_Diffusers_Config" @@ -57259,6 +58466,9 @@ { "$ref": "#/components/schemas/Qwen3VariantType" }, + { + "$ref": "#/components/schemas/MistralVariantType" + }, { "type": "null" } @@ -57398,6 +58608,7 @@ "t5_encoder", "qwen3_encoder", "qwen_vl_encoder", + "mistral_encoder", "spandrel_image_to_image", "siglip", "flux_redux", @@ -57615,6 +58826,15 @@ { "$ref": "#/components/schemas/Qwen3Encoder_GGUF_Config" }, + { + "$ref": "#/components/schemas/MistralEncoder_Diffusers_Config" + }, + { + "$ref": "#/components/schemas/MistralEncoder_Checkpoint_Config" + }, + { + "$ref": "#/components/schemas/MistralEncoder_GGUF_Config" + }, { "$ref": "#/components/schemas/QwenVLEncoder_Diffusers_Config" }, @@ -66859,6 +68079,9 @@ { "$ref": "#/components/schemas/Qwen3VariantType" }, + { + "$ref": "#/components/schemas/MistralVariantType" + }, { "type": "null" } @@ -67019,6 +68242,9 @@ { "$ref": "#/components/schemas/Qwen3VariantType" }, + { + "$ref": "#/components/schemas/MistralVariantType" + }, { "type": "null" } @@ -67951,6 +69177,9 @@ { "$ref": "#/components/schemas/Qwen3VariantType" }, + { + "$ref": "#/components/schemas/MistralVariantType" + }, { "type": "null" } From 59e6d297c6cddd42ffc43769385a07e713791df0 Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Fri, 10 Jul 2026 03:19:12 +0200 Subject: [PATCH 08/25] Chore Ruff --- .../model_manager/load/model_loaders/mistral_encoder.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py b/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py index c91dd6b3bcf..de39368a954 100644 --- a/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py +++ b/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py @@ -392,9 +392,7 @@ def __call__( **_kwargs: Any, ) -> dict[str, torch.Tensor]: if return_tensors != "pt": - raise NotImplementedError( - "_TekkenRawTextAdapter only supports return_tensors='pt' " f"(got {return_tensors})" - ) + raise NotImplementedError(f"_TekkenRawTextAdapter only supports return_tensors='pt' (got {return_tensors})") tokens = self._encode(text) if truncation and len(tokens) > max_length: From d4ec81196eaa8bcfd7ac600576e81bcd7b946cd9 Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Fri, 17 Jul 2026 04:50:30 +0200 Subject: [PATCH 09/25] chore(deps): lock mistral-common for FLUX.2 [dev] Mistral encoder --- uv.lock | 471 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 467 insertions(+), 4 deletions(-) diff --git a/uv.lock b/uv.lock index 6d1b0a462f8..2c0317602fc 100644 --- a/uv.lock +++ b/uv.lock @@ -122,7 +122,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1d/57/96b8b9f93166147826da5f90376e784a10582dd39a393c99bb62cfcf52f0/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:aecba1723ae35330a008418a91ea6cfcedf6d31e5fbaa056a166462ff066d500", size = 54121, upload-time = "2025-07-30T10:01:50.815Z" }, { url = "https://files.pythonhosted.org/packages/0a/08/a9bebdb2e0e602dde230bdde8021b29f71f7841bd54801bcfd514acb5dcf/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2630b6240b495dfab90aebe159ff784d08ea999aa4b0d17efa734055a07d2f44", size = 29177, upload-time = "2025-07-30T10:01:51.681Z" }, { url = "https://files.pythonhosted.org/packages/b6/02/d297943bcacf05e4f2a94ab6f462831dc20158614e5d067c35d4e63b9acb/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:7aef0c91e2c0fbca6fc68e7555aa60ef7008a739cbe045541e438373bc54d2b0", size = 31090, upload-time = "2025-07-30T10:01:53.184Z" }, + { url = "https://files.pythonhosted.org/packages/c1/93/44365f3d75053e53893ec6d733e4a5e3147502663554b4d864587c7828a7/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e021e87faa76ae0d413b619fe2b65ab9a037f24c60a1e6cc43457ae20de6dc6", size = 81246, upload-time = "2025-07-30T10:01:54.145Z" }, { url = "https://files.pythonhosted.org/packages/09/52/94108adfdd6e2ddf58be64f959a0b9c7d4ef2fa71086c38356d22dc501ea/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e924cfc503018a714f94a49a149fdc0b644eaead5d1f089330399134fa028a", size = 87126, upload-time = "2025-07-30T10:01:55.074Z" }, + { url = "https://files.pythonhosted.org/packages/72/70/7a2993a12b0ffa2a9271259b79cc616e2389ed1a4d93842fac5a1f923ffd/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c87b72589133f0346a1cb8d5ecca4b933e3c9b64656c9d175270a000e73b288d", size = 80343, upload-time = "2025-07-30T10:01:56.007Z" }, { url = "https://files.pythonhosted.org/packages/78/9a/4e5157d893ffc712b74dbd868c7f62365618266982b64accab26bab01edc/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1db89609c06afa1a214a69a462ea741cf735b29a57530478c06eb81dd403de99", size = 86777, upload-time = "2025-07-30T10:01:56.943Z" }, { url = "https://files.pythonhosted.org/packages/74/cd/15777dfde1c29d96de7f18edf4cc94c385646852e7c7b0320aa91ccca583/argon2_cffi_bindings-25.1.0-cp39-abi3-win32.whl", hash = "sha256:473bcb5f82924b1becbb637b63303ec8d10e84c8d241119419897a26116515d2", size = 27180, upload-time = "2025-07-30T10:01:57.759Z" }, { url = "https://files.pythonhosted.org/packages/e2/c6/a759ece8f1829d1f162261226fbfd2c6832b3ff7657384045286d2afa384/argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl", hash = "sha256:a98cd7d17e9f7ce244c0803cad3c23a7d379c301ba618a5fa76a67d116618b98", size = 31715, upload-time = "2025-07-30T10:01:58.56Z" }, @@ -150,7 +152,16 @@ sdist = { url = "https://files.pythonhosted.org/packages/81/9d/09e27731bd5864a9c wheels = [ { url = "https://files.pythonhosted.org/packages/e0/9e/dc2530acb3a60dc6e46d65abf27d1d9f86721694757906a148d90a6860de/ast_serialize-0.5.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:0668aa9459cfa8c9c49ddd2163ebcf43088ba045ef7492af6fe22e0098303101", size = 1191380, upload-time = "2026-05-17T17:48:03.738Z" }, { url = "https://files.pythonhosted.org/packages/26/0a/bd3d18a582f273d6c843d16bb9e22e9e16365ff7991e92f18f798e9f1224/ast_serialize-0.5.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:bf683d6363edf2b39eed6b6d4fe22d34b6203867a67e27134d9e2a2680c4bc4a", size = 1183879, upload-time = "2026-05-17T17:48:05.463Z" }, + { url = "https://files.pythonhosted.org/packages/40/ae/1f919100f8620887af58fcc381c61a1f218cdf89c6e155f87b213e61010a/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc22cf0c9be65e71cf88fda130af60d61eb4a79370ad4cfe7900d48a4aa2211", size = 1244529, upload-time = "2026-05-17T17:48:07.008Z" }, + { url = "https://files.pythonhosted.org/packages/c6/ca/6376559dcce707cdbc1d0d9a13c8d3baaaa501e949ce0ebdc4230cd881aa/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f66173891548c9f2726bf27957b41cabce12fa679dc6da505ddbde4d4b3b31cf", size = 1240560, upload-time = "2026-05-17T17:48:08.46Z" }, + { url = "https://files.pythonhosted.org/packages/35/b2/a620e206b5aeb7efbf2710336df57d457cffbb3991076bbcc1147ef9abd4/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e42d729ef2be96a14efbad355093284739e3670ece3e534f82cc8832790911d9", size = 1451172, upload-time = "2026-05-17T17:48:09.922Z" }, + { url = "https://files.pythonhosted.org/packages/fa/e0/4ad5c04c24a40481b2935ce9a0ccdb6023dc8b667167d06ae530cc3512f2/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b725026bafa801dbd7310eb13a75f0a2e370e7e51b2cb225f9d21fcfadf919ee", size = 1265072, upload-time = "2026-05-17T17:48:11.469Z" }, { url = "https://files.pythonhosted.org/packages/b2/71/4d1d479aa56d0101c40e17720c3d6ac2af7269ea0487a80b18e7bfd1a5b7/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b54f60c1d78767a53b67eaa663f0dfac3afe606aa07f1301572f588b73d64809", size = 1270488, upload-time = "2026-05-17T17:48:13.575Z" }, + { url = "https://files.pythonhosted.org/packages/6d/4f/0de1bbe06f6edef9fde4ed12ca8e7b3ec7e6e2bd4e672c5af487f7957665/ast_serialize-0.5.0-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:27d51654fc240a1e87e742d353d98eb45b75f62f129086b3596ab53df2ac2a43", size = 1260702, upload-time = "2026-05-17T17:48:15.141Z" }, + { url = "https://files.pythonhosted.org/packages/75/61/e00872439cfdddcc3c1b6cdaa6e5d904ba8e26a18807c67c4e14409d0ca8/ast_serialize-0.5.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c36237c46dd1674542f2109740ea5ea485a169bf1431939ada0434e17934", size = 1311182, upload-time = "2026-05-17T17:48:16.779Z" }, + { url = "https://files.pythonhosted.org/packages/76/8e/699a5b955f7926956c95e9e1d74132acad73c2fe7a426f94da89123c20aa/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1943db345233cc7194a470f13afa9c59772c0b123dea0c9414c4d4ca54369759", size = 1421410, upload-time = "2026-05-17T17:48:18.527Z" }, + { url = "https://files.pythonhosted.org/packages/a9/ae/d5b7626874478997adc7a29ab28accf21e596fb590c944290401dfd0b29e/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:df1c00022cbbcb064bfaa505aa9c9295362443ce5dacb459d1331d3da353f887", size = 1516587, upload-time = "2026-05-17T17:48:20.133Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ce/b59e02a82d9c4244d64cde502e0b00e83e38816abe19155ceb5437402c7f/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:cae65289fc456fde04af979a2be09302ef5d8ab92ef23e596d6746dc267ada27", size = 1515171, upload-time = "2026-05-17T17:48:21.921Z" }, { url = "https://files.pythonhosted.org/packages/8b/38/d8d90042747d05aa08d4efcf1c99035a5f670a6bf4c214d31644392afbca/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:239a4c354e8d676e9d94631d1d4a64edc6b266f86ff3a5a80aedd344f342c01d", size = 1464668, upload-time = "2026-05-17T17:48:23.544Z" }, { url = "https://files.pythonhosted.org/packages/dd/51/5b840c4df7334104cecffa28f23904fe81ca89ca223d2450e288de39fd3c/ast_serialize-0.5.0-cp39-abi3-win32.whl", hash = "sha256:143a4ef63285a075871908fda3672dc21864b83a8ec3ee12304aa3e4c5387b9a", size = 1068311, upload-time = "2026-05-17T17:48:25.027Z" }, { url = "https://files.pythonhosted.org/packages/41/11/ca5672c7d491825bc4cd6702dea106a6b60d928707712ec257c7833ae476/ast_serialize-0.5.0-cp39-abi3-win_amd64.whl", hash = "sha256:cf25572c526add400f26a4750dc6ce0c3bb93fc1f75e7ae0cad4ce4f2cd5c590", size = 1108931, upload-time = "2026-05-17T17:48:26.591Z" }, @@ -212,9 +223,12 @@ dependencies = [ sdist = { url = "https://files.pythonhosted.org/packages/e8/36/edc85ab295ceff724506252b774155eff8a238f13730c8b13badd33ef866/bcrypt-3.2.2.tar.gz", hash = "sha256:433c410c2177057705da2a9f2cd01dd157493b2a7ac14c8593a16b3dab6b6bfb", size = 42455, upload-time = "2022-05-01T17:58:52.348Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/a0/c2/05354b1d4351d2e686a32296cc9dd1e63f9909a580636df0f7b06d774600/bcrypt-3.2.2-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:7180d98a96f00b1050e93f5b0f556e658605dd9f524d0b0e68ae7944673f525e", size = 50049, upload-time = "2022-05-01T18:05:47.625Z" }, + { url = "https://files.pythonhosted.org/packages/8c/b3/1257f7d64ee0aa0eb4fb1de5da8c2647a57db7b737da1f2342ac1889d3b8/bcrypt-3.2.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:61bae49580dce88095d669226d5076d0b9d927754cedbdf76c6c9f5099ad6f26", size = 54914, upload-time = "2022-05-01T18:03:00.752Z" }, + { url = "https://files.pythonhosted.org/packages/61/3d/dce83194830183aa700cab07c89822471d21663a86a0b305d1e5c7b02810/bcrypt-3.2.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88273d806ab3a50d06bc6a2fc7c87d737dd669b76ad955f449c43095389bc8fb", size = 54403, upload-time = "2022-05-01T18:03:02.483Z" }, { url = "https://files.pythonhosted.org/packages/86/1b/f4d7425dfc6cd0e405b48ee484df6d80fb39e05f25963dbfcc2c511e8341/bcrypt-3.2.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:6d2cb9d969bfca5bc08e45864137276e4c3d3d7de2b162171def3d188bf9d34a", size = 62337, upload-time = "2022-05-01T18:05:49.524Z" }, { url = "https://files.pythonhosted.org/packages/3e/df/289db4f31b303de6addb0897c8b5c01b23bd4b8c511ac80a32b08658847c/bcrypt-3.2.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b02d6bfc6336d1094276f3f588aa1225a598e27f8e3388f4db9948cb707b521", size = 61026, upload-time = "2022-05-01T18:05:51.107Z" }, { url = "https://files.pythonhosted.org/packages/40/8f/b67b42faa2e4d944b145b1a402fc08db0af8fe2dfa92418c674b5a302496/bcrypt-3.2.2-cp36-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a2c46100e315c3a5b90fdc53e429c006c5f962529bc27e1dfd656292c20ccc40", size = 64672, upload-time = "2022-05-01T18:05:52.748Z" }, + { url = "https://files.pythonhosted.org/packages/fc/9a/e1867f0b27a3f4ce90e21dd7f322f0e15d4aac2434d3b938dcf765e47c6b/bcrypt-3.2.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:7d9ba2e41e330d2af4af6b1b6ec9e6128e91343d0b4afb9282e54e5508f31baa", size = 56795, upload-time = "2022-05-01T18:03:04.028Z" }, { url = "https://files.pythonhosted.org/packages/18/76/057b0637c880e6cb0abdc8a867d080376ddca6ed7d05b7738f589cc5c1a8/bcrypt-3.2.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cd43303d6b8a165c29ec6756afd169faba9396a9472cdff753fe9f19b96ce2fa", size = 62075, upload-time = "2022-05-01T18:05:54.412Z" }, { url = "https://files.pythonhosted.org/packages/f1/64/cd93e2c3e28a5fa8bcf6753d5cc5e858e4da08bf51404a0adb6a412532de/bcrypt-3.2.2-cp36-abi3-win32.whl", hash = "sha256:4e029cef560967fb0cf4a802bcf4d562d3d6b4b1bf81de5ec1abbe0f1adb027e", size = 27916, upload-time = "2022-05-01T18:05:56.45Z" }, { url = "https://files.pythonhosted.org/packages/f5/37/7cd297ff571c4d86371ff024c0e008b37b59e895b28f69444a9b6f94ca1a/bcrypt-3.2.2-cp36-abi3-win_amd64.whl", hash = "sha256:7ff2069240c6bbe49109fe84ca80508773a904f5a8cb960e02a977f7f519b129", size = 29581, upload-time = "2022-05-01T18:05:57.878Z" }, @@ -256,6 +270,7 @@ dependencies = [ ] wheels = [ { url = "https://files.pythonhosted.org/packages/d8/7d/f1fe0992334b18cd8494f89aeec1dcc674635584fcd9f115784fea3a1d05/bitsandbytes-0.49.2-py3-none-macosx_14_0_arm64.whl", hash = "sha256:87be5975edeac5396d699ecbc39dfc47cf2c026daaf2d5852a94368611a6823f", size = 131940, upload-time = "2026-02-16T21:26:04.572Z" }, + { url = "https://files.pythonhosted.org/packages/29/71/acff7af06c818664aa87ff73e17a52c7788ad746b72aea09d3cb8e424348/bitsandbytes-0.49.2-py3-none-manylinux_2_24_aarch64.whl", hash = "sha256:2fc0830c5f7169be36e60e11f2be067c8f812dfcb829801a8703735842450750", size = 31442815, upload-time = "2026-02-16T21:26:06.783Z" }, { url = "https://files.pythonhosted.org/packages/19/57/3443d6f183436fbdaf5000aac332c4d5ddb056665d459244a5608e98ae92/bitsandbytes-0.49.2-py3-none-manylinux_2_24_x86_64.whl", hash = "sha256:54b771f06e1a3c73af5c7f16ccf0fc23a846052813d4b008d10cb6e017dd1c8c", size = 60651714, upload-time = "2026-02-16T21:26:11.579Z" }, { url = "https://files.pythonhosted.org/packages/b6/d4/501655842ad6771fb077f576d78cbedb5445d15b1c3c91343ed58ca46f0e/bitsandbytes-0.49.2-py3-none-win_amd64.whl", hash = "sha256:2e0ddd09cd778155388023cbe81f00afbb7c000c214caef3ce83386e7144df7d", size = 55372289, upload-time = "2026-02-16T21:26:16.267Z" }, ] @@ -271,13 +286,27 @@ sdist = { url = "https://files.pythonhosted.org/packages/26/6a/4cc5a9dd40fd8a6d2 wheels = [ { url = "https://files.pythonhosted.org/packages/27/12/aa8d72228b6ff61c675bd6f55ab138a91d71499c8a707cc9fb2052f1d2b5/blake3-1.0.9-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f169519c7ef25ef2c446b05e2f08e7e59fae312d569f98a3134b38d4caf7abd4", size = 346253, upload-time = "2026-06-22T18:00:15.537Z" }, { url = "https://files.pythonhosted.org/packages/72/3a/820d2f729dfe152d5ebde16390f808c762dce3f21fb764ab033803ff2b1a/blake3-1.0.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b5e1f21b49492d01fa5a02084894c491ab9e7a1867fced107f7126c80d067c94", size = 335497, upload-time = "2026-06-22T18:00:16.942Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d6/d5462ec19a7f3d084fe327e08618fa107799ee708df04b3a2d620bd62816/blake3-1.0.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ee96daaa850700fd342a811fa10a8780fd2e8464a71b83a1779c7b6becd3dd5", size = 377621, upload-time = "2026-06-22T18:00:18.389Z" }, + { url = "https://files.pythonhosted.org/packages/92/98/dbc433f2a45be1b2344a6035d4212dfb6e6eb45046ad15103ead9c82d491/blake3-1.0.9-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:09deb024cd75cb200e7f647cd038800e6edc8f190c8188e0c69ec1c2b920e125", size = 377495, upload-time = "2026-06-22T18:00:20.067Z" }, + { url = "https://files.pythonhosted.org/packages/e0/3d/c7a699fb60d8ed31f3f28e6aec7658d29e45ec89e7054906b3040ce3ee65/blake3-1.0.9-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c99afb0459c82dd13e456b6b68d45c4768b539ca998dacd3ed726f1e75e91dc", size = 451158, upload-time = "2026-06-22T18:00:21.459Z" }, + { url = "https://files.pythonhosted.org/packages/2f/a1/0b1b0dbf2dd772483e372237bb65385602b019e24b67424b1fc9e5447837/blake3-1.0.9-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:28528d1f29e6f3d45faf3482e1197e5e175730eef38bdc74e56ee11b68e0ad0d", size = 491988, upload-time = "2026-06-22T18:00:22.984Z" }, + { url = "https://files.pythonhosted.org/packages/ee/d1/ed319477f6d263a4f6b7e9aa465b06be5235a854923edbc9ea09508b6638/blake3-1.0.9-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65c0c20014df687694af5ccf0cec3bdb194511da8ebd50c30b0fd55c83fa4fd5", size = 386848, upload-time = "2026-06-22T18:00:24.319Z" }, { url = "https://files.pythonhosted.org/packages/80/3e/a4cfb269f3e0955598b415a7843c358c4f79e826e3c9118dc9fb1f101ee6/blake3-1.0.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:964b642631a3c8fe117b3439c8ae64a9a0981af9444e409656d1f1e464bfa125", size = 387842, upload-time = "2026-06-22T18:00:25.589Z" }, + { url = "https://files.pythonhosted.org/packages/59/0e/d4ee3d89eece42f86eb46663aa42702000516b7ffbc53f60b918efe95b57/blake3-1.0.9-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:2fd000708662b04be211a22c1095b65fe399d7276e9f3bb2fd1ef8aacc545791", size = 384317, upload-time = "2026-06-22T18:00:26.891Z" }, + { url = "https://files.pythonhosted.org/packages/3a/aa/317106349d10de3b51332ad1e761f4864ebe887854396b75975304dcfbd1/blake3-1.0.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:82ecade6ac425fdfc39a4371d6d9232fd6e5c28748fd8d3489016ead17407014", size = 553005, upload-time = "2026-06-22T18:00:28.246Z" }, { url = "https://files.pythonhosted.org/packages/39/cc/7fbce61a0b24bda1aac99da674bd74ac2b687b61db071c888ffdb30cb47a/blake3-1.0.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b4102ba86b86c992a931b4a88c58a632d6097461e14a1e63ebd2ecb98ff0898f", size = 595086, upload-time = "2026-06-22T18:00:29.96Z" }, { url = "https://files.pythonhosted.org/packages/e6/91/6ddc7a8b582a0871f23d6db722f4950a8918096d5fa10f9f0f992c2aea39/blake3-1.0.9-cp311-cp311-win32.whl", hash = "sha256:2f4ce45da903f3d0a7e342fa70c7cce9c10cef6b529eadb4d6213be0ab0eaf84", size = 231230, upload-time = "2026-06-22T18:00:31.247Z" }, { url = "https://files.pythonhosted.org/packages/23/68/ea698e6df48eeb417671544cfbb18c60f863cb689306cc52f19666dd98f8/blake3-1.0.9-cp311-cp311-win_amd64.whl", hash = "sha256:d819457dccfd82fe34684ec99e36725f747bd5761a0e17f537387fb31d121193", size = 220622, upload-time = "2026-06-22T18:00:32.495Z" }, { url = "https://files.pythonhosted.org/packages/5c/d2/9bdf8345c70993aaef635398f52edfb915d6e8ad2c000c801204e387c456/blake3-1.0.9-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a70c20542d5e7960983a0ff32999049a2b0e5ef1f22dbbbdfb51cf04828a4156", size = 344587, upload-time = "2026-06-22T18:00:34.244Z" }, { url = "https://files.pythonhosted.org/packages/36/9d/be8b1f7f85b12bb45a0fade6ca7bdbf83a507d23d0b6141ba29fe69c8cea/blake3-1.0.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:72cdecf088a9d25e6ec79948a578995649b0dbee407e7a46c543a9ecc0f6f281", size = 328864, upload-time = "2026-06-22T18:00:35.59Z" }, + { url = "https://files.pythonhosted.org/packages/f2/78/66580635d744c826671fd219938caffb16281a26f62c4f856695d4233677/blake3-1.0.9-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42fa57bf462285ef16400601b0fd32214c248ba92505bbb94b1221ab9af5a092", size = 373795, upload-time = "2026-06-22T18:00:36.887Z" }, + { url = "https://files.pythonhosted.org/packages/b1/79/b5b17d3004bb81a5732c0b176c812703d200ed8c652b3b7713b9633bbe10/blake3-1.0.9-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b25ccde5a64be070f20e5c7a81da70292db40b164b6c77588cbd6230856badbb", size = 374183, upload-time = "2026-06-22T18:00:38.205Z" }, + { url = "https://files.pythonhosted.org/packages/3c/63/0d209c44b2041bbe130ced12a23c92dd995fbfe5bce7ee77fffea16f5cb0/blake3-1.0.9-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a800b87433955f37691b5f361ad29c7dd3ee089c9cd109adc5aea8e24bc4c1f", size = 446783, upload-time = "2026-06-22T18:00:39.493Z" }, + { url = "https://files.pythonhosted.org/packages/c5/51/efd1f9b8a9d3e9a0e235f3ced99a738529a1019fe78b3988e29d9c2fbba6/blake3-1.0.9-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6879739e7904b9c42afbedbcc2e8c36cebe140fb3fc3f5c492993579cf5cd516", size = 487369, upload-time = "2026-06-22T18:00:40.875Z" }, + { url = "https://files.pythonhosted.org/packages/8d/3f/a8dcaea9e0b26e419a540ca0cd6203c9fbb505e85b02b03c5a59bf9e6a45/blake3-1.0.9-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6edeb3d49a24c307995899b70dd47aa901d0e9ad51d2f8a79aba4f074f32d8c5", size = 383845, upload-time = "2026-06-22T18:00:42.251Z" }, { url = "https://files.pythonhosted.org/packages/f6/10/e9907f5b86410d5071982aaf05d149ca4d4fd8acab7e77eebbc9a333c7b4/blake3-1.0.9-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcd56a7a972c4185070f7042ccc20166927eec3c0f98b8405f375d007b604a0b", size = 383851, upload-time = "2026-06-22T18:00:43.715Z" }, + { url = "https://files.pythonhosted.org/packages/34/cf/c7863a185550706a9624f6aa7b6d46470aaed0bb46a827c5cda2a7d03151/blake3-1.0.9-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:a288664d08dee154cc496e06e62517fc9e655ecec12b0d7db538d244ac79edf1", size = 380067, upload-time = "2026-06-22T18:00:45.249Z" }, + { url = "https://files.pythonhosted.org/packages/54/0a/e7af679c719368b400c9ba9c3460072aac2ba077ddbd4bc806fef28cda03/blake3-1.0.9-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:91db52a809b68b5bebe7c413ddcd230e1f759398e7fa7a873104595a4fa648b6", size = 549471, upload-time = "2026-06-22T18:00:46.793Z" }, { url = "https://files.pythonhosted.org/packages/2c/3c/37c1dd3539b7bd9b6d2eef019802aacdb4a3d48ab484b140603bbf9c5b5a/blake3-1.0.9-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cfaa671b07eb73883162ca940442193868358b0b904cfa266e4b74131ce966da", size = 591396, upload-time = "2026-06-22T18:00:48.122Z" }, { url = "https://files.pythonhosted.org/packages/ae/55/4f0a23b72795292e74084834130900ea778c0583004519c86698dfffe1a5/blake3-1.0.9-cp312-cp312-win32.whl", hash = "sha256:ae47c3d5729ff89baa6ddf6de47fcfcc915985d39eb1bfcd6db653331f3c6fcc", size = 229271, upload-time = "2026-06-22T18:00:49.377Z" }, { url = "https://files.pythonhosted.org/packages/12/91/7db93e4689f0f145bcb954dc62936e5f5090548a9fa20c6bbebfaeaa648a/blake3-1.0.9-cp312-cp312-win_amd64.whl", hash = "sha256:15566065ff90ab3da46ec0be1417406f00507af902b6fb0fbc6563e77f02fc42", size = 218220, upload-time = "2026-06-22T18:00:50.659Z" }, @@ -360,14 +389,25 @@ sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8 wheels = [ { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" }, { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, + { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" }, + { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" }, + { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" }, { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" }, + { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" }, + { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" }, { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" }, { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" }, { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" }, { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" }, { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, @@ -390,13 +430,33 @@ source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7", size = 309705, upload-time = "2026-04-02T09:26:02.191Z" }, + { url = "https://files.pythonhosted.org/packages/5a/53/58c29116c340e5456724ecd2fff4196d236b98f3da97b404bc5e51ac3493/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:202389074300232baeb53ae2569a60901f7efadd4245cf3a3bf0617d60b439d7", size = 206419, upload-time = "2026-04-02T09:26:03.583Z" }, + { url = "https://files.pythonhosted.org/packages/b2/02/e8146dc6591a37a00e5144c63f29fb7c97a734ea8a111190783c0e60ab63/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:30b8d1d8c52a48c2c5690e152c169b673487a2a58de1ec7393196753063fcd5e", size = 227901, upload-time = "2026-04-02T09:26:04.738Z" }, + { url = "https://files.pythonhosted.org/packages/fb/73/77486c4cd58f1267bf17db420e930c9afa1b3be3fe8c8b8ebbebc9624359/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:532bc9bf33a68613fd7d65e4b1c71a6a38d7d42604ecf239c77392e9b4e8998c", size = 222742, upload-time = "2026-04-02T09:26:06.36Z" }, { url = "https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df", size = 214061, upload-time = "2026-04-02T09:26:08.347Z" }, + { url = "https://files.pythonhosted.org/packages/dc/92/42bd3cefcf7687253fb86694b45f37b733c97f59af3724f356fa92b8c344/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:65bcd23054beab4d166035cabbc868a09c1a49d1efe458fe8e4361215df40265", size = 199239, upload-time = "2026-04-02T09:26:09.823Z" }, + { url = "https://files.pythonhosted.org/packages/4c/3d/069e7184e2aa3b3cddc700e3dd267413dc259854adc3380421c805c6a17d/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:08e721811161356f97b4059a9ba7bafb23ea5ee2255402c42881c214e173c6b4", size = 210173, upload-time = "2026-04-02T09:26:10.953Z" }, + { url = "https://files.pythonhosted.org/packages/62/51/9d56feb5f2e7074c46f93e0ebdbe61f0848ee246e2f0d89f8e20b89ebb8f/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e060d01aec0a910bdccb8be71faf34e7799ce36950f8294c8bf612cba65a2c9e", size = 209841, upload-time = "2026-04-02T09:26:12.142Z" }, + { url = "https://files.pythonhosted.org/packages/d2/59/893d8f99cc4c837dda1fe2f1139079703deb9f321aabcb032355de13b6c7/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:38c0109396c4cfc574d502df99742a45c72c08eff0a36158b6f04000043dbf38", size = 200304, upload-time = "2026-04-02T09:26:13.711Z" }, + { url = "https://files.pythonhosted.org/packages/7d/1d/ee6f3be3464247578d1ed5c46de545ccc3d3ff933695395c402c21fa6b77/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1c2a768fdd44ee4a9339a9b0b130049139b8ce3c01d2ce09f67f5a68048d477c", size = 229455, upload-time = "2026-04-02T09:26:14.941Z" }, + { url = "https://files.pythonhosted.org/packages/54/bb/8fb0a946296ea96a488928bdce8ef99023998c48e4713af533e9bb98ef07/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:1a87ca9d5df6fe460483d9a5bbf2b18f620cbed41b432e2bddb686228282d10b", size = 210036, upload-time = "2026-04-02T09:26:16.478Z" }, + { url = "https://files.pythonhosted.org/packages/9a/bc/015b2387f913749f82afd4fcba07846d05b6d784dd16123cb66860e0237d/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d635aab80466bc95771bb78d5370e74d36d1fe31467b6b29b8b57b2a3cd7d22c", size = 224739, upload-time = "2026-04-02T09:26:17.751Z" }, { url = "https://files.pythonhosted.org/packages/17/ab/63133691f56baae417493cba6b7c641571a2130eb7bceba6773367ab9ec5/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ae196f021b5e7c78e918242d217db021ed2a6ace2bc6ae94c0fc596221c7f58d", size = 216277, upload-time = "2026-04-02T09:26:18.981Z" }, { url = "https://files.pythonhosted.org/packages/06/6d/3be70e827977f20db77c12a97e6a9f973631a45b8d186c084527e53e77a4/charset_normalizer-3.4.7-cp311-cp311-win32.whl", hash = "sha256:adb2597b428735679446b46c8badf467b4ca5f5056aae4d51a19f9570301b1ad", size = 147819, upload-time = "2026-04-02T09:26:20.295Z" }, { url = "https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:8e385e4267ab76874ae30db04c627faaaf0b509e1ccc11a95b3fc3e83f855c00", size = 159281, upload-time = "2026-04-02T09:26:21.74Z" }, { url = "https://files.pythonhosted.org/packages/ca/83/6413f36c5a34afead88ce6f66684d943d91f233d76dd083798f9602b75ae/charset_normalizer-3.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:d4a48e5b3c2a489fae013b7589308a40146ee081f6f509e047e0e096084ceca1", size = 147843, upload-time = "2026-04-02T09:26:22.901Z" }, { url = "https://files.pythonhosted.org/packages/0c/eb/4fc8d0a7110eb5fc9cc161723a34a8a6c200ce3b4fbf681bc86feee22308/charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46", size = 311328, upload-time = "2026-04-02T09:26:24.331Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e3/0fadc706008ac9d7b9b5be6dc767c05f9d3e5df51744ce4cc9605de7b9f4/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2", size = 208061, upload-time = "2026-04-02T09:26:25.568Z" }, + { url = "https://files.pythonhosted.org/packages/42/f0/3dd1045c47f4a4604df85ec18ad093912ae1344ac706993aff91d38773a2/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b", size = 229031, upload-time = "2026-04-02T09:26:26.865Z" }, + { url = "https://files.pythonhosted.org/packages/dc/67/675a46eb016118a2fbde5a277a5d15f4f69d5f3f5f338e5ee2f8948fcf43/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a", size = 225239, upload-time = "2026-04-02T09:26:28.044Z" }, { url = "https://files.pythonhosted.org/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116", size = 216589, upload-time = "2026-04-02T09:26:29.239Z" }, + { url = "https://files.pythonhosted.org/packages/b1/f1/6d2b0b261b6c4ceef0fcb0d17a01cc5bc53586c2d4796fa04b5c540bc13d/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb", size = 202733, upload-time = "2026-04-02T09:26:30.5Z" }, + { url = "https://files.pythonhosted.org/packages/6f/c0/7b1f943f7e87cc3db9626ba17807d042c38645f0a1d4415c7a14afb5591f/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1", size = 212652, upload-time = "2026-04-02T09:26:31.709Z" }, + { url = "https://files.pythonhosted.org/packages/38/dd/5a9ab159fe45c6e72079398f277b7d2b523e7f716acc489726115a910097/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15", size = 211229, upload-time = "2026-04-02T09:26:33.282Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ff/531a1cad5ca855d1c1a8b69cb71abfd6d85c0291580146fda7c82857caa1/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5", size = 203552, upload-time = "2026-04-02T09:26:34.845Z" }, + { url = "https://files.pythonhosted.org/packages/c1/4c/a5fb52d528a8ca41f7598cb619409ece30a169fbdf9cdce592e53b46c3a6/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d", size = 230806, upload-time = "2026-04-02T09:26:36.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/7a/071feed8124111a32b316b33ae4de83d36923039ef8cf48120266844285b/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7", size = 212316, upload-time = "2026-04-02T09:26:37.672Z" }, + { url = "https://files.pythonhosted.org/packages/fd/35/f7dba3994312d7ba508e041eaac39a36b120f32d4c8662b8814dab876431/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464", size = 227274, upload-time = "2026-04-02T09:26:38.93Z" }, { url = "https://files.pythonhosted.org/packages/8a/2d/a572df5c9204ab7688ec1edc895a73ebded3b023bb07364710b05dd1c9be/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49", size = 218468, upload-time = "2026-04-02T09:26:40.17Z" }, { url = "https://files.pythonhosted.org/packages/86/eb/890922a8b03a568ca2f336c36585a4713c55d4d67bf0f0c78924be6315ca/charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c", size = 148460, upload-time = "2026-04-02T09:26:41.416Z" }, { url = "https://files.pythonhosted.org/packages/35/d9/0e7dffa06c5ab081f75b1b786f0aefc88365825dfcd0ac544bdb7b2b6853/charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6", size = 159330, upload-time = "2026-04-02T09:26:42.554Z" }, @@ -485,20 +545,29 @@ sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd wheels = [ { url = "https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1", size = 288773, upload-time = "2025-07-26T12:01:02.277Z" }, { url = "https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381", size = 270149, upload-time = "2025-07-26T12:01:04.072Z" }, + { url = "https://files.pythonhosted.org/packages/30/2e/dd4ced42fefac8470661d7cb7e264808425e6c5d56d175291e93890cce09/contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7", size = 329222, upload-time = "2025-07-26T12:01:05.688Z" }, + { url = "https://files.pythonhosted.org/packages/f2/74/cc6ec2548e3d276c71389ea4802a774b7aa3558223b7bade3f25787fafc2/contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1", size = 377234, upload-time = "2025-07-26T12:01:07.054Z" }, + { url = "https://files.pythonhosted.org/packages/03/b3/64ef723029f917410f75c09da54254c5f9ea90ef89b143ccadb09df14c15/contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a", size = 380555, upload-time = "2025-07-26T12:01:08.801Z" }, { url = "https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db", size = 355238, upload-time = "2025-07-26T12:01:10.319Z" }, + { url = "https://files.pythonhosted.org/packages/98/56/f914f0dd678480708a04cfd2206e7c382533249bc5001eb9f58aa693e200/contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620", size = 1326218, upload-time = "2025-07-26T12:01:12.659Z" }, { url = "https://files.pythonhosted.org/packages/fb/d7/4a972334a0c971acd5172389671113ae82aa7527073980c38d5868ff1161/contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f", size = 1392867, upload-time = "2025-07-26T12:01:15.533Z" }, { url = "https://files.pythonhosted.org/packages/75/3e/f2cc6cd56dc8cff46b1a56232eabc6feea52720083ea71ab15523daab796/contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff", size = 183677, upload-time = "2025-07-26T12:01:17.088Z" }, { url = "https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42", size = 225234, upload-time = "2025-07-26T12:01:18.256Z" }, { url = "https://files.pythonhosted.org/packages/d9/b6/71771e02c2e004450c12b1120a5f488cad2e4d5b590b1af8bad060360fe4/contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470", size = 193123, upload-time = "2025-07-26T12:01:19.848Z" }, { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, + { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, + { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, + { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, { url = "https://files.pythonhosted.org/packages/a5/29/8dcfe16f0107943fa92388c23f6e05cff0ba58058c4c95b00280d4c75a14/contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497", size = 278809, upload-time = "2025-07-26T12:02:52.74Z" }, { url = "https://files.pythonhosted.org/packages/85/a9/8b37ef4f7dafeb335daee3c8254645ef5725be4d9c6aa70b50ec46ef2f7e/contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8", size = 261593, upload-time = "2025-07-26T12:02:54.037Z" }, + { url = "https://files.pythonhosted.org/packages/0a/59/ebfb8c677c75605cc27f7122c90313fd2f375ff3c8d19a1694bda74aaa63/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e", size = 302202, upload-time = "2025-07-26T12:02:55.947Z" }, { url = "https://files.pythonhosted.org/packages/3c/37/21972a15834d90bfbfb009b9d004779bd5a07a0ec0234e5ba8f64d5736f4/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989", size = 329207, upload-time = "2025-07-26T12:02:57.468Z" }, { url = "https://files.pythonhosted.org/packages/0c/58/bd257695f39d05594ca4ad60df5bcb7e32247f9951fd09a9b8edb82d1daa/contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77", size = 225315, upload-time = "2025-07-26T12:02:58.801Z" }, ] @@ -511,14 +580,30 @@ sdist = { url = "https://files.pythonhosted.org/packages/b4/91/0a7c28934e50d8ac9 wheels = [ { url = "https://files.pythonhosted.org/packages/f1/24/efb17eb94018dd3415d0e8a76a4786a866e8964aa9c50f033399d23939c2/coverage-7.14.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e574801e1d643561594aa021206c46d80b257e9853087090ba97bed8b0a509d3", size = 220501, upload-time = "2026-06-22T23:08:02.182Z" }, { url = "https://files.pythonhosted.org/packages/76/93/32f1bfca6cdd34259c8af42820a034b7a28dfb44969a13ed38c17e0ba5b0/coverage-7.14.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f82b6bb7d75a2613e85d07cefa3a8c973d0544a8993337f6e2728e4a1e94c305", size = 221008, upload-time = "2026-06-22T23:08:03.701Z" }, + { url = "https://files.pythonhosted.org/packages/eb/88/0d0f974855ff905d15a64f7873d00bdc4182e2736267486c6634f4af293c/coverage-7.14.3-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a2335ea5fed26af2e831094964fa3f8fae60b45f7e37fcc2d3b615b2add3ad87", size = 251420, upload-time = "2026-06-22T23:08:05.211Z" }, { url = "https://files.pythonhosted.org/packages/39/7f/117dd2ec65e4140576f8ef991d88220f9b806769f7a8c20e0550c0f924e2/coverage-7.14.3-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fbb8c3a98e779013786ae01d229662aeacbc77100efbd3f2f245219ace5af700", size = 253331, upload-time = "2026-06-22T23:08:06.672Z" }, + { url = "https://files.pythonhosted.org/packages/87/55/f0bd6d6538e3f16829fb8a44b6c0d2fe9da638bbfdd6a20f8b5da8f4fa81/coverage-7.14.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac082660de8f429ba0ea363595abb838998570b9a7546777c60f413ab902bbde", size = 255441, upload-time = "2026-06-22T23:08:08.208Z" }, + { url = "https://files.pythonhosted.org/packages/1e/98/aa71f7879019c846a8a9662579ea4484b0202cf1e252ffeed647075e7eca/coverage-7.14.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ac012839ff7e396030f1e94e10553a431d14e4de2ab65cb3acb72bbd5628ca2", size = 257398, upload-time = "2026-06-22T23:08:09.749Z" }, + { url = "https://files.pythonhosted.org/packages/f3/4f/5fd367e59844190f5965015d7bee899e67a89d13eb2760118479bf836f2f/coverage-7.14.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5952f8c1bda2a5347154450379316e6dfa4d934d62ca35f6784451e6f55074fb", size = 251558, upload-time = "2026-06-22T23:08:11.37Z" }, + { url = "https://files.pythonhosted.org/packages/8f/de/5383a6ee5a6376701fe07d980fa8e4a66c0c377fead16712720340d701a3/coverage-7.14.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8cf0f2509acb4619e2471a1951089054dd58ebea7a912066d2ea56dd4c24ca4a", size = 253134, upload-time = "2026-06-22T23:08:13.04Z" }, + { url = "https://files.pythonhosted.org/packages/01/99/09542b1a99f788e3daec7f0fadc288821e71aca9ea298d51bfa1ba79fed5/coverage-7.14.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2e41fd3aab806770008279a93879b0924b16247e09ab537c043d08bbca53b4ab", size = 251195, upload-time = "2026-06-22T23:08:14.606Z" }, + { url = "https://files.pythonhosted.org/packages/02/9d/722fe8c13f0fbb064491b9e8656e56a606286792e5068c47ca1042e773e8/coverage-7.14.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f0a47095963cfe054e0df178daca95aec21e680d6076da807c3add28dfe920f7", size = 254959, upload-time = "2026-06-22T23:08:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/fb/58/943627179ff1d82da9e54d0a5b0bb907bb19cf19515599ccd921de50b469/coverage-7.14.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:a090cbf9521e78ffdb2fcf448b72902afe9f5923ff6a12d5c0d0120200348af9", size = 250914, upload-time = "2026-06-22T23:08:18.03Z" }, { url = "https://files.pythonhosted.org/packages/a5/d4/803efcbf9ae5567454a0c71e983589529448e2704ee0da2dc0163d482f18/coverage-7.14.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4d310baf69a4fbe8a098ce727e4808a34866ac718a6f759ae659cbd3221358bc", size = 251824, upload-time = "2026-06-22T23:08:19.704Z" }, { url = "https://files.pythonhosted.org/packages/32/79/3f78ea9563132746eed5cecb75d2e576f9d8fec45a47242b5ae0950b82a3/coverage-7.14.3-cp311-cp311-win32.whl", hash = "sha256:74fdd718d88fe144f4579b8747873a07ec3f04cb837d5faec5a25d9e22fa31a8", size = 222594, upload-time = "2026-06-22T23:08:21.311Z" }, { url = "https://files.pythonhosted.org/packages/85/22/9ebbc5a2ab42ac5d0eea1f48648629e1de9bbe41ec243ed6b93d55a5a53f/coverage-7.14.3-cp311-cp311-win_amd64.whl", hash = "sha256:cc96aa922e21d4bc5d5ed3c915cef27dfcbc13686f47d5e378d647fbfba655a2", size = 223073, upload-time = "2026-06-22T23:08:23.318Z" }, { url = "https://files.pythonhosted.org/packages/71/af/69d5fcc16cb555153f99cec5467922f226be0369f7335a9506856d2a7bd0/coverage-7.14.3-cp311-cp311-win_arm64.whl", hash = "sha256:c66f9f9d4f1e9712eb9b1de5310f881d4e2188cfcba5065e1a8490f38687f2c4", size = 222617, upload-time = "2026-06-22T23:08:25.054Z" }, { url = "https://files.pythonhosted.org/packages/bd/b0/8a911f6ffe6974dac4df95b468ab9a2899d0e59f0f99a489afeec39f00bc/coverage-7.14.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3d74ff26299c4879ce3a4d826f9d3d4d556fd285fde7bbce3c0ef5a8ab1cec24", size = 220672, upload-time = "2026-06-22T23:08:26.621Z" }, { url = "https://files.pythonhosted.org/packages/36/16/0fc0cb52538783dbbae0934b834f5a58fd5354380ee6cad4a07b15dc845d/coverage-7.14.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:96150a9cf3468ea20f0bc5d0e21b3df8972c31480ef90fa7614b773cc6429665", size = 221035, upload-time = "2026-06-22T23:08:28.372Z" }, + { url = "https://files.pythonhosted.org/packages/77/e2/421ccfbb48335ac49e93301478cf5d623b0c2bf1c0cadd8e2b2fc6c0c710/coverage-7.14.3-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:27d07a46500ba23515b838dbcf52512026af04090755cf6cc64166d88c9b9a1a", size = 252540, upload-time = "2026-06-22T23:08:30.226Z" }, { url = "https://files.pythonhosted.org/packages/06/c2/05b8c890097c61a7f4406b35396b997a635200ded0339eda83dfbe526c5f/coverage-7.14.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:621e13c6108234d7960aaf5762ab5c3c00f33c30c15af06dcbff0c73bf112727", size = 255274, upload-time = "2026-06-22T23:08:31.876Z" }, + { url = "https://files.pythonhosted.org/packages/dc/be/b6d9efe447f8ba3c3c854195f326bd64c54b907d936cd2fdebf8767ec72e/coverage-7.14.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4b60ca6d8af70473491a15a343cbabab2e8f9ea66a4376e81c7aa24876a6f977", size = 256389, upload-time = "2026-06-22T23:08:33.843Z" }, + { url = "https://files.pythonhosted.org/packages/d4/3c/f26e50acc429e608bc534ac06f0a3c169019c798178ec5e9de3dbc0df9c9/coverage-7.14.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c90a7cdd5e380e1ce02f19792e2ac2fbfbf177e35a27e69fd3e873b30d895c0c", size = 258648, upload-time = "2026-06-22T23:08:35.481Z" }, + { url = "https://files.pythonhosted.org/packages/9e/a2/01c1fabf816c8e1dae197e258edf878a3d3ddc86fbda34b76e5794277d8f/coverage-7.14.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5d788e5fd55347eef06ca0732c77d04a264de67e8ff24631270cdff3767a60cf", size = 252949, upload-time = "2026-06-22T23:08:37.562Z" }, + { url = "https://files.pythonhosted.org/packages/89/c6/941166dd79c31fd44a13063780ae8d552eee0089a0a0930b9bdb7df554ed/coverage-7.14.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:62c7f79db2851c95ef020e5d28b97afde3daf9f7febcd35b53e05638f729063f", size = 254310, upload-time = "2026-06-22T23:08:39.174Z" }, + { url = "https://files.pythonhosted.org/packages/10/31/80b1fd028201a961033ce95be3cd1e39e521b3762e6b4a1ac1616cb291e7/coverage-7.14.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:90f7608aeb5d9b60b523b9fb2a4ee1973867cc4865a3f26fe6c7577073b70205", size = 252453, upload-time = "2026-06-22T23:08:40.84Z" }, + { url = "https://files.pythonhosted.org/packages/5f/85/c3d9addd94c4b524f3f4af0232075f5fe7170ce99a1386edff803e5934db/coverage-7.14.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1e3b91f9c4740aeb571ecf82e5e8d8e4ab62d34fcb5a5d4e5baa38c6f7d2857c", size = 256522, upload-time = "2026-06-22T23:08:42.494Z" }, + { url = "https://files.pythonhosted.org/packages/91/14/e5a0575f73795af3a7a9ae13dadf812e17d32422896839987dc3f86947e1/coverage-7.14.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:c946099774a7699de03cbd0ff0a64e21aed4525eed9d959adde4afe6d15758ef", size = 252023, upload-time = "2026-06-22T23:08:44.243Z" }, { url = "https://files.pythonhosted.org/packages/38/9b/9652ee531937ce3b8a63a8896885b2b4a2d56adc30e53c9540c666286d88/coverage-7.14.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:16b206e521feb8b7133a45754643dead0538489cf8b783b90cf5f4e3299625fd", size = 253893, upload-time = "2026-06-22T23:08:46.113Z" }, { url = "https://files.pythonhosted.org/packages/b1/05/42678841c8c38e4b08bdfc48269f5a16dfbf5806000fe6a89b4cece3c691/coverage-7.14.3-cp312-cp312-win32.whl", hash = "sha256:ea3169c7116eb6cdf7608c6c7da9ecfcb3da40688e3a510fac2d1d2bafd6dc35", size = 222734, upload-time = "2026-06-22T23:08:47.858Z" }, { url = "https://files.pythonhosted.org/packages/df/87/07a4fcee55177a25f1b52331a8e92cf4f2c53b1a9c75ce2981fd59c684ad/coverage-7.14.3-cp312-cp312-win_amd64.whl", hash = "sha256:7ea52fc08f007bcc494d4bb3df3851e95843d881860ba38fe2c64dc100db5e7d", size = 223266, upload-time = "2026-06-22T23:08:49.494Z" }, @@ -541,19 +626,35 @@ dependencies = [ sdist = { url = "https://files.pythonhosted.org/packages/1f/99/d1c90d6041656cc6ee229dc99cd67fd0cd5aec3c5f7d72fffc27cc750054/cryptography-49.0.0.tar.gz", hash = "sha256:f89660a348f4f78a92366240a61404e337586ef7f5909a2fef59ca88ef505493", size = 854345, upload-time = "2026-06-12T20:02:30.512Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/9b/22/adf66990e63584a68dfb50c24f48a125c07b1699899381c8151e63ed458c/cryptography-49.0.0-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:966fe0e9c67490071f14c0d2b1cb2dfb3023c5ce39457343931415f08382f2db", size = 4032100, upload-time = "2026-06-12T20:02:32.143Z" }, + { url = "https://files.pythonhosted.org/packages/09/41/3797cfaf69cae04a13ee78ebd83f0678d9c02b4779d21ce24445326f1a69/cryptography-49.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:36d1709f992593689b45bda411498d62c6e365f2ca00b84657d4dadd24de16db", size = 4692978, upload-time = "2026-06-12T20:01:21.305Z" }, { url = "https://files.pythonhosted.org/packages/e6/8b/43011f7ebe515a8aa20d61f290a326cd890c2e738e16e59eaff8d9c3a412/cryptography-49.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0e959b578856a3924bc0cbb710fc12c387b9412a951389f3ca61704a9e25f325", size = 4716422, upload-time = "2026-06-12T20:01:48.566Z" }, + { url = "https://files.pythonhosted.org/packages/4a/91/01ce7303a4579e6d3a6abef01bd322848e9ea7a219adcabc5048b9033571/cryptography-49.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:53ecee2e23f7169b6117e99fc8a944e5e50f79e69758a83b52a00cb98ab2b2d2", size = 4700503, upload-time = "2026-06-12T20:02:47.091Z" }, + { url = "https://files.pythonhosted.org/packages/62/99/a2c95cf8293f07491e9e27c20cc4dcd18176d944e674679adeb1d0173fd6/cryptography-49.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:2eda353d8a27bcbcaa4cbed18994a74ab4d19a2ca897db188ea269ab9b71419b", size = 5309779, upload-time = "2026-06-12T20:02:08.987Z" }, { url = "https://files.pythonhosted.org/packages/20/2c/0622f20ff02b2ef32558733443805dc82fd4c275be01b2d19d14676f3a1b/cryptography-49.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2afe9051da7ae7bd5905da5a949280c7d2bb75682e188f650a9d0f2756b834c6", size = 4749683, upload-time = "2026-06-12T20:02:03.335Z" }, + { url = "https://files.pythonhosted.org/packages/a3/5b/c5246635d5fd3b64e0d45ae10e99fd32fe9676a79915ccfe5a61ba9af1a5/cryptography-49.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:0b82e28ee398a386f0807bba7884d30f25218855690f45115831bcce5d90822c", size = 4337874, upload-time = "2026-06-12T20:02:54.323Z" }, + { url = "https://files.pythonhosted.org/packages/6d/88/05563c7fe2e914e87d1a536d06fe83e66b4e1d95cb593e05aea375531da8/cryptography-49.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:ccac2bfebc306b862133e3bb71f3f6ee8bb525240089b2d952e4144b3a6d5da7", size = 4700283, upload-time = "2026-06-12T20:01:34.822Z" }, + { url = "https://files.pythonhosted.org/packages/c4/b6/d7696e4e890d6ae1469935164c9e5215c557671cb78d6e3f458ccceaa632/cryptography-49.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:d0527ce944105f257f605a827d6ebead966c752038b6e8656abb9c5edee6fc68", size = 5265844, upload-time = "2026-06-12T20:01:24.09Z" }, { url = "https://files.pythonhosted.org/packages/a9/3c/f3ad17eecc1a57b0ba236dc01f90e783c51f4a2f35f64777cc4f47a184b2/cryptography-49.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:cbc77da8c523d5abd028635ba850a6966fcee2c82e2bf65a41d1d8afe0f98be9", size = 4749290, upload-time = "2026-06-12T20:01:30.848Z" }, + { url = "https://files.pythonhosted.org/packages/4f/01/339573cf1023163a400b0b5d16f6d507de413b9f60be6fd1b77feeaf6737/cryptography-49.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b87e65d263b3e5d3bb92a57e2a6638e2f31110fa7aa890c7b2dbba42248d0a3f", size = 4834612, upload-time = "2026-06-12T20:01:29.246Z" }, { url = "https://files.pythonhosted.org/packages/71/fd/577302e213a1be9468f92d1afef66fcf1ef83d516819d9992ca547f592bd/cryptography-49.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:66ec79c3904820572d7e987abdf304281f141d37ad9a489b8e97066e7b9b6459", size = 4980804, upload-time = "2026-06-12T20:01:42.853Z" }, { url = "https://files.pythonhosted.org/packages/1f/09/f42b1d190c5ba75f72062a387f8030d1d75f6ab035788f1d9c4b01de6525/cryptography-49.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:e5dfc1e64de5677cec922ffa8da89c546d0415bf6efdf081842e5d44c84e1f0e", size = 3810026, upload-time = "2026-06-12T20:02:39.262Z" }, { url = "https://files.pythonhosted.org/packages/19/2a/5bb823f5bedcf80718cea7fbc95ec5515cca3769633c4b01a32be7f30e7c/cryptography-49.0.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ec5e529fb80935c94fe7b729f9972b50e351a0e6b50aa294fd5cabb109fcc29a", size = 4025947, upload-time = "2026-06-12T20:01:25.745Z" }, + { url = "https://files.pythonhosted.org/packages/3d/df/40577043ca124e17012f408ddddaeb213b856336ac82ddb3bc915f39e29f/cryptography-49.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f78ff2c9ed8dc2d036b0f4d640e22522213d047c1b14e61205a7e55c80a494d4", size = 4692429, upload-time = "2026-06-12T20:01:53.628Z" }, { url = "https://files.pythonhosted.org/packages/2c/99/2d13299eb3dd27b02dcfaafcc91d6b5cb3329f7cbd6d8f51921acd566c1a/cryptography-49.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:35b151772baff2c74cba7fa290ceaff4c3b11c0c881eb93eb5dbc05a7cfbba18", size = 4700968, upload-time = "2026-06-12T20:02:45.383Z" }, + { url = "https://files.pythonhosted.org/packages/a5/4d/9c0cd02f95e2602dd5e563da149ee0830abef3537be8b34dc56281ebe27a/cryptography-49.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0f21641cf4b30fca7aee061ced0ec7ad7b073518088b7c9969a297c0ae796c69", size = 4697758, upload-time = "2026-06-12T20:01:41.13Z" }, + { url = "https://files.pythonhosted.org/packages/24/01/186c825898477d77e2324d5360fefe622ff1d8d1963ec0554e2cada8ec77/cryptography-49.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:9e82dcc8e56052715fb18b2429e3bca4823b1629136a2084fc45a9a5cecb9b64", size = 5298863, upload-time = "2026-06-12T20:02:24.579Z" }, { url = "https://files.pythonhosted.org/packages/b8/7b/62cbbab75d0659865bf0273790031544a0b16c8072d258f9428dcd8190dc/cryptography-49.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6f2debedf9ca60cf1d5bd466475638af5130f89965605cd818484d19987d3a21", size = 4735983, upload-time = "2026-06-12T20:01:50.14Z" }, + { url = "https://files.pythonhosted.org/packages/6c/72/3e798c064bc39e471008075d0f9bc9daf77a80879c092e4a8e170c585ed4/cryptography-49.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:8c25ceb16df5b9435f3f6a9829204985b0e0cbee3b48aacd432c7d2c850b44d9", size = 4334173, upload-time = "2026-06-12T20:01:44.743Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ee/6fca21d1ac73e06f8bef71940abfd4d2f6472b4bca284d770f32bd4086f6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:28d8b15e6275f12c8a207dc309dfa957903c927d08d0cc937ee3f63f200693cc", size = 4697298, upload-time = "2026-06-12T20:02:20.918Z" }, + { url = "https://files.pythonhosted.org/packages/67/d0/a5fcd3515f0bae49a7b6d0413cc1bdccdcc1fc0047037a0d480642cdc5d6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:6fc361c34fb6aac015ce19435876635e5c6d21db31998b0920f675f131e043b8", size = 5254338, upload-time = "2026-06-12T20:02:22.737Z" }, { url = "https://files.pythonhosted.org/packages/a0/84/84fe36f19caf857d61cb7fc9c63035a47ffabd84ea12d1d393148efa3615/cryptography-49.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2400ef9c9e2299a25614eb1dea3db54a69b1349efd043bfac9c67630d136df36", size = 4735650, upload-time = "2026-06-12T20:02:41.389Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a0/db537264e234f7273a73ec020873d6d6b39dfd8a53db78b550ca8320440e/cryptography-49.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:67e1d20ad9ef3a563c59ef22e7a8a0b8210bd26604369ea4a30a7c66aefe504e", size = 4834820, upload-time = "2026-06-12T20:01:51.847Z" }, { url = "https://files.pythonhosted.org/packages/93/77/8df9eb486495979bccecd1062e2eaf435250e84437040295b57d09048b0b/cryptography-49.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:42b0684e0e40cf26122427802486f6d93aea593612603a94fbf260c7eb1e9c1b", size = 4967968, upload-time = "2026-06-12T20:02:12.524Z" }, { url = "https://files.pythonhosted.org/packages/c2/e6/f60198ea8d9dfa15fff9ed4ca02ce362f6eadd9ba757dcc50634c4257b63/cryptography-49.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:026ac7423e6fa66872d3bf889be5974507da3944f866f704fa200eadacd00001", size = 3785547, upload-time = "2026-06-12T20:02:26.847Z" }, { url = "https://files.pythonhosted.org/packages/63/d3/4a83af35d65e3fad632c926fad684c193ea4398569ccb0bbbc7fe8f5dc9a/cryptography-49.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:fc1e275c2f1d97b1a6450b8b0ea3ebfa6e087a611c2b26cb2404d48588abab7b", size = 3993685, upload-time = "2026-06-12T20:02:14.883Z" }, + { url = "https://files.pythonhosted.org/packages/d6/a7/f9dac0ab7f80368c56993a7bf638ef9935f825c91902798481fac0898138/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83782480a4a9da4d0feb51950131ba32e12e70813848b3343f6e18c28a66838", size = 4676239, upload-time = "2026-06-12T20:02:28.793Z" }, { url = "https://files.pythonhosted.org/packages/d7/70/2ba3769dd0ae167e2f33dfa9592d45db6ff9a61d62ca1a5b3d1bdd09068f/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b39efa323140595abd3ecca8529d321ae50f55f3aa3ba9cc81ea56a6011953d5", size = 4715584, upload-time = "2026-06-12T20:01:27.495Z" }, + { url = "https://files.pythonhosted.org/packages/94/64/2923570ac1c0bd3a737aa366ac3abbbbde273042308b8cde95e2364a6e6a/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:b47db11c2c3525083296069b98ac5221907455e989ae0c2e3008bde851921615", size = 4675885, upload-time = "2026-06-12T20:01:55.49Z" }, { url = "https://files.pythonhosted.org/packages/ab/f8/614dc7e051418cfe53d55173c1e24c6b0085e89996fe90508c2fdf769aef/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:084ef1af862eb07ec46d25f68689f2102a9fc0e05ce7b80f14f5fe51e4eef0f6", size = 4715449, upload-time = "2026-06-12T20:02:05.469Z" }, { url = "https://files.pythonhosted.org/packages/aa/50/a9caea39ad19c431c1a3f8a31114df65b260cdfe67786b6c7e7c040c4c44/cryptography-49.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be9fcb48a55f023493482827d4f459bd263cc20efde64f204b97c123201850c6", size = 3783731, upload-time = "2026-06-12T20:02:43.319Z" }, ] @@ -794,13 +895,17 @@ sdist = { url = "https://files.pythonhosted.org/packages/84/69/c97f2c18e0db87d2c wheels = [ { url = "https://files.pythonhosted.org/packages/75/2b/a7f1545bdf5da69c4bda0cea2a5781f0ad2a6623e0277267672db43c5fe6/fonttools-4.63.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b8ae05d9eacf6081414d759c0a352769ac28ce31280d6bb8e77b03f9e3c449f", size = 2881793, upload-time = "2026-05-14T12:02:56.645Z" }, { url = "https://files.pythonhosted.org/packages/49/50/965308c703f085f225db2886813b27e015b8b3438c350b22dd65b52c2a2c/fonttools-4.63.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79cdc9f567aec74a72918fd060283911406750cbc9fd28c1316023deb6ce31a9", size = 2428130, upload-time = "2026-05-14T12:02:58.891Z" }, + { url = "https://files.pythonhosted.org/packages/d8/38/6937fbd7f2dc3a6b48725851bc2c15ec949b9af14d9bbcb5fe83cdf9bdf9/fonttools-4.63.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c14b4fd138c4bafcca294765c547914e1aa431ae1ca94ab99d8db08c958bd3b", size = 5111952, upload-time = "2026-05-14T12:03:01.263Z" }, { url = "https://files.pythonhosted.org/packages/0b/43/a81f20050a3115b57d62c8e781446949512eac36690dc384ccea65ff4cc1/fonttools-4.63.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76ac49f929aecaf82d83250b8347e099d7aecba0f4726c1d9b6df3b8bb5fe18", size = 5082308, upload-time = "2026-05-14T12:03:03.211Z" }, + { url = "https://files.pythonhosted.org/packages/67/00/cdd9d4944ca6ae280d01e69cc37bde3bf663630b837a6fc6d2cd65d80e0e/fonttools-4.63.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dcf076a4474fe0d7367e5bbf5b052c7284fa1feca729c04176ce513521afd8a0", size = 5087932, upload-time = "2026-05-14T12:03:05.147Z" }, { url = "https://files.pythonhosted.org/packages/f5/f1/0aa0dbea778c75adbef223c42019fd47d22262b905974d62d829545d485f/fonttools-4.63.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7dd683fef0663e9f0f45cf541d788d24caa3ec9db50796b588e1757d8b3bc007", size = 5213271, upload-time = "2026-05-14T12:03:07.238Z" }, { url = "https://files.pythonhosted.org/packages/a8/99/253e4056e1f0e67b9390125a154b73b5eb73ad521bece95c004858fdeec2/fonttools-4.63.0-cp311-cp311-win32.whl", hash = "sha256:afefc1ed0a59785a7fb06ea7e1678e849c193e1e387db783579bc7b3056fcfcb", size = 2304473, upload-time = "2026-05-14T12:03:09.271Z" }, { url = "https://files.pythonhosted.org/packages/08/60/defa5e69641db890a63be281f41345f4c33b157824eaf0b9fad3e08b0dcb/fonttools-4.63.0-cp311-cp311-win_amd64.whl", hash = "sha256:063e08bd17bd5a90127a14123de0d6a952dbc847695fd98b63c043d58057f90c", size = 2356389, upload-time = "2026-05-14T12:03:11.53Z" }, { url = "https://files.pythonhosted.org/packages/08/ef/b3c6b9b5be2f82416d73fe2ed2e96e2793cd80e7510bd6a17ca79cdd88ec/fonttools-4.63.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:37dd23e621e3b0aef1baa70a303b80aaf38449632cfc8fd2a55fb285bbccfc02", size = 2881131, upload-time = "2026-05-14T12:03:13.386Z" }, { url = "https://files.pythonhosted.org/packages/44/a0/c815bea63117fa63e4e1c01f8a1110d2112fa003f838e6467094ec2432ce/fonttools-4.63.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a9faff9e0c1f76f9fd55899d2ce785832efebab37eb8ae13995853aef178bef0", size = 2426704, upload-time = "2026-05-14T12:03:15.801Z" }, + { url = "https://files.pythonhosted.org/packages/44/04/0b91d8e916e92ad1fac9e4624760baf0fd5ff2ead614c2f68fb21373f03f/fonttools-4.63.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef3048ef05dbb552b89817713d9cac912e00d0fde4a3105c00d29e52e10c89af", size = 5044298, upload-time = "2026-05-14T12:03:18.085Z" }, { url = "https://files.pythonhosted.org/packages/77/c7/2342da9830e3e9d4870305ca5d2091d2a83284f2953079b7bdd3b5e029d8/fonttools-4.63.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58dc6bb86a78d782f00f9190ca02c119cf5bbe2807536e361e18d42019f877d8", size = 4999800, upload-time = "2026-05-14T12:03:20.161Z" }, + { url = "https://files.pythonhosted.org/packages/e6/6d/67fe16c48d7ce050979b33f47e0d28a318f02da030602e944c34f7a16ef3/fonttools-4.63.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee08ebfa58f6e1aeff5697ab9582105bb620008c1caafb681e4c557e7483027b", size = 4982666, upload-time = "2026-05-14T12:03:22.87Z" }, { url = "https://files.pythonhosted.org/packages/f2/00/3bbab338c07c71fa56269953845e92c951a61457bbbb0f1022551ea266d9/fonttools-4.63.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:27fdc65af8da6f88b9c6121c47a464cbe359fcfff7ff6fc2d37a1f395d755b78", size = 5133598, upload-time = "2026-05-14T12:03:25.168Z" }, { url = "https://files.pythonhosted.org/packages/62/f2/aa27c7f98db5b064883dadcc5283947e81e034de42e22a33675878d98b54/fonttools-4.63.0-cp312-cp312-win32.whl", hash = "sha256:af2fd1664d00a397d75f806985ddb36282091c2131a73a6485c23b4a34722263", size = 2292575, upload-time = "2026-05-14T12:03:27.496Z" }, { url = "https://files.pythonhosted.org/packages/87/36/cccb9bc2a6ab63d1b2980374f0dca72ce95ae267c9b4cfe77455bb70d0d4/fonttools-4.63.0-cp312-cp312-win_amd64.whl", hash = "sha256:59ac449f8cca9b4ffa08d2e7bbadad87ce710d69d1eda5c3c1ce579baa987272", size = 2343211, upload-time = "2026-05-14T12:03:30.057Z" }, @@ -867,6 +972,8 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7a/d8/5e54cf37434759d1f4f2ba9b66077ff9d4c4e1f37b6bd7975da5c40d94ab/hf_xet-1.5.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:6abd35c3221eff63836618ddfb954dcf84798603f71d8e33e3ed7b04acfdbe6e", size = 4077794, upload-time = "2026-06-08T23:02:40.656Z" }, { url = "https://files.pythonhosted.org/packages/35/94/4b2ecfbad8f8b04701a23aefb62f540b9137d058b7e1dbef16a32676f0e9/hf_xet-1.5.1-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:94e761bbd266bf4c03cee73753916062665ce8365aa40ed321f45afcb934b41e", size = 3845354, upload-time = "2026-06-08T23:02:42.702Z" }, { url = "https://files.pythonhosted.org/packages/de/cc/f99f4bc7295023d7bd9ebbfd51f75cc530ca262c1227666268b8208f4b77/hf_xet-1.5.1-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:892e3a3a3aecc12aded8b93cf4f9cd059282c7de0732f7d55026f3abdf474350", size = 4514864, upload-time = "2026-06-08T23:02:44.497Z" }, + { url = "https://files.pythonhosted.org/packages/cd/6e/21f7e5a2381278bd3b7b7a5a4d90038518bb6308a0c1daf5d9f8268bb178/hf_xet-1.5.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a93df2039190502835b1db8cd7e178b0b7b889fe9ab51299d5ced26e0dd879a4", size = 4303784, upload-time = "2026-06-08T23:02:46.203Z" }, + { url = "https://files.pythonhosted.org/packages/35/0e/f992bb6927ac1cb30ef74e62268f551f338bc32b2191f7c96a44c6f7283e/hf_xet-1.5.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0c97106032ef70467b4f6bc2d0ccc266d7613ee076afc56516c502f87ce1c4a6", size = 4500703, upload-time = "2026-06-08T23:02:47.628Z" }, { url = "https://files.pythonhosted.org/packages/fb/d1/90a498d05447980b977b1669246eeeeae4cfb0ea3e7a286eaba627f91bf9/hf_xet-1.5.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6208adb15d192b90e4c2ad2a27ed864359b2cb0f2494eb6d7c7f3699ac02e2bf", size = 4719498, upload-time = "2026-06-08T23:02:49.268Z" }, { url = "https://files.pythonhosted.org/packages/6d/b6/20f99cfe97cc663a711f7b33cc21d4793e51968e9a26125b4afcd77315ba/hf_xet-1.5.1-cp37-abi3-win_amd64.whl", hash = "sha256:f7b3002f95d1c13e24bcb4537baa8f0eb3838957067c91bb4959bc004a6435f5", size = 4026419, upload-time = "2026-06-08T23:02:50.829Z" }, { url = "https://files.pythonhosted.org/packages/f9/fa/77453694888f03e5a8c8852d1514a0894d8e81c622d39edbaf308ea0dcf4/hf_xet-1.5.1-cp37-abi3-win_arm64.whl", hash = "sha256:93d090b57b211133f6c0dab0205ef5cb6d89162979ba75a74845045cc3063b8e", size = 3855178, upload-time = "2026-06-08T23:02:52.452Z" }, @@ -894,11 +1001,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f8/d2/c3eedaef57de65c3cc5f8dc244cf12d09c84ad258a479055aad6db23206c/httptools-0.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed377e64805bdba4943c82717333f8f8603a13b09aff9cead2717c6c817fb168", size = 208428, upload-time = "2026-05-25T22:16:59.717Z" }, { url = "https://files.pythonhosted.org/packages/f1/94/dfe435d90d0ef61ec0f2cc3d480eef78c59727c6c2ce039f433882f6131a/httptools-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9518c406d7b310f05adb1a37f80acabac40504a575d7c0da6d3e365c695ac20d", size = 113366, upload-time = "2026-05-25T22:17:00.795Z" }, { url = "https://files.pythonhosted.org/packages/cc/d4/13025f1a56e615dcb331e0bbe2d9a1143212b58c263385fc5d2e558f5bac/httptools-0.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:57278e6fa0424c42a8a3e454828ab4f0aff27b40cddf9679579b98c6dce6a376", size = 464676, upload-time = "2026-05-25T22:17:02.014Z" }, + { url = "https://files.pythonhosted.org/packages/bf/95/4c1c26c0b985f8a3331682d802598f14e32dc41bf7509266eb2c04ad4801/httptools-0.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bbb8caadb2b742d293169d2b458b5c001ef70e3158704aa3d3ef9597624c5d1d", size = 464235, upload-time = "2026-05-25T22:17:03.109Z" }, + { url = "https://files.pythonhosted.org/packages/a2/82/6735be2b0ca527718c431cdb8e5f70c3862c0844a687df0f572c51e11497/httptools-0.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:52dd695b865fe96d9d2b16b64a895f3f57bf3cb064e8383cd3b5713a069e8085", size = 449809, upload-time = "2026-05-25T22:17:04.443Z" }, { url = "https://files.pythonhosted.org/packages/b5/f9/5811c74f37a758c8a4aa3dc430375119d335947e883efc4664d8f3559a41/httptools-0.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20b4aac66ff65f7db06a375808b78f42a94970aa22e826b3cb2b43eb09174124", size = 452174, upload-time = "2026-05-25T22:17:05.476Z" }, { url = "https://files.pythonhosted.org/packages/cc/94/97b75870dea07b71e3ec535cebe525b08d723152e4c7d13fa887e51f4de2/httptools-0.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:a1b4c8e7a489a0d750d91894e9a8cdc295838f1924c0ca903ae993456fddec07", size = 90991, upload-time = "2026-05-25T22:17:06.75Z" }, { url = "https://files.pythonhosted.org/packages/14/88/1d21a36da8f5cb0fa49eafd4b169eba5608d57e75bbcf61845cbc6243216/httptools-0.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:880490234c10f70a9830743097e8958d6e4b9f5a0ffc24515023afeef984054d", size = 208247, upload-time = "2026-05-25T22:17:07.843Z" }, { url = "https://files.pythonhosted.org/packages/a5/42/cc4feea2945cb3051038f090c9b36bd5b8a9d7f5a894a506a8983e33fd1c/httptools-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5931891fb7b441b8a3853cf1b85c82c903defce084dd5f6771ca46e31bf862c5", size = 113064, upload-time = "2026-05-25T22:17:09.136Z" }, { url = "https://files.pythonhosted.org/packages/e3/a6/febbb8b8db0f58b38e44ad6cb946e6a255ae49b55f2e8543408fb7501ccd/httptools-0.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b15fc622b0f869d19207c4089a501d9bcc63ca5e071ffdd2f03f922df882dcb2", size = 523851, upload-time = "2026-05-25T22:17:10.106Z" }, + { url = "https://files.pythonhosted.org/packages/b7/e4/f90a0df0b83beff265b7e3b65f2a4cefd95792d4be0ac3e16049f2acd3c2/httptools-0.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:425f83884fd6343828d8c565f046cb72b6d19063f6924093e11bcd8e1548cd09", size = 518842, upload-time = "2026-05-25T22:17:11.218Z" }, + { url = "https://files.pythonhosted.org/packages/9e/2d/0c9ac76dd2c893841fbf6498d6acec4f2442e1b7067f6e3e316a80e494e8/httptools-0.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ef7c3c97f4311c7be57e2986629df89d49cb434dbff78eafcd48c2bff986b15a", size = 501238, upload-time = "2026-05-25T22:17:12.728Z" }, { url = "https://files.pythonhosted.org/packages/ca/42/906adc91ae3a5fa9c59c0a2f21c139725bd7e5b41ae6acd485cd14123ebf/httptools-0.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a1afd7c9fbff0d9f5d489c4ce2768bd09c84a46ddefc7161e6aa82ae35c85745", size = 509567, upload-time = "2026-05-25T22:17:13.842Z" }, { url = "https://files.pythonhosted.org/packages/05/0b/4240efeb672751ee5b9b380cb0e3fdc050bc05f68adc7a8aefc4fcd9a69a/httptools-0.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:cd96f29b4bab1d42fa6e3d008711c75e0f79e94e06827330160e3a304227f150", size = 90918, upload-time = "2026-05-25T22:17:15.155Z" }, ] @@ -1031,6 +1142,7 @@ dependencies = [ { name = "gguf", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or sys_platform == 'darwin' or sys_platform == 'win32' or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, { name = "huggingface-hub", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or sys_platform == 'darwin' or sys_platform == 'win32' or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, { name = "mediapipe", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or sys_platform == 'darwin' or sys_platform == 'win32' or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, + { name = "mistral-common", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or sys_platform == 'darwin' or sys_platform == 'win32' or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, { name = "numpy", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or sys_platform == 'darwin' or sys_platform == 'win32' or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, { name = "onnx", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or sys_platform == 'darwin' or sys_platform == 'win32' or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, { name = "onnxruntime", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or sys_platform == 'darwin' or sys_platform == 'win32' or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, @@ -1139,6 +1251,7 @@ requires-dist = [ { name = "humanize", marker = "extra == 'test'", specifier = "==4.12.1" }, { name = "jurigged", marker = "extra == 'dev'" }, { name = "mediapipe", specifier = "==0.10.14" }, + { name = "mistral-common" }, { name = "mypy", marker = "extra == 'test'" }, { name = "numpy", specifier = "<2.0.0" }, { name = "onnx", specifier = "==1.16.1" }, @@ -1328,9 +1441,11 @@ dependencies = [ ] wheels = [ { url = "https://files.pythonhosted.org/packages/8b/af/5058d545e95f99a54289648f5430cc3c23263dd70a1391e7491f24ed328d/jaxlib-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3f32c3e4c167b7327c342e82d3df84079714ea0b43718be871d039999670b3c9", size = 57686934, upload-time = "2025-08-20T15:55:58.989Z" }, + { url = "https://files.pythonhosted.org/packages/e8/77/ef7f6cd03e699da7d9755f88741c29b3015654473fc9d5f906da19edcb47/jaxlib-0.7.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:9fb189c3b39470c4394ffcb18b71e47cffc5bf85e8fcb1e33692686b0c3e04dd", size = 85134885, upload-time = "2025-08-20T15:56:03.484Z" }, { url = "https://files.pythonhosted.org/packages/4d/72/304018d46703f337787f010735f70d17212f86778fcba8bb5cf678f8e460/jaxlib-0.7.1-cp311-cp311-manylinux_2_27_x86_64.whl", hash = "sha256:eaf5f68f53bf4dcb93b6512538547667625588e4f3ccaeef048788fd18d8c0d5", size = 81147868, upload-time = "2025-08-20T15:56:07.214Z" }, { url = "https://files.pythonhosted.org/packages/f7/b7/0f0df407518691099d659ba6e19db01320dfb58e49d80594eaddd57d77c1/jaxlib-0.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:ab4510fbaeafac6c794ab335f23e71200d824c48f6a0ab20553db8deab8805c5", size = 61185342, upload-time = "2025-08-20T15:56:10.452Z" }, { url = "https://files.pythonhosted.org/packages/ef/1f/10543d7a3f7e76dd4bbdc77134890ac2f41bc8570c565961464f6320009b/jaxlib-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:127c07c727703e5d59f84f655169bec849f4422e52f8546349cecc30a8a13e1d", size = 57682851, upload-time = "2025-08-20T15:56:13.395Z" }, + { url = "https://files.pythonhosted.org/packages/de/4d/76ee71959311fe3da9951aa6f55af8f98eb3572bb322f5a7c89faf7ab933/jaxlib-0.7.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:f0f1f52956b8c2518ab000a4d3d8c21be777e1d47f926ba03640e391061a41ee", size = 85133707, upload-time = "2025-08-20T15:56:16.908Z" }, { url = "https://files.pythonhosted.org/packages/0d/50/e37d02e250f5feb755112ec95b1c012a36d48a99209277267037d100f630/jaxlib-0.7.1-cp312-cp312-manylinux_2_27_x86_64.whl", hash = "sha256:74abd3135797f82440dd3711a35cba16c430d1bba65474b85bb70e41733a52e9", size = 81156916, upload-time = "2025-08-20T15:56:20.41Z" }, { url = "https://files.pythonhosted.org/packages/5a/97/c6c28dfe57cccffd85512615416024b52dd327d78270204caba9311e71f1/jaxlib-0.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:c4023863b14f280516f24ecb7539b4300a3236ea81ed69ad82595beceed1ba1f", size = 61212445, upload-time = "2025-08-20T15:56:23.929Z" }, ] @@ -1649,6 +1764,14 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c4923e404d6bcd91b6779c009542e5647fef32e4a5d75e115e3bbac6f2335eb", size = 66216, upload-time = "2026-03-09T13:13:00.155Z" }, { url = "https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0df54df7e686afa55e6f21fb86195224a6d9beb71d637e8d7920c95cf0f89aac", size = 63911, upload-time = "2026-03-09T13:13:01.671Z" }, { url = "https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2517e24d7315eb51c10664cdb865195df38ab74456c677df67bb47f12d088a27", size = 1438209, upload-time = "2026-03-09T13:13:03.385Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d6/76621246f5165e5372f02f5e6f3f48ea336a8f9e96e43997d45b240ed8cd/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff710414307fefa903e0d9bdf300972f892c23477829f49504e59834f4195398", size = 1248888, upload-time = "2026-03-09T13:13:05.231Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c1/31559ec6fb39a5b48035ce29bb63ade628f321785f38c384dee3e2c08bc1/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6176c1811d9d5a04fa391c490cc44f451e240697a16977f11c6f722efb9041db", size = 1266304, upload-time = "2026-03-09T13:13:06.743Z" }, + { url = "https://files.pythonhosted.org/packages/5e/ef/1cb8276f2d29cc6a41e0a042f27946ca347d3a4a75acf85d0a16aa6dcc82/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50847dca5d197fcbd389c805aa1a1cf32f25d2e7273dc47ab181a517666b68cc", size = 1319650, upload-time = "2026-03-09T13:13:08.607Z" }, + { url = "https://files.pythonhosted.org/packages/4c/e4/5ba3cecd7ce6236ae4a80f67e5d5531287337d0e1f076ca87a5abe4cd5d0/kiwisolver-1.5.0-cp311-cp311-manylinux_2_39_riscv64.whl", hash = "sha256:01808c6d15f4c3e8559595d6d1fe6411c68e4a3822b4b9972b44473b24f4e679", size = 970949, upload-time = "2026-03-09T13:13:10.299Z" }, + { url = "https://files.pythonhosted.org/packages/5a/69/dc61f7ae9a2f071f26004ced87f078235b5507ab6e5acd78f40365655034/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f1f9f4121ec58628c96baa3de1a55a4e3a333c5102c8e94b64e23bf7b2083309", size = 2199125, upload-time = "2026-03-09T13:13:11.841Z" }, + { url = "https://files.pythonhosted.org/packages/e5/7b/abbe0f1b5afa85f8d084b73e90e5f801c0939eba16ac2e49af7c61a6c28d/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b7d335370ae48a780c6e6a6bbfa97342f563744c39c35562f3f367665f5c1de2", size = 2293783, upload-time = "2026-03-09T13:13:14.399Z" }, + { url = "https://files.pythonhosted.org/packages/8a/80/5908ae149d96d81580d604c7f8aefd0e98f4fd728cf172f477e9f2a81744/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:800ee55980c18545af444d93fdd60c56b580db5cc54867d8cbf8a1dc0829938c", size = 1960726, upload-time = "2026-03-09T13:13:16.047Z" }, + { url = "https://files.pythonhosted.org/packages/84/08/a78cb776f8c085b7143142ce479859cfec086bd09ee638a317040b6ef420/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c438f6ca858697c9ab67eb28246c92508af972e114cac34e57a6d4ba17a3ac08", size = 2464738, upload-time = "2026-03-09T13:13:17.897Z" }, { url = "https://files.pythonhosted.org/packages/b1/e1/65584da5356ed6cb12c63791a10b208860ac40a83de165cb6a6751a686e3/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8c63c91f95173f9c2a67c7c526b2cea976828a0e7fced9cdcead2802dc10f8a4", size = 2270718, upload-time = "2026-03-09T13:13:19.421Z" }, { url = "https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:beb7f344487cdcb9e1efe4b7a29681b74d34c08f0043a327a74da852a6749e7b", size = 73480, upload-time = "2026-03-09T13:13:20.818Z" }, { url = "https://files.pythonhosted.org/packages/d8/0e/2ee5debc4f77a625778fec5501ff3e8036fe361b7ee28ae402a485bb9694/kiwisolver-1.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:ad4ae4ffd1ee9cd11357b4c66b612da9888f4f4daf2f36995eda64bd45370cac", size = 64930, upload-time = "2026-03-09T13:13:21.997Z" }, @@ -1656,6 +1779,14 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bf/d9/405320f8077e8e1c5c4bd6adc45e1e6edf6d727b6da7f2e2533cf58bff71/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588", size = 66388, upload-time = "2026-03-09T13:13:24.765Z" }, { url = "https://files.pythonhosted.org/packages/99/9f/795fedf35634f746151ca8839d05681ceb6287fbed6cc1c9bf235f7887c2/kiwisolver-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ed3a984b31da7481b103f68776f7128a89ef26ed40f4dc41a2223cda7fb24819", size = 64068, upload-time = "2026-03-09T13:13:25.878Z" }, { url = "https://files.pythonhosted.org/packages/c4/13/680c54afe3e65767bed7ec1a15571e1a2f1257128733851ade24abcefbcc/kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f", size = 1477934, upload-time = "2026-03-09T13:13:27.166Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2f/cebfcdb60fd6a9b0f6b47a9337198bcbad6fbe15e68189b7011fd914911f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf", size = 1278537, upload-time = "2026-03-09T13:13:28.707Z" }, + { url = "https://files.pythonhosted.org/packages/f2/0d/9b782923aada3fafb1d6b84e13121954515c669b18af0c26e7d21f579855/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d", size = 1296685, upload-time = "2026-03-09T13:13:30.528Z" }, + { url = "https://files.pythonhosted.org/packages/27/70/83241b6634b04fe44e892688d5208332bde130f38e610c0418f9ede47ded/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083", size = 1346024, upload-time = "2026-03-09T13:13:32.818Z" }, + { url = "https://files.pythonhosted.org/packages/e4/db/30ed226fb271ae1a6431fc0fe0edffb2efe23cadb01e798caeb9f2ceae8f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6", size = 987241, upload-time = "2026-03-09T13:13:34.435Z" }, + { url = "https://files.pythonhosted.org/packages/ec/bd/c314595208e4c9587652d50959ead9e461995389664e490f4dce7ff0f782/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1", size = 2227742, upload-time = "2026-03-09T13:13:36.4Z" }, + { url = "https://files.pythonhosted.org/packages/c1/43/0499cec932d935229b5543d073c2b87c9c22846aab48881e9d8d6e742a2d/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0", size = 2323966, upload-time = "2026-03-09T13:13:38.204Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6f/79b0d760907965acfd9d61826a3d41f8f093c538f55cd2633d3f0db269f6/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15", size = 1977417, upload-time = "2026-03-09T13:13:39.966Z" }, + { url = "https://files.pythonhosted.org/packages/ab/31/01d0537c41cb75a551a438c3c7a80d0c60d60b81f694dac83dd436aec0d0/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314", size = 2491238, upload-time = "2026-03-09T13:13:41.698Z" }, { url = "https://files.pythonhosted.org/packages/e4/34/8aefdd0be9cfd00a44509251ba864f5caf2991e36772e61c408007e7f417/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9", size = 2294947, upload-time = "2026-03-09T13:13:43.343Z" }, { url = "https://files.pythonhosted.org/packages/ad/cf/0348374369ca588f8fe9c338fae49fa4e16eeb10ffb3d012f23a54578a9e/kiwisolver-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:f18c2d9782259a6dc132fdc7a63c168cbc74b35284b6d75c673958982a378384", size = 73569, upload-time = "2026-03-09T13:13:45.792Z" }, { url = "https://files.pythonhosted.org/packages/28/26/192b26196e2316e2bd29deef67e37cdf9870d9af8e085e521afff0fed526/kiwisolver-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7c7553b13f69c1b29a5bde08ddc6d9d0c8bfb84f9ed01c30db25944aeb852a7", size = 64997, upload-time = "2026-03-09T13:13:46.878Z" }, @@ -1666,6 +1797,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e9/eb/5fcbbbf9a0e2c3a35effb88831a483345326bbc3a030a3b5b69aee647f84/kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ec4c85dc4b687c7f7f15f553ff26a98bfe8c58f5f7f0ac8905f0ba4c7be60232", size = 59532, upload-time = "2026-03-09T13:15:47.047Z" }, { url = "https://files.pythonhosted.org/packages/c3/9b/e17104555bb4db148fd52327feea1e96be4b88e8e008b029002c281a21ab/kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:12e91c215a96e39f57989c8912ae761286ac5a9584d04030ceb3368a357f017a", size = 57420, upload-time = "2026-03-09T13:15:48.199Z" }, { url = "https://files.pythonhosted.org/packages/48/44/2b5b95b7aa39fb2d8d9d956e0f3d5d45aef2ae1d942d4c3ffac2f9cfed1a/kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be4a51a55833dc29ab5d7503e7bcb3b3af3402d266018137127450005cdfe737", size = 79892, upload-time = "2026-03-09T13:15:49.694Z" }, + { url = "https://files.pythonhosted.org/packages/52/7d/7157f9bba6b455cfb4632ed411e199fc8b8977642c2b12082e1bd9e6d173/kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:daae526907e262de627d8f70058a0f64acc9e2641c164c99c8f594b34a799a16", size = 77603, upload-time = "2026-03-09T13:15:50.945Z" }, { url = "https://files.pythonhosted.org/packages/0a/dd/8050c947d435c8d4bc94e3252f4d8bb8a76cfb424f043a8680be637a57f1/kiwisolver-1.5.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:59cd8683f575d96df5bb48f6add94afc055012c29e28124fcae2b63661b9efb1", size = 73558, upload-time = "2026-03-09T13:15:52.112Z" }, ] @@ -1686,14 +1818,26 @@ sdist = { url = "https://files.pythonhosted.org/packages/40/08/9e7f6b5d2b5bed6ad wheels = [ { url = "https://files.pythonhosted.org/packages/fe/87/2bf31fe17587b29e3f93ec31421e2b1e1c3e349b8bf6c7c313dbad1d5340/librt-0.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:93d95bd45b7d58343d8b90d904450a545144eec19a002511163426f8ab1fae29", size = 141092, upload-time = "2026-05-10T18:15:34.795Z" }, { url = "https://files.pythonhosted.org/packages/cf/08/5c5bf772920b7ebac6e32bc91a643e0ab3870199c0b542356d3baa83970a/librt-0.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ee278c769a713638cdacd4c0436d72156e75df3ebc0166ab2b9dc43acc386c9", size = 142035, upload-time = "2026-05-10T18:15:36.242Z" }, + { url = "https://files.pythonhosted.org/packages/06/20/662a03d254e5b000d838e8b345d83303ddb768c080fd488e40634c0fa66b/librt-0.11.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f230cb1cbc9faaa616f9a678f530ebcf186e414b6bcbd88b960e4ba1b92428d5", size = 475022, upload-time = "2026-05-10T18:15:37.56Z" }, + { url = "https://files.pythonhosted.org/packages/de/f3/aa81523e45184c6ec23dc7f63263362ec55f80a09d424c012359ecbe7e35/librt-0.11.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5d63c855d86938d9de93e265c9bd8c705b51ec494de5738340ee93767a686e4b", size = 467273, upload-time = "2026-05-10T18:15:39.182Z" }, { url = "https://files.pythonhosted.org/packages/6b/6f/59c74b560ca8853834d5501d589c8a2519f4184f273a085ffd0f37a1cc47/librt-0.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:993f028be9e96a08d31df3479ac80d99be374d17f3b78e4796b3fd3c913d4e89", size = 497083, upload-time = "2026-05-10T18:15:40.634Z" }, + { url = "https://files.pythonhosted.org/packages/fe/7b/5aa4d2c9600a719401160bf7055417df0b2a47439b9d88286ce45e56b65f/librt-0.11.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:258d73a0aa66a055e65b2e4d1b8cdb23b9d132c5bb915d9547d804fcaed116cc", size = 489139, upload-time = "2026-05-10T18:15:41.934Z" }, + { url = "https://files.pythonhosted.org/packages/d6/31/9143803d7da6856a69153785768c4936864430eec0fd9461c3ea527d9922/librt-0.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0827efe7854718f04aaddf6496e96960a956e676fe1d0f04eb41511fd8ad06d5", size = 508442, upload-time = "2026-05-10T18:15:43.206Z" }, + { url = "https://files.pythonhosted.org/packages/2f/5a/bce08184488426bda4ccc2c4964ac048c8f68ae89bd7120082eef4233cfd/librt-0.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7753e57d6e12d019c0d8786f1c09c709f4c3fcc57c3887b24e36e6c06ec938b7", size = 514230, upload-time = "2026-05-10T18:15:44.761Z" }, + { url = "https://files.pythonhosted.org/packages/89/8c/bb5e213d254b7505a0e658da199d8ab719086632ce09eef311ab27976523/librt-0.11.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:11bd19822431cc21af9f27374e7ae2e58103c7d98bda823536a6c47f6bb2bb3d", size = 494231, upload-time = "2026-05-10T18:15:46.308Z" }, { url = "https://files.pythonhosted.org/packages/9d/fb/541cdad5b1ab1300398c74c4c9a497b88e5074c21b1244c8f49731d3a284/librt-0.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:22bdf239b219d3993761a148ffa134b19e52e9989c84f845d5d7b71d70a17412", size = 537585, upload-time = "2026-05-10T18:15:47.629Z" }, { url = "https://files.pythonhosted.org/packages/8f/f2/464bb69295c320cb06bddb4f14a4ec67934ee14b2bffb12b19fb7ab287ba/librt-0.11.0-cp311-cp311-win32.whl", hash = "sha256:46c60b61e308eb535fbd6fa622b1ee1bb2815691c1ad9c98bf7b84952ec3bc8d", size = 100509, upload-time = "2026-05-10T18:15:49.157Z" }, { url = "https://files.pythonhosted.org/packages/6d/e7/a17ee1788f9e4fbf548c19f4afa07c92089b9e24fef6cb2410863781ef4c/librt-0.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:902e546ff044f579ff1c953ff5fce97b636fe9e3943996b2177710c6ef076f73", size = 118628, upload-time = "2026-05-10T18:15:50.345Z" }, { url = "https://files.pythonhosted.org/packages/cc/c7/6c766214f9f9903bcfcfbef97d807af8d8f5aa3502d247858ab17582d212/librt-0.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:65ac3bc20f78aa0ee5ae84baa68917f89fef4af63e941084dd019a0d0e749f0c", size = 103122, upload-time = "2026-05-10T18:15:52.068Z" }, { url = "https://files.pythonhosted.org/packages/8b/d0/07c77e067f0838949b43bd89232c29d72efebb9d2801a9750184eb706b71/librt-0.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b87504f1690a23b9a2cca841191a04f83895d4fc2dd04df91d82b1a04ca2ad46", size = 144147, upload-time = "2026-05-10T18:15:53.227Z" }, { url = "https://files.pythonhosted.org/packages/7a/24/8493538fa4f62f982686398a5b8f68008138a75086abdea19ade64bf4255/librt-0.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40071fc5fe0ce8daa6de616702314a01e1250711682b0523d6ab8d4525910cb3", size = 143614, upload-time = "2026-05-10T18:15:54.657Z" }, + { url = "https://files.pythonhosted.org/packages/ff/1e/f8bad050810d9171f34a1648ed910e56814c2ba61639f2bd53c6377ae24b/librt-0.11.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:137e79445c896a0ea7b265f52d23954e05b64222ee1af69e2cb34219067cbb67", size = 485538, upload-time = "2026-05-10T18:15:56.117Z" }, + { url = "https://files.pythonhosted.org/packages/c0/fe/3594ebfbaf03084ba4b120c9ba5c3183fd938a48725e9bbe6ff0a5159ad8/librt-0.11.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:cca6644054e78746d8d4ef238681f9c34ff8b584fe6b988ecebb8db3b15e622a", size = 479623, upload-time = "2026-05-10T18:15:57.544Z" }, { url = "https://files.pythonhosted.org/packages/b0/da/5d1876984b3746c85dbd219dbfcb73c85f54ee263fd32e5b2a632ec14571/librt-0.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5b0eea49f5562861ee8d757a32ef7d559c1d35be2aaaa1ec28941d74c9ffc8a", size = 513082, upload-time = "2026-05-10T18:15:58.805Z" }, + { url = "https://files.pythonhosted.org/packages/19/6e/55bdf5d5ca00c3e18430690bf2c953d8d3ffd3c337418173d33dec985dc9/librt-0.11.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0d1029d7e1ae1a7e647ed6fb5df8c4ce2dffefb7a9f5fd1376a4554d96dac09f", size = 508105, upload-time = "2026-05-10T18:16:00.2Z" }, + { url = "https://files.pythonhosted.org/packages/07/10/f1f23a7c595ee90ece4d35c851e5d104b1311a887ed1b4ac4c35bbd13da8/librt-0.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bc3ce6b33c5828d9e80592011a5c584cb2ce86edbc4088405f70da47dc1d1b3b", size = 522268, upload-time = "2026-05-10T18:16:01.708Z" }, + { url = "https://files.pythonhosted.org/packages/b6/02/5720f5697a7f54b78b3aefbe20df3a48cedcff1276618c4aa481177942ed/librt-0.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:936c5995f3514a42111f20099397d8177c79b4d7e70961e396c6f5a0a3566766", size = 527348, upload-time = "2026-05-10T18:16:03.496Z" }, + { url = "https://files.pythonhosted.org/packages/50/db/b4a47c6f91db4ff76348a0b3dd0cc65e090a078b765a810a62ff9434c3d3/librt-0.11.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9bc0ca6ad9381cbe8e4aa6e5726e4c80c78115a6e9723c599ed1d73e092bc49d", size = 516294, upload-time = "2026-05-10T18:16:05.173Z" }, { url = "https://files.pythonhosted.org/packages/9e/58/9384b2f4eb1ed1d273d40948a7c5c4b2360213b402ef3be4641c06299f9c/librt-0.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:070aa8c26c0a74774317a72df8851facc7f0f012a5b406557ac56992d92e1ec8", size = 553608, upload-time = "2026-05-10T18:16:06.839Z" }, { url = "https://files.pythonhosted.org/packages/21/7b/5aa8848a7c6a9278c79375146da1812e695754ceec5f005e6043461a7315/librt-0.11.0-cp312-cp312-win32.whl", hash = "sha256:6bf14feb84b05ae945277395451998c89c54d0def4070eb5c08de544930b245a", size = 101879, upload-time = "2026-05-10T18:16:08.103Z" }, { url = "https://files.pythonhosted.org/packages/37/33/8a745436944947575b584231750a41417de1a38cf6a2e9251d1065651c09/librt-0.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:75672f0bc524ede266287d532d7923dbce94c7514ad07627bac3d0c6d92cc4d9", size = 119831, upload-time = "2026-05-10T18:16:09.174Z" }, @@ -1733,14 +1877,22 @@ sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95 wheels = [ { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, @@ -1767,12 +1919,14 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ce/a2/78f662f1b18968531f67d3fcde1b7ea8496920bacd4f16ddb5b79d112e46/matplotlib-3.11.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f857524b442f0f36e641868ce2171aafa88cb0bc0644f4e1d8a5df9b32649fef", size = 9436261, upload-time = "2026-06-12T02:27:34.161Z" }, { url = "https://files.pythonhosted.org/packages/5e/92/044f1de43901310202f4c79acf4f141be53b2ca8d8380e2fcefb3d523a75/matplotlib-3.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:57baa92fdc82948ed716eae6d2579d4d6f40965cd8d2f416755b4a72580a3233", size = 9264669, upload-time = "2026-06-12T02:27:37.413Z" }, { url = "https://files.pythonhosted.org/packages/53/f4/f0b4f9ba7ec14a7af8151f3ad71ecfe3561e6ba38cfab1db3681ba4ca112/matplotlib-3.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:630eee0e67d35cce2019a0e670719f4816e3b86aff0fa72729f6c69786fceb45", size = 10021076, upload-time = "2026-06-12T02:27:39.926Z" }, + { url = "https://files.pythonhosted.org/packages/d7/33/4d679c6dcd594a156542080ac907ddccf7b09ca11655c4b28eca8e9ee5da/matplotlib-3.11.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5106c444d0bf966eee2853548c03772af4ab7199118e086c62fbac8ccb07c055", size = 10828999, upload-time = "2026-06-12T02:27:42.433Z" }, { url = "https://files.pythonhosted.org/packages/07/74/0a3683802037d8cd013144d77c247219b47f2aabace6fdde74faa12bacf7/matplotlib-3.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4d7aea652b58e686444079be3376ef546bffa1eee9b9bb9c472b9fcf6cf410d3", size = 10913103, upload-time = "2026-06-12T02:27:44.827Z" }, { url = "https://files.pythonhosted.org/packages/d0/9f/970fcbf381e82ec66fdf5da8ea76e2e9240f61a24011ce9fd1d42c37ac2d/matplotlib-3.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:70a5b3e9a5dab708c0f039709ae7c68d5b4d254e291ef76492cdba230c8bb5e4", size = 9310945, upload-time = "2026-06-12T02:27:46.867Z" }, { url = "https://files.pythonhosted.org/packages/14/4e/6e7cfed23611265ded53806852343b5c59339e506e84c474a9b5afc3b249/matplotlib-3.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:3d68266213e73823ac3be90615bab0cf31f88851e114cdb1dd25dacf3b01e1a7", size = 8999304, upload-time = "2026-06-12T02:27:48.798Z" }, { url = "https://files.pythonhosted.org/packages/da/17/f5276b496c61477a6c4fc5e7401f4bfe1c2e5ef7c6cd67896f2ade3809cb/matplotlib-3.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:06b5872e9cf11adc8f589ded3ce11bc3e1061ad498259664fabc1f6615beb918", size = 9449976, upload-time = "2026-06-12T02:27:50.989Z" }, { url = "https://files.pythonhosted.org/packages/82/34/bdd77418adb2178a1d59f044bd67bfebb115896e91b840b8a197eb3f4f4e/matplotlib-3.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0515d495124be3124340e59f164d901ed4484e2246a5b74cfa483cac3b80bd97", size = 9279307, upload-time = "2026-06-12T02:27:53.247Z" }, { url = "https://files.pythonhosted.org/packages/94/95/7f522393c88313336b20d70fc849555757b2e5febc22b83b3a3f0fd4bce9/matplotlib-3.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be5f93a1d21981bfb802ded0d77a0caa92d4342a47d45754fac77e314a506344", size = 10031353, upload-time = "2026-06-12T02:27:55.215Z" }, + { url = "https://files.pythonhosted.org/packages/87/ce/8f25a0e3186aefd61913e7467d1b999465bcd0d0c03ac695c1b26ca559b7/matplotlib-3.11.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41635d7909d19e52e924a521dde6d8f670b0f53ab1d0e8c331fa831554f681d1", size = 10839232, upload-time = "2026-06-12T02:27:57.746Z" }, { url = "https://files.pythonhosted.org/packages/85/c2/db15da2bbdf9e3ca66df7db8e2c33a1dfed67be24a24d2c878efaaff01d6/matplotlib-3.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:94f5000f67ca9faa300863ea17f8bce9175cb67b88bec4bc7780502d53dd7c9e", size = 10923899, upload-time = "2026-06-12T02:28:00.223Z" }, { url = "https://files.pythonhosted.org/packages/e5/2f/a58a4443a4d052a4ea77557478336aefc26c7981f6408d37adba763aa758/matplotlib-3.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:ac6f1ef39f3d0f9e2463303013094992cdbe0f85f43bc54155bc472b2042768e", size = 9329528, upload-time = "2026-06-12T02:28:02.27Z" }, { url = "https://files.pythonhosted.org/packages/61/0f/4b669589d47733b97ab9df4b58d6fc1e68acb5ea42a928dc7cbdd6bf5871/matplotlib-3.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:9dd11fb612ce7bc60b1de5b4fc87ff959d22317b5de42aabf392f66f97af22eb", size = 9003413, upload-time = "2026-06-12T02:28:04.49Z" }, @@ -1821,14 +1975,35 @@ dependencies = [ wheels = [ { url = "https://files.pythonhosted.org/packages/31/fb/09fde872bd3c92720860adc25ffee605f18d3a5165320ae8cd2d71da7003/mediapipe-0.10.14-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:4737fce6107bd21e420a6b2aad2c721fbc4cc318f1258b68f0665f10225bde1d", size = 50187308, upload-time = "2024-05-08T17:24:53.339Z" }, { url = "https://files.pythonhosted.org/packages/b0/17/8e0ca5c867fe9b9943945b3a0033158fd89ae031c0a2e7dd3dd9101b2f3f/mediapipe-0.10.14-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:e5f8fdf512da074c225219f4e09723f612cdd3449c4793693fd360dc817c9261", size = 50098859, upload-time = "2024-05-08T17:30:21.737Z" }, + { url = "https://files.pythonhosted.org/packages/74/25/ee5679b8ddc58e97d417cfbc1c2b56346ea085a457aa61901ad225cc80bf/mediapipe-0.10.14-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1061d499d341e7f11dd7f18d5bee747e862db8ef47665ff777323282225d4315", size = 33017085, upload-time = "2024-05-08T17:30:27.617Z" }, { url = "https://files.pythonhosted.org/packages/2f/ee/2e9e730dc4d98c8a9541b57bad173bebddf0e4c78f179acc100248c58066/mediapipe-0.10.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a807328339e7356fda0bb14df12fedbf1d33bdf81649c5f8666b0026b1cc30b4", size = 35664771, upload-time = "2024-05-08T17:30:36.062Z" }, { url = "https://files.pythonhosted.org/packages/c1/0f/4dc0802131756a9fe4d46d2824352014b85a75baca386cb9e43057f39f15/mediapipe-0.10.14-cp311-cp311-win_amd64.whl", hash = "sha256:1b7687d3b63590bcc601ad195b923b80a1b2d6be5cdf43711edc661cecd3dd47", size = 50834141, upload-time = "2024-05-08T17:30:43.471Z" }, { url = "https://files.pythonhosted.org/packages/2d/df/be410905b9757de4b00891dd34236d96e6db150b624f28cc27cd90c74564/mediapipe-0.10.14-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:aa2298c1886716cde6bd7ce96aba1505d67d52edaba856f6c2e1ab905de52b0d", size = 50203567, upload-time = "2024-05-08T17:30:50.451Z" }, { url = "https://files.pythonhosted.org/packages/32/40/b6a2a50593e8753bf12e2dbfd130dee588eb2fc50ce74939cf6485af2756/mediapipe-0.10.14-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:5c97e32cbb9e9d72b78a33f011257b3cdb55b60fef70a8a864c5d2a4b6652425", size = 50117879, upload-time = "2024-05-08T17:30:58.154Z" }, + { url = "https://files.pythonhosted.org/packages/f4/da/dfed8db260b3fbe4e24ac17dda32c55787643a656d8d4e78c55bc847efa8/mediapipe-0.10.14-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e30ed2f39f925924de58adeec6a8e61ba6beb6959325dc0d8a1aa487a74377b", size = 33015939, upload-time = "2024-05-08T17:31:05.758Z" }, { url = "https://files.pythonhosted.org/packages/11/73/07c6dcbb322f86e2b8526e0073456dbdd2813d5351f772f882123c985fda/mediapipe-0.10.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b1e72d754cd9e1b4b88d80ec9ead2f1cbe8424b7f883d3bda53341b982a9f8b", size = 35665742, upload-time = "2024-05-08T17:31:11.933Z" }, { url = "https://files.pythonhosted.org/packages/f0/26/d228fe6e9f2060dde7f7db738968bcd603e9340f064351655b5b2652a664/mediapipe-0.10.14-cp312-cp312-win_amd64.whl", hash = "sha256:ebb8350e860c8e00b7c84d71e15090fc3ac4cc9d4249892f85fb35011590e372", size = 50837898, upload-time = "2024-05-08T17:31:21.34Z" }, ] +[[package]] +name = "mistral-common" +version = "1.11.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or sys_platform == 'darwin' or sys_platform == 'win32' or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, + { name = "numpy", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or sys_platform == 'darwin' or sys_platform == 'win32' or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, + { name = "pillow", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or sys_platform == 'darwin' or sys_platform == 'win32' or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, + { name = "pydantic", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or sys_platform == 'darwin' or sys_platform == 'win32' or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, + { name = "pydantic-extra-types", extra = ["pycountry"], marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or sys_platform == 'darwin' or sys_platform == 'win32' or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, + { name = "requests", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or sys_platform == 'darwin' or sys_platform == 'win32' or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, + { name = "tiktoken", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or sys_platform == 'darwin' or sys_platform == 'win32' or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, + { name = "typing-extensions", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or sys_platform == 'darwin' or sys_platform == 'win32' or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e3/35/1e6e07189a7277be308fac5f83893cbf6784b76351d6f4b4da155b7ef4f9/mistral_common-1.11.5.tar.gz", hash = "sha256:ef8c03ad8359fa1386d66ee08d534d8f4a65a6955c9b24bd5caa2e005066cdec", size = 6383849, upload-time = "2026-06-26T12:45:39.469Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/86/de5ad2ab2e3d140f33e4dc615f9fe2b4ae2136c9d2d75306625f9735a71e/mistral_common-1.11.5-py3-none-any.whl", hash = "sha256:7c1b09f43a589027315840bfd6f3528d5abf520eed701f8d8b7a922d6e5b855e", size = 6551345, upload-time = "2026-06-26T12:45:36.997Z" }, +] + [[package]] name = "mistune" version = "3.3.2" @@ -1848,10 +2023,12 @@ dependencies = [ sdist = { url = "https://files.pythonhosted.org/packages/0e/4a/c27b42ed9b1c7d13d9ba8b6905dece787d6259152f2309338aed29b2447b/ml_dtypes-0.5.4.tar.gz", hash = "sha256:8ab06a50fb9bf9666dd0fe5dfb4676fa2b0ac0f31ecff72a6c3af8e22c063453", size = 692314, upload-time = "2025-11-17T22:32:31.031Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/c6/5e/712092cfe7e5eb667b8ad9ca7c54442f21ed7ca8979745f1000e24cf8737/ml_dtypes-0.5.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6c7ecb74c4bd71db68a6bea1edf8da8c34f3d9fe218f038814fd1d310ac76c90", size = 679734, upload-time = "2025-11-17T22:31:39.223Z" }, + { url = "https://files.pythonhosted.org/packages/4f/cf/912146dfd4b5c0eea956836c01dcd2fce6c9c844b2691f5152aca196ce4f/ml_dtypes-0.5.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bc11d7e8c44a65115d05e2ab9989d1e045125d7be8e05a071a48bc76eb6d6040", size = 5056165, upload-time = "2025-11-17T22:31:41.071Z" }, { url = "https://files.pythonhosted.org/packages/a9/80/19189ea605017473660e43762dc853d2797984b3c7bf30ce656099add30c/ml_dtypes-0.5.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:19b9a53598f21e453ea2fbda8aa783c20faff8e1eeb0d7ab899309a0053f1483", size = 5034975, upload-time = "2025-11-17T22:31:42.758Z" }, { url = "https://files.pythonhosted.org/packages/b4/24/70bd59276883fdd91600ca20040b41efd4902a923283c4d6edcb1de128d2/ml_dtypes-0.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:7c23c54a00ae43edf48d44066a7ec31e05fdc2eee0be2b8b50dd1903a1db94bb", size = 210742, upload-time = "2025-11-17T22:31:44.068Z" }, { url = "https://files.pythonhosted.org/packages/a0/c9/64230ef14e40aa3f1cb254ef623bf812735e6bec7772848d19131111ac0d/ml_dtypes-0.5.4-cp311-cp311-win_arm64.whl", hash = "sha256:557a31a390b7e9439056644cb80ed0735a6e3e3bb09d67fd5687e4b04238d1de", size = 160709, upload-time = "2025-11-17T22:31:46.557Z" }, { url = "https://files.pythonhosted.org/packages/a8/b8/3c70881695e056f8a32f8b941126cf78775d9a4d7feba8abcb52cb7b04f2/ml_dtypes-0.5.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a174837a64f5b16cab6f368171a1a03a27936b31699d167684073ff1c4237dac", size = 676927, upload-time = "2025-11-17T22:31:48.182Z" }, + { url = "https://files.pythonhosted.org/packages/54/0f/428ef6881782e5ebb7eca459689448c0394fa0a80bea3aa9262cba5445ea/ml_dtypes-0.5.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a7f7c643e8b1320fd958bf098aa7ecf70623a42ec5154e3be3be673f4c34d900", size = 5028464, upload-time = "2025-11-17T22:31:50.135Z" }, { url = "https://files.pythonhosted.org/packages/3a/cb/28ce52eb94390dda42599c98ea0204d74799e4d8047a0eb559b6fd648056/ml_dtypes-0.5.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ad459e99793fa6e13bd5b7e6792c8f9190b4e5a1b45c63aba14a4d0a7f1d5ff", size = 5009002, upload-time = "2025-11-17T22:31:52.001Z" }, { url = "https://files.pythonhosted.org/packages/f5/f0/0cfadd537c5470378b1b32bd859cf2824972174b51b873c9d95cfd7475a5/ml_dtypes-0.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:c1a953995cccb9e25a4ae19e34316671e4e2edaebe4cf538229b1fc7109087b7", size = 212222, upload-time = "2025-11-17T22:31:53.742Z" }, { url = "https://files.pythonhosted.org/packages/16/2e/9acc86985bfad8f2c2d30291b27cd2bb4c74cea08695bd540906ed744249/ml_dtypes-0.5.4-cp312-cp312-win_arm64.whl", hash = "sha256:9bad06436568442575beb2d03389aa7456c690a5b05892c471215bfd8cf39460", size = 160793, upload-time = "2025-11-17T22:31:55.358Z" }, @@ -1890,12 +2067,14 @@ sdist = { url = "https://files.pythonhosted.org/packages/82/15/cca9d88503549ed6f wheels = [ { url = "https://files.pythonhosted.org/packages/0a/a1/639f3024794a2a15899cb90707fe02e044c4412794c39c5769fd3df2e2ef/mypy-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a683016b16fe2f572dc04c72be7ee0504ac1605a265d0200f5cea695fb788f41", size = 14691685, upload-time = "2026-05-11T18:33:27.973Z" }, { url = "https://files.pythonhosted.org/packages/3b/08/9a585dea4325f20d8b80dc78623fa50d1fd2173b710f6237afd6ba6ab39b/mypy-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1a293c534adb55271fef24a26da04b855540a8c13cc07bc5917b9fd2c394f2ca", size = 13555165, upload-time = "2026-05-11T18:32:16.107Z" }, + { url = "https://files.pythonhosted.org/packages/81/dc/7c42cc9c6cb01e8eb09961f1f738741d3e9c7e9d5c5b30ec69222625cd5f/mypy-2.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7406f4d048e71e576f5356d317e5b0a9e666dfd966bd99f9d14ca06e1a341538", size = 13994376, upload-time = "2026-05-11T18:32:39.256Z" }, { url = "https://files.pythonhosted.org/packages/d4/fa/285946c33bce716e082c11dfeee9ee196eaf1f5042efb3581a31f9f205e4/mypy-2.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e0210d626fc8b31ccc90233754c7bc90e1f43205e85d96387f7db1285b55c398", size = 14864618, upload-time = "2026-05-11T18:34:49.765Z" }, { url = "https://files.pythonhosted.org/packages/2b/83/82397f48af6c27e295d57979ded8490c9829040152cf7571b2f026aeb9a0/mypy-2.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3712c20deed54e814eaaa825603bada8ea1c390670a397c95b98405347acc563", size = 15102063, upload-time = "2026-05-11T18:34:05.855Z" }, { url = "https://files.pythonhosted.org/packages/40/68/b02dec39057b88eb03dc0aa854732e26e8361f34f9d0e20c7614967d1eba/mypy-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fcaa0e479066e31f7cceb6a3bea39cb22b2ff51a6b2f24f193d19179ba17c389", size = 11060564, upload-time = "2026-05-11T18:35:36.494Z" }, { url = "https://files.pythonhosted.org/packages/cf/a8/ea3dcbef31f99b634f2ee23bb0321cbc8c1b388b76a861eb849f13c347dc/mypy-2.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:0b1a5260c95aa443083f9ed3592662941951bca3d4ca224a5dc517c38b7cf666", size = 9966983, upload-time = "2026-05-11T18:37:14.139Z" }, { url = "https://files.pythonhosted.org/packages/95/b1/55861beb5c339b44f9a2ba92df9e2cb1eeb4ae1eee674cdf7772c797778b/mypy-2.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:244358bf1c0da7722230bce60683d52e8e9fd030554926f15b747a84efb5b3af", size = 14874381, upload-time = "2026-05-11T18:37:31.784Z" }, { url = "https://files.pythonhosted.org/packages/0b/b3/b7f770114b7d0ac92d0f76e8d93c2780844a70488a90e91821927850da86/mypy-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ec7c57657493c7a75534df2751c8ae2cda383c16ecc55d2106c54476b1b16f6", size = 13665501, upload-time = "2026-05-11T18:34:23.063Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f3/8ae2037967e2126689a0c11d99e2b707134a565191e92c60ca2572aec60a/mypy-2.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8161b6ff4392410023224f0969d17db93e1e154bc3e4ba62598e720723ae211", size = 14045750, upload-time = "2026-05-11T18:31:48.151Z" }, { url = "https://files.pythonhosted.org/packages/a0/32/615eb5911859e43d054941b0d0a7d06cfa2870eba86529cf385b052b111c/mypy-2.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf03e12003084a67395184d3eb8cbd6a489dc3655b5664b28c210a9e2403ab0b", size = 15061630, upload-time = "2026-05-11T18:37:06.898Z" }, { url = "https://files.pythonhosted.org/packages/d4/03/4eafbfff8bfab1b87082741eae6e6a624028c984e6708b73bce2a8570c9d/mypy-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:20509760fd791c51579d573153407d226385ec1f8bcce55d730b354f3336bc22", size = 15288831, upload-time = "2026-05-11T18:31:18.07Z" }, { url = "https://files.pythonhosted.org/packages/99/ee/919661478e5891a3c96e549c036e467e64563ab85995b10c53c8358e16a3/mypy-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:6753d0c1fdd6b1a23b9e4f283ce80b2153b724adcb2653b20b85a8a28ac6436b", size = 11135228, upload-time = "2026-05-11T18:34:31.23Z" }, @@ -1992,7 +2171,17 @@ source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/5e/1b/ef84624f14954d270f74060a19fc550dd4f06656399447569afb584d8c06/nh3-0.3.6.tar.gz", hash = "sha256:f3736c9dd3d1856f80cd031715b84ca75cda2bbb1ac802c3da26bfce590838d7", size = 24684, upload-time = "2026-06-22T00:47:02.008Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/f3/ab/a7653bce9a3b204be6a6931767a9e23595807bb84790ce6685e4d7e5bd08/nh3-0.3.6-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:a43ebd7543555c3ac1bc353023d0794e75cb76f6f18f19c32e95441496c0cc25", size = 1443564, upload-time = "2026-06-22T00:46:36.66Z" }, + { url = "https://files.pythonhosted.org/packages/41/21/e1084ab18eb589506335c7c7576f2d4643e9a0c0e33983ef0e549a256b96/nh3-0.3.6-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1b160831c9cdb06a6c79c2f9cdb11386602938f9af260d1c457a85add4f6f69", size = 838002, upload-time = "2026-06-22T00:46:38.101Z" }, + { url = "https://files.pythonhosted.org/packages/b0/94/f48d08e6f72a406300fa11d8acd929fea1a80d4bf750fa292cb10785f126/nh3-0.3.6-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d14bf7982e7a77c0c775634c29c07ce08b38a046df73e1c1f139b3e82f18a38e", size = 823045, upload-time = "2026-06-22T00:46:39.495Z" }, + { url = "https://files.pythonhosted.org/packages/25/bb/431615ba1d1d3eb63cde0f974f2114edf863a8a3f6049a12fed23fc241d3/nh3-0.3.6-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:44673b27010051ab5a5e438a86ec31bbda61d4a77d7e900af6b7be3037c1abae", size = 1093171, upload-time = "2026-06-22T00:46:41.21Z" }, + { url = "https://files.pythonhosted.org/packages/0e/24/a0d80182a18919665fefd19c1c06f1d1df1c9a6455d0252de40c034a0bc3/nh3-0.3.6-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6b7beece07525dc6e6b0fc2f104442de2ba328360ad00e50cbe2e1fd620447d", size = 1049217, upload-time = "2026-06-22T00:46:42.804Z" }, + { url = "https://files.pythonhosted.org/packages/0a/13/6f1e302ca674ac74362e150848ad56a1be5145391204f74facdb8e94df12/nh3-0.3.6-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:455469a29951edc92bc48b47ac2281c3f2609e6c4f6a047056449f8c2c23facf", size = 917372, upload-time = "2026-06-22T00:46:44.495Z" }, { url = "https://files.pythonhosted.org/packages/5b/67/314f6151bad77a93d751978a344033e1fc890822f05f0416079338e34231/nh3-0.3.6-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:905f877dc66dd7aea4a76e54bcb26acb5ff8216f720c0017ccf63e0e6035698e", size = 806699, upload-time = "2026-06-22T00:46:45.99Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a6/bfaa00046e58603507dcfc266c4778e3ab7adf68a5dedd73b6274b8d9314/nh3-0.3.6-cp38-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:25c733bee928530556b1db0ea46c52cf5aa686146e38e60a6fc7cb801ef91cec", size = 835165, upload-time = "2026-06-22T00:46:47.617Z" }, + { url = "https://files.pythonhosted.org/packages/30/a8/fb2c38845efb703a9173bffdfc745fc64d2b0e55cfc73a3647d2f028250c/nh3-0.3.6-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2f90d9a0cfdbee218994fdaaeeb5a0fde62d08f35e4eef0378ec1e2200172fd0", size = 858282, upload-time = "2026-06-22T00:46:49.276Z" }, + { url = "https://files.pythonhosted.org/packages/68/17/06e72a18ee9b572914447338237ca7eb164c0df901f141bc10d1282247a2/nh3-0.3.6-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:82ca5bf427ad1b216b65ede1a2e2d87dc49bec417ceba0f297213107d3cd9d78", size = 1014328, upload-time = "2026-06-22T00:46:51.026Z" }, + { url = "https://files.pythonhosted.org/packages/11/f9/3966c61455668c08853bf5e33b4bed93c421f3194ce4de896dc248d6f6ce/nh3-0.3.6-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:f5ed5fe84aee7f39db95c214a7421bf0499fbf500fec6d86a4e29bfc37971438", size = 1098207, upload-time = "2026-06-22T00:46:52.674Z" }, + { url = "https://files.pythonhosted.org/packages/19/d3/479cb4ae440424825735d60525b53e3c77fd60fd6e6afc0e984f00eb0178/nh3-0.3.6-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:082675ff87b9385ec430ffe6d5847ba7456cc39b73720cd4add472f9f4cffd56", size = 1056961, upload-time = "2026-06-22T00:46:54.335Z" }, { url = "https://files.pythonhosted.org/packages/17/0c/6cdb5ee1e127be50dc8391e54bddc1f64e87bf4bfad0c55633320e2e02db/nh3-0.3.6-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36d06341bd501240d320f5942481ed5e6846136b666e1ba4faf802b78ebc875f", size = 1033829, upload-time = "2026-06-22T00:46:56.258Z" }, { url = "https://files.pythonhosted.org/packages/e9/55/9de666ad975d6ccd77d799ea0add55ee2347aa81286ce21b2a97c070746b/nh3-0.3.6-cp38-abi3-win32.whl", hash = "sha256:5276ef17bdba9ad8040575c74072008b13aae429436e9d0429e718bb5f90f4da", size = 609081, upload-time = "2026-06-22T00:46:57.665Z" }, { url = "https://files.pythonhosted.org/packages/82/fa/2b5d684e3edf1e81bfd02d298c78c3e3da77ca1d8a2be3183a79544a7548/nh3-0.3.6-cp38-abi3-win_amd64.whl", hash = "sha256:f338ac7d594c067679f1e99b4f5ec3906842979560f9d8f15d6bdfa39a353b10", size = 624461, upload-time = "2026-06-22T00:46:59.163Z" }, @@ -2045,13 +2234,17 @@ sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e wheels = [ { url = "https://files.pythonhosted.org/packages/11/57/baae43d14fe163fa0e4c47f307b6b2511ab8d7d30177c491960504252053/numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", size = 20630554, upload-time = "2024-02-05T23:51:50.149Z" }, { url = "https://files.pythonhosted.org/packages/1a/2e/151484f49fd03944c4a3ad9c418ed193cfd02724e138ac8a9505d056c582/numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", size = 13997127, upload-time = "2024-02-05T23:52:15.314Z" }, + { url = "https://files.pythonhosted.org/packages/79/ae/7e5b85136806f9dadf4878bf73cf223fe5c2636818ba3ab1c585d0403164/numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", size = 14222994, upload-time = "2024-02-05T23:52:47.569Z" }, { url = "https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", size = 18252005, upload-time = "2024-02-05T23:53:15.637Z" }, + { url = "https://files.pythonhosted.org/packages/09/bf/2b1aaf8f525f2923ff6cfcf134ae5e750e279ac65ebf386c75a0cf6da06a/numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", size = 13885297, upload-time = "2024-02-05T23:53:42.16Z" }, { url = "https://files.pythonhosted.org/packages/df/a0/4e0f14d847cfc2a633a1c8621d00724f3206cfeddeb66d35698c4e2cf3d2/numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", size = 18093567, upload-time = "2024-02-05T23:54:11.696Z" }, { url = "https://files.pythonhosted.org/packages/d2/b7/a734c733286e10a7f1a8ad1ae8c90f2d33bf604a96548e0a4a3a6739b468/numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", size = 5968812, upload-time = "2024-02-05T23:54:26.453Z" }, { url = "https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", size = 15811913, upload-time = "2024-02-05T23:54:53.933Z" }, { url = "https://files.pythonhosted.org/packages/95/12/8f2020a8e8b8383ac0177dc9570aad031a3beb12e38847f7129bacd96228/numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", size = 20335901, upload-time = "2024-02-05T23:55:32.801Z" }, { url = "https://files.pythonhosted.org/packages/75/5b/ca6c8bd14007e5ca171c7c03102d17b4f4e0ceb53957e8c44343a9546dcc/numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", size = 13685868, upload-time = "2024-02-05T23:55:56.28Z" }, + { url = "https://files.pythonhosted.org/packages/79/f8/97f10e6755e2a7d027ca783f63044d5b1bc1ae7acb12afe6a9b4286eac17/numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", size = 13925109, upload-time = "2024-02-05T23:56:20.368Z" }, { url = "https://files.pythonhosted.org/packages/0f/50/de23fde84e45f5c4fda2488c759b69990fd4512387a8632860f3ac9cd225/numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", size = 17950613, upload-time = "2024-02-05T23:56:56.054Z" }, + { url = "https://files.pythonhosted.org/packages/4c/0c/9c603826b6465e82591e05ca230dfc13376da512b25ccd0894709b054ed0/numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", size = 13572172, upload-time = "2024-02-05T23:57:21.56Z" }, { url = "https://files.pythonhosted.org/packages/76/8c/2ba3902e1a0fc1c74962ea9bb33a534bb05984ad7ff9515bf8d07527cadd/numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", size = 17786643, upload-time = "2024-02-05T23:57:56.585Z" }, { url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", size = 5677803, upload-time = "2024-02-05T23:58:08.963Z" }, { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754, upload-time = "2024-02-05T23:58:36.364Z" }, @@ -2067,6 +2260,7 @@ resolution-markers = [ ] wheels = [ { url = "https://files.pythonhosted.org/packages/af/eb/ff4b8c503fa1f1796679dce648854d58751982426e4e4b37d6fce49d259c/nvidia_cublas_cu12-12.6.4.1-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:08ed2686e9875d01b58e3cb379c6896df8e76c75e0d4a7f7dace3d7b6d9ef8eb", size = 393138322, upload-time = "2024-11-20T17:40:25.65Z" }, + { url = "https://files.pythonhosted.org/packages/97/0d/f1f0cadbf69d5b9ef2e4f744c9466cb0a850741d08350736dfdb4aa89569/nvidia_cublas_cu12-12.6.4.1-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:235f728d6e2a409eddf1df58d5b0921cf80cfa9e72b9f2775ccb7b4a87984668", size = 390794615, upload-time = "2024-11-20T17:39:52.715Z" }, { url = "https://files.pythonhosted.org/packages/84/f7/985e9bdbe3e0ac9298fcc8cfa51a392862a46a0ffaccbbd56939b62a9c83/nvidia_cublas_cu12-12.6.4.1-py3-none-win_amd64.whl", hash = "sha256:9e4fa264f4d8a4eb0cdbd34beadc029f453b3bafae02401e999cf3d5a5af75f8", size = 434535301, upload-time = "2024-11-20T17:50:41.681Z" }, ] @@ -2079,6 +2273,7 @@ resolution-markers = [ "(python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version < '3.12' and sys_platform == 'win32')", ] wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/63/684a6f72f52671ea222c12ecde9bdf748a0ba025e2ad3ec374e466c26eb6/nvidia_cublas_cu12-12.8.3.14-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:93a4e0e386cc7f6e56c822531396de8170ed17068a1e18f987574895044cd8c3", size = 604900717, upload-time = "2025-01-23T17:52:55.486Z" }, { url = "https://files.pythonhosted.org/packages/82/df/4b01f10069e23c641f116c62fc31e31e8dc361a153175d81561d15c8143b/nvidia_cublas_cu12-12.8.3.14-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:3f0e05e7293598cf61933258b73e66a160c27d59c4422670bf0b79348c04be44", size = 609620630, upload-time = "2025-01-23T17:55:00.753Z" }, { url = "https://files.pythonhosted.org/packages/6c/54/fbfa3315b936d3358517f7da5f9f2557c279bf210e5261f0cf66cc0f9832/nvidia_cublas_cu12-12.8.3.14-py3-none-win_amd64.whl", hash = "sha256:9ae5eae500aead01fc4bdfc458209df638b1a3551557ce11a78eea9ece602ae9", size = 578387959, upload-time = "2025-01-23T18:08:00.662Z" }, ] @@ -2092,6 +2287,8 @@ resolution-markers = [ "(python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version < '3.12' and sys_platform == 'win32')", ] wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/8b/2f6230cb715646c3a9425636e513227ce5c93c4d65823a734f4bb86d43c3/nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:166ee35a3ff1587f2490364f90eeeb8da06cd867bd5b701bf7f9a02b78bc63fc", size = 8236764, upload-time = "2024-11-20T17:35:41.03Z" }, + { url = "https://files.pythonhosted.org/packages/25/0f/acb326ac8fd26e13c799e0b4f3b2751543e1834f04d62e729485872198d4/nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_aarch64.whl", hash = "sha256:358b4a1d35370353d52e12f0a7d1769fc01ff74a191689d3870b2123156184c4", size = 8236756, upload-time = "2024-10-01T16:57:45.507Z" }, { url = "https://files.pythonhosted.org/packages/49/60/7b6497946d74bcf1de852a21824d63baad12cd417db4195fc1bfe59db953/nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6768bad6cab4f19e8292125e5f1ac8aa7d1718704012a0e3272a6f61c4bce132", size = 8917980, upload-time = "2024-11-20T17:36:04.019Z" }, { url = "https://files.pythonhosted.org/packages/a5/24/120ee57b218d9952c379d1e026c4479c9ece9997a4fb46303611ee48f038/nvidia_cuda_cupti_cu12-12.6.80-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a3eff6cdfcc6a4c35db968a06fcadb061cbc7d6dde548609a941ff8701b98b73", size = 8917972, upload-time = "2024-10-01T16:58:06.036Z" }, { url = "https://files.pythonhosted.org/packages/1c/81/7796f096afaf726796b1b648f3bc80cafc61fe7f77f44a483c89e6c5ef34/nvidia_cuda_cupti_cu12-12.6.80-py3-none-win_amd64.whl", hash = "sha256:bbe6ae76e83ce5251b56e8c8e61a964f757175682bbad058b170b136266ab00a", size = 5724175, upload-time = "2024-10-01T17:09:47.955Z" }, @@ -2106,6 +2303,7 @@ resolution-markers = [ "(python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version < '3.12' and sys_platform == 'win32')", ] wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/53/458956a65283c55c22ba40a65745bbe9ff20c10b68ea241bc575e20c0465/nvidia_cuda_cupti_cu12-12.8.57-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff154211724fd824e758ce176b66007b558eea19c9a5135fc991827ee147e317", size = 9526469, upload-time = "2025-01-23T17:47:33.104Z" }, { url = "https://files.pythonhosted.org/packages/39/6f/3683ecf4e38931971946777d231c2df00dd5c1c4c2c914c42ad8f9f4dca6/nvidia_cuda_cupti_cu12-12.8.57-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e0b2eb847de260739bee4a3f66fac31378f4ff49538ff527a38a01a9a39f950", size = 10237547, upload-time = "2025-01-23T17:47:56.863Z" }, { url = "https://files.pythonhosted.org/packages/3f/2a/cabe033045427beb042b70b394ac3fd7cfefe157c965268824011b16af67/nvidia_cuda_cupti_cu12-12.8.57-py3-none-win_amd64.whl", hash = "sha256:bbed719c52a476958a74cfc42f2b95a3fd6b3fd94eb40134acc4601feb4acac3", size = 7002337, upload-time = "2025-01-23T18:04:35.34Z" }, ] @@ -2119,6 +2317,7 @@ resolution-markers = [ "(python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version < '3.12' and sys_platform == 'win32')", ] wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/2f/72df534873235983cc0a5371c3661bebef7c4682760c275590b972c7b0f9/nvidia_cuda_nvrtc_cu12-12.6.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5847f1d6e5b757f1d2b3991a01082a44aad6f10ab3c5c0213fa3e25bddc25a13", size = 23162955, upload-time = "2024-10-01T16:59:50.922Z" }, { url = "https://files.pythonhosted.org/packages/75/2e/46030320b5a80661e88039f59060d1790298b4718944a65a7f2aeda3d9e9/nvidia_cuda_nvrtc_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:35b0cc6ee3a9636d5409133e79273ce1f3fd087abb0532d2d2e8fff1fe9efc53", size = 23650380, upload-time = "2024-10-01T17:00:14.643Z" }, { url = "https://files.pythonhosted.org/packages/f5/46/d3a1cdda8bb113c80f43a0a6f3a853356d487b830f3483f92d49ce87fa55/nvidia_cuda_nvrtc_cu12-12.6.77-py3-none-win_amd64.whl", hash = "sha256:f7007dbd914c56bd80ea31bc43e8e149da38f68158f423ba845fc3292684e45a", size = 39026742, upload-time = "2024-10-01T17:10:49.058Z" }, ] @@ -2133,6 +2332,7 @@ resolution-markers = [ ] wheels = [ { url = "https://files.pythonhosted.org/packages/d4/22/32029d4583f7b19cfe75c84399cbcfd23f2aaf41c66fc8db4da460104fff/nvidia_cuda_nvrtc_cu12-12.8.61-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:a0fa9c2a21583105550ebd871bd76e2037205d56f33f128e69f6d2a55e0af9ed", size = 88024585, upload-time = "2025-01-23T17:50:10.722Z" }, + { url = "https://files.pythonhosted.org/packages/f1/98/29f98d57fc40d6646337e942d37509c6d5f8abe29012671f7a6eb9978ebe/nvidia_cuda_nvrtc_cu12-12.8.61-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b1f376bf58111ca73dde4fd4df89a462b164602e074a76a2c29c121ca478dcd4", size = 43097015, upload-time = "2025-01-23T17:49:44.331Z" }, { url = "https://files.pythonhosted.org/packages/f8/5b/052d05aa068e4752415ad03bac58e852ea8bc17c9321e08546b3f261e47e/nvidia_cuda_nvrtc_cu12-12.8.61-py3-none-win_amd64.whl", hash = "sha256:9c8887bf5e5dffc441018ba8c5dc59952372a6f4806819e8c1f03d62637dbeea", size = 73567440, upload-time = "2025-01-23T18:05:51.036Z" }, ] @@ -2145,6 +2345,8 @@ resolution-markers = [ "(python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version < '3.12' and sys_platform == 'win32')", ] wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/ea/590b2ac00d772a8abd1c387a92b46486d2679ca6622fd25c18ff76265663/nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6116fad3e049e04791c0256a9778c16237837c08b27ed8c8401e2e45de8d60cd", size = 908052, upload-time = "2024-11-20T17:35:19.905Z" }, + { url = "https://files.pythonhosted.org/packages/b7/3d/159023799677126e20c8fd580cca09eeb28d5c5a624adc7f793b9aa8bbfa/nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d461264ecb429c84c8879a7153499ddc7b19b5f8d84c204307491989a365588e", size = 908040, upload-time = "2024-10-01T16:57:22.221Z" }, { url = "https://files.pythonhosted.org/packages/e1/23/e717c5ac26d26cf39a27fbc076240fad2e3b817e5889d671b67f4f9f49c5/nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ba3b56a4f896141e25e19ab287cd71e52a6a0f4b29d0d31609f60e3b4d5219b7", size = 897690, upload-time = "2024-11-20T17:35:30.697Z" }, { url = "https://files.pythonhosted.org/packages/f0/62/65c05e161eeddbafeca24dc461f47de550d9fa8a7e04eb213e32b55cfd99/nvidia_cuda_runtime_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a84d15d5e1da416dd4774cb42edf5e954a3e60cc945698dc1d5be02321c44dc8", size = 897678, upload-time = "2024-10-01T16:57:33.821Z" }, { url = "https://files.pythonhosted.org/packages/fa/76/4c80fa138333cc975743fd0687a745fccb30d167f906f13c1c7f9a85e5ea/nvidia_cuda_runtime_cu12-12.6.77-py3-none-win_amd64.whl", hash = "sha256:86c58044c824bf3c173c49a2dbc7a6c8b53cb4e4dca50068be0bf64e9dab3f7f", size = 891773, upload-time = "2024-10-01T17:09:26.362Z" }, @@ -2159,6 +2361,7 @@ resolution-markers = [ "(python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version < '3.12' and sys_platform == 'win32')", ] wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/9d/e77ec4227e70c6006195bdf410370f2d0e5abfa2dc0d1d315cacd57c5c88/nvidia_cuda_runtime_cu12-12.8.57-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:534ccebd967b6a44292678fa5da4f00666029cb2ed07a79515ea41ef31fe3ec7", size = 965264, upload-time = "2025-01-23T17:47:11.759Z" }, { url = "https://files.pythonhosted.org/packages/16/f6/0e1ef31f4753a44084310ba1a7f0abaf977ccd810a604035abb43421c057/nvidia_cuda_runtime_cu12-12.8.57-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:75342e28567340b7428ce79a5d6bb6ca5ff9d07b69e7ce00d2c7b4dc23eff0be", size = 954762, upload-time = "2025-01-23T17:47:22.21Z" }, { url = "https://files.pythonhosted.org/packages/16/ee/52508c74bee2a3de8d59c6fd9af4ca2f216052fa2bc916da3a6a7bb998af/nvidia_cuda_runtime_cu12-12.8.57-py3-none-win_amd64.whl", hash = "sha256:89be637e3ee967323865b85e0f147d75f9a5bd98360befa37481b02dd57af8f5", size = 944309, upload-time = "2025-01-23T18:04:23.143Z" }, ] @@ -2175,6 +2378,7 @@ dependencies = [ { name = "nvidia-cublas-cu12", version = "12.6.4.1", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-8-invokeai-cpu' and extra != 'extra-8-invokeai-cuda' and extra != 'extra-8-invokeai-rocm') or (sys_platform == 'win32' and extra != 'extra-8-invokeai-cpu' and extra != 'extra-8-invokeai-cuda' and extra != 'extra-8-invokeai-rocm') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, ] wheels = [ + { url = "https://files.pythonhosted.org/packages/99/93/a201a12d3ec1caa8c6ac34c1c2f9eeb696b886f0c36ff23c638b46603bd0/nvidia_cudnn_cu12-9.5.1.17-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:9fd4584468533c61873e5fda8ca41bac3a38bcb2d12350830c69b0a96a7e4def", size = 570523509, upload-time = "2024-10-25T19:53:03.148Z" }, { url = "https://files.pythonhosted.org/packages/2a/78/4535c9c7f859a64781e43c969a3a7e84c54634e319a996d43ef32ce46f83/nvidia_cudnn_cu12-9.5.1.17-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:30ac3869f6db17d170e0e556dd6cc5eee02647abc31ca856634d5a40f82c15b2", size = 570988386, upload-time = "2024-10-25T19:54:26.39Z" }, { url = "https://files.pythonhosted.org/packages/b6/b2/3f60d15f037fa5419d9d7f788b100ef33ea913ae5315c87ca6d6fa606c35/nvidia_cudnn_cu12-9.5.1.17-py3-none-win_amd64.whl", hash = "sha256:d7af0f8a4f3b4b9dbb3122f2ef553b45694ed9c384d5a75bab197b8eefb79ab8", size = 565440743, upload-time = "2024-10-25T19:55:49.74Z" }, ] @@ -2191,6 +2395,7 @@ dependencies = [ { name = "nvidia-cublas-cu12", version = "12.8.3.14", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or (sys_platform == 'win32' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm')" }, ] wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/2e/ec5dda717eeb1de3afbbbb611ca556f9d6d057470759c6abd36d72f0063b/nvidia_cudnn_cu12-9.7.1.26-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:848a61d40ef3b32bd4e1fadb599f0cf04a4b942fbe5fb3be572ad75f9b8c53ef", size = 725862213, upload-time = "2025-02-06T22:14:57.169Z" }, { url = "https://files.pythonhosted.org/packages/25/dc/dc825c4b1c83b538e207e34f48f86063c88deaa35d46c651c7c181364ba2/nvidia_cudnn_cu12-9.7.1.26-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:6d011159a158f3cfc47bf851aea79e31bcff60d530b70ef70474c84cac484d07", size = 726851421, upload-time = "2025-02-06T22:18:29.812Z" }, { url = "https://files.pythonhosted.org/packages/d0/ea/636cda41b3865caa0d43c34f558167304acde3d2c5f6c54c00a550e69ecd/nvidia_cudnn_cu12-9.7.1.26-py3-none-win_amd64.whl", hash = "sha256:7b805b9a4cf9f3da7c5f4ea4a9dff7baf62d1a612d6154a7e0d2ea51ed296241", size = 715962100, upload-time = "2025-02-06T22:21:32.431Z" }, ] @@ -2207,6 +2412,8 @@ dependencies = [ { name = "nvidia-nvjitlink-cu12", version = "12.6.85", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-8-invokeai-cpu' and extra != 'extra-8-invokeai-cuda' and extra != 'extra-8-invokeai-rocm') or (sys_platform == 'win32' and extra != 'extra-8-invokeai-cpu' and extra != 'extra-8-invokeai-cuda' and extra != 'extra-8-invokeai-rocm') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, ] wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/37/c50d2b2f2c07e146776389e3080f4faf70bcc4fa6e19d65bb54ca174ebc3/nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d16079550df460376455cba121db6564089176d9bac9e4f360493ca4741b22a6", size = 200164144, upload-time = "2024-11-20T17:40:58.288Z" }, + { url = "https://files.pythonhosted.org/packages/ce/f5/188566814b7339e893f8d210d3a5332352b1409815908dad6a363dcceac1/nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8510990de9f96c803a051822618d42bf6cb8f069ff3f48d93a8486efdacb48fb", size = 200164135, upload-time = "2024-10-01T17:03:24.212Z" }, { url = "https://files.pythonhosted.org/packages/8f/16/73727675941ab8e6ffd86ca3a4b7b47065edcca7a997920b831f8147c99d/nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ccba62eb9cef5559abd5e0d54ceed2d9934030f51163df018532142a8ec533e5", size = 200221632, upload-time = "2024-11-20T17:41:32.357Z" }, { url = "https://files.pythonhosted.org/packages/60/de/99ec247a07ea40c969d904fc14f3a356b3e2a704121675b75c366b694ee1/nvidia_cufft_cu12-11.3.0.4-py3-none-manylinux2014_x86_64.whl", hash = "sha256:768160ac89f6f7b459bee747e8d175dbf53619cfe74b2a5636264163138013ca", size = 200221622, upload-time = "2024-10-01T17:03:58.79Z" }, { url = "https://files.pythonhosted.org/packages/b4/38/36fd800cec8f6e89b7c1576edaaf8076e69ec631644cdbc1b5f2e2b5a9df/nvidia_cufft_cu12-11.3.0.4-py3-none-win_amd64.whl", hash = "sha256:6048ebddfb90d09d2707efb1fd78d4e3a77cb3ae4dc60e19aab6be0ece2ae464", size = 199356881, upload-time = "2024-10-01T17:13:01.861Z" }, @@ -2224,6 +2431,7 @@ dependencies = [ { name = "nvidia-nvjitlink-cu12", version = "12.8.61", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or (sys_platform == 'win32' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm')" }, ] wheels = [ + { url = "https://files.pythonhosted.org/packages/72/95/6157cb45a49f5090a470de42353a22a0ed5b13077886dca891b4b0e350fe/nvidia_cufft_cu12-11.3.3.41-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:68509dcd7e3306e69d0e2d8a6d21c8b25ed62e6df8aac192ce752f17677398b5", size = 193108626, upload-time = "2025-01-23T17:55:49.192Z" }, { url = "https://files.pythonhosted.org/packages/ac/26/b53c493c38dccb1f1a42e1a21dc12cba2a77fbe36c652f7726d9ec4aba28/nvidia_cufft_cu12-11.3.3.41-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:da650080ab79fcdf7a4b06aa1b460e99860646b176a43f6208099bdc17836b6a", size = 193118795, upload-time = "2025-01-23T17:56:30.536Z" }, { url = "https://files.pythonhosted.org/packages/32/f3/f6248aa119c2726b1bdd02d472332cae274133bd32ca5fa8822efb0c308c/nvidia_cufft_cu12-11.3.3.41-py3-none-win_amd64.whl", hash = "sha256:f9760612886786601d27a0993bb29ce1f757e6b8b173499d0ecfa850d31b50f8", size = 192216738, upload-time = "2025-01-23T18:08:51.102Z" }, ] @@ -2238,6 +2446,7 @@ resolution-markers = [ ] wheels = [ { url = "https://files.pythonhosted.org/packages/b2/66/cc9876340ac68ae71b15c743ddb13f8b30d5244af344ec8322b449e35426/nvidia_cufile_cu12-1.11.1.6-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc23469d1c7e52ce6c1d55253273d32c565dd22068647f3aa59b3c6b005bf159", size = 1142103, upload-time = "2024-11-20T17:42:11.83Z" }, + { url = "https://files.pythonhosted.org/packages/17/bf/cc834147263b929229ce4aadd62869f0b195e98569d4c28b23edc72b85d9/nvidia_cufile_cu12-1.11.1.6-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:8f57a0051dcf2543f6dc2b98a98cb2719c37d3cee1baba8965d57f3bbc90d4db", size = 1066155, upload-time = "2024-11-20T17:41:49.376Z" }, ] [[package]] @@ -2250,6 +2459,7 @@ resolution-markers = [ ] wheels = [ { url = "https://files.pythonhosted.org/packages/e5/9c/1f3264d0a84c8a031487fb7f59780fc78fa6f1c97776233956780e3dc3ac/nvidia_cufile_cu12-1.13.0.11-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:483f434c541806936b98366f6d33caef5440572de8ddf38d453213729da3e7d4", size = 1197801, upload-time = "2025-01-23T17:57:07.247Z" }, + { url = "https://files.pythonhosted.org/packages/35/80/f6a0fc90ab6fa4ac916f3643e5b620fd19724626c59ae83b74f5efef0349/nvidia_cufile_cu12-1.13.0.11-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:2acbee65dc2eaf58331f0798c5e6bcdd790c4acb26347530297e63528c9eba5d", size = 1120660, upload-time = "2025-01-23T17:56:56.608Z" }, ] [[package]] @@ -2261,8 +2471,10 @@ resolution-markers = [ "(python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version < '3.12' and sys_platform == 'win32')", ] wheels = [ + { url = "https://files.pythonhosted.org/packages/42/ac/36543605358a355632f1a6faa3e2d5dfb91eab1e4bc7d552040e0383c335/nvidia_curand_cu12-10.3.7.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:6e82df077060ea28e37f48a3ec442a8f47690c7499bff392a5938614b56c98d8", size = 56289881, upload-time = "2024-10-01T17:04:18.981Z" }, { url = "https://files.pythonhosted.org/packages/73/1b/44a01c4e70933637c93e6e1a8063d1e998b50213a6b65ac5a9169c47e98e/nvidia_curand_cu12-10.3.7.77-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a42cd1344297f70b9e39a1e4f467a4e1c10f1da54ff7a85c12197f6c652c8bdf", size = 56279010, upload-time = "2024-11-20T17:42:50.958Z" }, { url = "https://files.pythonhosted.org/packages/4a/aa/2c7ff0b5ee02eaef890c0ce7d4f74bc30901871c5e45dee1ae6d0083cd80/nvidia_curand_cu12-10.3.7.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:99f1a32f1ac2bd134897fc7a203f779303261268a65762a623bf30cc9fe79117", size = 56279000, upload-time = "2024-10-01T17:04:45.274Z" }, + { url = "https://files.pythonhosted.org/packages/a6/02/5362a9396f23f7de1dd8a64369e87c85ffff8216fc8194ace0fa45ba27a5/nvidia_curand_cu12-10.3.7.77-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:7b2ed8e95595c3591d984ea3603dd66fe6ce6812b886d59049988a712ed06b6e", size = 56289882, upload-time = "2024-11-20T17:42:25.222Z" }, { url = "https://files.pythonhosted.org/packages/a9/a8/0cd0cec757bd4b4b4ef150fca62ec064db7d08a291dced835a0be7d2c147/nvidia_curand_cu12-10.3.7.77-py3-none-win_amd64.whl", hash = "sha256:6d6d935ffba0f3d439b7cd968192ff068fafd9018dbf1b85b37261b13cfc9905", size = 55783873, upload-time = "2024-10-01T17:13:30.377Z" }, ] @@ -2275,6 +2487,7 @@ resolution-markers = [ "(python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version < '3.12' and sys_platform == 'win32')", ] wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/13/bbcf48e2f8a6a9adef58f130bc968810528a4e66bbbe62fad335241e699f/nvidia_curand_cu12-10.3.9.55-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:b6bb90c044fa9b07cedae2ef29077c4cf851fb6fdd6d862102321f359dca81e9", size = 63623836, upload-time = "2025-01-23T17:57:22.319Z" }, { url = "https://files.pythonhosted.org/packages/bd/fc/7be5d0082507269bb04ac07cc614c84b78749efb96e8cf4100a8a1178e98/nvidia_curand_cu12-10.3.9.55-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:8387d974240c91f6a60b761b83d4b2f9b938b7e0b9617bae0f0dafe4f5c36b86", size = 63618038, upload-time = "2025-01-23T17:57:41.838Z" }, { url = "https://files.pythonhosted.org/packages/d6/f0/91252f3cffe3f3c233a8e17262c21b41534652edfe783c1e58ea1c92c115/nvidia_curand_cu12-10.3.9.55-py3-none-win_amd64.whl", hash = "sha256:570d82475fe7f3d8ed01ffbe3b71796301e0e24c98762ca018ff8ce4f5418e1f", size = 62761446, upload-time = "2025-01-23T18:09:21.663Z" }, ] @@ -2293,8 +2506,10 @@ dependencies = [ { name = "nvidia-nvjitlink-cu12", version = "12.6.85", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-8-invokeai-cpu' and extra != 'extra-8-invokeai-cuda' and extra != 'extra-8-invokeai-rocm') or (sys_platform == 'win32' and extra != 'extra-8-invokeai-cpu' and extra != 'extra-8-invokeai-cuda' and extra != 'extra-8-invokeai-rocm') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, ] wheels = [ + { url = "https://files.pythonhosted.org/packages/93/17/dbe1aa865e4fdc7b6d4d0dd308fdd5aaab60f939abfc0ea1954eac4fb113/nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0ce237ef60acde1efc457335a2ddadfd7610b892d94efee7b776c64bb1cac9e0", size = 157833628, upload-time = "2024-10-01T17:05:05.591Z" }, { url = "https://files.pythonhosted.org/packages/f0/6e/c2cf12c9ff8b872e92b4a5740701e51ff17689c4d726fca91875b07f655d/nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e9e49843a7707e42022babb9bcfa33c29857a93b88020c4e4434656a655b698c", size = 158229790, upload-time = "2024-11-20T17:43:43.211Z" }, { url = "https://files.pythonhosted.org/packages/9f/81/baba53585da791d043c10084cf9553e074548408e04ae884cfe9193bd484/nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6cf28f17f64107a0c4d7802be5ff5537b2130bfc112f25d5a30df227058ca0e6", size = 158229780, upload-time = "2024-10-01T17:05:39.875Z" }, + { url = "https://files.pythonhosted.org/packages/7c/5f/07d0ba3b7f19be5a5ec32a8679fc9384cfd9fc6c869825e93be9f28d6690/nvidia_cusolver_cu12-11.7.1.2-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:dbbe4fc38ec1289c7e5230e16248365e375c3673c9c8bac5796e2e20db07f56e", size = 157833630, upload-time = "2024-11-20T17:43:16.77Z" }, { url = "https://files.pythonhosted.org/packages/d4/53/fff50a0808df7113d77e3bbc7c2b7eaed6f57d5eb80fbe93ead2aea1e09a/nvidia_cusolver_cu12-11.7.1.2-py3-none-win_amd64.whl", hash = "sha256:6813f9d8073f555444a8705f3ab0296d3e1cb37a16d694c5fc8b862a0d8706d7", size = 149287877, upload-time = "2024-10-01T17:13:49.804Z" }, ] @@ -2312,6 +2527,7 @@ dependencies = [ { name = "nvidia-nvjitlink-cu12", version = "12.8.61", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or (sys_platform == 'win32' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm')" }, ] wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/ce/4214a892e804b20bf66d04f04a473006fc2d3dac158160ef85f1bc906639/nvidia_cusolver_cu12-11.7.2.55-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:0fd9e98246f43c15bee5561147ad235dfdf2d037f5d07c9d41af3f7f72feb7cc", size = 260094827, upload-time = "2025-01-23T17:58:17.586Z" }, { url = "https://files.pythonhosted.org/packages/c2/08/953675873a136d96bb12f93b49ba045d1107bc94d2551c52b12fa6c7dec3/nvidia_cusolver_cu12-11.7.2.55-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:4d1354102f1e922cee9db51920dba9e2559877cf6ff5ad03a00d853adafb191b", size = 260373342, upload-time = "2025-01-23T17:58:56.406Z" }, { url = "https://files.pythonhosted.org/packages/c4/f9/e0e6f8b7aecd13e0f9e937d116fb3211329a0a92b9bea9624b1368de307a/nvidia_cusolver_cu12-11.7.2.55-py3-none-win_amd64.whl", hash = "sha256:a5a516c55da5c5aba98420d9bc9bcab18245f21ec87338cc1f930eb18dd411ac", size = 249600787, upload-time = "2025-01-23T18:10:07.641Z" }, ] @@ -2328,6 +2544,8 @@ dependencies = [ { name = "nvidia-nvjitlink-cu12", version = "12.6.85", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-8-invokeai-cpu' and extra != 'extra-8-invokeai-cuda' and extra != 'extra-8-invokeai-rocm') or (sys_platform == 'win32' and extra != 'extra-8-invokeai-cpu' and extra != 'extra-8-invokeai-cuda' and extra != 'extra-8-invokeai-rocm') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, ] wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/eb/6681efd0aa7df96b4f8067b3ce7246833dd36830bb4cec8896182773db7d/nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d25b62fb18751758fe3c93a4a08eff08effedfe4edf1c6bb5afd0890fe88f887", size = 216451147, upload-time = "2024-11-20T17:44:18.055Z" }, + { url = "https://files.pythonhosted.org/packages/d3/56/3af21e43014eb40134dea004e8d0f1ef19d9596a39e4d497d5a7de01669f/nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7aa32fa5470cf754f72d1116c7cbc300b4e638d3ae5304cfa4a638a5b87161b1", size = 216451135, upload-time = "2024-10-01T17:06:03.826Z" }, { url = "https://files.pythonhosted.org/packages/06/1e/b8b7c2f4099a37b96af5c9bb158632ea9e5d9d27d7391d7eb8fc45236674/nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7556d9eca156e18184b94947ade0fba5bb47d69cec46bf8660fd2c71a4b48b73", size = 216561367, upload-time = "2024-11-20T17:44:54.824Z" }, { url = "https://files.pythonhosted.org/packages/43/ac/64c4316ba163e8217a99680c7605f779accffc6a4bcd0c778c12948d3707/nvidia_cusparse_cu12-12.5.4.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:23749a6571191a215cb74d1cdbff4a86e7b19f1200c071b3fcf844a5bea23a2f", size = 216561357, upload-time = "2024-10-01T17:06:29.861Z" }, { url = "https://files.pythonhosted.org/packages/45/ef/876ad8e4260e1128e6d4aac803d9d51baf3791ebdb4a9b8d9b8db032b4b0/nvidia_cusparse_cu12-12.5.4.2-py3-none-win_amd64.whl", hash = "sha256:4acb8c08855a26d737398cba8fb6f8f5045d93f82612b4cfd84645a2332ccf20", size = 213712630, upload-time = "2024-10-01T17:14:23.779Z" }, @@ -2345,6 +2563,7 @@ dependencies = [ { name = "nvidia-nvjitlink-cu12", version = "12.8.61", source = { registry = "https://pypi.org/simple" }, marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or (sys_platform == 'win32' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm')" }, ] wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/a2/313db0453087f5324a5900380ca2e57e050c8de76f407b5e11383dc762ae/nvidia_cusparse_cu12-12.5.7.53-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d869c6146ca80f4305b62e02d924b4aaced936f8173e3cef536a67eed2a91af1", size = 291963692, upload-time = "2025-01-23T17:59:40.325Z" }, { url = "https://files.pythonhosted.org/packages/c2/ab/31e8149c66213b846c082a3b41b1365b831f41191f9f40c6ddbc8a7d550e/nvidia_cusparse_cu12-12.5.7.53-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3c1b61eb8c85257ea07e9354606b26397612627fdcd327bfd91ccf6155e7c86d", size = 292064180, upload-time = "2025-01-23T18:00:23.233Z" }, { url = "https://files.pythonhosted.org/packages/7c/48/64b01653919a3d1d9b5117c156806ab0db8312c7496ff646477a5c1545bf/nvidia_cusparse_cu12-12.5.7.53-py3-none-win_amd64.whl", hash = "sha256:82c201d6781bacf6bb7c654f0446728d0fe596dfdd82ef4a04c204ce3e107441", size = 288767123, upload-time = "2025-01-23T18:11:01.543Z" }, ] @@ -2354,6 +2573,7 @@ name = "nvidia-cusparselt-cu12" version = "0.6.3" source = { registry = "https://pypi.org/simple" } wheels = [ + { url = "https://files.pythonhosted.org/packages/62/da/4de092c61c6dea1fc9c936e69308a02531d122e12f1f649825934ad651b5/nvidia_cusparselt_cu12-0.6.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8371549623ba601a06322af2133c4a44350575f5a3108fb75f3ef20b822ad5f1", size = 156402859, upload-time = "2024-10-16T02:23:17.184Z" }, { url = "https://files.pythonhosted.org/packages/3b/9a/72ef35b399b0e183bc2e8f6f558036922d453c4d8237dab26c666a04244b/nvidia_cusparselt_cu12-0.6.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e5c8a26c36445dd2e6812f1177978a24e2d37cacce7e090f297a688d1ec44f46", size = 156785796, upload-time = "2024-10-15T21:29:17.709Z" }, { url = "https://files.pythonhosted.org/packages/46/3e/9e1e394a02a06f694be2c97bbe47288bb7c90ea84c7e9cf88f7b28afe165/nvidia_cusparselt_cu12-0.6.3-py3-none-win_amd64.whl", hash = "sha256:3b325bcbd9b754ba43df5a311488fca11a6b5dc3d11df4d190c000cf1a0765c7", size = 155595972, upload-time = "2024-10-15T22:58:35.426Z" }, ] @@ -2363,6 +2583,7 @@ name = "nvidia-nccl-cu12" version = "2.26.2" source = { registry = "https://pypi.org/simple" } wheels = [ + { url = "https://files.pythonhosted.org/packages/69/5b/ca2f213f637305633814ae8c36b153220e40a07ea001966dcd87391f3acb/nvidia_nccl_cu12-2.26.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c196e95e832ad30fbbb50381eb3cbd1fadd5675e587a548563993609af19522", size = 291671495, upload-time = "2025-03-13T00:30:07.805Z" }, { url = "https://files.pythonhosted.org/packages/67/ca/f42388aed0fddd64ade7493dbba36e1f534d4e6fdbdd355c6a90030ae028/nvidia_nccl_cu12-2.26.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:694cf3879a206553cc9d7dbda76b13efaf610fdb70a50cba303de1b0d1530ac6", size = 201319755, upload-time = "2025-03-13T00:29:55.296Z" }, ] @@ -2376,6 +2597,7 @@ resolution-markers = [ ] wheels = [ { url = "https://files.pythonhosted.org/packages/9d/d7/c5383e47c7e9bf1c99d5bd2a8c935af2b6d705ad831a7ec5c97db4d82f4f/nvidia_nvjitlink_cu12-12.6.85-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:eedc36df9e88b682efe4309aa16b5b4e78c2407eac59e8c10a6a47535164369a", size = 19744971, upload-time = "2024-11-20T17:46:53.366Z" }, + { url = "https://files.pythonhosted.org/packages/31/db/dc71113d441f208cdfe7ae10d4983884e13f464a6252450693365e166dcf/nvidia_nvjitlink_cu12-12.6.85-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cf4eaa7d4b6b543ffd69d6abfb11efdeb2db48270d94dfd3a452c24150829e41", size = 19270338, upload-time = "2024-11-20T17:46:29.758Z" }, { url = "https://files.pythonhosted.org/packages/89/76/93c1467b1387387440a4d25102d86b7794535449b689f8e2dc22c1c8ff7f/nvidia_nvjitlink_cu12-12.6.85-py3-none-win_amd64.whl", hash = "sha256:e61120e52ed675747825cdd16febc6a0730537451d867ee58bee3853b1b13d1c", size = 161908572, upload-time = "2024-11-20T17:52:40.124Z" }, ] @@ -2389,6 +2611,7 @@ resolution-markers = [ ] wheels = [ { url = "https://files.pythonhosted.org/packages/03/f8/9d85593582bd99b8d7c65634d2304780aefade049b2b94d96e44084be90b/nvidia_nvjitlink_cu12-12.8.61-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:45fd79f2ae20bd67e8bc411055939049873bfd8fac70ff13bd4865e0b9bdab17", size = 39243473, upload-time = "2025-01-23T18:03:03.509Z" }, + { url = "https://files.pythonhosted.org/packages/af/53/698f3758f48c5fcb1112721e40cc6714da3980d3c7e93bae5b29dafa9857/nvidia_nvjitlink_cu12-12.8.61-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b80ecab31085dda3ce3b41d043be0ec739216c3fc633b8abe212d5a30026df0", size = 38374634, upload-time = "2025-01-23T18:02:35.812Z" }, { url = "https://files.pythonhosted.org/packages/7f/c6/0d1b2bfeb2ef42c06db0570c4d081e5cde4450b54c09e43165126cfe6ff6/nvidia_nvjitlink_cu12-12.8.61-py3-none-win_amd64.whl", hash = "sha256:1166a964d25fdc0eae497574d38824305195a5283324a21ccb0ce0c802cbf41c", size = 268514099, upload-time = "2025-01-23T18:12:33.874Z" }, ] @@ -2401,6 +2624,8 @@ resolution-markers = [ "(python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version < '3.12' and sys_platform == 'win32')", ] wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/93/80f8a520375af9d7ee44571a6544653a176e53c2b8ccce85b97b83c2491b/nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f44f8d86bb7d5629988d61c8d3ae61dddb2015dee142740536bc7481b022fe4b", size = 90549, upload-time = "2024-11-20T17:38:17.387Z" }, + { url = "https://files.pythonhosted.org/packages/2b/53/36e2fd6c7068997169b49ffc8c12d5af5e5ff209df6e1a2c4d373b3a638f/nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_aarch64.whl", hash = "sha256:adcaabb9d436c9761fca2b13959a2d237c5f9fd406c8e4b723c695409ff88059", size = 90539, upload-time = "2024-10-01T17:00:27.179Z" }, { url = "https://files.pythonhosted.org/packages/56/9a/fff8376f8e3d084cd1530e1ef7b879bb7d6d265620c95c1b322725c694f4/nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b90bed3df379fa79afbd21be8e04a0314336b8ae16768b58f2d34cb1d04cd7d2", size = 89276, upload-time = "2024-11-20T17:38:27.621Z" }, { url = "https://files.pythonhosted.org/packages/9e/4e/0d0c945463719429b7bd21dece907ad0bde437a2ff12b9b12fee94722ab0/nvidia_nvtx_cu12-12.6.77-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6574241a3ec5fdc9334353ab8c479fe75841dbe8f4532a8fc97ce63503330ba1", size = 89265, upload-time = "2024-10-01T17:00:38.172Z" }, { url = "https://files.pythonhosted.org/packages/f7/cd/98a447919d4ed14d407ac82b14b0a0c9c1dbfe81099934b1fc3bfd1e6316/nvidia_nvtx_cu12-12.6.77-py3-none-win_amd64.whl", hash = "sha256:2fb11a4af04a5e6c84073e6404d26588a34afd35379f0855a99797897efa75c0", size = 56434, upload-time = "2024-10-01T17:11:13.124Z" }, @@ -2415,6 +2640,7 @@ resolution-markers = [ "(python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version < '3.12' and sys_platform == 'win32')", ] wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/e8/ae6ecbdade8bb9174d75db2b302c57c1c27d9277d6531c62aafde5fb32a3/nvidia_nvtx_cu12-12.8.55-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c38405335fbc0f0bf363eaeaeb476e8dfa8bae82fada41d25ace458b9ba9f3db", size = 91103, upload-time = "2025-01-23T17:50:24.664Z" }, { url = "https://files.pythonhosted.org/packages/8d/cd/0e8c51b2ae3a58f054f2e7fe91b82d201abfb30167f2431e9bd92d532f42/nvidia_nvtx_cu12-12.8.55-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2dd0780f1a55c21d8e06a743de5bd95653de630decfff40621dbde78cc307102", size = 89896, upload-time = "2025-01-23T17:50:44.487Z" }, { url = "https://files.pythonhosted.org/packages/e5/14/84d46e62bfde46dd20cfb041e0bb5c2ec454fd6a384696e7fa3463c5bb59/nvidia_nvtx_cu12-12.8.55-py3-none-win_amd64.whl", hash = "sha256:9022681677aef1313458f88353ad9c0d2fbbe6402d6b07c9f00ba0e3ca8774d3", size = 56435, upload-time = "2025-01-23T18:06:06.268Z" }, ] @@ -2430,10 +2656,12 @@ dependencies = [ sdist = { url = "https://files.pythonhosted.org/packages/74/be/242d02ebf7fe115bd695166eeea58b2206c9fa62de22cf9cbf8986fa8d27/onnx-1.16.1.tar.gz", hash = "sha256:8299193f0f2a3849bfc069641aa8e4f93696602da8d165632af8ee48ec7556b6", size = 12306956, upload-time = "2024-05-23T17:56:58.051Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/17/ab/cea6c47f05b51046f4e7b523b817a99c736f9569c60613b53c03f5fff355/onnx-1.16.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:006ba5059c85ce43e89a1486cc0276d0f1a8ec9c6efd1a9334fd3fa0f6e33b64", size = 16504005, upload-time = "2024-05-23T17:55:24.388Z" }, + { url = "https://files.pythonhosted.org/packages/55/f8/fd7078f3c976209ff19e027eaabf1d1b0e35ffcdd48e37f9148767480bd1/onnx-1.16.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1521ea7cd3497ecaf57d3b5e72d637ca5ebca632122a0806a9df99bedbeecdf8", size = 15793779, upload-time = "2024-05-23T17:55:28.945Z" }, { url = "https://files.pythonhosted.org/packages/e8/e3/2eba2167d36a845af16255fe9c2a0a22a7034f3765109790cab91038c167/onnx-1.16.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45cf20421aeac03872bea5fd6ebf92abe15c4d1461a2572eb839add5059e2a09", size = 15924158, upload-time = "2024-05-23T17:55:33.206Z" }, { url = "https://files.pythonhosted.org/packages/3d/d3/8c4cae45801cf75dd0eeaf9171a55d360dbd9109fcd8910dd74c709ed01c/onnx-1.16.1-cp311-cp311-win32.whl", hash = "sha256:f98e275b4f46a617a9c527e60c02531eae03cf67a04c26db8a1c20acee539533", size = 14337114, upload-time = "2024-05-23T17:55:37.027Z" }, { url = "https://files.pythonhosted.org/packages/b2/88/974de6816540a0e770e323425b0291784556063c7b0754bbbdbb86fb3716/onnx-1.16.1-cp311-cp311-win_amd64.whl", hash = "sha256:95aa20aa65a9035d7543e81713e8b0f611e213fc02171959ef4ee09311d1bf28", size = 14436244, upload-time = "2024-05-23T17:55:41.017Z" }, { url = "https://files.pythonhosted.org/packages/7e/1b/08d8dac6bfb4f3b9c323600549c14cc96fe9a3d0edbe492feead0572cedb/onnx-1.16.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:32e11d39bee04f927fab09f74c46cf76584094462311bab1aca9ccdae6ed3366", size = 16508491, upload-time = "2024-05-23T17:55:44.927Z" }, + { url = "https://files.pythonhosted.org/packages/47/56/8e87c498d6e8c9754a4d5ffe01e2a4b2a6ab68d7a2c657dc5bfa7560fb04/onnx-1.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8884bf53b552873c0c9b072cb8625e7d4e8f3cc0529191632d24e3de58a3b93a", size = 15792296, upload-time = "2024-05-23T17:55:49.256Z" }, { url = "https://files.pythonhosted.org/packages/14/a9/bb3a9aedbdc6a5ab8423d3d246a8e6d14f527de0d992fefa55d5b23fd7f0/onnx-1.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:595b2830093f81361961295f7b0ebb6000423bcd04123d516d081c306002e387", size = 15924056, upload-time = "2024-05-23T17:55:53.257Z" }, { url = "https://files.pythonhosted.org/packages/80/b8/2fe98bc5802e6cfe878acd8f2c5d193c081434aa27dc9ce34f157e1132d5/onnx-1.16.1-cp312-cp312-win32.whl", hash = "sha256:2fde4dd5bc278b3fc8148f460bce8807b2874c66f48529df9444cdbc9ecf456b", size = 14337703, upload-time = "2024-05-23T17:55:57.061Z" }, { url = "https://files.pythonhosted.org/packages/85/53/09fed1c26b53a0b07791badaea96ffc46734b2251fc0d651bfda1163c159/onnx-1.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:e69ad8c110d8c37d759cad019d498fdf3fd24e0bfaeb960e52fed0469a5d2974", size = 14438296, upload-time = "2024-05-23T17:56:00.538Z" }, @@ -2453,10 +2681,12 @@ dependencies = [ ] wheels = [ { url = "https://files.pythonhosted.org/packages/f0/ff/77bee5df55f034ee81d2e1bc58b2b8511b9c54f06ce6566cb562c5d95aa5/onnxruntime-1.19.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:d863e8acdc7232d705d49e41087e10b274c42f09e259016a46f32c34e06dc4fd", size = 16779187, upload-time = "2024-09-04T06:37:18.245Z" }, + { url = "https://files.pythonhosted.org/packages/f3/78/e29f5fb76e0f6524f3520e8e5b9d53282784b45d14068c5112db9f712b0a/onnxruntime-1.19.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c1dfe4f660a71b31caa81fc298a25f9612815215a47b286236e61d540350d7b6", size = 11496005, upload-time = "2024-09-04T06:37:20.998Z" }, { url = "https://files.pythonhosted.org/packages/60/ce/be4152da5c1030ab5a159a4a792ed9abad6ba498d79ef0aeba593ff7b5bf/onnxruntime-1.19.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a36511dc07c5c964b916697e42e366fa43c48cdb3d3503578d78cef30417cb84", size = 13167809, upload-time = "2024-09-04T06:37:24.221Z" }, { url = "https://files.pythonhosted.org/packages/e1/00/9740a074eb0e0a21ff13a2c4f32aecc5b21110b2c9b9177d8ac132b66e2d/onnxruntime-1.19.2-cp311-cp311-win32.whl", hash = "sha256:50cbb8dc69d6befad4746a69760e5b00cc3ff0a59c6c3fb27f8afa20e2cab7e7", size = 9591445, upload-time = "2024-09-04T06:37:26.766Z" }, { url = "https://files.pythonhosted.org/packages/1e/f5/9d995a685f97508b3254f17015b4a78641b0625e79480a7aed7a7a105d7c/onnxruntime-1.19.2-cp311-cp311-win_amd64.whl", hash = "sha256:1c3e5d415b78337fa0b1b75291e9ea9fb2a4c1f148eb5811e7212fed02cfffa8", size = 11085695, upload-time = "2024-09-04T06:37:29.473Z" }, { url = "https://files.pythonhosted.org/packages/f2/a5/2a02687a88fc8a2507bef65876c90e96b9f8de5ba1f810acbf67c140fc67/onnxruntime-1.19.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:68e7051bef9cfefcbb858d2d2646536829894d72a4130c24019219442b1dd2ed", size = 16790434, upload-time = "2024-09-04T06:37:32.77Z" }, + { url = "https://files.pythonhosted.org/packages/47/64/da42254ec14452cad2cdd4cf407094841c0a378c0d08944e9a36172197e9/onnxruntime-1.19.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d2d366fbcc205ce68a8a3bde2185fd15c604d9645888703785b61ef174265168", size = 11486028, upload-time = "2024-09-04T06:37:35.364Z" }, { url = "https://files.pythonhosted.org/packages/b2/92/3574f6836f33b1b25f272293e72538c38451b12c2d9aa08630bb6bc0f057/onnxruntime-1.19.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:477b93df4db467e9cbf34051662a4b27c18e131fa1836e05974eae0d6e4cf29b", size = 13175054, upload-time = "2024-09-04T06:37:38.192Z" }, { url = "https://files.pythonhosted.org/packages/ff/c9/8c37e413a830cac7f7dc094fffbd0c998c8bcb66a6f0b0a3201a49bc742b/onnxruntime-1.19.2-cp312-cp312-win32.whl", hash = "sha256:9a174073dc5608fad05f7cf7f320b52e8035e73d80b0a23c80f840e5a97c0147", size = 9592681, upload-time = "2024-09-04T06:37:41.328Z" }, { url = "https://files.pythonhosted.org/packages/44/c0/59768846533786a82cafb38d8d2f900ad666bc91f0ae634774d286fa3c47/onnxruntime-1.19.2-cp312-cp312-win_amd64.whl", hash = "sha256:190103273ea4507638ffc31d66a980594b237874b65379e273125150eb044857", size = 11086411, upload-time = "2024-09-04T06:37:44.123Z" }, @@ -2506,6 +2736,7 @@ sdist = { url = "https://files.pythonhosted.org/packages/ef/51/3ceb85ecff5f26994 wheels = [ { url = "https://files.pythonhosted.org/packages/f3/78/b504ca8f7a312918d184e0b8093c62bc9a110d8154f658b591ef5c020d65/opencv_contrib_python-4.11.0.86-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:d911cedc511d98f79994580b245d59fc97f57f0f9923a99945d8b92c7ac671f6", size = 46276766, upload-time = "2025-01-16T13:52:46.131Z" }, { url = "https://files.pythonhosted.org/packages/8c/07/68e0b24217671b65c23e105bb7afd4ef4fd01507670cf5e61373d9efd6b5/opencv_contrib_python-4.11.0.86-cp37-abi3-macosx_13_0_x86_64.whl", hash = "sha256:e10a293af18aa5f842d012fa14e87345b3ee06db4c29bd592ff94b51f7ffca2b", size = 66524088, upload-time = "2025-01-16T13:55:33.887Z" }, + { url = "https://files.pythonhosted.org/packages/ae/7b/7e1471aa92f9f3c1bd8dbe624622b62add6f734db34fbbb9974e2ec70c34/opencv_contrib_python-4.11.0.86-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f21034bc8b00eb286a0a0a92b99767bf596bfe426cf4bc2e79647d64ad0dd6da", size = 47870560, upload-time = "2025-01-16T13:51:48.592Z" }, { url = "https://files.pythonhosted.org/packages/f7/13/756b13b8d5d417a0b4c3bf6ceafb59df0ed05cec7fedc2490bbbf5e60ebc/opencv_contrib_python-4.11.0.86-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c47c0ef1098461cdc6fa1cdce4c942b8ec974c87423f4b5951443d26bb9ae407", size = 69098423, upload-time = "2025-01-16T13:52:46.84Z" }, { url = "https://files.pythonhosted.org/packages/fd/8b/4f63d2fdcfceab528bff10c9d8d2a4e6230098e0b0af54e3e8e91b420ea0/opencv_contrib_python-4.11.0.86-cp37-abi3-win32.whl", hash = "sha256:194841c664ceaa0692410b4ed0af557425608e33db3a181ded28b87acb66748d", size = 35156028, upload-time = "2025-01-16T13:52:30.133Z" }, { url = "https://files.pythonhosted.org/packages/0d/c6/146487546adc4726f0be591a65b466973feaa58cc3db711087e802e940fb/opencv_contrib_python-4.11.0.86-cp37-abi3-win_amd64.whl", hash = "sha256:654758a9ae8ca9a75fca7b64b19163636534f0eedffe1e14c3d7218988625c8d", size = 46185163, upload-time = "2025-01-16T13:52:39.745Z" }, @@ -2617,23 +2848,31 @@ sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a302 wheels = [ { url = "https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:8be29e59487a79f173507c30ddf57e733a357f67881430449bb32614075a40ab", size = 5354347, upload-time = "2026-04-01T14:42:44.255Z" }, { url = "https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:71cde9a1e1551df7d34a25462fc60325e8a11a82cc2e2f54578e5e9a1e153d65", size = 4695873, upload-time = "2026-04-01T14:42:46.452Z" }, + { url = "https://files.pythonhosted.org/packages/df/21/e3fbdf54408a973c7f7f89a23b2cb97a7ef30c61ab4142af31eee6aebc88/pillow-12.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f490f9368b6fc026f021db16d7ec2fbf7d89e2edb42e8ec09d2c60505f5729c7", size = 6280168, upload-time = "2026-04-01T14:42:49.228Z" }, { url = "https://files.pythonhosted.org/packages/d3/f1/00b7278c7dd52b17ad4329153748f87b6756ec195ff786c2bdf12518337d/pillow-12.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8bd7903a5f2a4545f6fd5935c90058b89d30045568985a71c79f5fd6edf9b91e", size = 8088188, upload-time = "2026-04-01T14:42:51.735Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cf/220a5994ef1b10e70e85748b75649d77d506499352be135a4989c957b701/pillow-12.2.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3997232e10d2920a68d25191392e3a4487d8183039e1c74c2297f00ed1c50705", size = 6394401, upload-time = "2026-04-01T14:42:54.343Z" }, { url = "https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e74473c875d78b8e9d5da2a70f7099549f9eb37ded4e2f6a463e60125bccd176", size = 7079655, upload-time = "2026-04-01T14:42:56.954Z" }, + { url = "https://files.pythonhosted.org/packages/6b/3d/45132c57d5fb4b5744567c3817026480ac7fc3ce5d4c47902bc0e7f6f853/pillow-12.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:56a3f9c60a13133a98ecff6197af34d7824de9b7b38c3654861a725c970c197b", size = 6503105, upload-time = "2026-04-01T14:42:59.847Z" }, { url = "https://files.pythonhosted.org/packages/7d/2e/9df2fc1e82097b1df3dce58dc43286aa01068e918c07574711fcc53e6fb4/pillow-12.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:90e6f81de50ad6b534cab6e5aef77ff6e37722b2f5d908686f4a5c9eba17a909", size = 7203402, upload-time = "2026-04-01T14:43:02.664Z" }, { url = "https://files.pythonhosted.org/packages/bd/2e/2941e42858ebb67e50ae741473de81c2984e6eff7b397017623c676e2e8d/pillow-12.2.0-cp311-cp311-win32.whl", hash = "sha256:8c984051042858021a54926eb597d6ee3012393ce9c181814115df4c60b9a808", size = 6378149, upload-time = "2026-04-01T14:43:05.274Z" }, { url = "https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e6b2a0c538fc200b38ff9eb6628228b77908c319a005815f2dde585a0664b60", size = 7082626, upload-time = "2026-04-01T14:43:08.557Z" }, { url = "https://files.pythonhosted.org/packages/c2/88/549194b5d6f1f494b485e493edc6693c0a16f4ada488e5bd974ed1f42fad/pillow-12.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:9a8a34cc89c67a65ea7437ce257cea81a9dad65b29805f3ecee8c8fe8ff25ffe", size = 2463531, upload-time = "2026-04-01T14:43:10.743Z" }, { url = "https://files.pythonhosted.org/packages/58/be/7482c8a5ebebbc6470b3eb791812fff7d5e0216c2be3827b30b8bb6603ed/pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5", size = 5308279, upload-time = "2026-04-01T14:43:13.246Z" }, { url = "https://files.pythonhosted.org/packages/d8/95/0a351b9289c2b5cbde0bacd4a83ebc44023e835490a727b2a3bd60ddc0f4/pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421", size = 4695490, upload-time = "2026-04-01T14:43:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/de/af/4e8e6869cbed569d43c416fad3dc4ecb944cb5d9492defaed89ddd6fe871/pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987", size = 6284462, upload-time = "2026-04-01T14:43:18.268Z" }, { url = "https://files.pythonhosted.org/packages/e9/9e/c05e19657fd57841e476be1ab46c4d501bffbadbafdc31a6d665f8b737b6/pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76", size = 8094744, upload-time = "2026-04-01T14:43:20.716Z" }, + { url = "https://files.pythonhosted.org/packages/2b/54/1789c455ed10176066b6e7e6da1b01e50e36f94ba584dc68d9eebfe9156d/pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005", size = 6398371, upload-time = "2026-04-01T14:43:23.443Z" }, { url = "https://files.pythonhosted.org/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780", size = 7087215, upload-time = "2026-04-01T14:43:26.758Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f8/2f6825e441d5b1959d2ca5adec984210f1ec086435b0ed5f52c19b3b8a6e/pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5", size = 6509783, upload-time = "2026-04-01T14:43:29.56Z" }, { url = "https://files.pythonhosted.org/packages/67/f9/029a27095ad20f854f9dba026b3ea6428548316e057e6fc3545409e86651/pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5", size = 7212112, upload-time = "2026-04-01T14:43:32.091Z" }, { url = "https://files.pythonhosted.org/packages/be/42/025cfe05d1be22dbfdb4f264fe9de1ccda83f66e4fc3aac94748e784af04/pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940", size = 6378489, upload-time = "2026-04-01T14:43:34.601Z" }, { url = "https://files.pythonhosted.org/packages/5d/7b/25a221d2c761c6a8ae21bfa3874988ff2583e19cf8a27bf2fee358df7942/pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5", size = 7084129, upload-time = "2026-04-01T14:43:37.213Z" }, { url = "https://files.pythonhosted.org/packages/10/e1/542a474affab20fd4a0f1836cb234e8493519da6b76899e30bcc5d990b8b/pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414", size = 2463612, upload-time = "2026-04-01T14:43:39.421Z" }, { url = "https://files.pythonhosted.org/packages/4e/b7/2437044fb910f499610356d1352e3423753c98e34f915252aafecc64889f/pillow-12.2.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0538bd5e05efec03ae613fd89c4ce0368ecd2ba239cc25b9f9be7ed426b0af1f", size = 5273969, upload-time = "2026-04-01T14:45:55.538Z" }, { url = "https://files.pythonhosted.org/packages/f6/f4/8316e31de11b780f4ac08ef3654a75555e624a98db1056ecb2122d008d5a/pillow-12.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:394167b21da716608eac917c60aa9b969421b5dcbbe02ae7f013e7b85811c69d", size = 4659674, upload-time = "2026-04-01T14:45:58.093Z" }, + { url = "https://files.pythonhosted.org/packages/d4/37/664fca7201f8bb2aa1d20e2c3d5564a62e6ae5111741966c8319ca802361/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5d04bfa02cc2d23b497d1e90a0f927070043f6cbf303e738300532379a4b4e0f", size = 5288479, upload-time = "2026-04-01T14:46:01.141Z" }, { url = "https://files.pythonhosted.org/packages/49/62/5b0ed78fce87346be7a5cfcfaaad91f6a1f98c26f86bdbafa2066c647ef6/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0c838a5125cee37e68edec915651521191cef1e6aa336b855f495766e77a366e", size = 7032230, upload-time = "2026-04-01T14:46:03.874Z" }, + { url = "https://files.pythonhosted.org/packages/c3/28/ec0fc38107fc32536908034e990c47914c57cd7c5a3ece4d8d8f7ffd7e27/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a6c9fa44005fa37a91ebfc95d081e8079757d2e904b27103f4f5fa6f0bf78c0", size = 5355404, upload-time = "2026-04-01T14:46:06.33Z" }, { url = "https://files.pythonhosted.org/packages/5e/8b/51b0eddcfa2180d60e41f06bd6d0a62202b20b59c68f5a132e615b75aecf/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25373b66e0dd5905ed63fa3cae13c82fbddf3079f2c8bf15c6fb6a35586324c1", size = 6002215, upload-time = "2026-04-01T14:46:08.83Z" }, { url = "https://files.pythonhosted.org/packages/bc/60/5382c03e1970de634027cee8e1b7d39776b778b81812aaf45b694dfe9e28/pillow-12.2.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bfa9c230d2fe991bed5318a5f119bd6780cda2915cca595393649fc118ab895e", size = 7080946, upload-time = "2026-04-01T14:46:11.734Z" }, ] @@ -2753,6 +2992,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a8/e9/59435bd04bdd46cb38c42a336b22f9843e8e586ff83c35a5423f8b14704e/protobuf-4.25.9-cp310-abi3-win32.whl", hash = "sha256:bde396f568b0b46fc8fbfe9f02facf25b6755b2578a3b8ac61e74b9d69499e03", size = 392879, upload-time = "2026-03-25T23:09:21.32Z" }, { url = "https://files.pythonhosted.org/packages/f3/16/42a5c7f1001783d2b5bfcecde10127f09010f78982c86ae409122ce3ece6/protobuf-4.25.9-cp310-abi3-win_amd64.whl", hash = "sha256:3683c05154252206f7cb2d371626514b3708199d9bcf683b503dabf3a2e38e06", size = 413900, upload-time = "2026-03-25T23:09:23.589Z" }, { url = "https://files.pythonhosted.org/packages/56/5b/0074a0a9eb01f3d1c4648ca5e81b22090c811b210b61df9018ac6d6c5cda/protobuf-4.25.9-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:9560813560e6ee72c11ca8873878bdb7ee003c96a57ebb013245fe84e2540904", size = 394826, upload-time = "2026-03-25T23:09:25.194Z" }, + { url = "https://files.pythonhosted.org/packages/54/aa/b2dba856f64c36b2a06c67be1472de98cca07a2322d0f0cbf03279a40e5b/protobuf-4.25.9-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:999146ef02e7fa6a692477badd1528bcd7268df211852a3df2d834ba2b480791", size = 294191, upload-time = "2026-03-25T23:09:26.613Z" }, { url = "https://files.pythonhosted.org/packages/a8/5c/53f18822017b8bda6bd8bb4e02048e911fdc79a3dafdc83ab994fe922a84/protobuf-4.25.9-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:438c636de8fb706a0de94a12a268ef1ae8f5ba5ae655a7671fcda5968ba3c9be", size = 295178, upload-time = "2026-03-25T23:09:27.839Z" }, { url = "https://files.pythonhosted.org/packages/16/28/d5065b212685875d3924bcdb3201cbf467cb4d58a18aa19a8dfd99ea80a9/protobuf-4.25.9-py3-none-any.whl", hash = "sha256:d49b615e7c935194ac161f0965699ac84df6112c378e05ec53da65d2e4cbb6d4", size = 156822, upload-time = "2026-03-25T23:09:34.957Z" }, ] @@ -2766,6 +3006,8 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, @@ -2815,6 +3057,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5d/a0/7d793dce3fa811fe047d6ae2431c672364b462850c6235ae306c0efd025f/pyasn1-0.6.3-py3-none-any.whl", hash = "sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde", size = 83997, upload-time = "2026-03-17T01:06:52.036Z" }, ] +[[package]] +name = "pycountry" +version = "26.2.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/de/1d/061b9e7a48b85cfd69f33c33d2ef784a531c359399ad764243399673c8f5/pycountry-26.2.16.tar.gz", hash = "sha256:5b6027d453fcd6060112b951dd010f01f168b51b4bf8a1f1fc8c95c8d94a0801", size = 7711342, upload-time = "2026-02-17T03:42:52.367Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/42/7703bd45b62fecd44cd7d3495423097e2f7d28bc2e99e7c1af68892ab157/pycountry-26.2.16-py3-none-any.whl", hash = "sha256:115c4baf7cceaa30f59a4694d79483c9167dbce7a9de4d3d571c5f3ea77c305a", size = 8044600, upload-time = "2026-02-17T03:42:49.777Z" }, +] + [[package]] name = "pycparser" version = "3.0" @@ -2850,31 +3101,70 @@ sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f wheels = [ { url = "https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0e96592440881c74a213e5ad528e2b24d3d4f940de2766bed9010ab1d9e51594", size = 2111872, upload-time = "2026-05-06T13:40:27.596Z" }, { url = "https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0d65b8c354be7fb5f720c3caa8bc940bc2d20ce749c8e06135f07f8ed95dd7c", size = 1948255, upload-time = "2026-05-06T13:39:12.574Z" }, + { url = "https://files.pythonhosted.org/packages/43/3a/41114a9f7569b84b4d84e7a018c57c56347dac30c0d4a872946ec4e36c46/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bfb192b3f4b9e8a89b6277b6ce787564f62cfd272055f6e685726b111dc7826", size = 1972827, upload-time = "2026-05-06T13:38:19.841Z" }, + { url = "https://files.pythonhosted.org/packages/ef/25/1ab42e8048fe551934d9884e8d64daa7e990ad386f310a15981aeb6a5b08/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9037063db01f09b09e237c282b6792bd4da634b5402c4e7f0c61effed7701a04", size = 2041051, upload-time = "2026-05-06T13:38:10.447Z" }, + { url = "https://files.pythonhosted.org/packages/94/c2/1a934597ddf08da410385b3b7aae91956a5a76c635effef456074fad7e88/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc010ab034c8c7452522748bf937df58020d256ccae0874463d1f4d01758af8e", size = 2221314, upload-time = "2026-05-06T13:40:13.089Z" }, + { url = "https://files.pythonhosted.org/packages/02/6d/9e8ad178c9c4df27ad3c8f25d1fe2a7ab0d2ba0559fad4aee5d3d1f16771/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5dac79fa1614d1e06ca695109c6105923bd9c7d1d6c918d4e637b7e6b32fd3", size = 2285146, upload-time = "2026-05-06T13:38:59.224Z" }, { url = "https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9fa868638bf362d3d138ea55829cefb3d5f4b0d7f142234382a15e2485dbec4", size = 2089685, upload-time = "2026-05-06T13:38:17.762Z" }, + { url = "https://files.pythonhosted.org/packages/6b/a4/b440ad35f05f6a38f89fa0f149accb3f0e02be94ca5e15f3c449a61b4bc9/pydantic_core-2.46.4-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:17299feefe090f2caa5b8e37222bb5f663e4935a8bfa6931d4102e5df1a9f398", size = 2115420, upload-time = "2026-05-06T13:37:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/99/61/de4f55db8dfd57bfdfa9a12ec90fe1b57c4f41062f7ca86f08586b3e0ac0/pydantic_core-2.46.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4c63ebc82684aa89d9a3bcbd13d515b3be44250dc68dd3bd81526c1cb31286c3", size = 2165122, upload-time = "2026-05-06T13:37:01.167Z" }, + { url = "https://files.pythonhosted.org/packages/f7/52/7c529d7bdb2d1068bd52f51fe32572c8301f9a4febf1948f10639f1436f5/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aaa2a54443eff1950ba5ddc6b6ccda0d9c84a364276a62f969bdf2a390650848", size = 2182573, upload-time = "2026-05-06T13:38:45.04Z" }, + { url = "https://files.pythonhosted.org/packages/37/b3/7c40325848ba78247f2812dcf9c7274e38cd801820ca6dd9fe63bcfb0eb4/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:18e5ceec2ab67e6d5f1a9085e5a24c9c4e2ac4545730bfe668680bca05e555f3", size = 2317139, upload-time = "2026-05-06T13:37:15.539Z" }, { url = "https://files.pythonhosted.org/packages/d9/37/f913f81a657c865b75da6c0dbed79876073c2a43b5bd9edbe8da785e4d49/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a0f62d0a58f4e7da165457e995725421e0064f2255d8eccebc49f41bbc23b109", size = 2360433, upload-time = "2026-05-06T13:37:30.099Z" }, { url = "https://files.pythonhosted.org/packages/c4/67/6acaa1be2567f9256b056d8477158cac7240813956ce86e49deae8e173b4/pydantic_core-2.46.4-cp311-cp311-win32.whl", hash = "sha256:041bde0a48fd37cf71cab1c9d56d3e8625a3793fef1f7dd232b3ff37e978ecda", size = 1985513, upload-time = "2026-05-06T13:38:15.669Z" }, { url = "https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl", hash = "sha256:6f2eeda33a839975441c86a4119e1383c50b47faf0cbb5176985565c6bb02c33", size = 2071114, upload-time = "2026-05-06T13:40:35.416Z" }, { url = "https://files.pythonhosted.org/packages/0f/da/7a263a96d965d9d0df5e8de8a475f33495451117035b09acb110288c381f/pydantic_core-2.46.4-cp311-cp311-win_arm64.whl", hash = "sha256:14f4c5d6db102bd796a627bbb3a17b4cf4574b9ae861d8b7c9a9661c6dd3362d", size = 2044298, upload-time = "2026-05-06T13:38:29.754Z" }, { url = "https://files.pythonhosted.org/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2", size = 2106158, upload-time = "2026-05-06T13:38:57.215Z" }, { url = "https://files.pythonhosted.org/packages/19/95/6195171e385007300f0f5574592e467c568becce2d937a0b6804f218bc49/pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f", size = 1951724, upload-time = "2026-05-06T13:37:02.697Z" }, + { url = "https://files.pythonhosted.org/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", size = 1975742, upload-time = "2026-05-06T13:37:09.448Z" }, + { url = "https://files.pythonhosted.org/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418, upload-time = "2026-05-06T13:37:38.234Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274, upload-time = "2026-05-06T13:38:27.753Z" }, + { url = "https://files.pythonhosted.org/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940, upload-time = "2026-05-06T13:38:05.353Z" }, { url = "https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516, upload-time = "2026-05-06T13:39:10.577Z" }, + { url = "https://files.pythonhosted.org/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854, upload-time = "2026-05-06T13:40:22.59Z" }, + { url = "https://files.pythonhosted.org/packages/24/99/fcef1b79238c06a8cbec70819ac722ba76e02bc8ada9b0fd66eba40da01b/pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b", size = 2180306, upload-time = "2026-05-06T13:40:10.666Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", size = 2190044, upload-time = "2026-05-06T13:40:43.231Z" }, + { url = "https://files.pythonhosted.org/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133, upload-time = "2026-05-06T13:39:57.365Z" }, { url = "https://files.pythonhosted.org/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464, upload-time = "2026-05-06T13:38:06.976Z" }, { url = "https://files.pythonhosted.org/packages/47/bd/6f2fc8188f31bf10590f1e98e7b306336161fac930a8c514cd7bd828c7dc/pydantic_core-2.46.4-cp312-cp312-win32.whl", hash = "sha256:9aa768456404a8bf48a4406685ac2bec8e72b62c69313734fa3b73cf33b3a894", size = 1974823, upload-time = "2026-05-06T13:40:47.985Z" }, { url = "https://files.pythonhosted.org/packages/40/8c/985c1d41ea1107c2534abd9870e4ed5c8e7669b5c308297835c001e7a1c4/pydantic_core-2.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:e9c26f834c65f5752f3f06cb08cb86a913ceb7274d0db6e267808a708b46bc89", size = 2072919, upload-time = "2026-05-06T13:39:21.153Z" }, { url = "https://files.pythonhosted.org/packages/c4/ba/f463d006e0c47373ca7ec5e1a261c59dc01ef4d62b2657af925fb0deee3a/pydantic_core-2.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:4fc73cb559bdb54b1134a706a2802a4cddd27a0633f5abb7e53056268751ac6a", size = 2027604, upload-time = "2026-05-06T13:39:03.753Z" }, { url = "https://files.pythonhosted.org/packages/ee/a4/73995fd4ebbb46ba0ee51e6fa049b8f02c40daebb762208feda8a6b7894d/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:14d4edf427bdcf950a8a02d7cb44a08614388dd6e1bdcbf4f67504fa7887da9c", size = 2111589, upload-time = "2026-05-06T13:37:10.817Z" }, { url = "https://files.pythonhosted.org/packages/fb/7f/f37d3a5e8bfcc2e403f5c57a730f2d815693fb42119e8ea48b3789335af1/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0ce40cd7b21210e99342afafbd4d0f76d784eb5b1d60f3bdc566be4983c6c73b", size = 1944552, upload-time = "2026-05-06T13:36:56.717Z" }, + { url = "https://files.pythonhosted.org/packages/15/3c/d7eb777b3ff43e8433a4efb39a17aa8fd98a4ee8561a24a67ef5db07b2d6/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90884113d8b48f760e9587002789ddd741e76ab9f89518cd1e43b1f1a52ec44b", size = 1982984, upload-time = "2026-05-06T13:39:06.207Z" }, { url = "https://files.pythonhosted.org/packages/63/87/70b9f40170a81afd55ca26c9b2acb25c20d64bcfbf888fafecb3ba077d4c/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66ce7632c22d837c95301830e111ad0128a32b8207533b60896a96c4915192ea", size = 2138417, upload-time = "2026-05-06T13:39:45.476Z" }, { url = "https://files.pythonhosted.org/packages/9d/1d/8987ad40f65ae1432753072f214fb5c74fe47ffbd0698bb9cbbb585664f8/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7", size = 2095527, upload-time = "2026-05-06T13:39:52.283Z" }, { url = "https://files.pythonhosted.org/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", size = 1936024, upload-time = "2026-05-06T13:40:15.671Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696, upload-time = "2026-05-06T13:38:34.717Z" }, { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590, upload-time = "2026-05-06T13:39:29.883Z" }, { url = "https://files.pythonhosted.org/packages/11/cb/428de0385b6c8d44b716feba566abfacfbd23ee3c4439faa789a1456242f/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0c563b08bca408dc7f65f700633d8442fffb2421fc47b8101377e9fd65051ff0", size = 2112782, upload-time = "2026-05-06T13:37:04.016Z" }, { url = "https://files.pythonhosted.org/packages/0b/b5/6a17bdadd0fc1f170adfd05a20d37c832f52b117b4d9131da1f41bb097ce/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:db06ffe51636ffe9ca531fe9023dd64bdd794be8754cb5df57c5498ae5b518a7", size = 1952146, upload-time = "2026-05-06T13:39:43.092Z" }, { url = "https://files.pythonhosted.org/packages/2a/dc/03734d80e362cd43ef65428e9de77c730ce7f2f11c60d2b1e1b39f0fbf99/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:133878133d271ade3d41d1bfb2a45ec38dbdbda40bc065921c6b04e4630127e2", size = 2134492, upload-time = "2026-05-06T13:36:58.124Z" }, + { url = "https://files.pythonhosted.org/packages/de/df/5e5ffc085ed07cc22d298134d3d911c63e91f6a0eb91fe646750a3209910/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9bc519fbf2b7578398853d815009ae5e4d4603d12f4e3f91da8c06852d3da3e9", size = 2156604, upload-time = "2026-05-06T13:37:49.88Z" }, + { url = "https://files.pythonhosted.org/packages/81/44/6e112a4253e56f5705467cbab7ab5e91ee7398ba3d56d358635958893d3e/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c7a7bd4e39e8e4c12c39cd480356842b6a8a06e41b23a55a5e3e191718838ddf", size = 2183828, upload-time = "2026-05-06T13:37:43.053Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ad/5565071e937d8e752842ac241463944c9eb14c87e2d269f2658a5bd05e98/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:d396ec2b979760aaf3218e76c24e65bd0aca24983298653b3a9d7a45f9e47b30", size = 2310000, upload-time = "2026-05-06T13:37:56.694Z" }, { url = "https://files.pythonhosted.org/packages/4f/c3/66883a5cec183e7fba4d024b4cbbe61851a63750ef606b0afecc46d1f2bf/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:86e1a4418c6cd97d60c95c71164158eaf7324fae7b0923264016baa993eba6fc", size = 2361286, upload-time = "2026-05-06T13:40:05.667Z" }, { url = "https://files.pythonhosted.org/packages/4b/2d/69abac8f838090bbecd5df894befb2c2619e7996a98ddb949db9f3b93225/pydantic_core-2.46.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:d51026d73fcfd93610abc7b27789c26b313920fcfb20e27462d74a7f8b06e983", size = 2193071, upload-time = "2026-05-06T13:38:08.682Z" }, ] +[[package]] +name = "pydantic-extra-types" +version = "2.11.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or sys_platform == 'darwin' or sys_platform == 'win32' or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, + { name = "typing-extensions", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or sys_platform == 'darwin' or sys_platform == 'win32' or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/71/dba38ee2651f84f7842206adbd2233d8bbdb59fb85e9fa14232486a8c471/pydantic_extra_types-2.11.1.tar.gz", hash = "sha256:46792d2307383859e923d8fcefa82108b1a141f8a9c0198982b3832ab5ef1049", size = 172002, upload-time = "2026-03-16T08:08:03.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/c1/3226e6d7f5a4f736f38ac11a6fbb262d701889802595cdb0f53a885ac2e0/pydantic_extra_types-2.11.1-py3-none-any.whl", hash = "sha256:1722ea2bddae5628ace25f2aa685b69978ef533123e5638cfbddb999e0100ec1", size = 79526, upload-time = "2026-03-16T08:08:02.533Z" }, +] + +[package.optional-dependencies] +pycountry = [ + { name = "pycountry", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or sys_platform == 'darwin' or sys_platform == 'win32' or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, +] + [[package]] name = "pydantic-settings" version = "2.14.2" @@ -3114,13 +3404,17 @@ sdist = { url = "https://files.pythonhosted.org/packages/5a/75/50581633d19981220 wheels = [ { url = "https://files.pythonhosted.org/packages/bd/8b/ca700d0c174c3a4eec1fbb603f04374d1fed84255c2a9f487cfaa749c865/pywavelets-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:54662cce4d56f0d6beaa6ebd34b2960f3aa4a43c83c9098a24729e9dc20a4be2", size = 4323640, upload-time = "2025-08-04T16:18:51.683Z" }, { url = "https://files.pythonhosted.org/packages/b5/f3/0fa57b6407ea9c4452b0bc182141256b9481b479ffbfc9d7fdb73afe193b/pywavelets-1.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d8ed4b4d1eab9347e8fe0c5b45008ce5a67225ce5b05766b8b1fa923a5f8b34", size = 4294938, upload-time = "2025-08-04T16:18:53.818Z" }, + { url = "https://files.pythonhosted.org/packages/ea/95/a998313c8459a57e488ff2b18e24be9e836aedda3aa3a1673197deeaa59a/pywavelets-1.9.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:862be65481fdfecfd84c6b0ca132ba571c12697a082068921bca5b5e039f1371", size = 4472829, upload-time = "2025-08-04T16:18:55.508Z" }, { url = "https://files.pythonhosted.org/packages/d8/8c/f316a153f7f89d2753df8a7371d15d0faab87e709fe02715dbc297c79385/pywavelets-1.9.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d76b7fa8fc500b09201d689b4f15bf5887e30ffbe2e1f338eb8470590eb4521a", size = 4524936, upload-time = "2025-08-04T16:18:57.146Z" }, + { url = "https://files.pythonhosted.org/packages/24/f7/89fdc1caef4b384a341a8e149253e23f36c1702bbb986a26123348624854/pywavelets-1.9.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:aa859d0b686a697c87a47e29319aebe44125f114a4f8c7e444832b921f52de5a", size = 4481475, upload-time = "2025-08-04T16:18:58.725Z" }, { url = "https://files.pythonhosted.org/packages/82/53/b733fbfb71853e4a5c430da56e325a763562d65241dd785f0fadb67aed6a/pywavelets-1.9.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20e97b84a263003e2c7348bcf72beba96edda1a6169f072dc4e4d4ee3a6c7368", size = 4527994, upload-time = "2025-08-04T16:18:59.917Z" }, { url = "https://files.pythonhosted.org/packages/ed/15/5f6a6e9fdad8341e42642ed622a5f3033da4ea9d426cc3e574ae418b4726/pywavelets-1.9.0-cp311-cp311-win32.whl", hash = "sha256:f8330cdbfa506000e63e79525716df888998a76414c5cd6ecd9a7e371191fb05", size = 4136109, upload-time = "2025-08-04T16:19:01.511Z" }, { url = "https://files.pythonhosted.org/packages/fd/33/62dbb4aea86ec9d79b283127c42cc896f4d4ff265a9aeb1337a7836dd550/pywavelets-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:ed10959a17df294ef55948dcc76367d59ec7b6aad67e38dd4e313d2fe3ad47b2", size = 4228321, upload-time = "2025-08-04T16:19:03.164Z" }, { url = "https://files.pythonhosted.org/packages/5c/37/3fda13fb2518fdd306528382d6b18c116ceafefff0a7dccd28f1034f4dd2/pywavelets-1.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30baa0788317d3c938560c83fe4fc43817342d06e6c9662a440f73ba3fb25c9b", size = 4320835, upload-time = "2025-08-04T16:19:04.855Z" }, { url = "https://files.pythonhosted.org/packages/36/65/a5549325daafc3eae4b52de076798839eaf529a07218f8fb18cccefe76a1/pywavelets-1.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:df7436a728339696a7aa955c020ae65c85b0d9d2b5ff5b4cf4551f5d4c50f2c7", size = 4290469, upload-time = "2025-08-04T16:19:06.178Z" }, + { url = "https://files.pythonhosted.org/packages/05/85/901bb756d37dfa56baa26ef4a3577aecfe9c55f50f51366fede322f8c91d/pywavelets-1.9.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:07b26526db2476974581274c43a9c2447c917418c6bd03c8d305ad2a5cd9fac3", size = 4437717, upload-time = "2025-08-04T16:19:07.514Z" }, { url = "https://files.pythonhosted.org/packages/0f/34/0f54dd9c288941294898877008bcb5c07012340cc9c5db9cff1bd185d449/pywavelets-1.9.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:573b650805d2f3c981a0e5ae95191c781a722022c37a0f6eba3fa7eae8e0ee17", size = 4483843, upload-time = "2025-08-04T16:19:08.857Z" }, + { url = "https://files.pythonhosted.org/packages/48/1f/cff6bb4ea64ff508d8cac3fe113c0aa95310a7446d9efa6829027cc2afdf/pywavelets-1.9.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3747ec804492436de6e99a7b6130480e53406d047e87dc7095ab40078a515a23", size = 4442236, upload-time = "2025-08-04T16:19:11.061Z" }, { url = "https://files.pythonhosted.org/packages/ce/53/a3846eeefe0fb7ca63ae045f038457aa274989a15af793c1b824138caf98/pywavelets-1.9.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5163665686219c3f43fd5bbfef2391e87146813961dad0f86c62d4aed561f547", size = 4488077, upload-time = "2025-08-04T16:19:12.333Z" }, { url = "https://files.pythonhosted.org/packages/f7/98/44852d2fe94455b72dece2db23562145179d63186a1c971125279a1c381f/pywavelets-1.9.0-cp312-cp312-win32.whl", hash = "sha256:80b8ab99f5326a3e724f71f23ba8b0a5b03e333fa79f66e965ea7bed21d42a2f", size = 4134094, upload-time = "2025-08-04T16:19:13.564Z" }, { url = "https://files.pythonhosted.org/packages/2c/a7/0d9ee3fe454d606e0f5c8e3aebf99d2ecddbfb681826a29397729538c8f1/pywavelets-1.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:92bfb8a117b8c8d3b72f2757a85395346fcbf37f50598880879ae72bd8e1c4b9", size = 4213900, upload-time = "2025-08-04T16:19:14.939Z" }, @@ -3155,13 +3449,19 @@ sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd77 wheels = [ { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, @@ -3178,18 +3478,28 @@ dependencies = [ sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:226b091818d461a3bef763805e75685e478ac17e9008f49fce2d3e52b3d58b86", size = 1333328, upload-time = "2025-09-08T23:07:45.946Z" }, + { url = "https://files.pythonhosted.org/packages/bd/a0/fc7e78a23748ad5443ac3275943457e8452da67fda347e05260261108cbc/pyzmq-27.1.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0790a0161c281ca9723f804871b4027f2e8b5a528d357c8952d08cd1a9c15581", size = 908803, upload-time = "2025-09-08T23:07:47.551Z" }, + { url = "https://files.pythonhosted.org/packages/7e/22/37d15eb05f3bdfa4abea6f6d96eb3bb58585fbd3e4e0ded4e743bc650c97/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c895a6f35476b0c3a54e3eb6ccf41bf3018de937016e6e18748317f25d4e925f", size = 668836, upload-time = "2025-09-08T23:07:49.436Z" }, { url = "https://files.pythonhosted.org/packages/b1/c4/2a6fe5111a01005fc7af3878259ce17684fabb8852815eda6225620f3c59/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bbf8d3630bf96550b3be8e1fc0fea5cbdc8d5466c1192887bd94869da17a63e", size = 857038, upload-time = "2025-09-08T23:07:51.234Z" }, + { url = "https://files.pythonhosted.org/packages/cb/eb/bfdcb41d0db9cd233d6fb22dc131583774135505ada800ebf14dfb0a7c40/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:15c8bd0fe0dabf808e2d7a681398c4e5ded70a551ab47482067a572c054c8e2e", size = 1657531, upload-time = "2025-09-08T23:07:52.795Z" }, + { url = "https://files.pythonhosted.org/packages/ab/21/e3180ca269ed4a0de5c34417dfe71a8ae80421198be83ee619a8a485b0c7/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bafcb3dd171b4ae9f19ee6380dfc71ce0390fefaf26b504c0e5f628d7c8c54f2", size = 2034786, upload-time = "2025-09-08T23:07:55.047Z" }, { url = "https://files.pythonhosted.org/packages/3b/b1/5e21d0b517434b7f33588ff76c177c5a167858cc38ef740608898cd329f2/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e829529fcaa09937189178115c49c504e69289abd39967cd8a4c215761373394", size = 1894220, upload-time = "2025-09-08T23:07:57.172Z" }, { url = "https://files.pythonhosted.org/packages/03/f2/44913a6ff6941905efc24a1acf3d3cb6146b636c546c7406c38c49c403d4/pyzmq-27.1.0-cp311-cp311-win32.whl", hash = "sha256:6df079c47d5902af6db298ec92151db82ecb557af663098b92f2508c398bb54f", size = 567155, upload-time = "2025-09-08T23:07:59.05Z" }, { url = "https://files.pythonhosted.org/packages/23/6d/d8d92a0eb270a925c9b4dd039c0b4dc10abc2fcbc48331788824ef113935/pyzmq-27.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:190cbf120fbc0fc4957b56866830def56628934a9d112aec0e2507aa6a032b97", size = 633428, upload-time = "2025-09-08T23:08:00.663Z" }, { url = "https://files.pythonhosted.org/packages/ae/14/01afebc96c5abbbd713ecfc7469cfb1bc801c819a74ed5c9fad9a48801cb/pyzmq-27.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:eca6b47df11a132d1745eb3b5b5e557a7dae2c303277aa0e69c6ba91b8736e07", size = 559497, upload-time = "2025-09-08T23:08:02.15Z" }, { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279, upload-time = "2025-09-08T23:08:03.807Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload-time = "2025-09-08T23:08:05.301Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload-time = "2025-09-08T23:08:06.828Z" }, { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995, upload-time = "2025-09-08T23:08:08.396Z" }, + { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070, upload-time = "2025-09-08T23:08:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121, upload-time = "2025-09-08T23:08:11.907Z" }, { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550, upload-time = "2025-09-08T23:08:13.513Z" }, { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload-time = "2025-09-08T23:08:15.163Z" }, { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload-time = "2025-09-08T23:08:17.192Z" }, { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload-time = "2025-09-08T23:08:18.926Z" }, { url = "https://files.pythonhosted.org/packages/4c/c6/c4dcdecdbaa70969ee1fdced6d7b8f60cfabe64d25361f27ac4665a70620/pyzmq-27.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:18770c8d3563715387139060d37859c02ce40718d1faf299abddcdcc6a649066", size = 836265, upload-time = "2025-09-08T23:09:49.376Z" }, + { url = "https://files.pythonhosted.org/packages/3e/79/f38c92eeaeb03a2ccc2ba9866f0439593bb08c5e3b714ac1d553e5c96e25/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:ac25465d42f92e990f8d8b0546b01c391ad431c3bf447683fdc40565941d0604", size = 800208, upload-time = "2025-09-08T23:09:51.073Z" }, + { url = "https://files.pythonhosted.org/packages/49/0e/3f0d0d335c6b3abb9b7b723776d0b21fa7f3a6c819a0db6097059aada160/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53b40f8ae006f2734ee7608d59ed661419f087521edbfc2149c3932e9c14808c", size = 567747, upload-time = "2025-09-08T23:09:52.698Z" }, { url = "https://files.pythonhosted.org/packages/a1/cf/f2b3784d536250ffd4be70e049f3b60981235d70c6e8ce7e3ef21e1adb25/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f605d884e7c8be8fe1aa94e0a783bf3f591b84c24e4bc4f3e7564c82ac25e271", size = 747371, upload-time = "2025-09-08T23:09:54.563Z" }, { url = "https://files.pythonhosted.org/packages/01/1b/5dbe84eefc86f48473947e2f41711aded97eecef1231f4558f1f02713c12/pyzmq-27.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c9f7f6e13dff2e44a6afeaf2cf54cee5929ad64afaf4d40b50f93c58fc687355", size = 544862, upload-time = "2025-09-08T23:09:56.509Z" }, ] @@ -3231,7 +3541,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c2/dc/c1f2df4027e82fc54b5a473e4b250f5139faca49a0fbe29a48668d228f34/regex-2026.5.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ccf5249114cc3e772ecdd88a98a86eca0fd74c61ce32a94743758c083fc05d48", size = 489445, upload-time = "2026-05-09T23:12:06.111Z" }, { url = "https://files.pythonhosted.org/packages/03/d2/59f01110660081cce9c0bc30ebd0b5ee250dacf658e3248ed92f01e0e8ee/regex-2026.5.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46f1326ca6e65b0879d23ca302c0f2415aad42ff0309b9c818e7949fe19a41d8", size = 291271, upload-time = "2026-05-09T23:12:07.731Z" }, { url = "https://files.pythonhosted.org/packages/58/b6/14b2c84ff90ddb370c81d27503f4a0fcf071496416f4855f6cc8c5d81c35/regex-2026.5.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef31cbfe458e21c6122ba8150ff060e0c7789ed0d26eb423f25472584920b555", size = 289212, upload-time = "2026-05-09T23:12:09.266Z" }, + { url = "https://files.pythonhosted.org/packages/03/d0/4db86529117320de0c84afd90e70bb47434625875e34fcef9d8c127c5b16/regex-2026.5.9-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:992604d02e6d9c6d786c24a706a71ecffe1020fc1ef264044474cd81fa2c3919", size = 792310, upload-time = "2026-05-09T23:12:11.416Z" }, + { url = "https://files.pythonhosted.org/packages/07/78/fe4800cd322f862ecffd2d553409b20d80650e5ed71b9d178f853d020b82/regex-2026.5.9-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c9411dd64ca95477225734a93dfc8583b51916b8d5942f99d6cac21e09965451", size = 861721, upload-time = "2026-05-09T23:12:13.681Z" }, + { url = "https://files.pythonhosted.org/packages/b5/d0/b3618a895dd8feb897c61bb2954edd265e1767d82a01d53065d5871127a3/regex-2026.5.9-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3dd4a3ff360dfb836fecdb93a4598f9d6e2ac81e3e397125145c6221bf58cf4c", size = 906460, upload-time = "2026-05-09T23:12:15.443Z" }, { url = "https://files.pythonhosted.org/packages/33/6f/1481597e859ef19508b345eec4afd1416ed6e6b459c75a64026ef193aecf/regex-2026.5.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2a661a7d270a61f7cf460caee8b9fa2d5ef9e5c681234bcb9e0fe14f488e7dfc", size = 799843, upload-time = "2026-05-09T23:12:16.892Z" }, + { url = "https://files.pythonhosted.org/packages/73/59/955734c803f59108deccba3597ae440c76b62a652733c0006e6243758420/regex-2026.5.9-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f079e50a0d3cc3cd5091fa9ff45869a2e6b2cd35895731edafb0327901a8d86d", size = 773610, upload-time = "2026-05-09T23:12:19.127Z" }, + { url = "https://files.pythonhosted.org/packages/68/8f/70c04a236d651c81881dac42ef8538bddda6121434509d0a22d9e601503b/regex-2026.5.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4ebe8f0b5ec5a5024dc4a4c59f444c4e9afc5f2abdbb8962065b75d27fb971f9", size = 781645, upload-time = "2026-05-09T23:12:20.806Z" }, + { url = "https://files.pythonhosted.org/packages/1d/96/05c7434d88185e5d27fe54aeb74df86bd77cd79f52f0b4eae54faa8fea70/regex-2026.5.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:97cf3bc1b7d7d2306772ec07366c80d9df00ff79e79cea32898883a646d2fae2", size = 854473, upload-time = "2026-05-09T23:12:22.465Z" }, + { url = "https://files.pythonhosted.org/packages/4e/c1/6e3d8202d981f3117004bf341ee74893ba4ba8a9fbaf4b94615846550a08/regex-2026.5.9-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0f9eede6a5cbdc02d4978090186390936e1776a7d1359b21e41014c609880bcf", size = 763311, upload-time = "2026-05-09T23:12:24.351Z" }, + { url = "https://files.pythonhosted.org/packages/93/c7/e7737f1526b3fb32bd4c337fd6c71c3ebb5c8296fc34d11197e0955d2e35/regex-2026.5.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:01f0f5f55f4b64dacec85dc116d3c05fd23ad3ff037bbc73a2085775953c2611", size = 844593, upload-time = "2026-05-09T23:12:26.341Z" }, { url = "https://files.pythonhosted.org/packages/a5/27/0daffb1a535bb39f422c3d200f4ab023c71110ad66a32b366bee708baba0/regex-2026.5.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1268eddd8486dc561d08eee1156e40aa3a8fe10f4bdec8fa653b455fcbffd12c", size = 789167, upload-time = "2026-05-09T23:12:27.975Z" }, { url = "https://files.pythonhosted.org/packages/ce/fc/294fe4fac4f2ed67207b17471815870c1c45b3a489e08e0ac96daea16ef6/regex-2026.5.9-cp311-cp311-win32.whl", hash = "sha256:8676474c07469d6f33dd1085ca2cd45f65785f32518f2b20e36d9953ca07f994", size = 266249, upload-time = "2026-05-09T23:12:30.141Z" }, { url = "https://files.pythonhosted.org/packages/d0/b0/8dce459f6245bcf8f6e9f23ac9569f1a0f15c131cc0745e82b43226204cf/regex-2026.5.9-cp311-cp311-win_amd64.whl", hash = "sha256:246de9d60aa3f8538b519834dd95cbf276ea263d6a7bd5a3666dc3fa0230505b", size = 278423, upload-time = "2026-05-09T23:12:31.676Z" }, @@ -3239,7 +3557,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/50/9b/6550044bc44e17c84d312c031c2ec42fbdb6a4ec4e29093be3a172d08772/regex-2026.5.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:57eeeb05db7979413dec5438f2db21d7ecbba787cde7a711df1a6f6df672aa06", size = 490451, upload-time = "2026-05-09T23:12:34.72Z" }, { url = "https://files.pythonhosted.org/packages/1e/95/fc7ba4303b5a0f92446a12ee6778ef2c6c799233f5060042a31bf390cfe9/regex-2026.5.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:398c521292f4c7fb807001dcd54694d3a1fcafc179a36ad9cc56f98df85930b6", size = 292112, upload-time = "2026-05-09T23:12:36.285Z" }, { url = "https://files.pythonhosted.org/packages/54/4b/ee27938d1b2c443e89a9a10e00d2d19aa5ee300cd3d61140644e93bb083e/regex-2026.5.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f7a7c26137296beba7784de6eba69c6a93a63ccebc385e4962fe67e267a91225", size = 289599, upload-time = "2026-05-09T23:12:38.089Z" }, + { url = "https://files.pythonhosted.org/packages/d8/dd/ba103dc19614e25f3880800ca67ce093d6e21b325d72b8383c7bf906e9fa/regex-2026.5.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6441cc660d76107934a09c22167200839a0e89604a6297f78a974e66e931d2c0", size = 796732, upload-time = "2026-05-09T23:12:40.062Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e7/f035b4fd858b050b0080bf302968dc0f59ba34e391872d54936758e6844e/regex-2026.5.9-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:91328f1c23d47595ca3ef0a7557fa129c5a23404b775c770697d2f35b33e0107", size = 865440, upload-time = "2026-05-09T23:12:42.059Z" }, + { url = "https://files.pythonhosted.org/packages/0a/51/8cd301ecc899aea28124357f729f4272f44de7806fc7ca02490bfbe253e8/regex-2026.5.9-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:93a7860539414dddaefba2b40f8771765ae17949d4c7182b876ce429e11a8309", size = 912329, upload-time = "2026-05-09T23:12:44.373Z" }, { url = "https://files.pythonhosted.org/packages/cc/1e/3fbe2fa1e8cebd62f3bb7d3321cff1640aca2e240b51d9bd624aad949260/regex-2026.5.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd2810d22146b6d838acc5ec15602cb6b47920aa4e33015df3868eedfd20bab8", size = 801239, upload-time = "2026-05-09T23:12:46.268Z" }, + { url = "https://files.pythonhosted.org/packages/17/2f/6f6008682bf2cf98040a0d3153a8e557b6ab728d7713d045cee4ce544ab8/regex-2026.5.9-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:daff2bdbaf1d23e52fdff7c0b7bc2048b68f978df6a4d107ac981f94caef2e66", size = 777054, upload-time = "2026-05-09T23:12:48.051Z" }, + { url = "https://files.pythonhosted.org/packages/19/2b/eee0d20a6842ba04df4b8847a920b57ef56853f14ef85405473e586b605a/regex-2026.5.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4eeb011098fcb77af513dcef521a3dbecbf8849b1e38940759d293b7a93f5026", size = 785098, upload-time = "2026-05-09T23:12:49.851Z" }, + { url = "https://files.pythonhosted.org/packages/4a/98/6fc1e6410feefb92159edaed5041992bfe390e8d26c721865434acbca558/regex-2026.5.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ea9c8ecfa1b73c73b626534d6626e5340d429630943672b8480724f44e84b962", size = 860095, upload-time = "2026-05-09T23:12:51.666Z" }, + { url = "https://files.pythonhosted.org/packages/18/a3/bd855e0f2cb1a978ecf6fa6bb69632dd9c3f6ea3b81cde62fde14c9daec7/regex-2026.5.9-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:cd2846168eb9ee3c513902bc8225409cb1caab31d04728b145171fa1625d9621", size = 765762, upload-time = "2026-05-09T23:12:53.413Z" }, + { url = "https://files.pythonhosted.org/packages/dc/66/0ae8c092e60b14c79d24f8e0b7f0aea5bfbffdcab00b5483d13404d3c3a5/regex-2026.5.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:39617fb0cde9c0e6306dc70e3bfc096f3da793219879f7ae7aa341a69fbdcf6d", size = 852100, upload-time = "2026-05-09T23:12:55.256Z" }, { url = "https://files.pythonhosted.org/packages/21/de/8dfde60fc1b21c946a893ba273403b72617edb261370cb1087099a83f088/regex-2026.5.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fd03c4f0e33280d15cae17159b899245d6b7c53d21def19b263b39655061f5ce", size = 789479, upload-time = "2026-05-09T23:12:57.573Z" }, { url = "https://files.pythonhosted.org/packages/c3/1c/bdcc98f9a4af4fdd166c74941174619ccff4726d3ce32faa8e9a2ecd38dd/regex-2026.5.9-cp312-cp312-win32.whl", hash = "sha256:164eba9b755ea6f244b0d881196fbc1fac09714e9782c9e2732b813142033c8e", size = 266699, upload-time = "2026-05-09T23:12:59.14Z" }, { url = "https://files.pythonhosted.org/packages/78/87/240d36864f9e48ace85f72e79ced97ceb7f27ce87739a947dcb834b4e6bc/regex-2026.5.9-cp312-cp312-win_amd64.whl", hash = "sha256:86f40a5d6444db30a125c9c9177e6b25dad981cbc37451fd838f145e6edac92e", size = 277783, upload-time = "2026-05-09T23:13:00.789Z" }, @@ -3346,21 +3672,45 @@ sdist = { url = "https://files.pythonhosted.org/packages/2e/43/25a8dcd3feedd7350 wheels = [ { url = "https://files.pythonhosted.org/packages/4f/a0/acf8b6fc20bfdcd3a45bd3f57680fb198e157b7e997b9123b10763798bd2/rpds_py-2026.5.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3397a5ed7174dc2786bb214030232fc36fe8e5584fec43a9952cc542b1a12036", size = 355609, upload-time = "2026-05-28T11:58:50.78Z" }, { url = "https://files.pythonhosted.org/packages/b6/95/f8203fd997484b1690a6869cd0e503b6c3c6be55b0ecc36d1a491fe742f0/rpds_py-2026.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:99ab6ba7bfa2cb0f96a04e3652355bf04e3f51aceb1e943b8541dab7ba4828cc", size = 348460, upload-time = "2026-05-28T11:58:52.374Z" }, + { url = "https://files.pythonhosted.org/packages/33/8c/b47326ad2f0be545a5e5c1a55937a12afaea7d392ba2837bb9680f57e6c9/rpds_py-2026.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0efbe45632665e53e3db8fe1e5692db58fc5cb9bab4459d570b83efefe11164", size = 381031, upload-time = "2026-05-28T11:58:53.775Z" }, + { url = "https://files.pythonhosted.org/packages/22/0b/e83bbd97ffac6f6389b605cd4e1c8ac5761dc7e977769c9255d8c5adb7bd/rpds_py-2026.5.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:01d17b29c0c23d82b1f4751147ec49cf451f1fc2554eb9ef5f957e55d2656ead", size = 387121, upload-time = "2026-05-28T11:58:55.243Z" }, + { url = "https://files.pythonhosted.org/packages/fd/0e/d285d1bc8864245919c61e1ca82263e4a66d337759c3a4cef72766ff9afc/rpds_py-2026.5.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7559f72b94ae52659086c595dfa017cde03155f7832071d30959049052cb3ece", size = 501026, upload-time = "2026-05-28T11:58:56.788Z" }, + { url = "https://files.pythonhosted.org/packages/86/06/ccb2109a1e543437b5e43816f2b43b9554cc6783145528a4e3711e05c011/rpds_py-2026.5.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e25b7088f9ccbfc0dfcaa52bf969300ca229e10ecf758974ebcbb080a4b37bb", size = 391865, upload-time = "2026-05-28T11:58:58.298Z" }, { url = "https://files.pythonhosted.org/packages/3d/33/237173db1cfef10105b3839a24de00eb8d2a523711add4632447cdf0aedd/rpds_py-2026.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613fc4ee9eaef26dc5840666214dd6fbcebcf32f46e76f4abc473059f4e13dda", size = 378012, upload-time = "2026-05-28T11:58:59.589Z" }, + { url = "https://files.pythonhosted.org/packages/97/64/1eae54e34d5161f9969295e80bd6b62a55f2b6ac5f2a5b60d02c2140e758/rpds_py-2026.5.1-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:85264a90ff4c05c1568dd65f5921c837614b67c60358fb4c17df3b7f2e90690a", size = 391111, upload-time = "2026-05-28T11:59:01.104Z" }, + { url = "https://files.pythonhosted.org/packages/d8/34/5bb334a5a0f65d77869217c4654f34c78a7d11b93938a3c076a2edeafc52/rpds_py-2026.5.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe71bca7d547acb17027c7fd1624ff8aae623499c498d3e7011182c4de5c25e0", size = 409225, upload-time = "2026-05-28T11:59:02.433Z" }, + { url = "https://files.pythonhosted.org/packages/16/0f/007ec21283b5b040b4ec3bd95e0402591e22bfa7d5c93dfe01c465c2d2d7/rpds_py-2026.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05fa4f41f37ec97c9c260441a940450a192f78d774d2b097eee1379f1e1246a", size = 556487, upload-time = "2026-05-28T11:59:04.012Z" }, + { url = "https://files.pythonhosted.org/packages/ff/10/5437c94508169b6b22d8418fef7a66e9ffb5f3b9e9c94460f2eedafe06ff/rpds_py-2026.5.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df1d2a1996755b24b9ecee92cb4d36c28f86f464a6a173349c26bab41e94b8c2", size = 620798, upload-time = "2026-05-28T11:59:05.485Z" }, { url = "https://files.pythonhosted.org/packages/e0/d5/9937dce4d6bda74157b954e7d1460db05a22f5929dccfeeba1ed27a93df0/rpds_py-2026.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8895840ac4809e5f60c88fd07617cd71326e73d6e5a8aa783c5c0f7c24985de2", size = 584053, upload-time = "2026-05-28T11:59:06.837Z" }, { url = "https://files.pythonhosted.org/packages/6c/31/750617dd0ae1752471bf43f9e41d263398fae7cde7849d23b8574a70e617/rpds_py-2026.5.1-cp311-cp311-win32.whl", hash = "sha256:3684a59b158a7683aaeb8e25352e9a9dd2122cec78f2d8530266e4f91b4c7b3f", size = 214390, upload-time = "2026-05-28T11:59:08.402Z" }, { url = "https://files.pythonhosted.org/packages/3c/bb/3dcab0e1d9516303f2eb672a5d6f62eca5a69e2886301e9c8c54b520c39b/rpds_py-2026.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:7bd530e6a530bb3ea892f194fafa455f3516ac25ecf7143fd33c09be62b0470a", size = 231097, upload-time = "2026-05-28T11:59:09.786Z" }, { url = "https://files.pythonhosted.org/packages/49/d6/c6bbf5cb1cf12b9732df8074b57f6ef8341ba884c95d40632ae8bddb44e4/rpds_py-2026.5.1-cp311-cp311-win_arm64.whl", hash = "sha256:0a5ae4dbe43c1076983b72616496919872ae7bbe7a1e21cc48336bc3154d130b", size = 226361, upload-time = "2026-05-28T11:59:11.079Z" }, { url = "https://files.pythonhosted.org/packages/d4/e7/a78582dc57caa592dcc7d4fb69b61390561e908eb3d2f5df5928a8e354c0/rpds_py-2026.5.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3abe24a66e57adcfa645d718063a5fa5103ecc71ddbf26d78af8f9368018ff1d", size = 353040, upload-time = "2026-05-28T11:59:12.531Z" }, { url = "https://files.pythonhosted.org/packages/a3/43/35e3f136343aef451e545ce8c38d36c2f93c0ed88703db8b64ba2b205c68/rpds_py-2026.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58b1d94308ddf0b1982f61f2eb54bf92997c9ece8a8093ef014250f4a517906c", size = 345775, upload-time = "2026-05-28T11:59:13.827Z" }, + { url = "https://files.pythonhosted.org/packages/20/e1/0f2160c5982d3157734d5cb3ed63d8b2d583a73c9864f77b666449f32cf8/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fa92420128dadce7f54bd73ba1825a273e9268fe9e35dbf7e6362890efa4e08", size = 376329, upload-time = "2026-05-28T11:59:15.271Z" }, + { url = "https://files.pythonhosted.org/packages/d0/11/ee0ba42aff83bf4effdbc576673c6be64c5e173978c3f6d537e94482f77d/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ca653c6546386227cd9800d1bef6a348099acf8db4250341da6d90f663d6dfcb", size = 383539, upload-time = "2026-05-28T11:59:16.665Z" }, + { url = "https://files.pythonhosted.org/packages/11/df/d94aa6a499d4ac40afe2d7620f2c597fd3c0f182e854ad7cf3f596a81cb6/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66c93681c4729e4e3ecba31b8179fae083ff3118841672835140338b4b9867c1", size = 494674, upload-time = "2026-05-28T11:59:17.991Z" }, + { url = "https://files.pythonhosted.org/packages/1f/75/33d30f43bb2f458de11979486a591b1bf6e5651765ed1704c6197c2dc773/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40ff257542e04796880e011e15cd4dc21c2599975df2aaa8f2c8495ca574e1a5", size = 389268, upload-time = "2026-05-28T11:59:19.434Z" }, { url = "https://files.pythonhosted.org/packages/f4/1e/2c9096fc19d5fd084b0184ca2b651e659aa0a37e6fdbecf6ece47f147fe1/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6825cc329b290e93c5f6a9be2393118a763f6ccf6abd83704e0c102ca583644", size = 376280, upload-time = "2026-05-28T11:59:21Z" }, + { url = "https://files.pythonhosted.org/packages/b9/e5/61ec9f8be8211ea7f48448195549e4aaf02004083475493b0e137702ecb2/rpds_py-2026.5.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:de42116e69cb53b911cc34aee5ab98f36c597b822545045d49e938818b99e5e4", size = 387233, upload-time = "2026-05-28T11:59:22.454Z" }, + { url = "https://files.pythonhosted.org/packages/0d/ca/bcec1005c4f4a234f92a29078631fee49206c7265ccae966f18fd332e80e/rpds_py-2026.5.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0f920015df2a504bebaba6d4c31ccf3fcf942f92655c086da30b671aad19aa6", size = 405009, upload-time = "2026-05-28T11:59:23.845Z" }, + { url = "https://files.pythonhosted.org/packages/72/e6/4d5718c5cf26c522dc7c9999e238da1e77380b81d0c5d1df11e271ddfeb1/rpds_py-2026.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0408a24e44feb919423dc6d9da677cb5cddb894d2ca9e763967d156d9c60fab4", size = 553113, upload-time = "2026-05-28T11:59:25.184Z" }, + { url = "https://files.pythonhosted.org/packages/d4/25/2ee807bdb3e1f0b7eddf7782acd5665a8b5205a331a7d7244a52c4812fd9/rpds_py-2026.5.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cea68bcd53467561ae2f96a6bdad1544299ba97b5b0ddcd5ac3d376e5c781c24", size = 618838, upload-time = "2026-05-28T11:59:26.749Z" }, { url = "https://files.pythonhosted.org/packages/6a/c1/7d4c26f167f8c41501cc073d30ee22082b16ce358cf5b00ec97cbc7804ea/rpds_py-2026.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4be8b1d2a705cc37d08256004e1d07de143fa0075c8e85a3df020b776f62b732", size = 582436, upload-time = "2026-05-28T11:59:28.11Z" }, { url = "https://files.pythonhosted.org/packages/04/1d/9d12b0a337bab46f4769f8857f4007e3b2d639e14f9a44a0efe157696e64/rpds_py-2026.5.1-cp312-cp312-win32.whl", hash = "sha256:6736718bd4fc49cbcb538ba30516fdbef161522acefb739657d48b97bd864fed", size = 212734, upload-time = "2026-05-28T11:59:29.689Z" }, { url = "https://files.pythonhosted.org/packages/c5/93/e4116f2de7f56bc7406a76033dc501811ddeb22b7f056b92d632871ebb0c/rpds_py-2026.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:0a7d1eec967df0e9b22614a5e177622e0c89611d03727fa0cb48e45028907870", size = 229045, upload-time = "2026-05-28T11:59:31.033Z" }, { url = "https://files.pythonhosted.org/packages/cb/53/6c3419d85eb2ec5938a37627c585b42d76a63bb731d6e42ed4b079ebf486/rpds_py-2026.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:1841d067089e117142d79b98aa0df2f08b52f2ecc1819dd2700636c0db74a473", size = 223967, upload-time = "2026-05-28T11:59:32.318Z" }, { url = "https://files.pythonhosted.org/packages/42/56/3fe0fb34820ff667be791b3a3c22b85e8bcba54e9c832f47438c191fa7be/rpds_py-2026.5.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:edf2765d84e42447f112ad877af8fe1db0089aaec5b28e88d6eab45e7fe99cea", size = 357151, upload-time = "2026-05-28T12:01:53.43Z" }, { url = "https://files.pythonhosted.org/packages/8b/f2/3eb9ccdb9f143b8c9b003978898cb497f942a324c077401e6b8834238e63/rpds_py-2026.5.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ad3773236e95f7f33991eb125224b7da66f206504d032a253a02da7e134519fb", size = 350195, upload-time = "2026-05-28T12:01:54.901Z" }, + { url = "https://files.pythonhosted.org/packages/a7/24/dbda232bc4f3ed732120692ab0d2c8402cb020516556d8bee622dcef2413/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a04df86b3f0fade39ec8fd0e0aab089b1da9fbd2b48df778a57ef96f5e7d38df", size = 381850, upload-time = "2026-05-28T12:01:56.601Z" }, + { url = "https://files.pythonhosted.org/packages/40/30/32e769839a358f78810c234f160f2cc21d1e4e47e1c0e0e0d535be5a0219/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6142dbd80c4df62a5d899f0d616d417f84e0bc8d32526c8e5589019d75d028a7", size = 387899, upload-time = "2026-05-28T12:01:58.212Z" }, + { url = "https://files.pythonhosted.org/packages/ab/86/ec84d243aadb3b34b71dd26a010d0930b2d284ff5fc9a69fec53810ee6fd/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b35217adefe87f2fe4db7e9766cabe84744bfe9616d9667be18988928c7f2dc", size = 501618, upload-time = "2026-05-28T12:01:59.888Z" }, + { url = "https://files.pythonhosted.org/packages/74/25/b60e52686bbff777a64f9e4f4d3dd57980dc846913777177a2c92e4937aa/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b95d5e11fc712b752081183a55a244c03cd00570489edd7014d8899f8ceb8162", size = 394003, upload-time = "2026-05-28T12:02:01.482Z" }, { url = "https://files.pythonhosted.org/packages/9b/c7/b3a6a588cc2219510ef3f42e207483a93950bedd1e3a0fd4015c95cff9e5/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:141c9498daf2ace9eda35d2b0e376f9ea8b058d84f2aef4f96fccfd449a2f251", size = 379778, upload-time = "2026-05-28T12:02:03.197Z" }, + { url = "https://files.pythonhosted.org/packages/31/00/c7dba3fc8a3da8cb3f6db1eb3386be4d79c2e97c6890d20eb9ac66ae8c43/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:6f249f8b860a200ad35193af961183ebe9132710484e6f6ce0cf89fd83c63a9a", size = 392359, upload-time = "2026-05-28T12:02:04.817Z" }, + { url = "https://files.pythonhosted.org/packages/93/dd/472ba494c70753f93745992c99855bee0636daf74e6984e5e003f150316f/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e4abbf391a70be864920858bf360f4fb380577c9a0f732438a1996726e2c195b", size = 412820, upload-time = "2026-05-28T12:02:06.401Z" }, + { url = "https://files.pythonhosted.org/packages/1d/6f/93831a3bfe789542ed0c1d0d74b78b440f055d6dc3ea4640eba2d95e6e23/rpds_py-2026.5.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:c74005a7bb87752acf351c93897ec63ad77a07a0da7ecad9c050e32e7286ba34", size = 557243, upload-time = "2026-05-28T12:02:08.013Z" }, + { url = "https://files.pythonhosted.org/packages/1f/ff/0b3d604614ffc77522c6b288fdbce68957eb583da1002aa65ba38ac0ee40/rpds_py-2026.5.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:8213afbe8a3a906fb9acb2014423fe3359ee783d0bf90995f70623a3217bfa6c", size = 623541, upload-time = "2026-05-28T12:02:09.661Z" }, { url = "https://files.pythonhosted.org/packages/ea/ea/e7b0251441da9adfeaebcf29601d10f2a1455fcf0772fae9e7e19032bd96/rpds_py-2026.5.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:8c43a8a973270fd173bf48cdf80bbe66312421cba68d40845034f174f2389049", size = 586326, upload-time = "2026-05-28T12:02:11.47Z" }, ] @@ -3382,9 +3732,19 @@ version = "0.11.13" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/ed/da/9c6f995903b4d9474b39da91d2d626659af3ff1eeb43e9ae7c119349dba6/ruff-0.11.13.tar.gz", hash = "sha256:26fa247dc68d1d4e72c179e08889a25ac0c7ba4d78aecfc835d49cbfd60bf514", size = 4282054, upload-time = "2025-06-05T21:00:15.721Z" } wheels = [ + { url = "https://files.pythonhosted.org/packages/7d/ce/a11d381192966e0b4290842cc8d4fac7dc9214ddf627c11c1afff87da29b/ruff-0.11.13-py3-none-linux_armv6l.whl", hash = "sha256:4bdfbf1240533f40042ec00c9e09a3aade6f8c10b6414cf11b519488d2635d46", size = 10292516, upload-time = "2025-06-05T20:59:32.944Z" }, { url = "https://files.pythonhosted.org/packages/78/db/87c3b59b0d4e753e40b6a3b4a2642dfd1dcaefbff121ddc64d6c8b47ba00/ruff-0.11.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:aef9c9ed1b5ca28bb15c7eac83b8670cf3b20b478195bd49c8d756ba0a36cf48", size = 11106083, upload-time = "2025-06-05T20:59:37.03Z" }, { url = "https://files.pythonhosted.org/packages/77/79/d8cec175856ff810a19825d09ce700265f905c643c69f45d2b737e4a470a/ruff-0.11.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:53b15a9dfdce029c842e9a5aebc3855e9ab7771395979ff85b7c1dedb53ddc2b", size = 10436024, upload-time = "2025-06-05T20:59:39.741Z" }, + { url = "https://files.pythonhosted.org/packages/8b/5b/f6d94f2980fa1ee854b41568368a2e1252681b9238ab2895e133d303538f/ruff-0.11.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab153241400789138d13f362c43f7edecc0edfffce2afa6a68434000ecd8f69a", size = 10646324, upload-time = "2025-06-05T20:59:42.185Z" }, + { url = "https://files.pythonhosted.org/packages/6c/9c/b4c2acf24ea4426016d511dfdc787f4ce1ceb835f3c5fbdbcb32b1c63bda/ruff-0.11.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c51f93029d54a910d3d24f7dd0bb909e31b6cd989a5e4ac513f4eb41629f0dc", size = 10174416, upload-time = "2025-06-05T20:59:44.319Z" }, + { url = "https://files.pythonhosted.org/packages/f3/10/e2e62f77c65ede8cd032c2ca39c41f48feabedb6e282bfd6073d81bb671d/ruff-0.11.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1808b3ed53e1a777c2ef733aca9051dc9bf7c99b26ece15cb59a0320fbdbd629", size = 11724197, upload-time = "2025-06-05T20:59:46.935Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f0/466fe8469b85c561e081d798c45f8a1d21e0b4a5ef795a1d7f1a9a9ec182/ruff-0.11.13-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d28ce58b5ecf0f43c1b71edffabe6ed7f245d5336b17805803312ec9bc665933", size = 12511615, upload-time = "2025-06-05T20:59:49.534Z" }, + { url = "https://files.pythonhosted.org/packages/17/0e/cefe778b46dbd0cbcb03a839946c8f80a06f7968eb298aa4d1a4293f3448/ruff-0.11.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55e4bc3a77842da33c16d55b32c6cac1ec5fb0fbec9c8c513bdce76c4f922165", size = 12117080, upload-time = "2025-06-05T20:59:51.654Z" }, + { url = "https://files.pythonhosted.org/packages/5d/2c/caaeda564cbe103bed145ea557cb86795b18651b0f6b3ff6a10e84e5a33f/ruff-0.11.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:633bf2c6f35678c56ec73189ba6fa19ff1c5e4807a78bf60ef487b9dd272cc71", size = 11326315, upload-time = "2025-06-05T20:59:54.469Z" }, { url = "https://files.pythonhosted.org/packages/75/f0/782e7d681d660eda8c536962920c41309e6dd4ebcea9a2714ed5127d44bd/ruff-0.11.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ffbc82d70424b275b089166310448051afdc6e914fdab90e08df66c43bb5ca9", size = 11555640, upload-time = "2025-06-05T20:59:56.986Z" }, + { url = "https://files.pythonhosted.org/packages/5d/d4/3d580c616316c7f07fb3c99dbecfe01fbaea7b6fd9a82b801e72e5de742a/ruff-0.11.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4a9ddd3ec62a9a89578c85842b836e4ac832d4a2e0bfaad3b02243f930ceafcc", size = 10507364, upload-time = "2025-06-05T20:59:59.154Z" }, + { url = "https://files.pythonhosted.org/packages/5a/dc/195e6f17d7b3ea6b12dc4f3e9de575db7983db187c378d44606e5d503319/ruff-0.11.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d237a496e0778d719efb05058c64d28b757c77824e04ffe8796c7436e26712b7", size = 10141462, upload-time = "2025-06-05T21:00:01.481Z" }, + { url = "https://files.pythonhosted.org/packages/f4/8e/39a094af6967faa57ecdeacb91bedfb232474ff8c3d20f16a5514e6b3534/ruff-0.11.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:26816a218ca6ef02142343fd24c70f7cd8c5aa6c203bca284407adf675984432", size = 11121028, upload-time = "2025-06-05T21:00:04.06Z" }, { url = "https://files.pythonhosted.org/packages/5a/c0/b0b508193b0e8a1654ec683ebab18d309861f8bd64e3a2f9648b80d392cb/ruff-0.11.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:51c3f95abd9331dc5b87c47ac7f376db5616041173826dfd556cfe3d4977f492", size = 11602992, upload-time = "2025-06-05T21:00:06.249Z" }, { url = "https://files.pythonhosted.org/packages/7c/91/263e33ab93ab09ca06ce4f8f8547a858cc198072f873ebc9be7466790bae/ruff-0.11.13-py3-none-win32.whl", hash = "sha256:96c27935418e4e8e77a26bb05962817f28b8ef3843a6c6cc49d8783b5507f250", size = 10474944, upload-time = "2025-06-05T21:00:08.459Z" }, { url = "https://files.pythonhosted.org/packages/46/f4/7c27734ac2073aae8efb0119cae6931b6fb48017adf048fdf85c19337afc/ruff-0.11.13-py3-none-win_amd64.whl", hash = "sha256:29c3189895a8a6a657b7af4e97d330c8a3afd2c9c8f46c81e2fc5a31866517e3", size = 11548669, upload-time = "2025-06-05T21:00:11.147Z" }, @@ -3415,7 +3775,16 @@ sdist = { url = "https://files.pythonhosted.org/packages/45/06/f955dbbb1859e3bd2 wheels = [ { url = "https://files.pythonhosted.org/packages/39/a0/f718cda65b05407d228f97602cf60dca269c979867aa5beb25410de26cd3/safetensors-0.8.0-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c554f85858e05226d3c2828e32395e677434685d6d94594a41643361c5e837f0", size = 473568, upload-time = "2026-06-09T07:52:18.829Z" }, { url = "https://files.pythonhosted.org/packages/f5/b1/fa7c600e7dceae12e9606c7578cbc9ff1e1ed55844883ee5c92205e86226/safetensors-0.8.0-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:c80201d22cbf405b80647a60ada77bba06c8fba2da2743ba1e89cdcc39a81f25", size = 484562, upload-time = "2026-06-09T07:52:17.518Z" }, + { url = "https://files.pythonhosted.org/packages/09/7d/65a7de0af421317bb36a067241e4235fff194eed60b961ed6d3f59a3fc60/safetensors-0.8.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a46e5ff292c356d6991e60942ba7f79817682d3a2cef0702136448cb9c4d235", size = 502844, upload-time = "2026-06-09T07:52:07.624Z" }, + { url = "https://files.pythonhosted.org/packages/91/4f/3175c9d75634e0e0dda0082794193521035edd7c70a6f212bf33ca06ddf4/safetensors-0.8.0-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4124502b78f03534117c848f87a39b8f31e577b15eff423bf8bfb95f2a8c30d0", size = 511823, upload-time = "2026-06-09T07:52:09.565Z" }, + { url = "https://files.pythonhosted.org/packages/20/87/846c289e7aa2299eff406335717cf43ce8777194ece8aad75772e0411615/safetensors-0.8.0-cp310-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bc0a787ba8a35be368ee3574edfa2b1ad389eebd0a72e482ae275490e3f6c98", size = 633461, upload-time = "2026-06-09T07:52:11.128Z" }, + { url = "https://files.pythonhosted.org/packages/76/22/8d64d9df2c45d5ded401df889d0ad90882804ca172d79ec4f0df8f727fe0/safetensors-0.8.0-cp310-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040070828e36dc8e122178bbbd5830ff9e97920affb84cbe0f46442497bed358", size = 545148, upload-time = "2026-06-09T07:52:13.603Z" }, { url = "https://files.pythonhosted.org/packages/28/50/f203ff3a3ddfe19308efc83c5a3a29ed02bf786732ec35e68bf9162f3365/safetensors-0.8.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd6f3f93c9a0a7cc2788ee63fb763353d4bd2e89b0751bc78fcf7dda00bea774", size = 516040, upload-time = "2026-06-09T07:52:16.29Z" }, + { url = "https://files.pythonhosted.org/packages/46/fb/cdaed17ceb2948784fd9c36b6fd3e951b608547cea81a48e8ee6f8cfdfcb/safetensors-0.8.0-cp310-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:fcdd41ec4628fee5799f807c73c353629130fbd942aa23d83c623dd6c9d52d78", size = 513832, upload-time = "2026-06-09T07:52:12.37Z" }, + { url = "https://files.pythonhosted.org/packages/0d/49/1e15de264dcc3b77943d2d0c56a95809956883b1c2d6d585c792523f180b/safetensors-0.8.0-cp310-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e9f537aa183a38ace122d27303dcd986b26bd2a7591f9181d7f0c396f4677ca", size = 559930, upload-time = "2026-06-09T07:52:14.743Z" }, + { url = "https://files.pythonhosted.org/packages/2a/43/bf38443278eab4b1be1fce2931e2b012ad9cb7df52ada751d0aab8f7659a/safetensors-0.8.0-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:87eec7ffed2b809f05a398a8becb7d013f19f7837cd15d9748580d6cf30dbaf4", size = 678670, upload-time = "2026-06-09T07:52:20.032Z" }, + { url = "https://files.pythonhosted.org/packages/72/e3/68cd3fa5b48488e84add63e04cb12f3bc28ae4638c06d4508c6e88823d0e/safetensors-0.8.0-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:4a95ae2b05d7726d751da4ebf626a2ca782b706e101bd894c95bc2450b1cffcc", size = 786679, upload-time = "2026-06-09T07:52:21.322Z" }, + { url = "https://files.pythonhosted.org/packages/29/4b/1c19c509d56e01f4fbb3d0a2e597450f6cc04d1d56cf52defb0a62dfd715/safetensors-0.8.0-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:3ae091f16662658bdc019a4ff6cb4c085bb7d725eb5978b183ffd265863b6d2d", size = 765683, upload-time = "2026-06-09T07:52:22.594Z" }, { url = "https://files.pythonhosted.org/packages/27/43/41c1621732edd934d868a00d1b891584c892a7b62a9aab82ea5a0a5623ee/safetensors-0.8.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8e080062fcde23be189565e1c3305d16751a218ecf9412c8601e64204eb6f846", size = 722361, upload-time = "2026-06-09T07:52:23.924Z" }, { url = "https://files.pythonhosted.org/packages/8e/3f/73ccf82579412b4a71c4ca673f10b5f1f888d7cf5af7fe24f27d30307be4/safetensors-0.8.0-cp310-abi3-win32.whl", hash = "sha256:2ddf52eac562eda224f99acfa7889d02968c1fd59a5b011ae7d8137c37e9c02d", size = 342401, upload-time = "2026-06-09T07:52:28.895Z" }, { url = "https://files.pythonhosted.org/packages/1b/6d/3fba214c1e5e0f69991677ec3bc17023f0421776975e1de0c682dca475e2/safetensors-0.8.0-cp310-abi3-win_amd64.whl", hash = "sha256:096ec1a98435df7beb08853bb5aa9081a84f23d0adc67ed1a0a10550f608373f", size = 355540, upload-time = "2026-06-09T07:52:27.832Z" }, @@ -3435,7 +3804,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e18f12c6b0bc5a592ed23d3f7b891f68fd7f8241d69b7883769eb5d5dfb52696", size = 28162057, upload-time = "2026-02-23T00:16:09.456Z" }, { url = "https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a3472cfbca0a54177d0faa68f697d8ba4c80bbdc19908c3465556d9f7efce9ee", size = 20334032, upload-time = "2026-02-23T00:16:17.358Z" }, { url = "https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:766e0dc5a616d026a3a1cffa379af959671729083882f50307e18175797b3dfd", size = 22709533, upload-time = "2026-02-23T00:16:25.791Z" }, + { url = "https://files.pythonhosted.org/packages/4d/60/8804678875fc59362b0fb759ab3ecce1f09c10a735680318ac30da8cd76b/scipy-1.17.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:744b2bf3640d907b79f3fd7874efe432d1cf171ee721243e350f55234b4cec4c", size = 33062057, upload-time = "2026-02-23T00:16:36.931Z" }, { url = "https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43af8d1f3bea642559019edfe64e9b11192a8978efbd1539d7bc2aaa23d92de4", size = 35349300, upload-time = "2026-02-23T00:16:49.108Z" }, + { url = "https://files.pythonhosted.org/packages/b4/3d/7ccbbdcbb54c8fdc20d3b6930137c782a163fa626f0aef920349873421ba/scipy-1.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd96a1898c0a47be4520327e01f874acfd61fb48a9420f8aa9f6483412ffa444", size = 35127333, upload-time = "2026-02-23T00:17:01.293Z" }, { url = "https://files.pythonhosted.org/packages/e8/19/f926cb11c42b15ba08e3a71e376d816ac08614f769b4f47e06c3580c836a/scipy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4eb6c25dd62ee8d5edf68a8e1c171dd71c292fdae95d8aeb3dd7d7de4c364082", size = 37741314, upload-time = "2026-02-23T00:17:12.576Z" }, { url = "https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:d30e57c72013c2a4fe441c2fcb8e77b14e152ad48b5464858e07e2ad9fbfceff", size = 36607512, upload-time = "2026-02-23T00:17:23.424Z" }, { url = "https://files.pythonhosted.org/packages/68/7f/bdd79ceaad24b671543ffe0ef61ed8e659440eb683b66f033454dcee90eb/scipy-1.17.1-cp311-cp311-win_arm64.whl", hash = "sha256:9ecb4efb1cd6e8c4afea0daa91a87fbddbce1b99d2895d151596716c0b2e859d", size = 24599248, upload-time = "2026-02-23T00:17:34.561Z" }, @@ -3443,7 +3814,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/02/cf107b01494c19dc100f1d0b7ac3cc08666e96ba2d64db7626066cee895e/scipy-1.17.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:fcb310ddb270a06114bb64bbe53c94926b943f5b7f0842194d585c65eb4edd76", size = 28172662, upload-time = "2026-02-23T00:18:01.64Z" }, { url = "https://files.pythonhosted.org/packages/cf/a9/599c28631bad314d219cf9ffd40e985b24d603fc8a2f4ccc5ae8419a535b/scipy-1.17.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:cc90d2e9c7e5c7f1a482c9875007c095c3194b1cfedca3c2f3291cdc2bc7c086", size = 20344366, upload-time = "2026-02-23T00:18:12.015Z" }, { url = "https://files.pythonhosted.org/packages/35/f5/906eda513271c8deb5af284e5ef0206d17a96239af79f9fa0aebfe0e36b4/scipy-1.17.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:c80be5ede8f3f8eded4eff73cc99a25c388ce98e555b17d31da05287015ffa5b", size = 22704017, upload-time = "2026-02-23T00:18:21.502Z" }, + { url = "https://files.pythonhosted.org/packages/da/34/16f10e3042d2f1d6b66e0428308ab52224b6a23049cb2f5c1756f713815f/scipy-1.17.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e19ebea31758fac5893a2ac360fedd00116cbb7628e650842a6691ba7ca28a21", size = 32927842, upload-time = "2026-02-23T00:18:35.367Z" }, { url = "https://files.pythonhosted.org/packages/01/8e/1e35281b8ab6d5d72ebe9911edcdffa3f36b04ed9d51dec6dd140396e220/scipy-1.17.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02ae3b274fde71c5e92ac4d54bc06c42d80e399fec704383dcd99b301df37458", size = 35235890, upload-time = "2026-02-23T00:18:49.188Z" }, + { url = "https://files.pythonhosted.org/packages/c5/5c/9d7f4c88bea6e0d5a4f1bc0506a53a00e9fcb198de372bfe4d3652cef482/scipy-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a604bae87c6195d8b1045eddece0514d041604b14f2727bbc2b3020172045eb", size = 35003557, upload-time = "2026-02-23T00:18:54.74Z" }, { url = "https://files.pythonhosted.org/packages/65/94/7698add8f276dbab7a9de9fb6b0e02fc13ee61d51c7c3f85ac28b65e1239/scipy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f590cd684941912d10becc07325a3eeb77886fe981415660d9265c4c418d0bea", size = 37625856, upload-time = "2026-02-23T00:19:00.307Z" }, { url = "https://files.pythonhosted.org/packages/a2/84/dc08d77fbf3d87d3ee27f6a0c6dcce1de5829a64f2eae85a0ecc1f0daa73/scipy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:41b71f4a3a4cab9d366cd9065b288efc4d4f3c0b37a91a8e0947fb5bd7f31d87", size = 36549682, upload-time = "2026-02-23T00:19:07.67Z" }, { url = "https://files.pythonhosted.org/packages/bc/98/fe9ae9ffb3b54b62559f52dedaebe204b408db8109a8c66fdd04869e6424/scipy-1.17.1-cp312-cp312-win_arm64.whl", hash = "sha256:f4115102802df98b2b0db3cce5cb9b92572633a1197c77b7553e5203f284a5b3", size = 24547340, upload-time = "2026-02-23T00:19:12.024Z" }, @@ -3489,12 +3862,16 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/32/43/8f8885168a47a02eba1455bd3f4f169f50ad5b8cebd2402d0f5e20854d04/sentencepiece-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:17982700c4f6dbb55fa3594f3d7e5dd1c8659a274af3738e33c987d2a27c9d5c", size = 2409036, upload-time = "2024-02-19T17:05:58.021Z" }, { url = "https://files.pythonhosted.org/packages/0f/35/e63ba28062af0a3d688a9f128e407a1a2608544b2f480cb49bf7f4b1cbb9/sentencepiece-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7c867012c0e8bcd5bdad0f791609101cb5c66acb303ab3270218d6debc68a65e", size = 1238921, upload-time = "2024-02-19T17:06:06.434Z" }, { url = "https://files.pythonhosted.org/packages/de/42/ae30952c4a0bd773e90c9bf2579f5533037c886dfc8ec68133d5694f4dd2/sentencepiece-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7fd6071249c74f779c5b27183295b9202f8dedb68034e716784364443879eaa6", size = 1181477, upload-time = "2024-02-19T17:06:09.292Z" }, + { url = "https://files.pythonhosted.org/packages/e3/ac/2f2ab1d60bb2d795d054eebe5e3f24b164bc21b5a9b75fba7968b3b91b5a/sentencepiece-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27f90c55a65013cbb8f4d7aab0599bf925cde4adc67ae43a0d323677b5a1c6cb", size = 1259182, upload-time = "2024-02-19T17:06:16.459Z" }, + { url = "https://files.pythonhosted.org/packages/45/fb/14633c6ecf262c468759ffcdb55c3a7ee38fe4eda6a70d75ee7c7d63c58b/sentencepiece-0.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b293734059ef656dcd65be62ff771507bea8fed0a711b6733976e1ed3add4553", size = 1355537, upload-time = "2024-02-19T17:06:19.274Z" }, { url = "https://files.pythonhosted.org/packages/fb/12/2f5c8d4764b00033cf1c935b702d3bb878d10be9f0b87f0253495832d85f/sentencepiece-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e58b47f933aca74c6a60a79dcb21d5b9e47416256c795c2d58d55cec27f9551d", size = 1301464, upload-time = "2024-02-19T17:06:21.796Z" }, { url = "https://files.pythonhosted.org/packages/4e/b1/67afc0bde24f6dcb3acdea0dd8dcdf4b8b0db240f6bacd39378bd32d09f8/sentencepiece-0.2.0-cp311-cp311-win32.whl", hash = "sha256:c581258cf346b327c62c4f1cebd32691826306f6a41d8c4bec43b010dee08e75", size = 936749, upload-time = "2024-02-19T17:06:24.167Z" }, { url = "https://files.pythonhosted.org/packages/a2/f6/587c62fd21fc988555b85351f50bbde43a51524caafd63bc69240ded14fd/sentencepiece-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:0993dbc665f4113017892f1b87c3904a44d0640eda510abcacdfb07f74286d36", size = 991520, upload-time = "2024-02-19T17:06:26.936Z" }, { url = "https://files.pythonhosted.org/packages/27/5a/141b227ed54293360a9ffbb7bf8252b4e5efc0400cdeac5809340e5d2b21/sentencepiece-0.2.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ea5f536e32ea8ec96086ee00d7a4a131ce583a1b18d130711707c10e69601cb2", size = 2409370, upload-time = "2024-02-19T17:06:29.315Z" }, { url = "https://files.pythonhosted.org/packages/2e/08/a4c135ad6fc2ce26798d14ab72790d66e813efc9589fd30a5316a88ca8d5/sentencepiece-0.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d0cb51f53b6aae3c36bafe41e86167c71af8370a039f542c43b0cce5ef24a68c", size = 1239288, upload-time = "2024-02-19T17:06:31.674Z" }, { url = "https://files.pythonhosted.org/packages/49/0a/2fe387f825ac5aad5a0bfe221904882106cac58e1b693ba7818785a882b6/sentencepiece-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3212121805afc58d8b00ab4e7dd1f8f76c203ddb9dc94aa4079618a31cf5da0f", size = 1181597, upload-time = "2024-02-19T17:06:33.763Z" }, + { url = "https://files.pythonhosted.org/packages/cc/38/e4698ee2293fe4835dc033c49796a39b3eebd8752098f6bd0aa53a14af1f/sentencepiece-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a3149e3066c2a75e0d68a43eb632d7ae728c7925b517f4c05c40f6f7280ce08", size = 1259220, upload-time = "2024-02-19T17:06:35.85Z" }, + { url = "https://files.pythonhosted.org/packages/12/24/fd7ef967c9dad2f6e6e5386d0cadaf65cda8b7be6e3861a9ab3121035139/sentencepiece-0.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:632f3594d3e7ac8b367bca204cb3fd05a01d5b21455acd097ea4c0e30e2f63d7", size = 1355962, upload-time = "2024-02-19T17:06:38.616Z" }, { url = "https://files.pythonhosted.org/packages/4f/d2/18246f43ca730bb81918f87b7e886531eda32d835811ad9f4657c54eee35/sentencepiece-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f295105c6bdbb05bd5e1b0cafbd78ff95036f5d3641e7949455a3f4e5e7c3109", size = 1301706, upload-time = "2024-02-19T17:06:40.712Z" }, { url = "https://files.pythonhosted.org/packages/8a/47/ca237b562f420044ab56ddb4c278672f7e8c866e183730a20e413b38a989/sentencepiece-0.2.0-cp312-cp312-win32.whl", hash = "sha256:fb89f811e5efd18bab141afc3fea3de141c3f69f3fe9e898f710ae7fe3aab251", size = 936941, upload-time = "2024-02-19T17:06:42.802Z" }, { url = "https://files.pythonhosted.org/packages/c6/97/d159c32642306ee2b70732077632895438867b3b6df282354bd550cf2a67/sentencepiece-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7a673a72aab81fef5ebe755c6e0cc60087d1f3a4700835d40537183c1703a45f", size = 991994, upload-time = "2024-02-19T17:06:45.01Z" }, @@ -3652,6 +4029,32 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", size = 14154, upload-time = "2024-03-12T14:34:36.569Z" }, ] +[[package]] +name = "tiktoken" +version = "0.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "regex", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or sys_platform == 'darwin' or sys_platform == 'win32' or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, + { name = "requests", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or sys_platform == 'darwin' or sys_platform == 'win32' or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/e5/5f3cb2159769d0f4324c0e9e87f9de3c4b1cd45848a96b2eb3566ad5ca77/tiktoken-0.13.0.tar.gz", hash = "sha256:c9435714c3a84c2319499de9a300c0e604449dd0799ff246458b3bb6a7f433c1", size = 38986, upload-time = "2026-05-15T04:51:27.153Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/4c/1bc81f4cd53e827c4ee67ca951b5935724716049452d8dfa09b8b82372bb/tiktoken-0.13.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7bfe1849caa65d1e1d9871817170ec497bbb7984e182012e1bdce72f66608cdb", size = 1036353, upload-time = "2026-05-15T04:50:21.757Z" }, + { url = "https://files.pythonhosted.org/packages/75/91/10b9c7076bc02c246c853201fdbbe300a4b8c5ed7b84c25f7403f4e32655/tiktoken-0.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:91c180fe255bd5a86d8316210d2833a1d4d33d026cd86a67812f4773743c8d26", size = 984644, upload-time = "2026-05-15T04:50:23.256Z" }, + { url = "https://files.pythonhosted.org/packages/4e/e4/fceae98015fab47fcd49b8bd7f46145bcd187a47e0add1e5378ed67ef980/tiktoken-0.13.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:059c8ecf554eb5b41e6e054ba467b871b03277d267dee7244380aca4359747d4", size = 1119261, upload-time = "2026-05-15T04:50:24.348Z" }, + { url = "https://files.pythonhosted.org/packages/f9/39/fe42ad00de01a8c4a49ad8649a2c8a316835a9cad5961b11d21eac0020a5/tiktoken-0.13.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:36217497eaffc158607a3b26f065300db2aefd43b115263f3b9688ce38146173", size = 1138253, upload-time = "2026-05-15T04:50:25.505Z" }, + { url = "https://files.pythonhosted.org/packages/03/c4/ccee1ecccca107e9a16efcecdeeb964c325305038554d466ece65b42338f/tiktoken-0.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:303f7d91b4fce3baddbcde05c139091d4caa5026ac7214c1dc7ff7a71ee429ff", size = 1185747, upload-time = "2026-05-15T04:50:27.02Z" }, + { url = "https://files.pythonhosted.org/packages/9d/03/cd0cba295522b91eb55c6b2704f1df895f8226cfe60ab10d4d51d0cc9e69/tiktoken-0.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5d48843bee149630eb735a99e1f4a85b47308d21868ea63163f6e87768d3cfed", size = 1241265, upload-time = "2026-05-15T04:50:28.815Z" }, + { url = "https://files.pythonhosted.org/packages/7e/25/a10efd564402d82c2ff50d12057353ace447aa8007deceaa48641f63d35c/tiktoken-0.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:fc1c44cd37b43fc46bae593129164f4f281e82ea116b57a85aa81bda57eafc94", size = 876509, upload-time = "2026-05-15T04:50:30.026Z" }, + { url = "https://files.pythonhosted.org/packages/85/8e/144bde4e01df66b34bb865557c7cd754ed08b036217ebd79c9db5e9048a9/tiktoken-0.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:32ac870a806cfb260a02d0cb70426aef02e038297f8ad50df5040bb5af360791", size = 1034888, upload-time = "2026-05-15T04:50:31.579Z" }, + { url = "https://files.pythonhosted.org/packages/36/18/d4ac9d20956cdebca04841316660ed584c2fecdc2b81722a28bc7ad3b1e4/tiktoken-0.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4d9980f11429ed2d737c463bb1fb78cf330caa026adf002f714aced7849a687b", size = 982970, upload-time = "2026-05-15T04:50:32.961Z" }, + { url = "https://files.pythonhosted.org/packages/74/ed/6bb8d05b9f731f749fee5c6f5ca63e981143c826a5985877330507bd13b7/tiktoken-0.13.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3f277ebea5edd7b8bf03c6f9431e1d67d517530115572b2dc1d465326e8f88c7", size = 1115741, upload-time = "2026-05-15T04:50:34.475Z" }, + { url = "https://files.pythonhosted.org/packages/34/de/2ca96b07a82d972b74fe4b46de055b79c904e45c7eab699354a0bfa697dc/tiktoken-0.13.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:a116178fa7e1b4065bff05214360373a65cac22f965be7b3f73d00a0dbfe7649", size = 1136523, upload-time = "2026-05-15T04:50:35.782Z" }, + { url = "https://files.pythonhosted.org/packages/ee/dc/9dafec002c2d4424378563cf4cf5c7fb93631d2a55013c8b87554ee4012c/tiktoken-0.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2c397ddda233208345b01bd30f2fca79ff730e55731d0108a603f9bc57f6af3b", size = 1181954, upload-time = "2026-05-15T04:50:36.99Z" }, + { url = "https://files.pythonhosted.org/packages/a1/d0/1f8578c45b2f24759b46f0b50d31878c63c73e6bf0f2227e10ec5c5408dc/tiktoken-0.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:95097e4f89b06403976e498abf61a0ee73a7497e73fb599cb211d8197a054d91", size = 1240069, upload-time = "2026-05-15T04:50:38.221Z" }, + { url = "https://files.pythonhosted.org/packages/aa/90/28d7f154888610aa9237e541986beb62b479df29d193a5a0617dbb1514d0/tiktoken-0.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:8f2d16e7a7c783ad81f36e457d046d1f1c8af70b22aec8a13238efe531977c41", size = 874748, upload-time = "2026-05-15T04:50:39.587Z" }, +] + [[package]] name = "tinycss2" version = "1.5.1" @@ -3675,7 +4078,15 @@ sdist = { url = "https://files.pythonhosted.org/packages/73/6f/f80cfef4a312e1fb3 wheels = [ { url = "https://files.pythonhosted.org/packages/92/97/5dbfabf04c7e348e655e907ed27913e03db0923abb5dfdd120d7b25630e1/tokenizers-0.22.2-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:544dd704ae7238755d790de45ba8da072e9af3eea688f698b137915ae959281c", size = 3100275, upload-time = "2026-01-05T10:41:02.158Z" }, { url = "https://files.pythonhosted.org/packages/2e/47/174dca0502ef88b28f1c9e06b73ce33500eedfac7a7692108aec220464e7/tokenizers-0.22.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:1e418a55456beedca4621dbab65a318981467a2b188e982a23e117f115ce5001", size = 2981472, upload-time = "2026-01-05T10:41:00.276Z" }, + { url = "https://files.pythonhosted.org/packages/d6/84/7990e799f1309a8b87af6b948f31edaa12a3ed22d11b352eaf4f4b2e5753/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2249487018adec45d6e3554c71d46eb39fa8ea67156c640f7513eb26f318cec7", size = 3290736, upload-time = "2026-01-05T10:40:32.165Z" }, + { url = "https://files.pythonhosted.org/packages/78/59/09d0d9ba94dcd5f4f1368d4858d24546b4bdc0231c2354aa31d6199f0399/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25b85325d0815e86e0bac263506dd114578953b7b53d7de09a6485e4a160a7dd", size = 3168835, upload-time = "2026-01-05T10:40:38.847Z" }, + { url = "https://files.pythonhosted.org/packages/47/50/b3ebb4243e7160bda8d34b731e54dd8ab8b133e50775872e7a434e524c28/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfb88f22a209ff7b40a576d5324bf8286b519d7358663db21d6246fb17eea2d5", size = 3521673, upload-time = "2026-01-05T10:40:56.614Z" }, + { url = "https://files.pythonhosted.org/packages/e0/fa/89f4cb9e08df770b57adb96f8cbb7e22695a4cb6c2bd5f0c4f0ebcf33b66/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c774b1276f71e1ef716e5486f21e76333464f47bece56bbd554485982a9e03e", size = 3724818, upload-time = "2026-01-05T10:40:44.507Z" }, + { url = "https://files.pythonhosted.org/packages/64/04/ca2363f0bfbe3b3d36e95bf67e56a4c88c8e3362b658e616d1ac185d47f2/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df6c4265b289083bf710dff49bc51ef252f9d5be33a45ee2bed151114a56207b", size = 3379195, upload-time = "2026-01-05T10:40:51.139Z" }, { url = "https://files.pythonhosted.org/packages/2e/76/932be4b50ef6ccedf9d3c6639b056a967a86258c6d9200643f01269211ca/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:369cc9fc8cc10cb24143873a0d95438bb8ee257bb80c71989e3ee290e8d72c67", size = 3274982, upload-time = "2026-01-05T10:40:58.331Z" }, + { url = "https://files.pythonhosted.org/packages/1d/28/5f9f5a4cc211b69e89420980e483831bcc29dade307955cc9dc858a40f01/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:29c30b83d8dcd061078b05ae0cb94d3c710555fbb44861139f9f83dcca3dc3e4", size = 9478245, upload-time = "2026-01-05T10:41:04.053Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fb/66e2da4704d6aadebf8cb39f1d6d1957df667ab24cff2326b77cda0dcb85/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:37ae80a28c1d3265bb1f22464c856bd23c02a05bb211e56d0c5301a435be6c1a", size = 9560069, upload-time = "2026-01-05T10:45:10.673Z" }, + { url = "https://files.pythonhosted.org/packages/16/04/fed398b05caa87ce9b1a1bb5166645e38196081b225059a6edaff6440fac/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:791135ee325f2336f498590eb2f11dc5c295232f288e75c99a36c5dbce63088a", size = 9899263, upload-time = "2026-01-05T10:45:12.559Z" }, { url = "https://files.pythonhosted.org/packages/05/a1/d62dfe7376beaaf1394917e0f8e93ee5f67fea8fcf4107501db35996586b/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38337540fbbddff8e999d59970f3c6f35a82de10053206a7562f1ea02d046fa5", size = 10033429, upload-time = "2026-01-05T10:45:14.333Z" }, { url = "https://files.pythonhosted.org/packages/fd/18/a545c4ea42af3df6effd7d13d250ba77a0a86fb20393143bbb9a92e434d4/tokenizers-0.22.2-cp39-abi3-win32.whl", hash = "sha256:a6bf3f88c554a2b653af81f3204491c818ae2ac6fbc09e76ef4773351292bc92", size = 2502363, upload-time = "2026-01-05T10:45:20.593Z" }, { url = "https://files.pythonhosted.org/packages/65/71/0670843133a43d43070abeb1949abfdef12a86d490bea9cd9e18e37c5ff7/tokenizers-0.22.2-cp39-abi3-win_amd64.whl", hash = "sha256:c9ea31edff2968b44a88f97d784c2f16dc0729b8b143ed004699ebca91f05c48", size = 2747786, upload-time = "2026-01-05T10:45:18.411Z" }, @@ -3690,14 +4101,18 @@ sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841 wheels = [ { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, + { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, + { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, @@ -3710,10 +4125,10 @@ name = "torch" version = "2.7.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12' and sys_platform == 'darwin'", - "python_full_version < '3.12' and sys_platform == 'darwin'", "(python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version >= '3.12' and sys_platform == 'win32')", "(python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version < '3.12' and sys_platform == 'win32')", + "python_full_version >= '3.12' and sys_platform == 'darwin'", + "python_full_version < '3.12' and sys_platform == 'darwin'", ] dependencies = [ { name = "filelock", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-8-invokeai-cpu' and extra != 'extra-8-invokeai-cuda' and extra != 'extra-8-invokeai-rocm') or (sys_platform == 'darwin' and extra == 'extra-8-invokeai-rocm') or (sys_platform == 'darwin' and extra != 'extra-8-invokeai-cpu' and extra != 'extra-8-invokeai-cuda') or (sys_platform == 'win32' and extra != 'extra-8-invokeai-cpu' and extra != 'extra-8-invokeai-cuda' and extra != 'extra-8-invokeai-rocm') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, @@ -3740,9 +4155,11 @@ dependencies = [ { name = "typing-extensions", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-8-invokeai-cpu' and extra != 'extra-8-invokeai-cuda' and extra != 'extra-8-invokeai-rocm') or (sys_platform == 'darwin' and extra == 'extra-8-invokeai-rocm') or (sys_platform == 'darwin' and extra != 'extra-8-invokeai-cpu' and extra != 'extra-8-invokeai-cuda') or (sys_platform == 'win32' and extra != 'extra-8-invokeai-cpu' and extra != 'extra-8-invokeai-cuda' and extra != 'extra-8-invokeai-rocm') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, ] wheels = [ + { url = "https://files.pythonhosted.org/packages/11/56/2eae3494e3d375533034a8e8cf0ba163363e996d85f0629441fa9d9843fe/torch-2.7.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:236f501f2e383f1cb861337bdf057712182f910f10aeaf509065d54d339e49b2", size = 99093039, upload-time = "2025-06-04T17:39:06.963Z" }, { url = "https://files.pythonhosted.org/packages/e5/94/34b80bd172d0072c9979708ccd279c2da2f55c3ef318eceec276ab9544a4/torch-2.7.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:06eea61f859436622e78dd0cdd51dbc8f8c6d76917a9cf0555a333f9eac31ec1", size = 821174704, upload-time = "2025-06-04T17:37:03.799Z" }, { url = "https://files.pythonhosted.org/packages/50/9e/acf04ff375b0b49a45511c55d188bcea5c942da2aaf293096676110086d1/torch-2.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:8273145a2e0a3c6f9fd2ac36762d6ee89c26d430e612b95a99885df083b04e52", size = 216095937, upload-time = "2025-06-04T17:39:24.83Z" }, { url = "https://files.pythonhosted.org/packages/5b/2b/d36d57c66ff031f93b4fa432e86802f84991477e522adcdffd314454326b/torch-2.7.1-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:aea4fc1bf433d12843eb2c6b2204861f43d8364597697074c8d38ae2507f8730", size = 68640034, upload-time = "2025-06-04T17:39:17.989Z" }, + { url = "https://files.pythonhosted.org/packages/87/93/fb505a5022a2e908d81fe9a5e0aa84c86c0d5f408173be71c6018836f34e/torch-2.7.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:27ea1e518df4c9de73af7e8a720770f3628e7f667280bce2be7a16292697e3fa", size = 98948276, upload-time = "2025-06-04T17:39:12.852Z" }, { url = "https://files.pythonhosted.org/packages/56/7e/67c3fe2b8c33f40af06326a3d6ae7776b3e3a01daa8f71d125d78594d874/torch-2.7.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:c33360cfc2edd976c2633b3b66c769bdcbbf0e0b6550606d188431c81e7dd1fc", size = 821025792, upload-time = "2025-06-04T17:34:58.747Z" }, { url = "https://files.pythonhosted.org/packages/a1/37/a37495502bc7a23bf34f89584fa5a78e25bae7b8da513bc1b8f97afb7009/torch-2.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:d8bf6e1856ddd1807e79dc57e54d3335f2b62e6f316ed13ed3ecfe1fc1df3d8b", size = 216050349, upload-time = "2025-06-04T17:38:59.709Z" }, { url = "https://files.pythonhosted.org/packages/3a/60/04b77281c730bb13460628e518c52721257814ac6c298acd25757f6a175c/torch-2.7.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:787687087412c4bd68d315e39bc1223f08aae1d16a9e9771d95eabbb04ae98fb", size = 68645146, upload-time = "2025-06-04T17:38:52.97Z" }, @@ -3768,8 +4185,10 @@ dependencies = [ { name = "typing-extensions", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'extra-8-invokeai-cpu') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or (sys_platform == 'darwin' and extra == 'extra-8-invokeai-cpu') or (sys_platform == 'win32' and extra == 'extra-8-invokeai-cpu') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or (sys_platform == 'darwin' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or (sys_platform == 'win32' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or (extra != 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, ] wheels = [ + { url = "https://download-r2.pytorch.org/whl/cpu/torch-2.7.1%2Bcpu-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:5fe6045b8f426bf2d0426e4fe009f1667a954ec2aeb82f1bd0bf60c6d7a85445", upload-time = "2025-06-03T18:27:52Z" }, { url = "https://download-r2.pytorch.org/whl/cpu/torch-2.7.1%2Bcpu-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a1684793e352f03fa14f78857e55d65de4ada8405ded1da2bf4f452179c4b779", upload-time = "2025-06-03T18:27:53Z" }, { url = "https://download-r2.pytorch.org/whl/cpu/torch-2.7.1%2Bcpu-cp311-cp311-win_amd64.whl", hash = "sha256:7b977eccbc85ae2bd19d6998de7b1f1f4bd3c04eaffd3015deb7934389783399", upload-time = "2025-06-03T18:27:58Z" }, + { url = "https://download-r2.pytorch.org/whl/cpu/torch-2.7.1%2Bcpu-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3bf2db5adf77b433844f080887ade049c4705ddf9fe1a32023ff84ff735aa5ad", upload-time = "2025-06-03T18:27:57Z" }, { url = "https://download-r2.pytorch.org/whl/cpu/torch-2.7.1%2Bcpu-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:8f8b3cfc53010a4b4a3c7ecb88c212e9decc4f5eeb6af75c3c803937d2d60947", upload-time = "2025-06-03T18:27:57Z" }, { url = "https://download-r2.pytorch.org/whl/cpu/torch-2.7.1%2Bcpu-cp312-cp312-win_amd64.whl", hash = "sha256:0bc887068772233f532b51a3e8c8cfc682ae62bef74bf4e0c53526c8b9e4138f", upload-time = "2025-06-03T18:27:56Z" }, { url = "https://download-r2.pytorch.org/whl/cpu/torch-2.7.1%2Bcpu-cp312-cp312-win_arm64.whl", hash = "sha256:a2618775f32eb4126c5b2050686da52001a08cffa331637d9cf51c8250931e00", upload-time = "2025-07-16T16:40:20Z" }, @@ -3810,8 +4229,10 @@ dependencies = [ { name = "typing-extensions", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra == 'extra-8-invokeai-cuda') or (platform_machine != 'x86_64' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or (sys_platform == 'darwin' and extra == 'extra-8-invokeai-cuda') or (sys_platform == 'win32' and extra == 'extra-8-invokeai-cuda') or (sys_platform != 'linux' and extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm')" }, ] wheels = [ + { url = "https://download-r2.pytorch.org/whl/cu128/torch-2.7.1%2Bcu128-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:3a0954c54fd7cb9f45beab1272dece2a05b0e77023c1da33ba32a7919661260f", upload-time = "2025-06-03T18:31:04Z" }, { url = "https://download-r2.pytorch.org/whl/cu128/torch-2.7.1%2Bcu128-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:c301dc280458afd95450af794924c98fe07522dd148ff384739b810e3e3179f2", upload-time = "2025-06-03T18:31:06Z" }, { url = "https://download-r2.pytorch.org/whl/cu128/torch-2.7.1%2Bcu128-cp311-cp311-win_amd64.whl", hash = "sha256:138c66dcd0ed2f07aafba3ed8b7958e2bed893694990e0b4b55b6b2b4a336aa6", upload-time = "2025-06-03T18:31:13Z" }, + { url = "https://download-r2.pytorch.org/whl/cu128/torch-2.7.1%2Bcu128-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:268e54db9f0bc2b7b9eb089852d3e592c2dea2facc3db494100c3d3b796549fa", upload-time = "2025-06-03T18:31:20Z" }, { url = "https://download-r2.pytorch.org/whl/cu128/torch-2.7.1%2Bcu128-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:0b64f7d0a6f2a739ed052ba959f7b67c677028c9566ce51997f9f90fe573ddaa", upload-time = "2025-06-03T18:31:26Z" }, { url = "https://download-r2.pytorch.org/whl/cu128/torch-2.7.1%2Bcu128-cp312-cp312-win_amd64.whl", hash = "sha256:2bb8c05d48ba815b316879a18195d53a6472a03e297d971e916753f8e1053d30", upload-time = "2025-06-03T18:31:46Z" }, ] @@ -3862,10 +4283,10 @@ name = "torchvision" version = "0.22.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12' and sys_platform == 'darwin'", - "python_full_version < '3.12' and sys_platform == 'darwin'", "(python_full_version >= '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version >= '3.12' and sys_platform == 'win32')", "(python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux') or (python_full_version < '3.12' and sys_platform == 'win32')", + "python_full_version >= '3.12' and sys_platform == 'darwin'", + "python_full_version < '3.12' and sys_platform == 'darwin'", ] dependencies = [ { name = "numpy", marker = "(platform_machine == 'x86_64' and sys_platform == 'linux' and extra != 'extra-8-invokeai-cpu' and extra != 'extra-8-invokeai-cuda' and extra != 'extra-8-invokeai-rocm') or (sys_platform == 'darwin' and extra == 'extra-8-invokeai-rocm') or (sys_platform == 'darwin' and extra != 'extra-8-invokeai-cpu' and extra != 'extra-8-invokeai-cuda') or (sys_platform == 'win32' and extra != 'extra-8-invokeai-cpu' and extra != 'extra-8-invokeai-cuda' and extra != 'extra-8-invokeai-rocm') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-cuda') or (extra == 'extra-8-invokeai-cpu' and extra == 'extra-8-invokeai-rocm') or (extra == 'extra-8-invokeai-cuda' and extra == 'extra-8-invokeai-rocm')" }, @@ -3874,9 +4295,11 @@ dependencies = [ ] wheels = [ { url = "https://files.pythonhosted.org/packages/f6/00/bdab236ef19da050290abc2b5203ff9945c84a1f2c7aab73e8e9c8c85669/torchvision-0.22.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4addf626e2b57fc22fd6d329cf1346d474497672e6af8383b7b5b636fba94a53", size = 1947827, upload-time = "2025-06-04T17:43:10.84Z" }, + { url = "https://files.pythonhosted.org/packages/ac/d0/18f951b2be3cfe48c0027b349dcc6fde950e3dc95dd83e037e86f284f6fd/torchvision-0.22.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:8b4a53a6067d63adba0c52f2b8dd2290db649d642021674ee43c0c922f0c6a69", size = 2514021, upload-time = "2025-06-04T17:43:07.608Z" }, { url = "https://files.pythonhosted.org/packages/c3/1a/63eb241598b36d37a0221e10af357da34bd33402ccf5c0765e389642218a/torchvision-0.22.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:b7866a3b326413e67724ac46f1ee594996735e10521ba9e6cdbe0fa3cd98c2f2", size = 7487300, upload-time = "2025-06-04T17:42:58.349Z" }, { url = "https://files.pythonhosted.org/packages/e5/73/1b009b42fe4a7774ba19c23c26bb0f020d68525c417a348b166f1c56044f/torchvision-0.22.1-cp311-cp311-win_amd64.whl", hash = "sha256:bb3f6df6f8fd415ce38ec4fd338376ad40c62e86052d7fc706a0dd51efac1718", size = 1707989, upload-time = "2025-06-04T17:43:14.332Z" }, { url = "https://files.pythonhosted.org/packages/02/90/f4e99a5112dc221cf68a485e853cc3d9f3f1787cb950b895f3ea26d1ea98/torchvision-0.22.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:153f1790e505bd6da123e21eee6e83e2e155df05c0fe7d56347303067d8543c5", size = 1947827, upload-time = "2025-06-04T17:43:11.945Z" }, + { url = "https://files.pythonhosted.org/packages/25/f6/53e65384cdbbe732cc2106bb04f7fb908487e4fb02ae4a1613ce6904a122/torchvision-0.22.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:964414eef19459d55a10e886e2fca50677550e243586d1678f65e3f6f6bac47a", size = 2514576, upload-time = "2025-06-04T17:43:02.707Z" }, { url = "https://files.pythonhosted.org/packages/17/8b/155f99042f9319bd7759536779b2a5b67cbd4f89c380854670850f89a2f4/torchvision-0.22.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:699c2d70d33951187f6ed910ea05720b9b4aaac1dcc1135f53162ce7d42481d3", size = 7485962, upload-time = "2025-06-04T17:42:43.606Z" }, { url = "https://files.pythonhosted.org/packages/05/17/e45d5cd3627efdb47587a0634179a3533593436219de3f20c743672d2a79/torchvision-0.22.1-cp312-cp312-win_amd64.whl", hash = "sha256:75e0897da7a8e43d78632f66f2bdc4f6e26da8d3f021a7c0fa83746073c2597b", size = 1707992, upload-time = "2025-06-04T17:42:53.207Z" }, ] @@ -3952,6 +4375,8 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/02/dc/c7043cab6fed8ae159fc1923ce829ada35c4dbd797d408a43858ffaf9639/tornado-6.5.7-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:148b2eb15c2c765a50796172c1e499649b35f30d2e3c3d3e15913cfa56bfb163", size = 448543, upload-time = "2026-06-08T17:34:38.052Z" }, { url = "https://files.pythonhosted.org/packages/92/4f/090b1431e5a43df696feceffc268c5383cc079ecb5f08ce58f917109aafe/tornado-6.5.7-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9da38de27f1da3b78a966f0dae12b5a1ea9afe72ca805d84ff06508272ddf100", size = 446707, upload-time = "2026-06-08T17:34:39.594Z" }, { url = "https://files.pythonhosted.org/packages/37/d8/ef374952fd5da67d4463122c2b8e5a96536ec10b4b339254c6dcde81d01c/tornado-6.5.7-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8d759e71906ee783f8867b93bf26a265743da4c1e2f4a018464c1ba019862972", size = 449774, upload-time = "2026-06-08T17:34:41.204Z" }, + { url = "https://files.pythonhosted.org/packages/35/37/d434c73f4c6e014b745b9b37085f34f40c022f007efff3d7fe65991899f3/tornado-6.5.7-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a46347a18f23fb92b396beebe0fb78f61dda0cc302445202c16203d8a18848b", size = 450745, upload-time = "2026-06-08T17:34:42.531Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2b/56b9aff361d7f1ab728a805ec7d7ea835f8807afa9f5cc690ea0e630efb9/tornado-6.5.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7778b30bef919231265e91c69963ce0f49a1e9c07ac900bbe75b19ce2575ba92", size = 450578, upload-time = "2026-06-08T17:34:43.787Z" }, { url = "https://files.pythonhosted.org/packages/02/30/a7444fb23aa76860a14198fab96ac79f1866b0a6e19e26c4381b0938e50f/tornado-6.5.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e726f0c75da7726eec023aa62751ff8878bd2737e34fbdd33b1ae5897d2200f5", size = 449985, upload-time = "2026-06-08T17:34:45.326Z" }, { url = "https://files.pythonhosted.org/packages/5c/42/5f0e56c01e8d9d36f4e23f367b85ae6cae0c1ecddd5e6977d8388ad27488/tornado-6.5.7-cp39-abi3-win32.whl", hash = "sha256:f8de3bf12d3efdd0cbe7c8887868198f8a91415e3f29fcf258d9b8eb7b1d9ae4", size = 451047, upload-time = "2026-06-08T17:34:46.784Z" }, { url = "https://files.pythonhosted.org/packages/c9/a4/b393076ffb21b469eec5b328a0534cf03a3b90bfc6b1f09507cdd075d938/tornado-6.5.7-cp39-abi3-win_amd64.whl", hash = "sha256:de942f843533a039ef9fa3d9c88c7cd8a7c94553fb5ad0154270989b3d99a2c4", size = 451485, upload-time = "2026-06-08T17:34:48.248Z" }, @@ -4165,11 +4590,15 @@ sdist = { url = "https://files.pythonhosted.org/packages/06/f0/18d39dbd1971d6d62 wheels = [ { url = "https://files.pythonhosted.org/packages/c7/d5/69900f7883235562f1f50d8184bb7dd84a2fb61e9ec63f3782546fdbd057/uvloop-0.22.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c60ebcd36f7b240b30788554b6f0782454826a0ed765d8430652621b5de674b9", size = 1352420, upload-time = "2025-10-16T22:16:21.187Z" }, { url = "https://files.pythonhosted.org/packages/a8/73/c4e271b3bce59724e291465cc936c37758886a4868787da0278b3b56b905/uvloop-0.22.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b7f102bf3cb1995cfeaee9321105e8f5da76fdb104cdad8986f85461a1b7b77", size = 748677, upload-time = "2025-10-16T22:16:22.558Z" }, + { url = "https://files.pythonhosted.org/packages/86/94/9fb7fad2f824d25f8ecac0d70b94d0d48107ad5ece03769a9c543444f78a/uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53c85520781d84a4b8b230e24a5af5b0778efdb39142b424990ff1ef7c48ba21", size = 3753819, upload-time = "2025-10-16T22:16:23.903Z" }, { url = "https://files.pythonhosted.org/packages/74/4f/256aca690709e9b008b7108bc85fba619a2bc37c6d80743d18abad16ee09/uvloop-0.22.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56a2d1fae65fd82197cb8c53c367310b3eabe1bbb9fb5a04d28e3e3520e4f702", size = 3804529, upload-time = "2025-10-16T22:16:25.246Z" }, + { url = "https://files.pythonhosted.org/packages/7f/74/03c05ae4737e871923d21a76fe28b6aad57f5c03b6e6bfcfa5ad616013e4/uvloop-0.22.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40631b049d5972c6755b06d0bfe8233b1bd9a8a6392d9d1c45c10b6f9e9b2733", size = 3621267, upload-time = "2025-10-16T22:16:26.819Z" }, { url = "https://files.pythonhosted.org/packages/75/be/f8e590fe61d18b4a92070905497aec4c0e64ae1761498cad09023f3f4b3e/uvloop-0.22.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:535cc37b3a04f6cd2c1ef65fa1d370c9a35b6695df735fcff5427323f2cd5473", size = 3723105, upload-time = "2025-10-16T22:16:28.252Z" }, { url = "https://files.pythonhosted.org/packages/3d/ff/7f72e8170be527b4977b033239a83a68d5c881cc4775fca255c677f7ac5d/uvloop-0.22.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fe94b4564e865d968414598eea1a6de60adba0c040ba4ed05ac1300de402cd42", size = 1359936, upload-time = "2025-10-16T22:16:29.436Z" }, { url = "https://files.pythonhosted.org/packages/c3/c6/e5d433f88fd54d81ef4be58b2b7b0cea13c442454a1db703a1eea0db1a59/uvloop-0.22.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:51eb9bd88391483410daad430813d982010f9c9c89512321f5b60e2cddbdddd6", size = 752769, upload-time = "2025-10-16T22:16:30.493Z" }, + { url = "https://files.pythonhosted.org/packages/24/68/a6ac446820273e71aa762fa21cdcc09861edd3536ff47c5cd3b7afb10eeb/uvloop-0.22.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:700e674a166ca5778255e0e1dc4e9d79ab2acc57b9171b79e65feba7184b3370", size = 4317413, upload-time = "2025-10-16T22:16:31.644Z" }, { url = "https://files.pythonhosted.org/packages/5f/6f/e62b4dfc7ad6518e7eff2516f680d02a0f6eb62c0c212e152ca708a0085e/uvloop-0.22.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b5b1ac819a3f946d3b2ee07f09149578ae76066d70b44df3fa990add49a82e4", size = 4426307, upload-time = "2025-10-16T22:16:32.917Z" }, + { url = "https://files.pythonhosted.org/packages/90/60/97362554ac21e20e81bcef1150cb2a7e4ffdaf8ea1e5b2e8bf7a053caa18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e047cc068570bac9866237739607d1313b9253c3051ad84738cbb095be0537b2", size = 4131970, upload-time = "2025-10-16T22:16:34.015Z" }, { url = "https://files.pythonhosted.org/packages/99/39/6b3f7d234ba3964c428a6e40006340f53ba37993f46ed6e111c6e9141d18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:512fec6815e2dd45161054592441ef76c830eddaad55c8aa30952e6fe1ed07c0", size = 4296343, upload-time = "2025-10-16T22:16:35.149Z" }, ] @@ -4200,6 +4629,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload-time = "2024-11-01T14:06:37.745Z" }, { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload-time = "2024-11-01T14:06:39.748Z" }, { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload-time = "2024-11-01T14:06:41.009Z" }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" }, { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" }, { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload-time = "2024-11-01T14:07:09.525Z" }, { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload-time = "2024-11-01T14:07:10.686Z" }, @@ -4217,20 +4652,35 @@ sdist = { url = "https://files.pythonhosted.org/packages/cd/41/5e1a4bb12aac5f149 wheels = [ { url = "https://files.pythonhosted.org/packages/fc/3d/8024c801df84d1587740d0359e7fdd80afeae3d159011f3d5376dd82f18e/watchfiles-1.2.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:704fd259e332e01f9b9c178f4bce9e49027e5587cc2600eeeaf8e76e1c846201", size = 400242, upload-time = "2026-05-18T04:31:19.014Z" }, { url = "https://files.pythonhosted.org/packages/87/5b/f4dfd45323e949984a3a7f9dc31d1cbb049921e7d98253488dda72ccdaa9/watchfiles-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6543cf55d170003296d185c0af981f3e1311564907e1f4e08671fc7693a890a5", size = 394562, upload-time = "2026-05-18T04:30:08.46Z" }, + { url = "https://files.pythonhosted.org/packages/98/d8/19483ef075d601c409bce8bcbb5c0f81a10876fff870400568f08ce484a1/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89d8c2394a065ca86f5d2910ff263ae67c127e1376ccc4f9fc35c71db879f80a", size = 456611, upload-time = "2026-05-18T04:30:45.723Z" }, + { url = "https://files.pythonhosted.org/packages/b1/6a/cc81fbe7ee42f2f22e661a6e12def7807e01b14b2f39e0ff83fd373fd307/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:772b80df316480d894a0e3165fdd19cf77f5d17f9a787f94029465ad0e3529d1", size = 461379, upload-time = "2026-05-18T04:31:29.292Z" }, + { url = "https://files.pythonhosted.org/packages/b1/57/7e669002082c0a0f4fb5113bb70125f7110124b846b0a11bc5ae8e90eac1/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d158cd89df6053823533e06fb1d73c549133bff5f0396170c0e53d9559340717", size = 493556, upload-time = "2026-05-18T04:30:05.44Z" }, + { url = "https://files.pythonhosted.org/packages/45/7d/f60a2b19807b21fe8281f3a8da4f59eef0d5f96825ac4680ba2d4f2ebf91/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d516b3283a758e087841aedb8031549fb41ced08f3db10aa6d2bf32dc042525b", size = 575255, upload-time = "2026-05-18T04:30:40.568Z" }, + { url = "https://files.pythonhosted.org/packages/bd/49/77f5b5e6efbcd57482f74948ebb1b97e5c0046d6b61475042d830c84b3ff/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:53b2290c92e0506d102cd448fbc610d87079553f86caa39d67440856a8b8bba5", size = 467052, upload-time = "2026-05-18T04:31:17.942Z" }, { url = "https://files.pythonhosted.org/packages/ee/5a/73e2959af1b97fd5d556f9a8bdba017be23ceeef731869d5eaa0a753d5a3/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a711b51aec4370d0dcda5b6c09463206f133a5759341d7744b953a7b62e1100e", size = 456858, upload-time = "2026-05-18T04:30:30.182Z" }, + { url = "https://files.pythonhosted.org/packages/50/57/1bc8c27fad7e6c19bddee15d276dbb6ab72480ec01c127afff1673aee417/watchfiles-1.2.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:e2ca07fa7d89195ec0865d3d285666286740bfa83d83e5cee204043a31ecc165", size = 467579, upload-time = "2026-05-18T04:32:15.897Z" }, + { url = "https://files.pythonhosted.org/packages/09/6c/3c2e44edba3553c5e3c3b8c8a2a6dee6b9e12ae2cf4bd2378bebf9dc3038/watchfiles-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e0618518f282c4ebff60f5e5b1247b6d91bb8b9f4476947563a1e74acc66f3c6", size = 633253, upload-time = "2026-05-18T04:31:37.123Z" }, { url = "https://files.pythonhosted.org/packages/30/c2/d8c84a882ab39bbefcc4915ab3e91830b7a7e990c5570b0b69075aba3faf/watchfiles-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0d191c054d0715c3c95c99df9b8dbf6fd096d8c1e021e8f212e1bd8bc444ccb5", size = 660713, upload-time = "2026-05-18T04:31:24.62Z" }, { url = "https://files.pythonhosted.org/packages/a9/07/f97736a5fc605364fe67b25e9fa4a6965dfd4840d50c406ada507e9d735f/watchfiles-1.2.0-cp311-cp311-win32.whl", hash = "sha256:9342472aff9b093c5acd4f6d8f70ae0937964ab56542502bcf5579782da69ae8", size = 277222, upload-time = "2026-05-18T04:31:21.131Z" }, { url = "https://files.pythonhosted.org/packages/cf/99/2b04981977fc2608afd60360d928c6aecf6b950292ca221d98f4005f6694/watchfiles-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:dbd6c97045dad81227c8d040173da044c1de08de64a5ea8b555da4aee1d5fa22", size = 290274, upload-time = "2026-05-18T04:31:45.966Z" }, { url = "https://files.pythonhosted.org/packages/3c/74/f7f58a7075ee9cf612b0cfcddb78b8cd8234f0742d6f0075cf0da2dde1c6/watchfiles-1.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:57a2d9fa4fb4c2ecae57b13dfff2c7ab53e21a2ba674fe9f05506680fcdcc0d7", size = 283460, upload-time = "2026-05-18T04:31:39.126Z" }, { url = "https://files.pythonhosted.org/packages/b8/2f/e42c992d2afda3108ea1c02acecc991b9f31d05c14adc2a7cee9ee211fc4/watchfiles-1.2.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:bc13eb17538be00c874699dc0abe4ee2bc8d50bb1166a6b9e175ef3fd7eb8f26", size = 400115, upload-time = "2026-05-18T04:32:02.06Z" }, { url = "https://files.pythonhosted.org/packages/5f/8f/6af2ea19065c91d8b0ea3516fdfc8c0d349f407e8e9fbf4e5a17360de8ad/watchfiles-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d95ddc1eb6914154253d239089900813f6a767e174b8e6a50e7fdacb7e4236c", size = 393659, upload-time = "2026-05-18T04:30:50.951Z" }, + { url = "https://files.pythonhosted.org/packages/13/01/b32a967c56fb3e3e5be3db52c3d3b87fa4513aa367d8ed1ad96d42952e5f/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f70d8b291ef6e88d19b1f297a6905ddb978888d9272b0d05e6f53309856bcfc", size = 453207, upload-time = "2026-05-18T04:31:04.231Z" }, + { url = "https://files.pythonhosted.org/packages/04/98/97557a812180338cb1abd32e1cffcc4588f59b5f23e0cb006b2ba95ba64a/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:56d8641cf834c2836922899105bd3ce3d0dfc69291d52edf0b4d0436829b34c0", size = 459273, upload-time = "2026-05-18T04:31:50.377Z" }, + { url = "https://files.pythonhosted.org/packages/e8/a8/b4b08dcb7653b8087c6586f7ce649505900e866bbcfe40dc9587af02e686/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2581a94056e55d7d0a31a823ea92bf73749c489ca2285bfdc0fbe6b2bb49d50c", size = 489927, upload-time = "2026-05-18T04:31:42.485Z" }, + { url = "https://files.pythonhosted.org/packages/50/94/3dceea03545d2e5ddfd839f0ddd5e1cecbf1697b5a428d5ba11cef6af95d/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41bc1199f7523b3f82843c88cbb979180c949caef0342cf90968f178e5d49b01", size = 570476, upload-time = "2026-05-18T04:31:03.071Z" }, + { url = "https://files.pythonhosted.org/packages/cc/f2/d39a5450c3532092b91f81d274360e613c2371bc874a89c7a1a3c5e8d138/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7571e4464cb6e434958f867f7f730b8ab0b75e3f8e5eac0499168486ab3c33a8", size = 465650, upload-time = "2026-05-18T04:30:12.701Z" }, { url = "https://files.pythonhosted.org/packages/22/24/ed72f68cbc1333ca9b9f2200aa048bb6658ae41709bc1caad4310f4bdffd/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e53a384f76b631c3ae5334ce6a52f0baa3a911eb94a4eac7f160079868b716d5", size = 456398, upload-time = "2026-05-18T04:30:13.784Z" }, + { url = "https://files.pythonhosted.org/packages/0d/64/982ef4a4e5bab5b6e5b6becc8cd5e732f6130a78b855f0abec6439a9a135/watchfiles-1.2.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:d20029a60a71a052a24c4db7673bc4de39ab89adbaccbfb5d67987c5d73f424d", size = 465140, upload-time = "2026-05-18T04:31:52.111Z" }, + { url = "https://files.pythonhosted.org/packages/a0/0c/95282abf4ed680b6096010bcfc30c5fa7a041fc5aa5a2ad17a2cc6c75bba/watchfiles-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2cb93af48550faf1cea04c303107c8b75833de7013e57ce27d3b8d21d8d0f58c", size = 630259, upload-time = "2026-05-18T04:31:25.676Z" }, { url = "https://files.pythonhosted.org/packages/30/45/607c1de1530c4bdcf2cf1d1ecc2505ddba5d96bd43ba9f2b0e79876f850f/watchfiles-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2995c176de7692b86a2e4c58d9ec718f753150a979cb4a754e2b4ffa38e70906", size = 659859, upload-time = "2026-05-18T04:30:24.333Z" }, { url = "https://files.pythonhosted.org/packages/fa/08/d9e2e0f9e8e6791d33aefc694ad7eefa7f901f63caff84a81ded38692f9c/watchfiles-1.2.0-cp312-cp312-win32.whl", hash = "sha256:7a2cffd17d27d2ecbb310c2b1d8174f222a5495b1a721894afa88ec11e25b898", size = 275480, upload-time = "2026-05-18T04:30:31.307Z" }, { url = "https://files.pythonhosted.org/packages/1c/e6/9d42569c0102645cc8cea5d8c7d8a1e9d4ada2cb7f05f75e554b8aa2202a/watchfiles-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:f155b3a1b2a5fc89cdc70d47ee5d54e3b75e88efa34982028a35daef9ba00379", size = 288718, upload-time = "2026-05-18T04:32:10.745Z" }, { url = "https://files.pythonhosted.org/packages/0a/26/88e0dc6ee3898169d7fa22bb6a69cabf2502d2ee25cb8c876d1262d204f8/watchfiles-1.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:8fa585ede612ee9f9e91b18bebf9ba11b9ae29a4e3a0d0cf6fca3e382133f0d5", size = 281026, upload-time = "2026-05-18T04:30:22.23Z" }, { url = "https://files.pythonhosted.org/packages/23/f4/7513ef1e85fc4c6331b59479d6d72661fc391fbe543678052ac72c8b6c19/watchfiles-1.2.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:4674d49eb94706dfe666c069fc0a1b646ffcf920473492e209f6d5f60d3f0cc2", size = 403050, upload-time = "2026-05-18T04:30:36.753Z" }, { url = "https://files.pythonhosted.org/packages/27/0b/a54103cfd732bb703c7a749222011a0483ef3705948dae3b203158601119/watchfiles-1.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:094b9b70103d4e963499bdea001ee3c2697b144cd9ae6218a62c0f89ec9e31db", size = 396629, upload-time = "2026-05-18T04:32:03.268Z" }, + { url = "https://files.pythonhosted.org/packages/5e/2c/73f31a3b893886206c3f54d73e8ad8dee58cdb2f69ad2622e0a8a9e07f4e/watchfiles-1.2.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0ef001f8c25ad0fa9529f914c1600647ecd0f542d11c19b7894768c67b6acb7", size = 457318, upload-time = "2026-05-18T04:31:01.932Z" }, { url = "https://files.pythonhosted.org/packages/e9/f9/45d021e4a5cc7b9dd567f7cbb06d3b75f751a690063fb6cc7ec60f4e46b7/watchfiles-1.2.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a88fc94e647bc4eec523f1caa540258eb71d14278b9daf72fa1e2658a98df0f0", size = 457771, upload-time = "2026-05-18T04:30:56.331Z" }, ] @@ -4280,6 +4730,8 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f3/fa/abe89019d8d8815c8781e90d697dec52523fb8ebe308bf11664e8de1877e/websockets-16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:417b28978cdccab24f46400586d128366313e8a96312e4b9362a4af504f3bbad", size = 175022, upload-time = "2026-01-10T09:22:36.332Z" }, { url = "https://files.pythonhosted.org/packages/58/5d/88ea17ed1ded2079358b40d31d48abe90a73c9e5819dbcde1606e991e2ad/websockets-16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af80d74d4edfa3cb9ed973a0a5ba2b2a549371f8a741e0800cb07becdd20f23d", size = 175319, upload-time = "2026-01-10T09:22:37.602Z" }, { url = "https://files.pythonhosted.org/packages/d2/ae/0ee92b33087a33632f37a635e11e1d99d429d3d323329675a6022312aac2/websockets-16.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:08d7af67b64d29823fed316505a89b86705f2b7981c07848fb5e3ea3020c1abe", size = 184631, upload-time = "2026-01-10T09:22:38.789Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c5/27178df583b6c5b31b29f526ba2da5e2f864ecc79c99dae630a85d68c304/websockets-16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7be95cfb0a4dae143eaed2bcba8ac23f4892d8971311f1b06f3c6b78952ee70b", size = 185870, upload-time = "2026-01-10T09:22:39.893Z" }, + { url = "https://files.pythonhosted.org/packages/87/05/536652aa84ddc1c018dbb7e2c4cbcd0db884580bf8e95aece7593fde526f/websockets-16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d6297ce39ce5c2e6feb13c1a996a2ded3b6832155fcfc920265c76f24c7cceb5", size = 185361, upload-time = "2026-01-10T09:22:41.016Z" }, { url = "https://files.pythonhosted.org/packages/6d/e2/d5332c90da12b1e01f06fb1b85c50cfc489783076547415bf9f0a659ec19/websockets-16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c1b30e4f497b0b354057f3467f56244c603a79c0d1dafce1d16c283c25f6e64", size = 184615, upload-time = "2026-01-10T09:22:42.442Z" }, { url = "https://files.pythonhosted.org/packages/77/fb/d3f9576691cae9253b51555f841bc6600bf0a983a461c79500ace5a5b364/websockets-16.0-cp311-cp311-win32.whl", hash = "sha256:5f451484aeb5cafee1ccf789b1b66f535409d038c56966d6101740c1614b86c6", size = 178246, upload-time = "2026-01-10T09:22:43.654Z" }, { url = "https://files.pythonhosted.org/packages/54/67/eaff76b3dbaf18dcddabc3b8c1dba50b483761cccff67793897945b37408/websockets-16.0-cp311-cp311-win_amd64.whl", hash = "sha256:8d7f0659570eefb578dacde98e24fb60af35350193e4f56e11190787bee77dac", size = 178684, upload-time = "2026-01-10T09:22:44.941Z" }, @@ -4287,12 +4739,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b0/fe/136ccece61bd690d9c1f715baaeefd953bb2360134de73519d5df19d29ca/websockets-16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8b6e209ffee39ff1b6d0fa7bfef6de950c60dfb91b8fcead17da4ee539121a79", size = 175038, upload-time = "2026-01-10T09:22:47.999Z" }, { url = "https://files.pythonhosted.org/packages/40/1e/9771421ac2286eaab95b8575b0cb701ae3663abf8b5e1f64f1fd90d0a673/websockets-16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86890e837d61574c92a97496d590968b23c2ef0aeb8a9bc9421d174cd378ae39", size = 175328, upload-time = "2026-01-10T09:22:49.809Z" }, { url = "https://files.pythonhosted.org/packages/18/29/71729b4671f21e1eaa5d6573031ab810ad2936c8175f03f97f3ff164c802/websockets-16.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9b5aca38b67492ef518a8ab76851862488a478602229112c4b0d58d63a7a4d5c", size = 184915, upload-time = "2026-01-10T09:22:51.071Z" }, + { url = "https://files.pythonhosted.org/packages/97/bb/21c36b7dbbafc85d2d480cd65df02a1dc93bf76d97147605a8e27ff9409d/websockets-16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0334872c0a37b606418ac52f6ab9cfd17317ac26365f7f65e203e2d0d0d359f", size = 186152, upload-time = "2026-01-10T09:22:52.224Z" }, + { url = "https://files.pythonhosted.org/packages/4a/34/9bf8df0c0cf88fa7bfe36678dc7b02970c9a7d5e065a3099292db87b1be2/websockets-16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a0b31e0b424cc6b5a04b8838bbaec1688834b2383256688cf47eb97412531da1", size = 185583, upload-time = "2026-01-10T09:22:53.443Z" }, { url = "https://files.pythonhosted.org/packages/47/88/4dd516068e1a3d6ab3c7c183288404cd424a9a02d585efbac226cb61ff2d/websockets-16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:485c49116d0af10ac698623c513c1cc01c9446c058a4e61e3bf6c19dff7335a2", size = 184880, upload-time = "2026-01-10T09:22:55.033Z" }, { url = "https://files.pythonhosted.org/packages/91/d6/7d4553ad4bf1c0421e1ebd4b18de5d9098383b5caa1d937b63df8d04b565/websockets-16.0-cp312-cp312-win32.whl", hash = "sha256:eaded469f5e5b7294e2bdca0ab06becb6756ea86894a47806456089298813c89", size = 178261, upload-time = "2026-01-10T09:22:56.251Z" }, { url = "https://files.pythonhosted.org/packages/c3/f0/f3a17365441ed1c27f850a80b2bc680a0fa9505d733fe152fdf5e98c1c0b/websockets-16.0-cp312-cp312-win_amd64.whl", hash = "sha256:5569417dc80977fc8c2d43a86f78e0a5a22fee17565d78621b6bb264a115d4ea", size = 178693, upload-time = "2026-01-10T09:22:57.478Z" }, { url = "https://files.pythonhosted.org/packages/72/07/c98a68571dcf256e74f1f816b8cc5eae6eb2d3d5cfa44d37f801619d9166/websockets-16.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:349f83cd6c9a415428ee1005cadb5c2c56f4389bc06a9af16103c3bc3dcc8b7d", size = 174947, upload-time = "2026-01-10T09:23:36.166Z" }, { url = "https://files.pythonhosted.org/packages/7e/52/93e166a81e0305b33fe416338be92ae863563fe7bce446b0f687b9df5aea/websockets-16.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:4a1aba3340a8dca8db6eb5a7986157f52eb9e436b74813764241981ca4888f03", size = 175260, upload-time = "2026-01-10T09:23:37.409Z" }, { url = "https://files.pythonhosted.org/packages/56/0c/2dbf513bafd24889d33de2ff0368190a0e69f37bcfa19009ef819fe4d507/websockets-16.0-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f4a32d1bd841d4bcbffdcb3d2ce50c09c3909fbead375ab28d0181af89fd04da", size = 176071, upload-time = "2026-01-10T09:23:39.158Z" }, + { url = "https://files.pythonhosted.org/packages/a5/8f/aea9c71cc92bf9b6cc0f7f70df8f0b420636b6c96ef4feee1e16f80f75dd/websockets-16.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0298d07ee155e2e9fda5be8a9042200dd2e3bb0b8a38482156576f863a9d457c", size = 176968, upload-time = "2026-01-10T09:23:41.031Z" }, { url = "https://files.pythonhosted.org/packages/9a/3f/f70e03f40ffc9a30d817eef7da1be72ee4956ba8d7255c399a01b135902a/websockets-16.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a653aea902e0324b52f1613332ddf50b00c06fdaf7e92624fbf8c77c78fa5767", size = 178735, upload-time = "2026-01-10T09:23:42.259Z" }, { url = "https://files.pythonhosted.org/packages/6f/28/258ebab549c2bf3e64d2b0217b973467394a9cea8c42f70418ca2c5d0d2e/websockets-16.0-py3-none-any.whl", hash = "sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec", size = 171598, upload-time = "2026-01-10T09:23:45.395Z" }, ] @@ -4318,6 +4773,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/27/15/0c2d55168707465abfc41f33c0b23d792a5fa9b65c26983606940900a120/wrapt-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f1a2ff355ece6a111ca7a20dc86df6659c9205d3fcee674ca34f2a2854fd4e73", size = 80782, upload-time = "2026-06-20T23:47:44.367Z" }, { url = "https://files.pythonhosted.org/packages/7d/b5/5c0b093eb48f8a062ef6267d3cb36e9bb1b88440181f6545a383c60efdf8/wrapt-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:55b9a899e6fff5444f229d30aa6e9ac92d2216d9d60f33c771b5d76a760d5f8e", size = 81678, upload-time = "2026-06-20T23:47:45.857Z" }, { url = "https://files.pythonhosted.org/packages/34/f3/de70937472dd3e8a4e6811192f9c6075efdffd4a2cd9b4596bf160f89668/wrapt-2.2.2-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a2d78c363f97d8bd718ee40432c66395685e9e98528ccaa423c3355d1715a26d", size = 159671, upload-time = "2026-06-20T23:47:47.345Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ec/40aed2330e7f02ecf74386ffcfef9ccb7108c6a430f15b6a252b663b1bed/wrapt-2.2.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d619e1eed9bd4f6ed9f24cd61971aa086fa86505289628d464bcf8a2c2e3f328", size = 160785, upload-time = "2026-06-20T23:47:48.759Z" }, + { url = "https://files.pythonhosted.org/packages/45/04/aa5309beed5344b00220ae6b3b24055852192656194c27947bee1736306a/wrapt-2.2.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:518b0c5e323511ec56a38894802ddd5e1222626484e68efe63f201854ad788e5", size = 153699, upload-time = "2026-06-20T23:47:50.177Z" }, + { url = "https://files.pythonhosted.org/packages/01/df/2def7e99d1fe87eea413f95f671924cdddcb08823b1ffd212748dfa6d062/wrapt-2.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4bccea5cdecffa9dd70e343741f0e41e0a16619313d04b72f78bb525162ebcd0", size = 159695, upload-time = "2026-06-20T23:47:51.602Z" }, + { url = "https://files.pythonhosted.org/packages/c7/f6/a906d01a2ce12157bad2404957b3e2140da354b8a70b2fa48bbf282871c0/wrapt-2.2.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:209112cafd963710a05d199aae431d79a28bc76eb8e6d1bbbb8ad24340722cae", size = 152813, upload-time = "2026-06-20T23:47:53.03Z" }, { url = "https://files.pythonhosted.org/packages/02/49/bc0086292d239575b4c08f4cf8a4079fa58abbad58ec23abf84833a283ed/wrapt-2.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e5a5290e4bf2f332fc29ce72ffb9a2fff678aaac047e2e9f5f7165cd7792e099", size = 158809, upload-time = "2026-06-20T23:47:54.391Z" }, { url = "https://files.pythonhosted.org/packages/55/83/8fbd034de1f3e907edaa18786d5dd8f6932874edee0826c7cecb5cab03a1/wrapt-2.2.2-cp311-cp311-win32.whl", hash = "sha256:5499236ad1dc116012e2a5dd943f3f31af12fce452128e2bbcbd55a7d3d4d14c", size = 77414, upload-time = "2026-06-20T23:47:55.882Z" }, { url = "https://files.pythonhosted.org/packages/7e/9c/23695baa331c6de4e874c3d78b8e0bed92e1d2a274e665b29858f6841672/wrapt-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:8636809939152be6ae20a6cef0fed9fe60f411b47847d0426a826884b469e971", size = 80368, upload-time = "2026-06-20T23:47:57.237Z" }, @@ -4325,6 +4784,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2a/85/180b40628b23772692a0c76e8030114e1c0ae068470ed531919f0a5f2a4a/wrapt-2.2.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8417fd3c674d3c8023d080292d29301531a12daf8bd938dd419710dd2f464f2b", size = 81484, upload-time = "2026-06-20T23:47:59.924Z" }, { url = "https://files.pythonhosted.org/packages/94/f2/21c90f2a16689702e2aaff45795b11018dff2c9b1242bac10d225483f676/wrapt-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e7070c7472582e31af3dfc2622b2381a0df7435110a9388ed8db5ffbce67efb", size = 82151, upload-time = "2026-06-20T23:48:01.303Z" }, { url = "https://files.pythonhosted.org/packages/5f/b3/7e6e9fcf4fe7e1b69a49fe6cc5a44e8224bab6283c5233c97e132f14908e/wrapt-2.2.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2e096c9d39a59b35b63c9aacfbbbec2088ff51ff1fc31051acc60a07f42f273a", size = 169828, upload-time = "2026-06-20T23:48:02.719Z" }, + { url = "https://files.pythonhosted.org/packages/0b/43/894f132d857ed5a9904d937baf368badcbe5ea9e436e2f1930fe21c9f1f0/wrapt-2.2.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d1a6050405bf334be33bf66296f113563622972a34900ae6fa60fd283a1a900", size = 171544, upload-time = "2026-06-20T23:48:04.266Z" }, + { url = "https://files.pythonhosted.org/packages/29/de/3c833e03725b477e9ea34028224dd21a48781830101e4e036f77e8b6b102/wrapt-2.2.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:10adb01371408c6de504a6658b9886480f1a4919a83752748a387a504a21df79", size = 160663, upload-time = "2026-06-20T23:48:05.708Z" }, + { url = "https://files.pythonhosted.org/packages/33/be/27edce350b24e3054d9d047f65f16d4c4d4c1f3f31c4278a1f8a95c723c8/wrapt-2.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3442eee2a5798f9b451f1b2cd7518ce8b7e28a2a364696c414460a0e295c012a", size = 169387, upload-time = "2026-06-20T23:48:07.243Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c4/9fd9679af8bf38e146652c7f47b6b352c3e5795b4ad1c0b7f94e15ac2aa7/wrapt-2.2.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:6c99012a22f735a85eed7c4b86a3e99c30fdd57d9e115b2b45f796264b58d0bf", size = 158849, upload-time = "2026-06-20T23:48:08.91Z" }, { url = "https://files.pythonhosted.org/packages/bc/c2/aa6c0c2206803068c6859dabe01f8c84c43744da93d4c67b8946d21655ee/wrapt-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3b686cfc008776a3952d6213cb296ed7f45d782a8453936406faa89eac0835ab", size = 168147, upload-time = "2026-06-20T23:48:10.374Z" }, { url = "https://files.pythonhosted.org/packages/42/63/3eb25da41049d20ae18fcab2dd8b056e02387c4bfa626cbdfb7c3b872e4f/wrapt-2.2.2-cp312-cp312-win32.whl", hash = "sha256:ef2cce266b5b0b07e19fa82e59673b81142b7a3607c8ed1254113d048ed668da", size = 77734, upload-time = "2026-06-20T23:48:11.769Z" }, { url = "https://files.pythonhosted.org/packages/da/09/0390e008a305360948fa9ce69507d041ac12cb2ee5d28e34467e2ee79391/wrapt-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:abf8c20a2d72ee69e16328b3c91342c446e723bfe48bfcc4dded3b9722ac027f", size = 80585, upload-time = "2026-06-20T23:48:13.117Z" }, From ab9359520fa06aae9064e4cbc5a007b33c309a44 Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Fri, 17 Jul 2026 05:14:00 +0200 Subject: [PATCH 10/25] fix(flux2): disambiguate dev/Klein VAE recall by model variant MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The dev-vs-Klein VAE recall keyed off the presence of a mistral_encoder metadata field, but that field is only written when a standalone Mistral encoder is selected. A FLUX.2 [dev] image whose encoder came from a Diffusers source has a vae field but no mistral_encoder, so its VAE was silently recalled into the Klein slice. Resolve the image's own main model and check variant === 'dev' instead — the same signal the graph builder uses. Add regression coverage for the mistral_encoder-absent dev case, and add the missing modelManager.flux2Dev* i18n keys so the [dev] VAE/encoder labels are translatable. --- invokeai/frontend/web/public/locales/en.json | 6 ++ .../src/features/metadata/parsing.test.tsx | 67 ++++++++++++++----- .../web/src/features/metadata/parsing.tsx | 38 +++++++---- 3 files changed, 80 insertions(+), 31 deletions(-) diff --git a/invokeai/frontend/web/public/locales/en.json b/invokeai/frontend/web/public/locales/en.json index 42ee7991560..ef68f900d79 100644 --- a/invokeai/frontend/web/public/locales/en.json +++ b/invokeai/frontend/web/public/locales/en.json @@ -1378,6 +1378,12 @@ "flux2KleinQwen3Encoder": "Qwen3 Encoder (optional)", "flux2KleinQwen3EncoderPlaceholder": "From diffusers model", "flux2KleinQwen3EncoderNoModelPlaceholder": "No diffusers model available", + "flux2DevVae": "FLUX.2 [dev] VAE", + "flux2DevVaePlaceholder": "Auto (from Diffusers source)", + "flux2DevVaeNoModelPlaceholder": "Select a FLUX.2 VAE model", + "flux2DevMistralEncoder": "FLUX.2 [dev] Mistral Encoder", + "flux2DevMistralEncoderPlaceholder": "Auto (from Diffusers source)", + "flux2DevMistralEncoderNoModelPlaceholder": "Select a Mistral text encoder", "qwenImageComponentSource": "VAE/Encoder Source (Diffusers)", "qwenImageComponentSourcePlaceholder": "GGUF models require this unless a standalone VAE & Encoder is installed", "qwenImageVae": "VAE", diff --git a/invokeai/frontend/web/src/features/metadata/parsing.test.tsx b/invokeai/frontend/web/src/features/metadata/parsing.test.tsx index 0cd7122b8d6..d417793585b 100644 --- a/invokeai/frontend/web/src/features/metadata/parsing.test.tsx +++ b/invokeai/frontend/web/src/features/metadata/parsing.test.tsx @@ -31,8 +31,26 @@ const fakeModel = (type: 'vae' | 'qwen3_encoder' | 'mistral_encoder', base: stri type, }); +// FLUX.2 main-model config. The `variant` is what the dev-vs-Klein VAE +// disambiguation resolves against (`dev` => [dev], `klein_*` => Klein), mirroring +// the graph builder's `isFlux2Dev = model.variant === 'dev'`. +const fakeMainModel = (variant: 'dev' | 'klein_9b') => ({ + key: 'main-key', + hash: 'main-hash', + name: `FLUX.2 ${variant}`, + base: 'flux2', + type: 'main', + variant, +}); + let nextResolved: ReturnType = fakeModel('vae', 'flux2'); +// Registry consulted by the store's `dispatch` mock, keyed by the model key that +// `getModelConfig.initiate` was called with. Lets a single test resolve both a +// VAE lookup (`vae-key`) and the image's main model (`main-key`) to distinct +// configs. Unregistered keys fall back to `nextResolved`. +let modelRegistry: Record = {}; + vi.mock('services/api/endpoints/models', async (importOriginal) => { const mod = await importOriginal(); return { @@ -49,8 +67,8 @@ vi.mock('services/api/endpoints/models', async (importOriginal) => { const makeStore = (): AppStore => ({ - dispatch: vi.fn(() => ({ - unwrap: () => Promise.resolve(nextResolved), + dispatch: vi.fn((action: { key?: string }) => ({ + unwrap: () => Promise.resolve((action?.key && modelRegistry[action.key]) || nextResolved), })), getState: () => ({}), }) as unknown as AppStore; @@ -58,16 +76,21 @@ const makeStore = (): AppStore => beforeEach(() => { currentBase = 'flux2'; nextResolved = fakeModel('vae', 'flux2'); + modelRegistry = {}; }); describe('ImageMetadataHandlers — Klein recall gating', () => { describe('KleinVAEModel', () => { - it('parses metadata.vae for Klein images (no mistral_encoder field) when base is flux2', async () => { + it('parses metadata.vae for Klein images (main model variant klein_*) when base is flux2', async () => { currentBase = 'flux2'; nextResolved = fakeModel('vae', 'flux2'); + modelRegistry['main-key'] = fakeMainModel('klein_9b'); const store = makeStore(); - const parsed = await ImageMetadataHandlers.KleinVAEModel.parse({ vae: nextResolved }, store); + const parsed = await ImageMetadataHandlers.KleinVAEModel.parse( + { vae: nextResolved, model: fakeMainModel('klein_9b') }, + store + ); expect(parsed.key).toBe('vae-key'); expect(parsed.type).toBe('vae'); @@ -78,31 +101,38 @@ describe('ImageMetadataHandlers — Klein recall gating', () => { nextResolved = fakeModel('vae', 'flux2'); const store = makeStore(); - await expect(ImageMetadataHandlers.KleinVAEModel.parse({ vae: nextResolved }, store)).rejects.toThrow(); + await expect( + ImageMetadataHandlers.KleinVAEModel.parse({ vae: nextResolved, model: fakeMainModel('klein_9b') }, store) + ).rejects.toThrow(); }); - it('rejects FLUX.2 [dev] images (mistral_encoder field present)', async () => { + it('rejects FLUX.2 [dev] images (main model variant dev) even without a mistral_encoder field', async () => { + // Regression: a [dev] image whose encoder came from a Diffusers source has + // a `vae` field but NO `mistral_encoder`. It must still be recognized as + // [dev] (via the main model variant) and NOT recalled into the Klein slice. currentBase = 'flux2'; nextResolved = fakeModel('vae', 'flux2'); + modelRegistry['main-key'] = fakeMainModel('dev'); const store = makeStore(); await expect( - ImageMetadataHandlers.KleinVAEModel.parse( - { vae: nextResolved, mistral_encoder: fakeModel('mistral_encoder', 'flux2') }, - store - ) + ImageMetadataHandlers.KleinVAEModel.parse({ vae: nextResolved, model: fakeMainModel('dev') }, store) ).rejects.toThrow(); }); }); describe('Flux2DevVAEModel', () => { - it('parses metadata.vae for [dev] images (mistral_encoder field present)', async () => { + it('parses metadata.vae for [dev] images (main model variant dev) even without a mistral_encoder field', async () => { + // The dev VAE must recall from a [dev] image regardless of whether a + // standalone Mistral encoder was selected (Diffusers-sourced encoders + // write no `mistral_encoder` metadata). currentBase = 'flux2'; nextResolved = fakeModel('vae', 'flux2'); + modelRegistry['main-key'] = fakeMainModel('dev'); const store = makeStore(); const parsed = await ImageMetadataHandlers.Flux2DevVAEModel.parse( - { vae: nextResolved, mistral_encoder: fakeModel('mistral_encoder', 'flux2') }, + { vae: nextResolved, model: fakeMainModel('dev') }, store ); @@ -110,24 +140,25 @@ describe('ImageMetadataHandlers — Klein recall gating', () => { expect(parsed.type).toBe('vae'); }); - it('rejects Klein images (no mistral_encoder field)', async () => { + it('rejects Klein images (main model variant klein_*)', async () => { currentBase = 'flux2'; nextResolved = fakeModel('vae', 'flux2'); + modelRegistry['main-key'] = fakeMainModel('klein_9b'); const store = makeStore(); - await expect(ImageMetadataHandlers.Flux2DevVAEModel.parse({ vae: nextResolved }, store)).rejects.toThrow(); + await expect( + ImageMetadataHandlers.Flux2DevVAEModel.parse({ vae: nextResolved, model: fakeMainModel('klein_9b') }, store) + ).rejects.toThrow(); }); it('rejects when base is not flux2', async () => { currentBase = 'sdxl'; nextResolved = fakeModel('vae', 'flux2'); + modelRegistry['main-key'] = fakeMainModel('dev'); const store = makeStore(); await expect( - ImageMetadataHandlers.Flux2DevVAEModel.parse( - { vae: nextResolved, mistral_encoder: fakeModel('mistral_encoder', 'flux2') }, - store - ) + ImageMetadataHandlers.Flux2DevVAEModel.parse({ vae: nextResolved, model: fakeMainModel('dev') }, store) ).rejects.toThrow(); }); }); diff --git a/invokeai/frontend/web/src/features/metadata/parsing.tsx b/invokeai/frontend/web/src/features/metadata/parsing.tsx index 0e6124e2a75..1b6b3af6c60 100644 --- a/invokeai/frontend/web/src/features/metadata/parsing.tsx +++ b/invokeai/frontend/web/src/features/metadata/parsing.tsx @@ -1199,6 +1199,25 @@ const AnimaQwen3EncoderModel: SingleMetadataHandler = { }; //#endregion AnimaQwen3EncoderModel +/** + * FLUX.2 Klein and FLUX.2 [dev] both have base `flux2` and write their VAE + * under `metadata.vae`, so the two VAE handlers must disambiguate which slice + * to recall into. We resolve the image's own main model and inspect its + * variant — the same signal the graph builder uses (`isFlux2Dev = + * model.variant === 'dev'`, see buildFLUXGraph.ts). + * + * We must NOT key off the presence of `mistral_encoder`/`qwen3_encoder`: those + * fields are written only when a *standalone* encoder was selected, so a dev + * image whose encoder was extracted from a Diffusers source carries neither. + * Keying off `mistral_encoder` presence would silently recall such a dev image's + * VAE into the Klein slice (the exact cross-contamination this guards against). + */ +const isFlux2DevMetadata = async (metadata: unknown, store: AppStore): Promise => { + const identifier = zModelIdentifierField.parse(getProperty(metadata, 'model')); + const config = await resolveModel(identifier, store); + return config.base === 'flux2' && 'variant' in config && config.variant === 'dev'; +}; + //#region KleinVAEModel const KleinVAEModel: SingleMetadataHandler = { [SingleMetadataKey]: true, @@ -1207,17 +1226,13 @@ const KleinVAEModel: SingleMetadataHandler = { const raw = getProperty(metadata, 'vae'); const parsed = await parseModelIdentifier(raw, store, 'vae'); assert(parsed.type === 'vae'); - // FLUX.2 Klein and FLUX.2 [dev] both have base `flux2` and write the VAE - // under `metadata.vae`. They use the presence of `mistral_encoder` (dev - // only) vs `qwen3_encoder` (Klein only) as a distinguisher so each VAE - // handler dispatches into its own slice. const base = selectBase(store.getState()); assert(base === 'flux2', 'KleinVAEModel handler only works with FLUX.2 Klein models'); assert( - getProperty(metadata, 'mistral_encoder') === undefined, - 'KleinVAEModel does not handle FLUX.2 [dev] images (mistral_encoder present)' + !(await isFlux2DevMetadata(metadata, store)), + 'KleinVAEModel does not handle FLUX.2 [dev] images (main model variant is `dev`)' ); - return Promise.resolve(parsed); + return parsed; }, recall: (value, store) => { store.dispatch(kleinVaeModelSelected(value)); @@ -1240,14 +1255,11 @@ const Flux2DevVAEModel: SingleMetadataHandler = { assert(parsed.type === 'vae'); const base = selectBase(store.getState()); assert(base === 'flux2', 'Flux2DevVAEModel handler only works with FLUX.2 models'); - // FLUX.2 [dev] images always carry a `mistral_encoder` field; Klein images - // carry `qwen3_encoder` instead. This is the disambiguator that keeps dev's - // VAE recall from clobbering Klein's slice (and vice versa). assert( - getProperty(metadata, 'mistral_encoder') !== undefined, - 'Flux2DevVAEModel handler only fires on FLUX.2 [dev] images (mistral_encoder must be present)' + await isFlux2DevMetadata(metadata, store), + 'Flux2DevVAEModel handler only fires on FLUX.2 [dev] images (main model variant is `dev`)' ); - return Promise.resolve(parsed); + return parsed; }, recall: (value, store) => { store.dispatch(flux2DevVaeModelSelected(value)); From 1dca0ef92d7c482d6c3723f580511fe6d8145421 Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Fri, 17 Jul 2026 05:56:30 +0200 Subject: [PATCH 11/25] fix(flux2): pass prompt as text= keyword to Mistral processor The diffusers FLUX.2-dev text encoder loads a PixtralProcessor, whose first positional __call__ parameter is `images`, not `text`. Passing the prompt positionally routed it into `images`, breaking the diffusers encoder path (only single-file/GGUF encoders, which use a text-first adapter, had been exercised). Pass text= explicitly. --- invokeai/app/invocations/flux2_dev_text_encoder.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/invokeai/app/invocations/flux2_dev_text_encoder.py b/invokeai/app/invocations/flux2_dev_text_encoder.py index 049070f1fcb..43646b2ab3c 100644 --- a/invokeai/app/invocations/flux2_dev_text_encoder.py +++ b/invokeai/app/invocations/flux2_dev_text_encoder.py @@ -167,8 +167,15 @@ def _encode_prompt(self, context: InvocationContext, exit_stack: ExitStack) -> t if hasattr(tokenizer, "padding_side"): tokenizer.padding_side = "left" + # Pass the prompt as the `text=` keyword, NOT positionally: the diffusers + # FLUX.2-dev encoder loads a `PixtralProcessor`, whose first positional + # parameter is `images` (`__call__(self, images=None, text=None, ...)`). + # A positional `proc(text, ...)` would route the prompt string into + # `images` and process it as an image. The `text` keyword is correct for + # all three processors we can land on (PixtralProcessor, a plain HF + # tokenizer, and our `_TekkenRawTextAdapter`). inputs = proc( - text, + text=text, return_tensors="pt", padding="max_length", padding_side="left", From 6979c48c9f56fbdb4103af58e6b0f6eec66233ec Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Fri, 17 Jul 2026 06:10:35 +0200 Subject: [PATCH 12/25] fix(flux2): pass prompt as text= keyword to Mistral processor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The diffusers FLUX.2-dev text encoder loads a PixtralProcessor, whose first positional __call__ parameter is `images`, not `text`. Passing the prompt positionally raised "Incorrect image source", breaking the diffusers encoder path entirely. Only single-file/GGUF encoders (text-first adapter) had been exercised. Verified against transformers 5.5.4. fix(flux2): emit Tekken special tokens in the embedded-tokenizer adapter _TekkenRawTextAdapter used mistral_common's raw Tekkenizer.encode, which runs with SpecialTokenPolicy.IGNORE and BPE-encodes the FLUX.2 markers ([SYSTEM_PROMPT], [/SYSTEM_PROMPT], [INST], [/INST]) as literal text — 54 tokens instead of 36, corrupting the prompt structure fed to FLUX.2 on the single-file and GGUF paths. Resolve the marker ids from the tokenizer's special vocab and splice them in; output is now byte-identical to the reference PixtralProcessor. --- .../load/model_loaders/mistral_encoder.py | 69 ++++++++++++++++--- 1 file changed, 60 insertions(+), 9 deletions(-) diff --git a/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py b/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py index de39368a954..3d845567fdb 100644 --- a/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py +++ b/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py @@ -13,6 +13,7 @@ tokenizer from ``black-forest-labs/FLUX.2-dev`` via HuggingFace. """ +import re from pathlib import Path from typing import Any, Optional @@ -360,25 +361,75 @@ class _TekkenRawTextAdapter: _BOS_ID = 1 # _PAD_ID = 11 # + # FLUX.2 [dev]'s template structural markers. These are Tekken *special + # tokens* (single ids), but mistral_common's raw ``Tekkenizer.encode`` runs + # with ``SpecialTokenPolicy.IGNORE``, so it BPE-encodes them as literal text + # (e.g. ``[SYSTEM_PROMPT]`` → ``['[','SY','STEM','_PRO','MP','T',']']``). We + # resolve their ids up front and splice them in during ``_encode`` so the + # sequence matches the reference PixtralProcessor byte-for-byte. + _SPECIAL_MARKERS = ("[SYSTEM_PROMPT]", "[/SYSTEM_PROMPT]", "[INST]", "[/INST]") + def __init__(self, mistral_tokenizer: Any): self._tok = mistral_tokenizer self.pad_token_id = self._PAD_ID + self._inner = getattr(getattr(mistral_tokenizer, "instruct_tokenizer", None), "tokenizer", None) + self._special_ids = self._resolve_special_ids() + + def _resolve_special_ids(self) -> dict[str, int]: + """Map each FLUX.2 structural marker to its Tekken special-token id. + + Returns an empty dict if the inner tokenizer doesn't expose a special + vocab, in which case ``_encode`` falls back to the plain raw encode. + """ + inner = self._inner + if inner is None: + return {} + rev = getattr(inner, "_special_tokens_reverse_vocab", None) + out: dict[str, int] = {} + for marker in self._SPECIAL_MARKERS: + mid: Any = None + if isinstance(rev, dict): + mid = rev.get(marker) + if mid is None: + try: + tok = inner.get_special_token(marker) + mid = getattr(tok, "id", tok) + except Exception: + mid = None + if isinstance(mid, int): + out[marker] = mid + return out def _encode(self, text: str) -> list[int]: - """Encode raw text via the underlying Tekkenizer (adds BOS, no EOS). + """Encode the FLUX.2 template, emitting structural markers as their Tekken + special-token ids (not literal BPE) so the ids match ComfyUI / the BFL + PixtralProcessor. Adds BOS, no EOS. ``mistral_common`` exposes the BPE under ``MistralTokenizer.instruct_tokenizer.tokenizer`` (the inner Tekkenizer). - Different mistral-common versions name the encode entrypoint slightly - differently; we try the documented one first and fall back to the - wrapper's own encode method. """ - inner = getattr(getattr(self._tok, "instruct_tokenizer", None), "tokenizer", None) - if inner is not None and hasattr(inner, "encode"): - # Tekkenizer.encode(text, bos: bool, eos: bool) → list[int] + inner = self._inner + if inner is None or not hasattr(inner, "encode"): + # Older mistral-common releases expose .encode on the top-level wrapper. + return list(self._tok.encode(text, add_bos=True, add_eos=False)) + if not self._special_ids: + # No special vocab available — raw encode (markers become literal BPE). return list(inner.encode(text, bos=True, eos=False)) - # Older mistral-common releases expose .encode on the top-level wrapper. - return list(self._tok.encode(text, add_bos=True, add_eos=False)) + + # Split on the markers (longest-first so `[/SYSTEM_PROMPT]` wins over + # `[SYSTEM_PROMPT]`), splice special ids, BPE-encode the plain segments. + markers = sorted(self._special_ids, key=len, reverse=True) + pattern = "(" + "|".join(re.escape(m) for m in markers) + ")" + ids: list[int] = [self._BOS_ID] + for part in re.split(pattern, text): + if not part: + continue + special = self._special_ids.get(part) + if special is not None: + ids.append(special) + else: + ids.extend(inner.encode(part, bos=False, eos=False)) + return ids def __call__( self, From 8964c5c43378358f7c68c908852a413e2936e2a8 Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Fri, 17 Jul 2026 06:27:29 +0200 Subject: [PATCH 13/25] Add FLux2.dev to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6eb4349acdd..dc1dac2440e 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,7 @@ Invoke features an organized gallery system for easily storing, accessing, and r - Flux.1 Krea - Flux Redux - Flux Fill +- Flux.2 Dev - Flux.2 Klein 4B - Flux.2 Klein 9B - Z-Image Turbo From 62a80dedd43800d4a04cfc2fbe8a6623ce6c503e Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Wed, 22 Jul 2026 08:19:06 +0200 Subject: [PATCH 14/25] =?UTF-8?q?fix(flux2-dev):=20address=20review=20?= =?UTF-8?q?=E2=80=94=20regional=20guidance,=20model=20classification,=20Lo?= =?UTF-8?q?RA=20guards,=20encoder=20probes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Wire FLUX.2 [dev] regional guidance through addRegions instead of dropping it silently - Require pipeline layout for Main_Diffusers_Flux2_Config so transformer-only checkouts don't register as broken main models - Reject Klein<->dev LoRA cross-wiring on both frontend (variant filter) and backend (loaders raise) - Discriminate non-Mistral GGUFs via vocab-size floor; accept text_encoder.-prefixed encoder layouts at probe time - Dequantize fp8 checkpoints per-tensor to target dtype and drop lm_head before casting (avoid whole-dict fp32 peak) - Raise on unexpected Mistral layer count instead of inventing extraction indices - Fail Klein VAE recall closed when the main model is unresolvable - Add missing modelManager.mistralEncoder i18n key - Dedup: single-pass GGUF metadata read, consistent norm materialization, cat-based conditioning, drop redundant t() defaultValues --- .../app/invocations/flux2_dev_lora_loader.py | 51 ++++++------ .../app/invocations/flux2_dev_text_encoder.py | 34 ++++---- .../invocations/flux2_klein_lora_loader.py | 28 ++++++- .../backend/model_manager/configs/main.py | 15 ++++ .../model_manager/configs/mistral_encoder.py | 82 +++++++++++++++---- .../load/model_loaders/mistral_encoder.py | 78 +++++++++++++----- invokeai/frontend/web/public/locales/en.json | 1 + .../web/src/features/metadata/parsing.tsx | 15 +++- .../util/graph/generation/addFlux2DevLoRAs.ts | 19 ++++- .../graph/generation/addFlux2KleinLoRAs.ts | 16 +++- .../nodes/util/graph/generation/addRegions.ts | 19 ++++- .../util/graph/generation/buildFLUXGraph.ts | 34 +++++++- .../Advanced/ParamFlux2DevModelSelect.tsx | 16 ++-- 13 files changed, 307 insertions(+), 101 deletions(-) diff --git a/invokeai/app/invocations/flux2_dev_lora_loader.py b/invokeai/app/invocations/flux2_dev_lora_loader.py index a87d3b9a054..2e656defae0 100644 --- a/invokeai/app/invocations/flux2_dev_lora_loader.py +++ b/invokeai/app/invocations/flux2_dev_lora_loader.py @@ -24,6 +24,25 @@ from invokeai.backend.model_manager.taxonomy import BaseModelType, Flux2VariantType, ModelType +def _assert_dev_lora(context: InvocationContext, lora_config) -> None: + """Reject a non-dev FLUX.2 LoRA applied via the FLUX.2 [dev] loaders. + + A Klein LoRA (hidden 3072/4096) applied to a dev transformer/encoder (hidden 5120/6144) + is guaranteed to raise a shape-mismatch ``RuntimeError`` partway through denoise. Fail + fast here with an actionable message instead. This is independent of *which* input the + LoRA is wired to — the mismatch happens on whichever module it patches — so the check + is not gated on the transformer being connected. The frontend also filters these out + before they reach the graph (see ``addFlux2DevLoRAs``); this is the backend backstop for + hand-built workflow graphs. + """ + lora_variant = getattr(lora_config, "variant", None) + if lora_variant is not None and lora_variant != Flux2VariantType.Dev: + raise ValueError( + f"LoRA '{lora_config.name}' is a {lora_variant.value} LoRA and cannot be applied via the " + "FLUX.2 [dev] loader. Use the FLUX.2 Klein LoRA loader for Klein LoRAs." + ) + + @invocation_output("flux2_dev_lora_loader_output") class Flux2DevLoRALoaderOutput(BaseInvocationOutput): """FLUX.2 [dev] LoRA loader output.""" @@ -73,23 +92,10 @@ def invoke(self, context: InvocationContext) -> Flux2DevLoRALoaderOutput: raise ValueError(f"Unknown lora: {lora_key}!") lora_config = context.models.get_config(lora_key) - lora_variant = getattr(lora_config, "variant", None) - - # Warn if LoRA variant doesn't match transformer variant. A Klein LoRA on a - # dev transformer is virtually guaranteed to produce shape errors. - if lora_variant and self.transformer is not None: - transformer_config = context.models.get_config(self.transformer.transformer.key) - transformer_variant = getattr(transformer_config, "variant", None) - if transformer_variant and lora_variant != transformer_variant: - context.logger.warning( - f"LoRA variant mismatch: LoRA '{lora_config.name}' is for {lora_variant.value} " - f"but transformer is {transformer_variant.value}. This may cause shape errors." - ) - if lora_variant != Flux2VariantType.Dev: - context.logger.warning( - f"LoRA '{lora_config.name}' is a {lora_variant.value} LoRA but is being applied " - "via the FLUX.2 [dev] loader. Use the Klein loader for Klein LoRAs." - ) + + # Reject variant-mismatched LoRAs regardless of which input they're wired to. A Klein + # LoRA on a dev transformer/encoder is guaranteed to shape-error during denoise. + _assert_dev_lora(context, lora_config) # Check for duplicate keys. if self.transformer and any(existing.lora.key == lora_key for existing in self.transformer.loras): @@ -156,15 +162,8 @@ def invoke(self, context: InvocationContext) -> Flux2DevLoRALoaderOutput: assert lora.lora.base in (BaseModelType.Flux, BaseModelType.Flux2) lora_config = context.models.get_config(lora.lora.key) - lora_variant = getattr(lora_config, "variant", None) - if lora_variant and self.transformer is not None: - transformer_config = context.models.get_config(self.transformer.transformer.key) - transformer_variant = getattr(transformer_config, "variant", None) - if transformer_variant and lora_variant != transformer_variant: - context.logger.warning( - f"LoRA variant mismatch: LoRA '{lora_config.name}' is for {lora_variant.value} " - f"but transformer is {transformer_variant.value}. This may cause shape errors." - ) + # Reject variant-mismatched LoRAs, matching the single-LoRA loader above. + _assert_dev_lora(context, lora_config) added_loras.append(lora.lora.key) diff --git a/invokeai/app/invocations/flux2_dev_text_encoder.py b/invokeai/app/invocations/flux2_dev_text_encoder.py index 43646b2ab3c..9274fc15488 100644 --- a/invokeai/app/invocations/flux2_dev_text_encoder.py +++ b/invokeai/app/invocations/flux2_dev_text_encoder.py @@ -203,21 +203,27 @@ def _encode_prompt(self, context: InvocationContext, exit_stack: ExitStack) -> t "Ensure output_hidden_states=True is supported by this model." ) num_hidden_states = len(outputs.hidden_states) # = num_hidden_layers + 1 (embedding output) + num_layers = num_hidden_states - 1 + + # The standalone Mistral encoder loaders only accept 30-layer cow or 40-layer + # Mistral Small 3 weights, so hidden_states[] should always contain the layers + # FLUX.2 [dev]'s joint attention was trained to read (10/20/30). A text encoder + # extracted from a Main_Diffusers_Flux2 pipeline, however, is loaded via generic + # from_pretrained with no layer-count validation — so a nonstandard pipeline with + # a <30-layer encoder could reach here. Fail loudly instead of inventing extraction + # indices that would silently produce off-distribution (degraded) embeddings. + if num_layers < max(DEV_EXTRACTION_LAYERS): + raise RuntimeError( + f"Mistral encoder returned only {num_layers} hidden layer(s), but FLUX.2 [dev] reads " + f"layers {DEV_EXTRACTION_LAYERS} and requires at least {max(DEV_EXTRACTION_LAYERS)}. " + "This is not a supported FLUX.2 [dev] text encoder." + ) + extraction_layers = DEV_EXTRACTION_LAYERS - # Safety check: the model loaders only accept 30-layer cow weights, so - # hidden_states[] should have ≥ 31 entries (embedding output + 30 layers). - # Fall back to a scaled tuple only if a non-cow encoder somehow slipped - # past the loaders, so we don't crash with an IndexError. - if num_hidden_states - 1 < max(DEV_EXTRACTION_LAYERS): - n = num_hidden_states - 1 - extraction_layers = (max(1, n // 3), max(1, (2 * n) // 3), n) - else: - extraction_layers = DEV_EXTRACTION_LAYERS - - stacked = torch.stack([outputs.hidden_states[i] for i in extraction_layers], dim=1) - # stacked: (B, 3, seq, hidden_size) -> (B, seq, 3 * hidden_size) - batch_size, num_layers, seq_len, hidden_dim = stacked.shape - prompt_embeds = stacked.permute(0, 2, 1, 3).reshape(batch_size, seq_len, num_layers * hidden_dim) + # Concatenate the selected layers along the hidden dim: (B, seq, 3 * hidden_size). + # This is byte-identical to stack(dim=1).permute(0,2,1,3).reshape(...) but avoids + # the two intermediate full copies that stack + permute-reshape would allocate. + prompt_embeds = torch.cat([outputs.hidden_states[i] for i in extraction_layers], dim=-1) prompt_embeds = prompt_embeds.to(dtype=text_encoder.dtype, device=device) return prompt_embeds diff --git a/invokeai/app/invocations/flux2_klein_lora_loader.py b/invokeai/app/invocations/flux2_klein_lora_loader.py index 64df3a82585..c138ade0393 100644 --- a/invokeai/app/invocations/flux2_klein_lora_loader.py +++ b/invokeai/app/invocations/flux2_klein_lora_loader.py @@ -16,7 +16,23 @@ from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField from invokeai.app.invocations.model import LoRAField, ModelIdentifierField, Qwen3EncoderField, TransformerField from invokeai.app.services.shared.invocation_context import InvocationContext -from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType +from invokeai.backend.model_manager.taxonomy import BaseModelType, Flux2VariantType, ModelType + + +def _assert_not_dev_lora(context: InvocationContext, lora_config) -> None: + """Reject a FLUX.2 [dev] LoRA applied via the FLUX.2 Klein loaders. + + A dev LoRA (hidden 5120/6144) on a Klein transformer/encoder (hidden 3072/4096) is + guaranteed to raise a shape-mismatch ``RuntimeError`` during denoise. Fail fast here, + independent of which input the LoRA is wired to. (The frontend filters these out before + they reach the graph; this is the backstop for hand-built workflow graphs.) Intra-Klein + 4B-vs-9B mismatches remain a soft warning below. + """ + if getattr(lora_config, "variant", None) == Flux2VariantType.Dev: + raise ValueError( + f"LoRA '{lora_config.name}' is a FLUX.2 [dev] LoRA and cannot be applied via the " + "FLUX.2 Klein LoRA loader. Use the FLUX.2 [dev] LoRA loader for dev LoRAs." + ) @invocation_output("flux2_klein_lora_loader_output") @@ -68,8 +84,11 @@ def invoke(self, context: InvocationContext) -> Flux2KleinLoRALoaderOutput: if not context.models.exists(lora_key): raise ValueError(f"Unknown lora: {lora_key}!") - # Warn if LoRA variant doesn't match transformer variant lora_config = context.models.get_config(lora_key) + # Reject cross-family (dev) LoRAs regardless of which input they're wired to. + _assert_not_dev_lora(context, lora_config) + + # Warn if LoRA variant doesn't match transformer variant (intra-Klein 4B/9B). lora_variant = getattr(lora_config, "variant", None) if lora_variant and self.transformer is not None: transformer_config = context.models.get_config(self.transformer.transformer.key) @@ -167,8 +186,11 @@ def invoke(self, context: InvocationContext) -> Flux2KleinLoRALoaderOutput: "not FLUX.2 Klein models. Ensure you are using a FLUX.2 compatible LoRA." ) - # Warn if LoRA variant doesn't match transformer variant lora_config = context.models.get_config(lora.lora.key) + # Reject cross-family (dev) LoRAs, matching the single-LoRA loader above. + _assert_not_dev_lora(context, lora_config) + + # Warn if LoRA variant doesn't match transformer variant (intra-Klein 4B/9B). lora_variant = getattr(lora_config, "variant", None) if lora_variant and self.transformer is not None: transformer_config = context.models.get_config(self.transformer.transformer.key) diff --git a/invokeai/backend/model_manager/configs/main.py b/invokeai/backend/model_manager/configs/main.py index 67b3b947014..4bb187368f4 100644 --- a/invokeai/backend/model_manager/configs/main.py +++ b/invokeai/backend/model_manager/configs/main.py @@ -851,6 +851,21 @@ def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) - raise_for_override_fields(cls, override_fields) + # A FLUX.2 *main* model is a full diffusers pipeline: a `model_index.json` at + # the root, or at least the transformer packaged as a `transformer/` subfolder. + # A loose transformer-only checkout — just the contents of `transformer/`, with + # a root `config.json` whose `_class_name` is `Flux2Transformer2DModel` — is NOT + # a usable main model: the loader unconditionally appends `vae/` / `text_encoder/` + # subfolders that don't exist and fails with an OSError mid-queue. Reject that + # layout here so it falls through to a non-main classification instead of + # registering as a broken pipeline. (The standalone `transformer/` still matches + # via the pipeline layout below when it ships inside a full folder.) + if not (mod.path / "model_index.json").exists() and not (mod.path / "transformer").exists(): + raise NotAMatchError( + "directory is not a full FLUX.2 pipeline (no model_index.json and no transformer/ subfolder); " + "a loose transformer-only checkout cannot be used as a FLUX.2 main model" + ) + # Check for FLUX.2-specific pipeline class names raise_for_class_name( common_config_paths(mod.path), diff --git a/invokeai/backend/model_manager/configs/mistral_encoder.py b/invokeai/backend/model_manager/configs/mistral_encoder.py index d14f7003f18..77dcf205820 100644 --- a/invokeai/backend/model_manager/configs/mistral_encoder.py +++ b/invokeai/backend/model_manager/configs/mistral_encoder.py @@ -28,13 +28,36 @@ _COW_NUM_LAYERS = 30 _ACCEPTED_NUM_LAYERS = (_COW_NUM_LAYERS, _MISTRAL_24B_NUM_LAYERS) +# Minimum vocab size to accept as a FLUX.2 Mistral encoder. Mistral Small 3's +# Tekken vocab is 131072 (shared by the 30-layer cow distillation). This gates out +# unrelated causal LMs that happen to share the 5120-hidden / 40-layer geometry — +# most notably Llama-2-13B (vocab 32000), which otherwise matches the llama.cpp key +# names and geometry and would install as a Mistral encoder producing garbage. We +# use a floor rather than an exact match to tolerate any vocab padding in GGUF. +_MISTRAL_3_MIN_VOCAB_SIZE = 100000 + +# Wrapper prefixes some FLUX.2 single-file redistributions add to Mistral keys. The +# runtime loader strips these (see ``_strip_known_prefixes`` in the loader); the +# install-time probe below normalizes keys the same way so it recognizes exactly the +# layouts the loader can actually load. +_PROBE_KEY_PREFIXES = ("text_encoder.", "language_model.") + + +def _normalize_probe_key(key: str) -> str: + """Strip a single known wrapper prefix, mirroring the loader's ``_strip_known_prefixes``.""" + for prefix in _PROBE_KEY_PREFIXES: + if key.startswith(prefix): + return key[len(prefix) :] + return key + def _has_mistral_keys(state_dict: dict[str | int, Any]) -> bool: """Check if a state dict looks like a Mistral causal-LM / multimodal model. Supports both: - PyTorch/diffusers/transformers format: model.layers.0., model.embed_tokens.weight - (with optional language_model. prefix for multimodal Mistral3ForConditionalGeneration) + (with optional language_model. / text_encoder. prefixes used by multimodal + Mistral3ForConditionalGeneration and Comfy-Org single-file redistributions) - GGUF/llama.cpp format: blk.0., token_embd.weight """ pytorch_indicators = ( @@ -48,9 +71,10 @@ def _has_mistral_keys(state_dict: dict[str | int, Any]) -> bool: for key in state_dict.keys(): if not isinstance(key, str): continue - if key.startswith(pytorch_indicators): + normalized = _normalize_probe_key(key) + if normalized.startswith(pytorch_indicators): return True - if key.startswith(gguf_indicators): + if normalized.startswith(gguf_indicators): return True return False @@ -70,52 +94,72 @@ def _count_mistral_layers(state_dict: dict[str | int, Any]) -> int: for key in state_dict.keys(): if not isinstance(key, str): continue + normalized = _normalize_probe_key(key) # transformers / diffusers: model.layers.N.* or language_model.model.layers.N.* - if ".layers." in key: - parts = key.split(".layers.", 1)[1].split(".", 1) + if ".layers." in normalized: + parts = normalized.split(".layers.", 1)[1].split(".", 1) if parts and parts[0].isdigit(): indices.add(int(parts[0])) continue # llama.cpp GGUF: blk.N.* - if key.startswith("blk."): - parts = key.split(".", 2) + if normalized.startswith("blk."): + parts = normalized.split(".", 2) if len(parts) >= 2 and parts[1].isdigit(): indices.add(int(parts[1])) return (max(indices) + 1) if indices else 0 -def _embed_hidden_size(state_dict: dict[str | int, Any]) -> int | None: - """Read the embedding hidden size from a Mistral-like state dict. +def _embed_shape(state_dict: dict[str | int, Any]) -> tuple[int, int] | None: + """Read the ``(vocab_size, hidden_size)`` of the embedding tensor, or ``None``. - Returns None if no recognized embedding tensor is present. + Scans keys with the loader's prefix normalization so ``text_encoder.``- / + ``language_model.``-prefixed layouts are recognized too. """ - candidate_keys = ( + candidate_keys = { "model.embed_tokens.weight", "language_model.model.embed_tokens.weight", "token_embd.weight", - ) - for key in candidate_keys: - if key not in state_dict: + } + for key, tensor in state_dict.items(): + if not isinstance(key, str) or _normalize_probe_key(key) not in candidate_keys: continue - tensor = state_dict[key] if isinstance(tensor, GGMLTensor): shape = getattr(tensor, "tensor_shape", None) or getattr(tensor, "shape", None) else: shape = getattr(tensor, "shape", None) if shape is not None and len(shape) >= 2: - return int(shape[1]) + return int(shape[0]), int(shape[1]) return None +def _embed_hidden_size(state_dict: dict[str | int, Any]) -> int | None: + """Read the embedding hidden size from a Mistral-like state dict, or ``None``.""" + shape = _embed_shape(state_dict) + return shape[1] if shape is not None else None + + +def _embed_vocab_size(state_dict: dict[str | int, Any]) -> int | None: + """Read the embedding vocab size from a Mistral-like state dict, or ``None``.""" + shape = _embed_shape(state_dict) + return shape[0] if shape is not None else None + + def _get_mistral_variant_from_state_dict(state_dict: dict[str | int, Any]) -> MistralVariantType | None: """Return the Mistral variant for a state dict, or ``None`` if unrecognized. Recognized variants: - 30-layer + hidden_size=5120 → ``MistralVariantType.Cow`` (BFL distillation) - 40-layer + hidden_size=5120 → ``MistralVariantType.Mistral24B`` (BFL canonical / upstream Mistral Small 3.x) + + The vocab-size floor rejects unrelated causal LMs (e.g. Llama-2-13B) that share + the 5120-hidden / 40-layer geometry and llama.cpp key names but are not Mistral + Small 3 encoders — without it they would install and emit garbage embeddings. """ if _embed_hidden_size(state_dict) != _MISTRAL_3_HIDDEN_SIZE: return None + vocab_size = _embed_vocab_size(state_dict) + if vocab_size is None or vocab_size < _MISTRAL_3_MIN_VOCAB_SIZE: + return None num_layers = _count_mistral_layers(state_dict) if num_layers == _COW_NUM_LAYERS: return MistralVariantType.Cow @@ -251,7 +295,8 @@ def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) - if variant is None: raise NotAMatchError( f"unrecognized Mistral geometry (got hidden_size={_embed_hidden_size(state_dict)}, " - f"layers={_count_mistral_layers(state_dict)}). Expected hidden_size={_MISTRAL_3_HIDDEN_SIZE} " + f"vocab_size={_embed_vocab_size(state_dict)}, layers={_count_mistral_layers(state_dict)}). " + f"Expected hidden_size={_MISTRAL_3_HIDDEN_SIZE}, vocab_size>={_MISTRAL_3_MIN_VOCAB_SIZE} " f"and num_hidden_layers in {_ACCEPTED_NUM_LAYERS}." ) @@ -289,7 +334,8 @@ def from_model_on_disk(cls, mod: ModelOnDisk, override_fields: dict[str, Any]) - if variant is None: raise NotAMatchError( f"unrecognized Mistral geometry (got hidden_size={_embed_hidden_size(state_dict)}, " - f"layers={_count_mistral_layers(state_dict)}). Expected hidden_size={_MISTRAL_3_HIDDEN_SIZE} " + f"vocab_size={_embed_vocab_size(state_dict)}, layers={_count_mistral_layers(state_dict)}). " + f"Expected hidden_size={_MISTRAL_3_HIDDEN_SIZE}, vocab_size>={_MISTRAL_3_MIN_VOCAB_SIZE} " f"and num_hidden_layers in {_ACCEPTED_NUM_LAYERS}." ) diff --git a/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py b/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py index 3d845567fdb..f9ffeff6a1a 100644 --- a/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py +++ b/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py @@ -133,19 +133,8 @@ def _build_mistral_config( ) -def _read_gguf_metadata_value(path: Path, key: str) -> Any | None: - """Read a single named field from a GGUF file's metadata header. - - Returns ``None`` if the key is missing or the file/header can't be read — - callers must treat the return as best-effort and fall back to defaults. - """ - try: - import gguf - - reader = gguf.GGUFReader(path) - except Exception: - return None - field = reader.fields.get(key) +def _decode_gguf_field(field: Any) -> Any | None: + """Decode a single GGUFReader field to a Python scalar, or ``None``.""" if field is None: return None try: @@ -169,6 +158,27 @@ def _read_gguf_metadata_value(path: Path, key: str) -> Any | None: return None +def _read_gguf_metadata_values(path: Path, keys: tuple[str, ...]) -> dict[str, Any]: + """Read several named metadata fields from a GGUF header in a single reader pass. + + Returns an empty dict if the file/header can't be read — callers must treat the + result as best-effort and fall back to defaults. Reading multiple keys with one + ``GGUFReader`` avoids re-parsing the (potentially large) header once per key. + """ + try: + import gguf + + reader = gguf.GGUFReader(path) + except Exception: + return {} + return {key: _decode_gguf_field(reader.fields.get(key)) for key in keys} + + +def _read_gguf_metadata_value(path: Path, key: str) -> Any | None: + """Read a single named field from a GGUF file's metadata header, or ``None``.""" + return _read_gguf_metadata_values(path, (key,)).get(key) + + def _read_gguf_metadata_float(path: Path, key: str) -> float | None: value = _read_gguf_metadata_value(path, key) return float(value) if isinstance(value, (int, float)) else None @@ -236,7 +246,14 @@ def _materialize_remaining_meta_tensors(model: torch.nn.Module, dtype: torch.dty for name, param in list(model.named_parameters()): if not param.is_meta: continue - is_norm = "norm" in name.split(".") or name.endswith("_norm.weight") + # Any RMSNorm weight must init to ones, not zeros. Use the same broad substring + # test as the checkpoint loader's missing-norm loop so both code paths agree — + # e.g. `layers.N.input_layernorm.weight` is a norm. (For MistralModel the only + # params containing "norm" are the layernorms and the final norm, so there are no + # false positives.) The narrower `split('.')`/`endswith('_norm.weight')` test used + # here previously missed `input_layernorm.weight`, zero-filling it on the GGUF path + # where the missing-norm loop doesn't run. + is_norm = "norm" in name new_tensor = torch.ones(param.shape, dtype=dtype) if is_norm else torch.zeros(param.shape, dtype=dtype) parent_name, _, attr = name.rpartition(".") parent = model.get_submodule(parent_name) if parent_name else model @@ -303,12 +320,18 @@ def _warn_if_40_layer_mistral(num_hidden_layers: int, logger: Any) -> None: ) -def _drop_quantization_metadata(sd: dict[str, Any], logger) -> dict[str, Any]: +def _drop_quantization_metadata(sd: dict[str, Any], logger, target_dtype: torch.dtype | None = None) -> dict[str, Any]: """Dequantize Comfy-Org-style FP8/FP4 weights and drop their metadata keys. Comfy-Org's Mistral FLUX.2 redistributions store quantized weights alongside ``*.weight_scale`` (and occasionally ``*.input_scale``) tensors. We apply the scale in-place and remove the metadata so transformers can load the result. + + Dequantization runs in fp32 for numerical accuracy, but each result is cast + back down to ``target_dtype`` immediately (when provided) so the transient peak + is a single fp32 weight at a time rather than the whole dict held at fp32. For a + 24B fp8 encoder that difference is tens of GB — enough to OOM machines that can + otherwise load the model. """ weight_scale_keys = [k for k in sd.keys() if isinstance(k, str) and k.endswith(".weight_scale")] dequantized = 0 @@ -324,7 +347,8 @@ def _drop_quantization_metadata(sd: dict[str, Any], logger) -> dict[str, Any]: block = weight.shape[dim] // scale.shape[dim] if block > 1: scale = scale.repeat_interleave(block, dim=dim) - sd[weight_key] = weight * scale + result = weight * scale + sd[weight_key] = result.to(target_dtype) if target_dtype is not None else result dequantized += 1 if dequantized: logger.info(f"Dequantized {dequantized} Comfy-Org-style quantized weights") @@ -739,7 +763,8 @@ def _load_text_encoder(self, config: MistralEncoder_Checkpoint_Config) -> AnyMod sd = load_file(Path(config.path)) sd = _strip_known_prefixes(sd) - sd = _drop_quantization_metadata(sd, logger) + # Dequantize straight to the compute dtype (per-tensor peak, not whole-dict fp32). + sd = _drop_quantization_metadata(sd, logger, target_dtype=model_dtype) mistral_config = _build_mistral_config(sd, torch_dtype=model_dtype) logger.info( @@ -748,9 +773,17 @@ def _load_text_encoder(self, config: MistralEncoder_Checkpoint_Config) -> AnyMod f"kv_heads={mistral_config.num_key_value_heads}, intermediate={mistral_config.intermediate_size}" ) - # Cast tensors to compute dtype before loading. + # Drop the LM head before casting: it's the single largest tensor (vocab × hidden), + # bare MistralModel doesn't use it, and `_convert_for_bare_mistral_model` drops it + # anyway — casting it first would just waste memory and time. + for k in [k for k in sd.keys() if isinstance(k, str) and k.startswith("lm_head.")]: + del sd[k] + + # Cast remaining tensors to compute dtype before loading. Dequantized weights are + # already at model_dtype; this covers the un-quantized ones (norms, embeddings). for k in list(sd.keys()): - sd[k] = sd[k].to(model_dtype) + if sd[k].dtype != model_dtype: + sd[k] = sd[k].to(model_dtype) # Adapt CausalLM-prefixed keys for bare MistralModel. sd = _convert_for_bare_mistral_model(sd) @@ -836,8 +869,11 @@ def _load_from_gguf(self, config: MistralEncoder_GGUF_Config) -> AnyModel: # they share llama.cpp's architecture family. Falling back silently is OK: # `_build_mistral_config` defaults to Mistral Small 3.1 values when the # override is None. - rope_theta = _read_gguf_metadata_float(Path(config.path), "llama.rope.freq_base") - max_pos = _read_gguf_metadata_int(Path(config.path), "llama.context_length") + gguf_meta = _read_gguf_metadata_values(Path(config.path), ("llama.rope.freq_base", "llama.context_length")) + rope_raw = gguf_meta.get("llama.rope.freq_base") + rope_theta = float(rope_raw) if isinstance(rope_raw, (int, float)) else None + ctx_raw = gguf_meta.get("llama.context_length") + max_pos = int(ctx_raw) if isinstance(ctx_raw, (int, float)) else None if rope_theta is not None: logger.info(f"GGUF metadata: rope_theta={rope_theta}, max_position={max_pos}") diff --git a/invokeai/frontend/web/public/locales/en.json b/invokeai/frontend/web/public/locales/en.json index e361c07c9cb..20381862358 100644 --- a/invokeai/frontend/web/public/locales/en.json +++ b/invokeai/frontend/web/public/locales/en.json @@ -1359,6 +1359,7 @@ "t5Encoder": "T5 Encoder", "qwen3Encoder": "Qwen3 Encoder", "qwenVLEncoder": "Qwen2.5-VL Encoder", + "mistralEncoder": "Mistral Encoder", "animaVae": "VAE", "animaVaePlaceholder": "Select Anima-compatible VAE", "animaQwen3Encoder": "Qwen3 0.6B Encoder", diff --git a/invokeai/frontend/web/src/features/metadata/parsing.tsx b/invokeai/frontend/web/src/features/metadata/parsing.tsx index 1b6b3af6c60..727ef6d132f 100644 --- a/invokeai/frontend/web/src/features/metadata/parsing.tsx +++ b/invokeai/frontend/web/src/features/metadata/parsing.tsx @@ -1213,9 +1213,18 @@ const AnimaQwen3EncoderModel: SingleMetadataHandler = { * VAE into the Klein slice (the exact cross-contamination this guards against). */ const isFlux2DevMetadata = async (metadata: unknown, store: AppStore): Promise => { - const identifier = zModelIdentifierField.parse(getProperty(metadata, 'model')); - const config = await resolveModel(identifier, store); - return config.base === 'flux2' && 'variant' in config && config.variant === 'dev'; + // Return false (rather than throwing) when the image's main model is missing/malformed + // or can no longer be resolved (uninstalled, past the key/hash/name fallbacks). Throwing + // here would reject BOTH the Klein and dev VAE handlers, making the VAE row vanish from + // the metadata viewer and skipping it in recall-all. Failing closed instead lets the + // Klein VAE handler recall as it did before this dev/Klein disambiguation was added. + try { + const identifier = zModelIdentifierField.parse(getProperty(metadata, 'model')); + const config = await resolveModel(identifier, store); + return config.base === 'flux2' && 'variant' in config && config.variant === 'dev'; + } catch { + return false; + } }; //#region KleinVAEModel diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addFlux2DevLoRAs.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addFlux2DevLoRAs.ts index 50c307dc49a..dcc6b9911f2 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addFlux2DevLoRAs.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addFlux2DevLoRAs.ts @@ -2,6 +2,7 @@ import type { RootState } from 'app/store/store'; import { getPrefixedId } from 'features/controlLayers/konva/util'; import { zModelIdentifierField } from 'features/nodes/types/common'; import type { Graph } from 'features/nodes/util/graph/generation/Graph'; +import { modelConfigsAdapterSelectors, selectModelConfigsQuery } from 'services/api/endpoints/models'; import type { Invocation, S } from 'services/api/types'; /** @@ -15,9 +16,21 @@ export const addFlux2DevLoRAs = ( modelLoader: Invocation<'flux2_dev_model_loader'>, textEncoder: Invocation<'flux2_dev_text_encoder'> ): void => { - // Currently all `flux2` LoRAs share a single base value (the variant guard happens - // server-side in the dev LoRA loader, which warns on mismatches). - const enabledLoRAs = state.loras.loras.filter((l) => l.isEnabled && l.model.base === 'flux2'); + // Klein and dev LoRAs both carry `base === 'flux2'`, so a base-only filter would wire a + // Klein LoRA (hidden 3072/4096) into the dev graph → guaranteed shape-mismatch during + // denoise (dev hidden 5120/6144). The bare identifier in the slice carries no variant, so + // resolve each LoRA's config and keep only dev (or unknown-variant) LoRAs. The dev LoRA + // loaders reject a mismatch server-side too (defense in depth for hand-built graphs). + const modelConfigsData = selectModelConfigsQuery(state).data; + const isDevOrUnknownVariant = (key: string): boolean => { + const config = modelConfigsData ? modelConfigsAdapterSelectors.selectById(modelConfigsData, key) : undefined; + const variant = config && 'variant' in config ? config.variant : undefined; + // Fail open when the variant can't be determined; the backend still guards. + return variant === null || variant === undefined || variant === 'dev'; + }; + const enabledLoRAs = state.loras.loras.filter( + (l) => l.isEnabled && l.model.base === 'flux2' && isDevOrUnknownVariant(l.model.key) + ); if (enabledLoRAs.length === 0) { return; } diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addFlux2KleinLoRAs.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addFlux2KleinLoRAs.ts index 48f2632a4fd..ef656f77a89 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addFlux2KleinLoRAs.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addFlux2KleinLoRAs.ts @@ -2,6 +2,7 @@ import type { RootState } from 'app/store/store'; import { getPrefixedId } from 'features/controlLayers/konva/util'; import { zModelIdentifierField } from 'features/nodes/types/common'; import type { Graph } from 'features/nodes/util/graph/generation/Graph'; +import { modelConfigsAdapterSelectors, selectModelConfigsQuery } from 'services/api/endpoints/models'; import type { Invocation, S } from 'services/api/types'; export const addFlux2KleinLoRAs = ( @@ -11,7 +12,20 @@ export const addFlux2KleinLoRAs = ( modelLoader: Invocation<'flux2_klein_model_loader'>, textEncoder: Invocation<'flux2_klein_text_encoder'> ): void => { - const enabledLoRAs = state.loras.loras.filter((l) => l.isEnabled && l.model.base === 'flux2'); + // Klein and dev LoRAs both carry `base === 'flux2'`; a base-only filter would wire a dev + // LoRA (hidden 5120/6144) into the Klein graph → guaranteed shape-mismatch during denoise + // (Klein hidden 3072/4096). The bare identifier carries no variant, so resolve each config + // and drop dev LoRAs here. The Klein LoRA loaders reject dev LoRAs server-side too. + const modelConfigsData = selectModelConfigsQuery(state).data; + const isNotDevVariant = (key: string): boolean => { + const config = modelConfigsData ? modelConfigsAdapterSelectors.selectById(modelConfigsData, key) : undefined; + const variant = config && 'variant' in config ? config.variant : undefined; + // Fail open when the variant can't be determined; the backend still guards. + return variant !== 'dev'; + }; + const enabledLoRAs = state.loras.loras.filter( + (l) => l.isEnabled && l.model.base === 'flux2' && isNotDevVariant(l.model.key) + ); const loraCount = enabledLoRAs.length; if (loraCount === 0) { diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addRegions.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addRegions.ts index a7823ae6ad7..4ba0a4c0ddf 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/addRegions.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/addRegions.ts @@ -88,6 +88,10 @@ export const addRegions = async ({ const isSDXL = model.base === 'sdxl'; const isFLUX = model.base === 'flux'; const isFlux2 = model.base === 'flux2'; + // FLUX.2 Klein uses the Qwen3 encoder; FLUX.2 [dev] uses the Mistral encoder. The region + // conditioning node type must match the main model's encoder. + const isFlux2Dev = isFlux2 && 'variant' in model && model.variant === 'dev'; + const isFlux2Klein = isFlux2 && !isFlux2Dev; const isZImage = model.base === 'z-image'; const isAnima = model.base === 'anima'; @@ -135,6 +139,7 @@ export const addRegions = async ({ | 'sdxl_compel_prompt' | 'flux_text_encoder' | 'flux2_klein_text_encoder' + | 'flux2_dev_text_encoder' | 'z_image_text_encoder' | 'anima_text_encoder' >; @@ -151,7 +156,13 @@ export const addRegions = async ({ id: getPrefixedId('prompt_region_positive_cond'), prompt: region.positivePrompt, }); - } else if (isFlux2) { + } else if (isFlux2Dev) { + regionalPosCond = g.addNode({ + type: 'flux2_dev_text_encoder', + id: getPrefixedId('prompt_region_positive_cond'), + prompt: region.positivePrompt, + }); + } else if (isFlux2Klein) { regionalPosCond = g.addNode({ type: 'flux2_klein_text_encoder', id: getPrefixedId('prompt_region_positive_cond'), @@ -205,6 +216,12 @@ export const addRegions = async ({ clone.destination.node_id = regionalPosCond.id; g.addEdgeFromObj(clone); } + } else if (posCond.type === 'flux2_dev_text_encoder') { + for (const edge of g.getEdgesTo(posCond, ['mistral_encoder', 'max_seq_len', 'mask'])) { + const clone = deepClone(edge); + clone.destination.node_id = regionalPosCond.id; + g.addEdgeFromObj(clone); + } } else if (posCond.type === 'z_image_text_encoder') { for (const edge of g.getEdgesTo(posCond, ['qwen3_encoder', 'mask'])) { const clone = deepClone(edge); diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts index 5333037a8e5..507276f3125 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts @@ -190,6 +190,11 @@ export const buildFLUXGraph = async (arg: GraphBuilderArg): Promise; const devCond = posCond as Invocation<'flux2_dev_text_encoder'>; g.addEdge(devLoader, 'mistral_encoder', devCond, 'mistral_encoder'); @@ -198,7 +203,9 @@ export const buildFLUXGraph = async (arg: GraphBuilderArg): Promise>(false); } + + // Regional guidance for FLUX.2 [dev]. Same single-attention-mask model as Klein + // (positive prompts only; negatives / auto-negative are blocked by the validators). + if (manager !== null && posCondCollect !== null) { + const ipAdapterCollect = g.addNode({ + type: 'collect', + id: getPrefixedId('ip_adapter_collector'), + }); + await addRegions({ + manager, + regions: canvas.regionalGuidance.entities, + g, + bbox: canvas.bbox.rect, + model, + posCond: flux2DevCond, + negCond: null, + posCondCollect, + negCondCollect: null, + ipAdapterCollect, + fluxReduxCollect: null, + }); + // The collector exists only for type compatibility with addRegions; FLUX.2 [dev] + // does not consume IP adapters, so drop the node if nothing connected to it. + g.deleteNode(ipAdapterCollect.id); + } } else if (isFlux2) { // Flux2 Klein path const flux2Denoise = denoise as Invocation<'flux2_denoise'>; diff --git a/invokeai/frontend/web/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx b/invokeai/frontend/web/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx index 95eddb9ffb7..a039214c819 100644 --- a/invokeai/frontend/web/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx +++ b/invokeai/frontend/web/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx @@ -52,12 +52,12 @@ const ParamFlux2DevVaeModelSelect = memo(() => { const hasDiffusersSource = mainModelConfig?.format === 'diffusers' || diffusersModels.length > 0; const placeholder = hasDiffusersSource - ? t('modelManager.flux2DevVaePlaceholder', { defaultValue: 'Auto (from Diffusers source)' }) - : t('modelManager.flux2DevVaeNoModelPlaceholder', { defaultValue: 'Select a FLUX.2 VAE model' }); + ? t('modelManager.flux2DevVaePlaceholder') + : t('modelManager.flux2DevVaeNoModelPlaceholder'); return ( - {t('modelManager.flux2DevVae', { defaultValue: 'FLUX.2 [dev] VAE' })} + {t('modelManager.flux2DevVae')} { const hasDiffusersSource = mainModelConfig?.format === 'diffusers' || diffusersModels.length > 0; const placeholder = hasDiffusersSource - ? t('modelManager.flux2DevMistralEncoderPlaceholder', { defaultValue: 'Auto (from Diffusers source)' }) - : t('modelManager.flux2DevMistralEncoderNoModelPlaceholder', { - defaultValue: 'Select a Mistral text encoder', - }); + ? t('modelManager.flux2DevMistralEncoderPlaceholder') + : t('modelManager.flux2DevMistralEncoderNoModelPlaceholder'); return ( - - {t('modelManager.flux2DevMistralEncoder', { defaultValue: 'FLUX.2 [dev] Mistral Encoder' })} - + {t('modelManager.flux2DevMistralEncoder')} Date: Wed, 22 Jul 2026 10:18:24 +0200 Subject: [PATCH 15/25] Feat: FLUX.2 [dev] review fixes, dedup, and shared-source refactors Address the PR #9234 review (correctness, install-probe gaps, polish) plus the deduplication follow-ups. Correctness - Wire FLUX.2 [dev] regional guidance through addRegions instead of silently dropping it (posCondCollect + flux2_dev_text_encoder handling case) - Require a full pipeline layout (model_index.json / transformer/) for Main_Diffusers_Flux2_Config so transformer-only checkouts don't register as broken main models and OSError mid-queue - Reject Klein<->dev LoRA cross-wiring on both ends: frontend filters LoRAs by variant in both graph builders; dev/Klein loaders raise instead of warn - Discriminate non-Mistral GGUFs via a vocab-size floor so Llama-2-13B and similar 5120-hidden/40-layer LMs no longer install as Mistral encoders - Accept text_encoder.-prefixed encoder layouts at install probe (matches the loader's prefix stripping) - Dequantize fp8 Mistral checkpoints per-tensor to the target dtype and drop lm_head before casting (avoid a whole-dict fp32 transient that can OOM) - Raise on an unexpected Mistral layer count instead of inventing extraction indices that silently degrade output - Fail Klein VAE recall closed when the image's main model is unresolvable - Add the missing modelManager.mistralEncoder i18n key Dedup / single source of truth - Consolidate the FLUX.2 dimension->variant tables (context/vec/hidden) into a shared configs/flux2_variant.py used by main.py and lora.py - Mistral loaders key the final-RMSNorm / warning decision on config.variant instead of re-deriving from num_hidden_layers==30 - Merge the separate Klein/dev VAE redux slots into one flux2VaeModel (slice migration v3->v4) and collapse the two metadata VAE handlers into one, removing the recall-disambiguation - Parameterize the near-identical dev/Klein canvas graph blocks into one shared addFlux2Features closure; add dev-path coverage to buildFLUXGraph.test.ts - Single-pass GGUF metadata read, consistent norm materialization, cat-based conditioning tensor, and drop redundant t() defaultValues in ParamFlux2DevModelSelect Tests: model_identification suite green; frontend parsing / graph / readiness / modelSelected suites green. --- .../model_manager/configs/flux2_variant.py | 62 +++++ .../backend/model_manager/configs/lora.py | 54 ++--- .../backend/model_manager/configs/main.py | 53 ++--- .../load/model_loaders/mistral_encoder.py | 30 +-- .../listeners/modelSelected.test.ts | 3 +- .../listeners/modelSelected.ts | 10 +- .../controlLayers/store/paramsSlice.ts | 31 ++- .../src/features/controlLayers/store/types.ts | 12 +- .../ImageMetadataActions.tsx | 3 +- .../src/features/metadata/parsing.test.tsx | 99 ++------ .../web/src/features/metadata/parsing.tsx | 78 +----- .../graph/generation/buildFLUXGraph.test.ts | 155 +++++++++++- .../util/graph/generation/buildFLUXGraph.ts | 222 +++++------------- .../Advanced/ParamFlux2DevModelSelect.tsx | 12 +- .../Advanced/ParamFlux2KleinModelSelect.tsx | 12 +- .../features/queue/store/readiness.test.ts | 18 +- .../web/src/features/queue/store/readiness.ts | 8 +- 17 files changed, 401 insertions(+), 461 deletions(-) create mode 100644 invokeai/backend/model_manager/configs/flux2_variant.py diff --git a/invokeai/backend/model_manager/configs/flux2_variant.py b/invokeai/backend/model_manager/configs/flux2_variant.py new file mode 100644 index 00000000000..0ae9244d96d --- /dev/null +++ b/invokeai/backend/model_manager/configs/flux2_variant.py @@ -0,0 +1,62 @@ +"""Canonical FLUX.2 transformer dimensions per variant, and reverse lookups. + +Single source of truth for the geometry that distinguishes the FLUX.2 variants, so the +identification code in ``main.py`` (checkpoint + diffusers) and ``lora.py`` cannot drift +apart. Previously the same 7680/12288/15360 (and 2560/4096/5120, 3072/4096/6144) literals +were hand-maintained in four places. + +Only the three *distilled* variants are represented here. Base variants (Klein4BBase / +Klein9BBase) share architecture with their distilled counterparts and are indistinguishable +from geometry — callers detect them via a filename heuristic and upgrade the returned +distilled variant themselves. + +Dimensions: +- ``context_in_dim`` = ``joint_attention_dim`` = 3 × text-encoder hidden_size (context embedder) +- ``vec_in_dim`` = text-encoder hidden_size (vector embedder) +- ``hidden_size`` = transformer hidden size (attention projections) +""" + +from invokeai.backend.model_manager.taxonomy import Flux2VariantType + +# context_in_dim (= joint_attention_dim) per distilled variant. +_CONTEXT_IN_DIM: dict[Flux2VariantType, int] = { + Flux2VariantType.Klein4B: 7680, # 3 × Qwen3-4B 2560 + Flux2VariantType.Klein9B: 12288, # 3 × Qwen3-8B 4096 + Flux2VariantType.Dev: 15360, # 3 × Mistral Small 3.1 5120 +} + +# vec_in_dim (text-encoder hidden_size) per distilled variant. +_VEC_IN_DIM: dict[Flux2VariantType, int] = { + Flux2VariantType.Klein4B: 2560, + Flux2VariantType.Klein9B: 4096, + Flux2VariantType.Dev: 5120, +} + +# transformer hidden_size per distilled variant. +_HIDDEN_SIZE: dict[Flux2VariantType, int] = { + Flux2VariantType.Klein4B: 3072, + Flux2VariantType.Klein9B: 4096, + Flux2VariantType.Dev: 6144, # 48 heads × 128 head_dim +} + +# All recognized FLUX.2 context_in_dim values (used as a cheap "is this FLUX.2?" check). +FLUX2_CONTEXT_IN_DIMS: frozenset[int] = frozenset(_CONTEXT_IN_DIM.values()) + +_CONTEXT_IN_DIM_TO_VARIANT: dict[int, Flux2VariantType] = {dim: v for v, dim in _CONTEXT_IN_DIM.items()} +_VEC_IN_DIM_TO_VARIANT: dict[int, Flux2VariantType] = {dim: v for v, dim in _VEC_IN_DIM.items()} +_HIDDEN_SIZE_TO_VARIANT: dict[int, Flux2VariantType] = {dim: v for v, dim in _HIDDEN_SIZE.items()} + + +def flux2_variant_from_context_dim(dim: int) -> Flux2VariantType | None: + """Return the distilled FLUX.2 variant for a context_in_dim, or ``None`` if unrecognized.""" + return _CONTEXT_IN_DIM_TO_VARIANT.get(dim) + + +def flux2_variant_from_vec_dim(dim: int) -> Flux2VariantType | None: + """Return the distilled FLUX.2 variant for a vec_in_dim, or ``None`` if unrecognized.""" + return _VEC_IN_DIM_TO_VARIANT.get(dim) + + +def flux2_variant_from_hidden_size(dim: int) -> Flux2VariantType | None: + """Return the distilled FLUX.2 variant for a transformer hidden_size, or ``None`` if unrecognized.""" + return _HIDDEN_SIZE_TO_VARIANT.get(dim) diff --git a/invokeai/backend/model_manager/configs/lora.py b/invokeai/backend/model_manager/configs/lora.py index 7cdb3a52af5..53f3640e6c7 100644 --- a/invokeai/backend/model_manager/configs/lora.py +++ b/invokeai/backend/model_manager/configs/lora.py @@ -12,6 +12,12 @@ Config_Base, ) from invokeai.backend.model_manager.configs.controlnet import ControlAdapterDefaultSettings +from invokeai.backend.model_manager.configs.flux2_variant import ( + FLUX2_CONTEXT_IN_DIMS, + flux2_variant_from_context_dim, + flux2_variant_from_hidden_size, + flux2_variant_from_vec_dim, +) from invokeai.backend.model_manager.configs.identification_utils import ( NotAMatchError, raise_for_override_fields, @@ -90,9 +96,9 @@ def _get_flux_lora_format(mod: ModelOnDisk) -> FluxLoRAFormat | None: return value -# FLUX.2 context_in_dim values: 3 * text encoder hidden_size -# Klein 4B: 3 * 2560 = 7680, Klein 9B: 3 * 4096 = 12288, Dev: 3 * 5120 = 15360 (Mistral) -_FLUX2_CONTEXT_IN_DIMS = {7680, 12288, 15360} +# FLUX.2 context_in_dim values (Klein 4B 7680 / Klein 9B 12288 / Dev 15360) come from the +# shared dimension table so this "is it FLUX.2?" check can't drift from variant detection. +_FLUX2_CONTEXT_IN_DIMS = FLUX2_CONTEXT_IN_DIMS # FLUX.2 vec_in_dim values: text encoder hidden_size # Klein 4B: 2560 (Qwen3-4B), Klein 9B: 4096 (Qwen3-8B), Dev: 5120 (Mistral Small 3.1) @@ -327,42 +333,12 @@ def _get_flux2_lora_variant(state_dict: dict[str | int, Any]) -> Flux2VariantTyp Returns None if the variant cannot be determined (e.g. LoRA only targets layers with identical dimensions across variants). """ - KLEIN_4B_CONTEXT_DIM = 7680 # 3 * 2560 - KLEIN_9B_CONTEXT_DIM = 12288 # 3 * 4096 - DEV_CONTEXT_DIM = 15360 # 3 * 5120 - KLEIN_4B_VEC_DIM = 2560 - KLEIN_9B_VEC_DIM = 4096 - DEV_VEC_DIM = 5120 - KLEIN_4B_HIDDEN_SIZE = 3072 - KLEIN_9B_HIDDEN_SIZE = 4096 - DEV_HIDDEN_SIZE = 6144 # 48 heads × 128 head_dim - - def _variant_from_context_dim(dim: int) -> Flux2VariantType | None: - if dim == DEV_CONTEXT_DIM: - return Flux2VariantType.Dev - if dim == KLEIN_9B_CONTEXT_DIM: - return Flux2VariantType.Klein9B - if dim == KLEIN_4B_CONTEXT_DIM: - return Flux2VariantType.Klein4B - return None - - def _variant_from_vec_dim(dim: int) -> Flux2VariantType | None: - if dim == DEV_VEC_DIM: - return Flux2VariantType.Dev - if dim == KLEIN_9B_VEC_DIM: - return Flux2VariantType.Klein9B - if dim == KLEIN_4B_VEC_DIM: - return Flux2VariantType.Klein4B - return None - - def _variant_from_hidden_size(dim: int) -> Flux2VariantType | None: - if dim == DEV_HIDDEN_SIZE: - return Flux2VariantType.Dev - if dim == KLEIN_9B_HIDDEN_SIZE: - return Flux2VariantType.Klein9B - if dim == KLEIN_4B_HIDDEN_SIZE: - return Flux2VariantType.Klein4B - return None + # Reverse-lookup helpers come from the shared FLUX.2 dimension table (single source of + # truth shared with main.py's identification code). Aliased to the original local names + # to keep the detection code below unchanged. + _variant_from_context_dim = flux2_variant_from_context_dim + _variant_from_vec_dim = flux2_variant_from_vec_dim + _variant_from_hidden_size = flux2_variant_from_hidden_size # Check diffusers/PEFT format keys for prefix in ["transformer.", "base_model.model.", ""]: diff --git a/invokeai/backend/model_manager/configs/main.py b/invokeai/backend/model_manager/configs/main.py index 4bb187368f4..921ff850ab3 100644 --- a/invokeai/backend/model_manager/configs/main.py +++ b/invokeai/backend/model_manager/configs/main.py @@ -12,6 +12,7 @@ SubmodelDefinition, ) from invokeai.backend.model_manager.configs.clip_embed import get_clip_variant_type_from_config +from invokeai.backend.model_manager.configs.flux2_variant import flux2_variant_from_context_dim from invokeai.backend.model_manager.configs.identification_utils import ( NotAMatchError, common_config_paths, @@ -368,11 +369,6 @@ def _get_flux2_variant(state_dict: dict[str | int, Any]) -> Flux2VariantType | N - BFL format: txt_in.weight (context embedder) - Diffusers format: context_embedder.weight """ - # Context dimensions for each variant - KLEIN_4B_CONTEXT_DIM = 7680 # 3 × 2560 - KLEIN_9B_CONTEXT_DIM = 12288 # 3 × 4096 - DEV_CONTEXT_DIM = 15360 # 3 × 5120 (Mistral Small 3.1) - # Check context_embedder to determine variant # Support both BFL format (txt_in.weight) and diffusers format (context_embedder.weight) context_keys = { @@ -395,16 +391,12 @@ def _get_flux2_variant(state_dict: dict[str | int, Any]) -> Flux2VariantType | N continue if len(shape) >= 2: context_in_dim = shape[1] - # Determine variant based on context dimension - if context_in_dim == DEV_CONTEXT_DIM: - return Flux2VariantType.Dev - elif context_in_dim == KLEIN_9B_CONTEXT_DIM: - # Default to Klein9B - callers use filename heuristics to detect Klein9BBase - return Flux2VariantType.Klein9B - elif context_in_dim == KLEIN_4B_CONTEXT_DIM: - # Default to Klein4B - callers use filename heuristics to detect Klein4BBase - return Flux2VariantType.Klein4B - elif context_in_dim > 4096: + # Determine variant based on context dimension. Callers use filename + # heuristics to upgrade Klein4B/Klein9B to their Base variants. + variant = flux2_variant_from_context_dim(context_in_dim) + if variant is not None: + return variant + if context_in_dim > 4096: # Unknown FLUX.2 variant, default to 4B return Flux2VariantType.Klein4B @@ -898,10 +890,6 @@ def _get_variant_or_raise(cls, mod: ModelOnDisk) -> Flux2VariantType: Klein distilled and Base variants share identical architectures; the Base variant is detected by a filename heuristic. """ - KLEIN_4B_CONTEXT_DIM = 7680 # 3 × 2560 - KLEIN_9B_CONTEXT_DIM = 12288 # 3 × 4096 - DEV_CONTEXT_DIM = 15360 # 3 × 5120 - # Try transformer/config.json first (full pipeline), fall back to root config.json # (loose transformer-only checkouts). transformer_config_path = mod.path / "transformer" / "config.json" @@ -913,23 +901,18 @@ def _get_variant_or_raise(cls, mod: ModelOnDisk) -> Flux2VariantType: joint_attention_dim = transformer_config.get("joint_attention_dim", 4096) - # Determine variant based on joint_attention_dim - if joint_attention_dim == DEV_CONTEXT_DIM: - return Flux2VariantType.Dev - elif joint_attention_dim == KLEIN_9B_CONTEXT_DIM: - if _filename_suggests_base(mod.name): - return Flux2VariantType.Klein9BBase - return Flux2VariantType.Klein9B - elif joint_attention_dim == KLEIN_4B_CONTEXT_DIM: - if _filename_suggests_base(mod.name): - return Flux2VariantType.Klein4BBase - return Flux2VariantType.Klein4B - elif joint_attention_dim > 4096: - # Unknown FLUX.2 variant, default to 4B + # Determine variant based on joint_attention_dim (= context_in_dim). + variant = flux2_variant_from_context_dim(joint_attention_dim) + if variant is None: + # Unknown or FLUX.1-sized joint_attention_dim — default to Klein 4B. return Flux2VariantType.Klein4B - - # Default to 4B - return Flux2VariantType.Klein4B + # Klein 4B/9B share their architecture with the corresponding Base variant; use the + # filename heuristic to distinguish. Dev has no Base variant. + if variant is Flux2VariantType.Klein9B and _filename_suggests_base(mod.name): + return Flux2VariantType.Klein9BBase + if variant is Flux2VariantType.Klein4B and _filename_suggests_base(mod.name): + return Flux2VariantType.Klein4BBase + return variant class Main_SD_Diffusers_Config_Base(Diffusers_Config_Base, Main_Config_Base): diff --git a/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py b/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py index f9ffeff6a1a..b04e540afbe 100644 --- a/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py +++ b/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py @@ -32,6 +32,7 @@ from invokeai.backend.model_manager.taxonomy import ( AnyModel, BaseModelType, + MistralVariantType, ModelFormat, ModelType, SubModelType, @@ -49,7 +50,6 @@ _COW_HIDDEN_SIZE = 5120 _COW_INTERMEDIATE_SIZE = 32768 _COW_NUM_HIDDEN_LAYERS = 30 -_MISTRAL_24B_NUM_HIDDEN_LAYERS = 40 _COW_NUM_ATTENTION_HEADS = 32 _COW_NUM_KV_HEADS = 8 # grouped-query attention _COW_HEAD_DIM = 128 @@ -273,7 +273,7 @@ def _materialize_remaining_meta_tensors(model: torch.nn.Module, dtype: torch.dty ) -def _strip_final_norm_for_cow(model: torch.nn.Module, num_hidden_layers: int, logger: Any) -> None: +def _strip_final_norm_for_cow(model: torch.nn.Module, variant: MistralVariantType, logger: Any) -> None: """Replace ``model.norm`` with ``Identity`` for the 30-layer cow distillation. ComfyUI's reference implementation (``Mistral3_24BModel`` with ``num_layers=30``) @@ -284,9 +284,11 @@ def _strip_final_norm_for_cow(model: torch.nn.Module, num_hidden_layers: int, lo off-distribution embeddings for the cow weights. Swap the norm out for an identity here so our extraction matches Comfy / BFL. - The 40-layer Mistral Small 3 variant keeps the final norm. + The 40-layer Mistral Small 3 variant keeps the final norm. The decision keys on + the persisted ``config.variant`` (single source of truth) rather than re-deriving + it from the loaded layer count, so the config and loader can never disagree. """ - if num_hidden_layers != _COW_NUM_HIDDEN_LAYERS: + if variant is not MistralVariantType.Cow: return if not hasattr(model, "norm"): return @@ -294,7 +296,7 @@ def _strip_final_norm_for_cow(model: torch.nn.Module, num_hidden_layers: int, lo logger.info("Replaced model.norm with Identity for 30-layer cow Mistral (final_norm=False).") -def _warn_if_40_layer_mistral(num_hidden_layers: int, logger: Any) -> None: +def _warn_if_40_layer_mistral(variant: MistralVariantType, logger: Any) -> None: """Warn when a 40-layer Mistral Small 3 is loaded as a FLUX.2 [dev] text encoder. Architecturally, BFL's canonical ``black-forest-labs/FLUX.2-dev/text_encoder`` @@ -306,9 +308,10 @@ def _warn_if_40_layer_mistral(num_hidden_layers: int, logger: Any) -> None: We accept both at probe time and emit this warning at load time so users who install a non-BFL 40-layer Mistral see the issue called out in the log - instead of just getting weird images. + instead of just getting weird images. Keys on ``config.variant`` (single source + of truth), consistent with ``_strip_final_norm_for_cow``. """ - if num_hidden_layers != _MISTRAL_24B_NUM_HIDDEN_LAYERS: + if variant is not MistralVariantType.Mistral24B: return logger.warning( "Loaded a 40-layer Mistral Small 3 text encoder. " @@ -714,10 +717,9 @@ def _load_model( # ComfyUI's reference implementation. ``Mistral3ForConditionalGeneration`` # nests the LM under ``.language_model``; handle both layouts. inner = getattr(model, "language_model", None) or model - num_layers = int(getattr(getattr(inner, "config", None), "num_hidden_layers", 0)) logger = InvokeAILogger.get_logger("MistralEncoderDiffusersLoader") - _strip_final_norm_for_cow(inner, num_layers, logger) - _warn_if_40_layer_mistral(num_layers, logger) + _strip_final_norm_for_cow(inner, config.variant, logger) + _warn_if_40_layer_mistral(config.variant, logger) return model raise ValueError( @@ -823,8 +825,8 @@ def _load_text_encoder(self, config: MistralEncoder_Checkpoint_Config) -> AnyMod parent.register_buffer(parts[-1], inv_freq.to(model_dtype), persistent=False) _materialize_remaining_meta_tensors(model, model_dtype, logger) - _strip_final_norm_for_cow(model, mistral_config.num_hidden_layers, logger) - _warn_if_40_layer_mistral(mistral_config.num_hidden_layers, logger) + _strip_final_norm_for_cow(model, config.variant, logger) + _warn_if_40_layer_mistral(config.variant, logger) return model @@ -927,8 +929,8 @@ def _load_from_gguf(self, config: MistralEncoder_GGUF_Config) -> AnyModel: parent.register_buffer(parts[-1], inv_freq.to(compute_dtype), persistent=False) _materialize_remaining_meta_tensors(model, compute_dtype, logger) - _strip_final_norm_for_cow(model, mistral_config.num_hidden_layers, logger) - _warn_if_40_layer_mistral(mistral_config.num_hidden_layers, logger) + _strip_final_norm_for_cow(model, config.variant, logger) + _warn_if_40_layer_mistral(config.variant, logger) return model diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.test.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.test.ts index a0741f28dcc..000b27f4896 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.test.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.test.ts @@ -216,9 +216,8 @@ function buildMockState(overrides: Record = {}) { animaVaeModel: null, animaQwen3EncoderModel: null, animaScheduler: 'euler', - kleinVaeModel: null, + flux2VaeModel: null, kleinQwen3EncoderModel: null, - flux2DevVaeModel: null, flux2DevMistralEncoderModel: null, zImageScheduler: 'euler', ...overrides, diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts index 7fc992f8364..1d67713b953 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts @@ -7,8 +7,8 @@ import { animaQwen3EncoderModelSelected, animaVaeModelSelected, aspectRatioIdChanged, + flux2VaeModelSelected, kleinQwen3EncoderModelSelected, - kleinVaeModelSelected, modelChanged, qwenImageComponentSourceSelected, qwenImageQwenVLEncoderModelSelected, @@ -235,11 +235,11 @@ export const addModelSelectedListener = (startAppListening: AppStartListening) = } } - // handle incompatible FLUX.2 Klein models - clear if switching away from flux2 - const { kleinVaeModel, kleinQwen3EncoderModel } = state.params; + // handle incompatible FLUX.2 models - clear if switching away from flux2 + const { flux2VaeModel, kleinQwen3EncoderModel } = state.params; if (newBase !== 'flux2') { - if (kleinVaeModel) { - dispatch(kleinVaeModelSelected(null)); + if (flux2VaeModel) { + dispatch(flux2VaeModelSelected(null)); modelsUpdatedDisabledOrCleared += 1; } if (kleinQwen3EncoderModel) { diff --git a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts index 3347baa11ea..68bd7e219cd 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts @@ -257,12 +257,12 @@ const slice = createSlice({ ) => { state.animaScheduler = action.payload; }, - kleinVaeModelSelected: (state, action: PayloadAction) => { - const result = zParamsState.shape.kleinVaeModel.safeParse(action.payload); + flux2VaeModelSelected: (state, action: PayloadAction) => { + const result = zParamsState.shape.flux2VaeModel.safeParse(action.payload); if (!result.success) { return; } - state.kleinVaeModel = result.data; + state.flux2VaeModel = result.data; }, kleinQwen3EncoderModelSelected: ( state, @@ -274,13 +274,6 @@ const slice = createSlice({ } state.kleinQwen3EncoderModel = result.data; }, - flux2DevVaeModelSelected: (state, action: PayloadAction) => { - const result = zParamsState.shape.flux2DevVaeModel.safeParse(action.payload); - if (!result.success) { - return; - } - state.flux2DevVaeModel = result.data; - }, flux2DevMistralEncoderModelSelected: ( state, action: PayloadAction<{ key: string; name: string; base: string } | null> @@ -646,9 +639,8 @@ const resetState = (state: ParamsState): ParamsState => { newState.animaVaeModel = oldState.animaVaeModel; newState.animaQwen3EncoderModel = oldState.animaQwen3EncoderModel; newState.animaLLLiteModel = oldState.animaLLLiteModel; - newState.kleinVaeModel = oldState.kleinVaeModel; + newState.flux2VaeModel = oldState.flux2VaeModel; newState.kleinQwen3EncoderModel = oldState.kleinQwen3EncoderModel; - newState.flux2DevVaeModel = oldState.flux2DevVaeModel; newState.flux2DevMistralEncoderModel = oldState.flux2DevMistralEncoderModel; newState.qwenImageComponentSource = oldState.qwenImageComponentSource; newState.qwenImageVaeModel = oldState.qwenImageVaeModel; @@ -700,9 +692,8 @@ export const { zImageVaeModelSelected, zImageQwen3EncoderModelSelected, zImageQwen3SourceModelSelected, - kleinVaeModelSelected, + flux2VaeModelSelected, kleinQwen3EncoderModelSelected, - flux2DevVaeModelSelected, flux2DevMistralEncoderModelSelected, qwenImageComponentSourceSelected, qwenImageVaeModelSelected, @@ -782,6 +773,15 @@ export const paramsSliceConfig: SliceConfig = { state.qwenImageQwenVLEncoderModel = null; } + if (state._version === 3) { + // v3 -> v4, merge the separate Klein / [dev] FLUX.2 VAE slots into one shared + // flux2VaeModel (both drew from the same FLUX.2 VAE pool). Keep whichever was set. + state._version = 4; + state.flux2VaeModel = state.kleinVaeModel ?? state.flux2DevVaeModel ?? null; + delete state.kleinVaeModel; + delete state.flux2DevVaeModel; + } + return zParamsState.parse(state); }, }, @@ -825,9 +825,8 @@ export const selectAnimaQwen3EncoderModel = createParamsSelector((params) => par export const selectAnimaScheduler = createParamsSelector((params) => params.animaScheduler); export const selectAnimaLLLiteModel = createParamsSelector((params) => params.animaLLLiteModel); export const selectAnimaLLLiteWeight = createParamsSelector((params) => params.animaLLLiteWeight); -export const selectKleinVaeModel = createParamsSelector((params) => params.kleinVaeModel); +export const selectFlux2VaeModel = createParamsSelector((params) => params.flux2VaeModel); export const selectKleinQwen3EncoderModel = createParamsSelector((params) => params.kleinQwen3EncoderModel); -export const selectFlux2DevVaeModel = createParamsSelector((params) => params.flux2DevVaeModel); export const selectFlux2DevMistralEncoderModel = createParamsSelector((params) => params.flux2DevMistralEncoderModel); export const selectQwenImageComponentSource = createParamsSelector((params) => params.qwenImageComponentSource); export const selectQwenImageVaeModel = createParamsSelector((params) => params.qwenImageVaeModel); diff --git a/invokeai/frontend/web/src/features/controlLayers/store/types.ts b/invokeai/frontend/web/src/features/controlLayers/store/types.ts index e3b09dfc4bb..a0533260c86 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/types.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/types.ts @@ -858,11 +858,12 @@ export const zParamsState = z.object({ animaScheduler: zParameterAnimaScheduler, animaLLLiteModel: zModelIdentifierField.nullable().default(null), // Optional: ControlNet-LLLite inpaint adapter for Anima animaLLLiteWeight: z.number().min(-10).max(10).default(1), - // Flux2 Klein model components - uses Qwen3 instead of CLIP+T5 - kleinVaeModel: zParameterVAEModel.nullable(), // Optional: Separate FLUX.2 VAE for Klein + // FLUX.2 VAE shared by Klein and [dev] — both use the same 32-channel AutoencoderKLFlux2 pool, + // so a single slot avoids losing the selection when switching a GGUF between the two. + flux2VaeModel: zParameterVAEModel.nullable(), // Optional: Separate FLUX.2 VAE (Klein + [dev]) + // Flux2 Klein text encoder - uses Qwen3 instead of CLIP+T5 kleinQwen3EncoderModel: zModelIdentifierField.nullable(), // Optional: Separate Qwen3 Encoder for Klein - // Flux2 [dev] model components - uses Mistral Small 3.1 (24B) text encoder - flux2DevVaeModel: zParameterVAEModel.nullable(), // Optional: Separate FLUX.2 VAE for [dev] + // Flux2 [dev] text encoder - uses Mistral Small 3.1 (24B) flux2DevMistralEncoderModel: zModelIdentifierField.nullable(), // Optional: Standalone Mistral encoder for [dev] // Qwen Image Edit model components - GGUF transformer needs a Diffusers source for VAE/encoder qwenImageComponentSource: zParameterModel.nullable(), // Diffusers model providing VAE + text encoder @@ -949,9 +950,8 @@ export const getInitialParamsState = (): ParamsState => ({ animaScheduler: 'euler', animaLLLiteModel: null, animaLLLiteWeight: 1, - kleinVaeModel: null, + flux2VaeModel: null, kleinQwen3EncoderModel: null, - flux2DevVaeModel: null, flux2DevMistralEncoderModel: null, qwenImageComponentSource: null, qwenImageVaeModel: null, diff --git a/invokeai/frontend/web/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx b/invokeai/frontend/web/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx index 58ac4995cf3..892ffef838e 100644 --- a/invokeai/frontend/web/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx +++ b/invokeai/frontend/web/src/features/gallery/components/ImageMetadataViewer/ImageMetadataActions.tsx @@ -63,9 +63,8 @@ export const IMAGE_METADATA_ACTION_HANDLERS: ImageMetadataActionHandler[] = [ ImageMetadataHandlers.ZImageShift, ImageMetadataHandlers.CanvasLayers, ImageMetadataHandlers.RefImages, - ImageMetadataHandlers.KleinVAEModel, + ImageMetadataHandlers.Flux2VAEModel, ImageMetadataHandlers.KleinQwen3EncoderModel, - ImageMetadataHandlers.Flux2DevVAEModel, ImageMetadataHandlers.Flux2DevMistralEncoderModel, ImageMetadataHandlers.LoRAs, ]; diff --git a/invokeai/frontend/web/src/features/metadata/parsing.test.tsx b/invokeai/frontend/web/src/features/metadata/parsing.test.tsx index d417793585b..06e0302d00d 100644 --- a/invokeai/frontend/web/src/features/metadata/parsing.test.tsx +++ b/invokeai/frontend/web/src/features/metadata/parsing.test.tsx @@ -8,8 +8,8 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; // Module mocks // // We are testing only the *gating* logic of the model-related metadata -// handlers (`VAEModel`, `KleinVAEModel`, `KleinQwen3EncoderModel`, -// `Flux2DevVAEModel`, `Flux2DevMistralEncoderModel`). The model lookup goes +// handlers (`VAEModel`, `Flux2VAEModel`, `KleinQwen3EncoderModel`, +// `Flux2DevMistralEncoderModel`). The model lookup goes // through `parseModelIdentifier`, which dispatches an RTK Query thunk. We stub // the models endpoint so any lookup resolves to a canned model identifier — // the parse step then succeeds and the assertions inside each handler become @@ -80,85 +80,34 @@ beforeEach(() => { }); describe('ImageMetadataHandlers — Klein recall gating', () => { - describe('KleinVAEModel', () => { - it('parses metadata.vae for Klein images (main model variant klein_*) when base is flux2', async () => { - currentBase = 'flux2'; - nextResolved = fakeModel('vae', 'flux2'); - modelRegistry['main-key'] = fakeMainModel('klein_9b'); - const store = makeStore(); - - const parsed = await ImageMetadataHandlers.KleinVAEModel.parse( - { vae: nextResolved, model: fakeMainModel('klein_9b') }, - store - ); - - expect(parsed.key).toBe('vae-key'); - expect(parsed.type).toBe('vae'); - }); - - it('rejects when base is not flux2', async () => { - currentBase = 'sdxl'; - nextResolved = fakeModel('vae', 'flux2'); - const store = makeStore(); - - await expect( - ImageMetadataHandlers.KleinVAEModel.parse({ vae: nextResolved, model: fakeMainModel('klein_9b') }, store) - ).rejects.toThrow(); - }); - - it('rejects FLUX.2 [dev] images (main model variant dev) even without a mistral_encoder field', async () => { - // Regression: a [dev] image whose encoder came from a Diffusers source has - // a `vae` field but NO `mistral_encoder`. It must still be recognized as - // [dev] (via the main model variant) and NOT recalled into the Klein slice. - currentBase = 'flux2'; - nextResolved = fakeModel('vae', 'flux2'); - modelRegistry['main-key'] = fakeMainModel('dev'); - const store = makeStore(); - - await expect( - ImageMetadataHandlers.KleinVAEModel.parse({ vae: nextResolved, model: fakeMainModel('dev') }, store) - ).rejects.toThrow(); - }); - }); - - describe('Flux2DevVAEModel', () => { - it('parses metadata.vae for [dev] images (main model variant dev) even without a mistral_encoder field', async () => { - // The dev VAE must recall from a [dev] image regardless of whether a - // standalone Mistral encoder was selected (Diffusers-sourced encoders - // write no `mistral_encoder` metadata). - currentBase = 'flux2'; - nextResolved = fakeModel('vae', 'flux2'); - modelRegistry['main-key'] = fakeMainModel('dev'); - const store = makeStore(); - - const parsed = await ImageMetadataHandlers.Flux2DevVAEModel.parse( - { vae: nextResolved, model: fakeMainModel('dev') }, - store - ); - - expect(parsed.key).toBe('vae-key'); - expect(parsed.type).toBe('vae'); - }); - - it('rejects Klein images (main model variant klein_*)', async () => { - currentBase = 'flux2'; - nextResolved = fakeModel('vae', 'flux2'); - modelRegistry['main-key'] = fakeMainModel('klein_9b'); - const store = makeStore(); - - await expect( - ImageMetadataHandlers.Flux2DevVAEModel.parse({ vae: nextResolved, model: fakeMainModel('klein_9b') }, store) - ).rejects.toThrow(); - }); + describe('Flux2VAEModel', () => { + // Klein and [dev] share a single flux2VaeModel slot, so one handler recalls both + // variants' VAE from metadata.vae — no dev/Klein disambiguation. + it.each(['klein_9b', 'dev'] as const)( + 'parses metadata.vae for FLUX.2 %s images when base is flux2', + async (variant) => { + currentBase = 'flux2'; + nextResolved = fakeModel('vae', 'flux2'); + modelRegistry['main-key'] = fakeMainModel(variant); + const store = makeStore(); + + const parsed = await ImageMetadataHandlers.Flux2VAEModel.parse( + { vae: nextResolved, model: fakeMainModel(variant) }, + store + ); + + expect(parsed.key).toBe('vae-key'); + expect(parsed.type).toBe('vae'); + } + ); it('rejects when base is not flux2', async () => { currentBase = 'sdxl'; nextResolved = fakeModel('vae', 'flux2'); - modelRegistry['main-key'] = fakeMainModel('dev'); const store = makeStore(); await expect( - ImageMetadataHandlers.Flux2DevVAEModel.parse({ vae: nextResolved, model: fakeMainModel('dev') }, store) + ImageMetadataHandlers.Flux2VAEModel.parse({ vae: nextResolved, model: fakeMainModel('klein_9b') }, store) ).rejects.toThrow(); }); }); @@ -215,7 +164,7 @@ describe('ImageMetadataHandlers — Klein recall gating', () => { describe('VAEModel (generic)', () => { // The generic VAEModel handler must NOT also fire for FLUX.2 / Z-Image // images, otherwise the metadata viewer renders duplicate VAE rows next - // to the dedicated KleinVAEModel / Flux2DevVAEModel / ZImageVAEModel handlers. + // to the dedicated Flux2VAEModel / ZImageVAEModel handlers. it.each(['flux2', 'z-image'])('rejects parsing when current base is %s', async (base) => { currentBase = base; nextResolved = fakeModel('vae', base); diff --git a/invokeai/frontend/web/src/features/metadata/parsing.tsx b/invokeai/frontend/web/src/features/metadata/parsing.tsx index 727ef6d132f..3feae363308 100644 --- a/invokeai/frontend/web/src/features/metadata/parsing.tsx +++ b/invokeai/frontend/web/src/features/metadata/parsing.tsx @@ -11,13 +11,12 @@ import { animaQwen3EncoderModelSelected, animaVaeModelSelected, flux2DevMistralEncoderModelSelected, - flux2DevVaeModelSelected, + flux2VaeModelSelected, geminiTemperatureChanged, geminiThinkingLevelChanged, heightChanged, imageSizeChanged, kleinQwen3EncoderModelSelected, - kleinVaeModelSelected, negativePromptChanged, openaiBackgroundChanged, openaiInputFidelityChanged, @@ -1199,79 +1198,25 @@ const AnimaQwen3EncoderModel: SingleMetadataHandler = { }; //#endregion AnimaQwen3EncoderModel +//#region Flux2VAEModel /** - * FLUX.2 Klein and FLUX.2 [dev] both have base `flux2` and write their VAE - * under `metadata.vae`, so the two VAE handlers must disambiguate which slice - * to recall into. We resolve the image's own main model and inspect its - * variant — the same signal the graph builder uses (`isFlux2Dev = - * model.variant === 'dev'`, see buildFLUXGraph.ts). - * - * We must NOT key off the presence of `mistral_encoder`/`qwen3_encoder`: those - * fields are written only when a *standalone* encoder was selected, so a dev - * image whose encoder was extracted from a Diffusers source carries neither. - * Keying off `mistral_encoder` presence would silently recall such a dev image's - * VAE into the Klein slice (the exact cross-contamination this guards against). + * FLUX.2 Klein and FLUX.2 [dev] share a single VAE slot (`flux2VaeModel`) and the same + * `metadata.vae` field — both draw from the 32-channel AutoencoderKLFlux2 pool — so one + * handler covers both variants and no dev/Klein disambiguation is needed on recall. */ -const isFlux2DevMetadata = async (metadata: unknown, store: AppStore): Promise => { - // Return false (rather than throwing) when the image's main model is missing/malformed - // or can no longer be resolved (uninstalled, past the key/hash/name fallbacks). Throwing - // here would reject BOTH the Klein and dev VAE handlers, making the VAE row vanish from - // the metadata viewer and skipping it in recall-all. Failing closed instead lets the - // Klein VAE handler recall as it did before this dev/Klein disambiguation was added. - try { - const identifier = zModelIdentifierField.parse(getProperty(metadata, 'model')); - const config = await resolveModel(identifier, store); - return config.base === 'flux2' && 'variant' in config && config.variant === 'dev'; - } catch { - return false; - } -}; - -//#region KleinVAEModel -const KleinVAEModel: SingleMetadataHandler = { - [SingleMetadataKey]: true, - type: 'KleinVAEModel', - parse: async (metadata, store) => { - const raw = getProperty(metadata, 'vae'); - const parsed = await parseModelIdentifier(raw, store, 'vae'); - assert(parsed.type === 'vae'); - const base = selectBase(store.getState()); - assert(base === 'flux2', 'KleinVAEModel handler only works with FLUX.2 Klein models'); - assert( - !(await isFlux2DevMetadata(metadata, store)), - 'KleinVAEModel does not handle FLUX.2 [dev] images (main model variant is `dev`)' - ); - return parsed; - }, - recall: (value, store) => { - store.dispatch(kleinVaeModelSelected(value)); - }, - i18nKey: 'metadata.vae', - LabelComponent: MetadataLabel, - ValueComponent: ({ value }: SingleMetadataValueProps) => ( - - ), -}; -//#endregion KleinVAEModel - -//#region Flux2DevVAEModel -const Flux2DevVAEModel: SingleMetadataHandler = { +const Flux2VAEModel: SingleMetadataHandler = { [SingleMetadataKey]: true, - type: 'Flux2DevVAEModel', + type: 'Flux2VAEModel', parse: async (metadata, store) => { const raw = getProperty(metadata, 'vae'); const parsed = await parseModelIdentifier(raw, store, 'vae'); assert(parsed.type === 'vae'); const base = selectBase(store.getState()); - assert(base === 'flux2', 'Flux2DevVAEModel handler only works with FLUX.2 models'); - assert( - await isFlux2DevMetadata(metadata, store), - 'Flux2DevVAEModel handler only fires on FLUX.2 [dev] images (main model variant is `dev`)' - ); + assert(base === 'flux2', 'Flux2VAEModel handler only works with FLUX.2 models'); return parsed; }, recall: (value, store) => { - store.dispatch(flux2DevVaeModelSelected(value)); + store.dispatch(flux2VaeModelSelected(value)); }, i18nKey: 'metadata.vae', LabelComponent: MetadataLabel, @@ -1279,7 +1224,7 @@ const Flux2DevVAEModel: SingleMetadataHandler = { ), }; -//#endregion Flux2DevVAEModel +//#endregion Flux2VAEModel //#region KleinQwen3EncoderModel const KleinQwen3EncoderModel: SingleMetadataHandler = { @@ -1730,9 +1675,8 @@ export const ImageMetadataHandlers = { ZImageQwen3SourceModel, AnimaVAEModel, AnimaQwen3EncoderModel, - KleinVAEModel, + Flux2VAEModel, KleinQwen3EncoderModel, - Flux2DevVAEModel, Flux2DevMistralEncoderModel, ZImageSeedVarianceEnabled, ZImageSeedVarianceStrength, diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.test.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.test.ts index 86be4eb51ec..4bf26bbd227 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.test.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.test.ts @@ -92,11 +92,47 @@ const makeFlux2Model = (variant: string) => ({ variant, }); +// --- Flux2 [dev] model fixtures --- + +const flux2DevGGUFModel = { + key: 'flux2-dev-gguf', + hash: 'flux2-dev-gguf-hash', + name: 'FLUX.2 [dev] GGUF', + base: 'flux2', + type: 'main', + format: 'gguf_quantized', + variant: 'dev', +}; + +const flux2DevDiffusersModel = { + key: 'flux2-dev-diffusers', + hash: 'flux2-dev-diff-hash', + name: 'FLUX.2 [dev]', + base: 'flux2', + type: 'main', + format: 'diffusers', + variant: 'dev', +}; + +const flux2DevSourceModelFixture = { + key: 'flux2-dev-source-diffusers', + hash: 'flux2-dev-src-hash', + name: 'FLUX.2 [dev] Source', + base: 'flux2', + type: 'main', + format: 'diffusers', + variant: 'dev', +}; + +const mistralEncoderFixture = { key: 'mistral-enc', name: 'Mistral Small 3', base: 'any', type: 'mistral_encoder' }; + // --- Mutable state shared by all tests --- let currentModel: Record | null = null; -let currentKleinVae: Record | null = null; +let currentFlux2Vae: Record | null = null; let currentKleinQwen3: Record | null = null; +let currentFlux2Mistral: Record | null = null; +let devDiffusersModels: Record[] = []; let diffusersModels: Record[] = []; const mockParams = { @@ -114,10 +150,9 @@ const mockParams = { vi.mock('features/controlLayers/store/paramsSlice', () => ({ selectMainModelConfig: vi.fn(() => currentModel), selectParamsSlice: vi.fn(() => mockParams), - selectKleinVaeModel: vi.fn(() => currentKleinVae), + selectFlux2VaeModel: vi.fn(() => currentFlux2Vae), selectKleinQwen3EncoderModel: vi.fn(() => currentKleinQwen3), - selectFlux2DevVaeModel: vi.fn(() => null), - selectFlux2DevMistralEncoderModel: vi.fn(() => null), + selectFlux2DevMistralEncoderModel: vi.fn(() => currentFlux2Mistral), })); vi.mock('features/controlLayers/store/refImagesSlice', () => ({ @@ -174,6 +209,7 @@ vi.mock('features/nodes/util/graph/generation/addWatermarker', () => ({ vi.mock('features/nodes/util/graph/generation/addRegions', () => ({ addRegions: vi.fn(() => []) })); vi.mock('features/nodes/util/graph/generation/addFLUXLoRAs', () => ({ addFLUXLoRAs: vi.fn() })); vi.mock('features/nodes/util/graph/generation/addFlux2KleinLoRAs', () => ({ addFlux2KleinLoRAs: vi.fn() })); +vi.mock('features/nodes/util/graph/generation/addFlux2DevLoRAs', () => ({ addFlux2DevLoRAs: vi.fn() })); vi.mock('features/nodes/util/graph/generation/addFLUXFill', () => ({ addFLUXFill: vi.fn() })); vi.mock('features/nodes/util/graph/generation/addFLUXRedux', () => ({ addFLUXReduxes: vi.fn(() => ({ addedFLUXReduxes: 0 })), @@ -188,7 +224,7 @@ vi.mock('features/nodes/util/graph/generation/addIPAdapters', () => ({ vi.mock('services/api/hooks/modelsByType', () => ({ selectFlux2DiffusersModels: vi.fn(() => diffusersModels), - selectFlux2DevDiffusersModels: vi.fn(() => []), + selectFlux2DevDiffusersModels: vi.fn(() => devDiffusersModels), })); vi.mock('services/api/types', async () => { @@ -239,9 +275,11 @@ const getLoaderNode = async () => { const resetState = () => { nextId = 0; currentModel = null; - currentKleinVae = null; + currentFlux2Vae = null; currentKleinQwen3 = null; + currentFlux2Mistral = null; diffusersModels = []; + devDiffusersModels = []; }; beforeEach(resetState); @@ -283,13 +321,13 @@ describe('buildFLUXGraph (FLUX.2 Klein)', () => { describe('Klein VAE / Qwen3 metadata', () => { it('persists separately selected Klein VAE and Qwen3 encoder into metadata', async () => { currentModel = makeFlux2Model('klein_9b_base'); - currentKleinVae = { key: 'vae-1', hash: 'h', name: 'Klein VAE', base: 'flux2', type: 'vae' }; + currentFlux2Vae = { key: 'vae-1', hash: 'h', name: 'Klein VAE', base: 'flux2', type: 'vae' }; currentKleinQwen3 = { key: 'q3-1', hash: 'h', name: 'Qwen3', base: 'flux2', type: 'qwen3_encoder' }; const { g } = await buildFLUXGraph(buildGraphArg()); const metadata = getMetadata(g); - expect(metadata.vae).toEqual(currentKleinVae); + expect(metadata.vae).toEqual(currentFlux2Vae); expect(metadata.qwen3_encoder).toEqual(currentKleinQwen3); }); @@ -330,7 +368,7 @@ describe('buildFLUXGraph – FLUX.2 Klein qwen3_source_model', () => { it('does not set qwen3_source_model when main model is GGUF but standalone VAE and Qwen3 are both selected', async () => { currentModel = { ...flux2GGUFModel }; - currentKleinVae = kleinVaeModelFixture; + currentFlux2Vae = kleinVaeModelFixture; currentKleinQwen3 = kleinQwen3EncoderModelFixture; diffusersModels = [diffusersSourceModelFixture]; @@ -350,7 +388,7 @@ describe('buildFLUXGraph – FLUX.2 Klein qwen3_source_model', () => { it('sets qwen3_source_model when only VAE is selected but Qwen3 is missing', async () => { currentModel = { ...flux2GGUFModel }; - currentKleinVae = kleinVaeModelFixture; + currentFlux2Vae = kleinVaeModelFixture; currentKleinQwen3 = null; diffusersModels = [diffusersSourceModelFixture]; @@ -361,7 +399,7 @@ describe('buildFLUXGraph – FLUX.2 Klein qwen3_source_model', () => { it('sets qwen3_source_model when only Qwen3 is selected but VAE is missing', async () => { currentModel = { ...flux2GGUFModel }; - currentKleinVae = null; + currentFlux2Vae = null; currentKleinQwen3 = kleinQwen3EncoderModelFixture; diffusersModels = [diffusersSourceModelFixture]; @@ -372,7 +410,7 @@ describe('buildFLUXGraph – FLUX.2 Klein qwen3_source_model', () => { it('passes standalone vae_model and qwen3_encoder_model when selected', async () => { currentModel = { ...flux2DiffusersModel }; - currentKleinVae = kleinVaeModelFixture; + currentFlux2Vae = kleinVaeModelFixture; currentKleinQwen3 = kleinQwen3EncoderModelFixture; const loader = await getLoaderNode(); @@ -447,3 +485,96 @@ describe('buildFLUXGraph – FLUX.2 Klein qwen3_source_model', () => { }); }); }); + +describe('buildFLUXGraph (FLUX.2 [dev])', () => { + const getDevLoader = (g: Graph): Record | undefined => { + const entry = Object.entries(g.getGraph().nodes).find(([id]) => id.startsWith('flux2_dev_model_loader:')); + return entry?.[1] as Record | undefined; + }; + + describe('graph structure', () => { + it('uses the dev model loader + text encoder and the shared flux2 denoise / vae decode', async () => { + currentModel = { ...flux2DevDiffusersModel }; + const { g } = await buildFLUXGraph(buildGraphArg()); + const nodeIds = Object.keys(g.getGraph().nodes); + expect(nodeIds.some((id) => id.startsWith('flux2_dev_model_loader:'))).toBe(true); + expect(nodeIds.some((id) => id.startsWith('flux2_dev_text_encoder:'))).toBe(true); + // Must not fall through to the Klein loader/encoder. + expect(nodeIds.some((id) => id.startsWith('flux2_klein_model_loader:'))).toBe(false); + const nodeTypes = Object.values(g.getGraph().nodes).map((n) => n.type); + expect(nodeTypes).toContain('flux2_denoise'); + expect(nodeTypes).toContain('flux2_vae_decode'); + }); + + it('routes the dev conditioning through a collector (regional-guidance parity with Klein)', async () => { + currentModel = { ...flux2DevDiffusersModel }; + const { g } = await buildFLUXGraph(buildGraphArg()); + const nodeTypes = Object.values(g.getGraph().nodes).map((n) => n.type); + expect(nodeTypes).toContain('collect'); + }); + }); + + describe('VAE / Mistral encoder metadata', () => { + it('persists a separately selected FLUX.2 VAE and Mistral encoder', async () => { + currentModel = { ...flux2DevDiffusersModel }; + currentFlux2Vae = { key: 'vae-1', hash: 'h', name: 'FLUX.2 VAE', base: 'flux2', type: 'vae' }; + currentFlux2Mistral = { ...mistralEncoderFixture }; + const { g } = await buildFLUXGraph(buildGraphArg()); + const metadata = getMetadata(g); + expect(metadata.vae).toEqual(currentFlux2Vae); + expect(metadata.mistral_encoder).toEqual(currentFlux2Mistral); + }); + + it('omits vae / mistral_encoder when none are selected', async () => { + currentModel = { ...flux2DevDiffusersModel }; + const { g } = await buildFLUXGraph(buildGraphArg()); + const metadata = getMetadata(g); + expect(metadata.vae).toBeUndefined(); + expect(metadata.mistral_encoder).toBeUndefined(); + }); + }); + + describe('mistral_source_model auto-detection', () => { + it('does not set mistral_source_model when main model is diffusers', async () => { + currentModel = { ...flux2DevDiffusersModel }; + devDiffusersModels = [flux2DevSourceModelFixture]; + const { g } = await buildFLUXGraph(buildGraphArg()); + expect(getDevLoader(g)?.mistral_source_model).toBeUndefined(); + }); + + it('sets mistral_source_model when main is GGUF and a dev diffusers model is available', async () => { + currentModel = { ...flux2DevGGUFModel }; + devDiffusersModels = [flux2DevSourceModelFixture]; + const { g } = await buildFLUXGraph(buildGraphArg()); + expect((getDevLoader(g)?.mistral_source_model as { key?: string } | undefined)?.key).toBe( + flux2DevSourceModelFixture.key + ); + }); + + it('does not set mistral_source_model when GGUF but standalone VAE and Mistral encoder are both selected', async () => { + currentModel = { ...flux2DevGGUFModel }; + currentFlux2Vae = { key: 'vae-1', hash: 'h', name: 'FLUX.2 VAE', base: 'flux2', type: 'vae' }; + currentFlux2Mistral = { ...mistralEncoderFixture }; + devDiffusersModels = [flux2DevSourceModelFixture]; + const { g } = await buildFLUXGraph(buildGraphArg()); + expect(getDevLoader(g)?.mistral_source_model).toBeUndefined(); + }); + + it('does not set mistral_source_model when GGUF and no dev diffusers model is available', async () => { + currentModel = { ...flux2DevGGUFModel }; + devDiffusersModels = []; + const { g } = await buildFLUXGraph(buildGraphArg()); + expect(getDevLoader(g)?.mistral_source_model).toBeUndefined(); + }); + + it('passes standalone vae_model and mistral_encoder_model when selected', async () => { + currentModel = { ...flux2DevGGUFModel }; + currentFlux2Vae = { key: 'vae-1', hash: 'h', name: 'FLUX.2 VAE', base: 'flux2', type: 'vae' }; + currentFlux2Mistral = { ...mistralEncoderFixture }; + const { g } = await buildFLUXGraph(buildGraphArg()); + const loader = getDevLoader(g); + expect(loader?.vae_model).toEqual(currentFlux2Vae); + expect(loader?.mistral_encoder_model).toEqual(currentFlux2Mistral); + }); + }); +}); diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts index 507276f3125..de7d0517e66 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts @@ -2,9 +2,8 @@ import { logger } from 'app/logging/logger'; import { getPrefixedId } from 'features/controlLayers/konva/util'; import { selectFlux2DevMistralEncoderModel, - selectFlux2DevVaeModel, + selectFlux2VaeModel, selectKleinQwen3EncoderModel, - selectKleinVaeModel, selectMainModelConfig, selectParamsSlice, } from 'features/controlLayers/store/paramsSlice'; @@ -72,9 +71,8 @@ export const buildFLUXGraph = async (arg: GraphBuilderArg): Promise = l2i; - // FLUX.2 [dev] path. Mirrors the Klein wiring but with the dev model loader / encoder. - if (isFlux2Dev) { - const flux2Denoise = denoise as Invocation<'flux2_denoise'>; - const flux2DevLoader = modelLoader as Invocation<'flux2_dev_model_loader'>; - const flux2L2i = l2i as Invocation<'flux2_vae_decode'>; - const flux2DevCond = posCond as Invocation<'flux2_dev_text_encoder'>; - - addFlux2DevLoRAs(state, g, flux2Denoise, flux2DevLoader, flux2DevCond); - - // FLUX.2 [dev] has the same multi-reference image editing support as Klein - // (32-channel VAE encode + 4D RoPE position IDs are model-agnostic; the - // backend Flux2RefImageExtension handles both). - const validFlux2DevRefImageConfigs = selectRefImagesSlice(state) + // Shared FLUX.2 feature wiring (multi-reference images + generation-mode dispatch + regional + // guidance). Klein and [dev] are identical here — only the model loader and text encoder + // identities differ, so they're passed in. Keeping this in one place stops the two variants + // from drifting (e.g. regional guidance being wired for one but not the other). + const addFlux2Features = async ( + flux2Denoise: Invocation<'flux2_denoise'>, + flux2L2i: Invocation<'flux2_vae_decode'>, + flux2Loader: Invocation<'flux2_dev_model_loader'> | Invocation<'flux2_klein_model_loader'>, + regionPosCond: Invocation<'flux2_dev_text_encoder'> | Invocation<'flux2_klein_text_encoder'> + ): Promise> => { + let out: Invocation = flux2L2i; + + // Multi-reference image editing. The 32-channel VAE encode + 4D RoPE position IDs are + // model-agnostic; the backend Flux2RefImageExtension handles both Klein and [dev]. + const validRefImageConfigs = selectRefImagesSlice(state) .entities.filter((entity) => entity.isEnabled) .filter((entity) => isFlux2ReferenceImageConfig(entity.config)) .filter((entity) => getGlobalReferenceImageWarnings(entity, model).length === 0); - if (validFlux2DevRefImageConfigs.length > 0) { + if (validRefImageConfigs.length > 0) { let prevCollect: Invocation<'collect'> | null = null; - for (const { config } of validFlux2DevRefImageConfigs) { + for (const { config } of validRefImageConfigs) { + // FLUX.2 uses the same flux_kontext node - it just packages the image. const kontextConditioning = g.addNode({ type: 'flux_kontext', id: getPrefixedId('flux_kontext'), @@ -399,11 +400,11 @@ export const buildFLUXGraph = async (arg: GraphBuilderArg): Promise>(false); } - // Regional guidance for FLUX.2 [dev]. Same single-attention-mask model as Klein - // (positive prompts only; negatives / auto-negative are blocked by the validators). + // Regional guidance. Positive prompts only (negatives / auto-negative are blocked by the + // validators); the backend applies a single attention mask via joint_attention_kwargs to + // all transformer blocks — no IP adapter / redux integration. if (manager !== null && posCondCollect !== null) { const ipAdapterCollect = g.addNode({ type: 'collect', @@ -479,145 +481,39 @@ export const buildFLUXGraph = async (arg: GraphBuilderArg): Promise; + const flux2DevLoader = modelLoader as Invocation<'flux2_dev_model_loader'>; + const flux2L2i = l2i as Invocation<'flux2_vae_decode'>; + const flux2DevCond = posCond as Invocation<'flux2_dev_text_encoder'>; + + addFlux2DevLoRAs(state, g, flux2Denoise, flux2DevLoader, flux2DevCond); + canvasOutput = await addFlux2Features(flux2Denoise, flux2L2i, flux2DevLoader, flux2DevCond); } else if (isFlux2) { - // Flux2 Klein path + // Flux2 Klein path — Qwen3 model loader / text encoder + the shared feature wiring. const flux2Denoise = denoise as Invocation<'flux2_denoise'>; const flux2ModelLoader = modelLoader as Invocation<'flux2_klein_model_loader'>; const flux2L2i = l2i as Invocation<'flux2_vae_decode'>; const flux2Cond = posCond as Invocation<'flux2_klein_text_encoder'>; addFlux2KleinLoRAs(state, g, flux2Denoise, flux2ModelLoader, flux2Cond); - - // FLUX.2 Klein has built-in multi-reference image editing - no separate model needed - const validFlux2RefImageConfigs = selectRefImagesSlice(state) - .entities.filter((entity) => entity.isEnabled) - .filter((entity) => isFlux2ReferenceImageConfig(entity.config)) - .filter((entity) => getGlobalReferenceImageWarnings(entity, model).length === 0); - - if (validFlux2RefImageConfigs.length > 0) { - let prevCollect: Invocation<'collect'> | null = null; - for (const { config } of validFlux2RefImageConfigs) { - // FLUX.2 uses the same flux_kontext node - it just packages the image - const kontextConditioning = g.addNode({ - type: 'flux_kontext', - id: getPrefixedId('flux_kontext'), - image: zImageField.parse(config.image?.crop?.image ?? config.image?.original.image), - }); - const collectNode = g.addNode({ - type: 'collect', - id: getPrefixedId('flux2_kontext_collect'), - }); - g.addEdge(kontextConditioning, 'kontext_cond', collectNode, 'item'); - if (prevCollect !== null) { - g.addEdge(prevCollect, 'collection', collectNode, 'collection'); - } - prevCollect = collectNode; - } - assert(prevCollect !== null); - g.addEdge(prevCollect, 'collection', flux2Denoise, 'kontext_conditioning'); - - g.upsertMetadata({ ref_images: validFlux2RefImageConfigs }, 'merge'); - } - - if (generationMode === 'txt2img') { - canvasOutput = addTextToImage({ - g, - state, - denoise: flux2Denoise, - l2i: flux2L2i, - }); - g.upsertMetadata({ generation_mode: 'flux2_txt2img' }); - } else if (generationMode === 'img2img') { - assert(manager !== null); - const i2l = g.addNode({ - type: 'flux2_vae_encode', - id: getPrefixedId('flux2_vae_encode'), - }); - canvasOutput = await addImageToImage({ - g, - state, - manager, - l2i: flux2L2i, - i2l, - denoise: flux2Denoise, - vaeSource: flux2ModelLoader, - }); - g.upsertMetadata({ generation_mode: 'flux2_img2img' }); - } else if (generationMode === 'inpaint') { - assert(manager !== null); - const i2l = g.addNode({ - type: 'flux2_vae_encode', - id: getPrefixedId('flux2_vae_encode'), - }); - canvasOutput = await addInpaint({ - g, - state, - manager, - l2i: flux2L2i, - i2l, - denoise: flux2Denoise, - vaeSource: flux2ModelLoader, - modelLoader: flux2ModelLoader, - seed, - }); - g.upsertMetadata({ generation_mode: 'flux2_inpaint' }); - } else if (generationMode === 'outpaint') { - assert(manager !== null); - const i2l = g.addNode({ - type: 'flux2_vae_encode', - id: getPrefixedId('flux2_vae_encode'), - }); - canvasOutput = await addOutpaint({ - g, - state, - manager, - l2i: flux2L2i, - i2l, - denoise: flux2Denoise, - vaeSource: flux2ModelLoader, - modelLoader: flux2ModelLoader, - seed, - }); - g.upsertMetadata({ generation_mode: 'flux2_outpaint' }); - } else { - assert>(false); - } - - // Regional guidance for FLUX.2 Klein. Backend applies a single attention mask via - // joint_attention_kwargs to all transformer blocks — no IP adapter / redux integration. - if (manager !== null && posCondCollect !== null) { - const ipAdapterCollect = g.addNode({ - type: 'collect', - id: getPrefixedId('ip_adapter_collector'), - }); - await addRegions({ - manager, - regions: canvas.regionalGuidance.entities, - g, - bbox: canvas.bbox.rect, - model, - posCond: flux2Cond, - negCond: null, - posCondCollect, - negCondCollect: null, - ipAdapterCollect, - fluxReduxCollect: null, - }); - // The collector exists only for type compatibility with addRegions; FLUX.2 Klein - // does not consume IP adapters, so drop the node if nothing connected to it. - g.deleteNode(ipAdapterCollect.id); - } + canvasOutput = await addFlux2Features(flux2Denoise, flux2L2i, flux2ModelLoader, flux2Cond); } else { // Standard FLUX path with all features const fluxDenoise = denoise as Invocation<'flux_denoise'>; diff --git a/invokeai/frontend/web/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx b/invokeai/frontend/web/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx index a039214c819..65ae2391338 100644 --- a/invokeai/frontend/web/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx +++ b/invokeai/frontend/web/src/features/parameters/components/Advanced/ParamFlux2DevModelSelect.tsx @@ -3,9 +3,9 @@ import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useModelCombobox } from 'common/hooks/useModelCombobox'; import { flux2DevMistralEncoderModelSelected, - flux2DevVaeModelSelected, + flux2VaeModelSelected, selectFlux2DevMistralEncoderModel, - selectFlux2DevVaeModel, + selectFlux2VaeModel, selectMainModelConfig, } from 'features/controlLayers/store/paramsSlice'; import { zModelIdentifierField } from 'features/nodes/types/common'; @@ -27,7 +27,7 @@ import type { MistralEncoderModelConfig, VAEModelConfig } from 'services/api/typ const ParamFlux2DevVaeModelSelect = memo(() => { const dispatch = useAppDispatch(); const { t } = useTranslation(); - const flux2DevVaeModel = useAppSelector(selectFlux2DevVaeModel); + const flux2VaeModel = useAppSelector(selectFlux2VaeModel); const mainModelConfig = useAppSelector(selectMainModelConfig); const [modelConfigs, { isLoading }] = useFlux2VAEModels(); const [diffusersModels] = useFlux2DevDiffusersModels(); @@ -35,9 +35,9 @@ const ParamFlux2DevVaeModelSelect = memo(() => { const _onChange = useCallback( (model: VAEModelConfig | null) => { if (model) { - dispatch(flux2DevVaeModelSelected(zModelIdentifierField.parse(model))); + dispatch(flux2VaeModelSelected(zModelIdentifierField.parse(model))); } else { - dispatch(flux2DevVaeModelSelected(null)); + dispatch(flux2VaeModelSelected(null)); } }, [dispatch] @@ -46,7 +46,7 @@ const ParamFlux2DevVaeModelSelect = memo(() => { const { options, value, onChange, noOptionsMessage } = useModelCombobox({ modelConfigs, onChange: _onChange, - selectedModel: flux2DevVaeModel, + selectedModel: flux2VaeModel, isLoading, }); diff --git a/invokeai/frontend/web/src/features/parameters/components/Advanced/ParamFlux2KleinModelSelect.tsx b/invokeai/frontend/web/src/features/parameters/components/Advanced/ParamFlux2KleinModelSelect.tsx index da9bfcd7b5c..86ba2099a74 100644 --- a/invokeai/frontend/web/src/features/parameters/components/Advanced/ParamFlux2KleinModelSelect.tsx +++ b/invokeai/frontend/web/src/features/parameters/components/Advanced/ParamFlux2KleinModelSelect.tsx @@ -2,10 +2,10 @@ import { Combobox, FormControl, FormLabel } from '@invoke-ai/ui-library'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { useModelCombobox } from 'common/hooks/useModelCombobox'; import { + flux2VaeModelSelected, kleinQwen3EncoderModelSelected, - kleinVaeModelSelected, + selectFlux2VaeModel, selectKleinQwen3EncoderModel, - selectKleinVaeModel, selectMainModelConfig, } from 'features/controlLayers/store/paramsSlice'; import { zModelIdentifierField } from 'features/nodes/types/common'; @@ -22,7 +22,7 @@ import type { Qwen3EncoderModelConfig, VAEModelConfig } from 'services/api/types const ParamFlux2KleinVaeModelSelect = memo(() => { const dispatch = useAppDispatch(); const { t } = useTranslation(); - const kleinVaeModel = useAppSelector(selectKleinVaeModel); + const flux2VaeModel = useAppSelector(selectFlux2VaeModel); const mainModelConfig = useAppSelector(selectMainModelConfig); const [modelConfigs, { isLoading }] = useFlux2VAEModels(); const [diffusersModels] = useFlux2DiffusersModels(); @@ -30,9 +30,9 @@ const ParamFlux2KleinVaeModelSelect = memo(() => { const _onChange = useCallback( (model: VAEModelConfig | null) => { if (model) { - dispatch(kleinVaeModelSelected(zModelIdentifierField.parse(model))); + dispatch(flux2VaeModelSelected(zModelIdentifierField.parse(model))); } else { - dispatch(kleinVaeModelSelected(null)); + dispatch(flux2VaeModelSelected(null)); } }, [dispatch] @@ -41,7 +41,7 @@ const ParamFlux2KleinVaeModelSelect = memo(() => { const { options, value, onChange, noOptionsMessage } = useModelCombobox({ modelConfigs, onChange: _onChange, - selectedModel: kleinVaeModel, + selectedModel: flux2VaeModel, isLoading, }); diff --git a/invokeai/frontend/web/src/features/queue/store/readiness.test.ts b/invokeai/frontend/web/src/features/queue/store/readiness.test.ts index 435224642e7..162565e6811 100644 --- a/invokeai/frontend/web/src/features/queue/store/readiness.test.ts +++ b/invokeai/frontend/web/src/features/queue/store/readiness.test.ts @@ -48,7 +48,7 @@ const flux2GGUF9BModel = { variant: 'klein_9b', } as unknown as MainModelConfig; -const kleinVaeModel = { key: 'vae', name: 'VAE', base: 'flux2', type: 'vae' }; +const flux2VaeModel = { key: 'vae', name: 'VAE', base: 'flux2', type: 'vae' }; const kleinQwen3Model = { key: 'qwen3', name: 'Qwen3', base: 'flux2', type: 'qwen3_encoder' }; const baseDynamicPrompts: DynamicPromptsState = { @@ -69,7 +69,7 @@ const baseRefImages: RefImagesState = { const baseParams = { positivePrompt: 'test', - kleinVaeModel: null, + flux2VaeModel: null, kleinQwen3EncoderModel: null, } as unknown as ParamsState; @@ -77,7 +77,7 @@ const baseParams = { const buildGenerateTabArg = (overrides: { model?: MainModelConfig | null; - kleinVaeModel?: unknown; + flux2VaeModel?: unknown; kleinQwen3EncoderModel?: unknown; hasFlux2DiffusersVaeSource?: boolean; hasFlux2DiffusersQwen3Source?: boolean; @@ -87,7 +87,7 @@ const buildGenerateTabArg = (overrides: { model: overrides.model ?? flux2DiffusersModel, params: { ...baseParams, - kleinVaeModel: overrides.kleinVaeModel ?? null, + flux2VaeModel: overrides.flux2VaeModel ?? null, kleinQwen3EncoderModel: overrides.kleinQwen3EncoderModel ?? null, } as unknown as ParamsState, refImages: baseRefImages, @@ -100,7 +100,7 @@ const buildGenerateTabArg = (overrides: { const buildCanvasTabArg = (overrides: { model?: MainModelConfig | null; - kleinVaeModel?: unknown; + flux2VaeModel?: unknown; kleinQwen3EncoderModel?: unknown; hasFlux2DiffusersVaeSource?: boolean; hasFlux2DiffusersQwen3Source?: boolean; @@ -121,7 +121,7 @@ const buildCanvasTabArg = (overrides: { }, params: { ...baseParams, - kleinVaeModel: overrides.kleinVaeModel ?? null, + flux2VaeModel: overrides.flux2VaeModel ?? null, kleinQwen3EncoderModel: overrides.kleinQwen3EncoderModel ?? null, } as unknown as ParamsState, refImages: baseRefImages, @@ -172,7 +172,7 @@ describe('FLUX.2 Klein readiness checks – generate tab', () => { it('errors only for Qwen3 when GGUF model with standalone VAE but no Qwen3 and no diffusers source', () => { const reasons = getReasonsWhyCannotEnqueueGenerateTab( - buildGenerateTabArg({ model: flux2GGUF4BModel, kleinVaeModel: kleinVaeModel }) + buildGenerateTabArg({ model: flux2GGUF4BModel, flux2VaeModel: flux2VaeModel }) ); expect(hasFlux2VaeReason(reasons)).toBe(false); expect(hasFlux2Qwen3Reason(reasons)).toBe(true); @@ -190,7 +190,7 @@ describe('FLUX.2 Klein readiness checks – generate tab', () => { const reasons = getReasonsWhyCannotEnqueueGenerateTab( buildGenerateTabArg({ model: flux2GGUF4BModel, - kleinVaeModel: kleinVaeModel, + flux2VaeModel: flux2VaeModel, kleinQwen3EncoderModel: kleinQwen3Model, }) ); @@ -254,7 +254,7 @@ describe('FLUX.2 Klein readiness checks – canvas tab', () => { const reasons = getReasonsWhyCannotEnqueueCanvasTab( buildCanvasTabArg({ model: flux2GGUF4BModel, - kleinVaeModel: kleinVaeModel, + flux2VaeModel: flux2VaeModel, kleinQwen3EncoderModel: kleinQwen3Model, }) as never ); diff --git a/invokeai/frontend/web/src/features/queue/store/readiness.ts b/invokeai/frontend/web/src/features/queue/store/readiness.ts index b693260782a..128b04c6873 100644 --- a/invokeai/frontend/web/src/features/queue/store/readiness.ts +++ b/invokeai/frontend/web/src/features/queue/store/readiness.ts @@ -300,7 +300,7 @@ export const getReasonsWhyCannotEnqueueGenerateTab = (arg: { // pipeline of the matching variant family is installed to extract from. if ('variant' in model && model.variant === 'dev') { // FLUX.2 [dev]: needs FLUX.2 VAE + Mistral text encoder. - if (!params.flux2DevVaeModel && !hasFlux2DevDiffusersSource) { + if (!params.flux2VaeModel && !hasFlux2DevDiffusersSource) { reasons.push({ content: i18n.t('parameters.invoke.noFlux2DevVaeModelSelected') }); } if (!params.flux2DevMistralEncoderModel && !hasFlux2DevDiffusersSource) { @@ -308,7 +308,7 @@ export const getReasonsWhyCannotEnqueueGenerateTab = (arg: { } } else { // FLUX.2 Klein: needs FLUX.2 VAE + Qwen3 text encoder (variant-matched). - if (!params.kleinVaeModel && !hasFlux2DiffusersVaeSource) { + if (!params.flux2VaeModel && !hasFlux2DiffusersVaeSource) { reasons.push({ content: i18n.t('parameters.invoke.noFlux2KleinVaeModelSelected') }); } if (!params.kleinQwen3EncoderModel && !hasFlux2DiffusersQwen3Source) { @@ -637,14 +637,14 @@ export const getReasonsWhyCannotEnqueueCanvasTab = (arg: { // pipeline of the matching variant family is installed to extract from. if (model.format !== 'diffusers') { if ('variant' in model && model.variant === 'dev') { - if (!params.flux2DevVaeModel && !hasFlux2DevDiffusersSource) { + if (!params.flux2VaeModel && !hasFlux2DevDiffusersSource) { reasons.push({ content: i18n.t('parameters.invoke.noFlux2DevVaeModelSelected') }); } if (!params.flux2DevMistralEncoderModel && !hasFlux2DevDiffusersSource) { reasons.push({ content: i18n.t('parameters.invoke.noFlux2DevMistralEncoderModelSelected') }); } } else { - if (!params.kleinVaeModel && !hasFlux2DiffusersVaeSource) { + if (!params.flux2VaeModel && !hasFlux2DiffusersVaeSource) { reasons.push({ content: i18n.t('parameters.invoke.noFlux2KleinVaeModelSelected') }); } if (!params.kleinQwen3EncoderModel && !hasFlux2DiffusersQwen3Source) { From 4a3b5edc59975eea4ef8b4c94dcc92fdd0ae774c Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Wed, 22 Jul 2026 15:20:46 +0200 Subject: [PATCH 16/25] Fix: bump paramsSlice persist version to 4 for the shared FLUX.2 VAE slot The v3->v4 migration (Klein/dev VAE slots -> flux2VaeModel) bumped _version but left zParamsState._version at literal(3) and the initial state at 3, so migrate()'s final zParamsState.parse rejected with "expected 3". Bump the schema literal + initial state to 4 and add a v3->v4 migration test. --- .../controlLayers/store/paramsSlice.test.ts | 25 ++++++++++++++++++- .../src/features/controlLayers/store/types.ts | 4 +-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.test.ts b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.test.ts index d210d2fd2ac..586f95c6368 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.test.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.test.ts @@ -157,7 +157,7 @@ describe('paramsSliceConfig persisted state migration', () => { const result = migrate?.(v2State) as ReturnType; - expect(result._version).toBe(3); + expect(result._version).toBe(4); expect(result.qwenImageVaeModel).toBeNull(); expect(result.qwenImageQwenVLEncoderModel).toBeNull(); // Existing params should be preserved @@ -168,6 +168,29 @@ describe('paramsSliceConfig persisted state migration', () => { expect(result.dimensions.height).toBe(768); }); + it('merges the separate Klein / dev VAE slots into flux2VaeModel when migrating from v3', () => { + expect(migrate).toBeDefined(); + + const initial = getInitialParamsState(); + const kleinVae = { key: 'klein-vae', hash: 'h', name: 'Klein VAE', base: 'flux2', type: 'vae' }; + // Pre-PR v3 state: separate Klein / dev VAE slots, no shared flux2VaeModel. + const v3State: Record = { + ...initial, + _version: 3, + kleinVaeModel: kleinVae, + flux2DevVaeModel: null, + }; + delete v3State.flux2VaeModel; + + const result = migrate?.(v3State) as ReturnType & Record; + + expect(result._version).toBe(4); + expect((result.flux2VaeModel as { key: string } | null)?.key).toBe('klein-vae'); + // The old slots must be gone. + expect(result.kleinVaeModel).toBeUndefined(); + expect(result.flux2DevVaeModel).toBeUndefined(); + }); + it('migrates old positive prompt history entries to prompt pairs', () => { expect(migrate).toBeDefined(); diff --git a/invokeai/frontend/web/src/features/controlLayers/store/types.ts b/invokeai/frontend/web/src/features/controlLayers/store/types.ts index a0533260c86..f0306c1152f 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/types.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/types.ts @@ -796,7 +796,7 @@ export const zInfillMethod = z.enum(['patchmatch', 'lama', 'cv2', 'color', 'tile export type InfillMethod = z.infer; export const zParamsState = z.object({ - _version: z.literal(3), + _version: z.literal(4), maskBlur: z.number(), maskBlurMethod: zParameterMaskBlurMethod, canvasCoherenceMode: zParameterCanvasCoherenceMode, @@ -890,7 +890,7 @@ export const zParamsState = z.object({ }); export type ParamsState = z.infer; export const getInitialParamsState = (): ParamsState => ({ - _version: 3, + _version: 4, maskBlur: 16, maskBlurMethod: 'box', canvasCoherenceMode: 'Gaussian Blur', From 5026c02fbc7f23b6af17a7447c09ff18b7f68cee Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Sat, 25 Jul 2026 04:30:27 +0200 Subject: [PATCH 17/25] Fix: address FLUX.2 [dev] round-2 review (4 blockers + 6 cleanups) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Blockers: - params migration: seed flux2DevMistralEncoderModel in the v3->v4 step so a genuine v3 blob passes zParamsState.parse() instead of wiping the whole params slice on upgrade; rebuild the migration test fixture as a field-accurate v3 object so it actually covers the regression. - guidance for [dev]: resolve the image's own model in the Guidance metadata parse gate and exempt variant === 'dev' so guidance is displayed/recalled for [dev] (still skipped for Klein); render the guidance slider for FLUX.2 [dev]. - source-model variant guard: require variant == Dev where the dev loader validates its Mistral/VAE source, and reject a [dev] source in the Klein loader — a mismatched pipeline otherwise fails with an opaque matmul error in denoise. - tokenizer offline load: drop the dead root-dir fallback + duplicated pre-try and add a root-directory AutoProcessor step to _load_tokenizer_for_model so processor files alongside the encoder weights load offline. Cleanups: - extract _reinit_inv_freq() with a rope_theta -> rope_parameters/rope_scaling fallback (fixes a latent AttributeError on pinned transformers 5.5, removes a verbatim duplicate). - flux2_dev_lora_collection_loader: replace the base assert with a ValueError that rejects non-FLUX.2 LoRAs, mirroring the Klein collection loader. - diffusers Mistral load: drop the never-run vision_tower/multi_modal_projector (~0.8GB) so they stay out of the cache and VRAM transfers. - clear flux2DevMistralEncoderModel on base switch and intra-flux2 variant switch. - pin mistral-common>=1.5.4,<2 (validated against 1.11.6). - fix contradictory 40-layer docstrings to match the taxonomy/loader story. --- .../app/invocations/flux2_dev_lora_loader.py | 11 ++- .../app/invocations/flux2_dev_model_loader.py | 11 +++ .../app/invocations/flux2_dev_text_encoder.py | 23 +++--- .../invocations/flux2_klein_model_loader.py | 12 ++- .../load/model_loaders/mistral_encoder.py | 78 +++++++++++-------- .../backend/model_manager/starter_models.py | 14 ++-- .../listeners/modelSelected.ts | 37 +++++---- .../controlLayers/store/paramsSlice.test.ts | 13 +++- .../controlLayers/store/paramsSlice.ts | 3 + .../src/features/metadata/parsing.test.tsx | 62 +++++++++++---- .../web/src/features/metadata/parsing.tsx | 28 +++++-- .../GenerationSettingsAccordion.tsx | 3 + pyproject.toml | 4 +- uv.lock | 2 +- 14 files changed, 213 insertions(+), 88 deletions(-) diff --git a/invokeai/app/invocations/flux2_dev_lora_loader.py b/invokeai/app/invocations/flux2_dev_lora_loader.py index 2e656defae0..6c4e75cda09 100644 --- a/invokeai/app/invocations/flux2_dev_lora_loader.py +++ b/invokeai/app/invocations/flux2_dev_lora_loader.py @@ -159,7 +159,16 @@ def invoke(self, context: InvocationContext) -> Flux2DevLoRALoaderOutput: continue if not context.models.exists(lora.lora.key): raise Exception(f"Unknown lora: {lora.lora.key}!") - assert lora.lora.base in (BaseModelType.Flux, BaseModelType.Flux2) + + # A FLUX.1 LoRA (base `flux`) has no variant field, so `_assert_dev_lora` below + # would pass it through to model patching where it fails late. Fail fast here with + # a clear error instead, matching the Klein collection loader. (A bare `assert` + # would also be stripped under `python -O`.) + if lora.lora.base is not BaseModelType.Flux2: + raise ValueError( + f"LoRA '{lora.lora.key}' is for {lora.lora.base.value if lora.lora.base else 'unknown'} models, " + "not FLUX.2 [dev] models. Ensure you are using a FLUX.2 [dev] compatible LoRA." + ) lora_config = context.models.get_config(lora.lora.key) # Reject variant-mismatched LoRAs, matching the single-LoRA loader above. diff --git a/invokeai/app/invocations/flux2_dev_model_loader.py b/invokeai/app/invocations/flux2_dev_model_loader.py index 1ed3cd8b34b..4c1f437f1d4 100644 --- a/invokeai/app/invocations/flux2_dev_model_loader.py +++ b/invokeai/app/invocations/flux2_dev_model_loader.py @@ -177,3 +177,14 @@ def _validate_diffusers_format( f"The {model_name} model must be a Diffusers format model. " f"The selected model '{config.name}' is in {config.format.value} format." ) + # The source's VAE/tokenizer/encoder are extracted and paired with the [dev] transformer. + # A Klein pipeline's Qwen3 tokenizer + encoder silently pass the layer-count guard and + # produce a wrong-width conditioning that only surfaces as an opaque matmul error deep in + # denoise, so reject non-[dev] sources here where the user still gets a clear message. + variant = getattr(config, "variant", None) + if variant is not None and variant != Flux2VariantType.Dev: + raise ValueError( + f"The {model_name} model must be a FLUX.2 [dev] pipeline, " + f"but the selected model '{config.name}' is variant '{variant.value}'. " + "Its text encoder / VAE are incompatible with the [dev] transformer." + ) diff --git a/invokeai/app/invocations/flux2_dev_text_encoder.py b/invokeai/app/invocations/flux2_dev_text_encoder.py index 9274fc15488..2d4cc472069 100644 --- a/invokeai/app/invocations/flux2_dev_text_encoder.py +++ b/invokeai/app/invocations/flux2_dev_text_encoder.py @@ -1,18 +1,23 @@ """FLUX.2 [dev] text encoder invocation. -FLUX.2 [dev] uses the BFL "cow-mistral3-small" 30-layer Mistral distillation as -its sole text encoder (sometimes referred to as "Mistral Small 3" in BFL's -documentation, but the shipped weights are the 30-layer cow variant — upstream -40-layer Mistral Small 3.1 / 3.2 does not work): +FLUX.2 [dev] uses a Mistral Small 3 (hidden_size=5120) text encoder. Two variants +are supported (see ``MistralVariantType``), both read at the same hidden-state +indices (10, 20, 30): + +- **Mistral24B** — the 40-layer encoder BFL ships in the canonical + ``black-forest-labs/FLUX.2-dev/text_encoder``. This is the default pipeline + encoder; the loader keeps its final RMSNorm. +- **Cow** — the 30-layer "cow-mistral3-small" distillation, recommended for best + prompt adherence. On a 30-layer model the indices map to (1/3, 2/3, last), and + the loader drops the final RMSNorm to match ComfyUI's reference (``final_norm=False``). + +Pipeline, per generation: - A fixed system message biases the model toward structured image descriptions. - The user prompt is wrapped in Mistral's chat template via the multimodal AutoProcessor. -- Three intermediate hidden states (layers 10, 20, 30) are stacked and flattened - to produce a (B, seq, 3 * hidden_size) = (B, seq, 15360) tensor matching the - FLUX.2 transformer's joint_attention_dim. For the 30-layer cow model those - indices map to (1/3, 2/3, last) — exactly what BFL's joint attention was - trained to consume. +- The three hidden states are concatenated to a (B, seq, 3 * hidden_size) = + (B, seq, 15360) tensor matching the FLUX.2 transformer's joint_attention_dim. """ from contextlib import ExitStack diff --git a/invokeai/app/invocations/flux2_klein_model_loader.py b/invokeai/app/invocations/flux2_klein_model_loader.py index 2091fd380d7..1af65fc1ca0 100644 --- a/invokeai/app/invocations/flux2_klein_model_loader.py +++ b/invokeai/app/invocations/flux2_klein_model_loader.py @@ -173,13 +173,23 @@ def invoke(self, context: InvocationContext) -> Flux2KleinModelLoaderOutput: def _validate_diffusers_format( self, context: InvocationContext, model: ModelIdentifierField, model_name: str ) -> None: - """Validate that a model is in Diffusers format.""" + """Validate that a model is a Diffusers-format FLUX.2 Klein pipeline (not [dev]).""" config = context.models.get_config(model) if config.format != ModelFormat.Diffusers: raise ValueError( f"The {model_name} model must be a Diffusers format model. " f"The selected model '{config.name}' is in {config.format.value} format." ) + # Mirror of the [dev] loader's guard: a [dev] pipeline's Mistral tokenizer + encoder are + # extracted here and paired with a Klein transformer, producing wrong-width conditioning + # that only surfaces as an opaque matmul error deep in denoise. Reject it up front. + variant = getattr(config, "variant", None) + if variant == Flux2VariantType.Dev: + raise ValueError( + f"The {model_name} model must be a FLUX.2 Klein pipeline, " + f"but the selected model '{config.name}' is FLUX.2 [dev]. " + "Its Mistral text encoder / VAE are incompatible with the Klein transformer." + ) def _validate_qwen3_encoder_variant(self, context: InvocationContext, main_config) -> None: """Validate that the standalone Qwen3 encoder variant matches the FLUX.2 Klein variant. diff --git a/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py b/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py index b04e540afbe..a5bb021dbc5 100644 --- a/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py +++ b/invokeai/backend/model_manager/load/model_loaders/mistral_encoder.py @@ -233,6 +233,27 @@ def _convert_for_bare_mistral_model(sd: dict[str, Any]) -> dict[str, Any]: return out +def _reinit_inv_freq(model: torch.nn.Module, config: Any, dtype: torch.dtype) -> None: + """Re-initialize any RoPE ``inv_freq`` buffers still on the meta device. + + ``inv_freq`` is derived from config rather than stored in the checkpoint, so a + meta buffer here must be recomputed before ``_materialize_remaining_meta_tensors`` + zero-fills it. NB: transformers 5.x moved ``rope_theta`` into the + ``rope_parameters``/``rope_scaling`` dict, so reading ``config.rope_theta`` + directly raises ``AttributeError`` on the pinned version — fall back through both + (matching the z_image loaders). + """ + rope_params = getattr(config, "rope_parameters", None) or getattr(config, "rope_scaling", None) or {} + rope_theta = rope_params.get("rope_theta") or getattr(config, "rope_theta", 1000000.0) + for name, buffer in list(model.named_buffers()): + if not (buffer.is_meta and name.endswith("inv_freq")): + continue + parts = name.rsplit(".", 1) + parent = model.get_submodule(parts[0]) if len(parts) == 2 else model + inv_freq = 1.0 / (rope_theta ** (torch.arange(0, config.head_dim, 2, dtype=torch.float32) / config.head_dim)) + parent.register_buffer(parts[-1], inv_freq.to(dtype), persistent=False) + + def _materialize_remaining_meta_tensors(model: torch.nn.Module, dtype: torch.dtype, logger) -> None: """Replace any parameters/buffers still on the meta device after load_state_dict. @@ -623,7 +644,9 @@ def _load_tokenizer_for_model(model_path: Path, logger: Any) -> AnyModel: the canonical Tekken JSON as a ``tekken_model`` U8 tensor; we extract it and wrap it via ``mistral_common``. 2. **Sibling ``tokenizer/`` folder** — diffusers-style HuggingFace layouts. - 3. **BFL HuggingFace fallback** — fetches the canonical tokenizer from + 3. **Root-directory processor files** — standalone downloads that ship the + processor files alongside the encoder weights at the folder root. + 4. **BFL HuggingFace fallback** — fetches the canonical tokenizer from ``black-forest-labs/FLUX.2-dev/tokenizer``. """ # 1. Single-file with embedded Tekken @@ -631,8 +654,8 @@ def _load_tokenizer_for_model(model_path: Path, logger: Any) -> AnyModel: if embedded is not None: return embedded - # 2. Diffusers folder with sibling tokenizer/ if model_path.is_dir(): + # 2. Diffusers folder with sibling tokenizer/ tokenizer_dir = model_path / "tokenizer" if tokenizer_dir.exists(): try: @@ -649,8 +672,15 @@ def _load_tokenizer_for_model(model_path: Path, logger: Any) -> AnyModel: embedded = _try_load_embedded_tekken(st, logger) if embedded is not None: return embedded + # 3. Processor files alongside the encoder weights at the folder root. + try: + obj = AutoProcessor.from_pretrained(model_path, local_files_only=True) + logger.info(f"Loaded Mistral tokenizer from model root: {type(obj).__name__}") + return obj + except (OSError, EnvironmentError, ValueError): + pass - # 3. HF fallback + # 4. HF fallback return _load_tokenizer_from_hf(logger) @@ -676,15 +706,10 @@ def _load_model( model_path = Path(config.path) text_encoder_path = model_path / "text_encoder" - tokenizer_path = model_path / "tokenizer" # Standalone download: text_encoder files at the root. if not text_encoder_path.exists() and (model_path / "config.json").exists(): text_encoder_path = model_path - if not tokenizer_path.exists(): - # If tokenizer was not co-downloaded, fall back to root (some standalone - # downloads include processor files alongside the encoder weights). - tokenizer_path = model_path target_device = TorchDevice.choose_torch_device() model_dtype = TorchDevice.choose_bfloat16_safe_dtype(target_device) @@ -692,13 +717,8 @@ def _load_model( match submodel_type: case SubModelType.Tokenizer: logger = InvokeAILogger.get_logger("MistralEncoderProcessor") - # Try the sibling tokenizer/ first when the diffusers folder ships one, - # else fall through to the multi-strategy loader (embedded Tekken / HF). - if tokenizer_path.exists() and tokenizer_path != model_path: - try: - return AutoProcessor.from_pretrained(tokenizer_path, local_files_only=True) - except (OSError, EnvironmentError): - pass + # Let the multi-strategy loader own the full ladder: embedded Tekken, + # sibling tokenizer/, root-level processor files, then the HF fallback. return _load_tokenizer_for_model(model_path, logger) case SubModelType.TextEncoder: # Lazy import: transformers may load `Mistral3ForConditionalGeneration` @@ -720,6 +740,14 @@ def _load_model( logger = InvokeAILogger.get_logger("MistralEncoderDiffusersLoader") _strip_final_norm_for_cow(inner, config.variant, logger) _warn_if_40_layer_mistral(config.variant, logger) + # The BFL `text_encoder` checkpoint maps to `Mistral3Model`, which ships a + # `vision_tower` + `multi_modal_projector` (~0.8GB of real weights). The + # invocation only ever runs `.language_model`, so drop the vision path to + # keep it out of the RAM cache and every cache->VRAM transfer. The + # checkpoint/GGUF loaders already build a bare `MistralModel`. + for unused in ("vision_tower", "multi_modal_projector"): + if getattr(model, unused, None) is not None: + setattr(model, unused, None) return model raise ValueError( @@ -814,15 +842,7 @@ def _load_text_encoder(self, config: MistralEncoder_Checkpoint_Config) -> AnyMod continue # Re-init any remaining meta buffers (e.g. RoPE inv_freq is computed from config). - for name, buffer in list(model.named_buffers()): - if buffer.is_meta and name.endswith("inv_freq"): - parts = name.rsplit(".", 1) - parent = model.get_submodule(parts[0]) if len(parts) == 2 else model - inv_freq = 1.0 / ( - mistral_config.rope_theta - ** (torch.arange(0, mistral_config.head_dim, 2, dtype=torch.float32) / mistral_config.head_dim) - ) - parent.register_buffer(parts[-1], inv_freq.to(model_dtype), persistent=False) + _reinit_inv_freq(model, mistral_config, model_dtype) _materialize_remaining_meta_tensors(model, model_dtype, logger) _strip_final_norm_for_cow(model, config.variant, logger) @@ -918,15 +938,7 @@ def _load_from_gguf(self, config: MistralEncoder_GGUF_Config) -> AnyModel: if isinstance(embed_weight, GGMLTensor): model.embed_tokens.weight = torch.nn.Parameter(embed_weight.get_dequantized_tensor(), requires_grad=False) - for name, buffer in list(model.named_buffers()): - if buffer.is_meta and name.endswith("inv_freq"): - parts = name.rsplit(".", 1) - parent = model.get_submodule(parts[0]) if len(parts) == 2 else model - inv_freq = 1.0 / ( - mistral_config.rope_theta - ** (torch.arange(0, mistral_config.head_dim, 2, dtype=torch.float32) / mistral_config.head_dim) - ) - parent.register_buffer(parts[-1], inv_freq.to(compute_dtype), persistent=False) + _reinit_inv_freq(model, mistral_config, compute_dtype) _materialize_remaining_meta_tensors(model, compute_dtype, logger) _strip_final_norm_for_cow(model, config.variant, logger) diff --git a/invokeai/backend/model_manager/starter_models.py b/invokeai/backend/model_manager/starter_models.py index 669c39e2008..7ae36d68fea 100644 --- a/invokeai/backend/model_manager/starter_models.py +++ b/invokeai/backend/model_manager/starter_models.py @@ -1034,12 +1034,14 @@ class StarterModelBundle(BaseModel): # Non-Commercial License. # --- Text encoders --- -# Only the 30-layer "cow-mistral3-small" distillation works for FLUX.2 [dev]. -# BFL's joint attention was trained against hidden states at indices (10, 20, 30) -# of a 30-layer Mistral — extracting from upstream Mistral Small 3.1 / 3.2 (40 -# layers) samples at different relative depths and produces off-distribution -# embeddings. Both the gguf-org cow GGUFs and Comfy-Org's safetensors are the -# same 30-layer cow weights, just packaged differently. +# FLUX.2 [dev] reads Mistral hidden states at indices (10, 20, 30). Two encoders work: +# - The 40-layer Mistral Small 3 (24B) that BFL ships as the canonical +# FLUX.2-dev/text_encoder — the default; loads fine but has visibly weaker prompt +# adherence because those indices land at different relative depths. +# - The 30-layer "cow-mistral3-small" distillation — recommended for best adherence +# (on a 30-layer model the indices hit 1/3, 2/3, last, matching what the joint +# attention was trained against). The gguf-org cow GGUFs and Comfy-Org's safetensors +# are the same 30-layer cow weights, just packaged differently. # Comfy-Org safetensors (single-file, 30-layer cow, with embedded Tekken tokenizer). # Higher precision than the cow GGUFs and avoids the Tekken-via-HF-Hub fetch. diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts index 1d67713b953..3a68b871e54 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts @@ -7,6 +7,7 @@ import { animaQwen3EncoderModelSelected, animaVaeModelSelected, aspectRatioIdChanged, + flux2DevMistralEncoderModelSelected, flux2VaeModelSelected, kleinQwen3EncoderModelSelected, modelChanged, @@ -236,7 +237,7 @@ export const addModelSelectedListener = (startAppListening: AppStartListening) = } // handle incompatible FLUX.2 models - clear if switching away from flux2 - const { flux2VaeModel, kleinQwen3EncoderModel } = state.params; + const { flux2VaeModel, kleinQwen3EncoderModel, flux2DevMistralEncoderModel } = state.params; if (newBase !== 'flux2') { if (flux2VaeModel) { dispatch(flux2VaeModelSelected(null)); @@ -246,6 +247,10 @@ export const addModelSelectedListener = (startAppListening: AppStartListening) = dispatch(kleinQwen3EncoderModelSelected(null)); modelsUpdatedDisabledOrCleared += 1; } + if (flux2DevMistralEncoderModel) { + dispatch(flux2DevMistralEncoderModelSelected(null)); + modelsUpdatedDisabledOrCleared += 1; + } } // handle incompatible Qwen Image Edit component source - clear if switching away @@ -474,12 +479,13 @@ export const addModelSelectedListener = (startAppListening: AppStartListening) = } } - // Handle FLUX.2 Klein model changes within the same base (different variants need different encoders) - // Clear the Qwen3 encoder only when switching between different Klein variants - // (e.g., klein_4b needs qwen3_4b, klein_9b needs qwen3_8b) + // Handle FLUX.2 model changes within the same base (different variants need different encoders). + // Clear the standalone encoder slots only when switching between different variants: + // - Klein Qwen3 encoder (klein_4b needs qwen3_4b, klein_9b needs qwen3_8b) + // - [dev] Mistral encoder (only valid for the `dev` variant; stale on any Klein variant) if (newBase === 'flux2' && state.params.model?.base === 'flux2' && newModel.key !== state.params.model?.key) { - const { kleinQwen3EncoderModel } = state.params; - if (kleinQwen3EncoderModel) { + const { kleinQwen3EncoderModel, flux2DevMistralEncoderModel } = state.params; + if (kleinQwen3EncoderModel || flux2DevMistralEncoderModel) { // Get model configs to compare variants const modelConfigsResult = selectModelConfigsQuery(state); if (modelConfigsResult.data) { @@ -494,13 +500,18 @@ export const addModelSelectedListener = (startAppListening: AppStartListening) = const newVariant = newModelConfig && 'variant' in newModelConfig ? newModelConfig.variant : null; if (oldVariant !== newVariant) { - dispatch(kleinQwen3EncoderModelSelected(null)); - toast({ - id: 'KLEIN_ENCODER_CLEARED', - title: t('toast.kleinEncoderCleared'), - description: t('toast.kleinEncoderClearedDescription'), - status: 'info', - }); + if (kleinQwen3EncoderModel) { + dispatch(kleinQwen3EncoderModelSelected(null)); + toast({ + id: 'KLEIN_ENCODER_CLEARED', + title: t('toast.kleinEncoderCleared'), + description: t('toast.kleinEncoderClearedDescription'), + status: 'info', + }); + } + if (flux2DevMistralEncoderModel) { + dispatch(flux2DevMistralEncoderModelSelected(null)); + } } } } diff --git a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.test.ts b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.test.ts index 586f95c6368..6baf7ceecda 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.test.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.test.ts @@ -173,19 +173,30 @@ describe('paramsSliceConfig persisted state migration', () => { const initial = getInitialParamsState(); const kleinVae = { key: 'klein-vae', hash: 'h', name: 'Klein VAE', base: 'flux2', type: 'vae' }; - // Pre-PR v3 state: separate Klein / dev VAE slots, no shared flux2VaeModel. + // Pre-PR v3 state: separate Klein / dev VAE slots, no shared flux2VaeModel and none of the + // other v4-only keys. Deleting both is what makes this a field-accurate v3 blob — without it + // the fixture carries flux2DevMistralEncoderModel from getInitialParamsState() and masks the + // migration's missing seed (which makes zParamsState.parse() throw on real upgrades). const v3State: Record = { ...initial, _version: 3, + positivePrompt: 'a fluffy cat', + seed: 42, kleinVaeModel: kleinVae, flux2DevVaeModel: null, }; delete v3State.flux2VaeModel; + delete v3State.flux2DevMistralEncoderModel; const result = migrate?.(v3State) as ReturnType & Record; expect(result._version).toBe(4); expect((result.flux2VaeModel as { key: string } | null)?.key).toBe('klein-vae'); + // The new standalone dev Mistral encoder slot must be seeded, not left undefined. + expect(result.flux2DevMistralEncoderModel).toBeNull(); + // Unrelated params must survive the migration (they'd be wiped if parse() threw). + expect(result.positivePrompt).toBe('a fluffy cat'); + expect(result.seed).toBe(42); // The old slots must be gone. expect(result.kleinVaeModel).toBeUndefined(); expect(result.flux2DevVaeModel).toBeUndefined(); diff --git a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts index 68bd7e219cd..526b1106114 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts @@ -776,8 +776,11 @@ export const paramsSliceConfig: SliceConfig = { if (state._version === 3) { // v3 -> v4, merge the separate Klein / [dev] FLUX.2 VAE slots into one shared // flux2VaeModel (both drew from the same FLUX.2 VAE pool). Keep whichever was set. + // Also seed the new standalone [dev] Mistral encoder slot — it's nullable with no + // default, so a genuine v3 blob without the key fails zParamsState.parse() otherwise. state._version = 4; state.flux2VaeModel = state.kleinVaeModel ?? state.flux2DevVaeModel ?? null; + state.flux2DevMistralEncoderModel = null; delete state.kleinVaeModel; delete state.flux2DevVaeModel; } diff --git a/invokeai/frontend/web/src/features/metadata/parsing.test.tsx b/invokeai/frontend/web/src/features/metadata/parsing.test.tsx index 06e0302d00d..d00428d498c 100644 --- a/invokeai/frontend/web/src/features/metadata/parsing.test.tsx +++ b/invokeai/frontend/web/src/features/metadata/parsing.test.tsx @@ -183,24 +183,56 @@ describe('ImageMetadataHandlers — Klein recall gating', () => { }); }); - describe('Guidance (legacy FLUX.2 gating)', () => { - // Prior to the Klein guidance cleanup, FLUX.2 images wrote a `guidance` - // field into metadata. The guidance scalar is inert for all current Klein - // variants, so legacy values must not be recalled into the shared guidance - // state — otherwise they leak back into FLUX.1 when the user switches - // models. - it('rejects parsing when the image was generated with a FLUX.2 model', async () => { + describe('Guidance (FLUX.2 variant gating)', () => { + // guidance_embeds is inert for FLUX.2 Klein, so a legacy Klein `guidance` + // value must not be recalled into the shared guidance state — otherwise it + // leaks back into FLUX.1 when the user switches models. FLUX.2 [dev] genuinely + // consumes guidance, so it must parse and recall. The handler resolves the + // image's own model to read its variant. + it('rejects parsing when the image was generated with a FLUX.2 Klein model', async () => { + modelRegistry['k'] = fakeMainModel('klein_9b'); const store = makeStore(); await expect( - Promise.resolve().then(() => - ImageMetadataHandlers.Guidance.parse( - { - model: { key: 'k', hash: 'h', name: 'Klein 9B Base', base: 'flux2', type: 'main' }, - guidance: 3.5, - }, - store - ) + ImageMetadataHandlers.Guidance.parse( + { + model: { key: 'k', hash: 'h', name: 'Klein 9B Base', base: 'flux2', type: 'main' }, + guidance: 3.5, + }, + store + ) + ).rejects.toThrow(); + }); + + it('parses successfully when the image was generated with a FLUX.2 [dev] model', async () => { + modelRegistry['k'] = fakeMainModel('dev'); + const store = makeStore(); + + const parsed = await ImageMetadataHandlers.Guidance.parse( + { + model: { key: 'k', hash: 'h', name: 'FLUX.2 dev', base: 'flux2', type: 'main' }, + guidance: 3.5, + }, + store + ); + + expect(parsed).toBe(3.5); + }); + + it('rejects when the FLUX.2 model can no longer be resolved', async () => { + // Uninstalled/unresolvable model: we cannot confirm it was [dev], so fall + // back to the safe Klein behavior and skip rather than leak a stale value. + modelRegistry = {}; + nextResolved = fakeModel('vae', 'flux2'); // no variant field + const store = makeStore(); + + await expect( + ImageMetadataHandlers.Guidance.parse( + { + model: { key: 'gone', hash: 'h', name: 'Uninstalled', base: 'flux2', type: 'main' }, + guidance: 3.5, + }, + store ) ).rejects.toThrow(); }); diff --git a/invokeai/frontend/web/src/features/metadata/parsing.tsx b/invokeai/frontend/web/src/features/metadata/parsing.tsx index 3feae363308..35bb820cf57 100644 --- a/invokeai/frontend/web/src/features/metadata/parsing.tsx +++ b/invokeai/frontend/web/src/features/metadata/parsing.tsx @@ -397,19 +397,33 @@ const CLIPSkip: SingleMetadataHandler = { const Guidance: SingleMetadataHandler = { [SingleMetadataKey]: true, type: 'Guidance', - parse: (metadata, _store) => { - // Legacy FLUX.2 images may still carry a `guidance` field, but guidance_embeds - // is inert for all current Klein variants. Reject parsing for FLUX.2 metadata - // so the handler is skipped on both display and recall - avoids leaking a stale - // value into the shared guidance param (which is still used by FLUX.1). + parse: async (metadata, store) => { + // guidance_embeds is inert for FLUX.2 Klein but genuinely consumed by FLUX.2 [dev] + // (the graph sets guidance_embeds=True and passes the recorded guidance). So reject + // only for non-dev FLUX.2: this displays and recalls the value for [dev] while never + // leaking a stale value into the shared guidance param for Klein (shared with FLUX.1). + // Resolve the image's own model to read its variant; if it can't be resolved (e.g. + // uninstalled), fall back to skipping — same safe behavior as before for Klein. const rawModel = getProperty(metadata, 'model'); const modelBase = (rawModel as { base?: unknown } | undefined)?.base; if (modelBase === 'flux2') { - throw new Error('Guidance is not used for FLUX.2 Klein models.'); + let isDev = false; + try { + const config = await resolveModel( + rawModel as { key: string; hash?: string; name: string; base: string; type: string }, + store + ); + isDev = 'variant' in config && config.variant === 'dev'; + } catch { + isDev = false; + } + if (!isDev) { + throw new Error('Guidance is not used for FLUX.2 Klein models.'); + } } const raw = getProperty(metadata, 'guidance'); const parsed = zParameterGuidance.parse(raw); - return Promise.resolve(parsed); + return parsed; }, recall: (value, store) => { store.dispatch(setGuidance(value)); diff --git a/invokeai/frontend/web/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx b/invokeai/frontend/web/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx index 220008a38b0..76da94ca400 100644 --- a/invokeai/frontend/web/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx +++ b/invokeai/frontend/web/src/features/settingsAccordions/components/GenerationSettingsAccordion/GenerationSettingsAccordion.tsx @@ -11,6 +11,7 @@ import { selectIsExternal, selectIsFLUX, selectIsFlux2, + selectIsFlux2Dev, selectIsQwenImage, selectIsSD3, selectIsZImage, @@ -49,6 +50,7 @@ export const GenerationSettingsAccordion = memo(() => { const modelConfig = useSelectedModelConfig(); const isFLUX = useAppSelector(selectIsFLUX); const isFlux2 = useAppSelector(selectIsFlux2); + const isFlux2Dev = useAppSelector(selectIsFlux2Dev); const isSD3 = useAppSelector(selectIsSD3); const isCogView4 = useAppSelector(selectIsCogView4); const isZImage = useAppSelector(selectIsZImage); @@ -113,6 +115,7 @@ export const GenerationSettingsAccordion = memo(() => { {!isExternal && isFLUX && modelConfig && !isFluxFillMainModelModelConfig(modelConfig) && ( )} + {!isExternal && isFlux2Dev && } {!isExternal && !isFLUX && !isFlux2 && } {!isExternal && isZImage && } {!isExternal && isQwenImage && } diff --git a/pyproject.toml b/pyproject.toml index cd09713b647..9f7c28fd79c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,9 @@ dependencies = [ "diffusers[torch]==0.37.0", "gguf", "mediapipe==0.10.14", # needed for "mediapipeface" controlnet model - "mistral-common", # canonical Tekken tokenizer for FLUX.2 [dev] Mistral encoder + "mistral-common>=1.5.4,<2", # canonical Tekken tokenizer for FLUX.2 [dev] Mistral encoder; the + # loader depends on private surface (Tekkenizer internals) that + # moves across majors, so cap below 2.x (validated against 1.11.6) "numpy<2.0.0", "onnx==1.16.1", "onnxruntime==1.19.2", diff --git a/uv.lock b/uv.lock index 2835b132eee..94bdb76f76e 100644 --- a/uv.lock +++ b/uv.lock @@ -1259,7 +1259,7 @@ requires-dist = [ { name = "humanize", marker = "extra == 'test'", specifier = "==4.12.1" }, { name = "jurigged", marker = "extra == 'dev'" }, { name = "mediapipe", specifier = "==0.10.14" }, - { name = "mistral-common" }, + { name = "mistral-common", specifier = ">=1.5.4,<2" }, { name = "mypy", marker = "extra == 'test'" }, { name = "numpy", specifier = "<2.0.0" }, { name = "onnx", specifier = "==1.16.1" }, From 62a55587b94b256e57686b2d01ef866614dc8dda Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Sat, 25 Jul 2026 18:30:53 +0200 Subject: [PATCH 18/25] Chore openapi --- invokeai/frontend/web/openapi.json | 6746 ++++++---------------------- 1 file changed, 1252 insertions(+), 5494 deletions(-) diff --git a/invokeai/frontend/web/openapi.json b/invokeai/frontend/web/openapi.json index 74c932e583e..e7b04c768ad 100644 --- a/invokeai/frontend/web/openapi.json +++ b/invokeai/frontend/web/openapi.json @@ -8,9 +8,7 @@ "paths": { "/api/v1/auth/status": { "get": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "Get Setup Status", "description": "Check if initial administrator setup is required.\n\nReturns:\n SetupStatusResponse indicating whether setup is needed and multiuser mode status", "operationId": "get_setup_status_api_v1_auth_status_get", @@ -30,9 +28,7 @@ }, "/api/v1/auth/login": { "post": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "Login", "description": "Authenticate user and return access token.\n\nArgs:\n request: Login credentials (email and password)\n\nReturns:\n LoginResponse containing JWT token and user information\n\nRaises:\n HTTPException: 401 if credentials are invalid or user is inactive\n HTTPException: 403 if multiuser mode is disabled", "operationId": "login_api_v1_auth_login_post", @@ -73,9 +69,7 @@ }, "/api/v1/auth/logout": { "post": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "Logout", "description": "Logout current user.\n\nCurrently a no-op since we use stateless JWT tokens. For token invalidation in\nfuture implementations, consider:\n- Token blacklist: Store invalidated tokens in Redis/database with expiration\n- Token versioning: Add version field to user record, increment on logout\n- Short-lived tokens: Use refresh token pattern with token rotation\n- Session storage: Track active sessions server-side for revocation\n\nArgs:\n current_user: The authenticated user (validates token)\n\nReturns:\n LogoutResponse indicating success", "operationId": "logout_api_v1_auth_logout_post", @@ -100,9 +94,7 @@ }, "/api/v1/auth/me": { "get": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "Get Current User Info", "description": "Get current authenticated user's information.\n\nArgs:\n current_user: The authenticated user's token data\n\nReturns:\n UserDTO containing user information\n\nRaises:\n HTTPException: 404 if user is not found (should not happen normally)", "operationId": "get_current_user_info_api_v1_auth_me_get", @@ -125,9 +117,7 @@ ] }, "patch": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "Update Current User", "description": "Update the current user's own profile.\n\nTo change the password, both ``current_password`` and ``new_password`` must\nbe provided. The current password is verified before the change is applied.\n\nArgs:\n request: Profile fields to update\n current_user: The authenticated user\n\nReturns:\n The updated user\n\nRaises:\n HTTPException: 400 if current password is incorrect or new password is weak\n HTTPException: 404 if user not found", "operationId": "update_current_user_api_v1_auth_me_patch", @@ -173,9 +163,7 @@ }, "/api/v1/auth/setup": { "post": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "Setup Admin", "description": "Set up initial administrator account.\n\nThis endpoint can only be called once, when no admin user exists. It creates\nthe first admin user for the system.\n\nArgs:\n request: Admin account details (email, display_name, password)\n\nReturns:\n SetupResponse containing the created admin user\n\nRaises:\n HTTPException: 400 if admin already exists or password is weak\n HTTPException: 403 if multiuser mode is disabled", "operationId": "setup_admin_api_v1_auth_setup_post", @@ -216,9 +204,7 @@ }, "/api/v1/auth/generate-password": { "get": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "Generate Password", "description": "Generate a strong random password.\n\nReturns a cryptographically secure random password of 16 characters\ncontaining uppercase, lowercase, digits, and punctuation.", "operationId": "generate_password_api_v1_auth_generate_password_get", @@ -243,9 +229,7 @@ }, "/api/v1/auth/users": { "get": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "List Users", "description": "List all users. Requires admin privileges.\n\nThe internal 'system' user (created for backward compatibility) is excluded\nfrom the results since it cannot be managed through this interface.\n\nReturns:\n List of all real users (system user excluded)", "operationId": "list_users_api_v1_auth_users_get", @@ -272,9 +256,7 @@ ] }, "post": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "Create User", "description": "Create a new user. Requires admin privileges.\n\nArgs:\n request: New user details\n\nReturns:\n The created user\n\nRaises:\n HTTPException: 400 if email already exists or password is weak", "operationId": "create_user_api_v1_auth_users_post", @@ -320,9 +302,7 @@ }, "/api/v1/auth/users/{user_id}": { "get": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "Get User", "description": "Get a user by ID. Requires admin privileges.\n\nArgs:\n user_id: The user ID\n\nReturns:\n The user\n\nRaises:\n HTTPException: 404 if user not found", "operationId": "get_user_api_v1_auth_users__user_id__get", @@ -368,9 +348,7 @@ } }, "patch": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "Update User", "description": "Update a user. Requires admin privileges.\n\nArgs:\n user_id: The user ID\n request: Fields to update\n\nReturns:\n The updated user\n\nRaises:\n HTTPException: 400 if password is weak\n HTTPException: 404 if user not found", "operationId": "update_user_api_v1_auth_users__user_id__patch", @@ -427,9 +405,7 @@ } }, "delete": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "Delete User", "description": "Delete a user. Requires admin privileges.\n\nAdmins can delete any user including other admins, but cannot delete the last\nremaining admin.\n\nArgs:\n user_id: The user ID\n\nRaises:\n HTTPException: 400 if attempting to delete the last admin\n HTTPException: 404 if user not found", "operationId": "delete_user_api_v1_auth_users__user_id__delete", @@ -470,9 +446,7 @@ }, "/api/v1/utilities/dynamicprompts": { "post": { - "tags": [ - "utilities" - ], + "tags": ["utilities"], "summary": "Parse Dynamicprompts", "description": "Creates a batch process", "operationId": "parse_dynamicprompts", @@ -517,9 +491,7 @@ }, "/api/v1/utilities/expand-prompt": { "post": { - "tags": [ - "utilities" - ], + "tags": ["utilities"], "summary": "Expand Prompt", "description": "Expand a brief prompt into a detailed image generation prompt using a text LLM.", "operationId": "expand_prompt", @@ -564,9 +536,7 @@ }, "/api/v1/utilities/image-to-prompt": { "post": { - "tags": [ - "utilities" - ], + "tags": ["utilities"], "summary": "Image To Prompt", "description": "Generate a descriptive prompt from an image using a vision-language model.", "operationId": "image_to_prompt", @@ -611,9 +581,7 @@ }, "/api/v2/models/": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "List Model Records", "description": "Get a list of models.", "operationId": "list_model_records", @@ -747,9 +715,7 @@ }, "/api/v2/models/missing": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "List Missing Models", "description": "Get models whose files are missing from disk.\n\nThese are models that have database entries but their corresponding\nweight files have been deleted externally (not via Model Manager).\n\nAvailable to any authenticated user, not just admins: the frontend's model hooks subtract this\nset from the model list so unusable models are kept out of the generation dropdowns.", "operationId": "list_missing_models", @@ -774,9 +740,7 @@ }, "/api/v2/models/get_by_attrs": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Get Model Records By Attrs", "description": "Gets a model by its attributes. The main use of this route is to provide backwards compatibility with the old\nmodel manager, which identified models by a combination of name, base and type.", "operationId": "get_model_records_by_attrs", @@ -1137,9 +1101,7 @@ }, "/api/v2/models/get_by_hash": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Get Model Records By Hash", "description": "Gets a model by its hash. This is useful for recalling models that were deleted and reinstalled,\nas the hash remains stable across reinstallations while the key (UUID) changes.", "operationId": "get_model_records_by_hash", @@ -1480,9 +1442,7 @@ }, "/api/v2/models/i/{key}": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Get Model Record", "description": "Get a model record", "operationId": "get_model_record", @@ -1845,9 +1805,7 @@ } }, "patch": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Update Model Record", "description": "Update a model's config.", "operationId": "update_model_record", @@ -2236,9 +2194,7 @@ } }, "delete": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Delete Model", "description": "Delete model record from database.\n\nThe configuration record will be removed. The corresponding weights files will be\ndeleted as well if they reside within the InvokeAI \"models\" directory.", "operationId": "delete_model", @@ -2282,9 +2238,7 @@ }, "/api/v2/models/i/{key}/reidentify": { "post": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Reidentify Model", "description": "Attempt to reidentify a model by re-probing its weights file.", "operationId": "reidentify_model", @@ -2649,9 +2603,7 @@ }, "/api/v2/models/scan_folder": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Scan For Models", "operationId": "scan_for_models", "security": [ @@ -2705,9 +2657,7 @@ }, "/api/v2/models/hugging_face": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Get Hugging Face Models", "operationId": "get_hugging_face_models", "security": [ @@ -2757,9 +2707,7 @@ }, "/api/v2/models/i/{key}/image": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Get Model Image", "description": "Gets an image file that previews the model", "operationId": "get_model_image", @@ -2804,9 +2752,7 @@ } }, "patch": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Update Model Image", "operationId": "update_model_image", "security": [ @@ -2862,9 +2808,7 @@ } }, "delete": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Delete Model Image", "operationId": "delete_model_image", "security": [ @@ -2907,9 +2851,7 @@ }, "/api/v2/models/i/bulk_delete": { "post": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Bulk Delete Models", "description": "Delete multiple model records from database.\n\nThe configuration records will be removed. The corresponding weights files will be\ndeleted as well if they reside within the InvokeAI \"models\" directory.\nReturns a list of successfully deleted keys and failed deletions with error messages.", "operationId": "bulk_delete_models", @@ -2955,9 +2897,7 @@ }, "/api/v2/models/i/bulk_reidentify": { "post": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Bulk Reidentify Models", "description": "Reidentify multiple models by re-probing their weights files.\n\nReturns a list of successfully reidentified keys and failed reidentifications with error messages.", "operationId": "bulk_reidentify_models", @@ -3003,9 +2943,7 @@ }, "/api/v2/models/install": { "post": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Install Model", "description": "Install a model using a string identifier.\n\n`source` can be any of the following.\n\n1. A path on the local filesystem ('C:\\users\\fred\\model.safetensors')\n2. A Url pointing to a single downloadable model file\n3. A HuggingFace repo_id with any of the following formats:\n - model/name\n - model/name:fp16:vae\n - model/name::vae -- use default precision\n - model/name:fp16:path/to/model.safetensors\n - model/name::path/to/model.safetensors\n\n`config` is a ModelRecordChanges object. Fields in this object will override\nthe ones that are probed automatically. Pass an empty object to accept\nall the defaults.\n\n`access_token` is an optional access token for use with Urls that require\nauthentication.\n\nModels will be downloaded, probed, configured and installed in a\nseries of background threads. The return object has `status` attribute\nthat can be used to monitor progress.\n\nSee the documentation for `import_model_record` for more information on\ninterpreting the job information returned by this route.", "operationId": "install_model", @@ -3114,9 +3052,7 @@ } }, "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "List Model Installs", "description": "Return the list of model install jobs.\n\nInstall jobs have a numeric `id`, a `status`, and other fields that provide information on\nthe nature of the job and its progress. The `status` is one of:\n\n* \"waiting\" -- Job is waiting in the queue to run\n* \"downloading\" -- Model file(s) are downloading\n* \"running\" -- Model has downloaded and the model probing and registration process is running\n* \"paused\" -- Job is paused and can be resumed\n* \"completed\" -- Installation completed successfully\n* \"error\" -- An error occurred. Details will be in the \"error_type\" and \"error\" fields.\n* \"cancelled\" -- Job was cancelled before completion.\n\nOnce completed, information about the model such as its size, base\nmodel and type can be retrieved from the `config_out` field. For multi-file models such as diffusers,\ninformation on individual files can be retrieved from `download_parts`.\n\nSee the example and schema below for more information.", "operationId": "list_model_installs", @@ -3143,9 +3079,7 @@ } }, "delete": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Prune Model Install Jobs", "description": "Prune all completed and errored jobs from the install job list.", "operationId": "prune_model_install_jobs", @@ -3174,9 +3108,7 @@ }, "/api/v2/models/install/huggingface": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Install Hugging Face Model", "description": "Install a Hugging Face model using a string identifier.", "operationId": "install_hugging_face_model", @@ -3230,9 +3162,7 @@ }, "/api/v2/models/install/{id}": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Get Model Install Job", "description": "Return model install job corresponding to the given source. See the documentation for 'List Model Install Jobs'\nfor information on the format of the return value.", "operationId": "get_model_install_job", @@ -3281,9 +3211,7 @@ } }, "delete": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Cancel Model Install Job", "description": "Cancel the model install job(s) corresponding to the given job ID.", "operationId": "cancel_model_install_job", @@ -3332,9 +3260,7 @@ }, "/api/v2/models/install/{id}/pause": { "post": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Pause Model Install Job", "description": "Pause the model install job corresponding to the given job ID.", "operationId": "pause_model_install_job", @@ -3385,9 +3311,7 @@ }, "/api/v2/models/install/{id}/resume": { "post": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Resume Model Install Job", "description": "Resume a paused model install job corresponding to the given job ID.", "operationId": "resume_model_install_job", @@ -3438,9 +3362,7 @@ }, "/api/v2/models/install/{id}/restart_failed": { "post": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Restart Failed Model Install Job", "description": "Restart failed or non-resumable file downloads for the given job.", "operationId": "restart_failed_model_install_job", @@ -3491,9 +3413,7 @@ }, "/api/v2/models/install/{id}/restart_file": { "post": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Restart Model Install File", "description": "Restart a specific file download for the given job.", "operationId": "restart_model_install_file", @@ -3558,9 +3478,7 @@ }, "/api/v2/models/convert/{key}": { "put": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Convert Model", "description": "Permanently convert a model into diffusers format, replacing the safetensors version.\nNote that during the conversion process the key and model hash will change.\nThe return value is the model configuration for the converted model.", "operationId": "convert_model", @@ -3928,9 +3846,7 @@ }, "/api/v2/models/starter_models": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Get Starter Models", "operationId": "get_starter_models", "responses": { @@ -3954,9 +3870,7 @@ }, "/api/v2/models/stats": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Get model manager RAM cache performance statistics.", "description": "Return performance statistics on the model manager's RAM cache. Will return null if no models have been loaded.", "operationId": "get_stats", @@ -3989,9 +3903,7 @@ }, "/api/v2/models/empty_model_cache": { "post": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Empty Model Cache", "description": "Drop all models from the model cache to free RAM/VRAM. 'Locked' models that are in active use will not be dropped.", "operationId": "empty_model_cache", @@ -4014,9 +3926,7 @@ }, "/api/v2/models/hf_login": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Get Hf Login Status", "operationId": "get_hf_login_status", "responses": { @@ -4038,9 +3948,7 @@ ] }, "post": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Do Hf Login", "operationId": "do_hf_login", "requestBody": { @@ -4082,9 +3990,7 @@ ] }, "delete": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Reset Hf Token", "operationId": "reset_hf_token", "responses": { @@ -4108,9 +4014,7 @@ }, "/api/v2/models/sync/orphaned": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Get Orphaned Models", "description": "Find orphaned model directories.\n\nOrphaned models are directories in the models folder that contain model files\nbut are not referenced in the database. This can happen when models are deleted\nfrom the database but the files remain on disk.\n\nReturns:\n List of orphaned model directory information", "operationId": "get_orphaned_models", @@ -4137,9 +4041,7 @@ ] }, "delete": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Delete Orphaned Models", "description": "Delete specified orphaned model directories.\n\nArgs:\n request: Request containing list of relative paths to delete\n\nReturns:\n Response indicating which paths were deleted and which had errors", "operationId": "delete_orphaned_models", @@ -4184,9 +4086,7 @@ }, "/api/v1/download_queue/": { "get": { - "tags": [ - "download_queue" - ], + "tags": ["download_queue"], "summary": "List Downloads", "description": "Get a list of active and inactive jobs.", "operationId": "list_downloads", @@ -4213,9 +4113,7 @@ ] }, "patch": { - "tags": [ - "download_queue" - ], + "tags": ["download_queue"], "summary": "Prune Downloads", "description": "Prune completed and errored jobs.", "operationId": "prune_downloads", @@ -4244,9 +4142,7 @@ }, "/api/v1/download_queue/i/": { "post": { - "tags": [ - "download_queue" - ], + "tags": ["download_queue"], "summary": "Download", "description": "Download the source URL to the file or directory indicted in dest.", "operationId": "download", @@ -4291,9 +4187,7 @@ }, "/api/v1/download_queue/i/{id}": { "get": { - "tags": [ - "download_queue" - ], + "tags": ["download_queue"], "summary": "Get Download Job", "description": "Get a download job using its ID.", "operationId": "get_download_job", @@ -4342,9 +4236,7 @@ } }, "delete": { - "tags": [ - "download_queue" - ], + "tags": ["download_queue"], "summary": "Cancel Download Job", "description": "Cancel a download job using its ID.", "operationId": "cancel_download_job", @@ -4396,9 +4288,7 @@ }, "/api/v1/download_queue/i": { "delete": { - "tags": [ - "download_queue" - ], + "tags": ["download_queue"], "summary": "Cancel All Download Jobs", "description": "Cancel all download jobs.", "operationId": "cancel_all_download_jobs", @@ -4424,9 +4314,7 @@ }, "/api/v1/image_moves/start": { "post": { - "tags": [ - "image_moves" - ], + "tags": ["image_moves"], "summary": "Start Image Move", "operationId": "start_image_move", "responses": { @@ -4450,9 +4338,7 @@ }, "/api/v1/image_moves/recover": { "post": { - "tags": [ - "image_moves" - ], + "tags": ["image_moves"], "summary": "Start Image Move Recovery", "operationId": "start_image_move_recovery", "responses": { @@ -4476,9 +4362,7 @@ }, "/api/v1/image_moves/status": { "get": { - "tags": [ - "image_moves" - ], + "tags": ["image_moves"], "summary": "Get Image Move Status", "operationId": "get_image_move_status", "responses": { @@ -4502,9 +4386,7 @@ }, "/api/v1/images/upload": { "post": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Upload Image", "description": "Uploads an image for the current user", "operationId": "upload_image", @@ -4630,9 +4512,7 @@ }, "/api/v1/images/": { "post": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Create Image Upload Entry", "description": "Uploads an image from a URL, not implemented", "operationId": "create_image_upload_entry", @@ -4675,9 +4555,7 @@ } }, "get": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "List Image Dtos", "description": "Gets a list of image DTOs for the current user", "operationId": "list_image_dtos", @@ -4854,9 +4732,7 @@ }, "/api/v1/images/i/{image_name}": { "delete": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Delete Image", "description": "Deletes an image", "operationId": "delete_image", @@ -4902,9 +4778,7 @@ } }, "patch": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Update Image", "description": "Updates an image", "operationId": "update_image", @@ -4961,9 +4835,7 @@ } }, "get": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Get Image Dto", "description": "Gets an image's DTO", "operationId": "get_image_dto", @@ -5011,9 +4883,7 @@ }, "/api/v1/images/intermediates": { "get": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Get Intermediates Count", "description": "Gets the count of intermediate images. Non-admin users only see their own intermediates.", "operationId": "get_intermediates_count", @@ -5037,9 +4907,7 @@ ] }, "delete": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Clear Intermediates", "description": "Clears all intermediates. Requires admin.", "operationId": "clear_intermediates", @@ -5065,9 +4933,7 @@ }, "/api/v1/images/i/{image_name}/metadata": { "get": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Get Image Metadata", "description": "Gets an image's metadata", "operationId": "get_image_metadata", @@ -5123,9 +4989,7 @@ }, "/api/v1/images/i/{image_name}/workflow": { "get": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Get Image Workflow", "operationId": "get_image_workflow", "security": [ @@ -5172,9 +5036,7 @@ }, "/api/v1/images/i/{image_name}/full": { "head": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Get Image Full", "description": "Gets a full-resolution image file.\n\nThis endpoint is intentionally unauthenticated because browsers load images\nvia tags which cannot send Bearer tokens. Image names are UUIDs,\nproviding security through unguessability. Returns 409 while image storage\nmaintenance is active.", "operationId": "get_image_full_head", @@ -5214,9 +5076,7 @@ } }, "get": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Get Image Full", "description": "Gets a full-resolution image file.\n\nThis endpoint is intentionally unauthenticated because browsers load images\nvia tags which cannot send Bearer tokens. Image names are UUIDs,\nproviding security through unguessability. Returns 409 while image storage\nmaintenance is active.", "operationId": "get_image_full", @@ -5258,9 +5118,7 @@ }, "/api/v1/images/i/{image_name}/thumbnail": { "get": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Get Image Thumbnail", "description": "Gets a thumbnail image file.\n\nThis endpoint is intentionally unauthenticated because browsers load images\nvia tags which cannot send Bearer tokens. Image names are UUIDs,\nproviding security through unguessability. Returns 409 while image storage\nmaintenance is active.", "operationId": "get_image_thumbnail", @@ -5302,9 +5160,7 @@ }, "/api/v1/images/i/{image_name}/urls": { "get": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Get Image Urls", "description": "Gets an image and thumbnail URL", "operationId": "get_image_urls", @@ -5352,9 +5208,7 @@ }, "/api/v1/images/delete": { "post": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Delete Images From List", "operationId": "delete_images_from_list", "requestBody": { @@ -5398,9 +5252,7 @@ }, "/api/v1/images/uncategorized": { "delete": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Delete Uncategorized Images", "description": "Deletes all uncategorized images owned by the current user (or all if admin)", "operationId": "delete_uncategorized_images", @@ -5425,9 +5277,7 @@ }, "/api/v1/images/star": { "post": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Star Images In List", "operationId": "star_images_in_list", "requestBody": { @@ -5471,9 +5321,7 @@ }, "/api/v1/images/unstar": { "post": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Unstar Images In List", "operationId": "unstar_images_in_list", "requestBody": { @@ -5517,9 +5365,7 @@ }, "/api/v1/images/download": { "post": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Download Images From List", "operationId": "download_images_from_list", "requestBody": { @@ -5562,9 +5408,7 @@ }, "/api/v1/images/download/{bulk_download_item_name}": { "get": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Get Bulk Download Item", "description": "Gets a bulk download zip file.\n\nRequires authentication. The caller must be the user who initiated the\ndownload (tracked by the bulk download service) or an admin.", "operationId": "get_bulk_download_item", @@ -5611,9 +5455,7 @@ }, "/api/v1/images/names": { "get": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Get Image Names", "description": "Gets ordered list of image names with metadata for optimistic updates", "operationId": "get_image_names", @@ -5766,9 +5608,7 @@ }, "/api/v1/images/images_by_names": { "post": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Get Images By Names", "description": "Gets image DTOs for the specified image names. Maintains order of input names.", "operationId": "get_images_by_names", @@ -5817,9 +5657,7 @@ }, "/api/v1/boards/": { "post": { - "tags": [ - "boards" - ], + "tags": ["boards"], "summary": "Create Board", "description": "Creates a board for the current user", "operationId": "create_board", @@ -5866,9 +5704,7 @@ } }, "get": { - "tags": [ - "boards" - ], + "tags": ["boards"], "summary": "List Boards", "description": "Gets a list of boards for the current user, including shared boards. Admin users see all boards.", "operationId": "list_boards", @@ -6004,9 +5840,7 @@ }, "/api/v1/boards/{board_id}": { "get": { - "tags": [ - "boards" - ], + "tags": ["boards"], "summary": "Get Board", "description": "Gets a board (user must have access to it)", "operationId": "get_board", @@ -6052,9 +5886,7 @@ } }, "patch": { - "tags": [ - "boards" - ], + "tags": ["boards"], "summary": "Update Board", "description": "Updates a board (user must have access to it)", "operationId": "update_board", @@ -6111,9 +5943,7 @@ } }, "delete": { - "tags": [ - "boards" - ], + "tags": ["boards"], "summary": "Delete Board", "description": "Deletes a board (user must have access to it)", "operationId": "delete_board", @@ -6180,9 +6010,7 @@ }, "/api/v1/boards/{board_id}/image_names": { "get": { - "tags": [ - "boards" - ], + "tags": ["boards"], "summary": "List All Board Image Names", "description": "Gets a list of images for a board", "operationId": "list_all_board_image_names", @@ -6273,9 +6101,7 @@ }, "/api/v1/board_images/": { "post": { - "tags": [ - "boards" - ], + "tags": ["boards"], "summary": "Add Image To Board", "description": "Creates a board_image", "operationId": "add_image_to_board", @@ -6318,9 +6144,7 @@ ] }, "delete": { - "tags": [ - "boards" - ], + "tags": ["boards"], "summary": "Remove Image From Board", "description": "Removes an image from its board, if it had one", "operationId": "remove_image_from_board", @@ -6365,9 +6189,7 @@ }, "/api/v1/board_images/batch": { "post": { - "tags": [ - "boards" - ], + "tags": ["boards"], "summary": "Add Images To Board", "description": "Adds a list of images to a board", "operationId": "add_images_to_board", @@ -6412,9 +6234,7 @@ }, "/api/v1/board_images/batch/delete": { "post": { - "tags": [ - "boards" - ], + "tags": ["boards"], "summary": "Remove Images From Board", "description": "Removes a list of images from their board, if they had one", "operationId": "remove_images_from_board", @@ -6459,9 +6279,7 @@ }, "/api/v1/virtual_boards/by_date": { "get": { - "tags": [ - "virtual_boards" - ], + "tags": ["virtual_boards"], "summary": "List Virtual Boards By Date", "description": "Gets a list of virtual sub-boards grouped by date.", "operationId": "list_virtual_boards_by_date", @@ -6490,9 +6308,7 @@ }, "/api/v1/virtual_boards/by_date/{date}/image_names": { "get": { - "tags": [ - "virtual_boards" - ], + "tags": ["virtual_boards"], "summary": "List Virtual Board Image Names By Date", "description": "Gets ordered image names for a specific date.", "operationId": "list_virtual_board_image_names_by_date", @@ -6602,9 +6418,7 @@ }, "/api/v1/model_relationships/i/{model_key}": { "get": { - "tags": [ - "model_relationships" - ], + "tags": ["model_relationships"], "summary": "Get Related Models", "description": "Get a list of model keys related to a given model.", "operationId": "get_related_models", @@ -6657,9 +6471,7 @@ }, "/api/v1/model_relationships/": { "post": { - "tags": [ - "model_relationships" - ], + "tags": ["model_relationships"], "summary": "Add Model Relationship", "description": "Creates a **bidirectional** relationship between two models, allowing each to reference the other as related.", "operationId": "add_model_relationship_api_v1_model_relationships__post", @@ -6698,9 +6510,7 @@ ] }, "delete": { - "tags": [ - "model_relationships" - ], + "tags": ["model_relationships"], "summary": "Remove Model Relationship", "description": "Removes a **bidirectional** relationship between two models. The relationship must already exist.", "operationId": "remove_model_relationship_api_v1_model_relationships__delete", @@ -6741,9 +6551,7 @@ }, "/api/v1/model_relationships/batch": { "post": { - "tags": [ - "model_relationships" - ], + "tags": ["model_relationships"], "summary": "Get Related Model Keys (Batch)", "description": "Retrieves all **unique related model keys** for a list of given models. This is useful for contextual suggestions or filtering.", "operationId": "get_related_models_batch", @@ -6798,9 +6606,7 @@ }, "/api/v1/app/version": { "get": { - "tags": [ - "app" - ], + "tags": ["app"], "summary": "Get Version", "operationId": "app_version", "responses": { @@ -6819,9 +6625,7 @@ }, "/api/v1/app/app_deps": { "get": { - "tags": [ - "app" - ], + "tags": ["app"], "summary": "Get App Deps", "operationId": "get_app_deps", "responses": { @@ -6849,9 +6653,7 @@ }, "/api/v1/app/patchmatch_status": { "get": { - "tags": [ - "app" - ], + "tags": ["app"], "summary": "Get Patchmatch Status", "operationId": "get_patchmatch_status", "responses": { @@ -6876,9 +6678,7 @@ }, "/api/v1/app/runtime_config": { "get": { - "tags": [ - "app" - ], + "tags": ["app"], "summary": "Get Runtime Config", "operationId": "get_runtime_config", "responses": { @@ -6900,9 +6700,7 @@ ] }, "patch": { - "tags": [ - "app" - ], + "tags": ["app"], "summary": "Update Runtime Config", "operationId": "update_runtime_config", "requestBody": { @@ -6947,9 +6745,7 @@ }, "/api/v1/app/external_providers/status": { "get": { - "tags": [ - "app" - ], + "tags": ["app"], "summary": "Get External Provider Statuses", "operationId": "get_external_provider_statuses", "responses": { @@ -6977,9 +6773,7 @@ }, "/api/v1/app/external_providers/config": { "get": { - "tags": [ - "app" - ], + "tags": ["app"], "summary": "Get External Provider Configs", "operationId": "get_external_provider_configs", "responses": { @@ -7007,9 +6801,7 @@ }, "/api/v1/app/external_providers/config/{provider_id}": { "post": { - "tags": [ - "app" - ], + "tags": ["app"], "summary": "Set External Provider Config", "operationId": "set_external_provider_config", "security": [ @@ -7065,9 +6857,7 @@ } }, "delete": { - "tags": [ - "app" - ], + "tags": ["app"], "summary": "Reset External Provider Config", "operationId": "reset_external_provider_config", "security": [ @@ -7114,9 +6904,7 @@ }, "/api/v1/app/logging": { "get": { - "tags": [ - "app" - ], + "tags": ["app"], "summary": "Get Log Level", "description": "Returns the log level", "operationId": "get_log_level", @@ -7139,9 +6927,7 @@ ] }, "post": { - "tags": [ - "app" - ], + "tags": ["app"], "summary": "Set Log Level", "description": "Sets the log verbosity level", "operationId": "set_log_level", @@ -7187,9 +6973,7 @@ }, "/api/v1/app/invocation_cache": { "delete": { - "tags": [ - "app" - ], + "tags": ["app"], "summary": "Clear Invocation Cache", "description": "Clears the invocation cache", "operationId": "clear_invocation_cache", @@ -7212,9 +6996,7 @@ }, "/api/v1/app/invocation_cache/enable": { "put": { - "tags": [ - "app" - ], + "tags": ["app"], "summary": "Enable Invocation Cache", "description": "Clears the invocation cache", "operationId": "enable_invocation_cache", @@ -7237,9 +7019,7 @@ }, "/api/v1/app/invocation_cache/disable": { "put": { - "tags": [ - "app" - ], + "tags": ["app"], "summary": "Disable Invocation Cache", "description": "Clears the invocation cache", "operationId": "disable_invocation_cache", @@ -7262,9 +7042,7 @@ }, "/api/v1/app/invocation_cache/status": { "get": { - "tags": [ - "app" - ], + "tags": ["app"], "summary": "Get Invocation Cache Status", "description": "Clears the invocation cache", "operationId": "get_invocation_cache_status", @@ -7289,9 +7067,7 @@ }, "/api/v1/queue/{queue_id}/enqueue_batch": { "post": { - "tags": [ - "queue" - ], + "tags": ["queue"], "summary": "Enqueue Batch", "description": "Processes a batch and enqueues the output graphs for execution for the current user.", "operationId": "enqueue_batch", @@ -7359,9 +7135,7 @@ }, "/api/v1/queue/{queue_id}/list_all": { "get": { - "tags": [ - "queue" - ], + "tags": ["queue"], "summary": "List All Queue Items", "description": "Gets all queue items", "operationId": "list_all_queue_items", @@ -7431,9 +7205,7 @@ }, "/api/v1/queue/{queue_id}/item_ids": { "get": { - "tags": [ - "queue" - ], + "tags": ["queue"], "summary": "Get Queue Item Ids", "description": "Gets all queue item ids that match the given parameters.\n\nIDs for every user's items are returned (item ids carry no sensitive data on their own).\nWhen the corresponding items are hydrated via get_queue_items_by_item_ids, those belonging\nto other users are redacted by sanitize_queue_item_for_user. This lets a non-admin see\npartially-redacted entries for other users' jobs in the queue list, while still revealing\nonly timestamps and status for items they do not own.\n\ncurrent_user is required so the endpoint stays behind authentication in multiuser mode.", "operationId": "get_queue_item_ids", @@ -7492,9 +7264,7 @@ }, "/api/v1/queue/{queue_id}/items_by_ids": { "post": { - "tags": [ - "queue" - ], + "tags": ["queue"], "summary": "Get Queue Items By Item Ids", "description": "Gets queue items for the specified queue item ids. Maintains order of item ids.", "operationId": "get_queue_items_by_item_ids", @@ -7556,9 +7326,7 @@ }, "/api/v1/queue/{queue_id}/processor/resume": { "put": { - "tags": [ - "queue" - ], + "tags": ["queue"], "summary": "Resume", "description": "Resumes session processor. Admin only.", "operationId": "resume", @@ -7606,9 +7374,7 @@ }, "/api/v1/queue/{queue_id}/processor/pause": { "put": { - "tags": [ - "queue" - ], + "tags": ["queue"], "summary": "Pause", "description": "Pauses session processor. Admin only.", "operationId": "pause", @@ -7656,9 +7422,7 @@ }, "/api/v1/queue/{queue_id}/cancel_all_except_current": { "put": { - "tags": [ - "queue" - ], + "tags": ["queue"], "summary": "Cancel All Except Current", "description": "Immediately cancels all queue items except in-processing items. Non-admin users can only cancel their own items.", "operationId": "cancel_all_except_current", @@ -7706,9 +7470,7 @@ }, "/api/v1/queue/{queue_id}/delete_all_except_current": { "put": { - "tags": [ - "queue" - ], + "tags": ["queue"], "summary": "Delete All Except Current", "description": "Immediately deletes all queue items except in-processing items. Non-admin users can only delete their own items.", "operationId": "delete_all_except_current", @@ -7756,9 +7518,7 @@ }, "/api/v1/queue/{queue_id}/cancel_by_batch_ids": { "put": { - "tags": [ - "queue" - ], + "tags": ["queue"], "summary": "Cancel By Batch Ids", "description": "Immediately cancels all queue items from the given batch ids. Non-admin users can only cancel their own items.", "operationId": "cancel_by_batch_ids", @@ -7816,9 +7576,7 @@ }, "/api/v1/queue/{queue_id}/cancel_by_destination": { "put": { - "tags": [ - "queue" - ], + "tags": ["queue"], "summary": "Cancel By Destination", "description": "Immediately cancels all queue items with the given destination. Non-admin users can only cancel their own items.", "operationId": "cancel_by_destination", @@ -7877,9 +7635,7 @@ }, "/api/v1/queue/{queue_id}/retry_items_by_id": { "put": { - "tags": [ - "queue" - ], + "tags": ["queue"], "summary": "Retry Items By Id", "description": "Retries the given queue items. Users can only retry their own items unless they are an admin.", "operationId": "retry_items_by_id", @@ -7942,9 +7698,7 @@ }, "/api/v1/queue/{queue_id}/clear": { "put": { - "tags": [ - "queue" - ], + "tags": ["queue"], "summary": "Clear", "description": "Clears the queue entirely. Admin users clear all items; non-admin users only clear their own items. If there's a currently-executing item, users can only cancel it if they own it or are an admin.", "operationId": "clear", @@ -7992,9 +7746,7 @@ }, "/api/v1/queue/{queue_id}/prune": { "put": { - "tags": [ - "queue" - ], + "tags": ["queue"], "summary": "Prune", "description": "Prunes all completed or errored queue items. Non-admin users can only prune their own items.", "operationId": "prune", @@ -8042,9 +7794,7 @@ }, "/api/v1/queue/{queue_id}/current": { "get": { - "tags": [ - "queue" - ], + "tags": ["queue"], "summary": "Get Current Queue Item", "description": "Gets the currently execution queue item", "operationId": "get_current_queue_item", @@ -8106,9 +7856,7 @@ }, "/api/v1/queue/{queue_id}/next": { "get": { - "tags": [ - "queue" - ], + "tags": ["queue"], "summary": "Get Next Queue Item", "description": "Gets the next queue item, without executing it", "operationId": "get_next_queue_item", @@ -8170,9 +7918,7 @@ }, "/api/v1/queue/{queue_id}/status": { "get": { - "tags": [ - "queue" - ], + "tags": ["queue"], "summary": "Get Queue Status", "description": "Gets the status of the session queue. Returns global counts; every user additionally gets\ntheir own pending/in_progress counts (so the UI can show an X/Y badge and scope personal UI\nlike the progress bar to the user's own activity). Non-admin users cannot see the current\nitem's identifiers unless they own it.", "operationId": "get_queue_status", @@ -8220,9 +7966,7 @@ }, "/api/v1/queue/{queue_id}/b/{batch_id}/status": { "get": { - "tags": [ - "queue" - ], + "tags": ["queue"], "summary": "Get Batch Status", "description": "Gets the status of a batch. Non-admin users only see their own batches.", "operationId": "get_batch_status", @@ -8281,9 +8025,7 @@ }, "/api/v1/queue/{queue_id}/i/{item_id}": { "get": { - "tags": [ - "queue" - ], + "tags": ["queue"], "summary": "Get Queue Item", "description": "Gets a queue item", "operationId": "get_queue_item", @@ -8340,9 +8082,7 @@ } }, "delete": { - "tags": [ - "queue" - ], + "tags": ["queue"], "summary": "Delete Queue Item", "description": "Deletes a queue item. Users can only delete their own items unless they are an admin.", "operationId": "delete_queue_item", @@ -8399,9 +8139,7 @@ }, "/api/v1/queue/{queue_id}/i/{item_id}/cancel": { "put": { - "tags": [ - "queue" - ], + "tags": ["queue"], "summary": "Cancel Queue Item", "description": "Cancels a queue item. Users can only cancel their own items unless they are an admin.", "operationId": "cancel_queue_item", @@ -8460,9 +8198,7 @@ }, "/api/v1/queue/{queue_id}/counts_by_destination": { "get": { - "tags": [ - "queue" - ], + "tags": ["queue"], "summary": "Counts By Destination", "description": "Gets the counts of queue items by destination. Non-admin users only see their own items.", "operationId": "counts_by_destination", @@ -8521,9 +8257,7 @@ }, "/api/v1/queue/{queue_id}/d/{destination}": { "delete": { - "tags": [ - "queue" - ], + "tags": ["queue"], "summary": "Delete By Destination", "description": "Deletes all items with the given destination. Non-admin users can only delete their own items.", "operationId": "delete_by_destination", @@ -8582,9 +8316,7 @@ }, "/api/v1/workflows/i/{workflow_id}": { "get": { - "tags": [ - "workflows" - ], + "tags": ["workflows"], "summary": "Get Workflow", "description": "Gets a workflow", "operationId": "get_workflow", @@ -8630,9 +8362,7 @@ } }, "patch": { - "tags": [ - "workflows" - ], + "tags": ["workflows"], "summary": "Update Workflow", "description": "Updates a workflow", "operationId": "update_workflow", @@ -8675,9 +8405,7 @@ } }, "delete": { - "tags": [ - "workflows" - ], + "tags": ["workflows"], "summary": "Delete Workflow", "description": "Deletes a workflow", "operationId": "delete_workflow", @@ -8723,9 +8451,7 @@ }, "/api/v1/workflows/": { "post": { - "tags": [ - "workflows" - ], + "tags": ["workflows"], "summary": "Create Workflow", "description": "Creates a workflow", "operationId": "create_workflow", @@ -8768,9 +8494,7 @@ } }, "get": { - "tags": [ - "workflows" - ], + "tags": ["workflows"], "summary": "List Workflows", "description": "Gets a page of workflows", "operationId": "list_workflows", @@ -8973,9 +8697,7 @@ }, "/api/v1/workflows/i/{workflow_id}/thumbnail": { "put": { - "tags": [ - "workflows" - ], + "tags": ["workflows"], "summary": "Set Workflow Thumbnail", "description": "Sets a workflow's thumbnail image", "operationId": "set_workflow_thumbnail", @@ -9031,9 +8753,7 @@ } }, "delete": { - "tags": [ - "workflows" - ], + "tags": ["workflows"], "summary": "Delete Workflow Thumbnail", "description": "Removes a workflow's thumbnail image", "operationId": "delete_workflow_thumbnail", @@ -9079,9 +8799,7 @@ } }, "get": { - "tags": [ - "workflows" - ], + "tags": ["workflows"], "summary": "Get Workflow Thumbnail", "description": "Gets a workflow's thumbnail image.\n\nThis endpoint is intentionally unauthenticated because browsers load images\nvia tags which cannot send Bearer tokens. Workflow IDs are UUIDs,\nproviding security through unguessability.", "operationId": "get_workflow_thumbnail", @@ -9128,9 +8846,7 @@ }, "/api/v1/workflows/i/{workflow_id}/is_public": { "patch": { - "tags": [ - "workflows" - ], + "tags": ["workflows"], "summary": "Update Workflow Is Public", "description": "Updates whether a workflow is shared publicly", "operationId": "update_workflow_is_public", @@ -9188,9 +8904,7 @@ }, "/api/v1/workflows/tags": { "get": { - "tags": [ - "workflows" - ], + "tags": ["workflows"], "summary": "Get All Tags", "description": "Gets all unique tags from workflows", "operationId": "get_all_tags", @@ -9270,9 +8984,7 @@ }, "/api/v1/workflows/counts_by_tag": { "get": { - "tags": [ - "workflows" - ], + "tags": ["workflows"], "summary": "Get Counts By Tag", "description": "Counts workflows by tag", "operationId": "get_counts_by_tag", @@ -9384,9 +9096,7 @@ }, "/api/v1/workflows/counts_by_category": { "get": { - "tags": [ - "workflows" - ], + "tags": ["workflows"], "summary": "Counts By Category", "description": "Counts workflows by category", "operationId": "counts_by_category", @@ -9477,9 +9187,7 @@ }, "/api/v1/workflows/i/{workflow_id}/opened_at": { "put": { - "tags": [ - "workflows" - ], + "tags": ["workflows"], "summary": "Update Opened At", "description": "Updates the opened_at field of a workflow", "operationId": "update_opened_at", @@ -9525,9 +9233,7 @@ }, "/api/v1/style_presets/i/{style_preset_id}": { "get": { - "tags": [ - "style_presets" - ], + "tags": ["style_presets"], "summary": "Get Style Preset", "description": "Gets a style preset", "operationId": "get_style_preset", @@ -9573,9 +9279,7 @@ } }, "patch": { - "tags": [ - "style_presets" - ], + "tags": ["style_presets"], "summary": "Update Style Preset", "description": "Updates a style preset", "operationId": "update_style_preset", @@ -9631,9 +9335,7 @@ } }, "delete": { - "tags": [ - "style_presets" - ], + "tags": ["style_presets"], "summary": "Delete Style Preset", "description": "Deletes a style preset", "operationId": "delete_style_preset", @@ -9679,9 +9381,7 @@ }, "/api/v1/style_presets/": { "get": { - "tags": [ - "style_presets" - ], + "tags": ["style_presets"], "summary": "List Style Presets", "description": "Gets the style presets visible to the current user.", "operationId": "list_style_presets", @@ -9708,9 +9408,7 @@ ] }, "post": { - "tags": [ - "style_presets" - ], + "tags": ["style_presets"], "summary": "Create Style Preset", "description": "Creates a style preset", "operationId": "create_style_preset", @@ -9755,9 +9453,7 @@ }, "/api/v1/style_presets/i/{style_preset_id}/image": { "get": { - "tags": [ - "style_presets" - ], + "tags": ["style_presets"], "summary": "Get Style Preset Image", "description": "Gets an image file that previews the model", "operationId": "get_style_preset_image", @@ -9809,9 +9505,7 @@ }, "/api/v1/style_presets/export": { "get": { - "tags": [ - "style_presets" - ], + "tags": ["style_presets"], "summary": "Export Style Presets", "operationId": "export_style_presets", "responses": { @@ -9834,9 +9528,7 @@ }, "/api/v1/style_presets/import": { "post": { - "tags": [ - "style_presets" - ], + "tags": ["style_presets"], "summary": "Import Style Presets", "operationId": "import_style_presets", "requestBody": { @@ -9878,9 +9570,7 @@ }, "/api/v1/client_state/{queue_id}/get_by_key": { "get": { - "tags": [ - "client_state" - ], + "tags": ["client_state"], "summary": "Get Client State By Key", "description": "Gets the client state for the current user (or system user if not authenticated)", "operationId": "get_client_state_by_key", @@ -9947,9 +9637,7 @@ }, "/api/v1/client_state/{queue_id}/set_by_key": { "post": { - "tags": [ - "client_state" - ], + "tags": ["client_state"], "summary": "Set Client State", "description": "Sets the client state for the current user (or system user if not authenticated)", "operationId": "set_client_state", @@ -10021,9 +9709,7 @@ }, "/api/v1/client_state/{queue_id}/get_keys_by_prefix": { "get": { - "tags": [ - "client_state" - ], + "tags": ["client_state"], "summary": "Get Client State Keys By Prefix", "description": "Gets client state keys matching a prefix for the current user", "operationId": "get_client_state_keys_by_prefix", @@ -10086,9 +9772,7 @@ }, "/api/v1/client_state/{queue_id}/delete_by_key": { "post": { - "tags": [ - "client_state" - ], + "tags": ["client_state"], "summary": "Delete Client State By Key", "description": "Deletes a specific client state key for the current user", "operationId": "delete_client_state_by_key", @@ -10148,9 +9832,7 @@ }, "/api/v1/client_state/{queue_id}/delete": { "post": { - "tags": [ - "client_state" - ], + "tags": ["client_state"], "summary": "Delete Client State", "description": "Deletes the client state for the current user (or system user if not authenticated)", "operationId": "delete_client_state", @@ -10199,9 +9881,7 @@ }, "/api/v1/recall/{queue_id}": { "post": { - "tags": [ - "recall" - ], + "tags": ["recall"], "summary": "Update Recall Parameters", "description": "Update recallable parameters that can be recalled on the frontend.\n\nThis endpoint allows updating parameters such as prompt, model, steps, and other\ngeneration settings. These parameters are stored in client state and can be\naccessed by the frontend to populate UI elements.\n\nArgs:\n queue_id: The queue ID to associate these parameters with\n parameters: The RecallParameter object containing the parameters to update\n strict: When true, parameters not included in the request body are reset\n to their defaults (cleared on the frontend). Defaults to false,\n which preserves the existing behaviour of only updating the\n parameters that are explicitly provided.\n append: When true, recalled reference images (``ip_adapters`` and\n ``reference_images``) are appended to whatever reference images the\n frontend already has, instead of replacing the whole list. Mutually\n exclusive with ``strict`` (which clears omitted parameters).\n\nReturns:\n A dictionary containing the updated parameters and status\n\nExample:\n POST /api/v1/recall/{queue_id}?strict=true\n {\n \"positive_prompt\": \"a beautiful landscape\",\n \"model\": \"sd-1.5\",\n \"steps\": 20\n }\n # In strict mode, all other parameters (reference_images, loras, etc.)\n # are cleared. In non-strict mode (default) they would be left as-is.", "operationId": "update_recall_parameters", @@ -10284,9 +9964,7 @@ } }, "get": { - "tags": [ - "recall" - ], + "tags": ["recall"], "summary": "Get Recall Parameters", "description": "Retrieve all stored recall parameters for a given queue.\n\nReturns a dictionary of all recall parameters that have been set for the queue.\n\nArgs:\n queue_id: The queue ID to retrieve parameters for\n\nReturns:\n A dictionary containing all stored recall parameters", "operationId": "get_recall_parameters", @@ -10336,9 +10014,7 @@ }, "/api/v2/custom_nodes/": { "get": { - "tags": [ - "custom_nodes" - ], + "tags": ["custom_nodes"], "summary": "List Custom Node Packs", "description": "Lists all installed custom node packs.\n\nAdmin-only: the response includes absolute filesystem paths, and non-admins have no\nlegitimate use for pack management data (install/uninstall/reload are also admin-only).", "operationId": "list_custom_node_packs", @@ -10363,9 +10039,7 @@ }, "/api/v2/custom_nodes/install": { "post": { - "tags": [ - "custom_nodes" - ], + "tags": ["custom_nodes"], "summary": "Install Custom Node Pack", "description": "Installs a custom node pack from a git URL by cloning it into the nodes directory.", "operationId": "install_custom_node_pack", @@ -10411,9 +10085,7 @@ }, "/api/v2/custom_nodes/{pack_name}": { "delete": { - "tags": [ - "custom_nodes" - ], + "tags": ["custom_nodes"], "summary": "Uninstall Custom Node Pack", "description": "Uninstalls a custom node pack by removing its directory.\n\nNote: A restart is required for the node removal to take full effect.\nInstalled nodes from the pack will remain registered until restart.", "operationId": "uninstall_custom_node_pack", @@ -10459,9 +10131,7 @@ }, "/api/v2/custom_nodes/reload": { "post": { - "tags": [ - "custom_nodes" - ], + "tags": ["custom_nodes"], "summary": "Reload Custom Nodes", "description": "Triggers a reload of all custom nodes.\n\nThis re-scans the nodes directory and loads any new node packs.\nAlready loaded packs are skipped.", "operationId": "reload_custom_nodes", @@ -10511,10 +10181,7 @@ } }, "type": "object", - "required": [ - "affected_boards", - "added_images" - ], + "required": ["affected_boards", "added_images"], "title": "AddImagesToBoardResult" }, "AddInvocation": { @@ -10576,14 +10243,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "math", - "add" - ], + "required": ["type", "id"], + "tags": ["math", "add"], "title": "Add Integers", "type": "object", "version": "1.0.1", @@ -10623,10 +10284,7 @@ } }, "type": "object", - "required": [ - "email", - "password" - ], + "required": ["email", "password"], "title": "AdminUserCreateRequest", "description": "Request body for admin to create a new user." }, @@ -10762,27 +10420,15 @@ "field_kind": "input", "input": "any", "orig_required": true, - "ui_model_base": [ - "external" - ], - "ui_model_format": [ - "external_api" - ], - "ui_model_provider_id": [ - "alibabacloud" - ], - "ui_model_type": [ - "external_image_generator" - ] + "ui_model_base": ["external"], + "ui_model_format": ["external_api"], + "ui_model_provider_id": ["alibabacloud"], + "ui_model_type": ["external_image_generator"] }, "mode": { "default": "txt2img", "description": "Generation mode. Not all modes are supported by every model; unsupported modes raise at runtime.", - "enum": [ - "txt2img", - "img2img", - "inpaint" - ], + "enum": ["txt2img", "img2img", "inpaint"], "field_kind": "input", "input": "any", "orig_default": "txt2img", @@ -10926,16 +10572,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "external", - "generation", - "alibabacloud", - "dashscope" - ], + "required": ["type", "id"], + "tags": ["external", "generation", "alibabacloud", "dashscope"], "title": "Alibaba Cloud DashScope Image Generation", "type": "object", "version": "1.0.0", @@ -11007,13 +10645,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "conditioning" - ], + "required": ["type", "id"], + "tags": ["conditioning"], "title": "Alpha Mask to Tensor", "type": "object", "version": "1.0.0", @@ -11042,9 +10675,7 @@ "description": "The mask associated with this conditioning tensor for regional prompting. Excluded regions should be set to False, included regions should be set to True." } }, - "required": [ - "conditioning_name" - ], + "required": ["conditioning_name"], "title": "AnimaConditioningField", "type": "object" }, @@ -11066,12 +10697,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "conditioning", - "type", - "type" - ], + "required": ["output_meta", "conditioning", "type", "type"], "title": "AnimaConditioningOutput", "type": "object" }, @@ -11329,14 +10955,7 @@ "scheduler": { "default": "euler", "description": "Scheduler (sampler) for the denoising process.", - "enum": [ - "euler", - "heun", - "dpmpp_2m", - "dpmpp_2m_sde", - "er_sde", - "lcm" - ], + "enum": ["euler", "heun", "dpmpp_2m", "dpmpp_2m_sde", "er_sde", "lcm"], "field_kind": "input", "input": "any", "orig_default": "euler", @@ -11360,14 +10979,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "anima" - ], + "required": ["type", "id"], + "tags": ["image", "anima"], "title": "Denoise - Anima", "type": "object", "version": "1.8.0", @@ -11476,17 +11089,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "latents", - "vae", - "i2l", - "anima" - ], + "required": ["type", "id"], + "tags": ["image", "latents", "vae", "i2l", "anima"], "title": "Image to Latents - Anima", "type": "object", "version": "1.0.1", @@ -11544,10 +11148,7 @@ "type": "number" } }, - "required": [ - "image_name", - "control_model" - ], + "required": ["image_name", "control_model"], "title": "AnimaLLLiteField", "type": "object" }, @@ -11628,12 +11229,8 @@ "input": "any", "orig_required": true, "title": "Control Model", - "ui_model_base": [ - "anima" - ], - "ui_model_type": [ - "controlnet" - ] + "ui_model_base": ["anima"], + "ui_model_type": ["controlnet"] }, "weight": { "default": 1.0, @@ -11679,17 +11276,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "anima", - "control", - "controlnet", - "inpaint" - ], + "required": ["type", "id"], + "tags": ["image", "anima", "control", "controlnet", "inpaint"], "title": "Anima ControlNet-LLLite", "type": "object", "version": "1.0.0", @@ -11715,12 +11303,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "control", - "type", - "type" - ], + "required": ["output_meta", "control", "type", "type"], "title": "AnimaLLLiteOutput", "type": "object" }, @@ -11825,17 +11408,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "latents", - "image", - "vae", - "l2i", - "anima" - ], + "required": ["type", "id"], + "tags": ["latents", "image", "vae", "l2i", "anima"], "title": "Latents to Image - Anima", "type": "object", "version": "1.0.3", @@ -11896,12 +11470,8 @@ "orig_default": null, "orig_required": false, "title": "LoRAs", - "ui_model_base": [ - "anima" - ], - "ui_model_type": [ - "lora" - ] + "ui_model_base": ["anima"], + "ui_model_type": ["lora"] }, "transformer": { "anyOf": [ @@ -11945,15 +11515,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "lora", - "model", - "anima" - ], + "required": ["type", "id"], + "tags": ["lora", "model", "anima"], "title": "Apply LoRA Collection - Anima", "type": "object", "version": "1.0.1", @@ -12007,12 +11570,8 @@ "input": "any", "orig_required": true, "title": "LoRA", - "ui_model_base": [ - "anima" - ], - "ui_model_type": [ - "lora" - ] + "ui_model_base": ["anima"], + "ui_model_type": ["lora"] }, "weight": { "default": 0.75, @@ -12066,15 +11625,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "lora", - "model", - "anima" - ], + "required": ["type", "id"], + "tags": ["lora", "model", "anima"], "title": "Apply LoRA - Anima", "type": "object", "version": "1.0.0", @@ -12124,13 +11676,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "transformer", - "qwen3_encoder", - "type", - "type" - ], + "required": ["output_meta", "transformer", "qwen3_encoder", "type", "type"], "title": "AnimaLoRALoaderOutput", "type": "object" }, @@ -12172,12 +11718,8 @@ "input": "direct", "orig_required": true, "title": "Transformer", - "ui_model_base": [ - "anima" - ], - "ui_model_type": [ - "main" - ] + "ui_model_base": ["anima"], + "ui_model_type": ["main"] }, "vae_model": { "$ref": "#/components/schemas/ModelIdentifierField", @@ -12186,9 +11728,7 @@ "input": "direct", "orig_required": true, "title": "VAE", - "ui_model_type": [ - "vae" - ] + "ui_model_type": ["vae"] }, "qwen3_encoder_model": { "$ref": "#/components/schemas/ModelIdentifierField", @@ -12197,9 +11737,7 @@ "input": "direct", "orig_required": true, "title": "Qwen3 Encoder", - "ui_model_type": [ - "qwen3_encoder" - ] + "ui_model_type": ["qwen3_encoder"] }, "type": { "const": "anima_model_loader", @@ -12209,17 +11747,8 @@ "type": "string" } }, - "required": [ - "model", - "vae_model", - "qwen3_encoder_model", - "type", - "id" - ], - "tags": [ - "model", - "anima" - ], + "required": ["model", "vae_model", "qwen3_encoder_model", "type", "id"], + "tags": ["model", "anima"], "title": "Main Model - Anima", "type": "object", "version": "1.4.0", @@ -12260,14 +11789,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "transformer", - "qwen3_encoder", - "vae", - "type", - "type" - ], + "required": ["output_meta", "transformer", "qwen3_encoder", "vae", "type", "type"], "title": "AnimaModelLoaderOutput", "type": "object" }, @@ -12359,15 +11881,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "prompt", - "conditioning", - "anima" - ], + "required": ["type", "id"], + "tags": ["prompt", "conditioning", "anima"], "title": "Prompt - Anima", "type": "object", "version": "1.4.0", @@ -12679,9 +12194,7 @@ } }, "type": "object", - "required": [ - "version" - ], + "required": ["version"], "title": "AppVersion", "description": "App Version Response" }, @@ -12796,13 +12309,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "mask" - ], + "required": ["type", "id"], + "tags": ["mask"], "title": "Apply Tensor Mask to Image", "type": "object", "version": "1.0.0", @@ -12921,15 +12429,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "mask", - "blend" - ], + "required": ["type", "id"], + "tags": ["image", "mask", "blend"], "title": "Apply Mask to Image", "type": "object", "version": "1.0.0", @@ -12952,9 +12453,7 @@ } }, "type": "object", - "required": [ - "name" - ], + "required": ["name"], "title": "BaseMetadata", "description": "Adds typing data for discriminated union." }, @@ -13052,10 +12551,7 @@ } }, "type": "object", - "required": [ - "graph", - "runs" - ], + "required": ["graph", "runs"], "title": "Batch" }, "BatchDatum": { @@ -13112,10 +12608,7 @@ } }, "type": "object", - "required": [ - "node_path", - "field_name" - ], + "required": ["node_path", "field_name"], "title": "BatchDatum" }, "BatchEnqueuedEvent": { @@ -13171,16 +12664,7 @@ "type": "string" } }, - "required": [ - "timestamp", - "queue_id", - "batch_id", - "enqueued", - "requested", - "priority", - "origin", - "user_id" - ], + "required": ["timestamp", "queue_id", "batch_id", "enqueued", "requested", "priority", "origin", "user_id"], "title": "BatchEnqueuedEvent", "type": "object" }, @@ -13358,10 +12842,7 @@ "mode": { "default": "RGB", "description": "The mode of the image", - "enum": [ - "RGB", - "RGBA" - ], + "enum": ["RGB", "RGBA"], "field_kind": "input", "input": "any", "orig_default": "RGB", @@ -13396,13 +12877,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image" - ], + "required": ["type", "id"], + "tags": ["image"], "title": "Blank Image", "type": "object", "version": "1.2.2", @@ -13506,15 +12982,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "latents", - "blend", - "mask" - ], + "required": ["type", "id"], + "tags": ["latents", "blend", "mask"], "title": "Blend Latents", "type": "object", "version": "1.1.0", @@ -13705,28 +13174,19 @@ "type": "string" } }, - "required": [ - "board_id" - ], + "required": ["board_id"], "title": "BoardField", "type": "object" }, "BoardRecordOrderBy": { "type": "string", - "enum": [ - "created_at", - "board_name" - ], + "enum": ["created_at", "board_name"], "title": "BoardRecordOrderBy", "description": "The order by options for board records" }, "BoardVisibility": { "type": "string", - "enum": [ - "private", - "shared", - "public" - ], + "enum": ["private", "shared", "public"], "title": "BoardVisibility", "description": "The visibility options for a board." }, @@ -13744,10 +13204,7 @@ } }, "type": "object", - "required": [ - "board_id", - "image_name" - ], + "required": ["board_id", "image_name"], "title": "Body_add_image_to_board" }, "Body_add_images_to_board": { @@ -13767,10 +13224,7 @@ } }, "type": "object", - "required": [ - "board_id", - "image_names" - ], + "required": ["board_id", "image_names"], "title": "Body_add_images_to_board" }, "Body_cancel_by_batch_ids": { @@ -13785,9 +13239,7 @@ } }, "type": "object", - "required": [ - "batch_ids" - ], + "required": ["batch_ids"], "title": "Body_cancel_by_batch_ids" }, "Body_create_image_upload_entry": { @@ -13816,10 +13268,7 @@ } }, "type": "object", - "required": [ - "width", - "height" - ], + "required": ["width", "height"], "title": "Body_create_image_upload_entry" }, "Body_create_style_preset": { @@ -13844,9 +13293,7 @@ } }, "type": "object", - "required": [ - "data" - ], + "required": ["data"], "title": "Body_create_style_preset" }, "Body_create_workflow": { @@ -13857,9 +13304,7 @@ } }, "type": "object", - "required": [ - "workflow" - ], + "required": ["workflow"], "title": "Body_create_workflow" }, "Body_delete_images_from_list": { @@ -13874,9 +13319,7 @@ } }, "type": "object", - "required": [ - "image_names" - ], + "required": ["image_names"], "title": "Body_delete_images_from_list" }, "Body_do_hf_login": { @@ -13888,9 +13331,7 @@ } }, "type": "object", - "required": [ - "token" - ], + "required": ["token"], "title": "Body_do_hf_login" }, "Body_download": { @@ -13927,10 +13368,7 @@ } }, "type": "object", - "required": [ - "source", - "dest" - ], + "required": ["source", "dest"], "title": "Body_download" }, "Body_download_images_from_list": { @@ -13980,9 +13418,7 @@ } }, "type": "object", - "required": [ - "batch" - ], + "required": ["batch"], "title": "Body_enqueue_batch" }, "Body_get_images_by_names": { @@ -13997,9 +13433,7 @@ } }, "type": "object", - "required": [ - "image_names" - ], + "required": ["image_names"], "title": "Body_get_images_by_names" }, "Body_get_queue_items_by_item_ids": { @@ -14014,9 +13448,7 @@ } }, "type": "object", - "required": [ - "item_ids" - ], + "required": ["item_ids"], "title": "Body_get_queue_items_by_item_ids" }, "Body_import_style_presets": { @@ -14029,9 +13461,7 @@ } }, "type": "object", - "required": [ - "file" - ], + "required": ["file"], "title": "Body_import_style_presets" }, "Body_parse_dynamicprompts": { @@ -14069,9 +13499,7 @@ } }, "type": "object", - "required": [ - "prompt" - ], + "required": ["prompt"], "title": "Body_parse_dynamicprompts" }, "Body_remove_image_from_board": { @@ -14083,9 +13511,7 @@ } }, "type": "object", - "required": [ - "image_name" - ], + "required": ["image_name"], "title": "Body_remove_image_from_board" }, "Body_remove_images_from_board": { @@ -14100,9 +13526,7 @@ } }, "type": "object", - "required": [ - "image_names" - ], + "required": ["image_names"], "title": "Body_remove_images_from_board" }, "Body_set_workflow_thumbnail": { @@ -14115,9 +13539,7 @@ } }, "type": "object", - "required": [ - "image" - ], + "required": ["image"], "title": "Body_set_workflow_thumbnail" }, "Body_star_images_in_list": { @@ -14132,9 +13554,7 @@ } }, "type": "object", - "required": [ - "image_names" - ], + "required": ["image_names"], "title": "Body_star_images_in_list" }, "Body_unstar_images_in_list": { @@ -14149,9 +13569,7 @@ } }, "type": "object", - "required": [ - "image_names" - ], + "required": ["image_names"], "title": "Body_unstar_images_in_list" }, "Body_update_model_image": { @@ -14163,9 +13581,7 @@ } }, "type": "object", - "required": [ - "image" - ], + "required": ["image"], "title": "Body_update_model_image" }, "Body_update_style_preset": { @@ -14190,9 +13606,7 @@ } }, "type": "object", - "required": [ - "data" - ], + "required": ["data"], "title": "Body_update_style_preset" }, "Body_update_workflow": { @@ -14203,9 +13617,7 @@ } }, "type": "object", - "required": [ - "workflow" - ], + "required": ["workflow"], "title": "Body_update_workflow" }, "Body_update_workflow_is_public": { @@ -14217,9 +13629,7 @@ } }, "type": "object", - "required": [ - "is_public" - ], + "required": ["is_public"], "title": "Body_update_workflow_is_public" }, "Body_upload_image": { @@ -14240,9 +13650,7 @@ ], "title": "Resize To", "description": "Dimensions to resize the image to, must be stringified tuple of 2 integers. Max total pixel count: 16777216", - "examples": [ - "\"[1024,1024]\"" - ] + "examples": ["\"[1024,1024]\""] }, "metadata": { "anyOf": [ @@ -14258,9 +13666,7 @@ } }, "type": "object", - "required": [ - "file" - ], + "required": ["file"], "title": "Body_upload_image" }, "BooleanCollectionInvocation": { @@ -14315,15 +13721,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "primitives", - "boolean", - "collection" - ], + "required": ["type", "id"], + "tags": ["primitives", "boolean", "collection"], "title": "Boolean Collection Primitive", "type": "object", "version": "1.0.2", @@ -14353,12 +13752,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "collection", - "type", - "type" - ], + "required": ["output_meta", "collection", "type", "type"], "title": "BooleanCollectionOutput", "type": "object" }, @@ -14411,14 +13805,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "primitives", - "boolean" - ], + "required": ["type", "id"], + "tags": ["primitives", "boolean"], "title": "Boolean Primitive", "type": "object", "version": "1.0.1", @@ -14445,12 +13833,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "value", - "type", - "type" - ], + "required": ["output_meta", "value", "type", "type"], "title": "BooleanOutput", "type": "object" }, @@ -14476,12 +13859,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "collection", - "type", - "type" - ], + "required": ["output_meta", "collection", "type", "type"], "title": "BoundingBoxCollectionOutput", "type": "object" }, @@ -14524,12 +13902,7 @@ "title": "Score" } }, - "required": [ - "x_min", - "x_max", - "y_min", - "y_max" - ], + "required": ["x_min", "x_max", "y_min", "y_max"], "title": "BoundingBoxField", "type": "object" }, @@ -14612,16 +13985,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "primitives", - "segmentation", - "collection", - "bounding box" - ], + "required": ["type", "id"], + "tags": ["primitives", "segmentation", "collection", "bounding box"], "title": "Bounding Box", "type": "object", "version": "1.0.0", @@ -14647,12 +14012,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "bounding_box", - "type", - "type" - ], + "required": ["output_meta", "bounding_box", "type", "type"], "title": "BoundingBoxOutput", "type": "object" }, @@ -14668,9 +14028,7 @@ } }, "type": "object", - "required": [ - "keys" - ], + "required": ["keys"], "title": "BulkDeleteModelsRequest", "description": "Request body for bulk model deletion." }, @@ -14695,10 +14053,7 @@ } }, "type": "object", - "required": [ - "deleted", - "failed" - ], + "required": ["deleted", "failed"], "title": "BulkDeleteModelsResponse", "description": "Response body for bulk model deletion." }, @@ -14732,13 +14087,7 @@ "type": "string" } }, - "required": [ - "timestamp", - "bulk_download_id", - "bulk_download_item_id", - "bulk_download_item_name", - "user_id" - ], + "required": ["timestamp", "bulk_download_id", "bulk_download_item_id", "bulk_download_item_name", "user_id"], "title": "BulkDownloadCompleteEvent", "type": "object" }, @@ -14818,13 +14167,7 @@ "type": "string" } }, - "required": [ - "timestamp", - "bulk_download_id", - "bulk_download_item_id", - "bulk_download_item_name", - "user_id" - ], + "required": ["timestamp", "bulk_download_id", "bulk_download_item_id", "bulk_download_item_name", "user_id"], "title": "BulkDownloadStartedEvent", "type": "object" }, @@ -14840,9 +14183,7 @@ } }, "type": "object", - "required": [ - "keys" - ], + "required": ["keys"], "title": "BulkReidentifyModelsRequest", "description": "Request body for bulk model reidentification." }, @@ -14867,10 +14208,7 @@ } }, "type": "object", - "required": [ - "succeeded", - "failed" - ], + "required": ["succeeded", "failed"], "title": "BulkReidentifyModelsResponse", "description": "Response body for bulk model reidentification." }, @@ -15192,12 +14530,7 @@ "type": "array" } }, - "required": [ - "tokenizer", - "text_encoder", - "skipped_layers", - "loras" - ], + "required": ["tokenizer", "text_encoder", "skipped_layers", "loras"], "title": "CLIPField", "type": "object" }, @@ -15220,12 +14553,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "clip", - "type", - "type" - ], + "required": ["output_meta", "clip", "type", "type"], "title": "CLIPOutput", "type": "object" }, @@ -15295,15 +14623,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "clipskip", - "clip", - "skip" - ], + "required": ["type", "id"], + "tags": ["clipskip", "clip", "skip"], "title": "Apply CLIP Skip - SD1.5, SDXL", "type": "object", "version": "1.1.1", @@ -15338,12 +14659,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "clip", - "type", - "type" - ], + "required": ["output_meta", "clip", "type", "type"], "title": "CLIPSkipInvocationOutput", "type": "object" }, @@ -15574,14 +14890,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "inpaint" - ], + "required": ["type", "id"], + "tags": ["image", "inpaint"], "title": "CV2 Infill", "type": "object", "version": "1.2.2", @@ -15728,13 +15038,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "tiles" - ], + "required": ["type", "id"], + "tags": ["tiles"], "title": "Calculate Image Tiles Even Split", "type": "object", "version": "1.1.1", @@ -15836,13 +15141,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "tiles" - ], + "required": ["type", "id"], + "tags": ["tiles"], "title": "Calculate Image Tiles", "type": "object", "version": "1.0.1", @@ -15944,13 +15244,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "tiles" - ], + "required": ["type", "id"], + "tags": ["tiles"], "title": "Calculate Image Tiles Minimum Overlap", "type": "object", "version": "1.0.1", @@ -15979,12 +15274,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "tiles", - "type", - "type" - ], + "required": ["output_meta", "tiles", "type", "type"], "title": "CalculateImageTilesOutput", "type": "object" }, @@ -16050,15 +15340,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "workflow", - "saved", - "library" - ], + "required": ["type", "id"], + "tags": ["workflow", "saved", "library"], "title": "Call Saved Workflow", "type": "object", "version": "1.0.0", @@ -16075,9 +15358,7 @@ } }, "type": "object", - "required": [ - "canceled" - ], + "required": ["canceled"], "title": "CancelAllExceptCurrentResult", "description": "Result of canceling all except current" }, @@ -16090,9 +15371,7 @@ } }, "type": "object", - "required": [ - "canceled" - ], + "required": ["canceled"], "title": "CancelByBatchIDsResult", "description": "Result of canceling by list of batch ids" }, @@ -16105,9 +15384,7 @@ } }, "type": "object", - "required": [ - "canceled" - ], + "required": ["canceled"], "title": "CancelByDestinationResult", "description": "Result of canceling by a destination" }, @@ -16221,14 +15498,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "controlnet", - "canny" - ], + "required": ["type", "id"], + "tags": ["controlnet", "canny"], "title": "Canny Edge Detection", "type": "object", "version": "1.0.0", @@ -16290,15 +15561,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "canvas", - "output", - "image" - ], + "required": ["type", "id"], + "tags": ["canvas", "output", "image"], "title": "Canvas Output", "type": "object", "version": "1.0.0", @@ -16433,14 +15697,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "combine" - ], + "required": ["type", "id"], + "tags": ["image", "combine"], "title": "Canvas Paste Back", "type": "object", "version": "1.0.1", @@ -16576,15 +15834,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "mask", - "id" - ], + "required": ["type", "id"], + "tags": ["image", "mask", "id"], "title": "Canvas V2 Mask and Crop", "type": "object", "version": "1.0.0", @@ -16686,15 +15937,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "pad", - "crop" - ], + "required": ["type", "id"], + "tags": ["image", "pad", "crop"], "title": "Center Pad or Crop Image", "type": "object", "version": "1.0.0", @@ -16704,14 +15948,7 @@ }, "Classification": { "description": "The classification of an Invocation.\n- `Stable`: The invocation, including its inputs/outputs and internal logic, is stable. You may build workflows with it, having confidence that they will not break because of a change in this invocation.\n- `Beta`: The invocation is not yet stable, but is planned to be stable in the future. Workflows built around this invocation may break, but we are committed to supporting this invocation long-term.\n- `Prototype`: The invocation is not yet stable and may be removed from the application at any time. Workflows built around this invocation may break, and we are *not* committed to supporting this invocation.\n- `Deprecated`: The invocation is deprecated and may be removed in a future version.\n- `Internal`: The invocation is not intended for use by end-users. It may be changed or removed at any time, but is exposed for users to play with.\n- `Special`: The invocation is a special case and does not fit into any of the other classifications.", - "enum": [ - "stable", - "beta", - "prototype", - "deprecated", - "internal", - "special" - ], + "enum": ["stable", "beta", "prototype", "deprecated", "internal", "special"], "title": "Classification", "type": "string" }, @@ -16724,18 +15961,13 @@ } }, "type": "object", - "required": [ - "deleted" - ], + "required": ["deleted"], "title": "ClearResult", "description": "Result of clearing the session queue" }, "ClipVariantType": { "type": "string", - "enum": [ - "large", - "gigantic" - ], + "enum": ["large", "gigantic"], "title": "ClipVariantType", "description": "Variant type." }, @@ -16748,9 +15980,7 @@ "type": "string" } }, - "required": [ - "conditioning_name" - ], + "required": ["conditioning_name"], "title": "CogView4ConditioningField", "type": "object" }, @@ -16772,12 +16002,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "conditioning", - "type", - "type" - ], + "required": ["output_meta", "conditioning", "type", "type"], "title": "CogView4ConditioningOutput", "type": "object" }, @@ -17033,14 +16258,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "cogview4" - ], + "required": ["type", "id"], + "tags": ["image", "cogview4"], "title": "Denoise - CogView4", "type": "object", "version": "1.1.0", @@ -17149,17 +16368,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "latents", - "vae", - "i2l", - "cogview4" - ], + "required": ["type", "id"], + "tags": ["image", "latents", "vae", "i2l", "cogview4"], "title": "Image to Latents - CogView4", "type": "object", "version": "1.0.0", @@ -17268,17 +16478,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "latents", - "image", - "vae", - "l2i", - "cogview4" - ], + "required": ["type", "id"], + "tags": ["latents", "image", "vae", "l2i", "cogview4"], "title": "Latents to Image - CogView4", "type": "object", "version": "1.0.0", @@ -17323,12 +16524,8 @@ "field_kind": "input", "input": "direct", "orig_required": true, - "ui_model_base": [ - "cogview4" - ], - "ui_model_type": [ - "main" - ] + "ui_model_base": ["cogview4"], + "ui_model_type": ["main"] }, "type": { "const": "cogview4_model_loader", @@ -17338,15 +16535,8 @@ "type": "string" } }, - "required": [ - "model", - "type", - "id" - ], - "tags": [ - "model", - "cogview4" - ], + "required": ["model", "type", "id"], + "tags": ["model", "cogview4"], "title": "Main Model - CogView4", "type": "object", "version": "1.0.0", @@ -17387,14 +16577,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "transformer", - "glm_encoder", - "vae", - "type", - "type" - ], + "required": ["output_meta", "transformer", "glm_encoder", "vae", "type", "type"], "title": "CogView4ModelLoaderOutput", "type": "object" }, @@ -17470,15 +16653,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "prompt", - "conditioning", - "cogview4" - ], + "required": ["type", "id"], + "tags": ["prompt", "conditioning", "cogview4"], "title": "Prompt - CogView4", "type": "object", "version": "1.0.0", @@ -17552,10 +16728,7 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], + "required": ["type", "id"], "title": "CollectInvocation", "type": "object", "version": "1.1.0", @@ -17583,12 +16756,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "collection", - "type", - "type" - ], + "required": ["output_meta", "collection", "type", "type"], "title": "CollectInvocationOutput", "type": "object" }, @@ -17614,12 +16782,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "collection", - "type", - "type" - ], + "required": ["output_meta", "collection", "type", "type"], "title": "ColorCollectionOutput", "type": "object" }, @@ -17735,12 +16898,7 @@ "colorspace": { "default": "RGB", "description": "Colorspace in which to apply histogram matching", - "enum": [ - "RGB", - "YCbCr", - "YCbCr-Chroma", - "YCbCr-Luma" - ], + "enum": ["RGB", "YCbCr", "YCbCr-Chroma", "YCbCr-Luma"], "field_kind": "input", "input": "any", "orig_default": "RGB", @@ -17756,14 +16914,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "color" - ], + "required": ["type", "id"], + "tags": ["image", "color"], "title": "Color Correct", "type": "object", "version": "2.0.0", @@ -17803,12 +16955,7 @@ "type": "integer" } }, - "required": [ - "r", - "g", - "b", - "a" - ], + "required": ["r", "g", "b", "a"], "title": "ColorField", "type": "object" }, @@ -17870,14 +17017,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "primitives", - "color" - ], + "required": ["type", "id"], + "tags": ["primitives", "color"], "title": "Color Primitive", "type": "object", "version": "1.0.1", @@ -17982,13 +17123,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "controlnet" - ], + "required": ["type", "id"], + "tags": ["controlnet"], "title": "Color Map", "type": "object", "version": "1.0.0", @@ -18014,12 +17150,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "color", - "type", - "type" - ], + "required": ["output_meta", "color", "type", "type"], "title": "ColorOutput", "type": "object" }, @@ -18105,14 +17236,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "prompt", - "compel" - ], + "required": ["type", "id"], + "tags": ["prompt", "compel"], "title": "Prompt - SD1.5", "type": "object", "version": "1.2.1", @@ -18172,15 +17297,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "primitives", - "conditioning", - "collection" - ], + "required": ["type", "id"], + "tags": ["primitives", "conditioning", "collection"], "title": "Conditioning Collection Primitive", "type": "object", "version": "1.0.2", @@ -18210,12 +17328,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "collection", - "type", - "type" - ], + "required": ["output_meta", "collection", "type", "type"], "title": "ConditioningCollectionOutput", "type": "object" }, @@ -18240,9 +17353,7 @@ "description": "The mask associated with this conditioning tensor. Excluded regions should be set to False, included regions should be set to True." } }, - "required": [ - "conditioning_name" - ], + "required": ["conditioning_name"], "title": "ConditioningField", "type": "object" }, @@ -18300,14 +17411,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "primitives", - "conditioning" - ], + "required": ["type", "id"], + "tags": ["primitives", "conditioning"], "title": "Conditioning Primitive", "type": "object", "version": "1.0.1", @@ -18333,12 +17438,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "conditioning", - "type", - "type" - ], + "required": ["output_meta", "conditioning", "type", "type"], "title": "ConditioningOutput", "type": "object" }, @@ -18439,14 +17539,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "controlnet", - "normal" - ], + "required": ["type", "id"], + "tags": ["controlnet", "normal"], "title": "Content Shuffle", "type": "object", "version": "1.0.0", @@ -18482,9 +17576,7 @@ }, "additionalProperties": false, "type": "object", - "required": [ - "preprocessor" - ], + "required": ["preprocessor"], "title": "ControlAdapterDefaultSettings" }, "ControlField": { @@ -18532,32 +17624,19 @@ "control_mode": { "default": "balanced", "description": "The control mode to use", - "enum": [ - "balanced", - "more_prompt", - "more_control", - "unbalanced" - ], + "enum": ["balanced", "more_prompt", "more_control", "unbalanced"], "title": "Control Mode", "type": "string" }, "resize_mode": { "default": "just_resize", "description": "The resize mode to use", - "enum": [ - "just_resize", - "crop_resize", - "fill_resize", - "just_resize_simple" - ], + "enum": ["just_resize", "crop_resize", "fill_resize", "just_resize_simple"], "title": "Resize Mode", "type": "string" } }, - "required": [ - "image", - "control_model" - ], + "required": ["image", "control_model"], "title": "ControlField", "type": "object" }, @@ -18577,11 +17656,7 @@ "description": "Image to use in structural conditioning" } }, - "required": [ - "lora", - "weight", - "img" - ], + "required": ["lora", "weight", "img"], "title": "ControlLoRAField", "type": "object" }, @@ -18795,14 +17870,8 @@ "field_kind": "input", "input": "any", "orig_required": true, - "ui_model_base": [ - "sd-1", - "sd-2", - "sdxl" - ], - "ui_model_type": [ - "controlnet" - ] + "ui_model_base": ["sd-1", "sd-2", "sdxl"], + "ui_model_type": ["controlnet"] }, "control_weight": { "anyOf": [ @@ -18853,12 +17922,7 @@ "control_mode": { "default": "balanced", "description": "The control mode used", - "enum": [ - "balanced", - "more_prompt", - "more_control", - "unbalanced" - ], + "enum": ["balanced", "more_prompt", "more_control", "unbalanced"], "field_kind": "input", "input": "any", "orig_default": "balanced", @@ -18869,12 +17933,7 @@ "resize_mode": { "default": "just_resize", "description": "The resize mode used", - "enum": [ - "just_resize", - "crop_resize", - "fill_resize", - "just_resize_simple" - ], + "enum": ["just_resize", "crop_resize", "fill_resize", "just_resize_simple"], "field_kind": "input", "input": "any", "orig_default": "just_resize", @@ -18890,13 +17949,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "controlnet" - ], + "required": ["type", "id"], + "tags": ["controlnet"], "title": "ControlNet - SD1.5, SD2, SDXL", "type": "object", "version": "1.1.3", @@ -18961,32 +18015,19 @@ "control_mode": { "default": "balanced", "description": "The control mode to use", - "enum": [ - "balanced", - "more_prompt", - "more_control", - "unbalanced" - ], + "enum": ["balanced", "more_prompt", "more_control", "unbalanced"], "title": "Control Mode", "type": "string" }, "resize_mode": { "default": "just_resize", "description": "The resize mode to use", - "enum": [ - "just_resize", - "crop_resize", - "fill_resize", - "just_resize_simple" - ], + "enum": ["just_resize", "crop_resize", "fill_resize", "just_resize_simple"], "title": "Resize Mode", "type": "string" } }, - "required": [ - "image", - "control_model" - ], + "required": ["image", "control_model"], "title": "ControlNetMetadataField", "type": "object" }, @@ -19049,11 +18090,7 @@ "anyOf": [ { "type": "string", - "enum": [ - "balanced", - "more_prompt", - "more_control" - ] + "enum": ["balanced", "more_prompt", "more_control"] }, { "type": "null" @@ -19064,9 +18101,7 @@ } }, "type": "object", - "required": [ - "model_name" - ], + "required": ["model_name"], "title": "ControlNetRecallParameter", "description": "ControlNet configuration for recall" }, @@ -20531,12 +19566,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "control", - "type", - "type" - ], + "required": ["output_meta", "control", "type", "type"], "title": "ControlOutput", "type": "object" }, @@ -21221,13 +20251,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Core Metadata", "type": "object", "version": "2.1.0", @@ -21345,14 +20370,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "mask", - "denoise" - ], + "required": ["type", "id"], + "tags": ["mask", "denoise"], "title": "Create Denoise Mask", "type": "object", "version": "1.0.2", @@ -21421,11 +20440,7 @@ }, "coherence_mode": { "default": "Gaussian Blur", - "enum": [ - "Gaussian Blur", - "Box Blur", - "Staged" - ], + "enum": ["Gaussian Blur", "Box Blur", "Staged"], "field_kind": "input", "input": "any", "orig_default": "Gaussian Blur", @@ -21531,14 +20546,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "mask", - "denoise" - ], + "required": ["type", "id"], + "tags": ["mask", "denoise"], "title": "Create Gradient Mask", "type": "object", "version": "1.3.0", @@ -21648,14 +20657,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "crop" - ], + "required": ["type", "id"], + "tags": ["image", "crop"], "title": "Crop Image to Bounding Box", "type": "object", "version": "1.0.0", @@ -21789,14 +20792,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "latents", - "crop" - ], + "required": ["type", "id"], + "tags": ["latents", "crop"], "title": "Crop Latents", "type": "object", "version": "1.0.2", @@ -21905,14 +20902,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "opencv", - "inpaint" - ], + "required": ["type", "id"], + "tags": ["opencv", "inpaint"], "title": "OpenCV Inpaint", "type": "object", "version": "1.3.1", @@ -22033,15 +21024,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "controlnet", - "dwpose", - "openpose" - ], + "required": ["type", "id"], + "tags": ["controlnet", "dwpose", "openpose"], "title": "DW Openpose Detection", "type": "object", "version": "1.1.1", @@ -22113,14 +21097,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "watermark" - ], + "required": ["type", "id"], + "tags": ["image", "watermark"], "title": "Decode Invisible Watermark", "type": "object", "version": "1.0.0", @@ -22137,9 +21115,7 @@ } }, "type": "object", - "required": [ - "deleted" - ], + "required": ["deleted"], "title": "DeleteAllExceptCurrentResult", "description": "Result of deleting all except current" }, @@ -22168,11 +21144,7 @@ } }, "type": "object", - "required": [ - "board_id", - "deleted_board_images", - "deleted_images" - ], + "required": ["board_id", "deleted_board_images", "deleted_images"], "title": "DeleteBoardResult" }, "DeleteByDestinationResult": { @@ -22184,9 +21156,7 @@ } }, "type": "object", - "required": [ - "deleted" - ], + "required": ["deleted"], "title": "DeleteByDestinationResult", "description": "Result of deleting by a destination" }, @@ -22210,10 +21180,7 @@ } }, "type": "object", - "required": [ - "affected_boards", - "deleted_images" - ], + "required": ["affected_boards", "deleted_images"], "title": "DeleteImagesResult" }, "DeleteOrphanedModelsRequest": { @@ -22228,9 +21195,7 @@ } }, "type": "object", - "required": [ - "paths" - ], + "required": ["paths"], "title": "DeleteOrphanedModelsRequest", "description": "Request to delete specific orphaned model directories." }, @@ -22254,10 +21219,7 @@ } }, "type": "object", - "required": [ - "deleted", - "errors" - ], + "required": ["deleted", "errors"], "title": "DeleteOrphanedModelsResponse", "description": "Response from deleting orphaned models." }, @@ -22596,20 +21558,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "latents", - "denoise", - "txt2img", - "t2i", - "t2l", - "img2img", - "i2i", - "l2l" - ], + "required": ["type", "id"], + "tags": ["latents", "denoise", "txt2img", "t2i", "t2l", "img2img", "i2i", "l2l"], "title": "Denoise - SD1.5, SDXL", "type": "object", "version": "1.5.4", @@ -22967,20 +21917,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "latents", - "denoise", - "txt2img", - "t2i", - "t2l", - "img2img", - "i2i", - "l2l" - ], + "required": ["type", "id"], + "tags": ["latents", "denoise", "txt2img", "t2i", "t2l", "img2img", "i2i", "l2l"], "title": "Denoise - SD1.5, SDXL + Metadata", "type": "object", "version": "1.1.1", @@ -23016,9 +21954,7 @@ "type": "boolean" } }, - "required": [ - "mask_name" - ], + "required": ["mask_name"], "title": "DenoiseMaskField", "type": "object" }, @@ -23040,12 +21976,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "denoise_mask", - "type", - "type" - ], + "required": ["output_meta", "denoise_mask", "type", "type"], "title": "DenoiseMaskOutput", "type": "object" }, @@ -23130,12 +22061,7 @@ "model_size": { "default": "small_v2", "description": "The size of the depth model to use", - "enum": [ - "large", - "base", - "small", - "small_v2" - ], + "enum": ["large", "base", "small", "small_v2"], "field_kind": "input", "input": "any", "orig_default": "small_v2", @@ -23151,15 +22077,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "controlnet", - "depth", - "depth anything" - ], + "required": ["type", "id"], + "tags": ["controlnet", "depth", "depth anything"], "title": "Depth Anything Depth Estimation", "type": "object", "version": "1.0.0", @@ -23226,14 +22145,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "math", - "divide" - ], + "required": ["type", "id"], + "tags": ["math", "divide"], "title": "Divide Integers", "type": "object", "version": "1.0.1", @@ -23255,10 +22168,7 @@ "type": "string" } }, - "required": [ - "timestamp", - "source" - ], + "required": ["timestamp", "source"], "title": "DownloadCancelledEvent", "type": "object" }, @@ -23286,12 +22196,7 @@ "type": "integer" } }, - "required": [ - "timestamp", - "source", - "download_path", - "total_bytes" - ], + "required": ["timestamp", "source", "download_path", "total_bytes"], "title": "DownloadCompleteEvent", "type": "object" }, @@ -23319,12 +22224,7 @@ "type": "string" } }, - "required": [ - "timestamp", - "source", - "error_type", - "error" - ], + "required": ["timestamp", "source", "error_type", "error"], "title": "DownloadErrorEvent", "type": "object" }, @@ -23543,23 +22443,13 @@ } }, "type": "object", - "required": [ - "dest", - "source" - ], + "required": ["dest", "source"], "title": "DownloadJob", "description": "Class to monitor and control a model download request." }, "DownloadJobStatus": { "type": "string", - "enum": [ - "waiting", - "running", - "paused", - "completed", - "cancelled", - "error" - ], + "enum": ["waiting", "running", "paused", "completed", "cancelled", "error"], "title": "DownloadJobStatus", "description": "State of a download job." }, @@ -23577,10 +22467,7 @@ "type": "string" } }, - "required": [ - "timestamp", - "source" - ], + "required": ["timestamp", "source"], "title": "DownloadPausedEvent", "type": "object" }, @@ -23613,13 +22500,7 @@ "type": "integer" } }, - "required": [ - "timestamp", - "source", - "download_path", - "current_bytes", - "total_bytes" - ], + "required": ["timestamp", "source", "download_path", "current_bytes", "total_bytes"], "title": "DownloadProgressEvent", "type": "object" }, @@ -23642,11 +22523,7 @@ "type": "string" } }, - "required": [ - "timestamp", - "source", - "download_path" - ], + "required": ["timestamp", "source", "download_path"], "title": "DownloadStartedEvent", "type": "object" }, @@ -23726,14 +22603,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "prompt", - "collection" - ], + "required": ["type", "id"], + "tags": ["prompt", "collection"], "title": "Dynamic Prompt", "type": "object", "version": "1.0.1", @@ -23763,9 +22634,7 @@ } }, "type": "object", - "required": [ - "prompts" - ], + "required": ["prompts"], "title": "DynamicPromptsResponse" }, "ESRGANInvocation": { @@ -23881,14 +22750,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "esrgan", - "upscale" - ], + "required": ["type", "id"], + "tags": ["esrgan", "upscale"], "title": "Upscale (RealESRGAN)", "type": "object", "version": "1.3.2", @@ -23908,10 +22771,7 @@ } }, "type": "object", - "required": [ - "source", - "destination" - ], + "required": ["source", "destination"], "title": "Edge" }, "EdgeConnection": { @@ -23928,10 +22788,7 @@ } }, "type": "object", - "required": [ - "node_id", - "field" - ], + "required": ["node_id", "field"], "title": "EdgeConnection" }, "EnqueueBatchResult": { @@ -23970,14 +22827,7 @@ } }, "type": "object", - "required": [ - "queue_id", - "enqueued", - "requested", - "batch", - "priority", - "item_ids" - ], + "required": ["queue_id", "enqueued", "requested", "batch", "priority", "item_ids"], "title": "EnqueueBatchResult" }, "ExpandMaskWithFadeInvocation": { @@ -24089,14 +22939,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "mask" - ], + "required": ["type", "id"], + "tags": ["image", "mask"], "title": "Expand Mask with Fade", "type": "object", "version": "1.0.1", @@ -24134,10 +22978,7 @@ } }, "type": "object", - "required": [ - "prompt", - "model_key" - ], + "required": ["prompt", "model_key"], "title": "ExpandPromptRequest" }, "ExpandPromptResponse": { @@ -24159,9 +23000,7 @@ } }, "type": "object", - "required": [ - "expanded_prompt" - ], + "required": ["expanded_prompt"], "title": "ExpandPromptResponse" }, "ExposedField": { @@ -24176,10 +23015,7 @@ } }, "type": "object", - "required": [ - "nodeId", - "fieldName" - ], + "required": ["nodeId", "fieldName"], "title": "ExposedField" }, "ExternalApiModelConfig": { @@ -24426,10 +23262,7 @@ }, "additionalProperties": false, "type": "object", - "required": [ - "width", - "height" - ], + "required": ["width", "height"], "title": "ExternalImageSize" }, "ExternalModelCapabilities": { @@ -24437,11 +23270,7 @@ "modes": { "items": { "type": "string", - "enum": [ - "txt2img", - "img2img", - "inpaint" - ] + "enum": ["txt2img", "img2img", "inpaint"] }, "type": "array", "title": "Modes" @@ -24549,11 +23378,7 @@ }, "mask_format": { "type": "string", - "enum": [ - "alpha", - "binary", - "none" - ], + "enum": ["alpha", "binary", "none"], "title": "Mask Format", "default": "none" }, @@ -24562,11 +23387,7 @@ { "items": { "type": "string", - "enum": [ - "txt2img", - "img2img", - "inpaint" - ] + "enum": ["txt2img", "img2img", "inpaint"] }, "type": "array" }, @@ -24585,11 +23406,7 @@ "properties": { "name": { "type": "string", - "enum": [ - "reference_images", - "dimensions", - "seed" - ], + "enum": ["reference_images", "dimensions", "seed"], "title": "Name" }, "slider_min": { @@ -24675,9 +23492,7 @@ }, "additionalProperties": false, "type": "object", - "required": [ - "name" - ], + "required": ["name"], "title": "ExternalModelPanelControl" }, "ExternalModelPanelSchema": { @@ -24726,10 +23541,7 @@ } }, "type": "object", - "required": [ - "provider_id", - "provider_model_id" - ], + "required": ["provider_id", "provider_model_id"], "title": "ExternalModelSource", "description": "An external provider model identifier." }, @@ -24759,10 +23571,7 @@ } }, "type": "object", - "required": [ - "provider_id", - "api_key_configured" - ], + "required": ["provider_id", "api_key_configured"], "title": "ExternalProviderConfigModel" }, "ExternalProviderConfigUpdate": { @@ -24821,10 +23630,7 @@ } }, "type": "object", - "required": [ - "provider_id", - "configured" - ], + "required": ["provider_id", "configured"], "title": "ExternalProviderStatusModel" }, "ExternalResolutionPreset": { @@ -24860,13 +23666,7 @@ }, "additionalProperties": false, "type": "object", - "required": [ - "label", - "aspect_ratio", - "image_size", - "width", - "height" - ], + "required": ["label", "aspect_ratio", "image_size", "width", "height"], "title": "ExternalResolutionPreset" }, "FLUXLoRACollectionLoader": { @@ -24922,12 +23722,8 @@ "orig_default": null, "orig_required": false, "title": "LoRAs", - "ui_model_base": [ - "flux" - ], - "ui_model_type": [ - "lora" - ] + "ui_model_base": ["flux"], + "ui_model_type": ["lora"] }, "transformer": { "anyOf": [ @@ -24988,15 +23784,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "lora", - "model", - "flux" - ], + "required": ["type", "id"], + "tags": ["lora", "model", "flux"], "title": "Apply LoRA Collection - FLUX", "type": "object", "version": "1.3.2", @@ -25233,15 +24022,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "face", - "identifier" - ], + "required": ["type", "id"], + "tags": ["image", "face", "identifier"], "title": "FaceIdentifier", "type": "object", "version": "1.2.2", @@ -25379,15 +24161,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "face", - "mask" - ], + "required": ["type", "id"], + "tags": ["image", "face", "mask"], "title": "FaceMask", "type": "object", "version": "1.2.2", @@ -25433,15 +24208,7 @@ "ui_hidden": false } }, - "required": [ - "output_meta", - "image", - "width", - "height", - "type", - "mask", - "type" - ], + "required": ["output_meta", "image", "width", "height", "type", "mask", "type"], "title": "FaceMaskOutput", "type": "object" }, @@ -25576,16 +24343,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "faceoff", - "face", - "mask" - ], + "required": ["type", "id"], + "tags": ["image", "faceoff", "face", "mask"], "title": "FaceOff", "type": "object", "version": "1.2.2", @@ -25645,28 +24404,13 @@ "ui_hidden": false } }, - "required": [ - "output_meta", - "image", - "width", - "height", - "type", - "mask", - "x", - "y", - "type" - ], + "required": ["output_meta", "image", "width", "height", "type", "mask", "x", "y", "type"], "title": "FaceOffOutput", "type": "object" }, "FieldKind": { "description": "The kind of field.\n- `Input`: An input field on a node.\n- `Output`: An output field on a node.\n- `Internal`: A field which is treated as an input, but cannot be used in node definitions. Metadata is\none example. It is provided to nodes via the WithMetadata class, and we want to reserve the field name\n\"metadata\" for this on all nodes. `FieldKind` is used to short-circuit the field name validation logic,\nallowing \"metadata\" for that field.\n- `NodeAttribute`: The field is a node attribute. These are fields which are not inputs or outputs,\nbut which are used to store information about the node. For example, the `id` and `type` fields are node\nattributes.\n\nThe presence of this in `json_schema_extra[\"field_kind\"]` is used when initializing node schemas on app\nstartup, and when generating the OpenAPI schema for the workflow editor.", - "enum": [ - "input", - "output", - "internal", - "node_attribute" - ], + "enum": ["input", "output", "internal", "node_attribute"], "title": "FieldKind", "type": "string" }, @@ -25704,14 +24448,7 @@ "batch_group_id": { "default": "None", "description": "The ID of this batch node's group. If provided, all batch nodes in with the same ID will be 'zipped' before execution, and all nodes' collections must be of the same size.", - "enum": [ - "None", - "Group 1", - "Group 2", - "Group 3", - "Group 4", - "Group 5" - ], + "enum": ["None", "Group 1", "Group 2", "Group 3", "Group 4", "Group 5"], "field_kind": "input", "input": "direct", "orig_default": "None", @@ -25747,17 +24484,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "primitives", - "float", - "number", - "batch", - "special" - ], + "required": ["type", "id"], + "tags": ["primitives", "float", "number", "batch", "special"], "title": "Float Batch", "type": "object", "version": "1.0.0", @@ -25817,15 +24545,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "primitives", - "float", - "collection" - ], + "required": ["type", "id"], + "tags": ["primitives", "float", "collection"], "title": "Float Collection Primitive", "type": "object", "version": "1.0.2", @@ -25855,12 +24576,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "collection", - "type", - "type" - ], + "required": ["output_meta", "collection", "type", "type"], "title": "FloatCollectionOutput", "type": "object" }, @@ -25911,18 +24627,8 @@ "type": "string" } }, - "required": [ - "generator", - "type", - "id" - ], - "tags": [ - "primitives", - "float", - "number", - "batch", - "special" - ], + "required": ["generator", "type", "id"], + "tags": ["primitives", "float", "number", "batch", "special"], "title": "Float Generator", "type": "object", "version": "1.0.0", @@ -25957,12 +24663,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "floats", - "type", - "type" - ], + "required": ["output_meta", "floats", "type", "type"], "title": "FloatGeneratorOutput", "type": "object" }, @@ -26015,14 +24716,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "primitives", - "float" - ], + "required": ["type", "id"], + "tags": ["primitives", "float"], "title": "Float Primitive", "type": "object", "version": "1.0.1", @@ -26099,14 +24794,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "math", - "range" - ], + "required": ["type", "id"], + "tags": ["math", "range"], "title": "Float Range", "type": "object", "version": "1.0.1", @@ -26148,17 +24837,7 @@ "operation": { "default": "ADD", "description": "The operation to perform", - "enum": [ - "ADD", - "SUB", - "MUL", - "DIV", - "EXP", - "ABS", - "SQRT", - "MIN", - "MAX" - ], + "enum": ["ADD", "SUB", "MUL", "DIV", "EXP", "ABS", "SQRT", "MIN", "MAX"], "field_kind": "input", "input": "any", "orig_default": "ADD", @@ -26205,10 +24884,7 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], + "required": ["type", "id"], "tags": [ "math", "float", @@ -26248,12 +24924,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "value", - "type", - "type" - ], + "required": ["output_meta", "value", "type", "type"], "title": "FloatOutput", "type": "object" }, @@ -26312,12 +24983,7 @@ "method": { "default": "Nearest", "description": "The method to use for rounding", - "enum": [ - "Nearest", - "Floor", - "Ceiling", - "Truncate" - ], + "enum": ["Nearest", "Floor", "Ceiling", "Truncate"], "field_kind": "input", "input": "any", "orig_default": "Nearest", @@ -26333,17 +24999,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "math", - "round", - "integer", - "float", - "convert" - ], + "required": ["type", "id"], + "tags": ["math", "round", "integer", "float", "convert"], "title": "Float To Integer", "type": "object", "version": "1.0.1", @@ -26575,11 +25232,7 @@ "scheduler": { "default": "euler", "description": "Scheduler (sampler) for the denoising process. 'euler' is fast and standard. 'heun' is 2nd-order (better quality, 2x slower). 'lcm' is optimized for few steps.", - "enum": [ - "euler", - "heun", - "lcm" - ], + "enum": ["euler", "heun", "lcm"], "field_kind": "input", "input": "any", "orig_default": "euler", @@ -26648,17 +25301,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "flux", - "flux2", - "klein", - "denoise" - ], + "required": ["type", "id"], + "tags": ["image", "flux", "flux2", "klein", "denoise"], "title": "FLUX2 Denoise", "type": "object", "version": "1.6.0", @@ -26762,17 +25406,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "lora", - "model", - "flux", - "flux2", - "dev" - ], + "required": ["type", "id"], + "tags": ["lora", "model", "flux", "flux2", "dev"], "title": "Apply LoRA Collection - FLUX.2 [dev]", "type": "object", "version": "1.0.0", @@ -26826,12 +25461,8 @@ "input": "any", "orig_required": true, "title": "LoRA", - "ui_model_base": [ - "flux2" - ], - "ui_model_type": [ - "lora" - ] + "ui_model_base": ["flux2"], + "ui_model_type": ["lora"] }, "weight": { "default": 0.75, @@ -26885,17 +25516,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "lora", - "model", - "flux", - "flux2", - "dev" - ], + "required": ["type", "id"], + "tags": ["lora", "model", "flux", "flux2", "dev"], "title": "Apply LoRA - FLUX.2 [dev]", "type": "object", "version": "1.0.0", @@ -26945,13 +25567,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "transformer", - "mistral_encoder", - "type", - "type" - ], + "required": ["output_meta", "transformer", "mistral_encoder", "type", "type"], "title": "Flux2DevLoRALoaderOutput", "type": "object" }, @@ -26993,12 +25609,8 @@ "input": "direct", "orig_required": true, "title": "Transformer", - "ui_model_base": [ - "flux2" - ], - "ui_model_type": [ - "main" - ] + "ui_model_base": ["flux2"], + "ui_model_type": ["main"] }, "vae_model": { "anyOf": [ @@ -27016,12 +25628,8 @@ "orig_default": null, "orig_required": false, "title": "VAE", - "ui_model_base": [ - "flux2" - ], - "ui_model_type": [ - "vae" - ] + "ui_model_base": ["flux2"], + "ui_model_type": ["vae"] }, "mistral_encoder_model": { "anyOf": [ @@ -27039,9 +25647,7 @@ "orig_default": null, "orig_required": false, "title": "Mistral Encoder", - "ui_model_type": [ - "mistral_encoder" - ] + "ui_model_type": ["mistral_encoder"] }, "mistral_source_model": { "anyOf": [ @@ -27059,23 +25665,14 @@ "orig_default": null, "orig_required": false, "title": "Mistral Source (Diffusers)", - "ui_model_base": [ - "flux2" - ], - "ui_model_format": [ - "diffusers" - ], - "ui_model_type": [ - "main" - ] + "ui_model_base": ["flux2"], + "ui_model_format": ["diffusers"], + "ui_model_type": ["main"] }, "max_seq_len": { "default": 512, "description": "Max sequence length for the Mistral encoder. FLUX.2 [dev] uses 512 by default.", - "enum": [ - 256, - 512 - ], + "enum": [256, 512], "field_kind": "input", "input": "any", "orig_default": 512, @@ -27091,18 +25688,8 @@ "type": "string" } }, - "required": [ - "model", - "type", - "id" - ], - "tags": [ - "model", - "flux", - "flux2", - "dev", - "mistral" - ], + "required": ["model", "type", "id"], + "tags": ["model", "flux", "flux2", "dev", "mistral"], "title": "Main Model - FLUX.2 [dev]", "type": "object", "version": "1.0.0", @@ -27137,10 +25724,7 @@ }, "max_seq_len": { "description": "Max sequence length for the Mistral encoder.", - "enum": [ - 256, - 512 - ], + "enum": [256, 512], "field_kind": "output", "title": "Max Seq Length", "type": "integer", @@ -27154,15 +25738,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "transformer", - "mistral_encoder", - "vae", - "max_seq_len", - "type", - "type" - ], + "required": ["output_meta", "transformer", "mistral_encoder", "vae", "max_seq_len", "type", "type"], "title": "Flux2DevModelLoaderOutput", "type": "object" }, @@ -27233,10 +25809,7 @@ "max_seq_len": { "default": 512, "description": "Max sequence length for the Mistral encoder.", - "enum": [ - 256, - 512 - ], + "enum": [256, 512], "field_kind": "input", "input": "any", "orig_default": 512, @@ -27268,18 +25841,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "prompt", - "conditioning", - "flux", - "flux2", - "dev", - "mistral" - ], + "required": ["type", "id"], + "tags": ["prompt", "conditioning", "flux", "flux2", "dev", "mistral"], "title": "Prompt - FLUX.2 [dev]", "type": "object", "version": "1.0.0", @@ -27340,12 +25903,8 @@ "orig_default": null, "orig_required": false, "title": "LoRAs", - "ui_model_base": [ - "flux2" - ], - "ui_model_type": [ - "lora" - ] + "ui_model_base": ["flux2"], + "ui_model_type": ["lora"] }, "transformer": { "anyOf": [ @@ -27389,17 +25948,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "lora", - "model", - "flux", - "klein", - "flux2" - ], + "required": ["type", "id"], + "tags": ["lora", "model", "flux", "klein", "flux2"], "title": "Apply LoRA Collection - Flux2 Klein", "type": "object", "version": "1.0.1", @@ -27453,12 +26003,8 @@ "input": "any", "orig_required": true, "title": "LoRA", - "ui_model_base": [ - "flux2" - ], - "ui_model_type": [ - "lora" - ] + "ui_model_base": ["flux2"], + "ui_model_type": ["lora"] }, "weight": { "default": 0.75, @@ -27512,17 +26058,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "lora", - "model", - "flux", - "klein", - "flux2" - ], + "required": ["type", "id"], + "tags": ["lora", "model", "flux", "klein", "flux2"], "title": "Apply LoRA - Flux2 Klein", "type": "object", "version": "1.0.0", @@ -27572,13 +26109,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "transformer", - "qwen3_encoder", - "type", - "type" - ], + "required": ["output_meta", "transformer", "qwen3_encoder", "type", "type"], "title": "Flux2KleinLoRALoaderOutput", "type": "object" }, @@ -27620,12 +26151,8 @@ "input": "direct", "orig_required": true, "title": "Transformer", - "ui_model_base": [ - "flux2" - ], - "ui_model_type": [ - "main" - ] + "ui_model_base": ["flux2"], + "ui_model_type": ["main"] }, "vae_model": { "anyOf": [ @@ -27643,13 +26170,8 @@ "orig_default": null, "orig_required": false, "title": "VAE", - "ui_model_base": [ - "flux", - "flux2" - ], - "ui_model_type": [ - "vae" - ] + "ui_model_base": ["flux", "flux2"], + "ui_model_type": ["vae"] }, "qwen3_encoder_model": { "anyOf": [ @@ -27667,9 +26189,7 @@ "orig_default": null, "orig_required": false, "title": "Qwen3 Encoder", - "ui_model_type": [ - "qwen3_encoder" - ] + "ui_model_type": ["qwen3_encoder"] }, "qwen3_source_model": { "anyOf": [ @@ -27687,23 +26207,14 @@ "orig_default": null, "orig_required": false, "title": "Qwen3 Source (Diffusers)", - "ui_model_base": [ - "flux2" - ], - "ui_model_format": [ - "diffusers" - ], - "ui_model_type": [ - "main" - ] + "ui_model_base": ["flux2"], + "ui_model_format": ["diffusers"], + "ui_model_type": ["main"] }, "max_seq_len": { "default": 512, "description": "Max sequence length for the Qwen3 encoder.", - "enum": [ - 256, - 512 - ], + "enum": [256, 512], "field_kind": "input", "input": "any", "orig_default": 512, @@ -27719,17 +26230,8 @@ "type": "string" } }, - "required": [ - "model", - "type", - "id" - ], - "tags": [ - "model", - "flux", - "klein", - "qwen3" - ], + "required": ["model", "type", "id"], + "tags": ["model", "flux", "klein", "qwen3"], "title": "Main Model - Flux2 Klein", "type": "object", "version": "1.0.0", @@ -27764,10 +26266,7 @@ }, "max_seq_len": { "description": "The max sequence length for the Qwen3 encoder.", - "enum": [ - 256, - 512 - ], + "enum": [256, 512], "field_kind": "output", "title": "Max Seq Length", "type": "integer", @@ -27781,15 +26280,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "transformer", - "qwen3_encoder", - "vae", - "max_seq_len", - "type", - "type" - ], + "required": ["output_meta", "transformer", "qwen3_encoder", "vae", "max_seq_len", "type", "type"], "title": "Flux2KleinModelLoaderOutput", "type": "object" }, @@ -27860,10 +26351,7 @@ "max_seq_len": { "default": 512, "description": "Max sequence length for the Qwen3 encoder.", - "enum": [ - 256, - 512 - ], + "enum": [256, 512], "field_kind": "input", "input": "any", "orig_default": 512, @@ -27895,17 +26383,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "prompt", - "conditioning", - "flux", - "klein", - "qwen3" - ], + "required": ["type", "id"], + "tags": ["prompt", "conditioning", "flux", "klein", "qwen3"], "title": "Prompt - Flux2 Klein", "type": "object", "version": "1.1.1", @@ -28014,18 +26493,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "latents", - "image", - "vae", - "l2i", - "flux2", - "klein" - ], + "required": ["type", "id"], + "tags": ["latents", "image", "vae", "l2i", "flux2", "klein"], "title": "Latents to Image - FLUX2", "type": "object", "version": "1.0.0", @@ -28102,18 +26571,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "latents", - "image", - "vae", - "i2l", - "flux2", - "klein" - ], + "required": ["type", "id"], + "tags": ["latents", "image", "vae", "i2l", "flux2", "klein"], "title": "Image to Latents - FLUX2", "type": "object", "version": "1.0.0", @@ -28123,13 +26582,7 @@ }, "Flux2VariantType": { "type": "string", - "enum": [ - "klein_4b", - "klein_4b_base", - "klein_9b", - "klein_9b_base", - "dev" - ], + "enum": ["klein_4b", "klein_4b_base", "klein_9b", "klein_9b_base", "dev"], "title": "Flux2VariantType", "description": "FLUX.2 model variants." }, @@ -28155,12 +26608,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "collection", - "type", - "type" - ], + "required": ["output_meta", "collection", "type", "type"], "title": "FluxConditioningCollectionOutput", "type": "object" }, @@ -28185,9 +26633,7 @@ "description": "The mask associated with this conditioning tensor. Excluded regions should be set to False, included regions should be set to True." } }, - "required": [ - "conditioning_name" - ], + "required": ["conditioning_name"], "title": "FluxConditioningField", "type": "object" }, @@ -28209,12 +26655,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "conditioning", - "type", - "type" - ], + "required": ["output_meta", "conditioning", "type", "type"], "title": "FluxConditioningOutput", "type": "object" }, @@ -28264,12 +26705,8 @@ "input": "any", "orig_required": true, "title": "Control LoRA", - "ui_model_base": [ - "flux" - ], - "ui_model_type": [ - "control_lora" - ] + "ui_model_base": ["flux"], + "ui_model_type": ["control_lora"] }, "image": { "anyOf": [ @@ -28304,15 +26741,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "lora", - "model", - "flux" - ], + "required": ["type", "id"], + "tags": ["lora", "model", "flux"], "title": "Control LoRA - FLUX", "type": "object", "version": "1.1.1", @@ -28340,12 +26770,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "control_lora", - "type", - "type" - ], + "required": ["output_meta", "control_lora", "type", "type"], "title": "FluxControlLoRALoaderOutput", "type": "object" }, @@ -28394,12 +26819,7 @@ "resize_mode": { "default": "just_resize", "description": "The resize mode to use", - "enum": [ - "just_resize", - "crop_resize", - "fill_resize", - "just_resize_simple" - ], + "enum": ["just_resize", "crop_resize", "fill_resize", "just_resize_simple"], "title": "Resize Mode", "type": "string" }, @@ -28417,10 +26837,7 @@ "title": "Instantx Control Mode" } }, - "required": [ - "image", - "control_model" - ], + "required": ["image", "control_model"], "title": "FluxControlNetField", "type": "object" }, @@ -28484,12 +26901,8 @@ "field_kind": "input", "input": "any", "orig_required": true, - "ui_model_base": [ - "flux" - ], - "ui_model_type": [ - "controlnet" - ] + "ui_model_base": ["flux"], + "ui_model_type": ["controlnet"] }, "control_weight": { "anyOf": [ @@ -28540,12 +26953,7 @@ "resize_mode": { "default": "just_resize", "description": "The resize mode used", - "enum": [ - "just_resize", - "crop_resize", - "fill_resize", - "just_resize_simple" - ], + "enum": ["just_resize", "crop_resize", "fill_resize", "just_resize_simple"], "field_kind": "input", "input": "any", "orig_default": "just_resize", @@ -28578,14 +26986,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "controlnet", - "flux" - ], + "required": ["type", "id"], + "tags": ["controlnet", "flux"], "title": "FLUX ControlNet", "type": "object", "version": "1.0.0", @@ -28611,12 +27013,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "control", - "type", - "type" - ], + "required": ["output_meta", "control", "type", "type"], "title": "FluxControlNetOutput", "type": "object" }, @@ -28925,11 +27322,7 @@ "scheduler": { "default": "euler", "description": "Scheduler (sampler) for the denoising process. 'euler' is fast and standard. 'heun' is 2nd-order (better quality, 2x slower). 'lcm' is optimized for few steps.", - "enum": [ - "euler", - "heun", - "lcm" - ], + "enum": ["euler", "heun", "lcm"], "field_kind": "input", "input": "any", "orig_default": "euler", @@ -29050,13 +27443,7 @@ "dype_preset": { "default": "off", "description": "DyPE preset for high-resolution generation. 'auto' enables automatically for resolutions > 1536px. 'area' enables automatically based on image area. '4k' uses optimized settings for 4K output.", - "enum": [ - "off", - "manual", - "auto", - "area", - "4k" - ], + "enum": ["off", "manual", "auto", "area", "4k"], "field_kind": "input", "input": "any", "orig_default": "off", @@ -29120,14 +27507,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "flux" - ], + "required": ["type", "id"], + "tags": ["image", "flux"], "title": "FLUX Denoise", "type": "object", "version": "4.6.0", @@ -29456,11 +27837,7 @@ "scheduler": { "default": "euler", "description": "Scheduler (sampler) for the denoising process. 'euler' is fast and standard. 'heun' is 2nd-order (better quality, 2x slower). 'lcm' is optimized for few steps.", - "enum": [ - "euler", - "heun", - "lcm" - ], + "enum": ["euler", "heun", "lcm"], "field_kind": "input", "input": "any", "orig_default": "euler", @@ -29581,13 +27958,7 @@ "dype_preset": { "default": "off", "description": "DyPE preset for high-resolution generation. 'auto' enables automatically for resolutions > 1536px. 'area' enables automatically based on image area. '4k' uses optimized settings for 4K output.", - "enum": [ - "off", - "manual", - "auto", - "area", - "4k" - ], + "enum": ["off", "manual", "auto", "area", "4k"], "field_kind": "input", "input": "any", "orig_default": "off", @@ -29651,21 +28022,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "flux", - "latents", - "denoise", - "txt2img", - "t2i", - "t2l", - "img2img", - "i2i", - "l2l" - ], + "required": ["type", "id"], + "tags": ["flux", "latents", "denoise", "txt2img", "t2i", "t2l", "img2img", "i2i", "l2l"], "title": "FLUX Denoise + Metadata", "type": "object", "version": "1.0.1", @@ -29685,10 +28043,7 @@ "description": "The FLUX Fill inpaint mask." } }, - "required": [ - "image", - "mask" - ], + "required": ["image", "mask"], "title": "FluxFillConditioningField", "type": "object" }, @@ -29761,13 +28116,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "inpaint" - ], + "required": ["type", "id"], + "tags": ["inpaint"], "title": "FLUX Fill Conditioning", "type": "object", "version": "1.0.0", @@ -29794,12 +28144,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "fill_cond", - "type", - "type" - ], + "required": ["output_meta", "fill_cond", "type", "type"], "title": "FluxFillOutput", "type": "object" }, @@ -29864,12 +28209,8 @@ "input": "any", "orig_required": true, "title": "IP-Adapter Model", - "ui_model_base": [ - "flux" - ], - "ui_model_type": [ - "ip_adapter" - ] + "ui_model_base": ["flux"], + "ui_model_type": ["ip_adapter"] }, "clip_vision_model": { "const": "ViT-L", @@ -29934,14 +28275,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "ip_adapter", - "control" - ], + "required": ["type", "id"], + "tags": ["ip_adapter", "control"], "title": "FLUX IP-Adapter", "type": "object", "version": "1.0.0", @@ -30051,16 +28386,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "concatenate", - "flux", - "kontext" - ], + "required": ["type", "id"], + "tags": ["image", "concatenate", "flux", "kontext"], "title": "FLUX Kontext Image Prep", "type": "object", "version": "1.0.0", @@ -30076,9 +28403,7 @@ "description": "The Kontext reference image." } }, - "required": [ - "image" - ], + "required": ["image"], "title": "FluxKontextConditioningField", "type": "object" }, @@ -30136,15 +28461,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "conditioning", - "kontext", - "flux" - ], + "required": ["type", "id"], + "tags": ["conditioning", "kontext", "flux"], "title": "Kontext Conditioning - FLUX", "type": "object", "version": "1.0.0", @@ -30171,12 +28489,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "kontext_cond", - "type", - "type" - ], + "required": ["output_meta", "kontext_cond", "type", "type"], "title": "FluxKontextOutput", "type": "object" }, @@ -30226,12 +28539,8 @@ "input": "any", "orig_required": true, "title": "LoRA", - "ui_model_base": [ - "flux" - ], - "ui_model_type": [ - "lora" - ] + "ui_model_base": ["flux"], + "ui_model_type": ["lora"] }, "weight": { "default": 0.75, @@ -30302,15 +28611,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "lora", - "model", - "flux" - ], + "required": ["type", "id"], + "tags": ["lora", "model", "flux"], "title": "Apply LoRA - FLUX", "type": "object", "version": "1.2.1", @@ -30375,14 +28677,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "transformer", - "clip", - "t5_encoder", - "type", - "type" - ], + "required": ["output_meta", "transformer", "clip", "t5_encoder", "type", "type"], "title": "FluxLoRALoaderOutput", "type": "object" }, @@ -30431,12 +28726,8 @@ "field_kind": "input", "input": "any", "orig_required": true, - "ui_model_base": [ - "flux" - ], - "ui_model_type": [ - "main" - ] + "ui_model_base": ["flux"], + "ui_model_type": ["main"] }, "t5_encoder_model": { "anyOf": [ @@ -30453,9 +28744,7 @@ "input": "any", "orig_required": true, "title": "T5 Encoder", - "ui_model_type": [ - "t5_encoder" - ] + "ui_model_type": ["t5_encoder"] }, "clip_embed_model": { "anyOf": [ @@ -30472,9 +28761,7 @@ "input": "any", "orig_required": true, "title": "CLIP Embed", - "ui_model_type": [ - "clip_embed" - ] + "ui_model_type": ["clip_embed"] }, "vae_model": { "anyOf": [ @@ -30491,12 +28778,8 @@ "input": "any", "orig_required": true, "title": "VAE", - "ui_model_base": [ - "flux" - ], - "ui_model_type": [ - "vae" - ] + "ui_model_base": ["flux"], + "ui_model_type": ["vae"] }, "type": { "const": "flux_model_loader", @@ -30506,14 +28789,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "model", - "flux" - ], + "required": ["type", "id"], + "tags": ["model", "flux"], "title": "Main Model - FLUX", "type": "object", "version": "1.0.7", @@ -30555,10 +28832,7 @@ }, "max_seq_len": { "description": "The max sequence length to used for the T5 encoder. (256 for schnell transformer, 512 for dev transformer)", - "enum": [ - 256, - 512 - ], + "enum": [256, 512], "field_kind": "output", "title": "Max Seq Length", "type": "integer", @@ -30572,16 +28846,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "transformer", - "clip", - "t5_encoder", - "vae", - "max_seq_len", - "type", - "type" - ], + "required": ["output_meta", "transformer", "clip", "t5_encoder", "vae", "max_seq_len", "type", "type"], "title": "FluxModelLoaderOutput", "type": "object" }, @@ -30605,9 +28870,7 @@ "description": "The mask associated with this conditioning tensor. Excluded regions should be set to False, included regions should be set to True." } }, - "required": [ - "conditioning" - ], + "required": ["conditioning"], "title": "FluxReduxConditioningField", "type": "object" }, @@ -30688,12 +28951,8 @@ "input": "any", "orig_required": true, "title": "FLUX Redux Model", - "ui_model_base": [ - "flux" - ], - "ui_model_type": [ - "flux_redux" - ] + "ui_model_base": ["flux"], + "ui_model_type": ["flux_redux"] }, "downsampling_factor": { "default": 1, @@ -30710,13 +28969,7 @@ "downsampling_function": { "default": "area", "description": "Redux Downsampling Function", - "enum": [ - "nearest", - "bilinear", - "bicubic", - "area", - "nearest-exact" - ], + "enum": ["nearest", "bilinear", "bicubic", "area", "nearest-exact"], "field_kind": "input", "input": "any", "orig_default": "area", @@ -30744,14 +28997,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "ip_adapter", - "control" - ], + "required": ["type", "id"], + "tags": ["ip_adapter", "control"], "title": "FLUX Redux", "type": "object", "version": "2.1.0", @@ -30778,12 +29025,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "redux_cond", - "type", - "type" - ], + "required": ["output_meta", "redux_cond", "type", "type"], "title": "FluxReduxOutput", "type": "object" }, @@ -30853,10 +29095,7 @@ "t5_max_seq_len": { "anyOf": [ { - "enum": [ - 256, - 512 - ], + "enum": [256, 512], "type": "integer" }, { @@ -30911,15 +29150,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "prompt", - "conditioning", - "flux" - ], + "required": ["type", "id"], + "tags": ["prompt", "conditioning", "flux"], "title": "Prompt - FLUX", "type": "object", "version": "1.1.2", @@ -31028,17 +29260,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "latents", - "image", - "vae", - "l2i", - "flux" - ], + "required": ["type", "id"], + "tags": ["latents", "image", "vae", "l2i", "flux"], "title": "Latents to Image - FLUX", "type": "object", "version": "1.0.2", @@ -31115,17 +29338,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "latents", - "image", - "vae", - "i2l", - "flux" - ], + "required": ["type", "id"], + "tags": ["latents", "image", "vae", "i2l", "flux"], "title": "Image to Latents - FLUX", "type": "object", "version": "1.0.1", @@ -31135,11 +29349,7 @@ }, "FluxVariantType": { "type": "string", - "enum": [ - "schnell", - "dev", - "dev_fill" - ], + "enum": ["schnell", "dev", "dev_fill"], "title": "FluxVariantType", "description": "FLUX.1 model variants." }, @@ -31157,10 +29367,7 @@ } }, "type": "object", - "required": [ - "path", - "is_installed" - ], + "required": ["path", "is_installed"], "title": "FoundModel" }, "FreeUConfig": { @@ -31195,12 +29402,7 @@ "type": "number" } }, - "required": [ - "s1", - "s2", - "b1", - "b2" - ], + "required": ["s1", "s2", "b1", "b2"], "title": "FreeUConfig", "type": "object" }, @@ -31307,13 +29509,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "freeu" - ], + "required": ["type", "id"], + "tags": ["freeu"], "title": "Apply FreeU - SD1.5, SDXL", "type": "object", "version": "1.0.2", @@ -31398,27 +29595,15 @@ "field_kind": "input", "input": "any", "orig_required": true, - "ui_model_base": [ - "external" - ], - "ui_model_format": [ - "external_api" - ], - "ui_model_provider_id": [ - "gemini" - ], - "ui_model_type": [ - "external_image_generator" - ] + "ui_model_base": ["external"], + "ui_model_format": ["external_api"], + "ui_model_provider_id": ["gemini"], + "ui_model_type": ["external_image_generator"] }, "mode": { "default": "txt2img", "description": "Generation mode.", - "enum": [ - "txt2img", - "img2img", - "inpaint" - ], + "enum": ["txt2img", "img2img", "inpaint"], "field_kind": "input", "input": "any", "orig_default": "txt2img", @@ -31579,10 +29764,7 @@ "thinking_level": { "anyOf": [ { - "enum": [ - "minimal", - "high" - ], + "enum": ["minimal", "high"], "type": "string" }, { @@ -31605,15 +29787,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "external", - "generation", - "gemini" - ], + "required": ["type", "id"], + "tags": ["external", "generation", "gemini"], "title": "Gemini Image Generation", "type": "object", "version": "1.0.0", @@ -31630,9 +29805,7 @@ } }, "type": "object", - "required": [ - "password" - ], + "required": ["password"], "title": "GeneratePasswordResponse", "description": "Response containing a generated password." }, @@ -31719,13 +29892,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "mask" - ], + "required": ["type", "id"], + "tags": ["mask"], "title": "Get Image Mask Bounding Box", "type": "object", "version": "1.0.0", @@ -31744,10 +29912,7 @@ "description": "Info to load text_encoder submodel" } }, - "required": [ - "tokenizer", - "text_encoder" - ], + "required": ["tokenizer", "text_encoder"], "title": "GlmEncoderField", "type": "object" }, @@ -31775,13 +29940,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "denoise_mask", - "expanded_mask_area", - "type", - "type" - ], + "required": ["output_meta", "denoise_mask", "expanded_mask_area", "type", "type"], "title": "GradientMaskOutput", "type": "object" }, @@ -33097,10 +31256,7 @@ "model": { "anyOf": [ { - "enum": [ - "grounding-dino-tiny", - "grounding-dino-base" - ], + "enum": ["grounding-dino-tiny", "grounding-dino-base"], "type": "string" }, { @@ -33165,14 +31321,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "prompt", - "object detection" - ], + "required": ["type", "id"], + "tags": ["prompt", "object detection"], "title": "Grounding DINO (Text Prompt Object Detection)", "type": "object", "version": "1.0.0", @@ -33276,15 +31426,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "controlnet", - "hed", - "softedge" - ], + "required": ["type", "id"], + "tags": ["controlnet", "hed", "softedge"], "title": "HED Edge Detection", "type": "object", "version": "1.0.0", @@ -33340,19 +31483,13 @@ } }, "type": "object", - "required": [ - "repo_id" - ], + "required": ["repo_id"], "title": "HFModelSource", "description": "A HuggingFace repo_id with optional variant, sub-folder(s) and access token.\nNote that the variant option, if not provided to the constructor, will default to fp16, which is\nwhat people (almost) always want.\n\nThe subfolder can be a single path or multiple paths joined by '+' (e.g., \"text_encoder+tokenizer\").\nWhen multiple subfolders are specified, all of them will be downloaded and combined into the model directory." }, "HFTokenStatus": { "type": "string", - "enum": [ - "valid", - "invalid", - "unknown" - ], + "enum": ["valid", "invalid", "unknown"], "title": "HFTokenStatus" }, "HTTPValidationError": { @@ -33444,13 +31581,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image, controlnet" - ], + "required": ["type", "id"], + "tags": ["image, controlnet"], "title": "Heuristic Resize", "type": "object", "version": "1.1.1", @@ -33521,10 +31653,7 @@ } }, "type": "object", - "required": [ - "name", - "id" - ], + "required": ["name", "id"], "title": "HuggingFaceMetadata", "description": "Extended metadata fields provided by HuggingFace." }, @@ -33554,10 +31683,7 @@ } }, "type": "object", - "required": [ - "urls", - "is_diffusers" - ], + "required": ["urls", "is_diffusers"], "title": "HuggingFaceModels" }, "IPAdapterField": { @@ -33645,11 +31771,7 @@ "description": "The bool mask associated with this IP-Adapter. Excluded regions should be set to False, included regions should be set to True." } }, - "required": [ - "image", - "ip_adapter_model", - "image_encoder_model" - ], + "required": ["image", "ip_adapter_model", "image_encoder_model"], "title": "IPAdapterField", "type": "object" }, @@ -33722,23 +31844,14 @@ "input": "any", "orig_required": true, "title": "IP-Adapter Model", - "ui_model_base": [ - "sd-1", - "sdxl" - ], - "ui_model_type": [ - "ip_adapter" - ], + "ui_model_base": ["sd-1", "sdxl"], + "ui_model_type": ["ip_adapter"], "ui_order": -1 }, "clip_vision_model": { "default": "ViT-H", "description": "CLIP Vision model to use. Overrides model settings. Mandatory for checkpoint models.", - "enum": [ - "ViT-H", - "ViT-G", - "ViT-L" - ], + "enum": ["ViT-H", "ViT-G", "ViT-L"], "field_kind": "input", "input": "any", "orig_default": "ViT-H", @@ -33770,13 +31883,7 @@ "method": { "default": "full", "description": "The method to apply the IP-Adapter", - "enum": [ - "full", - "style", - "composition", - "style_strong", - "style_precise" - ], + "enum": ["full", "style", "composition", "style_strong", "style_precise"], "field_kind": "input", "input": "any", "orig_default": "full", @@ -33832,14 +31939,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "ip_adapter", - "control" - ], + "required": ["type", "id"], + "tags": ["ip_adapter", "control"], "title": "IP-Adapter - SD1.5, SDXL", "type": "object", "version": "1.5.1", @@ -33860,23 +31961,13 @@ }, "clip_vision_model": { "description": "The CLIP Vision model", - "enum": [ - "ViT-L", - "ViT-H", - "ViT-G" - ], + "enum": ["ViT-L", "ViT-H", "ViT-G"], "title": "Clip Vision Model", "type": "string" }, "method": { "description": "Method to apply IP Weights with", - "enum": [ - "full", - "style", - "composition", - "style_strong", - "style_precise" - ], + "enum": ["full", "style", "composition", "style_strong", "style_precise"], "title": "Method", "type": "string" }, @@ -33936,12 +32027,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "ip_adapter", - "type", - "type" - ], + "required": ["output_meta", "ip_adapter", "type", "type"], "title": "IPAdapterOutput", "type": "object" }, @@ -34004,11 +32090,7 @@ "anyOf": [ { "type": "string", - "enum": [ - "full", - "style", - "composition" - ] + "enum": ["full", "style", "composition"] }, { "type": "null" @@ -34021,13 +32103,7 @@ "anyOf": [ { "type": "string", - "enum": [ - "lowest", - "low", - "medium", - "high", - "highest" - ] + "enum": ["lowest", "low", "medium", "high", "highest"] }, { "type": "null" @@ -34038,9 +32114,7 @@ } }, "type": "object", - "required": [ - "model_name" - ], + "required": ["model_name"], "title": "IPAdapterRecallParameter", "description": "IP Adapter configuration for recall" }, @@ -34997,15 +33071,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "latents", - "math", - "ideal_size" - ], + "required": ["type", "id"], + "tags": ["latents", "math", "ideal_size"], "title": "Ideal Size - SD1.5, SDXL", "type": "object", "version": "1.0.6", @@ -35039,13 +33106,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "width", - "height", - "type", - "type" - ], + "required": ["output_meta", "width", "height", "type", "type"], "title": "IdealSizeOutput", "type": "object" }, @@ -35130,14 +33191,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "logic", - "conditional" - ], + "required": ["type", "id"], + "tags": ["logic", "conditional"], "title": "If", "type": "object", "version": "1.0.0", @@ -35170,12 +33225,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "value", - "type", - "type" - ], + "required": ["output_meta", "value", "type", "type"], "title": "IfInvocationOutput", "type": "object" }, @@ -35213,14 +33263,7 @@ "batch_group_id": { "default": "None", "description": "The ID of this batch node's group. If provided, all batch nodes in with the same ID will be 'zipped' before execution, and all nodes' collections must be of the same size.", - "enum": [ - "None", - "Group 1", - "Group 2", - "Group 3", - "Group 4", - "Group 5" - ], + "enum": ["None", "Group 1", "Group 2", "Group 3", "Group 4", "Group 5"], "field_kind": "input", "input": "direct", "orig_default": "None", @@ -35256,16 +33299,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "primitives", - "image", - "batch", - "special" - ], + "required": ["type", "id"], + "tags": ["primitives", "image", "batch", "special"], "title": "Image Batch", "type": "object", "version": "1.0.0", @@ -35365,10 +33400,7 @@ "blur_type": { "default": "gaussian", "description": "The type of blur", - "enum": [ - "gaussian", - "box" - ], + "enum": ["gaussian", "box"], "field_kind": "input", "input": "any", "orig_default": "gaussian", @@ -35384,14 +33416,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "blur" - ], + "required": ["type", "id"], + "tags": ["image", "blur"], "title": "Blur Image", "type": "object", "version": "1.2.2", @@ -35401,13 +33427,7 @@ }, "ImageCategory": { "type": "string", - "enum": [ - "general", - "mask", - "control", - "user", - "other" - ], + "enum": ["general", "mask", "control", "user", "other"], "title": "ImageCategory", "description": "The category of an image.\n\n- GENERAL: The image is an output, init image, or otherwise an image without a specialized purpose.\n- MASK: The image is a mask image.\n- CONTROL: The image is a ControlNet control image.\n- USER: The image is a user-provide image.\n- OTHER: The image is some other type of image with a specialized purpose. To be used by external nodes." }, @@ -35492,12 +33512,7 @@ "channel": { "default": "A", "description": "The channel to get", - "enum": [ - "A", - "R", - "G", - "B" - ], + "enum": ["A", "R", "G", "B"], "field_kind": "input", "input": "any", "orig_default": "A", @@ -35513,14 +33528,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "channel" - ], + "required": ["type", "id"], + "tags": ["image", "channel"], "title": "Extract Image Channel", "type": "object", "version": "1.2.2", @@ -35670,10 +33679,7 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], + "required": ["type", "id"], "tags": [ "image", "invert", @@ -35832,10 +33838,7 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], + "required": ["type", "id"], "tags": [ "image", "offset", @@ -35940,15 +33943,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "primitives", - "image", - "collection" - ], + "required": ["type", "id"], + "tags": ["primitives", "image", "collection"], "title": "Image Collection Primitive", "type": "object", "version": "1.0.2", @@ -35978,12 +33974,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "collection", - "type", - "type" - ], + "required": ["output_meta", "collection", "type", "type"], "title": "ImageCollectionOutput", "type": "object" }, @@ -36068,17 +34059,7 @@ "mode": { "default": "L", "description": "The mode to convert to", - "enum": [ - "L", - "RGB", - "RGBA", - "CMYK", - "YCbCr", - "LAB", - "HSV", - "I", - "F" - ], + "enum": ["L", "RGB", "RGBA", "CMYK", "YCbCr", "LAB", "HSV", "I", "F"], "field_kind": "input", "input": "any", "orig_default": "L", @@ -36094,14 +34075,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "convert" - ], + "required": ["type", "id"], + "tags": ["image", "convert"], "title": "Convert Image Mode", "type": "object", "version": "1.2.2", @@ -36237,14 +34212,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "crop" - ], + "required": ["type", "id"], + "tags": ["image", "crop"], "title": "Crop Image", "type": "object", "version": "1.2.2", @@ -36414,9 +34383,7 @@ } }, "type": "object", - "required": [ - "image_name" - ], + "required": ["image_name"], "title": "ImageField", "description": "An image primitive field" }, @@ -36467,18 +34434,8 @@ "type": "string" } }, - "required": [ - "generator", - "type", - "id" - ], - "tags": [ - "primitives", - "board", - "image", - "batch", - "special" - ], + "required": ["generator", "type", "id"], + "tags": ["primitives", "board", "image", "batch", "special"], "title": "Image Generator", "type": "object", "version": "1.0.0", @@ -36513,12 +34470,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "images", - "type", - "type" - ], + "required": ["output_meta", "images", "type", "type"], "title": "ImageGeneratorOutput", "type": "object" }, @@ -36618,14 +34570,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "hue" - ], + "required": ["type", "id"], + "tags": ["image", "hue"], "title": "Adjust Image Hue", "type": "object", "version": "1.2.2", @@ -36743,14 +34689,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "ilerp" - ], + "required": ["type", "id"], + "tags": ["image", "ilerp"], "title": "Inverse Lerp Image", "type": "object", "version": "1.2.2", @@ -36812,14 +34752,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "primitives", - "image" - ], + "required": ["type", "id"], + "tags": ["primitives", "image"], "title": "Image Primitive", "type": "object", "version": "1.0.2", @@ -36937,14 +34871,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "lerp" - ], + "required": ["type", "id"], + "tags": ["image", "lerp"], "title": "Lerp Image", "type": "object", "version": "1.2.2", @@ -37044,13 +34972,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "conditioning" - ], + "required": ["type", "id"], + "tags": ["conditioning"], "title": "Image Mask to Tensor", "type": "object", "version": "1.0.0", @@ -37067,13 +34990,7 @@ }, "state": { "type": "string", - "enum": [ - "planned", - "moving", - "moved", - "committed", - "error" - ], + "enum": ["planned", "moving", "moved", "committed", "error"], "title": "State", "description": "The image move job state." }, @@ -37091,10 +35008,7 @@ } }, "type": "object", - "required": [ - "id", - "state" - ], + "required": ["id", "state"], "title": "ImageMoveJobResponse" }, "ImageMoveStatusResponse": { @@ -37108,10 +35022,7 @@ "anyOf": [ { "type": "string", - "enum": [ - "move_all", - "recovery" - ] + "enum": ["move_all", "recovery"] }, { "type": "null" @@ -37162,10 +35073,7 @@ } }, "type": "object", - "required": [ - "is_running", - "needs_move_count" - ], + "required": ["is_running", "needs_move_count"], "title": "ImageMoveStatusResponse" }, "ImageMultiplyInvocation": { @@ -37269,14 +35177,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "multiply" - ], + "required": ["type", "id"], + "tags": ["image", "multiply"], "title": "Multiply Images", "type": "object", "version": "1.2.2", @@ -37370,14 +35272,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "nsfw" - ], + "required": ["type", "id"], + "tags": ["image", "nsfw"], "title": "Blur NSFW Image", "type": "object", "version": "1.2.3", @@ -37407,11 +35303,7 @@ } }, "type": "object", - "required": [ - "image_names", - "starred_count", - "total_count" - ], + "required": ["image_names", "starred_count", "total_count"], "title": "ImageNamesResult", "description": "Response containing ordered image names with metadata for optimistic updates." }, @@ -37524,10 +35416,7 @@ "noise_type": { "default": "gaussian", "description": "The type of noise to add", - "enum": [ - "gaussian", - "salt_and_pepper" - ], + "enum": ["gaussian", "salt_and_pepper"], "field_kind": "input", "input": "any", "orig_default": "gaussian", @@ -37576,14 +35465,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "noise" - ], + "required": ["type", "id"], + "tags": ["image", "noise"], "title": "Add Image Noise", "type": "object", "version": "1.1.0", @@ -37623,14 +35506,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "image", - "width", - "height", - "type", - "type" - ], + "required": ["output_meta", "image", "width", "height", "type", "type"], "title": "ImageOutput", "type": "object" }, @@ -37673,15 +35549,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "x_left", - "y_top", - "width", - "height", - "type", - "type" - ], + "required": ["output_meta", "x_left", "y_top", "width", "height", "type", "type"], "title": "ImagePanelCoordinateOutput", "type": "object" }, @@ -37800,15 +35668,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "panel", - "layout" - ], + "required": ["type", "id"], + "tags": ["image", "panel", "layout"], "title": "Image Panel Layout", "type": "object", "version": "1.0.0", @@ -37963,14 +35824,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "paste" - ], + "required": ["type", "id"], + "tags": ["image", "paste"], "title": "Paste Image", "type": "object", "version": "1.2.2", @@ -38136,14 +35991,7 @@ "resample_mode": { "default": "bicubic", "description": "The resampling mode", - "enum": [ - "nearest", - "box", - "bilinear", - "hamming", - "bicubic", - "lanczos" - ], + "enum": ["nearest", "box", "bilinear", "hamming", "bicubic", "lanczos"], "field_kind": "input", "input": "any", "orig_default": "bicubic", @@ -38159,14 +36007,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "resize" - ], + "required": ["type", "id"], + "tags": ["image", "resize"], "title": "Resize Image", "type": "object", "version": "1.2.2", @@ -38266,14 +36108,7 @@ "resample_mode": { "default": "bicubic", "description": "The resampling mode", - "enum": [ - "nearest", - "box", - "bilinear", - "hamming", - "bicubic", - "lanczos" - ], + "enum": ["nearest", "box", "bilinear", "hamming", "bicubic", "lanczos"], "field_kind": "input", "input": "any", "orig_default": "bicubic", @@ -38289,14 +36124,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "scale" - ], + "required": ["type", "id"], + "tags": ["image", "scale"], "title": "Scale Image", "type": "object", "version": "1.2.2", @@ -38399,10 +36228,7 @@ "color_compensation": { "default": "None", "description": "Apply VAE scaling compensation when encoding images (reduces color drift).", - "enum": [ - "None", - "SDXL" - ], + "enum": ["None", "SDXL"], "field_kind": "input", "input": "any", "orig_default": "None", @@ -38418,16 +36244,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "latents", - "image", - "vae", - "i2l" - ], + "required": ["type", "id"], + "tags": ["latents", "image", "vae", "i2l"], "title": "Image to Latents - SD1.5, SDXL", "type": "object", "version": "1.2.0", @@ -38452,10 +36270,7 @@ } }, "type": "object", - "required": [ - "image_name", - "model_key" - ], + "required": ["image_name", "model_key"], "title": "ImageToPromptRequest" }, "ImageToPromptResponse": { @@ -38477,9 +36292,7 @@ } }, "type": "object", - "required": [ - "prompt" - ], + "required": ["prompt"], "title": "ImageToPromptResponse" }, "ImageUploadEntry": { @@ -38495,10 +36308,7 @@ } }, "type": "object", - "required": [ - "image_dto", - "presigned_url" - ], + "required": ["image_dto", "presigned_url"], "title": "ImageUploadEntry" }, "ImageUrlsDTO": { @@ -38520,11 +36330,7 @@ } }, "type": "object", - "required": [ - "image_name", - "image_url", - "thumbnail_url" - ], + "required": ["image_name", "image_url", "thumbnail_url"], "title": "ImageUrlsDTO", "description": "The URLs for an image and its thumbnail." }, @@ -38624,14 +36430,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "watermark" - ], + "required": ["type", "id"], + "tags": ["image", "watermark"], "title": "Add Invisible Watermark", "type": "object", "version": "1.2.2", @@ -38774,14 +36574,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "inpaint" - ], + "required": ["type", "id"], + "tags": ["image", "inpaint"], "title": "Solid Color Infill", "type": "object", "version": "1.2.2", @@ -38881,14 +36675,7 @@ "resample_mode": { "default": "bicubic", "description": "The resampling mode", - "enum": [ - "nearest", - "box", - "bilinear", - "hamming", - "bicubic", - "lanczos" - ], + "enum": ["nearest", "box", "bilinear", "hamming", "bicubic", "lanczos"], "field_kind": "input", "input": "any", "orig_default": "bicubic", @@ -38904,14 +36691,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "inpaint" - ], + "required": ["type", "id"], + "tags": ["image", "inpaint"], "title": "PatchMatch Infill", "type": "object", "version": "1.2.2", @@ -39028,14 +36809,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "inpaint" - ], + "required": ["type", "id"], + "tags": ["image", "inpaint"], "title": "Tile Infill", "type": "object", "version": "1.2.3", @@ -39045,11 +36820,7 @@ }, "Input": { "description": "The type of input a field accepts.\n- `Input.Direct`: The field must have its value provided directly, when the invocation and field are instantiated.\n- `Input.Connection`: The field must have its value provided by a connection.\n- `Input.Any`: The field may have its value provided either directly or by a connection.", - "enum": [ - "connection", - "direct", - "any" - ], + "enum": ["connection", "direct", "any"], "title": "Input", "type": "string" }, @@ -39253,9 +37024,7 @@ } }, "type": "object", - "required": [ - "source" - ], + "required": ["source"], "title": "InstallNodePackRequest", "description": "Request to install a node pack from a git URL." }, @@ -39302,26 +37071,13 @@ } }, "type": "object", - "required": [ - "name", - "success", - "message" - ], + "required": ["name", "success", "message"], "title": "InstallNodePackResponse", "description": "Response after installing a node pack." }, "InstallStatus": { "type": "string", - "enum": [ - "waiting", - "downloading", - "downloads_done", - "running", - "paused", - "completed", - "error", - "cancelled" - ], + "enum": ["waiting", "downloading", "downloads_done", "running", "paused", "completed", "error", "cancelled"], "title": "InstallStatus", "description": "State of an install job running in the background." }, @@ -39359,14 +37115,7 @@ "batch_group_id": { "default": "None", "description": "The ID of this batch node's group. If provided, all batch nodes in with the same ID will be 'zipped' before execution, and all nodes' collections must be of the same size.", - "enum": [ - "None", - "Group 1", - "Group 2", - "Group 3", - "Group 4", - "Group 5" - ], + "enum": ["None", "Group 1", "Group 2", "Group 3", "Group 4", "Group 5"], "field_kind": "input", "input": "direct", "orig_default": "None", @@ -39402,17 +37151,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "primitives", - "integer", - "number", - "batch", - "special" - ], + "required": ["type", "id"], + "tags": ["primitives", "integer", "number", "batch", "special"], "title": "Integer Batch", "type": "object", "version": "1.0.0", @@ -39472,15 +37212,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "primitives", - "integer", - "collection" - ], + "required": ["type", "id"], + "tags": ["primitives", "integer", "collection"], "title": "Integer Collection Primitive", "type": "object", "version": "1.0.2", @@ -39510,12 +37243,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "collection", - "type", - "type" - ], + "required": ["output_meta", "collection", "type", "type"], "title": "IntegerCollectionOutput", "type": "object" }, @@ -39566,18 +37294,8 @@ "type": "string" } }, - "required": [ - "generator", - "type", - "id" - ], - "tags": [ - "primitives", - "int", - "number", - "batch", - "special" - ], + "required": ["generator", "type", "id"], + "tags": ["primitives", "int", "number", "batch", "special"], "title": "Integer Generator", "type": "object", "version": "1.0.0", @@ -39611,12 +37329,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "integers", - "type", - "type" - ], + "required": ["output_meta", "integers", "type", "type"], "title": "IntegerGeneratorOutput", "type": "object" }, @@ -39669,14 +37382,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "primitives", - "integer" - ], + "required": ["type", "id"], + "tags": ["primitives", "integer"], "title": "Integer Primitive", "type": "object", "version": "1.0.1", @@ -39718,17 +37425,7 @@ "operation": { "default": "ADD", "description": "The operation to perform", - "enum": [ - "ADD", - "SUB", - "MUL", - "DIV", - "EXP", - "MOD", - "ABS", - "MIN", - "MAX" - ], + "enum": ["ADD", "SUB", "MUL", "DIV", "EXP", "MOD", "ABS", "MIN", "MAX"], "field_kind": "input", "input": "any", "orig_default": "ADD", @@ -39775,10 +37472,7 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], + "required": ["type", "id"], "tags": [ "math", "integer", @@ -39818,12 +37512,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "value", - "type", - "type" - ], + "required": ["output_meta", "value", "type", "type"], "title": "IntegerOutput", "type": "object" }, @@ -39881,13 +37570,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "conditioning" - ], + "required": ["type", "id"], + "tags": ["conditioning"], "title": "Invert Tensor Mask", "type": "object", "version": "1.1.0", @@ -39924,13 +37608,7 @@ } }, "type": "object", - "required": [ - "size", - "hits", - "misses", - "enabled", - "max_size" - ], + "required": ["size", "hits", "misses", "enabled", "max_size"], "title": "InvocationCacheStatus" }, "InvocationCompleteEvent": { @@ -44915,9 +42593,7 @@ "type": "array", "title": "Allow Methods", "description": "Methods allowed for CORS.", - "default": [ - "*" - ] + "default": ["*"] }, "allow_headers": { "items": { @@ -44926,9 +42602,7 @@ "type": "array", "title": "Allow Headers", "description": "Headers allowed for CORS.", - "default": [ - "*" - ] + "default": ["*"] }, "ssl_certfile": { "anyOf": [ @@ -45030,12 +42704,7 @@ }, "image_subfolder_strategy": { "type": "string", - "enum": [ - "flat", - "date", - "type", - "hash" - ], + "enum": ["flat", "date", "type", "hash"], "title": "Image Subfolder Strategy", "description": "Strategy for organizing images into subfolders. 'flat' stores all images in a single folder. 'date' organizes by YYYY/MM/DD. 'type' organizes by image category. 'hash' uses first 2 characters of UUID for filesystem performance.", "default": "flat" @@ -45068,31 +42737,18 @@ "type": "array", "title": "Log Handlers", "description": "Log handler. Valid options are \"console\", \"file=\", \"syslog=path|address:host:port\", \"http=\".", - "default": [ - "console" - ] + "default": ["console"] }, "log_format": { "type": "string", - "enum": [ - "plain", - "color", - "syslog", - "legacy" - ], + "enum": ["plain", "color", "syslog", "legacy"], "title": "Log Format", "description": "Log format. Use \"plain\" for text-only, \"color\" for colorized output, \"legacy\" for 2.3-style logging and \"syslog\" for syslog-style.", "default": "color" }, "log_level": { "type": "string", - "enum": [ - "debug", - "info", - "warning", - "error", - "critical" - ], + "enum": ["debug", "info", "warning", "error", "critical"], "title": "Log Level", "description": "Emit logging messages at this level or higher.", "default": "info" @@ -45105,13 +42761,7 @@ }, "log_level_network": { "type": "string", - "enum": [ - "debug", - "info", - "warning", - "error", - "critical" - ], + "enum": ["debug", "info", "warning", "error", "critical"], "title": "Log Level Network", "description": "Log level for network-related messages. 'info' and 'debug' are very verbose.", "default": "warning" @@ -45263,12 +42913,7 @@ }, "precision": { "type": "string", - "enum": [ - "auto", - "float16", - "bfloat16", - "float32" - ], + "enum": ["auto", "float16", "bfloat16", "float32"], "title": "Precision", "description": "Floating point precision. `float16` will consume half the memory of `float32` but produce slightly lower-quality images. The `auto` setting will guess the proper precision based on your video card and operating system.", "default": "auto" @@ -45281,31 +42926,13 @@ }, "attention_type": { "type": "string", - "enum": [ - "auto", - "normal", - "xformers", - "sliced", - "torch-sdp" - ], + "enum": ["auto", "normal", "xformers", "sliced", "torch-sdp"], "title": "Attention Type", "description": "Attention type.", "default": "auto" }, "attention_slice_size": { - "enum": [ - "auto", - "balanced", - "max", - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8 - ], + "enum": ["auto", "balanced", "max", 1, 2, 3, 4, 5, 6, 7, 8], "title": "Attention Slice Size", "description": "Slice size, valid when attention_type==\"sliced\".", "default": "auto" @@ -45331,10 +42958,7 @@ }, "session_queue_mode": { "type": "string", - "enum": [ - "FIFO", - "round_robin" - ], + "enum": ["FIFO", "round_robin"], "title": "Session Queue Mode", "description": "Session queue mode. Use 'FIFO' for traditional first-in-first-out, or 'round_robin' to serve each user's jobs in turn. In single-user mode, FIFO is always used regardless of this setting.", "default": "round_robin" @@ -45583,10 +43207,7 @@ } }, "type": "object", - "required": [ - "set_fields", - "config" - ], + "required": ["set_fields", "config"], "title": "InvokeAIAppConfigWithSetFields", "description": "InvokeAI App Config with model fields set" }, @@ -45735,21 +43356,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "hue", - "oklab", - "cielab", - "uplab", - "lch", - "hsv", - "hsl", - "lab" - ], + "required": ["type", "id"], + "tags": ["image", "hue", "oklab", "cielab", "uplab", "lch", "hsv", "hsl", "lab"], "title": "Adjust Image Hue Plus", "type": "object", "version": "1.2.0", @@ -45843,17 +43451,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "channel", - "mask", - "cielab", - "lab" - ], + "required": ["type", "id"], + "tags": ["image", "channel", "mask", "cielab", "lab"], "title": "Equivalent Achromatic Lightness", "type": "object", "version": "1.2.0", @@ -46046,16 +43645,7 @@ "color_space": { "default": "RGB", "description": "Available color spaces for blend computations", - "enum": [ - "RGB", - "Linear RGB", - "HSL (RGB)", - "HSV (RGB)", - "Okhsl", - "Okhsv", - "Oklch (Oklab)", - "LCh (CIELab)" - ], + "enum": ["RGB", "Linear RGB", "HSL (RGB)", "HSV (RGB)", "Okhsl", "Okhsv", "Oklch (Oklab)", "LCh (CIELab)"], "field_kind": "input", "input": "any", "orig_default": "RGB", @@ -46095,19 +43685,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "blend", - "layer", - "alpha", - "composite", - "dodge", - "burn" - ], + "required": ["type", "id"], + "tags": ["image", "blend", "layer", "alpha", "composite", "dodge", "burn"], "title": "Image Layer Blend", "type": "object", "version": "1.2.0", @@ -46277,16 +43856,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "compose", - "chroma", - "key" - ], + "required": ["type", "id"], + "tags": ["image", "compose", "chroma", "key"], "title": "Image Compositor", "type": "object", "version": "1.2.0", @@ -46391,10 +43962,7 @@ "mode": { "default": "Dilate", "description": "How to operate on the image", - "enum": [ - "Dilate", - "Erode" - ], + "enum": ["Dilate", "Erode"], "field_kind": "input", "input": "any", "orig_default": "Dilate", @@ -46410,19 +43978,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "mask", - "dilate", - "erode", - "expand", - "contract", - "mask" - ], + "required": ["type", "id"], + "tags": ["image", "mask", "dilate", "erode", "expand", "contract", "mask"], "title": "Image Dilate or Erode", "type": "object", "version": "1.3.0", @@ -46570,14 +44127,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "enhance", - "image" - ], + "required": ["type", "id"], + "tags": ["enhance", "image"], "title": "Enhance Image", "type": "object", "version": "1.2.1", @@ -46721,16 +44272,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "mask", - "value", - "threshold" - ], + "required": ["type", "id"], + "tags": ["image", "mask", "value", "threshold"], "title": "Image Value Thresholds", "type": "object", "version": "1.2.0", @@ -46755,10 +44298,7 @@ } }, "type": "object", - "required": [ - "item_ids", - "total_count" - ], + "required": ["item_ids", "total_count"], "title": "ItemIdsResult", "description": "Response containing ordered item ids with metadata for optimistic updates." }, @@ -46823,10 +44363,7 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], + "required": ["type", "id"], "title": "IterateInvocation", "type": "object", "version": "1.1.0", @@ -46867,14 +44404,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "item", - "index", - "total", - "type", - "type" - ], + "required": ["output_meta", "item", "index", "total", "type", "type"], "title": "IterateInvocationOutput", "type": "object" }, @@ -46965,14 +44495,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "inpaint" - ], + "required": ["type", "id"], + "tags": ["image", "inpaint"], "title": "LaMa Infill", "type": "object", "version": "1.2.2", @@ -47038,15 +44562,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "primitives", - "latents", - "collection" - ], + "required": ["type", "id"], + "tags": ["primitives", "latents", "collection"], "title": "Latents Collection Primitive", "type": "object", "version": "1.0.1", @@ -47076,12 +44593,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "collection", - "type", - "type" - ], + "required": ["output_meta", "collection", "type", "type"], "title": "LatentsCollectionOutput", "type": "object" }, @@ -47107,9 +44619,7 @@ "title": "Seed" } }, - "required": [ - "latents_name" - ], + "required": ["latents_name"], "title": "LatentsField", "type": "object" }, @@ -47167,14 +44677,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "primitives", - "latents" - ], + "required": ["type", "id"], + "tags": ["primitives", "latents"], "title": "Latents Primitive", "type": "object", "version": "1.0.2", @@ -47220,15 +44724,7 @@ "ui_hidden": false } }, - "required": [ - "output_meta", - "metadata", - "type", - "latents", - "width", - "height", - "type" - ], + "required": ["output_meta", "metadata", "type", "latents", "width", "height", "type"], "title": "LatentsMetaOutput", "type": "object" }, @@ -47264,14 +44760,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "latents", - "width", - "height", - "type", - "type" - ], + "required": ["output_meta", "latents", "width", "height", "type", "type"], "title": "LatentsOutput", "type": "object" }, @@ -47407,16 +44896,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "latents", - "image", - "vae", - "l2i" - ], + "required": ["type", "id"], + "tags": ["latents", "image", "vae", "l2i"], "title": "Latents to Image - SD1.5, SDXL", "type": "object", "version": "1.3.2", @@ -47510,14 +44991,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "controlnet", - "lineart" - ], + "required": ["type", "id"], + "tags": ["controlnet", "lineart"], "title": "Lineart Anime Edge Detection", "type": "object", "version": "1.0.0", @@ -47621,14 +45096,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "controlnet", - "lineart" - ], + "required": ["type", "id"], + "tags": ["controlnet", "lineart"], "title": "Lineart Edge Detection", "type": "object", "version": "1.0.0", @@ -47721,9 +45190,7 @@ "input": "any", "orig_required": true, "title": "LLaVA Model Type", - "ui_model_type": [ - "llava_onevision" - ] + "ui_model_type": ["llava_onevision"] }, "type": { "const": "llava_onevision_vllm", @@ -47733,13 +45200,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "vllm" - ], + "required": ["type", "id"], + "tags": ["vllm"], "title": "LLaVA OneVision VLLM", "type": "object", "version": "1.0.0", @@ -47941,13 +45403,8 @@ "orig_default": null, "orig_required": false, "title": "LoRAs", - "ui_model_base": [ - "sd-1", - "sd-2" - ], - "ui_model_type": [ - "lora" - ] + "ui_model_base": ["sd-1", "sd-2"], + "ui_model_type": ["lora"] }, "unet": { "anyOf": [ @@ -47991,13 +45448,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "model" - ], + "required": ["type", "id"], + "tags": ["model"], "title": "Apply LoRA Collection - SD1.5", "type": "object", "version": "1.1.3", @@ -48017,10 +45469,7 @@ "type": "number" } }, - "required": [ - "lora", - "weight" - ], + "required": ["lora", "weight"], "title": "LoRAField", "type": "object" }, @@ -48070,12 +45519,8 @@ "input": "any", "orig_required": true, "title": "LoRA", - "ui_model_base": [ - "sd-1" - ], - "ui_model_type": [ - "lora" - ] + "ui_model_base": ["sd-1"], + "ui_model_type": ["lora"] }, "weight": { "default": 0.75, @@ -48129,13 +45574,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "model" - ], + "required": ["type", "id"], + "tags": ["model"], "title": "Apply LoRA - SD1.5", "type": "object", "version": "1.0.4", @@ -48185,13 +45625,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "unet", - "clip", - "type", - "type" - ], + "required": ["output_meta", "unet", "clip", "type", "type"], "title": "LoRALoaderOutput", "type": "object" }, @@ -48208,10 +45642,7 @@ "type": "number" } }, - "required": [ - "model", - "weight" - ], + "required": ["model", "weight"], "title": "LoRAMetadataField", "type": "object" }, @@ -48238,9 +45669,7 @@ } }, "type": "object", - "required": [ - "model_name" - ], + "required": ["model_name"], "title": "LoRARecallParameter", "description": "LoRA configuration for recall" }, @@ -48290,9 +45719,7 @@ "input": "any", "orig_required": true, "title": "LoRA", - "ui_model_type": [ - "lora" - ] + "ui_model_type": ["lora"] }, "weight": { "default": 0.75, @@ -48312,13 +45739,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "model" - ], + "required": ["type", "id"], + "tags": ["model"], "title": "Select LoRA", "type": "object", "version": "1.0.3", @@ -48345,12 +45767,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "lora", - "type", - "type" - ], + "required": ["output_meta", "lora", "type", "type"], "title": "LoRASelectorOutput", "type": "object" }, @@ -50854,22 +48271,13 @@ } }, "type": "object", - "required": [ - "path" - ], + "required": ["path"], "title": "LocalModelSource", "description": "A local file or directory path." }, "LogLevel": { "type": "integer", - "enum": [ - 0, - 10, - 20, - 30, - 40, - 50 - ], + "enum": [0, 10, 20, 30, 40, 50], "title": "LogLevel" }, "LoginRequest": { @@ -50892,10 +48300,7 @@ } }, "type": "object", - "required": [ - "email", - "password" - ], + "required": ["email", "password"], "title": "LoginRequest", "description": "Request body for user login." }, @@ -50917,11 +48322,7 @@ } }, "type": "object", - "required": [ - "token", - "user", - "expires_in" - ], + "required": ["token", "user", "expires_in"], "title": "LoginResponse", "description": "Response from successful login." }, @@ -50934,9 +48335,7 @@ } }, "type": "object", - "required": [ - "success" - ], + "required": ["success"], "title": "LogoutResponse", "description": "Response from logout." }, @@ -51014,12 +48413,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "control_list", - "type", - "type" - ], + "required": ["output_meta", "control_list", "type", "type"], "title": "MDControlListOutput", "type": "object" }, @@ -51054,12 +48448,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "ip_adapter_list", - "type", - "type" - ], + "required": ["output_meta", "ip_adapter_list", "type", "type"], "title": "MDIPAdapterListOutput", "type": "object" }, @@ -51094,12 +48483,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "t2i_adapter_list", - "type", - "type" - ], + "required": ["output_meta", "t2i_adapter_list", "type", "type"], "title": "MDT2IAdapterListOutput", "type": "object" }, @@ -51211,15 +48595,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "controlnet", - "mlsd", - "edge" - ], + "required": ["type", "id"], + "tags": ["controlnet", "mlsd", "edge"], "title": "MLSD Detection", "type": "object", "version": "1.0.0", @@ -51245,10 +48622,7 @@ "anyOf": [ { "type": "string", - "enum": [ - "fp16", - "fp32" - ] + "enum": ["fp16", "fp32"] }, { "type": "null" @@ -51457,13 +48831,8 @@ "field_kind": "input", "input": "any", "orig_required": true, - "ui_model_base": [ - "sd-1", - "sd-2" - ], - "ui_model_type": [ - "main" - ] + "ui_model_base": ["sd-1", "sd-2"], + "ui_model_type": ["main"] }, "type": { "const": "main_model_loader", @@ -51473,13 +48842,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "model" - ], + "required": ["type", "id"], + "tags": ["model"], "title": "Main Model - SD1.5, SD2", "type": "object", "version": "1.0.4", @@ -55614,15 +52978,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "mask", - "multiply" - ], + "required": ["type", "id"], + "tags": ["image", "mask", "multiply"], "title": "Combine Masks", "type": "object", "version": "1.2.2", @@ -55780,15 +53137,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "mask", - "inpaint" - ], + "required": ["type", "id"], + "tags": ["image", "mask", "inpaint"], "title": "Mask Edge", "type": "object", "version": "1.2.2", @@ -55892,14 +53242,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "mask" - ], + "required": ["type", "id"], + "tags": ["image", "mask"], "title": "Mask from Alpha", "type": "object", "version": "1.2.2", @@ -56028,15 +53372,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "mask", - "id" - ], + "required": ["type", "id"], + "tags": ["image", "mask", "id"], "title": "Mask from Segmented Image", "type": "object", "version": "1.0.1", @@ -56076,14 +53413,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "mask", - "width", - "height", - "type", - "type" - ], + "required": ["output_meta", "mask", "width", "height", "type", "type"], "title": "MaskOutput", "type": "object" }, @@ -56173,13 +53503,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "mask" - ], + "required": ["type", "id"], + "tags": ["mask"], "title": "Tensor Mask to Image", "type": "object", "version": "1.1.0", @@ -56296,14 +53621,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "controlnet", - "face" - ], + "required": ["type", "id"], + "tags": ["controlnet", "face"], "title": "MediaPipe Face Detection", "type": "object", "version": "1.0.0", @@ -56369,13 +53688,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata Merge", "type": "object", "version": "1.0.1", @@ -56468,10 +53782,7 @@ "blend_mode": { "default": "Seam", "description": "blending type Linear or Seam", - "enum": [ - "Linear", - "Seam" - ], + "enum": ["Linear", "Seam"], "field_kind": "input", "input": "direct", "orig_default": "Seam", @@ -56498,13 +53809,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "tiles" - ], + "required": ["type", "id"], + "tags": ["tiles"], "title": "Merge Tiles to Image", "type": "object", "version": "1.1.1", @@ -56588,13 +53894,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata Field Extractor", "type": "object", "version": "1.0.0", @@ -56656,13 +53957,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata From Image", "type": "object", "version": "1.0.1", @@ -56731,13 +54027,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata", "type": "object", "version": "1.0.1", @@ -56757,10 +54048,7 @@ "title": "Value" } }, - "required": [ - "label", - "value" - ], + "required": ["label", "value"], "title": "MetadataItemField", "type": "object" }, @@ -56834,13 +54122,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata Item", "type": "object", "version": "1.0.1", @@ -56967,13 +54250,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata Item Linked", "type": "object", "version": "1.0.1", @@ -56999,12 +54277,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "item", - "type", - "type" - ], + "required": ["output_meta", "item", "type", "type"], "title": "MetadataItemOutput", "type": "object" }, @@ -57025,12 +54298,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "metadata", - "type", - "type" - ], + "required": ["output_meta", "metadata", "type", "type"], "title": "MetadataOutput", "type": "object" }, @@ -57084,11 +54352,7 @@ "label": { "default": "* CUSTOM LABEL *", "description": "Label for this metadata item", - "enum": [ - "* CUSTOM LABEL *", - "seamless_x", - "seamless_y" - ], + "enum": ["* CUSTOM LABEL *", "seamless_x", "seamless_y"], "field_kind": "input", "input": "direct", "orig_default": "* CUSTOM LABEL *", @@ -57140,13 +54404,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata To Bool Collection", "type": "object", "version": "1.0.0", @@ -57204,11 +54463,7 @@ "label": { "default": "* CUSTOM LABEL *", "description": "Label for this metadata item", - "enum": [ - "* CUSTOM LABEL *", - "seamless_x", - "seamless_y" - ], + "enum": ["* CUSTOM LABEL *", "seamless_x", "seamless_y"], "field_kind": "input", "input": "direct", "orig_default": "* CUSTOM LABEL *", @@ -57257,13 +54512,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata To Bool", "type": "object", "version": "1.0.0", @@ -57348,13 +54598,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata To ControlNets", "type": "object", "version": "1.2.0", @@ -57412,12 +54657,7 @@ "label": { "default": "* CUSTOM LABEL *", "description": "Label for this metadata item", - "enum": [ - "* CUSTOM LABEL *", - "cfg_scale", - "cfg_rescale_multiplier", - "guidance" - ], + "enum": ["* CUSTOM LABEL *", "cfg_scale", "cfg_rescale_multiplier", "guidance"], "field_kind": "input", "input": "direct", "orig_default": "* CUSTOM LABEL *", @@ -57469,13 +54709,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata To Float Collection", "type": "object", "version": "1.0.0", @@ -57533,12 +54768,7 @@ "label": { "default": "* CUSTOM LABEL *", "description": "Label for this metadata item", - "enum": [ - "* CUSTOM LABEL *", - "cfg_scale", - "cfg_rescale_multiplier", - "guidance" - ], + "enum": ["* CUSTOM LABEL *", "cfg_scale", "cfg_rescale_multiplier", "guidance"], "field_kind": "input", "input": "direct", "orig_default": "* CUSTOM LABEL *", @@ -57587,13 +54817,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata To Float", "type": "object", "version": "1.1.0", @@ -57679,13 +54904,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata To IP-Adapters", "type": "object", "version": "1.2.0", @@ -57804,13 +55024,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata To Integer Collection", "type": "object", "version": "1.0.0", @@ -57926,13 +55141,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata To Integer", "type": "object", "version": "1.0.0", @@ -58028,13 +55238,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata To LoRA Collection", "type": "object", "version": "1.1.0", @@ -58064,12 +55269,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "lora", - "type", - "type" - ], + "required": ["output_meta", "lora", "type", "type"], "title": "MetadataToLorasCollectionOutput", "type": "object" }, @@ -58162,13 +55362,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata To LoRAs", "type": "object", "version": "1.1.1", @@ -58226,10 +55421,7 @@ "label": { "default": "model", "description": "Label for this metadata item", - "enum": [ - "* CUSTOM LABEL *", - "model" - ], + "enum": ["* CUSTOM LABEL *", "model"], "field_kind": "input", "input": "direct", "orig_default": "model", @@ -58268,9 +55460,7 @@ "field_kind": "input", "input": "any", "orig_required": true, - "ui_model_type": [ - "main" - ] + "ui_model_type": ["main"] }, "type": { "const": "metadata_to_model", @@ -58280,13 +55470,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata To Model", "type": "object", "version": "1.3.0", @@ -58341,16 +55526,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "model", - "name", - "unet", - "vae", - "clip", - "type", - "type" - ], + "required": ["output_meta", "model", "name", "unet", "vae", "clip", "type", "type"], "title": "MetadataToModelOutput", "type": "object" }, @@ -58460,13 +55636,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata To SDXL LoRAs", "type": "object", "version": "1.1.1", @@ -58524,10 +55695,7 @@ "label": { "default": "model", "description": "Label for this metadata item", - "enum": [ - "* CUSTOM LABEL *", - "model" - ], + "enum": ["* CUSTOM LABEL *", "model"], "field_kind": "input", "input": "direct", "orig_default": "model", @@ -58566,12 +55734,8 @@ "field_kind": "input", "input": "any", "orig_required": true, - "ui_model_base": [ - "sdxl" - ], - "ui_model_type": [ - "main" - ] + "ui_model_base": ["sdxl"], + "ui_model_type": ["main"] }, "type": { "const": "metadata_to_sdxl_model", @@ -58581,13 +55745,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata To SDXL Model", "type": "object", "version": "1.3.0", @@ -58649,17 +55808,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "model", - "name", - "unet", - "clip", - "clip2", - "vae", - "type", - "type" - ], + "required": ["output_meta", "model", "name", "unet", "clip", "clip2", "vae", "type", "type"], "title": "MetadataToSDXLModelOutput", "type": "object" }, @@ -58713,10 +55862,7 @@ "label": { "default": "scheduler", "description": "Label for this metadata item", - "enum": [ - "* CUSTOM LABEL *", - "scheduler" - ], + "enum": ["* CUSTOM LABEL *", "scheduler"], "field_kind": "input", "input": "direct", "orig_default": "scheduler", @@ -58793,13 +55939,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata To Scheduler", "type": "object", "version": "1.0.1", @@ -58915,13 +56056,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata To String Collection", "type": "object", "version": "1.0.0", @@ -59034,13 +56170,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata To String", "type": "object", "version": "1.0.0", @@ -59126,13 +56257,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata To T2I-Adapters", "type": "object", "version": "1.2.0", @@ -59190,10 +56316,7 @@ "label": { "default": "vae", "description": "Label for this metadata item", - "enum": [ - "* CUSTOM LABEL *", - "vae" - ], + "enum": ["* CUSTOM LABEL *", "vae"], "field_kind": "input", "input": "direct", "orig_default": "vae", @@ -59241,13 +56364,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "metadata" - ], + "required": ["type", "id"], + "tags": ["metadata"], "title": "Metadata To VAE", "type": "object", "version": "1.2.1", @@ -59275,10 +56393,7 @@ "type": "array" } }, - "required": [ - "tokenizer", - "text_encoder" - ], + "required": ["tokenizer", "text_encoder"], "title": "MistralEncoderField", "type": "object" }, @@ -59733,10 +56848,7 @@ }, "MistralVariantType": { "type": "string", - "enum": [ - "cow_mistral3_small", - "mistral3_24b" - ], + "enum": ["cow_mistral3_small", "mistral3_24b"], "title": "MistralVariantType", "description": "Mistral text encoder variants used by FLUX.2 [dev]." }, @@ -59803,13 +56915,7 @@ "description": "The submodel to load, if this is a main model" } }, - "required": [ - "key", - "hash", - "name", - "base", - "type" - ], + "required": ["key", "hash", "name", "base", "type"], "title": "ModelIdentifierField", "type": "object" }, @@ -59868,13 +56974,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "model" - ], + "required": ["type", "id"], + "tags": ["model"], "title": "Any Model", "type": "object", "version": "1.0.1", @@ -59901,12 +57002,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "model", - "type", - "type" - ], + "required": ["output_meta", "model", "type", "type"], "title": "ModelIdentifierOutput", "type": "object" }, @@ -59951,11 +57047,7 @@ "title": "Source" } }, - "required": [ - "timestamp", - "id", - "source" - ], + "required": ["timestamp", "id", "source"], "title": "ModelInstallCancelledEvent", "type": "object" }, @@ -60314,14 +57406,7 @@ "title": "Config" } }, - "required": [ - "timestamp", - "id", - "source", - "key", - "total_bytes", - "config" - ], + "required": ["timestamp", "id", "source", "key", "total_bytes", "config"], "title": "ModelInstallCompleteEvent", "type": "object" }, @@ -60399,15 +57484,7 @@ "type": "array" } }, - "required": [ - "timestamp", - "id", - "source", - "local_path", - "bytes", - "total_bytes", - "parts" - ], + "required": ["timestamp", "id", "source", "local_path", "bytes", "total_bytes", "parts"], "title": "ModelInstallDownloadProgressEvent", "type": "object" }, @@ -60485,15 +57562,7 @@ "type": "array" } }, - "required": [ - "timestamp", - "id", - "source", - "local_path", - "bytes", - "total_bytes", - "parts" - ], + "required": ["timestamp", "id", "source", "local_path", "bytes", "total_bytes", "parts"], "title": "ModelInstallDownloadStartedEvent", "type": "object" }, @@ -60538,11 +57607,7 @@ "title": "Source" } }, - "required": [ - "timestamp", - "id", - "source" - ], + "required": ["timestamp", "id", "source"], "title": "ModelInstallDownloadsCompleteEvent", "type": "object" }, @@ -60597,13 +57662,7 @@ "type": "string" } }, - "required": [ - "timestamp", - "id", - "source", - "error_type", - "error" - ], + "required": ["timestamp", "id", "source", "error_type", "error"], "title": "ModelInstallErrorEvent", "type": "object" }, @@ -61051,11 +58110,7 @@ } }, "type": "object", - "required": [ - "id", - "source", - "local_path" - ], + "required": ["id", "source", "local_path"], "title": "ModelInstallJob", "description": "Object that tracks the current status of an install request." }, @@ -61100,11 +58155,7 @@ "title": "Source" } }, - "required": [ - "timestamp", - "id", - "source" - ], + "required": ["timestamp", "id", "source"], "title": "ModelInstallStartedEvent", "type": "object" }, @@ -61432,12 +58483,7 @@ "type": "string" } }, - "required": [ - "timestamp", - "config", - "submodel_type", - "user_id" - ], + "required": ["timestamp", "config", "submodel_type", "user_id"], "title": "ModelLoadCompleteEvent", "type": "object" }, @@ -61765,12 +58811,7 @@ "type": "string" } }, - "required": [ - "timestamp", - "config", - "submodel_type", - "user_id" - ], + "required": ["timestamp", "config", "submodel_type", "user_id"], "title": "ModelLoadStartedEvent", "type": "object" }, @@ -61807,14 +58848,7 @@ "ui_hidden": false } }, - "required": [ - "output_meta", - "vae", - "type", - "clip", - "unet", - "type" - ], + "required": ["output_meta", "vae", "type", "clip", "unet", "type"], "title": "ModelLoaderOutput", "type": "object" }, @@ -62132,17 +59166,7 @@ }, "ModelRecordOrderBy": { "type": "string", - "enum": [ - "default", - "type", - "base", - "name", - "format", - "size", - "created_at", - "updated_at", - "path" - ], + "enum": ["default", "type", "base", "name", "format", "size", "created_at", "updated_at", "path"], "title": "ModelRecordOrderBy", "description": "The order in which to return model summaries." }, @@ -62156,25 +59180,18 @@ "title": "Model Keys", "description": "List of model keys to fetch related models for", "examples": [ - [ - "aa3b247f-90c9-4416-bfcd-aeaa57a5339e", - "ac32b914-10ab-496e-a24a-3068724b9c35" - ], + ["aa3b247f-90c9-4416-bfcd-aeaa57a5339e", "ac32b914-10ab-496e-a24a-3068724b9c35"], [ "b1c2d3e4-f5a6-7890-abcd-ef1234567890", "12345678-90ab-cdef-1234-567890abcdef", "fedcba98-7654-3210-fedc-ba9876543210" ], - [ - "3bb7c0eb-b6c8-469c-ad8c-4d69c06075e4" - ] + ["3bb7c0eb-b6c8-469c-ad8c-4d69c06075e4"] ] } }, "type": "object", - "required": [ - "model_keys" - ], + "required": ["model_keys"], "title": "ModelRelationshipBatchRequest" }, "ModelRelationshipCreateRequest": { @@ -62207,33 +59224,18 @@ } }, "type": "object", - "required": [ - "model_key_1", - "model_key_2" - ], + "required": ["model_key_1", "model_key_2"], "title": "ModelRelationshipCreateRequest" }, "ModelRepoVariant": { "type": "string", - "enum": [ - "", - "fp16", - "fp32", - "onnx", - "openvino", - "flax" - ], + "enum": ["", "fp16", "fp32", "onnx", "openvino", "flax"], "title": "ModelRepoVariant", "description": "Various hugging face variants on the diffusers format." }, "ModelSourceType": { "type": "string", - "enum": [ - "path", - "url", - "hf_repo_id", - "external" - ], + "enum": ["path", "url", "hf_repo_id", "external"], "title": "ModelSourceType", "description": "Model source type." }, @@ -62268,11 +59270,7 @@ }, "ModelVariantType": { "type": "string", - "enum": [ - "normal", - "inpaint", - "depth" - ], + "enum": ["normal", "inpaint", "depth"], "title": "ModelVariantType", "description": "Variant type." }, @@ -62579,9 +59577,7 @@ } }, "type": "object", - "required": [ - "models" - ], + "required": ["models"], "title": "ModelsList", "description": "Return list of configs." }, @@ -62644,14 +59640,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "math", - "multiply" - ], + "required": ["type", "id"], + "tags": ["math", "multiply"], "title": "Multiply Integers", "type": "object", "version": "1.0.1", @@ -62710,11 +59700,7 @@ } }, "type": "object", - "required": [ - "node_path", - "field_name", - "value" - ], + "required": ["node_path", "field_name", "value"], "title": "NodeFieldValue" }, "NodePackInfo": { @@ -62744,12 +59730,7 @@ } }, "type": "object", - "required": [ - "name", - "path", - "node_count", - "node_types" - ], + "required": ["name", "path", "node_count", "node_types"], "title": "NodePackInfo", "description": "Information about an installed node pack." }, @@ -62770,10 +59751,7 @@ } }, "type": "object", - "required": [ - "node_packs", - "custom_nodes_path" - ], + "required": ["node_packs", "custom_nodes_path"], "title": "NodePackListResponse", "description": "Response for listing installed node packs." }, @@ -62811,15 +59789,7 @@ "noise_type": { "default": "SD", "description": "Architecture-specific noise type.", - "enum": [ - "SD", - "FLUX", - "FLUX.2", - "SD3", - "CogView4", - "Z-Image", - "Anima" - ], + "enum": ["SD", "FLUX", "FLUX.2", "SD3", "CogView4", "Z-Image", "Anima"], "field_kind": "input", "input": "any", "orig_default": "SD", @@ -62881,14 +59851,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "latents", - "noise" - ], + "required": ["type", "id"], + "tags": ["latents", "noise"], "title": "Create Latent Noise", "type": "object", "version": "1.1.0", @@ -62928,14 +59892,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "noise", - "width", - "height", - "type", - "type" - ], + "required": ["output_meta", "noise", "width", "height", "type", "type"], "title": "NoiseOutput", "type": "object" }, @@ -63025,14 +59982,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "controlnet", - "normal" - ], + "required": ["type", "id"], + "tags": ["controlnet", "normal"], "title": "Normal Map", "type": "object", "version": "1.0.0", @@ -63067,12 +60018,7 @@ } }, "type": "object", - "required": [ - "limit", - "offset", - "total", - "items" - ], + "required": ["limit", "offset", "total", "items"], "title": "OffsetPaginatedResults[BoardDTO]" }, "OffsetPaginatedResults_ImageDTO_": { @@ -63102,12 +60048,7 @@ } }, "type": "object", - "required": [ - "limit", - "offset", - "total", - "items" - ], + "required": ["limit", "offset", "total", "items"], "title": "OffsetPaginatedResults[ImageDTO]" }, "OklabUnsharpMaskInvocation": { @@ -63218,15 +60159,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "unsharp_mask", - "oklab" - ], + "required": ["type", "id"], + "tags": ["image", "unsharp_mask", "oklab"], "title": "Unsharp Mask (Oklab)", "type": "object", "version": "1.0.0", @@ -63330,15 +60264,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "hue", - "oklch" - ], + "required": ["type", "id"], + "tags": ["image", "hue", "oklch"], "title": "Adjust Image Hue (Oklch)", "type": "object", "version": "1.0.0", @@ -63423,27 +60350,15 @@ "field_kind": "input", "input": "any", "orig_required": true, - "ui_model_base": [ - "external" - ], - "ui_model_format": [ - "external_api" - ], - "ui_model_provider_id": [ - "openai" - ], - "ui_model_type": [ - "external_image_generator" - ] + "ui_model_base": ["external"], + "ui_model_format": ["external_api"], + "ui_model_provider_id": ["openai"], + "ui_model_type": ["external_image_generator"] }, "mode": { "default": "txt2img", "description": "Generation mode.", - "enum": [ - "txt2img", - "img2img", - "inpaint" - ], + "enum": ["txt2img", "img2img", "inpaint"], "field_kind": "input", "input": "any", "orig_default": "txt2img", @@ -63585,12 +60500,7 @@ "quality": { "default": "auto", "description": "Output image quality", - "enum": [ - "auto", - "high", - "medium", - "low" - ], + "enum": ["auto", "high", "medium", "low"], "field_kind": "input", "input": "any", "orig_default": "auto", @@ -63601,11 +60511,7 @@ "background": { "default": "auto", "description": "Background transparency handling", - "enum": [ - "auto", - "transparent", - "opaque" - ], + "enum": ["auto", "transparent", "opaque"], "field_kind": "input", "input": "any", "orig_default": "auto", @@ -63616,10 +60522,7 @@ "input_fidelity": { "anyOf": [ { - "enum": [ - "low", - "high" - ], + "enum": ["low", "high"], "type": "string" }, { @@ -63642,15 +60545,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "external", - "generation", - "openai" - ], + "required": ["type", "id"], + "tags": ["external", "generation", "openai"], "title": "OpenAI Image Generation", "type": "object", "version": "1.0.0", @@ -63685,12 +60581,7 @@ } }, "type": "object", - "required": [ - "path", - "absolute_path", - "files", - "size_bytes" - ], + "required": ["path", "absolute_path", "files", "size_bytes"], "title": "OrphanedModelInfo", "description": "Information about an orphaned model directory." }, @@ -63729,12 +60620,7 @@ "default": null } }, - "required": [ - "field_kind", - "ui_hidden", - "ui_order", - "ui_type" - ], + "required": ["field_kind", "ui_hidden", "ui_order", "ui_type"], "title": "OutputFieldJSONSchemaExtra", "type": "object" }, @@ -63829,12 +60715,7 @@ "border_mode": { "default": "none", "description": "Border mode to apply to eliminate any artifacts or seams", - "enum": [ - "none", - "seamless", - "mirror", - "replicate" - ], + "enum": ["none", "seamless", "mirror", "replicate"], "field_kind": "input", "input": "any", "orig_default": "none", @@ -63850,14 +60731,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "material" - ], + "required": ["type", "id"], + "tags": ["image", "material"], "title": "PBR Maps", "type": "object", "version": "1.0.0", @@ -63897,14 +60772,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "normal_map", - "roughness_map", - "displacement_map", - "type", - "type" - ], + "required": ["output_meta", "normal_map", "roughness_map", "displacement_map", "type", "type"], "title": "PBRMapsOutput", "type": "object" }, @@ -63940,13 +60808,7 @@ } }, "type": "object", - "required": [ - "page", - "pages", - "per_page", - "total", - "items" - ], + "required": ["page", "pages", "per_page", "total", "items"], "title": "PaginatedResults[WorkflowRecordListItemWithThumbnailDTO]" }, "PairTileImageInvocation": { @@ -64018,13 +60880,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "tiles" - ], + "required": ["type", "id"], + "tags": ["tiles"], "title": "Pair Tile with Image", "type": "object", "version": "1.0.1", @@ -64049,12 +60906,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "tile_with_image", - "type", - "type" - ], + "required": ["output_meta", "tile_with_image", "type", "type"], "title": "PairTileImageOutput", "type": "object" }, @@ -64174,14 +61026,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "crop" - ], + "required": ["type", "id"], + "tags": ["image", "crop"], "title": "Paste Image into Bounding Box", "type": "object", "version": "1.0.0", @@ -64295,14 +61141,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "controlnet", - "edge" - ], + "required": ["type", "id"], + "tags": ["controlnet", "edge"], "title": "PiDiNet Edge Detection", "type": "object", "version": "1.0.0", @@ -64325,18 +61165,12 @@ }, "additionalProperties": false, "type": "object", - "required": [ - "positive_prompt", - "negative_prompt" - ], + "required": ["positive_prompt", "negative_prompt"], "title": "PresetData" }, "PresetType": { "type": "string", - "enum": [ - "user", - "default" - ], + "enum": ["user", "default"], "title": "PresetType" }, "ProgressImage": { @@ -64360,11 +61194,7 @@ "type": "string" } }, - "required": [ - "width", - "height", - "dataURL" - ], + "required": ["width", "height", "dataURL"], "title": "ProgressImage", "type": "object" }, @@ -64444,16 +61274,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "prompt", - "template", - "style", - "preset" - ], + "required": ["type", "id"], + "tags": ["prompt", "template", "style", "preset"], "title": "Prompt Template", "type": "object", "version": "1.0.0", @@ -64487,13 +61309,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "positive_prompt", - "negative_prompt", - "type", - "type" - ], + "required": ["output_meta", "positive_prompt", "negative_prompt", "type", "type"], "title": "PromptTemplateOutput", "type": "object" }, @@ -64610,14 +61426,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "prompt", - "file" - ], + "required": ["type", "id"], + "tags": ["prompt", "file"], "title": "Prompts from File", "type": "object", "version": "1.0.2", @@ -64634,9 +61444,7 @@ } }, "type": "object", - "required": [ - "deleted" - ], + "required": ["deleted"], "title": "PruneResult", "description": "Result of pruning the session queue" }, @@ -64667,11 +61475,7 @@ "title": "User Id" } }, - "required": [ - "timestamp", - "queue_id", - "user_id" - ], + "required": ["timestamp", "queue_id", "user_id"], "title": "QueueClearedEvent", "type": "object" }, @@ -64732,14 +61536,7 @@ }, "status": { "description": "The new status of the queue item", - "enum": [ - "pending", - "in_progress", - "waiting", - "completed", - "failed", - "canceled" - ], + "enum": ["pending", "in_progress", "waiting", "completed", "failed", "canceled"], "title": "Status", "type": "string" }, @@ -64910,13 +61707,7 @@ "type": "object" } }, - "required": [ - "timestamp", - "queue_id", - "canceled_item_ids", - "user_ids", - "canceled_item_ids_by_user" - ], + "required": ["timestamp", "queue_id", "canceled_item_ids", "user_ids", "canceled_item_ids_by_user"], "title": "QueueItemsCanceledEvent", "type": "object" }, @@ -64961,13 +61752,7 @@ "type": "object" } }, - "required": [ - "timestamp", - "queue_id", - "retried_item_ids", - "user_ids", - "retried_item_ids_by_user" - ], + "required": ["timestamp", "queue_id", "retried_item_ids", "user_ids", "retried_item_ids_by_user"], "title": "QueueItemsRetriedEvent", "type": "object" }, @@ -64991,10 +61776,7 @@ "type": "array" } }, - "required": [ - "tokenizer", - "text_encoder" - ], + "required": ["tokenizer", "text_encoder"], "title": "Qwen3EncoderField", "type": "object" }, @@ -65449,11 +62231,7 @@ }, "Qwen3VariantType": { "type": "string", - "enum": [ - "qwen3_4b", - "qwen3_8b", - "qwen3_06b" - ], + "enum": ["qwen3_4b", "qwen3_8b", "qwen3_06b"], "title": "Qwen3VariantType", "description": "Qwen3 text encoder variants based on model size." }, @@ -65466,9 +62244,7 @@ "type": "string" } }, - "required": [ - "conditioning_name" - ], + "required": ["conditioning_name"], "title": "QwenImageConditioningField", "type": "object" }, @@ -65490,12 +62266,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "conditioning", - "type", - "type" - ], + "required": ["output_meta", "conditioning", "type", "type"], "title": "QwenImageConditioningOutput", "type": "object" }, @@ -65769,14 +62540,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "qwen_image" - ], + "required": ["type", "id"], + "tags": ["image", "qwen_image"], "title": "Denoise - Qwen Image", "type": "object", "version": "1.0.0", @@ -65919,17 +62684,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "latents", - "vae", - "i2l", - "qwen_image" - ], + "required": ["type", "id"], + "tags": ["image", "latents", "vae", "i2l", "qwen_image"], "title": "Image to Latents - Qwen Image", "type": "object", "version": "1.0.0", @@ -66038,17 +62794,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "latents", - "image", - "vae", - "l2i", - "qwen_image" - ], + "required": ["type", "id"], + "tags": ["latents", "image", "vae", "l2i", "qwen_image"], "title": "Latents to Image - Qwen Image", "type": "object", "version": "1.0.0", @@ -66109,12 +62856,8 @@ "orig_default": null, "orig_required": false, "title": "LoRAs", - "ui_model_base": [ - "qwen-image" - ], - "ui_model_type": [ - "lora" - ] + "ui_model_base": ["qwen-image"], + "ui_model_type": ["lora"] }, "transformer": { "anyOf": [ @@ -66141,15 +62884,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "lora", - "model", - "qwen_image" - ], + "required": ["type", "id"], + "tags": ["lora", "model", "qwen_image"], "title": "Apply LoRA Collection - Qwen Image", "type": "object", "version": "1.0.1", @@ -66203,12 +62939,8 @@ "input": "any", "orig_required": true, "title": "LoRA", - "ui_model_base": [ - "qwen-image" - ], - "ui_model_type": [ - "lora" - ] + "ui_model_base": ["qwen-image"], + "ui_model_type": ["lora"] }, "weight": { "default": 1.0, @@ -66245,15 +62977,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "lora", - "model", - "qwen_image" - ], + "required": ["type", "id"], + "tags": ["lora", "model", "qwen_image"], "title": "Apply LoRA - Qwen Image", "type": "object", "version": "1.0.0", @@ -66288,12 +63013,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "transformer", - "type", - "type" - ], + "required": ["output_meta", "transformer", "type", "type"], "title": "QwenImageLoRALoaderOutput", "type": "object" }, @@ -66335,12 +63055,8 @@ "input": "direct", "orig_required": true, "title": "Transformer", - "ui_model_base": [ - "qwen-image" - ], - "ui_model_type": [ - "main" - ] + "ui_model_base": ["qwen-image"], + "ui_model_type": ["main"] }, "vae_model": { "anyOf": [ @@ -66358,12 +63074,8 @@ "orig_default": null, "orig_required": false, "title": "VAE", - "ui_model_base": [ - "qwen-image" - ], - "ui_model_type": [ - "vae" - ] + "ui_model_base": ["qwen-image"], + "ui_model_type": ["vae"] }, "qwen_vl_encoder_model": { "anyOf": [ @@ -66381,9 +63093,7 @@ "orig_default": null, "orig_required": false, "title": "Qwen VL Encoder", - "ui_model_type": [ - "qwen_vl_encoder" - ] + "ui_model_type": ["qwen_vl_encoder"] }, "component_source": { "anyOf": [ @@ -66401,15 +63111,9 @@ "orig_default": null, "orig_required": false, "title": "Component Source (Diffusers)", - "ui_model_base": [ - "qwen-image" - ], - "ui_model_format": [ - "diffusers" - ], - "ui_model_type": [ - "main" - ] + "ui_model_base": ["qwen-image"], + "ui_model_format": ["diffusers"], + "ui_model_type": ["main"] }, "type": { "const": "qwen_image_model_loader", @@ -66419,15 +63123,8 @@ "type": "string" } }, - "required": [ - "model", - "type", - "id" - ], - "tags": [ - "model", - "qwen_image" - ], + "required": ["model", "type", "id"], + "tags": ["model", "qwen_image"], "title": "Main Model - Qwen Image", "type": "object", "version": "1.2.0", @@ -66468,14 +63165,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "transformer", - "qwen_vl_encoder", - "vae", - "type", - "type" - ], + "required": ["output_meta", "transformer", "qwen_vl_encoder", "vae", "type", "type"], "title": "QwenImageModelLoaderOutput", "type": "object" }, @@ -66559,11 +63249,7 @@ "quantization": { "default": "none", "description": "Quantize the Qwen VL encoder to reduce VRAM usage. 'nf4' (4-bit) saves the most memory, 'int8' (8-bit) is a middle ground.", - "enum": [ - "none", - "int8", - "nf4" - ], + "enum": ["none", "int8", "nf4"], "field_kind": "input", "input": "any", "orig_default": "none", @@ -66579,15 +63265,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "prompt", - "conditioning", - "qwen_image" - ], + "required": ["type", "id"], + "tags": ["prompt", "conditioning", "qwen_image"], "title": "Prompt - Qwen Image", "type": "object", "version": "1.2.0", @@ -66597,10 +63276,7 @@ }, "QwenImageVariantType": { "type": "string", - "enum": [ - "generate", - "edit" - ], + "enum": ["generate", "edit"], "title": "QwenImageVariantType", "description": "Qwen Image model variants." }, @@ -66616,10 +63292,7 @@ "description": "Info to load text_encoder submodel" } }, - "required": [ - "tokenizer", - "text_encoder" - ], + "required": ["tokenizer", "text_encoder"], "title": "QwenVLEncoderField", "type": "object" }, @@ -66951,15 +63624,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "math", - "float", - "random" - ], + "required": ["type", "id"], + "tags": ["math", "float", "random"], "title": "Random Float", "type": "object", "version": "1.0.1", @@ -67026,14 +63692,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "math", - "random" - ], + "required": ["type", "id"], + "tags": ["math", "random"], "title": "Random Integer", "type": "object", "version": "1.0.1", @@ -67122,16 +63782,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "range", - "integer", - "random", - "collection" - ], + "required": ["type", "id"], + "tags": ["range", "integer", "random", "collection"], "title": "Random Range", "type": "object", "version": "1.0.1", @@ -67208,15 +63860,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "collection", - "integer", - "range" - ], + "required": ["type", "id"], + "tags": ["collection", "integer", "range"], "title": "Integer Range", "type": "object", "version": "1.0.0", @@ -67294,16 +63939,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "collection", - "integer", - "size", - "range" - ], + "required": ["type", "id"], + "tags": ["collection", "integer", "size", "range"], "title": "Integer Range of Size", "type": "object", "version": "1.0.0", @@ -67678,12 +64315,7 @@ "type": "object" } }, - "required": [ - "timestamp", - "queue_id", - "user_id", - "parameters" - ], + "required": ["timestamp", "queue_id", "user_id", "parameters"], "title": "RecallParametersUpdatedEvent", "type": "object" }, @@ -67838,13 +64470,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "conditioning" - ], + "required": ["type", "id"], + "tags": ["conditioning"], "title": "Create Rectangle Mask", "type": "object", "version": "1.0.1", @@ -67861,9 +64488,7 @@ } }, "type": "object", - "required": [ - "image_name" - ], + "required": ["image_name"], "title": "ReferenceImageRecallParameter", "description": "Global reference-image configuration for recall.\n\nUsed for reference images that feed directly into the main model rather\nthan through a separate IP-Adapter / ControlNet model \u2014 for example\nFLUX.2 Klein, FLUX Kontext, and Qwen Image Edit. The receiving frontend\npicks the correct config type (``flux2_reference_image`` /\n``qwen_image_reference_image`` / ``flux_kontext_reference_image``) based\non the currently-selected main model." }, @@ -67909,10 +64534,7 @@ } }, "type": "object", - "required": [ - "url", - "path" - ], + "required": ["url", "path"], "title": "RemoteModelFile", "description": "Information about a downloadable file that forms part of a model." }, @@ -67936,10 +64558,7 @@ } }, "type": "object", - "required": [ - "affected_boards", - "removed_images" - ], + "required": ["affected_boards", "removed_images"], "title": "RemoveImagesFromBoardResult" }, "ResizeLatentsInvocation": { @@ -68027,15 +64646,7 @@ "mode": { "default": "bilinear", "description": "Interpolation mode", - "enum": [ - "nearest", - "linear", - "bilinear", - "bicubic", - "trilinear", - "area", - "nearest-exact" - ], + "enum": ["nearest", "linear", "bilinear", "bicubic", "trilinear", "area", "nearest-exact"], "field_kind": "input", "input": "any", "orig_default": "bilinear", @@ -68061,14 +64672,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "latents", - "resize" - ], + "required": ["type", "id"], + "tags": ["latents", "resize"], "title": "Resize Latents", "type": "object", "version": "1.0.2", @@ -68078,10 +64683,7 @@ }, "ResourceOrigin": { "type": "string", - "enum": [ - "internal", - "external" - ], + "enum": ["internal", "external"], "title": "ResourceOrigin", "description": "The origin of a resource (eg image).\n\n- INTERNAL: The resource was created by the application.\n- EXTERNAL: The resource was not created by the application.\nThis may be a user-initiated upload, or an internal application upload (eg Canvas init image)." }, @@ -68102,10 +64704,7 @@ } }, "type": "object", - "required": [ - "queue_id", - "retried_item_ids" - ], + "required": ["queue_id", "retried_item_ids"], "title": "RetryItemsResult" }, "RoundInvocation": { @@ -68167,14 +64766,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "math", - "round" - ], + "required": ["type", "id"], + "tags": ["math", "round"], "title": "Round Float", "type": "object", "version": "1.0.1", @@ -68199,20 +64792,12 @@ "description": "The label of the point" } }, - "required": [ - "x", - "y", - "label" - ], + "required": ["x", "y", "label"], "title": "SAMPoint", "type": "object" }, "SAMPointLabel": { - "enum": [ - -1, - 0, - 1 - ], + "enum": [-1, 0, 1], "title": "SAMPointLabel", "type": "integer" }, @@ -68228,9 +64813,7 @@ "type": "array" } }, - "required": [ - "points" - ], + "required": ["points"], "title": "SAMPointsField", "type": "object" }, @@ -68243,9 +64826,7 @@ "type": "string" } }, - "required": [ - "conditioning_name" - ], + "required": ["conditioning_name"], "title": "SD3ConditioningField", "type": "object" }, @@ -68267,12 +64848,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "conditioning", - "type", - "type" - ], + "required": ["output_meta", "conditioning", "type", "type"], "title": "SD3ConditioningOutput", "type": "object" }, @@ -68528,14 +65104,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "sd3" - ], + "required": ["type", "id"], + "tags": ["image", "sd3"], "title": "Denoise - SD3", "type": "object", "version": "1.2.0", @@ -68644,17 +65214,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "latents", - "vae", - "i2l", - "sd3" - ], + "required": ["type", "id"], + "tags": ["image", "latents", "vae", "i2l", "sd3"], "title": "Image to Latents - SD3", "type": "object", "version": "1.0.1", @@ -68763,17 +65324,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "latents", - "image", - "vae", - "l2i", - "sd3" - ], + "required": ["type", "id"], + "tags": ["latents", "image", "vae", "l2i", "sd3"], "title": "Latents to Image - SD3", "type": "object", "version": "1.3.2", @@ -68950,15 +65502,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "sdxl", - "compel", - "prompt" - ], + "required": ["type", "id"], + "tags": ["sdxl", "compel", "prompt"], "title": "Prompt - SDXL", "type": "object", "version": "1.2.1", @@ -69019,12 +65564,8 @@ "orig_default": null, "orig_required": false, "title": "LoRAs", - "ui_model_base": [ - "sdxl" - ], - "ui_model_type": [ - "lora" - ] + "ui_model_base": ["sdxl"], + "ui_model_type": ["lora"] }, "unet": { "anyOf": [ @@ -69085,13 +65626,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "model" - ], + "required": ["type", "id"], + "tags": ["model"], "title": "Apply LoRA Collection - SDXL", "type": "object", "version": "1.1.3", @@ -69145,12 +65681,8 @@ "input": "any", "orig_required": true, "title": "LoRA", - "ui_model_base": [ - "sdxl" - ], - "ui_model_type": [ - "lora" - ] + "ui_model_base": ["sdxl"], + "ui_model_type": ["lora"] }, "weight": { "default": 0.75, @@ -69221,14 +65753,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "lora", - "model" - ], + "required": ["type", "id"], + "tags": ["lora", "model"], "title": "Apply LoRA - SDXL", "type": "object", "version": "1.0.5", @@ -69293,14 +65819,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "unet", - "clip", - "clip2", - "type", - "type" - ], + "required": ["output_meta", "unet", "clip", "clip2", "type", "type"], "title": "SDXLLoRALoaderOutput", "type": "object" }, @@ -69349,12 +65868,8 @@ "field_kind": "input", "input": "any", "orig_required": true, - "ui_model_base": [ - "sdxl" - ], - "ui_model_type": [ - "main" - ] + "ui_model_base": ["sdxl"], + "ui_model_type": ["main"] }, "type": { "const": "sdxl_model_loader", @@ -69364,14 +65879,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "model", - "sdxl" - ], + "required": ["type", "id"], + "tags": ["model", "sdxl"], "title": "Main Model - SDXL", "type": "object", "version": "1.0.4", @@ -69419,15 +65928,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "unet", - "clip", - "clip2", - "vae", - "type", - "type" - ], + "required": ["output_meta", "unet", "clip", "clip2", "vae", "type", "type"], "title": "SDXLModelLoaderOutput", "type": "object" }, @@ -69546,15 +66047,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "sdxl", - "compel", - "prompt" - ], + "required": ["type", "id"], + "tags": ["sdxl", "compel", "prompt"], "title": "Prompt - SDXL Refiner", "type": "object", "version": "1.1.2", @@ -69607,12 +66101,8 @@ "field_kind": "input", "input": "any", "orig_required": true, - "ui_model_base": [ - "sdxl-refiner" - ], - "ui_model_type": [ - "main" - ] + "ui_model_base": ["sdxl-refiner"], + "ui_model_type": ["main"] }, "type": { "const": "sdxl_refiner_model_loader", @@ -69622,15 +66112,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "model", - "sdxl", - "refiner" - ], + "required": ["type", "id"], + "tags": ["model", "sdxl", "refiner"], "title": "Refiner Model - SDXL", "type": "object", "version": "1.0.4", @@ -69671,23 +66154,13 @@ "type": "string" } }, - "required": [ - "output_meta", - "unet", - "clip2", - "vae", - "type", - "type" - ], + "required": ["output_meta", "unet", "clip2", "vae", "type", "type"], "title": "SDXLRefinerModelLoaderOutput", "type": "object" }, "SQLiteDirection": { "type": "string", - "enum": [ - "ASC", - "DESC" - ], + "enum": ["ASC", "DESC"], "title": "SQLiteDirection" }, "SaveImageInvocation": { @@ -69776,14 +66249,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "primitives", - "image" - ], + "required": ["type", "id"], + "tags": ["primitives", "image"], "title": "Save Image", "type": "object", "version": "1.2.2", @@ -69902,11 +66369,7 @@ "file_format": { "default": "png", "description": "File format for the exported file. PNG is lossless; JPG/WEBP are lossy and respect 'quality'.", - "enum": [ - "png", - "jpg", - "webp" - ], + "enum": ["png", "jpg", "webp"], "field_kind": "input", "input": "any", "orig_default": "png", @@ -69934,16 +66397,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "export", - "file", - "save" - ], + "required": ["type", "id"], + "tags": ["image", "export", "file", "save"], "title": "Save Image (Gallery + File Export)", "type": "object", "version": "1.0.0", @@ -70017,15 +66472,7 @@ "mode": { "default": "bilinear", "description": "Interpolation mode", - "enum": [ - "nearest", - "linear", - "bilinear", - "bicubic", - "trilinear", - "area", - "nearest-exact" - ], + "enum": ["nearest", "linear", "bilinear", "bicubic", "trilinear", "area", "nearest-exact"], "field_kind": "input", "input": "any", "orig_default": "bilinear", @@ -70051,14 +66498,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "latents", - "resize" - ], + "required": ["type", "id"], + "tags": ["latents", "resize"], "title": "Scale Latents", "type": "object", "version": "1.0.2", @@ -70149,13 +66590,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "scheduler" - ], + "required": ["type", "id"], + "tags": ["scheduler"], "title": "Scheduler", "type": "object", "version": "1.0.0", @@ -70215,22 +66651,13 @@ "type": "string" } }, - "required": [ - "output_meta", - "scheduler", - "type", - "type" - ], + "required": ["output_meta", "scheduler", "type", "type"], "title": "SchedulerOutput", "type": "object" }, "SchedulerPredictionType": { "type": "string", - "enum": [ - "epsilon", - "v_prediction", - "sample" - ], + "enum": ["epsilon", "v_prediction", "sample"], "title": "SchedulerPredictionType", "description": "Scheduler prediction type." }, @@ -70271,12 +66698,8 @@ "field_kind": "input", "input": "direct", "orig_required": true, - "ui_model_base": [ - "sd-3" - ], - "ui_model_type": [ - "main" - ] + "ui_model_base": ["sd-3"], + "ui_model_type": ["main"] }, "t5_encoder_model": { "anyOf": [ @@ -70294,9 +66717,7 @@ "orig_default": null, "orig_required": false, "title": "T5 Encoder", - "ui_model_type": [ - "t5_encoder" - ] + "ui_model_type": ["t5_encoder"] }, "clip_l_model": { "anyOf": [ @@ -70314,12 +66735,8 @@ "orig_default": null, "orig_required": false, "title": "CLIP L Encoder", - "ui_model_type": [ - "clip_embed" - ], - "ui_model_variant": [ - "large" - ] + "ui_model_type": ["clip_embed"], + "ui_model_variant": ["large"] }, "clip_g_model": { "anyOf": [ @@ -70337,12 +66754,8 @@ "orig_default": null, "orig_required": false, "title": "CLIP G Encoder", - "ui_model_type": [ - "clip_embed" - ], - "ui_model_variant": [ - "gigantic" - ] + "ui_model_type": ["clip_embed"], + "ui_model_variant": ["gigantic"] }, "vae_model": { "anyOf": [ @@ -70360,12 +66773,8 @@ "orig_default": null, "orig_required": false, "title": "VAE", - "ui_model_base": [ - "sd-3" - ], - "ui_model_type": [ - "vae" - ] + "ui_model_base": ["sd-3"], + "ui_model_type": ["vae"] }, "type": { "const": "sd3_model_loader", @@ -70375,15 +66784,8 @@ "type": "string" } }, - "required": [ - "model", - "type", - "id" - ], - "tags": [ - "model", - "sd3" - ], + "required": ["model", "type", "id"], + "tags": ["model", "sd3"], "title": "Main Model - SD3", "type": "object", "version": "1.0.1", @@ -70438,16 +66840,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "transformer", - "clip_l", - "clip_g", - "t5_encoder", - "vae", - "type", - "type" - ], + "required": ["output_meta", "transformer", "clip_l", "clip_g", "t5_encoder", "vae", "type", "type"], "title": "Sd3ModelLoaderOutput", "type": "object" }, @@ -70555,15 +66948,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "prompt", - "conditioning", - "sd3" - ], + "required": ["type", "id"], + "tags": ["prompt", "conditioning", "sd3"], "title": "Prompt - SD3", "type": "object", "version": "1.0.1", @@ -70664,14 +67050,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "seamless", - "model" - ], + "required": ["type", "id"], + "tags": ["seamless", "model"], "title": "Apply Seamless - SD1.5, SDXL", "type": "object", "version": "1.0.2", @@ -70721,13 +67101,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "unet", - "vae", - "type", - "type" - ], + "required": ["output_meta", "unet", "vae", "type", "type"], "title": "SeamlessModeOutput", "type": "object" }, @@ -70808,27 +67182,15 @@ "field_kind": "input", "input": "any", "orig_required": true, - "ui_model_base": [ - "external" - ], - "ui_model_format": [ - "external_api" - ], - "ui_model_provider_id": [ - "seedream" - ], - "ui_model_type": [ - "external_image_generator" - ] + "ui_model_base": ["external"], + "ui_model_format": ["external_api"], + "ui_model_provider_id": ["seedream"], + "ui_model_type": ["external_image_generator"] }, "mode": { "default": "txt2img", "description": "Generation mode.", - "enum": [ - "txt2img", - "img2img", - "inpaint" - ], + "enum": ["txt2img", "img2img", "inpaint"], "field_kind": "input", "input": "any", "orig_default": "txt2img", @@ -70994,15 +67356,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "external", - "generation", - "seedream" - ], + "required": ["type", "id"], + "tags": ["external", "generation", "seedream"], "title": "Seedream Image Generation", "type": "object", "version": "1.1.0", @@ -71134,11 +67489,7 @@ "mask_filter": { "default": "all", "description": "The filtering to apply to the detected masks before merging them into a final output.", - "enum": [ - "all", - "largest", - "highest_box_score" - ], + "enum": ["all", "largest", "highest_box_score"], "field_kind": "input", "input": "any", "orig_default": "all", @@ -71154,16 +67505,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "prompt", - "segmentation", - "sam", - "sam2" - ], + "required": ["type", "id"], + "tags": ["prompt", "segmentation", "sam", "sam2"], "title": "Segment Anything", "type": "object", "version": "1.3.0", @@ -71185,10 +67528,7 @@ } }, "type": "object", - "required": [ - "is_started", - "is_processing" - ], + "required": ["is_started", "is_processing"], "title": "SessionProcessorStatus" }, "SessionQueueAndProcessorStatus": { @@ -71201,10 +67541,7 @@ } }, "type": "object", - "required": [ - "queue", - "processor" - ], + "required": ["queue", "processor"], "title": "SessionQueueAndProcessorStatus", "description": "The overall status of session queue and processor" }, @@ -71279,14 +67616,7 @@ }, "status": { "type": "string", - "enum": [ - "pending", - "in_progress", - "waiting", - "completed", - "failed", - "canceled" - ], + "enum": ["pending", "in_progress", "waiting", "completed", "failed", "canceled"], "title": "Status", "description": "The status of this queue item", "default": "pending" @@ -71736,10 +68066,7 @@ } }, "type": "object", - "required": [ - "email", - "password" - ], + "required": ["email", "password"], "title": "SetupRequest", "description": "Request body for initial admin setup." }, @@ -71756,10 +68083,7 @@ } }, "type": "object", - "required": [ - "success", - "user" - ], + "required": ["success", "user"], "title": "SetupResponse", "description": "Response from successful admin setup." }, @@ -71794,11 +68118,7 @@ } }, "type": "object", - "required": [ - "setup_required", - "multiuser_enabled", - "strict_password_checking" - ], + "required": ["setup_required", "multiuser_enabled", "strict_password_checking"], "title": "SetupStatusResponse", "description": "Response for setup status check." }, @@ -71856,13 +68176,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image" - ], + "required": ["type", "id"], + "tags": ["image"], "title": "Show Image", "type": "object", "version": "1.0.1", @@ -72104,9 +68419,7 @@ "input": "any", "orig_required": true, "title": "Image-to-Image Model", - "ui_model_type": [ - "spandrel_image_to_image" - ] + "ui_model_type": ["spandrel_image_to_image"] }, "tile_size": { "default": 512, @@ -72148,13 +68461,8 @@ "type": "boolean" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "upscale" - ], + "required": ["type", "id"], + "tags": ["upscale"], "title": "Image-to-Image (Autoscale)", "type": "object", "version": "1.0.0", @@ -72255,9 +68563,7 @@ "input": "any", "orig_required": true, "title": "Image-to-Image Model", - "ui_model_type": [ - "spandrel_image_to_image" - ] + "ui_model_type": ["spandrel_image_to_image"] }, "tile_size": { "default": 512, @@ -72277,13 +68583,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "upscale" - ], + "required": ["type", "id"], + "tags": ["upscale"], "title": "Image-to-Image", "type": "object", "version": "1.3.0", @@ -72434,10 +68735,7 @@ } }, "type": "object", - "required": [ - "affected_boards", - "starred_images" - ], + "required": ["affected_boards", "starred_images"], "title": "StarredImagesResult" }, "StarterModel": { @@ -72561,13 +68859,7 @@ } }, "type": "object", - "required": [ - "description", - "source", - "name", - "base", - "type" - ], + "required": ["description", "source", "name", "base", "type"], "title": "StarterModel" }, "StarterModelBundle": { @@ -72585,10 +68877,7 @@ } }, "type": "object", - "required": [ - "name", - "models" - ], + "required": ["name", "models"], "title": "StarterModelBundle" }, "StarterModelResponse": { @@ -72609,10 +68898,7 @@ } }, "type": "object", - "required": [ - "starter_models", - "starter_bundles" - ], + "required": ["starter_models", "starter_bundles"], "title": "StarterModelResponse" }, "StarterModelWithoutDependencies": { @@ -72722,13 +69008,7 @@ } }, "type": "object", - "required": [ - "description", - "source", - "name", - "base", - "type" - ], + "required": ["description", "source", "name", "base", "type"], "title": "StarterModelWithoutDependencies" }, "String2Output": { @@ -72757,13 +69037,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "string_1", - "string_2", - "type", - "type" - ], + "required": ["output_meta", "string_1", "string_2", "type", "type"], "title": "String2Output", "type": "object" }, @@ -72801,14 +69075,7 @@ "batch_group_id": { "default": "None", "description": "The ID of this batch node's group. If provided, all batch nodes in with the same ID will be 'zipped' before execution, and all nodes' collections must be of the same size.", - "enum": [ - "None", - "Group 1", - "Group 2", - "Group 3", - "Group 4", - "Group 5" - ], + "enum": ["None", "Group 1", "Group 2", "Group 3", "Group 4", "Group 5"], "field_kind": "input", "input": "direct", "orig_default": "None", @@ -72844,16 +69111,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "primitives", - "string", - "batch", - "special" - ], + "required": ["type", "id"], + "tags": ["primitives", "string", "batch", "special"], "title": "String Batch", "type": "object", "version": "1.0.0", @@ -72913,15 +69172,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "primitives", - "string", - "collection" - ], + "required": ["type", "id"], + "tags": ["primitives", "string", "collection"], "title": "String Collection Primitive", "type": "object", "version": "1.0.2", @@ -72951,12 +69203,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "collection", - "type", - "type" - ], + "required": ["output_meta", "collection", "type", "type"], "title": "StringCollectionOutput", "type": "object" }, @@ -73007,18 +69254,8 @@ "type": "string" } }, - "required": [ - "generator", - "type", - "id" - ], - "tags": [ - "primitives", - "string", - "number", - "batch", - "special" - ], + "required": ["generator", "type", "id"], + "tags": ["primitives", "string", "number", "batch", "special"], "title": "String Generator", "type": "object", "version": "1.0.0", @@ -73053,12 +69290,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "strings", - "type", - "type" - ], + "required": ["output_meta", "strings", "type", "type"], "title": "StringGeneratorOutput", "type": "object" }, @@ -73112,14 +69344,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "primitives", - "string" - ], + "required": ["type", "id"], + "tags": ["primitives", "string"], "title": "String Primitive", "type": "object", "version": "1.0.1", @@ -73188,14 +69414,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "string", - "join" - ], + "required": ["type", "id"], + "tags": ["string", "join"], "title": "String Join", "type": "object", "version": "1.0.1", @@ -73275,14 +69495,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "string", - "join" - ], + "required": ["type", "id"], + "tags": ["string", "join"], "title": "String Join Three", "type": "object", "version": "1.0.1", @@ -73309,12 +69523,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "value", - "type", - "type" - ], + "required": ["output_meta", "value", "type", "type"], "title": "StringOutput", "type": "object" }, @@ -73344,13 +69553,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "positive_string", - "negative_string", - "type", - "type" - ], + "required": ["output_meta", "positive_string", "negative_string", "type", "type"], "title": "StringPosNegOutput", "type": "object" }, @@ -73436,15 +69639,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "string", - "replace", - "regex" - ], + "required": ["type", "id"], + "tags": ["string", "replace", "regex"], "title": "String Replace", "type": "object", "version": "1.0.1", @@ -73512,14 +69708,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "string", - "split" - ], + "required": ["type", "id"], + "tags": ["string", "split"], "title": "String Split", "type": "object", "version": "1.0.1", @@ -73577,15 +69767,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "string", - "split", - "negative" - ], + "required": ["type", "id"], + "tags": ["string", "split", "negative"], "title": "String Split Negative", "type": "object", "version": "1.0.1", @@ -73602,9 +69785,7 @@ "type": "string" } }, - "required": [ - "style_preset_id" - ], + "required": ["style_preset_id"], "title": "StylePresetField", "type": "object" }, @@ -73653,14 +69834,7 @@ } }, "type": "object", - "required": [ - "name", - "preset_data", - "type", - "id", - "user_id", - "image" - ], + "required": ["name", "preset_data", "type", "id", "user_id", "image"], "title": "StylePresetRecordWithImage" }, "SubModelType": { @@ -73726,10 +69900,7 @@ } }, "type": "object", - "required": [ - "path_or_prefix", - "model_type" - ], + "required": ["path_or_prefix", "model_type"], "title": "SubmodelDefinition" }, "SubtractInvocation": { @@ -73791,14 +69962,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "math", - "subtract" - ], + "required": ["type", "id"], + "tags": ["math", "subtract"], "title": "Subtract Integers", "type": "object", "version": "1.0.1", @@ -73851,20 +70016,12 @@ "resize_mode": { "default": "just_resize", "description": "The resize mode to use", - "enum": [ - "just_resize", - "crop_resize", - "fill_resize", - "just_resize_simple" - ], + "enum": ["just_resize", "crop_resize", "fill_resize", "just_resize_simple"], "title": "Resize Mode", "type": "string" } }, - "required": [ - "image", - "t2i_adapter_model" - ], + "required": ["image", "t2i_adapter_model"], "title": "T2IAdapterField", "type": "object" }, @@ -73929,13 +70086,8 @@ "input": "any", "orig_required": true, "title": "T2I-Adapter Model", - "ui_model_base": [ - "sd-1", - "sdxl" - ], - "ui_model_type": [ - "t2i_adapter" - ], + "ui_model_base": ["sd-1", "sdxl"], + "ui_model_type": ["t2i_adapter"], "ui_order": -1 }, "weight": { @@ -73986,12 +70138,7 @@ "resize_mode": { "default": "just_resize", "description": "The resize mode applied to the T2I-Adapter input image so that it matches the target output size.", - "enum": [ - "just_resize", - "crop_resize", - "fill_resize", - "just_resize_simple" - ], + "enum": ["just_resize", "crop_resize", "fill_resize", "just_resize_simple"], "field_kind": "input", "input": "any", "orig_default": "just_resize", @@ -74007,14 +70154,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "t2i_adapter", - "control" - ], + "required": ["type", "id"], + "tags": ["t2i_adapter", "control"], "title": "T2I-Adapter - SD1.5, SDXL", "type": "object", "version": "1.0.4", @@ -74079,20 +70220,12 @@ "resize_mode": { "default": "just_resize", "description": "The resize mode to use", - "enum": [ - "just_resize", - "crop_resize", - "fill_resize", - "just_resize_simple" - ], + "enum": ["just_resize", "crop_resize", "fill_resize", "just_resize_simple"], "title": "Resize Mode", "type": "string" } }, - "required": [ - "image", - "t2i_adapter_model" - ], + "required": ["image", "t2i_adapter_model"], "title": "T2IAdapterMetadataField", "type": "object" }, @@ -74114,12 +70247,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "t2i_adapter", - "type", - "type" - ], + "required": ["output_meta", "t2i_adapter", "type", "type"], "title": "T2IAdapterOutput", "type": "object" }, @@ -74418,11 +70546,7 @@ "type": "array" } }, - "required": [ - "tokenizer", - "text_encoder", - "loras" - ], + "required": ["tokenizer", "text_encoder", "loras"], "title": "T5EncoderField", "type": "object" }, @@ -74866,12 +70990,7 @@ "type": "integer" } }, - "required": [ - "top", - "bottom", - "left", - "right" - ], + "required": ["top", "bottom", "left", "right"], "title": "TBLR", "type": "object" }, @@ -75616,9 +71735,7 @@ "type": "string" } }, - "required": [ - "tensor_name" - ], + "required": ["tensor_name"], "title": "TensorField", "type": "object" }, @@ -75690,9 +71807,7 @@ "input": "any", "orig_required": true, "title": "Text LLM Model", - "ui_model_type": [ - "text_llm" - ] + "ui_model_type": ["text_llm"] }, "max_tokens": { "default": 300, @@ -75714,15 +71829,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "llm", - "text", - "prompt" - ], + "required": ["type", "id"], + "tags": ["llm", "text", "prompt"], "title": "Text LLM", "type": "object", "version": "1.0.0", @@ -75882,10 +71990,7 @@ "description": "The amount of overlap with adjacent tiles on each side of this tile." } }, - "required": [ - "coords", - "overlap" - ], + "required": ["coords", "overlap"], "title": "Tile", "type": "object" }, @@ -75943,13 +72048,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "tiles" - ], + "required": ["type", "id"], + "tags": ["tiles"], "title": "Tile to Properties", "type": "object", "version": "1.0.1", @@ -76065,10 +72165,7 @@ "$ref": "#/components/schemas/ImageField" } }, - "required": [ - "tile", - "image" - ], + "required": ["tile", "image"], "title": "TileWithImage", "type": "object" }, @@ -76358,14 +72455,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "upscale", - "denoise" - ], + "required": ["type", "id"], + "tags": ["upscale", "denoise"], "title": "Tiled Multi-Diffusion Denoise - SD1.5, SDXL", "type": "object", "version": "1.0.1", @@ -76388,20 +72479,13 @@ "type": "array" } }, - "required": [ - "transformer", - "loras" - ], + "required": ["transformer", "loras"], "title": "TransformerField", "type": "object" }, "UIComponent": { "description": "The type of UI component to use for a field, used to override the default components, which are\ninferred from the field type.", - "enum": [ - "none", - "textarea", - "slider" - ], + "enum": ["none", "textarea", "slider"], "title": "UIComponent", "type": "string" }, @@ -76466,14 +72550,7 @@ "description": "The node's classification" } }, - "required": [ - "tags", - "title", - "category", - "version", - "node_pack", - "classification" - ], + "required": ["tags", "title", "category", "version", "node_pack", "classification"], "title": "UIConfigBase", "type": "object" }, @@ -76597,11 +72674,7 @@ "description": "FreeU configuration" } }, - "required": [ - "unet", - "scheduler", - "loras" - ], + "required": ["unet", "scheduler", "loras"], "title": "UNetField", "type": "object" }, @@ -76624,12 +72697,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "unet", - "type", - "type" - ], + "required": ["output_meta", "unet", "type", "type"], "title": "UNetOutput", "type": "object" }, @@ -76660,9 +72728,7 @@ } }, "type": "object", - "required": [ - "url" - ], + "required": ["url"], "title": "URLModelSource", "description": "A generic URL point to a checkpoint file." }, @@ -76680,10 +72746,7 @@ } }, "type": "object", - "required": [ - "url_regex", - "token" - ], + "required": ["url_regex", "token"], "title": "URLRegexTokenPair" }, "UninstallNodePackResponse": { @@ -76705,11 +72768,7 @@ } }, "type": "object", - "required": [ - "name", - "success", - "message" - ], + "required": ["name", "success", "message"], "title": "UninstallNodePackResponse", "description": "Response after uninstalling a node pack." }, @@ -76944,14 +73003,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "unsharp_mask" - ], + "required": ["type", "id"], + "tags": ["image", "unsharp_mask"], "title": "Unsharp Mask", "type": "object", "version": "1.2.2", @@ -76979,22 +73032,14 @@ } }, "type": "object", - "required": [ - "affected_boards", - "unstarred_images" - ], + "required": ["affected_boards", "unstarred_images"], "title": "UnstarredImagesResult" }, "UpdateAppGenerationSettingsRequest": { "properties": { "image_subfolder_strategy": { "type": "string", - "enum": [ - "flat", - "date", - "type", - "hash" - ], + "enum": ["flat", "date", "type", "hash"], "title": "Image Subfolder Strategy", "description": "Strategy for organizing images into subfolders." }, @@ -77079,12 +73124,7 @@ } }, "type": "object", - "required": [ - "user_id", - "email", - "created_at", - "updated_at" - ], + "required": ["user_id", "email", "created_at", "updated_at"], "title": "UserDTO", "description": "User data transfer object." }, @@ -77146,9 +73186,7 @@ "type": "array" } }, - "required": [ - "vae" - ], + "required": ["vae"], "title": "VAEField", "type": "object" }, @@ -77198,17 +73236,8 @@ "input": "any", "orig_required": true, "title": "VAE", - "ui_model_base": [ - "sd-1", - "sd-2", - "sdxl", - "sd-3", - "flux", - "flux2" - ], - "ui_model_type": [ - "vae" - ] + "ui_model_base": ["sd-1", "sd-2", "sdxl", "sd-3", "flux", "flux2"], + "ui_model_type": ["vae"] }, "type": { "const": "vae_loader", @@ -77218,14 +73247,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "vae", - "model" - ], + "required": ["type", "id"], + "tags": ["vae", "model"], "title": "VAE Model - SD1.5, SD2, SDXL, SD3, FLUX", "type": "object", "version": "1.0.4", @@ -77252,12 +73275,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "vae", - "type", - "type" - ], + "required": ["output_meta", "vae", "type", "type"], "title": "VAEOutput", "type": "object" }, @@ -78747,11 +74765,7 @@ } }, "type": "object", - "required": [ - "loc", - "msg", - "type" - ], + "required": ["loc", "msg", "type"], "title": "ValidationError" }, "VirtualSubBoardDTO": { @@ -78795,13 +74809,7 @@ } }, "type": "object", - "required": [ - "virtual_board_id", - "board_name", - "date", - "image_count", - "asset_count" - ], + "required": ["virtual_board_id", "board_name", "date", "image_count", "asset_count"], "title": "VirtualSubBoardDTO", "description": "A virtual sub-board computed from image metadata, not stored in the database." }, @@ -78933,11 +74941,7 @@ "type": "string" } }, - "required": [ - "timestamp", - "workflow_id", - "user_id" - ], + "required": ["timestamp", "workflow_id", "user_id"], "title": "WorkflowAccessRevokedEvent", "type": "object" }, @@ -78969,10 +74973,7 @@ } }, "type": "object", - "required": [ - "workflow", - "graph" - ], + "required": ["workflow", "graph"], "title": "WorkflowAndGraphResponse" }, "WorkflowCallCompatibility": { @@ -79000,10 +75001,7 @@ } }, "type": "object", - "required": [ - "is_callable", - "reason" - ], + "required": ["is_callable", "reason"], "title": "WorkflowCallCompatibility" }, "WorkflowCallCompatibilityReason": { @@ -79068,12 +75066,7 @@ }, "status": { "type": "string", - "enum": [ - "waiting_for_child", - "running_child", - "completed", - "failed" - ], + "enum": ["waiting_for_child", "running_child", "completed", "failed"], "title": "Status", "description": "The current workflow-call lifecycle state." }, @@ -79176,12 +75169,7 @@ } }, "type": "object", - "required": [ - "prepared_call_node_id", - "source_call_node_id", - "workflow_id", - "depth" - ], + "required": ["prepared_call_node_id", "source_call_node_id", "workflow_id", "depth"], "title": "WorkflowCallFrame", "description": "Represents one workflow-call frame in a nested call chain." }, @@ -79233,10 +75221,7 @@ }, "WorkflowCategory": { "type": "string", - "enum": [ - "user", - "default" - ], + "enum": ["user", "default"], "title": "WorkflowCategory" }, "WorkflowCreatedEvent": { @@ -79263,12 +75248,7 @@ "type": "boolean" } }, - "required": [ - "timestamp", - "workflow_id", - "user_id", - "is_public" - ], + "required": ["timestamp", "workflow_id", "user_id", "is_public"], "title": "WorkflowCreatedEvent", "type": "object" }, @@ -79296,12 +75276,7 @@ "type": "boolean" } }, - "required": [ - "timestamp", - "workflow_id", - "user_id", - "is_public" - ], + "required": ["timestamp", "workflow_id", "user_id", "is_public"], "title": "WorkflowDeletedEvent", "type": "object" }, @@ -79318,10 +75293,7 @@ } }, "type": "object", - "required": [ - "version", - "category" - ], + "required": ["version", "category"], "title": "WorkflowMeta" }, "WorkflowRecordDTO": { @@ -79394,15 +75366,7 @@ } }, "type": "object", - "required": [ - "workflow_id", - "name", - "created_at", - "updated_at", - "user_id", - "is_public", - "workflow" - ], + "required": ["workflow_id", "name", "created_at", "updated_at", "user_id", "is_public", "workflow"], "title": "WorkflowRecordDTO" }, "WorkflowRecordListItemWithThumbnailDTO": { @@ -79523,13 +75487,7 @@ }, "WorkflowRecordOrderBy": { "type": "string", - "enum": [ - "created_at", - "updated_at", - "opened_at", - "name", - "is_public" - ], + "enum": ["created_at", "updated_at", "opened_at", "name", "is_public"], "title": "WorkflowRecordOrderBy", "description": "The order by options for workflow records" }, @@ -79626,15 +75584,7 @@ } }, "type": "object", - "required": [ - "workflow_id", - "name", - "created_at", - "updated_at", - "user_id", - "is_public", - "workflow" - ], + "required": ["workflow_id", "name", "created_at", "updated_at", "user_id", "is_public", "workflow"], "title": "WorkflowRecordWithThumbnailDTO" }, "WorkflowReturnGetInvocation": { @@ -79698,15 +75648,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "workflow", - "return", - "input" - ], + "required": ["type", "id"], + "tags": ["workflow", "return", "input"], "title": "Get Workflow Return Value", "type": "object", "version": "1.0.0", @@ -79733,12 +75676,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "value", - "type", - "type" - ], + "required": ["output_meta", "value", "type", "type"], "title": "WorkflowReturnGetOutput", "type": "object" }, @@ -79801,15 +75739,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "workflow", - "return", - "output" - ], + "required": ["type", "id"], + "tags": ["workflow", "return", "output"], "title": "Workflow Return", "type": "object", "version": "1.0.0", @@ -79839,12 +75770,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "values", - "type", - "type" - ], + "required": ["output_meta", "values", "type", "type"], "title": "WorkflowReturnOutput", "type": "object" }, @@ -79862,9 +75788,7 @@ "title": "Value" } }, - "required": [ - "key" - ], + "required": ["key"], "title": "WorkflowReturnValueField", "type": "object" }, @@ -79933,15 +75857,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "workflow", - "return", - "output" - ], + "required": ["type", "id"], + "tags": ["workflow", "return", "output"], "title": "Workflow Return Value", "type": "object", "version": "1.0.0", @@ -79969,12 +75886,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "value", - "type", - "type" - ], + "required": ["output_meta", "value", "type", "type"], "title": "WorkflowReturnValueOutput", "type": "object" }, @@ -80007,13 +75919,7 @@ "type": "boolean" } }, - "required": [ - "timestamp", - "workflow_id", - "user_id", - "old_is_public", - "new_is_public" - ], + "required": ["timestamp", "workflow_id", "user_id", "old_is_public", "new_is_public"], "title": "WorkflowUpdatedEvent", "type": "object" }, @@ -80141,9 +76047,7 @@ "description": "The mask associated with this conditioning tensor for regional prompting. Excluded regions should be set to False, included regions should be set to True." } }, - "required": [ - "conditioning_name" - ], + "required": ["conditioning_name"], "title": "ZImageConditioningField", "type": "object" }, @@ -80165,12 +76069,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "conditioning", - "type", - "type" - ], + "required": ["output_meta", "conditioning", "type", "type"], "title": "ZImageConditioningOutput", "type": "object" }, @@ -80211,10 +76110,7 @@ "type": "number" } }, - "required": [ - "image_name", - "control_model" - ], + "required": ["image_name", "control_model"], "title": "ZImageControlField", "type": "object" }, @@ -80279,12 +76175,8 @@ "input": "any", "orig_required": true, "title": "Control Model", - "ui_model_base": [ - "z-image" - ], - "ui_model_type": [ - "controlnet" - ] + "ui_model_base": ["z-image"], + "ui_model_type": ["controlnet"] }, "control_context_scale": { "default": 0.75, @@ -80330,16 +76222,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "z-image", - "control", - "controlnet" - ], + "required": ["type", "id"], + "tags": ["image", "z-image", "control", "controlnet"], "title": "Z-Image ControlNet", "type": "object", "version": "1.1.0", @@ -80365,12 +76249,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "control", - "type", - "type" - ], + "required": ["output_meta", "control", "type", "type"], "title": "ZImageControlOutput", "type": "object" }, @@ -80655,11 +76534,7 @@ "scheduler": { "default": "euler", "description": "Scheduler (sampler) for the denoising process. Euler is the default and recommended. Heun is 2nd-order (better quality, 2x slower). LCM works with Turbo only (not Base).", - "enum": [ - "euler", - "heun", - "lcm" - ], + "enum": ["euler", "heun", "lcm"], "field_kind": "input", "input": "any", "orig_default": "euler", @@ -80680,14 +76555,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "z-image" - ], + "required": ["type", "id"], + "tags": ["image", "z-image"], "title": "Denoise - Z-Image", "type": "object", "version": "1.6.0", @@ -80992,11 +76861,7 @@ "scheduler": { "default": "euler", "description": "Scheduler (sampler) for the denoising process. Euler is the default and recommended. Heun is 2nd-order (better quality, 2x slower). LCM works with Turbo only (not Base).", - "enum": [ - "euler", - "heun", - "lcm" - ], + "enum": ["euler", "heun", "lcm"], "field_kind": "input", "input": "any", "orig_default": "euler", @@ -81017,21 +76882,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "z-image", - "latents", - "denoise", - "txt2img", - "t2i", - "t2l", - "img2img", - "i2i", - "l2l" - ], + "required": ["type", "id"], + "tags": ["z-image", "latents", "denoise", "txt2img", "t2i", "t2l", "img2img", "i2i", "l2l"], "title": "Denoise - Z-Image + Metadata", "type": "object", "version": "1.1.0", @@ -81140,17 +76992,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "image", - "latents", - "vae", - "i2l", - "z-image" - ], + "required": ["type", "id"], + "tags": ["image", "latents", "vae", "i2l", "z-image"], "title": "Image to Latents - Z-Image", "type": "object", "version": "1.1.0", @@ -81259,17 +77102,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "latents", - "image", - "vae", - "l2i", - "z-image" - ], + "required": ["type", "id"], + "tags": ["latents", "image", "vae", "l2i", "z-image"], "title": "Latents to Image - Z-Image", "type": "object", "version": "1.1.0", @@ -81330,12 +77164,8 @@ "orig_default": null, "orig_required": false, "title": "LoRAs", - "ui_model_base": [ - "z-image" - ], - "ui_model_type": [ - "lora" - ] + "ui_model_base": ["z-image"], + "ui_model_type": ["lora"] }, "transformer": { "anyOf": [ @@ -81379,15 +77209,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "lora", - "model", - "z-image" - ], + "required": ["type", "id"], + "tags": ["lora", "model", "z-image"], "title": "Apply LoRA Collection - Z-Image", "type": "object", "version": "1.0.1", @@ -81441,12 +77264,8 @@ "input": "any", "orig_required": true, "title": "LoRA", - "ui_model_base": [ - "z-image" - ], - "ui_model_type": [ - "lora" - ] + "ui_model_base": ["z-image"], + "ui_model_type": ["lora"] }, "weight": { "default": 0.75, @@ -81500,15 +77319,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "lora", - "model", - "z-image" - ], + "required": ["type", "id"], + "tags": ["lora", "model", "z-image"], "title": "Apply LoRA - Z-Image", "type": "object", "version": "1.0.0", @@ -81558,13 +77370,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "transformer", - "qwen3_encoder", - "type", - "type" - ], + "required": ["output_meta", "transformer", "qwen3_encoder", "type", "type"], "title": "ZImageLoRALoaderOutput", "type": "object" }, @@ -81606,12 +77412,8 @@ "input": "direct", "orig_required": true, "title": "Transformer", - "ui_model_base": [ - "z-image" - ], - "ui_model_type": [ - "main" - ] + "ui_model_base": ["z-image"], + "ui_model_type": ["main"] }, "vae_model": { "anyOf": [ @@ -81629,12 +77431,8 @@ "orig_default": null, "orig_required": false, "title": "VAE", - "ui_model_base": [ - "flux" - ], - "ui_model_type": [ - "vae" - ] + "ui_model_base": ["flux"], + "ui_model_type": ["vae"] }, "qwen3_encoder_model": { "anyOf": [ @@ -81652,9 +77450,7 @@ "orig_default": null, "orig_required": false, "title": "Qwen3 Encoder", - "ui_model_type": [ - "qwen3_encoder" - ] + "ui_model_type": ["qwen3_encoder"] }, "qwen3_source_model": { "anyOf": [ @@ -81672,15 +77468,9 @@ "orig_default": null, "orig_required": false, "title": "Qwen3 Source (Diffusers)", - "ui_model_base": [ - "z-image" - ], - "ui_model_format": [ - "diffusers" - ], - "ui_model_type": [ - "main" - ] + "ui_model_base": ["z-image"], + "ui_model_format": ["diffusers"], + "ui_model_type": ["main"] }, "type": { "const": "z_image_model_loader", @@ -81690,15 +77480,8 @@ "type": "string" } }, - "required": [ - "model", - "type", - "id" - ], - "tags": [ - "model", - "z-image" - ], + "required": ["model", "type", "id"], + "tags": ["model", "z-image"], "title": "Main Model - Z-Image", "type": "object", "version": "3.0.0", @@ -81739,14 +77522,7 @@ "type": "string" } }, - "required": [ - "output_meta", - "transformer", - "qwen3_encoder", - "vae", - "type", - "type" - ], + "required": ["output_meta", "transformer", "qwen3_encoder", "vae", "type", "type"], "title": "ZImageModelLoaderOutput", "type": "object" }, @@ -81840,16 +77616,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "conditioning", - "z-image", - "variance", - "seed" - ], + "required": ["type", "id"], + "tags": ["conditioning", "z-image", "variance", "seed"], "title": "Seed Variance Enhancer - Z-Image", "type": "object", "version": "1.0.0", @@ -81945,15 +77713,8 @@ "type": "string" } }, - "required": [ - "type", - "id" - ], - "tags": [ - "prompt", - "conditioning", - "z-image" - ], + "required": ["type", "id"], + "tags": ["prompt", "conditioning", "z-image"], "title": "Prompt - Z-Image", "type": "object", "version": "1.1.0", @@ -81963,10 +77724,7 @@ }, "ZImageVariantType": { "type": "string", - "enum": [ - "turbo", - "zbase" - ], + "enum": ["turbo", "zbase"], "title": "ZImageVariantType", "description": "Z-Image model variants." } @@ -81978,4 +77736,4 @@ } } } -} \ No newline at end of file +} From d3c7bde521387c2e9175d3fadb6d020c313789e7 Mon Sep 17 00:00:00 2001 From: Lincoln Stein Date: Thu, 30 Jul 2026 19:42:34 -0400 Subject: [PATCH 19/25] fix(ui): bump params persist schema to v5 to resolve the dual-v4 collision main and this branch both shipped _version 4 with different new keys (PiD fields vs the flux2 VAE merge + Mistral encoder slot), so a v4 blob written by either parent would fail zParamsState.parse() after the merge and wipe the whole params slice. Keep main's v3->v4 step verbatim and move the flux2 slot merge + Mistral seed to a new v4->v5 step with conditional seeding for both v4 shapes. Also seed the five Wan component fields in v3->v4: they were added to the schema without a version bump while releases were still writing v3 blobs, so a genuine released-build (v6.13.x) v3 blob fails parse() on them today - same wipe, inherited from main. Co-Authored-By: Claude Fable 5 --- .../controlLayers/store/paramsSlice.test.ts | 95 ++++++++++++++++++- .../controlLayers/store/paramsSlice.ts | 41 ++++++-- .../src/features/controlLayers/store/types.ts | 4 +- 3 files changed, 125 insertions(+), 15 deletions(-) diff --git a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.test.ts b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.test.ts index 07d32d30a74..31bd8b9fd4e 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.test.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.test.ts @@ -164,7 +164,7 @@ describe('paramsSliceConfig persisted state migration', () => { // v2 migrates all the way through the current chain (v2 -> v3 adds Qwen fields, // v3 -> v4 adds Krea-2 and PiD fields). - expect(result._version).toBe(4); + expect(result._version).toBe(5); expect(result.qwenImageVaeModel).toBeNull(); expect(result.qwenImageQwenVLEncoderModel).toBeNull(); // Existing params should be preserved @@ -197,7 +197,7 @@ describe('paramsSliceConfig persisted state migration', () => { const result = migrate?.(v3State) as ReturnType & Record; - expect(result._version).toBe(4); + expect(result._version).toBe(5); expect((result.flux2VaeModel as { key: string } | null)?.key).toBe('klein-vae'); // The new standalone dev Mistral encoder slot must be seeded, not left undefined. expect(result.flux2DevMistralEncoderModel).toBeNull(); @@ -231,7 +231,7 @@ describe('paramsSliceConfig persisted state migration', () => { const result = migrate?.(v3State) as ReturnType; - expect(result._version).toBe(4); + expect(result._version).toBe(5); expect(result.krea2VaeModel).toBeNull(); expect(result.krea2Qwen3VlEncoderModel).toBeNull(); expect(result.krea2SeedVarianceEnabled).toBe(false); @@ -245,6 +245,95 @@ describe('paramsSliceConfig persisted state migration', () => { expect(result.dimensions).toMatchObject({ width: 640, height: 896 }); }); + it('seeds the Wan fields for a released-build v3 blob that predates the Wan merge', () => { + expect(migrate).toBeDefined(); + + const initial = getInitialParamsState(); + // Released v6.13.x builds wrote v3 blobs before the Wan fields existed. They're nullable + // with no default, so if the v3 -> v4 step didn't seed them, parse() would throw and the + // whole slice would be wiped on upgrade. + const v3State: Record = { + ...initial, + _version: 3, + positivePrompt: 'a fluffy cat', + }; + delete v3State.wanTransformerLowNoise; + delete v3State.wanComponentSource; + delete v3State.wanVaeModel; + delete v3State.wanT5EncoderModel; + delete v3State.wanGuidanceScaleLowNoise; + delete v3State.flux2VaeModel; + delete v3State.flux2DevMistralEncoderModel; + + const result = migrate?.(v3State) as ReturnType; + + expect(result._version).toBe(5); + expect(result.wanTransformerLowNoise).toBeNull(); + expect(result.wanComponentSource).toBeNull(); + expect(result.wanVaeModel).toBeNull(); + expect(result.wanT5EncoderModel).toBeNull(); + expect(result.wanGuidanceScaleLowNoise).toBeNull(); + expect(result.positivePrompt).toBe('a fluffy cat'); + }); + + it('migrates a v4 blob written by main (PiD fields, no flux2 fields) without wiping it', () => { + expect(migrate).toBeDefined(); + + const initial = getInitialParamsState(); + const kleinVae = { key: 'klein-vae', hash: 'h', name: 'Klein VAE', base: 'flux2', type: 'vae' }; + // main and the FLUX.2 [dev] branch both shipped _version 4 with different keys. A blob from + // main has the PiD fields and the old kleinVaeModel slot, but no flux2VaeModel / + // flux2DevMistralEncoderModel. + const mainV4State: Record = { + ...initial, + _version: 4, + positivePrompt: 'a fluffy cat', + pidMode: 'fit', + kleinVaeModel: kleinVae, + }; + delete mainV4State.flux2VaeModel; + delete mainV4State.flux2DevMistralEncoderModel; + + const result = migrate?.(mainV4State) as ReturnType & Record; + + expect(result._version).toBe(5); + expect((result.flux2VaeModel as { key: string } | null)?.key).toBe('klein-vae'); + expect(result.flux2DevMistralEncoderModel).toBeNull(); + // main's own v4 values must survive untouched. + expect(result.pidMode).toBe('fit'); + expect(result.positivePrompt).toBe('a fluffy cat'); + expect(result.kleinVaeModel).toBeUndefined(); + }); + + it('migrates a v4 blob written by a pre-merge [dev] build (flux2 fields, no PiD fields) without wiping it', () => { + expect(migrate).toBeDefined(); + + const initial = getInitialParamsState(); + const flux2Vae = { key: 'flux2-vae', hash: 'h', name: 'FLUX.2 VAE', base: 'flux2', type: 'vae' }; + const devV4State: Record = { + ...initial, + _version: 4, + positivePrompt: 'a fluffy cat', + flux2VaeModel: flux2Vae, + flux2DevMistralEncoderModel: null, + }; + delete devV4State.pidMode; + delete devV4State.pidDecoderModel; + delete devV4State.gemma2EncoderModel; + delete devV4State.pidSteps; + + const result = migrate?.(devV4State) as ReturnType & Record; + + expect(result._version).toBe(5); + // The branch's own v4 values must survive untouched. + expect((result.flux2VaeModel as { key: string } | null)?.key).toBe('flux2-vae'); + expect(result.pidMode).toBe('off'); + expect(result.pidDecoderModel).toBeNull(); + expect(result.gemma2EncoderModel).toBeNull(); + expect(result.pidSteps).toBe(4); + expect(result.positivePrompt).toBe('a fluffy cat'); + }); + it('migrates old positive prompt history entries to prompt pairs', () => { expect(migrate).toBeDefined(); diff --git a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts index ef08d9b0fa8..be92ecdd5cf 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts @@ -972,12 +972,12 @@ export const paramsSliceConfig: SliceConfig = { } if (state._version === 3) { - // v3 -> v4, add Krea-2 standalone component and conditioning enhancer fields, the - // PiD (Pixel Diffusion Decoder) fields, and merge the separate Klein / [dev] FLUX.2 VAE - // slots into one shared flux2VaeModel (both drew from the same FLUX.2 VAE pool). Keep - // whichever was set. Also seed the new standalone [dev] Mistral encoder slot — it's - // nullable with no default, so a genuine v3 blob without the key fails - // zParamsState.parse() otherwise. + // v3 -> v4, add Krea-2 standalone component and conditioning enhancer fields and the + // PiD (Pixel Diffusion Decoder) fields. Also seed the Wan component fields — they were + // added to the schema without a version bump while releases were still writing v3 blobs, + // and they're nullable with no default, so a genuine released-build v3 blob without them + // fails zParamsState.parse() and wipes the whole slice. Seed only when missing: dev-build + // v3 blobs written after the Wan merge already carry (possibly non-null) values. state._version = 4; state.krea2VaeModel = null; state.krea2Qwen3VlEncoderModel = null; @@ -987,14 +987,35 @@ export const paramsSliceConfig: SliceConfig = { state.krea2RebalanceEnabled = false; state.krea2RebalanceMultiplier = 4; state.krea2RebalanceWeights = '1.0,1.0,1.0,1.0,1.0,1.0,1.0,2.5,5.0,1.1,4.0,1.0'; - state.flux2VaeModel = state.kleinVaeModel ?? state.flux2DevVaeModel ?? null; - state.flux2DevMistralEncoderModel = null; - delete state.kleinVaeModel; - delete state.flux2DevVaeModel; state.pidMode = 'off'; state.pidDecoderModel = null; state.gemma2EncoderModel = null; state.pidSteps = 4; + state.wanTransformerLowNoise = state.wanTransformerLowNoise ?? null; + state.wanComponentSource = state.wanComponentSource ?? null; + state.wanVaeModel = state.wanVaeModel ?? null; + state.wanT5EncoderModel = state.wanT5EncoderModel ?? null; + state.wanGuidanceScaleLowNoise = state.wanGuidanceScaleLowNoise ?? null; + } + + if (state._version === 4) { + // v4 -> v5, merge the separate Klein / [dev] FLUX.2 VAE slots into one shared + // flux2VaeModel (both drew from the same FLUX.2 VAE pool — keep whichever was set) and + // seed the new standalone [dev] Mistral encoder slot. Both parents of the FLUX.2 [dev] + // merge shipped incompatible schemas under _version 4 (main added the PiD fields; the + // [dev] branch added the flux2 fields), so a v4 blob may be missing either side's keys — + // every seed here is conditional, and the PiD keys are re-seeded for blobs written by + // pre-merge [dev] builds. All are nullable-with-no-default, so any missing key would + // fail zParamsState.parse() and wipe the whole slice. + state._version = 5; + state.flux2VaeModel = state.flux2VaeModel ?? state.kleinVaeModel ?? state.flux2DevVaeModel ?? null; + state.flux2DevMistralEncoderModel = state.flux2DevMistralEncoderModel ?? null; + delete state.kleinVaeModel; + delete state.flux2DevVaeModel; + state.pidMode = state.pidMode ?? 'off'; + state.pidDecoderModel = state.pidDecoderModel ?? null; + state.gemma2EncoderModel = state.gemma2EncoderModel ?? null; + state.pidSteps = state.pidSteps ?? 4; } return zParamsState.parse(state); diff --git a/invokeai/frontend/web/src/features/controlLayers/store/types.ts b/invokeai/frontend/web/src/features/controlLayers/store/types.ts index 63ee6cf9238..55d674ac72d 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/types.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/types.ts @@ -816,7 +816,7 @@ const zPidMode = z.enum(['off', 'fit', 'native']); export type PidMode = z.infer; export const zParamsState = z.object({ - _version: z.literal(4), + _version: z.literal(5), maskBlur: z.number(), maskBlurMethod: zParameterMaskBlurMethod, canvasCoherenceMode: zParameterCanvasCoherenceMode, @@ -947,7 +947,7 @@ export const zParamsState = z.object({ }); export type ParamsState = z.infer; export const getInitialParamsState = (): ParamsState => ({ - _version: 4, + _version: 5, maskBlur: 16, maskBlurMethod: 'box', canvasCoherenceMode: 'Gaussian Blur', From f7a3bc05215fc898adbef79d5e2850407c294f4a Mon Sep 17 00:00:00 2001 From: Alexander Eichhorn Date: Fri, 31 Jul 2026 05:22:19 +0200 Subject: [PATCH 20/25] Chore openapi --- invokeai/frontend/web/openapi.json | 7851 ++++++---------------------- 1 file changed, 1458 insertions(+), 6393 deletions(-) diff --git a/invokeai/frontend/web/openapi.json b/invokeai/frontend/web/openapi.json index f17140b0be5..190cefa4cdc 100644 --- a/invokeai/frontend/web/openapi.json +++ b/invokeai/frontend/web/openapi.json @@ -8,9 +8,7 @@ "paths": { "/api/v1/auth/status": { "get": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "Get Setup Status", "description": "Check if initial administrator setup is required.\n\nReturns:\n SetupStatusResponse indicating whether setup is needed and multiuser mode status", "operationId": "get_setup_status_api_v1_auth_status_get", @@ -30,9 +28,7 @@ }, "/api/v1/auth/login": { "post": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "Login", "description": "Authenticate user and return access token.\n\nArgs:\n request: Login credentials (email and password)\n\nReturns:\n LoginResponse containing JWT token and user information\n\nRaises:\n HTTPException: 401 if credentials are invalid or user is inactive\n HTTPException: 403 if multiuser mode is disabled", "operationId": "login_api_v1_auth_login_post", @@ -73,9 +69,7 @@ }, "/api/v1/auth/logout": { "post": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "Logout", "description": "Logout current user.\n\nCurrently a no-op since we use stateless JWT tokens. For token invalidation in\nfuture implementations, consider:\n- Token blacklist: Store invalidated tokens in Redis/database with expiration\n- Token versioning: Add version field to user record, increment on logout\n- Short-lived tokens: Use refresh token pattern with token rotation\n- Session storage: Track active sessions server-side for revocation\n\nArgs:\n current_user: The authenticated user (validates token)\n\nReturns:\n LogoutResponse indicating success", "operationId": "logout_api_v1_auth_logout_post", @@ -100,9 +94,7 @@ }, "/api/v1/auth/media-cookie": { "post": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "Refresh Media Cookie", "description": "Re-issue the media cookie from a valid Bearer token.\n\nThe media cookie is normally set at login, but a session can hold a valid JWT\nwithout it \u2014 the session may predate the cookie's introduction, or the cookie\nmay have been cleared while the JWT (in client storage) survived. Media\nelements can't send Authorization headers, so such sessions silently fail to\nload videos (black player) while every other API call works. The frontend\ncalls this on app load so an existing session self-heals without re-login.\n\nThe cookie's lifetime is clamped to the presented token's remaining validity \u2014\nit is the same JWT, so a longer-lived cookie would just yield 401s after\nexpiry anyway.\n\nReturns:\n MediaCookieResponse indicating the cookie was set. In single-user mode the\n media routes don't require authentication, so this is a successful no-op.\n\nRaises:\n HTTPException: 401 if the Bearer token is missing, invalid, or expired, or\n the user no longer exists or is inactive (raised by the auth dependency).", "operationId": "refresh_media_cookie_api_v1_auth_media_cookie_post", @@ -127,9 +119,7 @@ }, "/api/v1/auth/me": { "get": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "Get Current User Info", "description": "Get current authenticated user's information.\n\nArgs:\n current_user: The authenticated user's token data\n\nReturns:\n UserDTO containing user information\n\nRaises:\n HTTPException: 404 if user is not found (should not happen normally)", "operationId": "get_current_user_info_api_v1_auth_me_get", @@ -152,9 +142,7 @@ ] }, "patch": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "Update Current User", "description": "Update the current user's own profile.\n\nTo change the password, both ``current_password`` and ``new_password`` must\nbe provided. The current password is verified before the change is applied.\n\nArgs:\n request: Profile fields to update\n current_user: The authenticated user\n\nReturns:\n The updated user\n\nRaises:\n HTTPException: 400 if current password is incorrect or new password is weak\n HTTPException: 404 if user not found", "operationId": "update_current_user_api_v1_auth_me_patch", @@ -200,9 +188,7 @@ }, "/api/v1/auth/setup": { "post": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "Setup Admin", "description": "Set up initial administrator account.\n\nThis endpoint can only be called once, when no admin user exists. It creates\nthe first admin user for the system.\n\nArgs:\n request: Admin account details (email, display_name, password)\n\nReturns:\n SetupResponse containing the created admin user\n\nRaises:\n HTTPException: 400 if admin already exists or password is weak\n HTTPException: 403 if multiuser mode is disabled", "operationId": "setup_admin_api_v1_auth_setup_post", @@ -243,9 +229,7 @@ }, "/api/v1/auth/generate-password": { "get": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "Generate Password", "description": "Generate a strong random password.\n\nReturns a cryptographically secure random password of 16 characters\ncontaining uppercase, lowercase, digits, and punctuation.", "operationId": "generate_password_api_v1_auth_generate_password_get", @@ -270,9 +254,7 @@ }, "/api/v1/auth/users": { "get": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "List Users", "description": "List all users. Requires admin privileges.\n\nThe internal 'system' user (created for backward compatibility) is excluded\nfrom the results since it cannot be managed through this interface.\n\nReturns:\n List of all real users (system user excluded)", "operationId": "list_users_api_v1_auth_users_get", @@ -299,9 +281,7 @@ ] }, "post": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "Create User", "description": "Create a new user. Requires admin privileges.\n\nArgs:\n request: New user details\n\nReturns:\n The created user\n\nRaises:\n HTTPException: 400 if email already exists or password is weak", "operationId": "create_user_api_v1_auth_users_post", @@ -347,9 +327,7 @@ }, "/api/v1/auth/users/{user_id}": { "get": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "Get User", "description": "Get a user by ID. Requires admin privileges.\n\nArgs:\n user_id: The user ID\n\nReturns:\n The user\n\nRaises:\n HTTPException: 404 if user not found", "operationId": "get_user_api_v1_auth_users__user_id__get", @@ -395,9 +373,7 @@ } }, "patch": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "Update User", "description": "Update a user. Requires admin privileges.\n\nArgs:\n user_id: The user ID\n request: Fields to update\n\nReturns:\n The updated user\n\nRaises:\n HTTPException: 400 if password is weak\n HTTPException: 404 if user not found", "operationId": "update_user_api_v1_auth_users__user_id__patch", @@ -454,9 +430,7 @@ } }, "delete": { - "tags": [ - "authentication" - ], + "tags": ["authentication"], "summary": "Delete User", "description": "Delete a user. Requires admin privileges.\n\nAdmins can delete any user including other admins, but cannot delete the last\nremaining admin.\n\nArgs:\n user_id: The user ID\n\nRaises:\n HTTPException: 400 if attempting to delete the last admin\n HTTPException: 404 if user not found", "operationId": "delete_user_api_v1_auth_users__user_id__delete", @@ -497,9 +471,7 @@ }, "/api/v1/utilities/dynamicprompts": { "post": { - "tags": [ - "utilities" - ], + "tags": ["utilities"], "summary": "Parse Dynamicprompts", "description": "Creates a batch process", "operationId": "parse_dynamicprompts", @@ -544,9 +516,7 @@ }, "/api/v1/utilities/expand-prompt": { "post": { - "tags": [ - "utilities" - ], + "tags": ["utilities"], "summary": "Expand Prompt", "description": "Expand a brief prompt into a detailed image generation prompt using a text LLM.", "operationId": "expand_prompt", @@ -591,9 +561,7 @@ }, "/api/v1/utilities/image-to-prompt": { "post": { - "tags": [ - "utilities" - ], + "tags": ["utilities"], "summary": "Image To Prompt", "description": "Generate a descriptive prompt from an image using a vision-language model.", "operationId": "image_to_prompt", @@ -638,9 +606,7 @@ }, "/api/v2/models/": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "List Model Records", "description": "Get a list of models.", "operationId": "list_model_records", @@ -774,9 +740,7 @@ }, "/api/v2/models/missing": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "List Missing Models", "description": "Get models whose files are missing from disk.\n\nThese are models that have database entries but their corresponding\nweight files have been deleted externally (not via Model Manager).\n\nAvailable to any authenticated user, not just admins: the frontend's model hooks subtract this\nset from the model list so unusable models are kept out of the generation dropdowns.", "operationId": "list_missing_models", @@ -801,9 +765,7 @@ }, "/api/v2/models/get_by_attrs": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Get Model Records By Attrs", "description": "Gets a model by its attributes. The main use of this route is to provide backwards compatibility with the old\nmodel manager, which identified models by a combination of name, base and type.", "operationId": "get_model_records_by_attrs", @@ -1227,9 +1189,7 @@ }, "/api/v2/models/get_by_hash": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Get Model Records By Hash", "description": "Gets a model by its hash. This is useful for recalling models that were deleted and reinstalled,\nas the hash remains stable across reinstallations while the key (UUID) changes.", "operationId": "get_model_records_by_hash", @@ -1633,9 +1593,7 @@ }, "/api/v2/models/i/{key}": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Get Model Record", "description": "Get a model record", "operationId": "get_model_record", @@ -2061,9 +2019,7 @@ } }, "patch": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Update Model Record", "description": "Update a model's config.", "operationId": "update_model_record", @@ -2515,9 +2471,7 @@ } }, "delete": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Delete Model", "description": "Delete model record from database.\n\nThe configuration record will be removed. The corresponding weights files will be\ndeleted as well if they reside within the InvokeAI \"models\" directory.", "operationId": "delete_model", @@ -2561,9 +2515,7 @@ }, "/api/v2/models/i/{key}/reidentify": { "post": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Reidentify Model", "description": "Attempt to reidentify a model by re-probing its weights file.", "operationId": "reidentify_model", @@ -2991,9 +2943,7 @@ }, "/api/v2/models/scan_folder": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Scan For Models", "operationId": "scan_for_models", "security": [ @@ -3047,9 +2997,7 @@ }, "/api/v2/models/hugging_face": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Get Hugging Face Models", "operationId": "get_hugging_face_models", "security": [ @@ -3099,9 +3047,7 @@ }, "/api/v2/models/i/{key}/image": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Get Model Image", "description": "Gets an image file that previews the model", "operationId": "get_model_image", @@ -3146,9 +3092,7 @@ } }, "patch": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Update Model Image", "operationId": "update_model_image", "security": [ @@ -3204,9 +3148,7 @@ } }, "delete": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Delete Model Image", "operationId": "delete_model_image", "security": [ @@ -3249,9 +3191,7 @@ }, "/api/v2/models/i/bulk_delete": { "post": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Bulk Delete Models", "description": "Delete multiple model records from database.\n\nThe configuration records will be removed. The corresponding weights files will be\ndeleted as well if they reside within the InvokeAI \"models\" directory.\nReturns a list of successfully deleted keys and failed deletions with error messages.", "operationId": "bulk_delete_models", @@ -3297,9 +3237,7 @@ }, "/api/v2/models/i/bulk_reidentify": { "post": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Bulk Reidentify Models", "description": "Reidentify multiple models by re-probing their weights files.\n\nReturns a list of successfully reidentified keys and failed reidentifications with error messages.", "operationId": "bulk_reidentify_models", @@ -3345,9 +3283,7 @@ }, "/api/v2/models/install": { "post": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Install Model", "description": "Install a model using a string identifier.\n\n`source` can be any of the following.\n\n1. A path on the local filesystem ('C:\\users\\fred\\model.safetensors')\n2. A Url pointing to a single downloadable model file\n3. A HuggingFace repo_id with any of the following formats:\n - model/name\n - model/name:fp16:vae\n - model/name::vae -- use default precision\n - model/name:fp16:path/to/model.safetensors\n - model/name::path/to/model.safetensors\n\n`config` is a ModelRecordChanges object. Fields in this object will override\nthe ones that are probed automatically. Pass an empty object to accept\nall the defaults.\n\n`access_token` is an optional access token for use with Urls that require\nauthentication.\n\nModels will be downloaded, probed, configured and installed in a\nseries of background threads. The return object has `status` attribute\nthat can be used to monitor progress.\n\nSee the documentation for `import_model_record` for more information on\ninterpreting the job information returned by this route.", "operationId": "install_model", @@ -3456,9 +3392,7 @@ } }, "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "List Model Installs", "description": "Return the list of model install jobs.\n\nInstall jobs have a numeric `id`, a `status`, and other fields that provide information on\nthe nature of the job and its progress. The `status` is one of:\n\n* \"waiting\" -- Job is waiting in the queue to run\n* \"downloading\" -- Model file(s) are downloading\n* \"running\" -- Model has downloaded and the model probing and registration process is running\n* \"paused\" -- Job is paused and can be resumed\n* \"completed\" -- Installation completed successfully\n* \"error\" -- An error occurred. Details will be in the \"error_type\" and \"error\" fields.\n* \"cancelled\" -- Job was cancelled before completion.\n\nOnce completed, information about the model such as its size, base\nmodel and type can be retrieved from the `config_out` field. For multi-file models such as diffusers,\ninformation on individual files can be retrieved from `download_parts`.\n\nSee the example and schema below for more information.", "operationId": "list_model_installs", @@ -3485,9 +3419,7 @@ } }, "delete": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Prune Model Install Jobs", "description": "Prune all completed and errored jobs from the install job list.", "operationId": "prune_model_install_jobs", @@ -3516,9 +3448,7 @@ }, "/api/v2/models/install/huggingface": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Install Hugging Face Model", "description": "Install a Hugging Face model using a string identifier.", "operationId": "install_hugging_face_model", @@ -3572,9 +3502,7 @@ }, "/api/v2/models/install/{id}": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Get Model Install Job", "description": "Return model install job corresponding to the given source. See the documentation for 'List Model Install Jobs'\nfor information on the format of the return value.", "operationId": "get_model_install_job", @@ -3623,9 +3551,7 @@ } }, "delete": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Cancel Model Install Job", "description": "Cancel the model install job(s) corresponding to the given job ID.", "operationId": "cancel_model_install_job", @@ -3674,9 +3600,7 @@ }, "/api/v2/models/install/{id}/pause": { "post": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Pause Model Install Job", "description": "Pause the model install job corresponding to the given job ID.", "operationId": "pause_model_install_job", @@ -3727,9 +3651,7 @@ }, "/api/v2/models/install/{id}/resume": { "post": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Resume Model Install Job", "description": "Resume a paused model install job corresponding to the given job ID.", "operationId": "resume_model_install_job", @@ -3780,9 +3702,7 @@ }, "/api/v2/models/install/{id}/restart_failed": { "post": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Restart Failed Model Install Job", "description": "Restart failed or non-resumable file downloads for the given job.", "operationId": "restart_failed_model_install_job", @@ -3833,9 +3753,7 @@ }, "/api/v2/models/install/{id}/restart_file": { "post": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Restart Model Install File", "description": "Restart a specific file download for the given job.", "operationId": "restart_model_install_file", @@ -3900,9 +3818,7 @@ }, "/api/v2/models/convert/{key}": { "put": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Convert Model", "description": "Permanently convert a model into diffusers format, replacing the safetensors version.\nNote that during the conversion process the key and model hash will change.\nThe return value is the model configuration for the converted model.", "operationId": "convert_model", @@ -4333,9 +4249,7 @@ }, "/api/v2/models/starter_models": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Get Starter Models", "operationId": "get_starter_models", "responses": { @@ -4359,9 +4273,7 @@ }, "/api/v2/models/stats": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Get model manager RAM cache performance statistics.", "description": "Return performance statistics on the model manager's RAM cache. In multi-GPU mode there is\none cache per generation device; their statistics are aggregated. Will return null if no models\nhave been loaded.", "operationId": "get_stats", @@ -4394,9 +4306,7 @@ }, "/api/v2/models/empty_model_cache": { "post": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Empty Model Cache", "description": "Drop all models from the model cache to free RAM/VRAM. 'Locked' models that are in active use will not be dropped.", "operationId": "empty_model_cache", @@ -4419,9 +4329,7 @@ }, "/api/v2/models/hf_login": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Get Hf Login Status", "operationId": "get_hf_login_status", "responses": { @@ -4443,9 +4351,7 @@ ] }, "post": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Do Hf Login", "operationId": "do_hf_login", "requestBody": { @@ -4487,9 +4393,7 @@ ] }, "delete": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Reset Hf Token", "operationId": "reset_hf_token", "responses": { @@ -4513,9 +4417,7 @@ }, "/api/v2/models/sync/orphaned": { "get": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Get Orphaned Models", "description": "Find orphaned model directories.\n\nOrphaned models are directories in the models folder that contain model files\nbut are not referenced in the database. This can happen when models are deleted\nfrom the database but the files remain on disk.\n\nReturns:\n List of orphaned model directory information", "operationId": "get_orphaned_models", @@ -4542,9 +4444,7 @@ ] }, "delete": { - "tags": [ - "model_manager" - ], + "tags": ["model_manager"], "summary": "Delete Orphaned Models", "description": "Delete specified orphaned model directories.\n\nArgs:\n request: Request containing list of relative paths to delete\n\nReturns:\n Response indicating which paths were deleted and which had errors", "operationId": "delete_orphaned_models", @@ -4589,9 +4489,7 @@ }, "/api/v1/download_queue/": { "get": { - "tags": [ - "download_queue" - ], + "tags": ["download_queue"], "summary": "List Downloads", "description": "Get a list of active and inactive jobs.", "operationId": "list_downloads", @@ -4618,9 +4516,7 @@ ] }, "patch": { - "tags": [ - "download_queue" - ], + "tags": ["download_queue"], "summary": "Prune Downloads", "description": "Prune completed and errored jobs.", "operationId": "prune_downloads", @@ -4649,9 +4545,7 @@ }, "/api/v1/download_queue/i/": { "post": { - "tags": [ - "download_queue" - ], + "tags": ["download_queue"], "summary": "Download", "description": "Download the source URL to the file or directory indicted in dest.", "operationId": "download", @@ -4696,9 +4590,7 @@ }, "/api/v1/download_queue/i/{id}": { "get": { - "tags": [ - "download_queue" - ], + "tags": ["download_queue"], "summary": "Get Download Job", "description": "Get a download job using its ID.", "operationId": "get_download_job", @@ -4747,9 +4639,7 @@ } }, "delete": { - "tags": [ - "download_queue" - ], + "tags": ["download_queue"], "summary": "Cancel Download Job", "description": "Cancel a download job using its ID.", "operationId": "cancel_download_job", @@ -4801,9 +4691,7 @@ }, "/api/v1/download_queue/i": { "delete": { - "tags": [ - "download_queue" - ], + "tags": ["download_queue"], "summary": "Cancel All Download Jobs", "description": "Cancel all download jobs.", "operationId": "cancel_all_download_jobs", @@ -4829,9 +4717,7 @@ }, "/api/v1/image_moves/start": { "post": { - "tags": [ - "image_moves" - ], + "tags": ["image_moves"], "summary": "Start Image Move", "operationId": "start_image_move", "responses": { @@ -4855,9 +4741,7 @@ }, "/api/v1/image_moves/recover": { "post": { - "tags": [ - "image_moves" - ], + "tags": ["image_moves"], "summary": "Start Image Move Recovery", "operationId": "start_image_move_recovery", "responses": { @@ -4881,9 +4765,7 @@ }, "/api/v1/image_moves/status": { "get": { - "tags": [ - "image_moves" - ], + "tags": ["image_moves"], "summary": "Get Image Move Status", "operationId": "get_image_move_status", "responses": { @@ -4907,9 +4789,7 @@ }, "/api/v1/images/upload": { "post": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Upload Image", "description": "Uploads an image for the current user", "operationId": "upload_image", @@ -5035,9 +4915,7 @@ }, "/api/v1/images/": { "post": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Create Image Upload Entry", "description": "Uploads an image from a URL, not implemented", "operationId": "create_image_upload_entry", @@ -5080,9 +4958,7 @@ } }, "get": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "List Image Dtos", "description": "Gets a list of image DTOs for the current user", "operationId": "list_image_dtos", @@ -5259,9 +5135,7 @@ }, "/api/v1/images/i/{image_name}": { "delete": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Delete Image", "description": "Deletes an image", "operationId": "delete_image", @@ -5307,9 +5181,7 @@ } }, "patch": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Update Image", "description": "Updates an image", "operationId": "update_image", @@ -5366,9 +5238,7 @@ } }, "get": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Get Image Dto", "description": "Gets an image's DTO", "operationId": "get_image_dto", @@ -5416,9 +5286,7 @@ }, "/api/v1/images/intermediates": { "get": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Get Intermediates Count", "description": "Gets the count of intermediate images. Non-admin users only see their own intermediates.", "operationId": "get_intermediates_count", @@ -5442,9 +5310,7 @@ ] }, "delete": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Clear Intermediates", "description": "Clears all intermediates. Requires admin.", "operationId": "clear_intermediates", @@ -5470,9 +5336,7 @@ }, "/api/v1/images/i/{image_name}/metadata": { "get": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Get Image Metadata", "description": "Gets an image's metadata", "operationId": "get_image_metadata", @@ -5528,9 +5392,7 @@ }, "/api/v1/images/i/{image_name}/workflow": { "get": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Get Image Workflow", "operationId": "get_image_workflow", "security": [ @@ -5577,9 +5439,7 @@ }, "/api/v1/images/i/{image_name}/full": { "head": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Get Image Full", "description": "Gets a full-resolution image file.\n\nBrowser media requests authenticate with the path-scoped HttpOnly cookie set at login.\nReturns 409 while image storage maintenance is active.", "operationId": "get_image_full_head", @@ -5640,9 +5500,7 @@ } }, "get": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Get Image Full", "description": "Gets a full-resolution image file.\n\nBrowser media requests authenticate with the path-scoped HttpOnly cookie set at login.\nReturns 409 while image storage maintenance is active.", "operationId": "get_image_full", @@ -5705,9 +5563,7 @@ }, "/api/v1/images/i/{image_name}/thumbnail": { "get": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Get Image Thumbnail", "description": "Gets a thumbnail image file.\n\nBrowser media requests authenticate with the path-scoped HttpOnly cookie set at login.\nReturns 409 while image storage maintenance is active.", "operationId": "get_image_thumbnail", @@ -5770,9 +5626,7 @@ }, "/api/v1/images/i/{image_name}/urls": { "get": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Get Image Urls", "description": "Gets an image and thumbnail URL", "operationId": "get_image_urls", @@ -5820,9 +5674,7 @@ }, "/api/v1/images/delete": { "post": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Delete Images From List", "operationId": "delete_images_from_list", "requestBody": { @@ -5866,9 +5718,7 @@ }, "/api/v1/images/uncategorized": { "delete": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Delete Uncategorized Images", "description": "Deletes all uncategorized images owned by the current user (or all if admin)", "operationId": "delete_uncategorized_images", @@ -5893,9 +5743,7 @@ }, "/api/v1/images/star": { "post": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Star Images In List", "operationId": "star_images_in_list", "requestBody": { @@ -5939,9 +5787,7 @@ }, "/api/v1/images/unstar": { "post": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Unstar Images In List", "operationId": "unstar_images_in_list", "requestBody": { @@ -5985,9 +5831,7 @@ }, "/api/v1/images/download": { "post": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Download Images From List", "operationId": "download_images_from_list", "requestBody": { @@ -6030,9 +5874,7 @@ }, "/api/v1/images/download/{bulk_download_item_name}": { "get": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Get Bulk Download Item", "description": "Gets a bulk download zip file.\n\nRequires authentication. The caller must be the user who initiated the\ndownload (tracked by the bulk download service) or an admin.", "operationId": "get_bulk_download_item", @@ -6079,9 +5921,7 @@ }, "/api/v1/images/names": { "get": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Get Image Names", "description": "Gets ordered list of image names with metadata for optimistic updates", "operationId": "get_image_names", @@ -6234,9 +6074,7 @@ }, "/api/v1/images/images_by_names": { "post": { - "tags": [ - "images" - ], + "tags": ["images"], "summary": "Get Images By Names", "description": "Gets image DTOs for the specified image names. Maintains order of input names.", "operationId": "get_images_by_names", @@ -6285,9 +6123,7 @@ }, "/api/v1/videos/upload": { "post": { - "tags": [ - "videos" - ], + "tags": ["videos"], "summary": "Upload Video", "description": "Uploads a video for the current user.", "operationId": "upload_video", @@ -6394,9 +6230,7 @@ }, "/api/v1/videos/i/{video_name}": { "delete": { - "tags": [ - "videos" - ], + "tags": ["videos"], "summary": "Delete Video", "operationId": "delete_video", "security": [ @@ -6441,9 +6275,7 @@ } }, "patch": { - "tags": [ - "videos" - ], + "tags": ["videos"], "summary": "Update Video", "operationId": "update_video", "security": [ @@ -6499,9 +6331,7 @@ } }, "get": { - "tags": [ - "videos" - ], + "tags": ["videos"], "summary": "Get Video Dto", "operationId": "get_video_dto", "security": [ @@ -6548,9 +6378,7 @@ }, "/api/v1/videos/delete": { "post": { - "tags": [ - "videos" - ], + "tags": ["videos"], "summary": "Delete Videos From List", "operationId": "delete_videos_from_list", "requestBody": { @@ -6594,9 +6422,7 @@ }, "/api/v1/videos/uncategorized": { "delete": { - "tags": [ - "videos" - ], + "tags": ["videos"], "summary": "Delete Uncategorized Videos", "description": "Deletes all uncategorized videos owned by the current user (or all if admin).\n\nMirrors ``delete_uncategorized_images`` so the \"Delete All Uncategorized\nImages/Videos\" board action covers both media kinds.", "operationId": "delete_uncategorized_videos", @@ -6621,9 +6447,7 @@ }, "/api/v1/videos/i/{video_name}/metadata": { "get": { - "tags": [ - "videos" - ], + "tags": ["videos"], "summary": "Get Video Metadata", "operationId": "get_video_metadata", "security": [ @@ -6678,9 +6502,7 @@ }, "/api/v1/videos/i/{video_name}/workflow": { "get": { - "tags": [ - "videos" - ], + "tags": ["videos"], "summary": "Get Video Workflow", "description": "Gets the workflow and graph saved with a generated video (mirrors the image route).", "operationId": "get_video_workflow", @@ -6728,9 +6550,7 @@ }, "/api/v1/videos/i/{video_name}/full": { "head": { - "tags": [ - "videos" - ], + "tags": ["videos"], "summary": "Get Video Full", "description": "Serves the video file with HTTP Range support so HTML5