diff --git a/invokeai/app/invocations/cogview4_model_loader.py b/invokeai/app/invocations/cogview4_model_loader.py
index 28c965cf8e5..9db4f3c0537 100644
--- a/invokeai/app/invocations/cogview4_model_loader.py
+++ b/invokeai/app/invocations/cogview4_model_loader.py
@@ -5,7 +5,7 @@
invocation,
invocation_output,
)
-from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField, UIType
+from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField
from invokeai.app.invocations.model import (
GlmEncoderField,
ModelIdentifierField,
@@ -14,6 +14,7 @@
)
from invokeai.app.services.shared.invocation_context import InvocationContext
from invokeai.backend.model_manager.config import SubModelType
+from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType
@invocation_output("cogview4_model_loader_output")
@@ -38,8 +39,9 @@ class CogView4ModelLoaderInvocation(BaseInvocation):
model: ModelIdentifierField = InputField(
description=FieldDescriptions.cogview4_model,
- ui_type=UIType.CogView4MainModel,
input=Input.Direct,
+ ui_model_base=BaseModelType.CogView4,
+ ui_model_type=ModelType.Main,
)
def invoke(self, context: InvocationContext) -> CogView4ModelLoaderOutput:
diff --git a/invokeai/app/invocations/controlnet.py b/invokeai/app/invocations/controlnet.py
index 8b8bf500c56..d1878d967e0 100644
--- a/invokeai/app/invocations/controlnet.py
+++ b/invokeai/app/invocations/controlnet.py
@@ -16,7 +16,6 @@
ImageField,
InputField,
OutputField,
- UIType,
)
from invokeai.app.invocations.model import ModelIdentifierField
from invokeai.app.invocations.primitives import ImageOutput
@@ -28,6 +27,7 @@
heuristic_resize_fast,
)
from invokeai.backend.image_util.util import np_to_pil, pil_to_np
+from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType
class ControlField(BaseModel):
@@ -63,13 +63,17 @@ class ControlOutput(BaseInvocationOutput):
control: ControlField = OutputField(description=FieldDescriptions.control)
-@invocation("controlnet", title="ControlNet - SD1.5, SDXL", tags=["controlnet"], category="controlnet", version="1.1.3")
+@invocation(
+ "controlnet", title="ControlNet - SD1.5, SD2, SDXL", tags=["controlnet"], category="controlnet", version="1.1.3"
+)
class ControlNetInvocation(BaseInvocation):
"""Collects ControlNet info to pass to other nodes"""
image: ImageField = InputField(description="The control image")
control_model: ModelIdentifierField = InputField(
- description=FieldDescriptions.controlnet_model, ui_type=UIType.ControlNetModel
+ description=FieldDescriptions.controlnet_model,
+ ui_model_base=[BaseModelType.StableDiffusion1, BaseModelType.StableDiffusion2, BaseModelType.StableDiffusionXL],
+ ui_model_type=ModelType.ControlNet,
)
control_weight: Union[float, List[float]] = InputField(
default=1.0, ge=-1, le=2, description="The weight given to the ControlNet"
diff --git a/invokeai/app/invocations/fields.py b/invokeai/app/invocations/fields.py
index b21d1f425bc..56e7de64901 100644
--- a/invokeai/app/invocations/fields.py
+++ b/invokeai/app/invocations/fields.py
@@ -7,6 +7,13 @@
from invokeai.app.util.metaenum import MetaEnum
from invokeai.backend.image_util.segment_anything.shared import BoundingBox
+from invokeai.backend.model_manager.taxonomy import (
+ BaseModelType,
+ ClipVariantType,
+ ModelFormat,
+ ModelType,
+ ModelVariantType,
+)
from invokeai.backend.util.logging import InvokeAILogger
logger = InvokeAILogger.get_logger()
@@ -39,42 +46,9 @@ class UIType(str, Enum, metaclass=MetaEnum):
used, and the type will be ignored. They are included here for backwards compatibility.
"""
- # region Model Field Types
- MainModel = "MainModelField"
- CogView4MainModel = "CogView4MainModelField"
- FluxMainModel = "FluxMainModelField"
- SD3MainModel = "SD3MainModelField"
- SDXLMainModel = "SDXLMainModelField"
- SDXLRefinerModel = "SDXLRefinerModelField"
- ONNXModel = "ONNXModelField"
- VAEModel = "VAEModelField"
- FluxVAEModel = "FluxVAEModelField"
- LoRAModel = "LoRAModelField"
- ControlNetModel = "ControlNetModelField"
- IPAdapterModel = "IPAdapterModelField"
- T2IAdapterModel = "T2IAdapterModelField"
- T5EncoderModel = "T5EncoderModelField"
- CLIPEmbedModel = "CLIPEmbedModelField"
- CLIPLEmbedModel = "CLIPLEmbedModelField"
- CLIPGEmbedModel = "CLIPGEmbedModelField"
- SpandrelImageToImageModel = "SpandrelImageToImageModelField"
- ControlLoRAModel = "ControlLoRAModelField"
- SigLipModel = "SigLipModelField"
- FluxReduxModel = "FluxReduxModelField"
- LlavaOnevisionModel = "LLaVAModelField"
- Imagen3Model = "Imagen3ModelField"
- Imagen4Model = "Imagen4ModelField"
- ChatGPT4oModel = "ChatGPT4oModelField"
- Gemini2_5Model = "Gemini2_5ModelField"
- FluxKontextModel = "FluxKontextModelField"
- Veo3Model = "Veo3ModelField"
- RunwayModel = "RunwayModelField"
- # endregion
-
# region Misc Field Types
Scheduler = "SchedulerField"
Any = "AnyField"
- Video = "VideoField"
# endregion
# region Internal Field Types
@@ -124,6 +98,38 @@ class UIType(str, Enum, metaclass=MetaEnum):
MetadataItemPolymorphic = "DEPRECATED_MetadataItemPolymorphic"
MetadataDict = "DEPRECATED_MetadataDict"
+ # Deprecated Model Field Types - use ui_model_[base|type|variant|format] instead
+ MainModel = "DEPRECATED_MainModelField"
+ CogView4MainModel = "DEPRECATED_CogView4MainModelField"
+ FluxMainModel = "DEPRECATED_FluxMainModelField"
+ SD3MainModel = "DEPRECATED_SD3MainModelField"
+ SDXLMainModel = "DEPRECATED_SDXLMainModelField"
+ SDXLRefinerModel = "DEPRECATED_SDXLRefinerModelField"
+ ONNXModel = "DEPRECATED_ONNXModelField"
+ VAEModel = "DEPRECATED_VAEModelField"
+ FluxVAEModel = "DEPRECATED_FluxVAEModelField"
+ LoRAModel = "DEPRECATED_LoRAModelField"
+ ControlNetModel = "DEPRECATED_ControlNetModelField"
+ IPAdapterModel = "DEPRECATED_IPAdapterModelField"
+ T2IAdapterModel = "DEPRECATED_T2IAdapterModelField"
+ T5EncoderModel = "DEPRECATED_T5EncoderModelField"
+ CLIPEmbedModel = "DEPRECATED_CLIPEmbedModelField"
+ CLIPLEmbedModel = "DEPRECATED_CLIPLEmbedModelField"
+ CLIPGEmbedModel = "DEPRECATED_CLIPGEmbedModelField"
+ SpandrelImageToImageModel = "DEPRECATED_SpandrelImageToImageModelField"
+ ControlLoRAModel = "DEPRECATED_ControlLoRAModelField"
+ SigLipModel = "DEPRECATED_SigLipModelField"
+ FluxReduxModel = "DEPRECATED_FluxReduxModelField"
+ LlavaOnevisionModel = "DEPRECATED_LLaVAModelField"
+ Imagen3Model = "DEPRECATED_Imagen3ModelField"
+ Imagen4Model = "DEPRECATED_Imagen4ModelField"
+ ChatGPT4oModel = "DEPRECATED_ChatGPT4oModelField"
+ Gemini2_5Model = "DEPRECATED_Gemini2_5ModelField"
+ FluxKontextModel = "DEPRECATED_FluxKontextModelField"
+ Veo3Model = "DEPRECATED_Veo3ModelField"
+ RunwayModel = "DEPRECATED_RunwayModelField"
+ # endregion
+
class UIComponent(str, Enum, metaclass=MetaEnum):
"""
@@ -409,6 +415,10 @@ class InputFieldJSONSchemaExtra(BaseModel):
ui_component: Optional[UIComponent] = None
ui_order: Optional[int] = None
ui_choice_labels: Optional[dict[str, str]] = None
+ ui_model_base: Optional[list[BaseModelType]] = None
+ ui_model_type: Optional[list[ModelType]] = None
+ ui_model_variant: Optional[list[ClipVariantType | ModelVariantType]] = None
+ ui_model_format: Optional[list[ModelFormat]] = None
model_config = ConfigDict(
validate_assignment=True,
@@ -465,9 +475,9 @@ class OutputFieldJSONSchemaExtra(BaseModel):
"""
field_kind: FieldKind
- ui_hidden: bool
- ui_type: Optional[UIType]
- ui_order: Optional[int]
+ ui_hidden: bool = False
+ ui_order: Optional[int] = None
+ ui_type: Optional[UIType] = None
model_config = ConfigDict(
validate_assignment=True,
@@ -501,35 +511,63 @@ def InputField(
ui_hidden: Optional[bool] = None,
ui_order: Optional[int] = None,
ui_choice_labels: Optional[dict[str, str]] = None,
+ ui_model_base: Optional[BaseModelType | list[BaseModelType]] = None,
+ ui_model_type: Optional[ModelType | list[ModelType]] = None,
+ ui_model_variant: Optional[ClipVariantType | ModelVariantType | list[ClipVariantType | ModelVariantType]] = None,
+ ui_model_format: Optional[ModelFormat | list[ModelFormat]] = None,
) -> Any:
"""
Creates an input field for an invocation.
- This is a wrapper for Pydantic's [Field](https://docs.pydantic.dev/latest/api/fields/#pydantic.fields.Field) \
+ This is a wrapper for Pydantic's [Field](https://docs.pydantic.dev/latest/api/fields/#pydantic.fields.Field)
that adds a few extra parameters to support graph execution and the node editor UI.
- :param Input input: [Input.Any] The kind of input this field requires. \
- `Input.Direct` means a value must be provided on instantiation. \
- `Input.Connection` means the value must be provided by a connection. \
- `Input.Any` means either will do.
+ If the field is a `ModelIdentifierField`, use the `ui_model_[base|type|variant|format]` args to filter the model list
+ in the Workflow Editor. Otherwise, use `ui_type` to provide extra type hints for the UI.
+
+ Don't use both `ui_type` and `ui_model_[base|type|variant|format]` - if both are provided, a warning will be
+ logged and `ui_type` will be ignored.
+
+ Args:
+ input: The kind of input this field requires.
+ - `Input.Direct` means a value must be provided on instantiation.
+ - `Input.Connection` means the value must be provided by a connection.
+ - `Input.Any` means either will do.
- :param UIType ui_type: [None] Optionally provides an extra type hint for the UI. \
- In some situations, the field's type is not enough to infer the correct UI type. \
- For example, model selection fields should render a dropdown UI component to select a model. \
- Internally, there is no difference between SD-1, SD-2 and SDXL model fields, they all use \
- `MainModelField`. So to ensure the base-model-specific UI is rendered, you can use \
- `UIType.SDXLMainModelField` to indicate that the field is an SDXL main model field.
+ ui_type: Optionally provides an extra type hint for the UI. In some situations, the field's type is not enough
+ to infer the correct UI type. For example, Scheduler fields are enums, but we want to render a special scheduler
+ dropdown in the UI. Use `UIType.Scheduler` to indicate this.
- :param UIComponent ui_component: [None] Optionally specifies a specific component to use in the UI. \
- The UI will always render a suitable component, but sometimes you want something different than the default. \
- For example, a `string` field will default to a single-line input, but you may want a multi-line textarea instead. \
- For this case, you could provide `UIComponent.Textarea`.
+ ui_component: Optionally specifies a specific component to use in the UI. The UI will always render a suitable
+ component, but sometimes you want something different than the default. For example, a `string` field will
+ default to a single-line input, but you may want a multi-line textarea instead. In this case, you could use
+ `UIComponent.Textarea`.
- :param bool ui_hidden: [False] Specifies whether or not this field should be hidden in the UI.
+ ui_hidden: Specifies whether or not this field should be hidden in the UI.
- :param int ui_order: [None] Specifies the order in which this field should be rendered in the UI.
+ ui_order: Specifies the order in which this field should be rendered in the UI. If omitted, the field will be
+ rendered after all fields with an explicit order, in the order they are defined in the Invocation class.
- :param dict[str, str] ui_choice_labels: [None] Specifies the labels to use for the choices in an enum field.
+ ui_model_base: Specifies the base model architectures to filter the model list by in the Workflow Editor. For
+ example, `ui_model_base=BaseModelType.StableDiffusionXL` will show only SDXL architecture models. This arg is
+ only valid if this Input field is annotated as a `ModelIdentifierField`.
+
+ ui_model_type: Specifies the model type(s) to filter the model list by in the Workflow Editor. For example,
+ `ui_model_type=ModelType.VAE` will show only VAE models. This arg is only valid if this Input field is
+ annotated as a `ModelIdentifierField`.
+
+ ui_model_variant: Specifies the model variant(s) to filter the model list by in the Workflow Editor. For example,
+ `ui_model_variant=ModelVariantType.Inpainting` will show only inpainting models. This arg is only valid if this
+ Input field is annotated as a `ModelIdentifierField`.
+
+ ui_model_format: Specifies the model format(s) to filter the model list by in the Workflow Editor. For example,
+ `ui_model_format=ModelFormat.Diffusers` will show only models in the diffusers format. This arg is only valid
+ if this Input field is annotated as a `ModelIdentifierField`.
+
+ ui_choice_labels: Specifies the labels to use for the choices in an enum field. If omitted, the enum values
+ will be used. This arg is only valid if the field is annotated with as a `Literal`. For example,
+ `Literal["choice1", "choice2", "choice3"]` with `ui_choice_labels={"choice1": "Choice 1", "choice2": "Choice 2",
+ "choice3": "Choice 3"}` will render a dropdown with the labels "Choice 1", "Choice 2" and "Choice 3".
"""
json_schema_extra_ = InputFieldJSONSchemaExtra(
@@ -538,7 +576,92 @@ def InputField(
)
if ui_type is not None:
- json_schema_extra_.ui_type = ui_type
+ if (
+ ui_model_base is not None
+ or ui_model_type is not None
+ or ui_model_variant is not None
+ or ui_model_format is not None
+ ):
+ logger.warning("InputField: Use either ui_type or ui_model_[base|type|variant|format]. Ignoring ui_type.")
+ # Map old-style UIType to new-style ui_model_[base|type|variant|format]
+ elif ui_type is UIType.MainModel:
+ json_schema_extra_.ui_model_type = [ModelType.Main]
+ elif ui_type is UIType.CogView4MainModel:
+ json_schema_extra_.ui_model_base = [BaseModelType.CogView4]
+ json_schema_extra_.ui_model_type = [ModelType.Main]
+ elif ui_type is UIType.FluxMainModel:
+ json_schema_extra_.ui_model_base = [BaseModelType.Flux]
+ json_schema_extra_.ui_model_type = [ModelType.Main]
+ elif ui_type is UIType.SD3MainModel:
+ json_schema_extra_.ui_model_base = [BaseModelType.StableDiffusion3]
+ json_schema_extra_.ui_model_type = [ModelType.Main]
+ elif ui_type is UIType.SDXLMainModel:
+ json_schema_extra_.ui_model_base = [BaseModelType.StableDiffusionXL]
+ json_schema_extra_.ui_model_type = [ModelType.Main]
+ elif ui_type is UIType.SDXLRefinerModel:
+ json_schema_extra_.ui_model_base = [BaseModelType.StableDiffusionXLRefiner]
+ json_schema_extra_.ui_model_type = [ModelType.Main]
+ # Think this UIType is unused...?
+ # elif ui_type is UIType.ONNXModel:
+ # json_schema_extra_.ui_model_base =
+ # json_schema_extra_.ui_model_type =
+ elif ui_type is UIType.VAEModel:
+ json_schema_extra_.ui_model_type = [ModelType.VAE]
+ elif ui_type is UIType.FluxVAEModel:
+ json_schema_extra_.ui_model_base = [BaseModelType.Flux]
+ json_schema_extra_.ui_model_type = [ModelType.VAE]
+ elif ui_type is UIType.LoRAModel:
+ json_schema_extra_.ui_model_type = [ModelType.LoRA]
+ elif ui_type is UIType.ControlNetModel:
+ json_schema_extra_.ui_model_type = [ModelType.ControlNet]
+ elif ui_type is UIType.IPAdapterModel:
+ json_schema_extra_.ui_model_type = [ModelType.IPAdapter]
+ elif ui_type is UIType.T2IAdapterModel:
+ json_schema_extra_.ui_model_type = [ModelType.T2IAdapter]
+ elif ui_type is UIType.T5EncoderModel:
+ json_schema_extra_.ui_model_type = [ModelType.T5Encoder]
+ elif ui_type is UIType.CLIPEmbedModel:
+ json_schema_extra_.ui_model_type = [ModelType.CLIPEmbed]
+ elif ui_type is UIType.CLIPLEmbedModel:
+ json_schema_extra_.ui_model_type = [ModelType.CLIPEmbed]
+ json_schema_extra_.ui_model_variant = [ClipVariantType.L]
+ elif ui_type is UIType.CLIPGEmbedModel:
+ json_schema_extra_.ui_model_type = [ModelType.CLIPEmbed]
+ json_schema_extra_.ui_model_variant = [ClipVariantType.G]
+ elif ui_type is UIType.SpandrelImageToImageModel:
+ json_schema_extra_.ui_model_type = [ModelType.SpandrelImageToImage]
+ elif ui_type is UIType.ControlLoRAModel:
+ json_schema_extra_.ui_model_type = [ModelType.ControlLoRa]
+ elif ui_type is UIType.SigLipModel:
+ json_schema_extra_.ui_model_type = [ModelType.SigLIP]
+ elif ui_type is UIType.FluxReduxModel:
+ json_schema_extra_.ui_model_type = [ModelType.FluxRedux]
+ elif ui_type is UIType.LlavaOnevisionModel:
+ json_schema_extra_.ui_model_type = [ModelType.LlavaOnevision]
+ elif ui_type is UIType.Imagen3Model:
+ json_schema_extra_.ui_model_base = [BaseModelType.Imagen3]
+ json_schema_extra_.ui_model_type = [ModelType.Main]
+ elif ui_type is UIType.Imagen4Model:
+ json_schema_extra_.ui_model_base = [BaseModelType.Imagen4]
+ json_schema_extra_.ui_model_type = [ModelType.Main]
+ elif ui_type is UIType.ChatGPT4oModel:
+ json_schema_extra_.ui_model_base = [BaseModelType.ChatGPT4o]
+ json_schema_extra_.ui_model_type = [ModelType.Main]
+ elif ui_type is UIType.Gemini2_5Model:
+ json_schema_extra_.ui_model_base = [BaseModelType.Gemini2_5]
+ json_schema_extra_.ui_model_type = [ModelType.Main]
+ elif ui_type is UIType.FluxKontextModel:
+ json_schema_extra_.ui_model_base = [BaseModelType.FluxKontext]
+ json_schema_extra_.ui_model_type = [ModelType.Main]
+ elif ui_type is UIType.Veo3Model:
+ json_schema_extra_.ui_model_base = [BaseModelType.Veo3]
+ json_schema_extra_.ui_model_type = [ModelType.Video]
+ elif ui_type is UIType.RunwayModel:
+ json_schema_extra_.ui_model_base = [BaseModelType.Runway]
+ json_schema_extra_.ui_model_type = [ModelType.Video]
+ else:
+ json_schema_extra_.ui_type = ui_type
+
if ui_component is not None:
json_schema_extra_.ui_component = ui_component
if ui_hidden is not None:
@@ -547,6 +670,26 @@ def InputField(
json_schema_extra_.ui_order = ui_order
if ui_choice_labels is not None:
json_schema_extra_.ui_choice_labels = ui_choice_labels
+ if ui_model_base is not None:
+ if isinstance(ui_model_base, list):
+ json_schema_extra_.ui_model_base = ui_model_base
+ else:
+ json_schema_extra_.ui_model_base = [ui_model_base]
+ if ui_model_type is not None:
+ if isinstance(ui_model_type, list):
+ json_schema_extra_.ui_model_type = ui_model_type
+ else:
+ json_schema_extra_.ui_model_type = [ui_model_type]
+ if ui_model_variant is not None:
+ if isinstance(ui_model_variant, list):
+ json_schema_extra_.ui_model_variant = ui_model_variant
+ else:
+ json_schema_extra_.ui_model_variant = [ui_model_variant]
+ if ui_model_format is not None:
+ if isinstance(ui_model_format, list):
+ json_schema_extra_.ui_model_format = ui_model_format
+ else:
+ json_schema_extra_.ui_model_format = [ui_model_format]
"""
There is a conflict between the typing of invocation definitions and the typing of an invocation's
@@ -648,20 +791,20 @@ def OutputField(
"""
Creates an output field for an invocation output.
- This is a wrapper for Pydantic's [Field](https://docs.pydantic.dev/1.10/usage/schema/#field-customization) \
+ This is a wrapper for Pydantic's [Field](https://docs.pydantic.dev/1.10/usage/schema/#field-customization)
that adds a few extra parameters to support graph execution and the node editor UI.
- :param UIType ui_type: [None] Optionally provides an extra type hint for the UI. \
- In some situations, the field's type is not enough to infer the correct UI type. \
- For example, model selection fields should render a dropdown UI component to select a model. \
- Internally, there is no difference between SD-1, SD-2 and SDXL model fields, they all use \
- `MainModelField`. So to ensure the base-model-specific UI is rendered, you can use \
- `UIType.SDXLMainModelField` to indicate that the field is an SDXL main model field.
+ Args:
+ ui_type: Optionally provides an extra type hint for the UI. In some situations, the field's type is not enough
+ to infer the correct UI type. For example, Scheduler fields are enums, but we want to render a special scheduler
+ dropdown in the UI. Use `UIType.Scheduler` to indicate this.
- :param bool ui_hidden: [False] Specifies whether or not this field should be hidden in the UI. \
+ ui_hidden: Specifies whether or not this field should be hidden in the UI.
- :param int ui_order: [None] Specifies the order in which this field should be rendered in the UI. \
+ ui_order: Specifies the order in which this field should be rendered in the UI. If omitted, the field will be
+ rendered after all fields with an explicit order, in the order they are defined in the Invocation class.
"""
+
return Field(
default=default,
title=title,
@@ -679,9 +822,9 @@ def OutputField(
min_length=min_length,
max_length=max_length,
json_schema_extra=OutputFieldJSONSchemaExtra(
- ui_type=ui_type,
ui_hidden=ui_hidden,
ui_order=ui_order,
+ ui_type=ui_type,
field_kind=FieldKind.Output,
).model_dump(exclude_none=True),
)
diff --git a/invokeai/app/invocations/flux_control_lora_loader.py b/invokeai/app/invocations/flux_control_lora_loader.py
index f24ad6bf6a7..25025488667 100644
--- a/invokeai/app/invocations/flux_control_lora_loader.py
+++ b/invokeai/app/invocations/flux_control_lora_loader.py
@@ -4,9 +4,10 @@
invocation,
invocation_output,
)
-from invokeai.app.invocations.fields import FieldDescriptions, ImageField, InputField, OutputField, UIType
+from invokeai.app.invocations.fields import FieldDescriptions, ImageField, InputField, OutputField
from invokeai.app.invocations.model import ControlLoRAField, ModelIdentifierField
from invokeai.app.services.shared.invocation_context import InvocationContext
+from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType
@invocation_output("flux_control_lora_loader_output")
@@ -29,7 +30,10 @@ class FluxControlLoRALoaderInvocation(BaseInvocation):
"""LoRA model and Image to use with FLUX transformer generation."""
lora: ModelIdentifierField = InputField(
- description=FieldDescriptions.control_lora_model, title="Control LoRA", ui_type=UIType.ControlLoRAModel
+ description=FieldDescriptions.control_lora_model,
+ title="Control LoRA",
+ ui_model_base=BaseModelType.Flux,
+ ui_model_type=ModelType.ControlLoRa,
)
image: ImageField = InputField(description="The image to encode.")
weight: float = InputField(description="The weight of the LoRA.", default=1.0)
diff --git a/invokeai/app/invocations/flux_controlnet.py b/invokeai/app/invocations/flux_controlnet.py
index 230ef912f46..82284843758 100644
--- a/invokeai/app/invocations/flux_controlnet.py
+++ b/invokeai/app/invocations/flux_controlnet.py
@@ -6,11 +6,12 @@
invocation,
invocation_output,
)
-from invokeai.app.invocations.fields import FieldDescriptions, ImageField, InputField, OutputField, UIType
+from invokeai.app.invocations.fields import FieldDescriptions, ImageField, InputField, OutputField
from invokeai.app.invocations.model import ModelIdentifierField
from invokeai.app.invocations.util import validate_begin_end_step, validate_weights
from invokeai.app.services.shared.invocation_context import InvocationContext
from invokeai.app.util.controlnet_utils import CONTROLNET_RESIZE_VALUES
+from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType
class FluxControlNetField(BaseModel):
@@ -57,7 +58,9 @@ class FluxControlNetInvocation(BaseInvocation):
image: ImageField = InputField(description="The control image")
control_model: ModelIdentifierField = InputField(
- description=FieldDescriptions.controlnet_model, ui_type=UIType.ControlNetModel
+ description=FieldDescriptions.controlnet_model,
+ ui_model_base=BaseModelType.Flux,
+ ui_model_type=ModelType.ControlNet,
)
control_weight: float | list[float] = InputField(
default=1.0, ge=-1, le=2, description="The weight given to the ControlNet"
diff --git a/invokeai/app/invocations/flux_ip_adapter.py b/invokeai/app/invocations/flux_ip_adapter.py
index fd8fc2118ee..db5754ee2b0 100644
--- a/invokeai/app/invocations/flux_ip_adapter.py
+++ b/invokeai/app/invocations/flux_ip_adapter.py
@@ -5,7 +5,7 @@
from typing_extensions import Self
from invokeai.app.invocations.baseinvocation import BaseInvocation, invocation
-from invokeai.app.invocations.fields import InputField, UIType
+from invokeai.app.invocations.fields import InputField
from invokeai.app.invocations.ip_adapter import (
CLIP_VISION_MODEL_MAP,
IPAdapterField,
@@ -20,6 +20,7 @@
IPAdapterCheckpointConfig,
IPAdapterInvokeAIConfig,
)
+from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType
@invocation(
@@ -36,7 +37,10 @@ class FluxIPAdapterInvocation(BaseInvocation):
image: ImageField = InputField(description="The IP-Adapter image prompt(s).")
ip_adapter_model: ModelIdentifierField = InputField(
- description="The IP-Adapter model.", title="IP-Adapter Model", ui_type=UIType.IPAdapterModel
+ description="The IP-Adapter model.",
+ title="IP-Adapter Model",
+ ui_model_base=BaseModelType.Flux,
+ ui_model_type=ModelType.IPAdapter,
)
# Currently, the only known ViT model used by FLUX IP-Adapters is ViT-L.
clip_vision_model: Literal["ViT-L"] = InputField(description="CLIP Vision model to use.", default="ViT-L")
diff --git a/invokeai/app/invocations/flux_lora_loader.py b/invokeai/app/invocations/flux_lora_loader.py
index ae7c3657071..f939ea2dc51 100644
--- a/invokeai/app/invocations/flux_lora_loader.py
+++ b/invokeai/app/invocations/flux_lora_loader.py
@@ -6,10 +6,10 @@
invocation,
invocation_output,
)
-from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField, UIType
+from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField
from invokeai.app.invocations.model import CLIPField, LoRAField, ModelIdentifierField, T5EncoderField, TransformerField
from invokeai.app.services.shared.invocation_context import InvocationContext
-from invokeai.backend.model_manager.taxonomy import BaseModelType
+from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType
@invocation_output("flux_lora_loader_output")
@@ -36,7 +36,10 @@ class FluxLoRALoaderInvocation(BaseInvocation):
"""Apply a LoRA model to a FLUX transformer and/or text encoder."""
lora: ModelIdentifierField = InputField(
- description=FieldDescriptions.lora_model, title="LoRA", ui_type=UIType.LoRAModel
+ description=FieldDescriptions.lora_model,
+ title="LoRA",
+ ui_model_base=BaseModelType.Flux,
+ ui_model_type=ModelType.LoRA,
)
weight: float = InputField(default=0.75, description=FieldDescriptions.lora_weight)
transformer: TransformerField | None = InputField(
diff --git a/invokeai/app/invocations/flux_model_loader.py b/invokeai/app/invocations/flux_model_loader.py
index a0c26829adc..e5a1966c659 100644
--- a/invokeai/app/invocations/flux_model_loader.py
+++ b/invokeai/app/invocations/flux_model_loader.py
@@ -6,7 +6,7 @@
invocation,
invocation_output,
)
-from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField, UIType
+from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField
from invokeai.app.invocations.model import CLIPField, ModelIdentifierField, T5EncoderField, TransformerField, VAEField
from invokeai.app.services.shared.invocation_context import InvocationContext
from invokeai.app.util.t5_model_identifier import (
@@ -17,7 +17,7 @@
from invokeai.backend.model_manager.config import (
CheckpointConfigBase,
)
-from invokeai.backend.model_manager.taxonomy import SubModelType
+from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType, SubModelType
@invocation_output("flux_model_loader_output")
@@ -46,23 +46,30 @@ class FluxModelLoaderInvocation(BaseInvocation):
model: ModelIdentifierField = InputField(
description=FieldDescriptions.flux_model,
- ui_type=UIType.FluxMainModel,
input=Input.Direct,
+ ui_model_base=BaseModelType.Flux,
+ ui_model_type=ModelType.Main,
)
t5_encoder_model: ModelIdentifierField = InputField(
- description=FieldDescriptions.t5_encoder, ui_type=UIType.T5EncoderModel, input=Input.Direct, title="T5 Encoder"
+ description=FieldDescriptions.t5_encoder,
+ input=Input.Direct,
+ title="T5 Encoder",
+ ui_model_type=ModelType.T5Encoder,
)
clip_embed_model: ModelIdentifierField = InputField(
description=FieldDescriptions.clip_embed_model,
- ui_type=UIType.CLIPEmbedModel,
input=Input.Direct,
title="CLIP Embed",
+ ui_model_type=ModelType.CLIPEmbed,
)
vae_model: ModelIdentifierField = InputField(
- description=FieldDescriptions.vae_model, ui_type=UIType.FluxVAEModel, title="VAE"
+ description=FieldDescriptions.vae_model,
+ title="VAE",
+ ui_model_base=BaseModelType.Flux,
+ ui_model_type=ModelType.VAE,
)
def invoke(self, context: InvocationContext) -> FluxModelLoaderOutput:
diff --git a/invokeai/app/invocations/flux_redux.py b/invokeai/app/invocations/flux_redux.py
index 880ac501841..3e34497b105 100644
--- a/invokeai/app/invocations/flux_redux.py
+++ b/invokeai/app/invocations/flux_redux.py
@@ -18,7 +18,6 @@
InputField,
OutputField,
TensorField,
- UIType,
)
from invokeai.app.invocations.model import ModelIdentifierField
from invokeai.app.invocations.primitives import ImageField
@@ -64,7 +63,8 @@ class FluxReduxInvocation(BaseInvocation):
redux_model: ModelIdentifierField = InputField(
description="The FLUX Redux model to use.",
title="FLUX Redux Model",
- ui_type=UIType.FluxReduxModel,
+ ui_model_base=BaseModelType.Flux,
+ ui_model_type=ModelType.FluxRedux,
)
downsampling_factor: int = InputField(
ge=1,
diff --git a/invokeai/app/invocations/ip_adapter.py b/invokeai/app/invocations/ip_adapter.py
index 50278dd10e1..35a98ff6ba0 100644
--- a/invokeai/app/invocations/ip_adapter.py
+++ b/invokeai/app/invocations/ip_adapter.py
@@ -5,7 +5,7 @@
from typing_extensions import Self
from invokeai.app.invocations.baseinvocation import BaseInvocation, BaseInvocationOutput, invocation, invocation_output
-from invokeai.app.invocations.fields import FieldDescriptions, InputField, OutputField, TensorField, UIType
+from invokeai.app.invocations.fields import FieldDescriptions, InputField, OutputField, TensorField
from invokeai.app.invocations.model import ModelIdentifierField
from invokeai.app.invocations.primitives import ImageField
from invokeai.app.invocations.util import validate_begin_end_step, validate_weights
@@ -85,7 +85,8 @@ class IPAdapterInvocation(BaseInvocation):
description="The IP-Adapter model.",
title="IP-Adapter Model",
ui_order=-1,
- ui_type=UIType.IPAdapterModel,
+ ui_model_base=[BaseModelType.StableDiffusion1, BaseModelType.StableDiffusionXL],
+ ui_model_type=ModelType.IPAdapter,
)
clip_vision_model: Literal["ViT-H", "ViT-G", "ViT-L"] = InputField(
description="CLIP Vision model to use. Overrides model settings. Mandatory for checkpoint models.",
diff --git a/invokeai/app/invocations/llava_onevision_vllm.py b/invokeai/app/invocations/llava_onevision_vllm.py
index 368aae0ebc7..fbd24205905 100644
--- a/invokeai/app/invocations/llava_onevision_vllm.py
+++ b/invokeai/app/invocations/llava_onevision_vllm.py
@@ -6,11 +6,12 @@
from transformers import AutoProcessor, LlavaOnevisionForConditionalGeneration, LlavaOnevisionProcessor
from invokeai.app.invocations.baseinvocation import BaseInvocation, Classification, invocation
-from invokeai.app.invocations.fields import FieldDescriptions, ImageField, InputField, UIComponent, UIType
+from invokeai.app.invocations.fields import FieldDescriptions, ImageField, InputField, UIComponent
from invokeai.app.invocations.model import ModelIdentifierField
from invokeai.app.invocations.primitives import StringOutput
from invokeai.app.services.shared.invocation_context import InvocationContext
from invokeai.backend.llava_onevision_pipeline import LlavaOnevisionPipeline
+from invokeai.backend.model_manager.taxonomy import ModelType
from invokeai.backend.util.devices import TorchDevice
@@ -34,7 +35,7 @@ class LlavaOnevisionVllmInvocation(BaseInvocation):
vllm_model: ModelIdentifierField = InputField(
title="LLaVA Model Type",
description=FieldDescriptions.vllm_model,
- ui_type=UIType.LlavaOnevisionModel,
+ ui_model_type=ModelType.LlavaOnevision,
)
@field_validator("images", mode="before")
diff --git a/invokeai/app/invocations/metadata_linked.py b/invokeai/app/invocations/metadata_linked.py
index bb192541fdd..b9d2ff479ee 100644
--- a/invokeai/app/invocations/metadata_linked.py
+++ b/invokeai/app/invocations/metadata_linked.py
@@ -53,7 +53,7 @@
from invokeai.app.invocations.scheduler import SchedulerOutput
from invokeai.app.invocations.t2i_adapter import T2IAdapterField, T2IAdapterInvocation
from invokeai.app.services.shared.invocation_context import InvocationContext
-from invokeai.backend.model_manager.taxonomy import ModelType, SubModelType
+from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType, SubModelType
from invokeai.backend.stable_diffusion.schedulers.schedulers import SCHEDULER_NAME_VALUES
from invokeai.version import __version__
@@ -473,7 +473,6 @@ class MetadataToModelOutput(BaseInvocationOutput):
model: ModelIdentifierField = OutputField(
description=FieldDescriptions.main_model,
title="Model",
- ui_type=UIType.MainModel,
)
name: str = OutputField(description="Model Name", title="Name")
unet: UNetField = OutputField(description=FieldDescriptions.unet, title="UNet")
@@ -488,7 +487,6 @@ class MetadataToSDXLModelOutput(BaseInvocationOutput):
model: ModelIdentifierField = OutputField(
description=FieldDescriptions.main_model,
title="Model",
- ui_type=UIType.SDXLMainModel,
)
name: str = OutputField(description="Model Name", title="Name")
unet: UNetField = OutputField(description=FieldDescriptions.unet, title="UNet")
@@ -519,8 +517,7 @@ class MetadataToModelInvocation(BaseInvocation, WithMetadata):
input=Input.Direct,
)
default_value: ModelIdentifierField = InputField(
- description="The default model to use if not found in the metadata",
- ui_type=UIType.MainModel,
+ description="The default model to use if not found in the metadata", ui_model_type=ModelType.Main
)
_validate_custom_label = model_validator(mode="after")(validate_custom_label)
@@ -575,7 +572,8 @@ class MetadataToSDXLModelInvocation(BaseInvocation, WithMetadata):
)
default_value: ModelIdentifierField = InputField(
description="The default SDXL Model to use if not found in the metadata",
- ui_type=UIType.SDXLMainModel,
+ ui_model_type=ModelType.Main,
+ ui_model_base=BaseModelType.StableDiffusionXL,
)
_validate_custom_label = model_validator(mode="after")(validate_custom_label)
diff --git a/invokeai/app/invocations/model.py b/invokeai/app/invocations/model.py
index 7c3fe7aabad..2d338c677d2 100644
--- a/invokeai/app/invocations/model.py
+++ b/invokeai/app/invocations/model.py
@@ -9,7 +9,7 @@
invocation,
invocation_output,
)
-from invokeai.app.invocations.fields import FieldDescriptions, ImageField, Input, InputField, OutputField, UIType
+from invokeai.app.invocations.fields import FieldDescriptions, ImageField, Input, InputField, OutputField
from invokeai.app.services.shared.invocation_context import InvocationContext
from invokeai.app.shared.models import FreeUConfig
from invokeai.backend.model_manager.config import (
@@ -145,7 +145,7 @@ def invoke(self, context: InvocationContext) -> ModelIdentifierOutput:
@invocation(
"main_model_loader",
- title="Main Model - SD1.5",
+ title="Main Model - SD1.5, SD2",
tags=["model"],
category="model",
version="1.0.4",
@@ -153,7 +153,11 @@ def invoke(self, context: InvocationContext) -> ModelIdentifierOutput:
class MainModelLoaderInvocation(BaseInvocation):
"""Loads a main model, outputting its submodels."""
- model: ModelIdentifierField = InputField(description=FieldDescriptions.main_model, ui_type=UIType.MainModel)
+ model: ModelIdentifierField = InputField(
+ description=FieldDescriptions.main_model,
+ ui_model_base=[BaseModelType.StableDiffusion1, BaseModelType.StableDiffusion2],
+ ui_model_type=ModelType.Main,
+ )
# TODO: precision?
def invoke(self, context: InvocationContext) -> ModelLoaderOutput:
@@ -187,7 +191,10 @@ class LoRALoaderInvocation(BaseInvocation):
"""Apply selected lora to unet and text_encoder."""
lora: ModelIdentifierField = InputField(
- description=FieldDescriptions.lora_model, title="LoRA", ui_type=UIType.LoRAModel
+ description=FieldDescriptions.lora_model,
+ title="LoRA",
+ ui_model_base=BaseModelType.StableDiffusion1,
+ ui_model_type=ModelType.LoRA,
)
weight: float = InputField(default=0.75, description=FieldDescriptions.lora_weight)
unet: Optional[UNetField] = InputField(
@@ -250,7 +257,9 @@ class LoRASelectorInvocation(BaseInvocation):
"""Selects a LoRA model and weight."""
lora: ModelIdentifierField = InputField(
- description=FieldDescriptions.lora_model, title="LoRA", ui_type=UIType.LoRAModel
+ description=FieldDescriptions.lora_model,
+ title="LoRA",
+ ui_model_type=ModelType.LoRA,
)
weight: float = InputField(default=0.75, description=FieldDescriptions.lora_weight)
@@ -332,7 +341,10 @@ class SDXLLoRALoaderInvocation(BaseInvocation):
"""Apply selected lora to unet and text_encoder."""
lora: ModelIdentifierField = InputField(
- description=FieldDescriptions.lora_model, title="LoRA", ui_type=UIType.LoRAModel
+ description=FieldDescriptions.lora_model,
+ title="LoRA",
+ ui_model_base=BaseModelType.StableDiffusionXL,
+ ui_model_type=ModelType.LoRA,
)
weight: float = InputField(default=0.75, description=FieldDescriptions.lora_weight)
unet: Optional[UNetField] = InputField(
@@ -473,13 +485,26 @@ def invoke(self, context: InvocationContext) -> SDXLLoRALoaderOutput:
@invocation(
- "vae_loader", title="VAE Model - SD1.5, SDXL, SD3, FLUX", tags=["vae", "model"], category="model", version="1.0.4"
+ "vae_loader",
+ title="VAE Model - SD1.5, SD2, SDXL, SD3, FLUX",
+ tags=["vae", "model"],
+ category="model",
+ version="1.0.4",
)
class VAELoaderInvocation(BaseInvocation):
"""Loads a VAE model, outputting a VaeLoaderOutput"""
vae_model: ModelIdentifierField = InputField(
- description=FieldDescriptions.vae_model, title="VAE", ui_type=UIType.VAEModel
+ description=FieldDescriptions.vae_model,
+ title="VAE",
+ ui_model_base=[
+ BaseModelType.StableDiffusion1,
+ BaseModelType.StableDiffusion2,
+ BaseModelType.StableDiffusionXL,
+ BaseModelType.StableDiffusion3,
+ BaseModelType.Flux,
+ ],
+ ui_model_type=ModelType.VAE,
)
def invoke(self, context: InvocationContext) -> VAEOutput:
diff --git a/invokeai/app/invocations/sd3_model_loader.py b/invokeai/app/invocations/sd3_model_loader.py
index c7e2f397f6f..7d095d96c6b 100644
--- a/invokeai/app/invocations/sd3_model_loader.py
+++ b/invokeai/app/invocations/sd3_model_loader.py
@@ -6,14 +6,14 @@
invocation,
invocation_output,
)
-from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField, UIType
+from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField
from invokeai.app.invocations.model import CLIPField, ModelIdentifierField, T5EncoderField, TransformerField, VAEField
from invokeai.app.services.shared.invocation_context import InvocationContext
from invokeai.app.util.t5_model_identifier import (
preprocess_t5_encoder_model_identifier,
preprocess_t5_tokenizer_model_identifier,
)
-from invokeai.backend.model_manager.taxonomy import SubModelType
+from invokeai.backend.model_manager.taxonomy import BaseModelType, ClipVariantType, ModelType, SubModelType
@invocation_output("sd3_model_loader_output")
@@ -39,36 +39,43 @@ class Sd3ModelLoaderInvocation(BaseInvocation):
model: ModelIdentifierField = InputField(
description=FieldDescriptions.sd3_model,
- ui_type=UIType.SD3MainModel,
input=Input.Direct,
+ ui_model_base=BaseModelType.StableDiffusion3,
+ ui_model_type=ModelType.Main,
)
t5_encoder_model: Optional[ModelIdentifierField] = InputField(
description=FieldDescriptions.t5_encoder,
- ui_type=UIType.T5EncoderModel,
input=Input.Direct,
title="T5 Encoder",
default=None,
+ ui_model_type=ModelType.T5Encoder,
)
clip_l_model: Optional[ModelIdentifierField] = InputField(
description=FieldDescriptions.clip_embed_model,
- ui_type=UIType.CLIPLEmbedModel,
input=Input.Direct,
title="CLIP L Encoder",
default=None,
+ ui_model_type=ModelType.CLIPEmbed,
+ ui_model_variant=ClipVariantType.L,
)
clip_g_model: Optional[ModelIdentifierField] = InputField(
description=FieldDescriptions.clip_g_model,
- ui_type=UIType.CLIPGEmbedModel,
input=Input.Direct,
title="CLIP G Encoder",
default=None,
+ ui_model_type=ModelType.CLIPEmbed,
+ ui_model_variant=ClipVariantType.G,
)
vae_model: Optional[ModelIdentifierField] = InputField(
- description=FieldDescriptions.vae_model, ui_type=UIType.VAEModel, title="VAE", default=None
+ description=FieldDescriptions.vae_model,
+ title="VAE",
+ default=None,
+ ui_model_base=BaseModelType.StableDiffusion3,
+ ui_model_type=ModelType.VAE,
)
def invoke(self, context: InvocationContext) -> Sd3ModelLoaderOutput:
diff --git a/invokeai/app/invocations/sdxl.py b/invokeai/app/invocations/sdxl.py
index 9bc8450d9b3..0f509828c13 100644
--- a/invokeai/app/invocations/sdxl.py
+++ b/invokeai/app/invocations/sdxl.py
@@ -1,8 +1,8 @@
from invokeai.app.invocations.baseinvocation import BaseInvocation, BaseInvocationOutput, invocation, invocation_output
-from invokeai.app.invocations.fields import FieldDescriptions, InputField, OutputField, UIType
+from invokeai.app.invocations.fields import FieldDescriptions, InputField, OutputField
from invokeai.app.invocations.model import CLIPField, ModelIdentifierField, UNetField, VAEField
from invokeai.app.services.shared.invocation_context import InvocationContext
-from invokeai.backend.model_manager.taxonomy import SubModelType
+from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType, SubModelType
@invocation_output("sdxl_model_loader_output")
@@ -29,7 +29,9 @@ class SDXLModelLoaderInvocation(BaseInvocation):
"""Loads an sdxl base model, outputting its submodels."""
model: ModelIdentifierField = InputField(
- description=FieldDescriptions.sdxl_main_model, ui_type=UIType.SDXLMainModel
+ description=FieldDescriptions.sdxl_main_model,
+ ui_model_base=BaseModelType.StableDiffusionXL,
+ ui_model_type=ModelType.Main,
)
# TODO: precision?
@@ -67,7 +69,9 @@ class SDXLRefinerModelLoaderInvocation(BaseInvocation):
"""Loads an sdxl refiner model, outputting its submodels."""
model: ModelIdentifierField = InputField(
- description=FieldDescriptions.sdxl_refiner_model, ui_type=UIType.SDXLRefinerModel
+ description=FieldDescriptions.sdxl_refiner_model,
+ ui_model_base=BaseModelType.StableDiffusionXLRefiner,
+ ui_model_type=ModelType.Main,
)
# TODO: precision?
diff --git a/invokeai/app/invocations/spandrel_image_to_image.py b/invokeai/app/invocations/spandrel_image_to_image.py
index 773e704856b..fb870c429c4 100644
--- a/invokeai/app/invocations/spandrel_image_to_image.py
+++ b/invokeai/app/invocations/spandrel_image_to_image.py
@@ -11,7 +11,6 @@
FieldDescriptions,
ImageField,
InputField,
- UIType,
WithBoard,
WithMetadata,
)
@@ -19,6 +18,7 @@
from invokeai.app.invocations.primitives import ImageOutput
from invokeai.app.services.session_processor.session_processor_common import CanceledException
from invokeai.app.services.shared.invocation_context import InvocationContext
+from invokeai.backend.model_manager.taxonomy import ModelType
from invokeai.backend.spandrel_image_to_image_model import SpandrelImageToImageModel
from invokeai.backend.tiles.tiles import calc_tiles_min_overlap
from invokeai.backend.tiles.utils import TBLR, Tile
@@ -33,7 +33,7 @@ class SpandrelImageToImageInvocation(BaseInvocation, WithMetadata, WithBoard):
image_to_image_model: ModelIdentifierField = InputField(
title="Image-to-Image Model",
description=FieldDescriptions.spandrel_image_to_image_model,
- ui_type=UIType.SpandrelImageToImageModel,
+ ui_model_type=ModelType.SpandrelImageToImage,
)
tile_size: int = InputField(
default=512, description="The tile size for tiled image-to-image. Set to 0 to disable tiling."
diff --git a/invokeai/app/invocations/t2i_adapter.py b/invokeai/app/invocations/t2i_adapter.py
index 765f4a44286..15f1881eef7 100644
--- a/invokeai/app/invocations/t2i_adapter.py
+++ b/invokeai/app/invocations/t2i_adapter.py
@@ -8,11 +8,12 @@
invocation,
invocation_output,
)
-from invokeai.app.invocations.fields import FieldDescriptions, ImageField, InputField, OutputField, UIType
+from invokeai.app.invocations.fields import FieldDescriptions, ImageField, InputField, OutputField
from invokeai.app.invocations.model import ModelIdentifierField
from invokeai.app.invocations.util import validate_begin_end_step, validate_weights
from invokeai.app.services.shared.invocation_context import InvocationContext
from invokeai.app.util.controlnet_utils import CONTROLNET_RESIZE_VALUES
+from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType
class T2IAdapterField(BaseModel):
@@ -60,7 +61,8 @@ class T2IAdapterInvocation(BaseInvocation):
description="The T2I-Adapter model.",
title="T2I-Adapter Model",
ui_order=-1,
- ui_type=UIType.T2IAdapterModel,
+ ui_model_base=[BaseModelType.StableDiffusion1, BaseModelType.StableDiffusionXL],
+ ui_model_type=ModelType.T2IAdapter,
)
weight: Union[float, list[float]] = InputField(
default=1, ge=0, description="The weight given to the T2I-Adapter", title="Weight"
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldRenderer.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldRenderer.tsx
index 4d928ea504e..7139d0e1f98 100644
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldRenderer.tsx
+++ b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/InputFieldRenderer.tsx
@@ -1,14 +1,10 @@
import { FloatFieldInput } from 'features/nodes/components/flow/nodes/Invocation/fields/FloatField/FloatFieldInput';
import { FloatFieldInputAndSlider } from 'features/nodes/components/flow/nodes/Invocation/fields/FloatField/FloatFieldInputAndSlider';
import { FloatFieldSlider } from 'features/nodes/components/flow/nodes/Invocation/fields/FloatField/FloatFieldSlider';
-import ChatGPT4oModelFieldInputComponent from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ChatGPT4oModelFieldInputComponent';
import { FloatFieldCollectionInputComponent } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatFieldCollectionInputComponent';
import { FloatGeneratorFieldInputComponent } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorFieldComponent';
-import FluxKontextModelFieldInputComponent from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/FluxKontextModelFieldInputComponent';
import { ImageFieldCollectionInputComponent } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent';
import { ImageGeneratorFieldInputComponent } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageGeneratorFieldComponent';
-import Imagen3ModelFieldInputComponent from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/Imagen3ModelFieldInputComponent';
-import Imagen4ModelFieldInputComponent from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/Imagen4ModelFieldInputComponent';
import { IntegerFieldCollectionInputComponent } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerFieldCollectionInputComponent';
import { IntegerGeneratorFieldInputComponent } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorFieldComponent';
import ModelIdentifierFieldInputComponent from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelIdentifierFieldInputComponent';
@@ -27,22 +23,8 @@ import {
isBoardFieldInputTemplate,
isBooleanFieldInputInstance,
isBooleanFieldInputTemplate,
- isChatGPT4oModelFieldInputInstance,
- isChatGPT4oModelFieldInputTemplate,
- isCLIPEmbedModelFieldInputInstance,
- isCLIPEmbedModelFieldInputTemplate,
- isCLIPGEmbedModelFieldInputInstance,
- isCLIPGEmbedModelFieldInputTemplate,
- isCLIPLEmbedModelFieldInputInstance,
- isCLIPLEmbedModelFieldInputTemplate,
- isCogView4MainModelFieldInputInstance,
- isCogView4MainModelFieldInputTemplate,
isColorFieldInputInstance,
isColorFieldInputTemplate,
- isControlLoRAModelFieldInputInstance,
- isControlLoRAModelFieldInputTemplate,
- isControlNetModelFieldInputInstance,
- isControlNetModelFieldInputTemplate,
isEnumFieldInputInstance,
isEnumFieldInputTemplate,
isFloatFieldCollectionInputInstance,
@@ -51,68 +33,28 @@ import {
isFloatFieldInputTemplate,
isFloatGeneratorFieldInputInstance,
isFloatGeneratorFieldInputTemplate,
- isFluxKontextModelFieldInputInstance,
- isFluxKontextModelFieldInputTemplate,
- isFluxMainModelFieldInputInstance,
- isFluxMainModelFieldInputTemplate,
- isFluxReduxModelFieldInputInstance,
- isFluxReduxModelFieldInputTemplate,
- isFluxVAEModelFieldInputInstance,
- isFluxVAEModelFieldInputTemplate,
isImageFieldCollectionInputInstance,
isImageFieldCollectionInputTemplate,
isImageFieldInputInstance,
isImageFieldInputTemplate,
isImageGeneratorFieldInputInstance,
isImageGeneratorFieldInputTemplate,
- isImagen3ModelFieldInputInstance,
- isImagen3ModelFieldInputTemplate,
- isImagen4ModelFieldInputInstance,
- isImagen4ModelFieldInputTemplate,
isIntegerFieldCollectionInputInstance,
isIntegerFieldCollectionInputTemplate,
isIntegerFieldInputInstance,
isIntegerFieldInputTemplate,
isIntegerGeneratorFieldInputInstance,
isIntegerGeneratorFieldInputTemplate,
- isIPAdapterModelFieldInputInstance,
- isIPAdapterModelFieldInputTemplate,
- isLLaVAModelFieldInputInstance,
- isLLaVAModelFieldInputTemplate,
- isLoRAModelFieldInputInstance,
- isLoRAModelFieldInputTemplate,
- isMainModelFieldInputInstance,
- isMainModelFieldInputTemplate,
isModelIdentifierFieldInputInstance,
isModelIdentifierFieldInputTemplate,
- isRunwayModelFieldInputInstance,
- isRunwayModelFieldInputTemplate,
isSchedulerFieldInputInstance,
isSchedulerFieldInputTemplate,
- isSD3MainModelFieldInputInstance,
- isSD3MainModelFieldInputTemplate,
- isSDXLMainModelFieldInputInstance,
- isSDXLMainModelFieldInputTemplate,
- isSDXLRefinerModelFieldInputInstance,
- isSDXLRefinerModelFieldInputTemplate,
- isSigLipModelFieldInputInstance,
- isSigLipModelFieldInputTemplate,
- isSpandrelImageToImageModelFieldInputInstance,
- isSpandrelImageToImageModelFieldInputTemplate,
isStringFieldCollectionInputInstance,
isStringFieldCollectionInputTemplate,
isStringFieldInputInstance,
isStringFieldInputTemplate,
isStringGeneratorFieldInputInstance,
isStringGeneratorFieldInputTemplate,
- isT2IAdapterModelFieldInputInstance,
- isT2IAdapterModelFieldInputTemplate,
- isT5EncoderModelFieldInputInstance,
- isT5EncoderModelFieldInputTemplate,
- isVAEModelFieldInputInstance,
- isVAEModelFieldInputTemplate,
- isVeo3ModelFieldInputInstance,
- isVeo3ModelFieldInputTemplate,
} from 'features/nodes/types/field';
import type { NodeFieldElement } from 'features/nodes/types/workflow';
import { memo } from 'react';
@@ -121,33 +63,10 @@ import { assert } from 'tsafe';
import BoardFieldInputComponent from './inputs/BoardFieldInputComponent';
import BooleanFieldInputComponent from './inputs/BooleanFieldInputComponent';
-import CLIPEmbedModelFieldInputComponent from './inputs/CLIPEmbedModelFieldInputComponent';
-import CLIPGEmbedModelFieldInputComponent from './inputs/CLIPGEmbedModelFieldInputComponent';
-import CLIPLEmbedModelFieldInputComponent from './inputs/CLIPLEmbedModelFieldInputComponent';
-import CogView4MainModelFieldInputComponent from './inputs/CogView4MainModelFieldInputComponent';
import ColorFieldInputComponent from './inputs/ColorFieldInputComponent';
-import ControlLoRAModelFieldInputComponent from './inputs/ControlLoraModelFieldInputComponent';
-import ControlNetModelFieldInputComponent from './inputs/ControlNetModelFieldInputComponent';
import EnumFieldInputComponent from './inputs/EnumFieldInputComponent';
-import FluxMainModelFieldInputComponent from './inputs/FluxMainModelFieldInputComponent';
-import FluxReduxModelFieldInputComponent from './inputs/FluxReduxModelFieldInputComponent';
-import FluxVAEModelFieldInputComponent from './inputs/FluxVAEModelFieldInputComponent';
import ImageFieldInputComponent from './inputs/ImageFieldInputComponent';
-import IPAdapterModelFieldInputComponent from './inputs/IPAdapterModelFieldInputComponent';
-import LLaVAModelFieldInputComponent from './inputs/LLaVAModelFieldInputComponent';
-import LoRAModelFieldInputComponent from './inputs/LoRAModelFieldInputComponent';
-import MainModelFieldInputComponent from './inputs/MainModelFieldInputComponent';
-import RefinerModelFieldInputComponent from './inputs/RefinerModelFieldInputComponent';
-import RunwayModelFieldInputComponent from './inputs/RunwayModelFieldInputComponent';
import SchedulerFieldInputComponent from './inputs/SchedulerFieldInputComponent';
-import SD3MainModelFieldInputComponent from './inputs/SD3MainModelFieldInputComponent';
-import SDXLMainModelFieldInputComponent from './inputs/SDXLMainModelFieldInputComponent';
-import SigLipModelFieldInputComponent from './inputs/SigLipModelFieldInputComponent';
-import SpandrelImageToImageModelFieldInputComponent from './inputs/SpandrelImageToImageModelFieldInputComponent';
-import T2IAdapterModelFieldInputComponent from './inputs/T2IAdapterModelFieldInputComponent';
-import T5EncoderModelFieldInputComponent from './inputs/T5EncoderModelFieldInputComponent';
-import VAEModelFieldInputComponent from './inputs/VAEModelFieldInputComponent';
-import Veo3ModelFieldInputComponent from './inputs/Veo3ModelFieldInputComponent';
type Props = {
nodeId: string;
@@ -287,13 +206,6 @@ export const InputFieldRenderer = memo(({ nodeId, fieldName, settings }: Props)
return ;
}
- if (isMainModelFieldInputTemplate(template)) {
- if (!isMainModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
if (isModelIdentifierFieldInputTemplate(template)) {
if (!isModelIdentifierFieldInputInstance(field)) {
return null;
@@ -301,159 +213,6 @@ export const InputFieldRenderer = memo(({ nodeId, fieldName, settings }: Props)
return ;
}
- if (isSDXLRefinerModelFieldInputTemplate(template)) {
- if (!isSDXLRefinerModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
- if (isVAEModelFieldInputTemplate(template)) {
- if (!isVAEModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
- if (isT5EncoderModelFieldInputTemplate(template)) {
- if (!isT5EncoderModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
- if (isCLIPEmbedModelFieldInputTemplate(template)) {
- if (!isCLIPEmbedModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
- if (isCLIPLEmbedModelFieldInputTemplate(template)) {
- if (!isCLIPLEmbedModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
- if (isCLIPGEmbedModelFieldInputTemplate(template)) {
- if (!isCLIPGEmbedModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
- if (isControlLoRAModelFieldInputTemplate(template)) {
- if (!isControlLoRAModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
- if (isLLaVAModelFieldInputTemplate(template)) {
- if (!isLLaVAModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
- if (isFluxVAEModelFieldInputTemplate(template)) {
- if (!isFluxVAEModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
- if (isLoRAModelFieldInputTemplate(template)) {
- if (!isLoRAModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
- if (isControlNetModelFieldInputTemplate(template)) {
- if (!isControlNetModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
- if (isIPAdapterModelFieldInputTemplate(template)) {
- if (!isIPAdapterModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
- if (isT2IAdapterModelFieldInputTemplate(template)) {
- if (!isT2IAdapterModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
- if (isSpandrelImageToImageModelFieldInputTemplate(template)) {
- if (!isSpandrelImageToImageModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
- if (isSigLipModelFieldInputTemplate(template)) {
- if (!isSigLipModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
- if (isFluxReduxModelFieldInputTemplate(template)) {
- if (!isFluxReduxModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
- if (isImagen3ModelFieldInputTemplate(template)) {
- if (!isImagen3ModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
- if (isImagen4ModelFieldInputTemplate(template)) {
- if (!isImagen4ModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
- if (isFluxKontextModelFieldInputTemplate(template)) {
- if (!isFluxKontextModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
- if (isChatGPT4oModelFieldInputTemplate(template)) {
- if (!isChatGPT4oModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
- if (isVeo3ModelFieldInputTemplate(template)) {
- if (!isVeo3ModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
- if (isRunwayModelFieldInputTemplate(template)) {
- if (!isRunwayModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
if (isColorFieldInputTemplate(template)) {
if (!isColorFieldInputInstance(field)) {
return null;
@@ -461,34 +220,6 @@ export const InputFieldRenderer = memo(({ nodeId, fieldName, settings }: Props)
return ;
}
- if (isFluxMainModelFieldInputTemplate(template)) {
- if (!isFluxMainModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
- if (isSD3MainModelFieldInputTemplate(template)) {
- if (!isSD3MainModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
- if (isCogView4MainModelFieldInputTemplate(template)) {
- if (!isCogView4MainModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
- if (isSDXLMainModelFieldInputTemplate(template)) {
- if (!isSDXLMainModelFieldInputInstance(field)) {
- return null;
- }
- return ;
- }
-
if (isSchedulerFieldInputTemplate(template)) {
if (!isSchedulerFieldInputInstance(field)) {
return null;
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/CLIPEmbedModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/CLIPEmbedModelFieldInputComponent.tsx
deleted file mode 100644
index ffde4746ab7..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/CLIPEmbedModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldCLIPEmbedValueChanged } from 'features/nodes/store/nodesSlice';
-import type { CLIPEmbedModelFieldInputInstance, CLIPEmbedModelFieldInputTemplate } from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useCLIPEmbedModels } from 'services/api/hooks/modelsByType';
-import type { CLIPEmbedModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-type Props = FieldComponentProps;
-
-const CLIPEmbedModelFieldInputComponent = (props: Props) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
- const [modelConfigs, { isLoading }] = useCLIPEmbedModels();
- const onChange = useCallback(
- (value: CLIPEmbedModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldCLIPEmbedValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
-
- );
-};
-
-export default memo(CLIPEmbedModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/CLIPGEmbedModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/CLIPGEmbedModelFieldInputComponent.tsx
deleted file mode 100644
index 6f2719a6a16..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/CLIPGEmbedModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldCLIPGEmbedValueChanged } from 'features/nodes/store/nodesSlice';
-import type { CLIPGEmbedModelFieldInputInstance, CLIPGEmbedModelFieldInputTemplate } from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useCLIPEmbedModels } from 'services/api/hooks/modelsByType';
-import { type CLIPGEmbedModelConfig, isCLIPGEmbedModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-type Props = FieldComponentProps;
-
-const CLIPGEmbedModelFieldInputComponent = (props: Props) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
- const [modelConfigs, { isLoading }] = useCLIPEmbedModels();
-
- const onChange = useCallback(
- (value: CLIPGEmbedModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldCLIPGEmbedValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
- isCLIPGEmbedModelConfig(config))}
- isLoadingConfigs={isLoading}
- onChange={onChange}
- required={props.fieldTemplate.required}
- />
- );
-};
-
-export default memo(CLIPGEmbedModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/CLIPLEmbedModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/CLIPLEmbedModelFieldInputComponent.tsx
deleted file mode 100644
index 1ae0ec2d200..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/CLIPLEmbedModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldCLIPLEmbedValueChanged } from 'features/nodes/store/nodesSlice';
-import type { CLIPLEmbedModelFieldInputInstance, CLIPLEmbedModelFieldInputTemplate } from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useCLIPEmbedModels } from 'services/api/hooks/modelsByType';
-import { type CLIPLEmbedModelConfig, isCLIPLEmbedModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-type Props = FieldComponentProps;
-
-const CLIPLEmbedModelFieldInputComponent = (props: Props) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
- const [modelConfigs, { isLoading }] = useCLIPEmbedModels();
-
- const onChange = useCallback(
- (value: CLIPLEmbedModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldCLIPLEmbedValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
- isCLIPLEmbedModelConfig(config))}
- isLoadingConfigs={isLoading}
- onChange={onChange}
- required={props.fieldTemplate.required}
- />
- );
-};
-
-export default memo(CLIPLEmbedModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ChatGPT4oModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ChatGPT4oModelFieldInputComponent.tsx
deleted file mode 100644
index 79fce881d56..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ChatGPT4oModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldChatGPT4oModelValueChanged } from 'features/nodes/store/nodesSlice';
-import type { ChatGPT4oModelFieldInputInstance, ChatGPT4oModelFieldInputTemplate } from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useChatGPT4oModels } from 'services/api/hooks/modelsByType';
-import type { ApiModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-const ChatGPT4oModelFieldInputComponent = (
- props: FieldComponentProps
-) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
-
- const [modelConfigs, { isLoading }] = useChatGPT4oModels();
-
- const onChange = useCallback(
- (value: ApiModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldChatGPT4oModelValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
-
- );
-};
-
-export default memo(ChatGPT4oModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/CogView4MainModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/CogView4MainModelFieldInputComponent.tsx
deleted file mode 100644
index 8e3569d8e80..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/CogView4MainModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,63 +0,0 @@
-import { Combobox, Flex, FormControl } from '@invoke-ai/ui-library';
-import { useAppDispatch } from 'app/store/storeHooks';
-import { useGroupedModelCombobox } from 'common/hooks/useGroupedModelCombobox';
-import { fieldMainModelValueChanged } from 'features/nodes/store/nodesSlice';
-import { NO_DRAG_CLASS, NO_WHEEL_CLASS } from 'features/nodes/types/constants';
-import type {
- CogView4MainModelFieldInputInstance,
- CogView4MainModelFieldInputTemplate,
-} from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useCogView4Models } from 'services/api/hooks/modelsByType';
-import type { MainModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-type Props = FieldComponentProps;
-
-const CogView4MainModelFieldInputComponent = (props: Props) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
- const [modelConfigs, { isLoading }] = useCogView4Models();
- const _onChange = useCallback(
- (value: MainModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldMainModelValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
- const { options, value, onChange, placeholder, noOptionsMessage } = useGroupedModelCombobox({
- modelConfigs,
- onChange: _onChange,
- isLoading,
- selectedModel: field.value,
- });
-
- return (
-
-
-
-
-
- );
-};
-
-export default memo(CogView4MainModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ControlLoraModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ControlLoraModelFieldInputComponent.tsx
deleted file mode 100644
index 0280504b0d4..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ControlLoraModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,48 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldControlLoRAModelValueChanged } from 'features/nodes/store/nodesSlice';
-import type {
- ControlLoRAModelFieldInputInstance,
- ControlLoRAModelFieldInputTemplate,
-} from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useControlLoRAModel } from 'services/api/hooks/modelsByType';
-import type { ControlLoRAModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-type Props = FieldComponentProps;
-
-const ControlLoRAModelFieldInputComponent = (props: Props) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
- const [modelConfigs, { isLoading }] = useControlLoRAModel();
-
- const onChange = useCallback(
- (value: ControlLoRAModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldControlLoRAModelValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
-
- );
-};
-
-export default memo(ControlLoRAModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ControlNetModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ControlNetModelFieldInputComponent.tsx
deleted file mode 100644
index e05f4f98373..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ControlNetModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldControlNetModelValueChanged } from 'features/nodes/store/nodesSlice';
-import type { ControlNetModelFieldInputInstance, ControlNetModelFieldInputTemplate } from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useControlNetModels } from 'services/api/hooks/modelsByType';
-import type { ControlNetModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-type Props = FieldComponentProps;
-
-const ControlNetModelFieldInputComponent = (props: Props) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
- const [modelConfigs, { isLoading }] = useControlNetModels();
-
- const onChange = useCallback(
- (value: ControlNetModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldControlNetModelValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
-
- );
-};
-
-export default memo(ControlNetModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FluxKontextModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FluxKontextModelFieldInputComponent.tsx
deleted file mode 100644
index 4a662880561..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FluxKontextModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldFluxKontextModelValueChanged } from 'features/nodes/store/nodesSlice';
-import type {
- FluxKontextModelFieldInputInstance,
- FluxKontextModelFieldInputTemplate,
-} from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useFluxKontextModels } from 'services/api/hooks/modelsByType';
-import type { ApiModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-const FluxKontextModelFieldInputComponent = (
- props: FieldComponentProps
-) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
-
- const [modelConfigs, { isLoading }] = useFluxKontextModels();
-
- const onChange = useCallback(
- (value: ApiModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldFluxKontextModelValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
-
- );
-};
-
-export default memo(FluxKontextModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FluxMainModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FluxMainModelFieldInputComponent.tsx
deleted file mode 100644
index afe4c298e6a..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FluxMainModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldMainModelValueChanged } from 'features/nodes/store/nodesSlice';
-import type { FluxMainModelFieldInputInstance, FluxMainModelFieldInputTemplate } from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useFluxModels } from 'services/api/hooks/modelsByType';
-import type { MainModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-type Props = FieldComponentProps;
-
-const FluxMainModelFieldInputComponent = (props: Props) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
- const [modelConfigs, { isLoading }] = useFluxModels();
- const onChange = useCallback(
- (value: MainModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldMainModelValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
-
- );
-};
-
-export default memo(FluxMainModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FluxReduxModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FluxReduxModelFieldInputComponent.tsx
deleted file mode 100644
index 0f7a58cf011..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FluxReduxModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldFluxReduxModelValueChanged } from 'features/nodes/store/nodesSlice';
-import type { FluxReduxModelFieldInputInstance, FluxReduxModelFieldInputTemplate } from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useFluxReduxModels } from 'services/api/hooks/modelsByType';
-import type { FLUXReduxModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-const FluxReduxModelFieldInputComponent = (
- props: FieldComponentProps
-) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
-
- const [modelConfigs, { isLoading }] = useFluxReduxModels();
-
- const onChange = useCallback(
- (value: FLUXReduxModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldFluxReduxModelValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
-
- );
-};
-
-export default memo(FluxReduxModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FluxVAEModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FluxVAEModelFieldInputComponent.tsx
deleted file mode 100644
index bb27319d0fa..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/FluxVAEModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldFluxVAEModelValueChanged } from 'features/nodes/store/nodesSlice';
-import type { FluxVAEModelFieldInputInstance, FluxVAEModelFieldInputTemplate } from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useFluxVAEModels } from 'services/api/hooks/modelsByType';
-import type { VAEModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-type Props = FieldComponentProps;
-
-const FluxVAEModelFieldInputComponent = (props: Props) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
- const [modelConfigs, { isLoading }] = useFluxVAEModels();
- const onChange = useCallback(
- (value: VAEModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldFluxVAEModelValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
-
- );
-};
-
-export default memo(FluxVAEModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IPAdapterModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IPAdapterModelFieldInputComponent.tsx
deleted file mode 100644
index 2969d11c3b0..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/IPAdapterModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,45 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldIPAdapterModelValueChanged } from 'features/nodes/store/nodesSlice';
-import type { IPAdapterModelFieldInputInstance, IPAdapterModelFieldInputTemplate } from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useIPAdapterModels } from 'services/api/hooks/modelsByType';
-import type { IPAdapterModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-const IPAdapterModelFieldInputComponent = (
- props: FieldComponentProps
-) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
- const [modelConfigs, { isLoading }] = useIPAdapterModels();
-
- const onChange = useCallback(
- (value: IPAdapterModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldIPAdapterModelValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
-
- );
-};
-
-export default memo(IPAdapterModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/Imagen3ModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/Imagen3ModelFieldInputComponent.tsx
deleted file mode 100644
index b7fe9fd7f0c..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/Imagen3ModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldImagen3ModelValueChanged } from 'features/nodes/store/nodesSlice';
-import type { Imagen3ModelFieldInputInstance, Imagen3ModelFieldInputTemplate } from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useImagen3Models } from 'services/api/hooks/modelsByType';
-import type { ApiModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-const Imagen3ModelFieldInputComponent = (
- props: FieldComponentProps
-) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
-
- const [modelConfigs, { isLoading }] = useImagen3Models();
-
- const onChange = useCallback(
- (value: ApiModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldImagen3ModelValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
-
- );
-};
-
-export default memo(Imagen3ModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/Imagen4ModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/Imagen4ModelFieldInputComponent.tsx
deleted file mode 100644
index 58b5d49917a..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/Imagen4ModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldImagen4ModelValueChanged } from 'features/nodes/store/nodesSlice';
-import type { Imagen4ModelFieldInputInstance, Imagen4ModelFieldInputTemplate } from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useImagen4Models } from 'services/api/hooks/modelsByType';
-import type { ApiModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-const Imagen4ModelFieldInputComponent = (
- props: FieldComponentProps
-) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
-
- const [modelConfigs, { isLoading }] = useImagen4Models();
-
- const onChange = useCallback(
- (value: ApiModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldImagen4ModelValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
-
- );
-};
-
-export default memo(Imagen4ModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/LLaVAModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/LLaVAModelFieldInputComponent.tsx
deleted file mode 100644
index 0e7154ddedc..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/LLaVAModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldLLaVAModelValueChanged } from 'features/nodes/store/nodesSlice';
-import type { LLaVAModelFieldInputInstance, LLaVAModelFieldInputTemplate } from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useLLaVAModels } from 'services/api/hooks/modelsByType';
-import type { LlavaOnevisionConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-type Props = FieldComponentProps;
-
-const LLaVAModelFieldInputComponent = (props: Props) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
- const [modelConfigs, { isLoading }] = useLLaVAModels();
- const onChange = useCallback(
- (value: LlavaOnevisionConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldLLaVAModelValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
-
- );
-};
-
-export default memo(LLaVAModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/LoRAModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/LoRAModelFieldInputComponent.tsx
deleted file mode 100644
index 01c40e43616..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/LoRAModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldLoRAModelValueChanged } from 'features/nodes/store/nodesSlice';
-import type { LoRAModelFieldInputInstance, LoRAModelFieldInputTemplate } from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useLoRAModels } from 'services/api/hooks/modelsByType';
-import type { LoRAModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-type Props = FieldComponentProps;
-
-const LoRAModelFieldInputComponent = (props: Props) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
- const [modelConfigs, { isLoading }] = useLoRAModels();
- const onChange = useCallback(
- (value: LoRAModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldLoRAModelValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
-
- );
-};
-
-export default memo(LoRAModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/MainModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/MainModelFieldInputComponent.tsx
deleted file mode 100644
index acf6842024e..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/MainModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldMainModelValueChanged } from 'features/nodes/store/nodesSlice';
-import type { MainModelFieldInputInstance, MainModelFieldInputTemplate } from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useNonSDXLMainModels } from 'services/api/hooks/modelsByType';
-import type { MainModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-type Props = FieldComponentProps;
-
-const MainModelFieldInputComponent = (props: Props) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
- const [modelConfigs, { isLoading }] = useNonSDXLMainModels();
- const onChange = useCallback(
- (value: MainModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldMainModelValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
-
- );
-};
-
-export default memo(MainModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelIdentifierFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelIdentifierFieldInputComponent.tsx
index 37185fe6efc..ca215d07258 100644
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelIdentifierFieldInputComponent.tsx
+++ b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelIdentifierFieldInputComponent.tsx
@@ -12,7 +12,7 @@ import type { FieldComponentProps } from './types';
type Props = FieldComponentProps;
const ModelIdentifierFieldInputComponent = (props: Props) => {
- const { nodeId, field } = props;
+ const { nodeId, field, fieldTemplate } = props;
const dispatch = useAppDispatch();
const { data, isLoading } = useGetModelConfigsQuery();
const onChange = useCallback(
@@ -36,8 +36,31 @@ const ModelIdentifierFieldInputComponent = (props: Props) => {
return EMPTY_ARRAY;
}
- return modelConfigsAdapterSelectors.selectAll(data);
- }, [data]);
+ if (!fieldTemplate.ui_model_base && !fieldTemplate.ui_model_type) {
+ return modelConfigsAdapterSelectors.selectAll(data);
+ }
+
+ return modelConfigsAdapterSelectors.selectAll(data).filter((config) => {
+ if (fieldTemplate.ui_model_base && !fieldTemplate.ui_model_base.includes(config.base)) {
+ return false;
+ }
+ if (fieldTemplate.ui_model_type && !fieldTemplate.ui_model_type.includes(config.type)) {
+ return false;
+ }
+ if (
+ fieldTemplate.ui_model_variant &&
+ 'variant' in config &&
+ config.variant &&
+ !fieldTemplate.ui_model_variant.includes(config.variant)
+ ) {
+ return false;
+ }
+ if (fieldTemplate.ui_model_format && !fieldTemplate.ui_model_format.includes(config.format)) {
+ return false;
+ }
+ return true;
+ });
+ }, [data, fieldTemplate]);
return (
;
-
-const RefinerModelFieldInputComponent = (props: Props) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
- const [modelConfigs, { isLoading }] = useRefinerModels();
- const onChange = useCallback(
- (value: MainModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldRefinerModelValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
-
- );
-};
-
-export default memo(RefinerModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/RunwayModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/RunwayModelFieldInputComponent.tsx
deleted file mode 100644
index e8ad04d8812..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/RunwayModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldRunwayModelValueChanged } from 'features/nodes/store/nodesSlice';
-import type { RunwayModelFieldInputInstance, RunwayModelFieldInputTemplate } from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useRunwayModels } from 'services/api/hooks/modelsByType';
-import type { VideoApiModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-const RunwayModelFieldInputComponent = (
- props: FieldComponentProps
-) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
-
- const [modelConfigs, { isLoading }] = useRunwayModels();
-
- const onChange = useCallback(
- (value: VideoApiModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldRunwayModelValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
-
- );
-};
-
-export default memo(RunwayModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SD3MainModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SD3MainModelFieldInputComponent.tsx
deleted file mode 100644
index c1aa942781c..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SD3MainModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldMainModelValueChanged } from 'features/nodes/store/nodesSlice';
-import type { SD3MainModelFieldInputInstance, SD3MainModelFieldInputTemplate } from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useSD3Models } from 'services/api/hooks/modelsByType';
-import type { MainModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-type Props = FieldComponentProps;
-
-const SD3MainModelFieldInputComponent = (props: Props) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
- const [modelConfigs, { isLoading }] = useSD3Models();
- const onChange = useCallback(
- (value: MainModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldMainModelValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
-
- );
-};
-
-export default memo(SD3MainModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SDXLMainModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SDXLMainModelFieldInputComponent.tsx
deleted file mode 100644
index dbc21ce81f0..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SDXLMainModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldMainModelValueChanged } from 'features/nodes/store/nodesSlice';
-import type { SDXLMainModelFieldInputInstance, SDXLMainModelFieldInputTemplate } from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useSDXLModels } from 'services/api/hooks/modelsByType';
-import type { MainModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-type Props = FieldComponentProps;
-
-const SDXLMainModelFieldInputComponent = (props: Props) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
- const [modelConfigs, { isLoading }] = useSDXLModels();
- const onChange = useCallback(
- (value: MainModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldMainModelValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
-
- );
-};
-
-export default memo(SDXLMainModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SigLipModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SigLipModelFieldInputComponent.tsx
deleted file mode 100644
index 1ea330cb64e..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SigLipModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldSigLipModelValueChanged } from 'features/nodes/store/nodesSlice';
-import type { SigLipModelFieldInputInstance, SigLipModelFieldInputTemplate } from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useSigLipModels } from 'services/api/hooks/modelsByType';
-import type { SigLipModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-const SigLipModelFieldInputComponent = (
- props: FieldComponentProps
-) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
-
- const [modelConfigs, { isLoading }] = useSigLipModels();
-
- const onChange = useCallback(
- (value: SigLipModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldSigLipModelValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
-
- );
-};
-
-export default memo(SigLipModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SpandrelImageToImageModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SpandrelImageToImageModelFieldInputComponent.tsx
deleted file mode 100644
index 1f855982ba0..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/SpandrelImageToImageModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,49 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldSpandrelImageToImageModelValueChanged } from 'features/nodes/store/nodesSlice';
-import type {
- SpandrelImageToImageModelFieldInputInstance,
- SpandrelImageToImageModelFieldInputTemplate,
-} from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useSpandrelImageToImageModels } from 'services/api/hooks/modelsByType';
-import type { SpandrelImageToImageModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-const SpandrelImageToImageModelFieldInputComponent = (
- props: FieldComponentProps
-) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
-
- const [modelConfigs, { isLoading }] = useSpandrelImageToImageModels();
-
- const onChange = useCallback(
- (value: SpandrelImageToImageModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldSpandrelImageToImageModelValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
-
- );
-};
-
-export default memo(SpandrelImageToImageModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/T2IAdapterModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/T2IAdapterModelFieldInputComponent.tsx
deleted file mode 100644
index 2c9cf308794..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/T2IAdapterModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldT2IAdapterModelValueChanged } from 'features/nodes/store/nodesSlice';
-import type { T2IAdapterModelFieldInputInstance, T2IAdapterModelFieldInputTemplate } from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useT2IAdapterModels } from 'services/api/hooks/modelsByType';
-import type { T2IAdapterModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-const T2IAdapterModelFieldInputComponent = (
- props: FieldComponentProps
-) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
-
- const [modelConfigs, { isLoading }] = useT2IAdapterModels();
-
- const onChange = useCallback(
- (value: T2IAdapterModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldT2IAdapterModelValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
-
- );
-};
-
-export default memo(T2IAdapterModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/T5EncoderModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/T5EncoderModelFieldInputComponent.tsx
deleted file mode 100644
index d7e43a4de7c..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/T5EncoderModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,43 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldT5EncoderValueChanged } from 'features/nodes/store/nodesSlice';
-import type { T5EncoderModelFieldInputInstance, T5EncoderModelFieldInputTemplate } from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useT5EncoderModels } from 'services/api/hooks/modelsByType';
-import type { T5EncoderBnbQuantizedLlmInt8bModelConfig, T5EncoderModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-type Props = FieldComponentProps;
-
-const T5EncoderModelFieldInputComponent = (props: Props) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
- const [modelConfigs, { isLoading }] = useT5EncoderModels();
- const onChange = useCallback(
- (value: T5EncoderBnbQuantizedLlmInt8bModelConfig | T5EncoderModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldT5EncoderValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
- return (
-
- );
-};
-
-export default memo(T5EncoderModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/VAEModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/VAEModelFieldInputComponent.tsx
deleted file mode 100644
index f8fcc93daf0..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/VAEModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldVaeModelValueChanged } from 'features/nodes/store/nodesSlice';
-import type { VAEModelFieldInputInstance, VAEModelFieldInputTemplate } from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useVAEModels } from 'services/api/hooks/modelsByType';
-import type { VAEModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-type Props = FieldComponentProps;
-
-const VAEModelFieldInputComponent = (props: Props) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
- const [modelConfigs, { isLoading }] = useVAEModels();
- const onChange = useCallback(
- (value: VAEModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldVaeModelValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
-
- );
-};
-
-export default memo(VAEModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/Veo3ModelFieldInputComponent.tsx b/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/Veo3ModelFieldInputComponent.tsx
deleted file mode 100644
index c612ad78c7b..00000000000
--- a/invokeai/frontend/web/src/features/nodes/components/flow/nodes/Invocation/fields/inputs/Veo3ModelFieldInputComponent.tsx
+++ /dev/null
@@ -1,46 +0,0 @@
-import { useAppDispatch } from 'app/store/storeHooks';
-import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
-import { fieldVeo3ModelValueChanged } from 'features/nodes/store/nodesSlice';
-import type { Veo3ModelFieldInputInstance, Veo3ModelFieldInputTemplate } from 'features/nodes/types/field';
-import { memo, useCallback } from 'react';
-import { useVeo3Models } from 'services/api/hooks/modelsByType';
-import type { VideoApiModelConfig } from 'services/api/types';
-
-import type { FieldComponentProps } from './types';
-
-const Veo3ModelFieldInputComponent = (
- props: FieldComponentProps
-) => {
- const { nodeId, field } = props;
- const dispatch = useAppDispatch();
-
- const [modelConfigs, { isLoading }] = useVeo3Models();
-
- const onChange = useCallback(
- (value: VideoApiModelConfig | null) => {
- if (!value) {
- return;
- }
- dispatch(
- fieldVeo3ModelValueChanged({
- nodeId,
- fieldName: field.name,
- value,
- })
- );
- },
- [dispatch, field.name, nodeId]
- );
-
- return (
-
- );
-};
-
-export default memo(Veo3ModelFieldInputComponent);
diff --git a/invokeai/frontend/web/src/features/nodes/hooks/useInputFieldNamesByStatus.ts b/invokeai/frontend/web/src/features/nodes/hooks/useInputFieldNamesByStatus.ts
index 2e35db9166b..23fc490e34f 100644
--- a/invokeai/frontend/web/src/features/nodes/hooks/useInputFieldNamesByStatus.ts
+++ b/invokeai/frontend/web/src/features/nodes/hooks/useInputFieldNamesByStatus.ts
@@ -2,20 +2,16 @@ import { createSelector } from '@reduxjs/toolkit';
import { useAppSelector } from 'app/store/storeHooks';
import { useInvocationNodeContext } from 'features/nodes/components/flow/nodes/Invocation/context';
import type { FieldInputTemplate } from 'features/nodes/types/field';
-import { isSingleOrCollection } from 'features/nodes/types/field';
-import { TEMPLATE_BUILDER_MAP } from 'features/nodes/util/schema/buildFieldInputTemplate';
+import { isSingleOrCollection, isStatefulFieldType } from 'features/nodes/types/field';
import { useMemo } from 'react';
const isConnectionInputField = (field: FieldInputTemplate) => {
- return (
- (field.input === 'connection' && !isSingleOrCollection(field.type)) || !(field.type.name in TEMPLATE_BUILDER_MAP)
- );
+ return (field.input === 'connection' && !isSingleOrCollection(field.type)) || !isStatefulFieldType(field.type);
};
const isAnyOrDirectInputField = (field: FieldInputTemplate) => {
return (
- (['any', 'direct'].includes(field.input) || isSingleOrCollection(field.type)) &&
- field.type.name in TEMPLATE_BUILDER_MAP
+ (['any', 'direct'].includes(field.input) || isSingleOrCollection(field.type)) && isStatefulFieldType(field.type)
);
};
diff --git a/invokeai/frontend/web/src/features/nodes/store/nodesSlice.ts b/invokeai/frontend/web/src/features/nodes/store/nodesSlice.ts
index fe9cd6bebe1..20c27d2cd6e 100644
--- a/invokeai/frontend/web/src/features/nodes/store/nodesSlice.ts
+++ b/invokeai/frontend/web/src/features/nodes/store/nodesSlice.ts
@@ -24,90 +24,44 @@ import { SHARED_NODE_PROPERTIES } from 'features/nodes/types/constants';
import type {
BoardFieldValue,
BooleanFieldValue,
- ChatGPT4oModelFieldValue,
- CLIPEmbedModelFieldValue,
- CLIPGEmbedModelFieldValue,
- CLIPLEmbedModelFieldValue,
ColorFieldValue,
- ControlLoRAModelFieldValue,
- ControlNetModelFieldValue,
EnumFieldValue,
FieldValue,
FloatFieldValue,
FloatGeneratorFieldValue,
- FluxKontextModelFieldValue,
- FluxReduxModelFieldValue,
- FluxVAEModelFieldValue,
ImageFieldCollectionValue,
ImageFieldValue,
ImageGeneratorFieldValue,
- Imagen3ModelFieldValue,
- Imagen4ModelFieldValue,
IntegerFieldCollectionValue,
IntegerFieldValue,
IntegerGeneratorFieldValue,
- IPAdapterModelFieldValue,
- LLaVAModelFieldValue,
- LoRAModelFieldValue,
- MainModelFieldValue,
ModelIdentifierFieldValue,
- RunwayModelFieldValue,
SchedulerFieldValue,
- SDXLRefinerModelFieldValue,
- SigLipModelFieldValue,
- SpandrelImageToImageModelFieldValue,
StatefulFieldValue,
StringFieldCollectionValue,
StringFieldValue,
StringGeneratorFieldValue,
- T2IAdapterModelFieldValue,
- T5EncoderModelFieldValue,
- VAEModelFieldValue,
- Veo3ModelFieldValue,
} from 'features/nodes/types/field';
import {
zBoardFieldValue,
zBooleanFieldValue,
- zChatGPT4oModelFieldValue,
- zCLIPEmbedModelFieldValue,
- zCLIPGEmbedModelFieldValue,
- zCLIPLEmbedModelFieldValue,
zColorFieldValue,
- zControlLoRAModelFieldValue,
- zControlNetModelFieldValue,
zEnumFieldValue,
zFloatFieldCollectionValue,
zFloatFieldValue,
zFloatGeneratorFieldValue,
- zFluxKontextModelFieldValue,
- zFluxReduxModelFieldValue,
- zFluxVAEModelFieldValue,
zImageFieldCollectionValue,
zImageFieldValue,
zImageGeneratorFieldValue,
- zImagen3ModelFieldValue,
- zImagen4ModelFieldValue,
zIntegerFieldCollectionValue,
zIntegerFieldValue,
zIntegerGeneratorFieldValue,
- zIPAdapterModelFieldValue,
- zLLaVAModelFieldValue,
- zLoRAModelFieldValue,
- zMainModelFieldValue,
zModelIdentifierFieldValue,
- zRunwayModelFieldValue,
zSchedulerFieldValue,
- zSDXLRefinerModelFieldValue,
- zSigLipModelFieldValue,
- zSpandrelImageToImageModelFieldValue,
zStatefulFieldValue,
zStringFieldCollectionValue,
zStringFieldValue,
zStringGeneratorFieldValue,
- zT2IAdapterModelFieldValue,
- zT5EncoderModelFieldValue,
- zVAEModelFieldValue,
- zVeo3ModelFieldValue,
} from 'features/nodes/types/field';
import type { AnyEdge, AnyNode } from 'features/nodes/types/invocation';
import { isInvocationNode, isNotesNode } from 'features/nodes/types/invocation';
@@ -493,81 +447,9 @@ const slice = createSlice({
fieldColorValueChanged: (state, action: FieldValueAction) => {
fieldValueReducer(state, action, zColorFieldValue);
},
- fieldMainModelValueChanged: (state, action: FieldValueAction) => {
- fieldValueReducer(state, action, zMainModelFieldValue);
- },
fieldModelIdentifierValueChanged: (state, action: FieldValueAction) => {
fieldValueReducer(state, action, zModelIdentifierFieldValue);
},
- fieldRefinerModelValueChanged: (state, action: FieldValueAction) => {
- fieldValueReducer(state, action, zSDXLRefinerModelFieldValue);
- },
- fieldVaeModelValueChanged: (state, action: FieldValueAction) => {
- fieldValueReducer(state, action, zVAEModelFieldValue);
- },
- fieldLoRAModelValueChanged: (state, action: FieldValueAction) => {
- fieldValueReducer(state, action, zLoRAModelFieldValue);
- },
- fieldLLaVAModelValueChanged: (state, action: FieldValueAction) => {
- fieldValueReducer(state, action, zLLaVAModelFieldValue);
- },
- fieldControlNetModelValueChanged: (state, action: FieldValueAction) => {
- fieldValueReducer(state, action, zControlNetModelFieldValue);
- },
- fieldIPAdapterModelValueChanged: (state, action: FieldValueAction) => {
- fieldValueReducer(state, action, zIPAdapterModelFieldValue);
- },
- fieldT2IAdapterModelValueChanged: (state, action: FieldValueAction) => {
- fieldValueReducer(state, action, zT2IAdapterModelFieldValue);
- },
- fieldSpandrelImageToImageModelValueChanged: (
- state,
- action: FieldValueAction
- ) => {
- fieldValueReducer(state, action, zSpandrelImageToImageModelFieldValue);
- },
- fieldT5EncoderValueChanged: (state, action: FieldValueAction) => {
- fieldValueReducer(state, action, zT5EncoderModelFieldValue);
- },
- fieldCLIPEmbedValueChanged: (state, action: FieldValueAction) => {
- fieldValueReducer(state, action, zCLIPEmbedModelFieldValue);
- },
- fieldCLIPLEmbedValueChanged: (state, action: FieldValueAction) => {
- fieldValueReducer(state, action, zCLIPLEmbedModelFieldValue);
- },
- fieldCLIPGEmbedValueChanged: (state, action: FieldValueAction) => {
- fieldValueReducer(state, action, zCLIPGEmbedModelFieldValue);
- },
- fieldControlLoRAModelValueChanged: (state, action: FieldValueAction) => {
- fieldValueReducer(state, action, zControlLoRAModelFieldValue);
- },
- fieldFluxVAEModelValueChanged: (state, action: FieldValueAction) => {
- fieldValueReducer(state, action, zFluxVAEModelFieldValue);
- },
- fieldSigLipModelValueChanged: (state, action: FieldValueAction) => {
- fieldValueReducer(state, action, zSigLipModelFieldValue);
- },
- fieldFluxReduxModelValueChanged: (state, action: FieldValueAction) => {
- fieldValueReducer(state, action, zFluxReduxModelFieldValue);
- },
- fieldImagen3ModelValueChanged: (state, action: FieldValueAction) => {
- fieldValueReducer(state, action, zImagen3ModelFieldValue);
- },
- fieldImagen4ModelValueChanged: (state, action: FieldValueAction) => {
- fieldValueReducer(state, action, zImagen4ModelFieldValue);
- },
- fieldChatGPT4oModelValueChanged: (state, action: FieldValueAction) => {
- fieldValueReducer(state, action, zChatGPT4oModelFieldValue);
- },
- fieldVeo3ModelValueChanged: (state, action: FieldValueAction) => {
- fieldValueReducer(state, action, zVeo3ModelFieldValue);
- },
- fieldRunwayModelValueChanged: (state, action: FieldValueAction) => {
- fieldValueReducer(state, action, zRunwayModelFieldValue);
- },
- fieldFluxKontextModelValueChanged: (state, action: FieldValueAction) => {
- fieldValueReducer(state, action, zFluxKontextModelFieldValue);
- },
fieldEnumModelValueChanged: (state, action: FieldValueAction) => {
fieldValueReducer(state, action, zEnumFieldValue);
},
@@ -706,45 +588,22 @@ export const {
fieldBoardValueChanged,
fieldBooleanValueChanged,
fieldColorValueChanged,
- fieldControlNetModelValueChanged,
fieldEnumModelValueChanged,
fieldImageValueChanged,
fieldImageCollectionValueChanged,
- fieldIPAdapterModelValueChanged,
- fieldT2IAdapterModelValueChanged,
- fieldSpandrelImageToImageModelValueChanged,
fieldLabelChanged,
- fieldLoRAModelValueChanged,
- fieldLLaVAModelValueChanged,
fieldModelIdentifierValueChanged,
- fieldMainModelValueChanged,
fieldIntegerValueChanged,
fieldFloatValueChanged,
fieldFloatCollectionValueChanged,
fieldIntegerCollectionValueChanged,
- fieldRefinerModelValueChanged,
fieldSchedulerValueChanged,
fieldStringValueChanged,
fieldStringCollectionValueChanged,
- fieldVaeModelValueChanged,
- fieldT5EncoderValueChanged,
- fieldCLIPEmbedValueChanged,
- fieldCLIPLEmbedValueChanged,
- fieldCLIPGEmbedValueChanged,
- fieldControlLoRAModelValueChanged,
- fieldFluxVAEModelValueChanged,
- fieldSigLipModelValueChanged,
- fieldFluxReduxModelValueChanged,
- fieldImagen3ModelValueChanged,
- fieldImagen4ModelValueChanged,
- fieldChatGPT4oModelValueChanged,
- fieldFluxKontextModelValueChanged,
fieldFloatGeneratorValueChanged,
fieldIntegerGeneratorValueChanged,
fieldStringGeneratorValueChanged,
fieldImageGeneratorValueChanged,
- fieldVeo3ModelValueChanged,
- fieldRunwayModelValueChanged,
fieldDescriptionChanged,
nodeEditorReset,
nodeIsIntermediateChanged,
diff --git a/invokeai/frontend/web/src/features/nodes/store/util/areTypesEqual.test.ts b/invokeai/frontend/web/src/features/nodes/store/util/areTypesEqual.test.ts
index 94985396596..271aa904c38 100644
--- a/invokeai/frontend/web/src/features/nodes/store/util/areTypesEqual.test.ts
+++ b/invokeai/frontend/web/src/features/nodes/store/util/areTypesEqual.test.ts
@@ -40,7 +40,7 @@ describe(areTypesEqual.name, () => {
},
};
const targetType: FieldType = {
- name: 'MainModelField',
+ name: 'StringField',
cardinality: 'SINGLE',
batch: false,
originalType: {
@@ -54,7 +54,7 @@ describe(areTypesEqual.name, () => {
it('should handle equal original source type and target type', () => {
const sourceType: FieldType = {
- name: 'MainModelField',
+ name: 'FloatField',
cardinality: 'SINGLE',
batch: false,
originalType: {
@@ -78,7 +78,7 @@ describe(areTypesEqual.name, () => {
it('should handle equal original source type and original target type', () => {
const sourceType: FieldType = {
- name: 'MainModelField',
+ name: 'IntegerField',
cardinality: 'SINGLE',
batch: false,
originalType: {
@@ -88,7 +88,7 @@ describe(areTypesEqual.name, () => {
},
};
const targetType: FieldType = {
- name: 'LoRAModelField',
+ name: 'StringField',
cardinality: 'SINGLE',
batch: false,
originalType: {
diff --git a/invokeai/frontend/web/src/features/nodes/store/util/testUtils.ts b/invokeai/frontend/web/src/features/nodes/store/util/testUtils.ts
index 5a0ad0ba709..74425619844 100644
--- a/invokeai/frontend/web/src/features/nodes/store/util/testUtils.ts
+++ b/invokeai/frontend/web/src/features/nodes/store/util/testUtils.ts
@@ -247,17 +247,12 @@ export const main_model_loader: InvocationTemplate = {
fieldKind: 'input',
input: 'direct',
ui_hidden: false,
- ui_type: 'MainModelField',
+ ui_model_base: ['sd-1'],
+ ui_model_type: ['main'],
type: {
- name: 'MainModelField',
+ name: 'ModelIdentifierField',
cardinality: 'SINGLE',
batch: false,
-
- originalType: {
- name: 'ModelIdentifierField',
- cardinality: 'SINGLE',
- batch: false,
- },
},
},
},
@@ -796,7 +791,8 @@ export const schema = {
input: 'direct',
orig_required: true,
ui_hidden: false,
- ui_type: 'MainModelField',
+ ui_model_base: ['sd-1'],
+ ui_model_type: ['main'],
},
type: {
type: 'string',
diff --git a/invokeai/frontend/web/src/features/nodes/types/common.test-d.ts b/invokeai/frontend/web/src/features/nodes/types/common.test-d.ts
index 773154d5b58..ff137c6281c 100644
--- a/invokeai/frontend/web/src/features/nodes/types/common.test-d.ts
+++ b/invokeai/frontend/web/src/features/nodes/types/common.test-d.ts
@@ -12,11 +12,15 @@ import type {
SchedulerField,
SubModelType,
T2IAdapterField,
+ zClipVariantType,
+ zModelFormat,
+ zModelVariantType,
} from 'features/nodes/types/common';
-import type { Invocation, ModelType, S } from 'services/api/types';
+import type { Invocation, S } from 'services/api/types';
import type { Equals, Extends } from 'tsafe';
import { assert } from 'tsafe';
import { describe, test } from 'vitest';
+import type z from 'zod';
/**
* These types originate from the server and are recreated as zod schemas manually, for use at runtime.
@@ -38,7 +42,9 @@ describe('Common types', () => {
test('ModelIdentifier', () => assert>());
test('ModelIdentifier', () => assert>());
test('ModelIdentifier', () => assert>());
- test('ModelIdentifier', () => assert>());
+ test('ClipVariantType', () => assert, S['ClipVariantType']>>());
+ test('ModelVariantType', () => assert, S['ModelVariantType']>>());
+ test('ModelFormat', () => assert, S['ModelFormat']>>());
// Misc types
test('ProgressImage', () => assert>());
diff --git a/invokeai/frontend/web/src/features/nodes/types/common.ts b/invokeai/frontend/web/src/features/nodes/types/common.ts
index b96b49acd89..f403f806869 100644
--- a/invokeai/frontend/web/src/features/nodes/types/common.ts
+++ b/invokeai/frontend/web/src/features/nodes/types/common.ts
@@ -73,7 +73,7 @@ export type SchedulerField = z.infer;
// #endregion
// #region Model-related schemas
-const zBaseModel = z.enum([
+export const zBaseModelType = z.enum([
'any',
'sd-1',
'sd-2',
@@ -90,7 +90,7 @@ const zBaseModel = z.enum([
'veo3',
'runway',
]);
-export type BaseModelType = z.infer;
+export type BaseModelType = z.infer;
export const zMainModelBase = z.enum([
'sd-1',
'sd-2',
@@ -143,11 +143,31 @@ const zSubModelType = z.enum([
'safety_checker',
]);
export type SubModelType = z.infer;
+
+export const zClipVariantType = z.enum(['large', 'gigantic']);
+export const zModelVariantType = z.enum(['normal', 'inpaint', 'depth']);
+export const zModelFormat = z.enum([
+ 'omi',
+ 'diffusers',
+ 'checkpoint',
+ 'lycoris',
+ 'onnx',
+ 'olive',
+ 'embedding_file',
+ 'embedding_folder',
+ 'invokeai',
+ 't5_encoder',
+ 'bnb_quantized_int8b',
+ 'bnb_quantized_nf4b',
+ 'gguf_quantized',
+ 'api',
+]);
+
export const zModelIdentifierField = z.object({
key: z.string().min(1),
hash: z.string().min(1),
name: z.string().min(1),
- base: zBaseModel,
+ base: zBaseModelType,
type: zModelType,
submodel_type: zSubModelType.nullish(),
});
diff --git a/invokeai/frontend/web/src/features/nodes/types/field.ts b/invokeai/frontend/web/src/features/nodes/types/field.ts
index ca0d54e6805..320a4ac521c 100644
--- a/invokeai/frontend/web/src/features/nodes/types/field.ts
+++ b/invokeai/frontend/web/src/features/nodes/types/field.ts
@@ -9,7 +9,18 @@ import { assert } from 'tsafe';
import { z } from 'zod';
import type { ImageField } from './common';
-import { zBoardField, zColorField, zImageField, zModelIdentifierField, zSchedulerField } from './common';
+import {
+ zBaseModelType,
+ zBoardField,
+ zClipVariantType,
+ zColorField,
+ zImageField,
+ zModelFormat,
+ zModelIdentifierField,
+ zModelType,
+ zModelVariantType,
+ zSchedulerField,
+} from './common';
/**
* zod schemas & inferred types for fields.
@@ -60,6 +71,10 @@ const zFieldInputTemplateBase = zFieldTemplateBase.extend({
default: z.undefined(),
ui_component: zFieldUIComponent.nullish(),
ui_choice_labels: z.record(z.string(), z.string()).nullish(),
+ ui_model_base: z.array(zBaseModelType).nullish(),
+ ui_model_type: z.array(zModelType).nullish(),
+ ui_model_variant: z.array(zModelVariantType.or(zClipVariantType)).nullish(),
+ ui_model_format: z.array(zModelFormat).nullish(),
});
const zFieldOutputTemplateBase = zFieldTemplateBase.extend({
fieldKind: z.literal('output'),
@@ -161,118 +176,10 @@ const zColorFieldType = zFieldTypeBase.extend({
name: z.literal('ColorField'),
originalType: zStatelessFieldType.optional(),
});
-const zMainModelFieldType = zFieldTypeBase.extend({
- name: z.literal('MainModelField'),
- originalType: zStatelessFieldType.optional(),
-});
const zModelIdentifierFieldType = zFieldTypeBase.extend({
name: z.literal('ModelIdentifierField'),
originalType: zStatelessFieldType.optional(),
});
-const zSDXLMainModelFieldType = zFieldTypeBase.extend({
- name: z.literal('SDXLMainModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zSD3MainModelFieldType = zFieldTypeBase.extend({
- name: z.literal('SD3MainModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zCogView4MainModelFieldType = zFieldTypeBase.extend({
- name: z.literal('CogView4MainModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zFluxMainModelFieldType = zFieldTypeBase.extend({
- name: z.literal('FluxMainModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zSDXLRefinerModelFieldType = zFieldTypeBase.extend({
- name: z.literal('SDXLRefinerModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zVAEModelFieldType = zFieldTypeBase.extend({
- name: z.literal('VAEModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zLoRAModelFieldType = zFieldTypeBase.extend({
- name: z.literal('LoRAModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zLLaVAModelFieldType = zFieldTypeBase.extend({
- name: z.literal('LLaVAModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zControlNetModelFieldType = zFieldTypeBase.extend({
- name: z.literal('ControlNetModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zIPAdapterModelFieldType = zFieldTypeBase.extend({
- name: z.literal('IPAdapterModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zT2IAdapterModelFieldType = zFieldTypeBase.extend({
- name: z.literal('T2IAdapterModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zSpandrelImageToImageModelFieldType = zFieldTypeBase.extend({
- name: z.literal('SpandrelImageToImageModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zT5EncoderModelFieldType = zFieldTypeBase.extend({
- name: z.literal('T5EncoderModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zCLIPEmbedModelFieldType = zFieldTypeBase.extend({
- name: z.literal('CLIPEmbedModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zCLIPLEmbedModelFieldType = zFieldTypeBase.extend({
- name: z.literal('CLIPLEmbedModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zCLIPGEmbedModelFieldType = zFieldTypeBase.extend({
- name: z.literal('CLIPGEmbedModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zControlLoRAModelFieldType = zFieldTypeBase.extend({
- name: z.literal('ControlLoRAModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zFluxVAEModelFieldType = zFieldTypeBase.extend({
- name: z.literal('FluxVAEModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zSigLipModelFieldType = zFieldTypeBase.extend({
- name: z.literal('SigLipModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zFluxReduxModelFieldType = zFieldTypeBase.extend({
- name: z.literal('FluxReduxModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zImagen3ModelFieldType = zFieldTypeBase.extend({
- name: z.literal('Imagen3ModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zImagen4ModelFieldType = zFieldTypeBase.extend({
- name: z.literal('Imagen4ModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zChatGPT4oModelFieldType = zFieldTypeBase.extend({
- name: z.literal('ChatGPT4oModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zVeo3ModelFieldType = zFieldTypeBase.extend({
- name: z.literal('Veo3ModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zRunwayModelFieldType = zFieldTypeBase.extend({
- name: z.literal('RunwayModelField'),
- originalType: zStatelessFieldType.optional(),
-});
-const zFluxKontextModelFieldType = zFieldTypeBase.extend({
- name: z.literal('FluxKontextModelField'),
- originalType: zStatelessFieldType.optional(),
-});
const zSchedulerFieldType = zFieldTypeBase.extend({
name: z.literal('SchedulerField'),
originalType: zStatelessFieldType.optional(),
@@ -302,33 +209,6 @@ const zStatefulFieldType = z.union([
zImageFieldType,
zBoardFieldType,
zModelIdentifierFieldType,
- zMainModelFieldType,
- zSDXLMainModelFieldType,
- zSD3MainModelFieldType,
- zCogView4MainModelFieldType,
- zFluxMainModelFieldType,
- zSDXLRefinerModelFieldType,
- zVAEModelFieldType,
- zLoRAModelFieldType,
- zLLaVAModelFieldType,
- zControlNetModelFieldType,
- zIPAdapterModelFieldType,
- zT2IAdapterModelFieldType,
- zSpandrelImageToImageModelFieldType,
- zT5EncoderModelFieldType,
- zCLIPEmbedModelFieldType,
- zCLIPLEmbedModelFieldType,
- zCLIPGEmbedModelFieldType,
- zControlLoRAModelFieldType,
- zFluxVAEModelFieldType,
- zSigLipModelFieldType,
- zFluxReduxModelFieldType,
- zImagen3ModelFieldType,
- zImagen4ModelFieldType,
- zChatGPT4oModelFieldType,
- zFluxKontextModelFieldType,
- zVeo3ModelFieldType,
- zRunwayModelFieldType,
zColorFieldType,
zSchedulerFieldType,
zFloatGeneratorFieldType,
@@ -344,36 +224,7 @@ const zFieldType = z.union([zStatefulFieldType, zStatelessFieldType]);
export type FieldType = z.infer;
const modelFieldTypeNames = [
- // Stateful model fields
zModelIdentifierFieldType.shape.name.value,
- zMainModelFieldType.shape.name.value,
- zSDXLMainModelFieldType.shape.name.value,
- zSD3MainModelFieldType.shape.name.value,
- zCogView4MainModelFieldType.shape.name.value,
- zFluxMainModelFieldType.shape.name.value,
- zSDXLRefinerModelFieldType.shape.name.value,
- zVAEModelFieldType.shape.name.value,
- zLoRAModelFieldType.shape.name.value,
- zLLaVAModelFieldType.shape.name.value,
- zControlNetModelFieldType.shape.name.value,
- zIPAdapterModelFieldType.shape.name.value,
- zT2IAdapterModelFieldType.shape.name.value,
- zSpandrelImageToImageModelFieldType.shape.name.value,
- zT5EncoderModelFieldType.shape.name.value,
- zCLIPEmbedModelFieldType.shape.name.value,
- zCLIPLEmbedModelFieldType.shape.name.value,
- zCLIPGEmbedModelFieldType.shape.name.value,
- zControlLoRAModelFieldType.shape.name.value,
- zFluxVAEModelFieldType.shape.name.value,
- zSigLipModelFieldType.shape.name.value,
- zFluxReduxModelFieldType.shape.name.value,
- zImagen3ModelFieldType.shape.name.value,
- zImagen4ModelFieldType.shape.name.value,
- zChatGPT4oModelFieldType.shape.name.value,
- zFluxKontextModelFieldType.shape.name.value,
- zVeo3ModelFieldType.shape.name.value,
- zRunwayModelFieldType.shape.name.value,
- // Stateless model fields
'UNetField',
'VAEField',
'CLIPField',
@@ -779,26 +630,6 @@ export const isColorFieldInputInstance = buildInstanceTypeGuard(zColorFieldInput
export const isColorFieldInputTemplate = buildTemplateTypeGuard('ColorField');
// #endregion
-// #region MainModelField
-export const zMainModelFieldValue = zModelIdentifierField.optional();
-const zMainModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zMainModelFieldValue,
-});
-const zMainModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zMainModelFieldType,
- originalType: zFieldType.optional(),
- default: zMainModelFieldValue,
-});
-const zMainModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
- type: zMainModelFieldType,
-});
-export type MainModelFieldValue = z.infer;
-export type MainModelFieldInputInstance = z.infer;
-export type MainModelFieldInputTemplate = z.infer;
-export const isMainModelFieldInputInstance = buildInstanceTypeGuard(zMainModelFieldInputInstance);
-export const isMainModelFieldInputTemplate = buildTemplateTypeGuard('MainModelField');
-// #endregion
-
// #region ModelIdentifierField
export const zModelIdentifierFieldValue = zModelIdentifierField.optional();
const zModelIdentifierFieldInputInstance = zFieldInputInstanceBase.extend({
@@ -820,507 +651,6 @@ export const isModelIdentifierFieldInputTemplate =
buildTemplateTypeGuard('ModelIdentifierField');
// #endregion
-// #region SDXLMainModelField
-const zSDXLMainModelFieldValue = zMainModelFieldValue; // TODO: Narrow to SDXL models only.
-const zSDXLMainModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zSDXLMainModelFieldValue,
-});
-const zSDXLMainModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zSDXLMainModelFieldType,
- originalType: zFieldType.optional(),
- default: zSDXLMainModelFieldValue,
-});
-const zSDXLMainModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
- type: zSDXLMainModelFieldType,
-});
-export type SDXLMainModelFieldInputInstance = z.infer;
-export type SDXLMainModelFieldInputTemplate = z.infer;
-export const isSDXLMainModelFieldInputInstance = buildInstanceTypeGuard(zSDXLMainModelFieldInputInstance);
-export const isSDXLMainModelFieldInputTemplate =
- buildTemplateTypeGuard('SDXLMainModelField');
-// #endregion
-
-// #region SD3MainModelField
-const zSD3MainModelFieldValue = zMainModelFieldValue; // TODO: Narrow to SDXL models only.
-const zSD3MainModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zSD3MainModelFieldValue,
-});
-const zSD3MainModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zSD3MainModelFieldType,
- originalType: zFieldType.optional(),
- default: zSD3MainModelFieldValue,
-});
-const zSD3MainModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
- type: zSD3MainModelFieldType,
-});
-export type SD3MainModelFieldInputInstance = z.infer;
-export type SD3MainModelFieldInputTemplate = z.infer;
-export const isSD3MainModelFieldInputInstance = buildInstanceTypeGuard(zSD3MainModelFieldInputInstance);
-export const isSD3MainModelFieldInputTemplate =
- buildTemplateTypeGuard('SD3MainModelField');
-// #endregion
-
-// #region CogView4MainModelField
-const zCogView4MainModelFieldValue = zMainModelFieldValue;
-const zCogView4MainModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zCogView4MainModelFieldValue,
-});
-const zCogView4MainModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zCogView4MainModelFieldType,
- originalType: zFieldType.optional(),
- default: zCogView4MainModelFieldValue,
-});
-const zCogView4MainModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
- type: zCogView4MainModelFieldType,
-});
-export type CogView4MainModelFieldInputInstance = z.infer;
-export type CogView4MainModelFieldInputTemplate = z.infer;
-export const isCogView4MainModelFieldInputInstance = buildInstanceTypeGuard(zCogView4MainModelFieldInputInstance);
-export const isCogView4MainModelFieldInputTemplate =
- buildTemplateTypeGuard('CogView4MainModelField');
-// #endregion
-
-// #region FluxMainModelField
-const zFluxMainModelFieldValue = zMainModelFieldValue; // TODO: Narrow to SDXL models only.
-const zFluxMainModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zFluxMainModelFieldValue,
-});
-const zFluxMainModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zFluxMainModelFieldType,
- originalType: zFieldType.optional(),
- default: zFluxMainModelFieldValue,
-});
-const zFluxMainModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
- type: zFluxMainModelFieldType,
-});
-export type FluxMainModelFieldInputInstance = z.infer;
-export type FluxMainModelFieldInputTemplate = z.infer;
-export const isFluxMainModelFieldInputInstance = buildInstanceTypeGuard(zFluxMainModelFieldInputInstance);
-export const isFluxMainModelFieldInputTemplate =
- buildTemplateTypeGuard('FluxMainModelField');
-// #endregion
-
-// #region SDXLRefinerModelField
-/** @alias */ // tells knip to ignore this duplicate export
-export const zSDXLRefinerModelFieldValue = zMainModelFieldValue; // TODO: Narrow to SDXL Refiner models only.
-const zSDXLRefinerModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zSDXLRefinerModelFieldValue,
-});
-const zSDXLRefinerModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zSDXLRefinerModelFieldType,
- originalType: zFieldType.optional(),
- default: zSDXLRefinerModelFieldValue,
-});
-const zSDXLRefinerModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
- type: zSDXLRefinerModelFieldType,
-});
-export type SDXLRefinerModelFieldValue = z.infer;
-export type SDXLRefinerModelFieldInputInstance = z.infer;
-export type SDXLRefinerModelFieldInputTemplate = z.infer;
-export const isSDXLRefinerModelFieldInputInstance = buildInstanceTypeGuard(zSDXLRefinerModelFieldInputInstance);
-export const isSDXLRefinerModelFieldInputTemplate =
- buildTemplateTypeGuard('SDXLRefinerModelField');
-// #endregion
-
-// #region VAEModelField
-
-export const zVAEModelFieldValue = zModelIdentifierField.optional();
-const zVAEModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zVAEModelFieldValue,
-});
-const zVAEModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zVAEModelFieldType,
- originalType: zFieldType.optional(),
- default: zVAEModelFieldValue,
-});
-const zVAEModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
- type: zVAEModelFieldType,
-});
-export type VAEModelFieldValue = z.infer;
-export type VAEModelFieldInputInstance = z.infer;
-export type VAEModelFieldInputTemplate = z.infer;
-export const isVAEModelFieldInputInstance = buildInstanceTypeGuard(zVAEModelFieldInputInstance);
-export const isVAEModelFieldInputTemplate = buildTemplateTypeGuard('VAEModelField');
-// #endregion
-
-// #region LoRAModelField
-export const zLoRAModelFieldValue = zModelIdentifierField.optional();
-const zLoRAModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zLoRAModelFieldValue,
-});
-const zLoRAModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zLoRAModelFieldType,
- originalType: zFieldType.optional(),
- default: zLoRAModelFieldValue,
-});
-const zLoRAModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
- type: zLoRAModelFieldType,
-});
-export type LoRAModelFieldValue = z.infer;
-export type LoRAModelFieldInputInstance = z.infer;
-export type LoRAModelFieldInputTemplate = z.infer;
-export const isLoRAModelFieldInputInstance = buildInstanceTypeGuard(zLoRAModelFieldInputInstance);
-export const isLoRAModelFieldInputTemplate = buildTemplateTypeGuard('LoRAModelField');
-// #endregion
-
-// #region LLaVAModelField
-export const zLLaVAModelFieldValue = zModelIdentifierField.optional();
-const zLLaVAModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zLLaVAModelFieldValue,
-});
-const zLLaVAModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zLLaVAModelFieldType,
- originalType: zFieldType.optional(),
- default: zLLaVAModelFieldValue,
-});
-const zLLaVAModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
- type: zLLaVAModelFieldType,
-});
-export type LLaVAModelFieldValue = z.infer;
-export type LLaVAModelFieldInputInstance = z.infer;
-export type LLaVAModelFieldInputTemplate = z.infer;
-export const isLLaVAModelFieldInputInstance = buildInstanceTypeGuard(zLLaVAModelFieldInputInstance);
-export const isLLaVAModelFieldInputTemplate = buildTemplateTypeGuard('LLaVAModelField');
-// #endregion
-
-// #region ControlNetModelField
-export const zControlNetModelFieldValue = zModelIdentifierField.optional();
-const zControlNetModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zControlNetModelFieldValue,
-});
-const zControlNetModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zControlNetModelFieldType,
- originalType: zFieldType.optional(),
- default: zControlNetModelFieldValue,
-});
-const zControlNetModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
- type: zControlNetModelFieldType,
-});
-export type ControlNetModelFieldValue = z.infer;
-export type ControlNetModelFieldInputInstance = z.infer;
-export type ControlNetModelFieldInputTemplate = z.infer;
-export const isControlNetModelFieldInputInstance = buildInstanceTypeGuard(zControlNetModelFieldInputInstance);
-export const isControlNetModelFieldInputTemplate =
- buildTemplateTypeGuard('ControlNetModelField');
-// #endregion
-
-// #region IPAdapterModelField
-export const zIPAdapterModelFieldValue = zModelIdentifierField.optional();
-const zIPAdapterModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zIPAdapterModelFieldValue,
-});
-const zIPAdapterModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zIPAdapterModelFieldType,
- originalType: zFieldType.optional(),
- default: zIPAdapterModelFieldValue,
-});
-const zIPAdapterModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
- type: zIPAdapterModelFieldType,
-});
-export type IPAdapterModelFieldValue = z.infer;
-export type IPAdapterModelFieldInputInstance = z.infer;
-export type IPAdapterModelFieldInputTemplate = z.infer;
-export const isIPAdapterModelFieldInputInstance = buildInstanceTypeGuard(zIPAdapterModelFieldInputInstance);
-export const isIPAdapterModelFieldInputTemplate =
- buildTemplateTypeGuard('IPAdapterModelField');
-// #endregion
-
-// #region T2IAdapterField
-export const zT2IAdapterModelFieldValue = zModelIdentifierField.optional();
-const zT2IAdapterModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zT2IAdapterModelFieldValue,
-});
-const zT2IAdapterModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zT2IAdapterModelFieldType,
- originalType: zFieldType.optional(),
- default: zT2IAdapterModelFieldValue,
-});
-const zT2IAdapterModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
- type: zT2IAdapterModelFieldType,
-});
-export type T2IAdapterModelFieldValue = z.infer;
-export type T2IAdapterModelFieldInputInstance = z.infer;
-export type T2IAdapterModelFieldInputTemplate = z.infer;
-export const isT2IAdapterModelFieldInputInstance = buildInstanceTypeGuard(zT2IAdapterModelFieldInputInstance);
-export const isT2IAdapterModelFieldInputTemplate =
- buildTemplateTypeGuard('T2IAdapterModelField');
-// #endregion
-
-// #region SpandrelModelToModelField
-export const zSpandrelImageToImageModelFieldValue = zModelIdentifierField.optional();
-const zSpandrelImageToImageModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zSpandrelImageToImageModelFieldValue,
-});
-const zSpandrelImageToImageModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zSpandrelImageToImageModelFieldType,
- originalType: zFieldType.optional(),
- default: zSpandrelImageToImageModelFieldValue,
-});
-const zSpandrelImageToImageModelFieldOutputTemplate = zFieldOutputTemplateBase.extend({
- type: zSpandrelImageToImageModelFieldType,
-});
-export type SpandrelImageToImageModelFieldValue = z.infer;
-export type SpandrelImageToImageModelFieldInputInstance = z.infer;
-export type SpandrelImageToImageModelFieldInputTemplate = z.infer;
-export const isSpandrelImageToImageModelFieldInputInstance = buildInstanceTypeGuard(
- zSpandrelImageToImageModelFieldInputInstance
-);
-export const isSpandrelImageToImageModelFieldInputTemplate =
- buildTemplateTypeGuard('SpandrelImageToImageModelField');
-// #endregion
-
-// #region T5EncoderModelField
-
-export const zT5EncoderModelFieldValue = zModelIdentifierField.optional();
-const zT5EncoderModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zT5EncoderModelFieldValue,
-});
-const zT5EncoderModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zT5EncoderModelFieldType,
- originalType: zFieldType.optional(),
- default: zT5EncoderModelFieldValue,
-});
-export type T5EncoderModelFieldValue = z.infer;
-export type T5EncoderModelFieldInputInstance = z.infer;
-export type T5EncoderModelFieldInputTemplate = z.infer;
-export const isT5EncoderModelFieldInputInstance = buildInstanceTypeGuard(zT5EncoderModelFieldInputInstance);
-export const isT5EncoderModelFieldInputTemplate =
- buildTemplateTypeGuard('T5EncoderModelField');
-// #endregion
-
-// #region FluxVAEModelField
-export const zFluxVAEModelFieldValue = zModelIdentifierField.optional();
-const zFluxVAEModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zFluxVAEModelFieldValue,
-});
-const zFluxVAEModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zFluxVAEModelFieldType,
- originalType: zFieldType.optional(),
- default: zFluxVAEModelFieldValue,
-});
-export type FluxVAEModelFieldValue = z.infer;
-export type FluxVAEModelFieldInputInstance = z.infer;
-export type FluxVAEModelFieldInputTemplate = z.infer;
-export const isFluxVAEModelFieldInputInstance = buildInstanceTypeGuard(zFluxVAEModelFieldInputInstance);
-export const isFluxVAEModelFieldInputTemplate =
- buildTemplateTypeGuard('FluxVAEModelField');
-// #endregion
-
-// #region CLIPEmbedModelField
-export const zCLIPEmbedModelFieldValue = zModelIdentifierField.optional();
-const zCLIPEmbedModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zCLIPEmbedModelFieldValue,
-});
-const zCLIPEmbedModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zCLIPEmbedModelFieldType,
- originalType: zFieldType.optional(),
- default: zCLIPEmbedModelFieldValue,
-});
-export type CLIPEmbedModelFieldValue = z.infer;
-export type CLIPEmbedModelFieldInputInstance = z.infer;
-export type CLIPEmbedModelFieldInputTemplate = z.infer;
-export const isCLIPEmbedModelFieldInputInstance = buildInstanceTypeGuard(zCLIPEmbedModelFieldInputInstance);
-export const isCLIPEmbedModelFieldInputTemplate =
- buildTemplateTypeGuard('CLIPEmbedModelField');
-// #endregion
-
-// #region CLIPLEmbedModelField
-export const zCLIPLEmbedModelFieldValue = zModelIdentifierField.optional();
-const zCLIPLEmbedModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zCLIPLEmbedModelFieldValue,
-});
-const zCLIPLEmbedModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zCLIPLEmbedModelFieldType,
- originalType: zFieldType.optional(),
- default: zCLIPLEmbedModelFieldValue,
-});
-export type CLIPLEmbedModelFieldValue = z.infer;
-export type CLIPLEmbedModelFieldInputInstance = z.infer;
-export type CLIPLEmbedModelFieldInputTemplate = z.infer;
-export const isCLIPLEmbedModelFieldInputInstance = buildInstanceTypeGuard(zCLIPLEmbedModelFieldInputInstance);
-export const isCLIPLEmbedModelFieldInputTemplate =
- buildTemplateTypeGuard('CLIPLEmbedModelField');
-// #endregion
-
-// #region CLIPGEmbedModelField
-export const zCLIPGEmbedModelFieldValue = zModelIdentifierField.optional();
-const zCLIPGEmbedModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zCLIPGEmbedModelFieldValue,
-});
-const zCLIPGEmbedModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zCLIPGEmbedModelFieldType,
- originalType: zFieldType.optional(),
- default: zCLIPGEmbedModelFieldValue,
-});
-export type CLIPGEmbedModelFieldValue = z.infer;
-export type CLIPGEmbedModelFieldInputInstance = z.infer;
-export type CLIPGEmbedModelFieldInputTemplate = z.infer;
-export const isCLIPGEmbedModelFieldInputInstance = buildInstanceTypeGuard(zCLIPGEmbedModelFieldInputInstance);
-export const isCLIPGEmbedModelFieldInputTemplate =
- buildTemplateTypeGuard('CLIPGEmbedModelField');
-// #endregion
-
-// #region ControlLoRAModelField
-export const zControlLoRAModelFieldValue = zModelIdentifierField.optional();
-const zControlLoRAModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zControlLoRAModelFieldValue,
-});
-const zControlLoRAModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zControlLoRAModelFieldType,
- originalType: zFieldType.optional(),
- default: zControlLoRAModelFieldValue,
-});
-export type ControlLoRAModelFieldValue = z.infer;
-export type ControlLoRAModelFieldInputInstance = z.infer;
-export type ControlLoRAModelFieldInputTemplate = z.infer;
-export const isControlLoRAModelFieldInputInstance = buildInstanceTypeGuard(zControlLoRAModelFieldInputInstance);
-export const isControlLoRAModelFieldInputTemplate =
- buildTemplateTypeGuard('ControlLoRAModelField');
-// #endregion
-
-// #region SigLipModelField
-export const zSigLipModelFieldValue = zModelIdentifierField.optional();
-const zSigLipModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zSigLipModelFieldValue,
-});
-const zSigLipModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zSigLipModelFieldType,
- originalType: zFieldType.optional(),
- default: zSigLipModelFieldValue,
-});
-export type SigLipModelFieldValue = z.infer;
-export type SigLipModelFieldInputInstance = z.infer;
-export type SigLipModelFieldInputTemplate = z.infer;
-export const isSigLipModelFieldInputInstance = buildInstanceTypeGuard(zSigLipModelFieldInputInstance);
-export const isSigLipModelFieldInputTemplate =
- buildTemplateTypeGuard('SigLipModelField');
-// #endregion
-
-// #region FluxReduxModelField
-export const zFluxReduxModelFieldValue = zModelIdentifierField.optional();
-const zFluxReduxModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zFluxReduxModelFieldValue,
-});
-const zFluxReduxModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zFluxReduxModelFieldType,
- originalType: zFieldType.optional(),
- default: zFluxReduxModelFieldValue,
-});
-export type FluxReduxModelFieldValue = z.infer;
-export type FluxReduxModelFieldInputInstance = z.infer;
-export type FluxReduxModelFieldInputTemplate = z.infer;
-export const isFluxReduxModelFieldInputInstance = buildInstanceTypeGuard(zFluxReduxModelFieldInputInstance);
-export const isFluxReduxModelFieldInputTemplate =
- buildTemplateTypeGuard('FluxReduxModelField');
-// #endregion
-
-// #region Imagen3ModelField
-export const zImagen3ModelFieldValue = zModelIdentifierField.optional();
-const zImagen3ModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zImagen3ModelFieldValue,
-});
-const zImagen3ModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zImagen3ModelFieldType,
- originalType: zFieldType.optional(),
- default: zImagen3ModelFieldValue,
-});
-export type Imagen3ModelFieldValue = z.infer;
-export type Imagen3ModelFieldInputInstance = z.infer;
-export type Imagen3ModelFieldInputTemplate = z.infer;
-export const isImagen3ModelFieldInputInstance = buildInstanceTypeGuard(zImagen3ModelFieldInputInstance);
-export const isImagen3ModelFieldInputTemplate =
- buildTemplateTypeGuard('Imagen3ModelField');
-// #endregion
-
-// #region Imagen4ModelField
-export const zImagen4ModelFieldValue = zModelIdentifierField.optional();
-const zImagen4ModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zImagen4ModelFieldValue,
-});
-const zImagen4ModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zImagen4ModelFieldType,
- originalType: zFieldType.optional(),
- default: zImagen4ModelFieldValue,
-});
-export type Imagen4ModelFieldValue = z.infer;
-export type Imagen4ModelFieldInputInstance = z.infer;
-export type Imagen4ModelFieldInputTemplate = z.infer;
-export const isImagen4ModelFieldInputInstance = buildInstanceTypeGuard(zImagen4ModelFieldInputInstance);
-export const isImagen4ModelFieldInputTemplate =
- buildTemplateTypeGuard('Imagen4ModelField');
-// #endregion
-
-// #region FluxKontextModelField
-export const zFluxKontextModelFieldValue = zModelIdentifierField.optional();
-const zFluxKontextModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zFluxKontextModelFieldValue,
-});
-const zFluxKontextModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zFluxKontextModelFieldType,
- originalType: zFieldType.optional(),
- default: zFluxKontextModelFieldValue,
-});
-export type FluxKontextModelFieldValue = z.infer;
-export type FluxKontextModelFieldInputInstance = z.infer;
-export type FluxKontextModelFieldInputTemplate = z.infer;
-export const isFluxKontextModelFieldInputInstance = buildInstanceTypeGuard(zFluxKontextModelFieldInputInstance);
-export const isFluxKontextModelFieldInputTemplate =
- buildTemplateTypeGuard('FluxKontextModelField');
-// #endregion
-
-// #region ChatGPT4oModelField
-export const zChatGPT4oModelFieldValue = zModelIdentifierField.optional();
-const zChatGPT4oModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zChatGPT4oModelFieldValue,
-});
-const zChatGPT4oModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zChatGPT4oModelFieldType,
- originalType: zFieldType.optional(),
- default: zChatGPT4oModelFieldValue,
-});
-export type ChatGPT4oModelFieldValue = z.infer;
-export type ChatGPT4oModelFieldInputInstance = z.infer;
-export type ChatGPT4oModelFieldInputTemplate = z.infer;
-export const isChatGPT4oModelFieldInputInstance = buildInstanceTypeGuard(zChatGPT4oModelFieldInputInstance);
-export const isChatGPT4oModelFieldInputTemplate =
- buildTemplateTypeGuard('ChatGPT4oModelField');
-// #endregion
-
-// #region Veo3ModelField
-export const zVeo3ModelFieldValue = zModelIdentifierField.optional();
-const zVeo3ModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zVeo3ModelFieldValue,
-});
-const zVeo3ModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zVeo3ModelFieldType,
- originalType: zFieldType.optional(),
- default: zVeo3ModelFieldValue,
-});
-export type Veo3ModelFieldValue = z.infer;
-export type Veo3ModelFieldInputInstance = z.infer;
-export type Veo3ModelFieldInputTemplate = z.infer;
-export const isVeo3ModelFieldInputInstance = buildInstanceTypeGuard(zVeo3ModelFieldInputInstance);
-export const isVeo3ModelFieldInputTemplate = buildTemplateTypeGuard('Veo3ModelField');
-// #endregion
-
-// #region RunwayModelField
-export const zRunwayModelFieldValue = zModelIdentifierField.optional();
-const zRunwayModelFieldInputInstance = zFieldInputInstanceBase.extend({
- value: zRunwayModelFieldValue,
-});
-const zRunwayModelFieldInputTemplate = zFieldInputTemplateBase.extend({
- type: zRunwayModelFieldType,
- originalType: zFieldType.optional(),
- default: zRunwayModelFieldValue,
-});
-export type RunwayModelFieldValue = z.infer;
-export type RunwayModelFieldInputInstance = z.infer;
-export type RunwayModelFieldInputTemplate = z.infer;
-export const isRunwayModelFieldInputInstance = buildInstanceTypeGuard(zRunwayModelFieldInputInstance);
-export const isRunwayModelFieldInputTemplate =
- buildTemplateTypeGuard('RunwayModelField');
-// #endregion
-
// #region SchedulerField
export const zSchedulerFieldValue = zSchedulerField.optional();
const zSchedulerFieldInputInstance = zFieldInputInstanceBase.extend({
@@ -1931,31 +1261,6 @@ export const zStatefulFieldValue = z.union([
zImageFieldCollectionValue,
zBoardFieldValue,
zModelIdentifierFieldValue,
- zMainModelFieldValue,
- zSDXLMainModelFieldValue,
- zFluxMainModelFieldValue,
- zSD3MainModelFieldValue,
- zCogView4MainModelFieldValue,
- zSDXLRefinerModelFieldValue,
- zVAEModelFieldValue,
- zLoRAModelFieldValue,
- zLLaVAModelFieldValue,
- zControlNetModelFieldValue,
- zIPAdapterModelFieldValue,
- zT2IAdapterModelFieldValue,
- zSpandrelImageToImageModelFieldValue,
- zT5EncoderModelFieldValue,
- zFluxVAEModelFieldValue,
- zCLIPEmbedModelFieldValue,
- zCLIPLEmbedModelFieldValue,
- zCLIPGEmbedModelFieldValue,
- zControlLoRAModelFieldValue,
- zSigLipModelFieldValue,
- zFluxReduxModelFieldValue,
- zImagen3ModelFieldValue,
- zImagen4ModelFieldValue,
- zFluxKontextModelFieldValue,
- zChatGPT4oModelFieldValue,
zColorFieldValue,
zSchedulerFieldValue,
zFloatGeneratorFieldValue,
@@ -1983,22 +1288,6 @@ const zStatefulFieldInputInstance = z.union([
zImageFieldCollectionInputInstance,
zBoardFieldInputInstance,
zModelIdentifierFieldInputInstance,
- zMainModelFieldInputInstance,
- zFluxMainModelFieldInputInstance,
- zSD3MainModelFieldInputInstance,
- zCogView4MainModelFieldInputInstance,
- zSDXLMainModelFieldInputInstance,
- zSDXLRefinerModelFieldInputInstance,
- zVAEModelFieldInputInstance,
- zLoRAModelFieldInputInstance,
- zLLaVAModelFieldInputInstance,
- zControlNetModelFieldInputInstance,
- zIPAdapterModelFieldInputInstance,
- zT2IAdapterModelFieldInputInstance,
- zSpandrelImageToImageModelFieldInputInstance,
- zT5EncoderModelFieldInputInstance,
- zFluxVAEModelFieldInputInstance,
- zCLIPEmbedModelFieldInputInstance,
zColorFieldInputInstance,
zSchedulerFieldInputInstance,
zFloatGeneratorFieldInputInstance,
@@ -2025,33 +1314,6 @@ const zStatefulFieldInputTemplate = z.union([
zImageFieldCollectionInputTemplate,
zBoardFieldInputTemplate,
zModelIdentifierFieldInputTemplate,
- zMainModelFieldInputTemplate,
- zFluxMainModelFieldInputTemplate,
- zSD3MainModelFieldInputTemplate,
- zCogView4MainModelFieldInputTemplate,
- zSDXLMainModelFieldInputTemplate,
- zSDXLRefinerModelFieldInputTemplate,
- zVAEModelFieldInputTemplate,
- zLoRAModelFieldInputTemplate,
- zLLaVAModelFieldInputTemplate,
- zControlNetModelFieldInputTemplate,
- zIPAdapterModelFieldInputTemplate,
- zT2IAdapterModelFieldInputTemplate,
- zSpandrelImageToImageModelFieldInputTemplate,
- zT5EncoderModelFieldInputTemplate,
- zFluxVAEModelFieldInputTemplate,
- zCLIPEmbedModelFieldInputTemplate,
- zCLIPLEmbedModelFieldInputTemplate,
- zCLIPGEmbedModelFieldInputTemplate,
- zControlLoRAModelFieldInputTemplate,
- zSigLipModelFieldInputTemplate,
- zFluxReduxModelFieldInputTemplate,
- zImagen3ModelFieldInputTemplate,
- zImagen4ModelFieldInputTemplate,
- zChatGPT4oModelFieldInputTemplate,
- zFluxKontextModelFieldInputTemplate,
- zVeo3ModelFieldInputTemplate,
- zRunwayModelFieldInputTemplate,
zColorFieldInputTemplate,
zSchedulerFieldInputTemplate,
zStatelessFieldInputTemplate,
@@ -2079,19 +1341,6 @@ const zStatefulFieldOutputTemplate = z.union([
zImageFieldCollectionOutputTemplate,
zBoardFieldOutputTemplate,
zModelIdentifierFieldOutputTemplate,
- zMainModelFieldOutputTemplate,
- zFluxMainModelFieldOutputTemplate,
- zSD3MainModelFieldOutputTemplate,
- zCogView4MainModelFieldOutputTemplate,
- zSDXLMainModelFieldOutputTemplate,
- zSDXLRefinerModelFieldOutputTemplate,
- zVAEModelFieldOutputTemplate,
- zLoRAModelFieldOutputTemplate,
- zLLaVAModelFieldOutputTemplate,
- zControlNetModelFieldOutputTemplate,
- zIPAdapterModelFieldOutputTemplate,
- zT2IAdapterModelFieldOutputTemplate,
- zSpandrelImageToImageModelFieldOutputTemplate,
zColorFieldOutputTemplate,
zSchedulerFieldOutputTemplate,
zFloatGeneratorFieldOutputTemplate,
diff --git a/invokeai/frontend/web/src/features/nodes/util/schema/buildFieldInputInstance.ts b/invokeai/frontend/web/src/features/nodes/util/schema/buildFieldInputInstance.ts
index a62b98023f1..1c14ab1f4d0 100644
--- a/invokeai/frontend/web/src/features/nodes/util/schema/buildFieldInputInstance.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/schema/buildFieldInputInstance.ts
@@ -9,36 +9,9 @@ const FIELD_VALUE_FALLBACK_MAP: Record =
FloatField: 0,
ImageField: undefined,
IntegerField: 0,
- IPAdapterModelField: undefined,
- LoRAModelField: undefined,
- LLaVAModelField: undefined,
ModelIdentifierField: undefined,
- MainModelField: undefined,
SchedulerField: 'dpmpp_3m_k',
- SDXLMainModelField: undefined,
- FluxMainModelField: undefined,
- SD3MainModelField: undefined,
- CogView4MainModelField: undefined,
- SDXLRefinerModelField: undefined,
StringField: '',
- T2IAdapterModelField: undefined,
- SpandrelImageToImageModelField: undefined,
- VAEModelField: undefined,
- ControlNetModelField: undefined,
- T5EncoderModelField: undefined,
- FluxVAEModelField: undefined,
- CLIPEmbedModelField: undefined,
- CLIPLEmbedModelField: undefined,
- CLIPGEmbedModelField: undefined,
- ControlLoRAModelField: undefined,
- SigLipModelField: undefined,
- FluxReduxModelField: undefined,
- Imagen3ModelField: undefined,
- Imagen4ModelField: undefined,
- ChatGPT4oModelField: undefined,
- FluxKontextModelField: undefined,
- Veo3ModelField: undefined,
- RunwayModelField: undefined,
FloatGeneratorField: undefined,
IntegerGeneratorField: undefined,
StringGeneratorField: undefined,
diff --git a/invokeai/frontend/web/src/features/nodes/util/schema/buildFieldInputTemplate.ts b/invokeai/frontend/web/src/features/nodes/util/schema/buildFieldInputTemplate.ts
index 917e57cef54..342dead58ca 100644
--- a/invokeai/frontend/web/src/features/nodes/util/schema/buildFieldInputTemplate.ts
+++ b/invokeai/frontend/web/src/features/nodes/util/schema/buildFieldInputTemplate.ts
@@ -3,53 +3,26 @@ import { FieldParseError } from 'features/nodes/types/error';
import type {
BoardFieldInputTemplate,
BooleanFieldInputTemplate,
- ChatGPT4oModelFieldInputTemplate,
- CLIPEmbedModelFieldInputTemplate,
- CLIPGEmbedModelFieldInputTemplate,
- CLIPLEmbedModelFieldInputTemplate,
- CogView4MainModelFieldInputTemplate,
ColorFieldInputTemplate,
- ControlLoRAModelFieldInputTemplate,
- ControlNetModelFieldInputTemplate,
EnumFieldInputTemplate,
FieldInputTemplate,
FieldType,
FloatFieldCollectionInputTemplate,
FloatFieldInputTemplate,
FloatGeneratorFieldInputTemplate,
- FluxKontextModelFieldInputTemplate,
- FluxMainModelFieldInputTemplate,
- FluxReduxModelFieldInputTemplate,
- FluxVAEModelFieldInputTemplate,
ImageFieldCollectionInputTemplate,
ImageFieldInputTemplate,
ImageGeneratorFieldInputTemplate,
- Imagen3ModelFieldInputTemplate,
- Imagen4ModelFieldInputTemplate,
IntegerFieldCollectionInputTemplate,
IntegerFieldInputTemplate,
IntegerGeneratorFieldInputTemplate,
- IPAdapterModelFieldInputTemplate,
- LLaVAModelFieldInputTemplate,
- LoRAModelFieldInputTemplate,
- MainModelFieldInputTemplate,
ModelIdentifierFieldInputTemplate,
- RunwayModelFieldInputTemplate,
SchedulerFieldInputTemplate,
- SD3MainModelFieldInputTemplate,
- SDXLMainModelFieldInputTemplate,
- SDXLRefinerModelFieldInputTemplate,
- SigLipModelFieldInputTemplate,
- SpandrelImageToImageModelFieldInputTemplate,
StatefulFieldType,
StatelessFieldInputTemplate,
StringFieldCollectionInputTemplate,
StringFieldInputTemplate,
StringGeneratorFieldInputTemplate,
- T2IAdapterModelFieldInputTemplate,
- T5EncoderModelFieldInputTemplate,
- VAEModelFieldInputTemplate,
- Veo3ModelFieldInputTemplate,
} from 'features/nodes/types/field';
import {
getFloatGeneratorArithmeticSequenceDefaults,
@@ -302,373 +275,6 @@ const buildModelIdentifierFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: MainModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
-
- return template;
-};
-
-const buildSDXLMainModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: SDXLMainModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
-
- return template;
-};
-
-const buildFluxMainModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: FluxMainModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
-
- return template;
-};
-
-const buildSD3MainModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: SD3MainModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
-
- return template;
-};
-
-const buildCogView4MainModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: CogView4MainModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
-
- return template;
-};
-
-const buildRefinerModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: SDXLRefinerModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
-
- return template;
-};
-
-const buildVAEModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: VAEModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
-
- return template;
-};
-
-const buildT5EncoderModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: T5EncoderModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
-
- return template;
-};
-
-const buildCLIPEmbedModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: CLIPEmbedModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
-
- return template;
-};
-
-const buildCLIPLEmbedModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: CLIPLEmbedModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
-
- return template;
-};
-
-const buildCLIPGEmbedModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: CLIPGEmbedModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
-
- return template;
-};
-
-const buildControlLoRAModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: ControlLoRAModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
-
- return template;
-};
-
-const buildLLaVAModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: LLaVAModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
- return template;
-};
-
-const buildFluxVAEModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: FluxVAEModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
-
- return template;
-};
-
-const buildLoRAModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: LoRAModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
-
- return template;
-};
-
-const buildControlNetModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: ControlNetModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
-
- return template;
-};
-
-const buildIPAdapterModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: IPAdapterModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
-
- return template;
-};
-
-const buildT2IAdapterModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: T2IAdapterModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
-
- return template;
-};
-
-const buildSpandrelImageToImageModelFieldInputTemplate: FieldInputTemplateBuilder<
- SpandrelImageToImageModelFieldInputTemplate
-> = ({ schemaObject, baseField, fieldType }) => {
- const template: SpandrelImageToImageModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
-
- return template;
-};
-
-const buildSigLipModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: SigLipModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
- return template;
-};
-
-const buildFluxReduxModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: FluxReduxModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
- return template;
-};
-
-const buildImagen3ModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: Imagen3ModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
- return template;
-};
-
-const buildImagen4ModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: Imagen4ModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
- return template;
-};
-
-const buildFluxKontextModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: FluxKontextModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
- return template;
-};
-
-const buildVeo3ModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: Veo3ModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
- return template;
-};
-
-const buildRunwayModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: RunwayModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
- return template;
-};
-
-const buildChatGPT4oModelFieldInputTemplate: FieldInputTemplateBuilder = ({
- schemaObject,
- baseField,
- fieldType,
-}) => {
- const template: ChatGPT4oModelFieldInputTemplate = {
- ...baseField,
- type: fieldType,
- default: schemaObject.default ?? undefined,
- };
- return template;
-};
-
const buildBoardFieldInputTemplate: FieldInputTemplateBuilder = ({
schemaObject,
baseField,
@@ -843,56 +449,41 @@ const buildImageGeneratorFieldInputTemplate: FieldInputTemplateBuilder = {
+const TEMPLATE_BUILDER_MAP: Record = {
BoardField: buildBoardFieldInputTemplate,
BooleanField: buildBooleanFieldInputTemplate,
ColorField: buildColorFieldInputTemplate,
- ControlNetModelField: buildControlNetModelFieldInputTemplate,
EnumField: buildEnumFieldInputTemplate,
FloatField: buildFloatFieldInputTemplate,
ImageField: buildImageFieldInputTemplate,
IntegerField: buildIntegerFieldInputTemplate,
- IPAdapterModelField: buildIPAdapterModelFieldInputTemplate,
- LoRAModelField: buildLoRAModelFieldInputTemplate,
- LLaVAModelField: buildLLaVAModelFieldInputTemplate,
ModelIdentifierField: buildModelIdentifierFieldInputTemplate,
- MainModelField: buildMainModelFieldInputTemplate,
SchedulerField: buildSchedulerFieldInputTemplate,
- SDXLMainModelField: buildSDXLMainModelFieldInputTemplate,
- SD3MainModelField: buildSD3MainModelFieldInputTemplate,
- CogView4MainModelField: buildCogView4MainModelFieldInputTemplate,
- FluxMainModelField: buildFluxMainModelFieldInputTemplate,
- SDXLRefinerModelField: buildRefinerModelFieldInputTemplate,
StringField: buildStringFieldInputTemplate,
- T2IAdapterModelField: buildT2IAdapterModelFieldInputTemplate,
- SpandrelImageToImageModelField: buildSpandrelImageToImageModelFieldInputTemplate,
- VAEModelField: buildVAEModelFieldInputTemplate,
- T5EncoderModelField: buildT5EncoderModelFieldInputTemplate,
- CLIPEmbedModelField: buildCLIPEmbedModelFieldInputTemplate,
- CLIPLEmbedModelField: buildCLIPLEmbedModelFieldInputTemplate,
- CLIPGEmbedModelField: buildCLIPGEmbedModelFieldInputTemplate,
- FluxVAEModelField: buildFluxVAEModelFieldInputTemplate,
- ControlLoRAModelField: buildControlLoRAModelFieldInputTemplate,
- SigLipModelField: buildSigLipModelFieldInputTemplate,
- FluxReduxModelField: buildFluxReduxModelFieldInputTemplate,
- Imagen3ModelField: buildImagen3ModelFieldInputTemplate,
- Imagen4ModelField: buildImagen4ModelFieldInputTemplate,
- ChatGPT4oModelField: buildChatGPT4oModelFieldInputTemplate,
- FluxKontextModelField: buildFluxKontextModelFieldInputTemplate,
- Veo3ModelField: buildVeo3ModelFieldInputTemplate,
- RunwayModelField: buildRunwayModelFieldInputTemplate,
FloatGeneratorField: buildFloatGeneratorFieldInputTemplate,
IntegerGeneratorField: buildIntegerGeneratorFieldInputTemplate,
StringGeneratorField: buildStringGeneratorFieldInputTemplate,
ImageGeneratorField: buildImageGeneratorFieldInputTemplate,
-} as const;
+};
export const buildFieldInputTemplate = (
fieldSchema: InvocationFieldSchema,
fieldName: string,
fieldType: FieldType
): FieldInputTemplate => {
- const { input, ui_hidden, ui_component, ui_type, ui_order, ui_choice_labels, orig_required: required } = fieldSchema;
+ const {
+ input,
+ ui_hidden,
+ ui_component,
+ ui_type,
+ ui_order,
+ ui_choice_labels,
+ orig_required: required,
+ ui_model_base,
+ ui_model_type,
+ ui_model_variant,
+ ui_model_format,
+ } = fieldSchema;
// This is the base field template that is common to all fields. The builder function will add all other
// properties to this template.
@@ -908,6 +499,10 @@ export const buildFieldInputTemplate = (
ui_type,
ui_order,
ui_choice_labels,
+ ui_model_base,
+ ui_model_type,
+ ui_model_variant,
+ ui_model_format,
};
if (isStatefulFieldType(fieldType)) {
diff --git a/invokeai/frontend/web/src/services/api/hooks/modelsByType.ts b/invokeai/frontend/web/src/services/api/hooks/modelsByType.ts
index 00a0c35fc7f..310ec3c3f66 100644
--- a/invokeai/frontend/web/src/services/api/hooks/modelsByType.ts
+++ b/invokeai/frontend/web/src/services/api/hooks/modelsByType.ts
@@ -12,34 +12,25 @@ import {
isChatGPT4oModelConfig,
isCLIPEmbedModelConfig,
isCLIPVisionModelConfig,
- isCogView4MainModelModelConfig,
isControlLayerModelConfig,
isControlLoRAModelConfig,
isControlNetModelConfig,
isFluxKontextApiModelConfig,
isFluxKontextModelConfig,
- isFluxMainModelModelConfig,
isFluxReduxModelConfig,
isFluxVAEModelConfig,
isGemini2_5ModelConfig,
- isImagen3ModelConfig,
- isImagen4ModelConfig,
isIPAdapterModelConfig,
isLLaVAModelConfig,
isLoRAModelConfig,
isNonRefinerMainModelConfig,
- isNonSDXLMainModelConfig,
isRefinerMainModelModelConfig,
- isRunwayModelConfig,
- isSD3MainModelModelConfig,
- isSDXLMainModelModelConfig,
isSigLipModelConfig,
isSpandrelImageToImageModelConfig,
isT2IAdapterModelConfig,
isT5EncoderModelConfig,
isTIModelConfig,
isVAEModelConfig,
- isVeo3ModelConfig,
isVideoModelConfig,
} from 'services/api/types';
@@ -66,12 +57,7 @@ const buildModelsHook =
return [modelConfigs, result] as const;
};
export const useMainModels = buildModelsHook(isNonRefinerMainModelConfig);
-export const useNonSDXLMainModels = buildModelsHook(isNonSDXLMainModelConfig);
export const useRefinerModels = buildModelsHook(isRefinerMainModelModelConfig);
-export const useFluxModels = buildModelsHook(isFluxMainModelModelConfig);
-export const useSD3Models = buildModelsHook(isSD3MainModelModelConfig);
-export const useCogView4Models = buildModelsHook(isCogView4MainModelModelConfig);
-export const useSDXLModels = buildModelsHook(isSDXLMainModelModelConfig);
export const useLoRAModels = buildModelsHook(isLoRAModelConfig);
export const useControlLoRAModel = buildModelsHook(isControlLoRAModelConfig);
export const useControlLayerModels = buildModelsHook(isControlLayerModelConfig);
@@ -103,12 +89,6 @@ export const useRegionalReferenceImageModels = buildModelsHook(
(config) => isIPAdapterModelConfig(config) || isFluxReduxModelConfig(config)
);
export const useLLaVAModels = buildModelsHook(isLLaVAModelConfig);
-export const useImagen3Models = buildModelsHook(isImagen3ModelConfig);
-export const useImagen4Models = buildModelsHook(isImagen4ModelConfig);
-export const useChatGPT4oModels = buildModelsHook(isChatGPT4oModelConfig);
-export const useFluxKontextModels = buildModelsHook(isFluxKontextApiModelConfig);
-export const useVeo3Models = buildModelsHook(isVeo3ModelConfig);
-export const useRunwayModels = buildModelsHook(isRunwayModelConfig);
export const useVideoModels = buildModelsHook(isVideoModelConfig);
const buildModelsSelector =
diff --git a/invokeai/frontend/web/src/services/api/schema.ts b/invokeai/frontend/web/src/services/api/schema.ts
index 7b36193e55f..451a932f48d 100644
--- a/invokeai/frontend/web/src/services/api/schema.ts
+++ b/invokeai/frontend/web/src/services/api/schema.ts
@@ -5580,7 +5580,7 @@ export type components = {
repo_variant?: components["schemas"]["ModelRepoVariant"] | null;
};
/**
- * ControlNet - SD1.5, SDXL
+ * ControlNet - SD1.5, SD2, SDXL
* @description Collects ControlNet info to pass to other nodes
*/
ControlNetInvocation: {
@@ -11805,6 +11805,26 @@ export type components = {
ui_choice_labels: {
[key: string]: string;
} | null;
+ /**
+ * Ui Model Base
+ * @default null
+ */
+ ui_model_base: components["schemas"]["BaseModelType"][] | null;
+ /**
+ * Ui Model Type
+ * @default null
+ */
+ ui_model_type: components["schemas"]["ModelType"][] | null;
+ /**
+ * Ui Model Variant
+ * @default null
+ */
+ ui_model_variant: (components["schemas"]["ClipVariantType"] | components["schemas"]["ModelVariantType"])[] | null;
+ /**
+ * Ui Model Format
+ * @default null
+ */
+ ui_model_format: components["schemas"]["ModelFormat"][] | null;
};
/**
* InstallStatus
@@ -15163,7 +15183,7 @@ export type components = {
guidance?: number | null;
};
/**
- * Main Model - SD1.5
+ * Main Model - SD1.5, SD2
* @description Loads a main model, outputting its submodels.
*/
MainModelLoaderInvocation: {
@@ -17719,11 +17739,18 @@ export type components = {
*/
OutputFieldJSONSchemaExtra: {
field_kind: components["schemas"]["FieldKind"];
- /** Ui Hidden */
+ /**
+ * Ui Hidden
+ * @default false
+ */
ui_hidden: boolean;
- ui_type: components["schemas"]["UIType"] | null;
- /** Ui Order */
+ /**
+ * Ui Order
+ * @default null
+ */
ui_order: number | null;
+ /** @default null */
+ ui_type: components["schemas"]["UIType"] | null;
};
/** PaginatedResults[WorkflowRecordListItemWithThumbnailDTO] */
PaginatedResults_WorkflowRecordListItemWithThumbnailDTO_: {
@@ -21830,7 +21857,7 @@ export type components = {
* used, and the type will be ignored. They are included here for backwards compatibility.
* @enum {string}
*/
- UIType: "MainModelField" | "CogView4MainModelField" | "FluxMainModelField" | "SD3MainModelField" | "SDXLMainModelField" | "SDXLRefinerModelField" | "ONNXModelField" | "VAEModelField" | "FluxVAEModelField" | "LoRAModelField" | "ControlNetModelField" | "IPAdapterModelField" | "T2IAdapterModelField" | "T5EncoderModelField" | "CLIPEmbedModelField" | "CLIPLEmbedModelField" | "CLIPGEmbedModelField" | "SpandrelImageToImageModelField" | "ControlLoRAModelField" | "SigLipModelField" | "FluxReduxModelField" | "LLaVAModelField" | "Imagen3ModelField" | "Imagen4ModelField" | "ChatGPT4oModelField" | "Gemini2_5ModelField" | "FluxKontextModelField" | "Veo3ModelField" | "RunwayModelField" | "SchedulerField" | "AnyField" | "VideoField" | "CollectionField" | "CollectionItemField" | "DEPRECATED_Boolean" | "DEPRECATED_Color" | "DEPRECATED_Conditioning" | "DEPRECATED_Control" | "DEPRECATED_Float" | "DEPRECATED_Image" | "DEPRECATED_Integer" | "DEPRECATED_Latents" | "DEPRECATED_String" | "DEPRECATED_BooleanCollection" | "DEPRECATED_ColorCollection" | "DEPRECATED_ConditioningCollection" | "DEPRECATED_ControlCollection" | "DEPRECATED_FloatCollection" | "DEPRECATED_ImageCollection" | "DEPRECATED_IntegerCollection" | "DEPRECATED_LatentsCollection" | "DEPRECATED_StringCollection" | "DEPRECATED_BooleanPolymorphic" | "DEPRECATED_ColorPolymorphic" | "DEPRECATED_ConditioningPolymorphic" | "DEPRECATED_ControlPolymorphic" | "DEPRECATED_FloatPolymorphic" | "DEPRECATED_ImagePolymorphic" | "DEPRECATED_IntegerPolymorphic" | "DEPRECATED_LatentsPolymorphic" | "DEPRECATED_StringPolymorphic" | "DEPRECATED_UNet" | "DEPRECATED_Vae" | "DEPRECATED_CLIP" | "DEPRECATED_Collection" | "DEPRECATED_CollectionItem" | "DEPRECATED_Enum" | "DEPRECATED_WorkflowField" | "DEPRECATED_IsIntermediate" | "DEPRECATED_BoardField" | "DEPRECATED_MetadataItem" | "DEPRECATED_MetadataItemCollection" | "DEPRECATED_MetadataItemPolymorphic" | "DEPRECATED_MetadataDict";
+ UIType: "SchedulerField" | "AnyField" | "CollectionField" | "CollectionItemField" | "DEPRECATED_Boolean" | "DEPRECATED_Color" | "DEPRECATED_Conditioning" | "DEPRECATED_Control" | "DEPRECATED_Float" | "DEPRECATED_Image" | "DEPRECATED_Integer" | "DEPRECATED_Latents" | "DEPRECATED_String" | "DEPRECATED_BooleanCollection" | "DEPRECATED_ColorCollection" | "DEPRECATED_ConditioningCollection" | "DEPRECATED_ControlCollection" | "DEPRECATED_FloatCollection" | "DEPRECATED_ImageCollection" | "DEPRECATED_IntegerCollection" | "DEPRECATED_LatentsCollection" | "DEPRECATED_StringCollection" | "DEPRECATED_BooleanPolymorphic" | "DEPRECATED_ColorPolymorphic" | "DEPRECATED_ConditioningPolymorphic" | "DEPRECATED_ControlPolymorphic" | "DEPRECATED_FloatPolymorphic" | "DEPRECATED_ImagePolymorphic" | "DEPRECATED_IntegerPolymorphic" | "DEPRECATED_LatentsPolymorphic" | "DEPRECATED_StringPolymorphic" | "DEPRECATED_UNet" | "DEPRECATED_Vae" | "DEPRECATED_CLIP" | "DEPRECATED_Collection" | "DEPRECATED_CollectionItem" | "DEPRECATED_Enum" | "DEPRECATED_WorkflowField" | "DEPRECATED_IsIntermediate" | "DEPRECATED_BoardField" | "DEPRECATED_MetadataItem" | "DEPRECATED_MetadataItemCollection" | "DEPRECATED_MetadataItemPolymorphic" | "DEPRECATED_MetadataDict" | "DEPRECATED_MainModelField" | "DEPRECATED_CogView4MainModelField" | "DEPRECATED_FluxMainModelField" | "DEPRECATED_SD3MainModelField" | "DEPRECATED_SDXLMainModelField" | "DEPRECATED_SDXLRefinerModelField" | "DEPRECATED_ONNXModelField" | "DEPRECATED_VAEModelField" | "DEPRECATED_FluxVAEModelField" | "DEPRECATED_LoRAModelField" | "DEPRECATED_ControlNetModelField" | "DEPRECATED_IPAdapterModelField" | "DEPRECATED_T2IAdapterModelField" | "DEPRECATED_T5EncoderModelField" | "DEPRECATED_CLIPEmbedModelField" | "DEPRECATED_CLIPLEmbedModelField" | "DEPRECATED_CLIPGEmbedModelField" | "DEPRECATED_SpandrelImageToImageModelField" | "DEPRECATED_ControlLoRAModelField" | "DEPRECATED_SigLipModelField" | "DEPRECATED_FluxReduxModelField" | "DEPRECATED_LLaVAModelField" | "DEPRECATED_Imagen3ModelField" | "DEPRECATED_Imagen4ModelField" | "DEPRECATED_ChatGPT4oModelField" | "DEPRECATED_Gemini2_5ModelField" | "DEPRECATED_FluxKontextModelField" | "DEPRECATED_Veo3ModelField" | "DEPRECATED_RunwayModelField";
/** UNetField */
UNetField: {
/** @description Info to load unet submodel */
@@ -22176,7 +22203,7 @@ export type components = {
seamless_axes?: string[];
};
/**
- * VAE Model - SD1.5, SDXL, SD3, FLUX
+ * VAE Model - SD1.5, SD2, SDXL, SD3, FLUX
* @description Loads a VAE model, outputting a VaeLoaderOutput
*/
VAELoaderInvocation: {
diff --git a/invokeai/frontend/web/src/services/api/types.ts b/invokeai/frontend/web/src/services/api/types.ts
index f794262820f..e7c066d1470 100644
--- a/invokeai/frontend/web/src/services/api/types.ts
+++ b/invokeai/frontend/web/src/services/api/types.ts
@@ -122,7 +122,7 @@ export type T2IAdapterModelConfig = S['T2IAdapterConfig'];
export type CLIPLEmbedModelConfig = S['CLIPLEmbedDiffusersConfig'];
export type CLIPGEmbedModelConfig = S['CLIPGEmbedDiffusersConfig'];
export type CLIPEmbedModelConfig = CLIPLEmbedModelConfig | CLIPGEmbedModelConfig;
-export type LlavaOnevisionConfig = S['LlavaOnevisionConfig'];
+type LlavaOnevisionConfig = S['LlavaOnevisionConfig'];
export type T5EncoderModelConfig = S['T5EncoderConfig'];
export type T5EncoderBnbQuantizedLlmInt8bModelConfig = S['T5EncoderBnbQuantizedLlmInt8bConfig'];
export type SpandrelImageToImageModelConfig = S['SpandrelImageToImageConfig'];
@@ -130,16 +130,14 @@ type TextualInversionModelConfig = S['TextualInversionFileConfig'] | S['TextualI
type DiffusersModelConfig = S['MainDiffusersConfig'];
export type CheckpointModelConfig = S['MainCheckpointConfig'];
type CLIPVisionDiffusersConfig = S['CLIPVisionDiffusersConfig'];
-export type SigLipModelConfig = S['SigLIPConfig'];
+type SigLipModelConfig = S['SigLIPConfig'];
export type FLUXReduxModelConfig = S['FluxReduxConfig'];
-export type ApiModelConfig = S['ApiModelConfig'];
+type ApiModelConfig = S['ApiModelConfig'];
export type VideoApiModelConfig = S['VideoApiModelConfig'];
export type MainModelConfig = DiffusersModelConfig | CheckpointModelConfig | ApiModelConfig;
export type FLUXKontextModelConfig = MainModelConfig;
export type ChatGPT4oModelConfig = ApiModelConfig;
export type Gemini2_5ModelConfig = ApiModelConfig;
-type Veo3ModelConfig = VideoApiModelConfig;
-type RunwayModelConfig = VideoApiModelConfig;
export type AnyModelConfig =
| ControlLoRAModelConfig
| LoRAModelConfig
@@ -310,22 +308,6 @@ export const isVideoModelConfig = (config: AnyModelConfig): config is VideoApiMo
return config.type === 'video';
};
-export const isVeo3ModelConfig = (config: AnyModelConfig): config is Veo3ModelConfig => {
- return config.base === 'veo3' && config.type === 'video';
-};
-
-export const isRunwayModelConfig = (config: AnyModelConfig): config is RunwayModelConfig => {
- return config.base === 'runway' && config.type === 'video';
-};
-
-export const isImagen3ModelConfig = (config: AnyModelConfig): config is ApiModelConfig => {
- return config.type === 'main' && config.base === 'imagen3';
-};
-
-export const isImagen4ModelConfig = (config: AnyModelConfig): config is ApiModelConfig => {
- return config.type === 'main' && config.base === 'imagen4';
-};
-
export const isFluxKontextApiModelConfig = (config: AnyModelConfig): config is ApiModelConfig => {
return config.type === 'main' && config.base === 'flux-kontext';
};
@@ -350,30 +332,10 @@ export const isRefinerMainModelModelConfig = (config: AnyModelConfig): config is
return config.type === 'main' && config.base === 'sdxl-refiner';
};
-export const isSDXLMainModelModelConfig = (config: AnyModelConfig): config is MainModelConfig => {
- return config.type === 'main' && config.base === 'sdxl';
-};
-
-export const isSD3MainModelModelConfig = (config: AnyModelConfig): config is MainModelConfig => {
- return config.type === 'main' && config.base === 'sd-3';
-};
-
-export const isCogView4MainModelModelConfig = (config: AnyModelConfig): config is MainModelConfig => {
- return config.type === 'main' && config.base === 'cogview4';
-};
-
-export const isFluxMainModelModelConfig = (config: AnyModelConfig): config is MainModelConfig => {
- return config.type === 'main' && config.base === 'flux';
-};
-
export const isFluxFillMainModelModelConfig = (config: AnyModelConfig): config is MainModelConfig => {
return config.type === 'main' && config.base === 'flux' && config.variant === 'inpaint';
};
-export const isNonSDXLMainModelConfig = (config: AnyModelConfig): config is MainModelConfig => {
- return config.type === 'main' && (config.base === 'sd-1' || config.base === 'sd-2');
-};
-
export const isTIModelConfig = (config: AnyModelConfig): config is MainModelConfig => {
return config.type === 'embedding';
};