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'; };