mirror of
https://github.com/invoke-ai/InvokeAI.git
synced 2026-01-22 21:08:08 -05:00
Compare commits
1 Commits
main
...
controlnet
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
21a05f4287 |
@@ -36,9 +36,6 @@ from pydantic_core import PydanticUndefined
|
|||||||
from invokeai.app.invocations.fields import (
|
from invokeai.app.invocations.fields import (
|
||||||
FieldKind,
|
FieldKind,
|
||||||
Input,
|
Input,
|
||||||
InputFieldJSONSchemaExtra,
|
|
||||||
UIType,
|
|
||||||
migrate_model_ui_type,
|
|
||||||
)
|
)
|
||||||
from invokeai.app.services.config.config_default import get_config
|
from invokeai.app.services.config.config_default import get_config
|
||||||
from invokeai.app.services.shared.invocation_context import InvocationContext
|
from invokeai.app.services.shared.invocation_context import InvocationContext
|
||||||
@@ -259,9 +256,7 @@ class BaseInvocation(ABC, BaseModel):
|
|||||||
is_intermediate: bool = Field(
|
is_intermediate: bool = Field(
|
||||||
default=False,
|
default=False,
|
||||||
description="Whether or not this is an intermediate invocation.",
|
description="Whether or not this is an intermediate invocation.",
|
||||||
json_schema_extra=InputFieldJSONSchemaExtra(
|
json_schema_extra={"ui_type": "IsIntermediate", "field_kind": FieldKind.NodeAttribute},
|
||||||
input=Input.Direct, field_kind=FieldKind.NodeAttribute, ui_type=UIType._IsIntermediate
|
|
||||||
).model_dump(exclude_none=True),
|
|
||||||
)
|
)
|
||||||
use_cache: bool = Field(
|
use_cache: bool = Field(
|
||||||
default=True,
|
default=True,
|
||||||
@@ -450,15 +445,6 @@ with warnings.catch_warnings():
|
|||||||
RESERVED_PYDANTIC_FIELD_NAMES = {m[0] for m in inspect.getmembers(_Model())}
|
RESERVED_PYDANTIC_FIELD_NAMES = {m[0] for m in inspect.getmembers(_Model())}
|
||||||
|
|
||||||
|
|
||||||
def is_enum_member(value: Any, enum_class: type[Enum]) -> bool:
|
|
||||||
"""Checks if a value is a member of an enum class."""
|
|
||||||
try:
|
|
||||||
enum_class(value)
|
|
||||||
return True
|
|
||||||
except ValueError:
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
def validate_fields(model_fields: dict[str, FieldInfo], model_type: str) -> None:
|
def validate_fields(model_fields: dict[str, FieldInfo], model_type: str) -> None:
|
||||||
"""
|
"""
|
||||||
Validates the fields of an invocation or invocation output:
|
Validates the fields of an invocation or invocation output:
|
||||||
@@ -470,99 +456,51 @@ def validate_fields(model_fields: dict[str, FieldInfo], model_type: str) -> None
|
|||||||
"""
|
"""
|
||||||
for name, field in model_fields.items():
|
for name, field in model_fields.items():
|
||||||
if name in RESERVED_PYDANTIC_FIELD_NAMES:
|
if name in RESERVED_PYDANTIC_FIELD_NAMES:
|
||||||
raise InvalidFieldError(f"{model_type}.{name}: Invalid field name (reserved by pydantic)")
|
raise InvalidFieldError(f'Invalid field name "{name}" on "{model_type}" (reserved by pydantic)')
|
||||||
|
|
||||||
if not field.annotation:
|
if not field.annotation:
|
||||||
raise InvalidFieldError(f"{model_type}.{name}: Invalid field type (missing annotation)")
|
raise InvalidFieldError(f'Invalid field type "{name}" on "{model_type}" (missing annotation)')
|
||||||
|
|
||||||
if not isinstance(field.json_schema_extra, dict):
|
if not isinstance(field.json_schema_extra, dict):
|
||||||
raise InvalidFieldError(f"{model_type}.{name}: Invalid field definition (missing json_schema_extra dict)")
|
raise InvalidFieldError(
|
||||||
|
f'Invalid field definition for "{name}" on "{model_type}" (missing json_schema_extra dict)'
|
||||||
|
)
|
||||||
|
|
||||||
field_kind = field.json_schema_extra.get("field_kind", None)
|
field_kind = field.json_schema_extra.get("field_kind", None)
|
||||||
|
|
||||||
# must have a field_kind
|
# must have a field_kind
|
||||||
if not is_enum_member(field_kind, FieldKind):
|
if not isinstance(field_kind, FieldKind):
|
||||||
raise InvalidFieldError(
|
raise InvalidFieldError(
|
||||||
f"{model_type}.{name}: Invalid field definition for (maybe it's not an InputField or OutputField?)"
|
f'Invalid field definition for "{name}" on "{model_type}" (maybe it\'s not an InputField or OutputField?)'
|
||||||
)
|
)
|
||||||
|
|
||||||
if field_kind == FieldKind.Input.value and (
|
if field_kind is FieldKind.Input and (
|
||||||
name in RESERVED_NODE_ATTRIBUTE_FIELD_NAMES or name in RESERVED_INPUT_FIELD_NAMES
|
name in RESERVED_NODE_ATTRIBUTE_FIELD_NAMES or name in RESERVED_INPUT_FIELD_NAMES
|
||||||
):
|
):
|
||||||
raise InvalidFieldError(f"{model_type}.{name}: Invalid field name (reserved input field name)")
|
raise InvalidFieldError(f'Invalid field name "{name}" on "{model_type}" (reserved input field name)')
|
||||||
|
|
||||||
if field_kind == FieldKind.Output.value and name in RESERVED_OUTPUT_FIELD_NAMES:
|
if field_kind is FieldKind.Output and name in RESERVED_OUTPUT_FIELD_NAMES:
|
||||||
raise InvalidFieldError(f"{model_type}.{name}: Invalid field name (reserved output field name)")
|
raise InvalidFieldError(f'Invalid field name "{name}" on "{model_type}" (reserved output field name)')
|
||||||
|
|
||||||
if field_kind == FieldKind.Internal.value and name not in RESERVED_INPUT_FIELD_NAMES:
|
if (field_kind is FieldKind.Internal) and name not in RESERVED_INPUT_FIELD_NAMES:
|
||||||
raise InvalidFieldError(f"{model_type}.{name}: Invalid field name (internal field without reserved name)")
|
raise InvalidFieldError(
|
||||||
|
f'Invalid field name "{name}" on "{model_type}" (internal field without reserved name)'
|
||||||
|
)
|
||||||
|
|
||||||
# node attribute fields *must* be in the reserved list
|
# node attribute fields *must* be in the reserved list
|
||||||
if (
|
if (
|
||||||
field_kind == FieldKind.NodeAttribute.value
|
field_kind is FieldKind.NodeAttribute
|
||||||
and name not in RESERVED_NODE_ATTRIBUTE_FIELD_NAMES
|
and name not in RESERVED_NODE_ATTRIBUTE_FIELD_NAMES
|
||||||
and name not in RESERVED_OUTPUT_FIELD_NAMES
|
and name not in RESERVED_OUTPUT_FIELD_NAMES
|
||||||
):
|
):
|
||||||
raise InvalidFieldError(
|
raise InvalidFieldError(
|
||||||
f"{model_type}.{name}: Invalid field name (node attribute field without reserved name)"
|
f'Invalid field name "{name}" on "{model_type}" (node attribute field without reserved name)'
|
||||||
)
|
)
|
||||||
|
|
||||||
ui_type = field.json_schema_extra.get("ui_type", None)
|
ui_type = field.json_schema_extra.get("ui_type", None)
|
||||||
ui_model_base = field.json_schema_extra.get("ui_model_base", None)
|
if isinstance(ui_type, str) and ui_type.startswith("DEPRECATED_"):
|
||||||
ui_model_type = field.json_schema_extra.get("ui_model_type", None)
|
logger.warning(f'"UIType.{ui_type.split("_")[-1]}" is deprecated, ignoring')
|
||||||
ui_model_variant = field.json_schema_extra.get("ui_model_variant", None)
|
|
||||||
ui_model_format = field.json_schema_extra.get("ui_model_format", None)
|
|
||||||
|
|
||||||
if ui_type is not None:
|
|
||||||
# There are 3 cases where we may need to take action:
|
|
||||||
#
|
|
||||||
# 1. The ui_type is a migratable, deprecated value. For example, ui_type=UIType.MainModel value is
|
|
||||||
# deprecated and should be migrated to:
|
|
||||||
# - ui_model_base=[BaseModelType.StableDiffusion1, BaseModelType.StableDiffusion2]
|
|
||||||
# - ui_model_type=[ModelType.Main]
|
|
||||||
#
|
|
||||||
# 2. ui_type was set in conjunction with any of the new ui_model_[base|type|variant|format] fields, which
|
|
||||||
# is not allowed (they are mutually exclusive). In this case, we ignore ui_type and log a warning.
|
|
||||||
#
|
|
||||||
# 3. ui_type is a deprecated value that is not migratable. For example, ui_type=UIType.Image is deprecated;
|
|
||||||
# Image fields are now automatically detected based on the field's type annotation. In this case, we
|
|
||||||
# ignore ui_type and log a warning.
|
|
||||||
#
|
|
||||||
# The cases must be checked in this order to ensure proper handling.
|
|
||||||
|
|
||||||
# Easier to work with as an enum
|
|
||||||
ui_type = UIType(ui_type)
|
|
||||||
|
|
||||||
# The enum member values are not always the same as their names - we want to log the name so the user can
|
|
||||||
# easily review their code and see where the deprecated enum member is used.
|
|
||||||
human_readable_name = f"UIType.{ui_type.name}"
|
|
||||||
|
|
||||||
# Case 1: migratable deprecated value
|
|
||||||
did_migrate = migrate_model_ui_type(ui_type, field.json_schema_extra)
|
|
||||||
|
|
||||||
if did_migrate:
|
|
||||||
logger.warning(
|
|
||||||
f'{model_type}.{name}: Migrated deprecated "ui_type" "{human_readable_name}" to new ui_model_[base|type|variant|format] fields'
|
|
||||||
)
|
|
||||||
field.json_schema_extra.pop("ui_type")
|
field.json_schema_extra.pop("ui_type")
|
||||||
|
|
||||||
# Case 2: mutually exclusive with new fields
|
|
||||||
elif (
|
|
||||||
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(
|
|
||||||
f'{model_type}.{name}: "ui_type" is mutually exclusive with "ui_model_[base|type|format|variant]", ignoring "ui_type"'
|
|
||||||
)
|
|
||||||
field.json_schema_extra.pop("ui_type")
|
|
||||||
|
|
||||||
# Case 3: deprecated value that is not migratable
|
|
||||||
elif ui_type.startswith("DEPRECATED_"):
|
|
||||||
logger.warning(f'{model_type}.{name}: Deprecated "ui_type" "{human_readable_name}", ignoring')
|
|
||||||
field.json_schema_extra.pop("ui_type")
|
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ from invokeai.app.invocations.baseinvocation import (
|
|||||||
invocation,
|
invocation,
|
||||||
invocation_output,
|
invocation_output,
|
||||||
)
|
)
|
||||||
from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField
|
from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField, UIType
|
||||||
from invokeai.app.invocations.model import (
|
from invokeai.app.invocations.model import (
|
||||||
GlmEncoderField,
|
GlmEncoderField,
|
||||||
ModelIdentifierField,
|
ModelIdentifierField,
|
||||||
@@ -14,7 +14,6 @@ from invokeai.app.invocations.model import (
|
|||||||
)
|
)
|
||||||
from invokeai.app.services.shared.invocation_context import InvocationContext
|
from invokeai.app.services.shared.invocation_context import InvocationContext
|
||||||
from invokeai.backend.model_manager.config import SubModelType
|
from invokeai.backend.model_manager.config import SubModelType
|
||||||
from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType
|
|
||||||
|
|
||||||
|
|
||||||
@invocation_output("cogview4_model_loader_output")
|
@invocation_output("cogview4_model_loader_output")
|
||||||
@@ -39,9 +38,8 @@ class CogView4ModelLoaderInvocation(BaseInvocation):
|
|||||||
|
|
||||||
model: ModelIdentifierField = InputField(
|
model: ModelIdentifierField = InputField(
|
||||||
description=FieldDescriptions.cogview4_model,
|
description=FieldDescriptions.cogview4_model,
|
||||||
|
ui_type=UIType.CogView4MainModel,
|
||||||
input=Input.Direct,
|
input=Input.Direct,
|
||||||
ui_model_base=BaseModelType.CogView4,
|
|
||||||
ui_model_type=ModelType.Main,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def invoke(self, context: InvocationContext) -> CogView4ModelLoaderOutput:
|
def invoke(self, context: InvocationContext) -> CogView4ModelLoaderOutput:
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ from invokeai.app.invocations.fields import (
|
|||||||
ImageField,
|
ImageField,
|
||||||
InputField,
|
InputField,
|
||||||
OutputField,
|
OutputField,
|
||||||
|
UIType,
|
||||||
)
|
)
|
||||||
from invokeai.app.invocations.model import ModelIdentifierField
|
from invokeai.app.invocations.model import ModelIdentifierField
|
||||||
from invokeai.app.invocations.primitives import ImageOutput
|
from invokeai.app.invocations.primitives import ImageOutput
|
||||||
@@ -27,7 +28,6 @@ from invokeai.app.util.controlnet_utils import (
|
|||||||
heuristic_resize_fast,
|
heuristic_resize_fast,
|
||||||
)
|
)
|
||||||
from invokeai.backend.image_util.util import np_to_pil, pil_to_np
|
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):
|
class ControlField(BaseModel):
|
||||||
@@ -63,17 +63,13 @@ class ControlOutput(BaseInvocationOutput):
|
|||||||
control: ControlField = OutputField(description=FieldDescriptions.control)
|
control: ControlField = OutputField(description=FieldDescriptions.control)
|
||||||
|
|
||||||
|
|
||||||
@invocation(
|
@invocation("controlnet", title="ControlNet - SD1.5, SDXL", tags=["controlnet"], category="controlnet", version="1.1.3")
|
||||||
"controlnet", title="ControlNet - SD1.5, SD2, SDXL", tags=["controlnet"], category="controlnet", version="1.1.3"
|
|
||||||
)
|
|
||||||
class ControlNetInvocation(BaseInvocation):
|
class ControlNetInvocation(BaseInvocation):
|
||||||
"""Collects ControlNet info to pass to other nodes"""
|
"""Collects ControlNet info to pass to other nodes"""
|
||||||
|
|
||||||
image: ImageField = InputField(description="The control image")
|
image: ImageField = InputField(description="The control image")
|
||||||
control_model: ModelIdentifierField = InputField(
|
control_model: ModelIdentifierField = InputField(
|
||||||
description=FieldDescriptions.controlnet_model,
|
description=FieldDescriptions.controlnet_model, ui_type=UIType.ControlNetModel
|
||||||
ui_model_base=[BaseModelType.StableDiffusion1, BaseModelType.StableDiffusion2, BaseModelType.StableDiffusionXL],
|
|
||||||
ui_model_type=ModelType.ControlNet,
|
|
||||||
)
|
)
|
||||||
control_weight: Union[float, List[float]] = InputField(
|
control_weight: Union[float, List[float]] = InputField(
|
||||||
default=1.0, ge=-1, le=2, description="The weight given to the ControlNet"
|
default=1.0, ge=-1, le=2, description="The weight given to the ControlNet"
|
||||||
|
|||||||
@@ -7,13 +7,6 @@ from pydantic_core import PydanticUndefined
|
|||||||
|
|
||||||
from invokeai.app.util.metaenum import MetaEnum
|
from invokeai.app.util.metaenum import MetaEnum
|
||||||
from invokeai.backend.image_util.segment_anything.shared import BoundingBox
|
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
|
from invokeai.backend.util.logging import InvokeAILogger
|
||||||
|
|
||||||
logger = InvokeAILogger.get_logger()
|
logger = InvokeAILogger.get_logger()
|
||||||
@@ -46,15 +39,47 @@ class UIType(str, Enum, metaclass=MetaEnum):
|
|||||||
used, and the type will be ignored. They are included here for backwards compatibility.
|
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
|
# region Misc Field Types
|
||||||
Scheduler = "SchedulerField"
|
Scheduler = "SchedulerField"
|
||||||
Any = "AnyField"
|
Any = "AnyField"
|
||||||
|
Video = "VideoField"
|
||||||
# endregion
|
# endregion
|
||||||
|
|
||||||
# region Internal Field Types
|
# region Internal Field Types
|
||||||
_Collection = "CollectionField"
|
_Collection = "CollectionField"
|
||||||
_CollectionItem = "CollectionItemField"
|
_CollectionItem = "CollectionItemField"
|
||||||
_IsIntermediate = "IsIntermediate"
|
|
||||||
# endregion
|
# endregion
|
||||||
|
|
||||||
# region DEPRECATED
|
# region DEPRECATED
|
||||||
@@ -92,44 +117,13 @@ class UIType(str, Enum, metaclass=MetaEnum):
|
|||||||
CollectionItem = "DEPRECATED_CollectionItem"
|
CollectionItem = "DEPRECATED_CollectionItem"
|
||||||
Enum = "DEPRECATED_Enum"
|
Enum = "DEPRECATED_Enum"
|
||||||
WorkflowField = "DEPRECATED_WorkflowField"
|
WorkflowField = "DEPRECATED_WorkflowField"
|
||||||
|
IsIntermediate = "DEPRECATED_IsIntermediate"
|
||||||
BoardField = "DEPRECATED_BoardField"
|
BoardField = "DEPRECATED_BoardField"
|
||||||
MetadataItem = "DEPRECATED_MetadataItem"
|
MetadataItem = "DEPRECATED_MetadataItem"
|
||||||
MetadataItemCollection = "DEPRECATED_MetadataItemCollection"
|
MetadataItemCollection = "DEPRECATED_MetadataItemCollection"
|
||||||
MetadataItemPolymorphic = "DEPRECATED_MetadataItemPolymorphic"
|
MetadataItemPolymorphic = "DEPRECATED_MetadataItemPolymorphic"
|
||||||
MetadataDict = "DEPRECATED_MetadataDict"
|
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):
|
class UIComponent(str, Enum, metaclass=MetaEnum):
|
||||||
"""
|
"""
|
||||||
@@ -415,15 +409,10 @@ class InputFieldJSONSchemaExtra(BaseModel):
|
|||||||
ui_component: Optional[UIComponent] = None
|
ui_component: Optional[UIComponent] = None
|
||||||
ui_order: Optional[int] = None
|
ui_order: Optional[int] = None
|
||||||
ui_choice_labels: Optional[dict[str, str]] = 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(
|
model_config = ConfigDict(
|
||||||
validate_assignment=True,
|
validate_assignment=True,
|
||||||
json_schema_serialization_defaults_required=True,
|
json_schema_serialization_defaults_required=True,
|
||||||
use_enum_values=True,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -476,121 +465,16 @@ class OutputFieldJSONSchemaExtra(BaseModel):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
field_kind: FieldKind
|
field_kind: FieldKind
|
||||||
ui_hidden: bool = False
|
ui_hidden: bool
|
||||||
ui_order: Optional[int] = None
|
ui_type: Optional[UIType]
|
||||||
ui_type: Optional[UIType] = None
|
ui_order: Optional[int]
|
||||||
|
|
||||||
model_config = ConfigDict(
|
model_config = ConfigDict(
|
||||||
validate_assignment=True,
|
validate_assignment=True,
|
||||||
json_schema_serialization_defaults_required=True,
|
json_schema_serialization_defaults_required=True,
|
||||||
use_enum_values=True,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def migrate_model_ui_type(ui_type: UIType | str, json_schema_extra: dict[str, Any]) -> bool:
|
|
||||||
"""Migrate deprecated model-specifier ui_type values to new-style ui_model_[base|type|variant|format] in json_schema_extra."""
|
|
||||||
if not isinstance(ui_type, UIType):
|
|
||||||
ui_type = UIType(ui_type)
|
|
||||||
|
|
||||||
ui_model_type: list[ModelType] | None = None
|
|
||||||
ui_model_base: list[BaseModelType] | None = None
|
|
||||||
ui_model_format: list[ModelFormat] | None = None
|
|
||||||
ui_model_variant: list[ClipVariantType | ModelVariantType] | None = None
|
|
||||||
|
|
||||||
match ui_type:
|
|
||||||
case UIType.MainModel:
|
|
||||||
ui_model_base = [BaseModelType.StableDiffusion1, BaseModelType.StableDiffusion2]
|
|
||||||
ui_model_type = [ModelType.Main]
|
|
||||||
case UIType.CogView4MainModel:
|
|
||||||
ui_model_base = [BaseModelType.CogView4]
|
|
||||||
ui_model_type = [ModelType.Main]
|
|
||||||
case UIType.FluxMainModel:
|
|
||||||
ui_model_base = [BaseModelType.Flux]
|
|
||||||
ui_model_type = [ModelType.Main]
|
|
||||||
case UIType.SD3MainModel:
|
|
||||||
ui_model_base = [BaseModelType.StableDiffusion3]
|
|
||||||
ui_model_type = [ModelType.Main]
|
|
||||||
case UIType.SDXLMainModel:
|
|
||||||
ui_model_base = [BaseModelType.StableDiffusionXL]
|
|
||||||
ui_model_type = [ModelType.Main]
|
|
||||||
case UIType.SDXLRefinerModel:
|
|
||||||
ui_model_base = [BaseModelType.StableDiffusionXLRefiner]
|
|
||||||
ui_model_type = [ModelType.Main]
|
|
||||||
case UIType.VAEModel:
|
|
||||||
ui_model_type = [ModelType.VAE]
|
|
||||||
case UIType.FluxVAEModel:
|
|
||||||
ui_model_base = [BaseModelType.Flux]
|
|
||||||
ui_model_type = [ModelType.VAE]
|
|
||||||
case UIType.LoRAModel:
|
|
||||||
ui_model_type = [ModelType.LoRA]
|
|
||||||
case UIType.ControlNetModel:
|
|
||||||
ui_model_type = [ModelType.ControlNet]
|
|
||||||
case UIType.IPAdapterModel:
|
|
||||||
ui_model_type = [ModelType.IPAdapter]
|
|
||||||
case UIType.T2IAdapterModel:
|
|
||||||
ui_model_type = [ModelType.T2IAdapter]
|
|
||||||
case UIType.T5EncoderModel:
|
|
||||||
ui_model_type = [ModelType.T5Encoder]
|
|
||||||
case UIType.CLIPEmbedModel:
|
|
||||||
ui_model_type = [ModelType.CLIPEmbed]
|
|
||||||
case UIType.CLIPLEmbedModel:
|
|
||||||
ui_model_type = [ModelType.CLIPEmbed]
|
|
||||||
ui_model_variant = [ClipVariantType.L]
|
|
||||||
case UIType.CLIPGEmbedModel:
|
|
||||||
ui_model_type = [ModelType.CLIPEmbed]
|
|
||||||
ui_model_variant = [ClipVariantType.G]
|
|
||||||
case UIType.SpandrelImageToImageModel:
|
|
||||||
ui_model_type = [ModelType.SpandrelImageToImage]
|
|
||||||
case UIType.ControlLoRAModel:
|
|
||||||
ui_model_type = [ModelType.ControlLoRa]
|
|
||||||
case UIType.SigLipModel:
|
|
||||||
ui_model_type = [ModelType.SigLIP]
|
|
||||||
case UIType.FluxReduxModel:
|
|
||||||
ui_model_type = [ModelType.FluxRedux]
|
|
||||||
case UIType.LlavaOnevisionModel:
|
|
||||||
ui_model_type = [ModelType.LlavaOnevision]
|
|
||||||
case UIType.Imagen3Model:
|
|
||||||
ui_model_base = [BaseModelType.Imagen3]
|
|
||||||
ui_model_type = [ModelType.Main]
|
|
||||||
case UIType.Imagen4Model:
|
|
||||||
ui_model_base = [BaseModelType.Imagen4]
|
|
||||||
ui_model_type = [ModelType.Main]
|
|
||||||
case UIType.ChatGPT4oModel:
|
|
||||||
ui_model_base = [BaseModelType.ChatGPT4o]
|
|
||||||
ui_model_type = [ModelType.Main]
|
|
||||||
case UIType.Gemini2_5Model:
|
|
||||||
ui_model_base = [BaseModelType.Gemini2_5]
|
|
||||||
ui_model_type = [ModelType.Main]
|
|
||||||
case UIType.FluxKontextModel:
|
|
||||||
ui_model_base = [BaseModelType.FluxKontext]
|
|
||||||
ui_model_type = [ModelType.Main]
|
|
||||||
case UIType.Veo3Model:
|
|
||||||
ui_model_base = [BaseModelType.Veo3]
|
|
||||||
ui_model_type = [ModelType.Video]
|
|
||||||
case UIType.RunwayModel:
|
|
||||||
ui_model_base = [BaseModelType.Runway]
|
|
||||||
ui_model_type = [ModelType.Video]
|
|
||||||
case _:
|
|
||||||
pass
|
|
||||||
|
|
||||||
did_migrate = False
|
|
||||||
|
|
||||||
if ui_model_type is not None:
|
|
||||||
json_schema_extra["ui_model_type"] = [m.value for m in ui_model_type]
|
|
||||||
did_migrate = True
|
|
||||||
if ui_model_base is not None:
|
|
||||||
json_schema_extra["ui_model_base"] = [m.value for m in ui_model_base]
|
|
||||||
did_migrate = True
|
|
||||||
if ui_model_format is not None:
|
|
||||||
json_schema_extra["ui_model_format"] = [m.value for m in ui_model_format]
|
|
||||||
did_migrate = True
|
|
||||||
if ui_model_variant is not None:
|
|
||||||
json_schema_extra["ui_model_variant"] = [m.value for m in ui_model_variant]
|
|
||||||
did_migrate = True
|
|
||||||
|
|
||||||
return did_migrate
|
|
||||||
|
|
||||||
|
|
||||||
def InputField(
|
def InputField(
|
||||||
# copied from pydantic's Field
|
# copied from pydantic's Field
|
||||||
# TODO: Can we support default_factory?
|
# TODO: Can we support default_factory?
|
||||||
@@ -617,63 +501,35 @@ def InputField(
|
|||||||
ui_hidden: Optional[bool] = None,
|
ui_hidden: Optional[bool] = None,
|
||||||
ui_order: Optional[int] = None,
|
ui_order: Optional[int] = None,
|
||||||
ui_choice_labels: Optional[dict[str, str]] = 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:
|
) -> Any:
|
||||||
"""
|
"""
|
||||||
Creates an input field for an invocation.
|
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.
|
that adds a few extra parameters to support graph execution and the node editor UI.
|
||||||
|
|
||||||
If the field is a `ModelIdentifierField`, use the `ui_model_[base|type|variant|format]` args to filter the model list
|
:param Input input: [Input.Any] The kind of input this field requires. \
|
||||||
in the Workflow Editor. Otherwise, use `ui_type` to provide extra type hints for the UI.
|
`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.
|
||||||
|
|
||||||
Don't use both `ui_type` and `ui_model_[base|type|variant|format]` - if both are provided, a warning will be
|
:param UIType ui_type: [None] Optionally provides an extra type hint for the UI. \
|
||||||
logged and `ui_type` will be ignored.
|
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:
|
:param UIComponent ui_component: [None] Optionally specifies a specific component to use in the UI. \
|
||||||
input: The kind of input this field requires.
|
The UI will always render a suitable component, but sometimes you want something different than the default. \
|
||||||
- `Input.Direct` means a value must be provided on instantiation.
|
For example, a `string` field will default to a single-line input, but you may want a multi-line textarea instead. \
|
||||||
- `Input.Connection` means the value must be provided by a connection.
|
For this case, you could provide `UIComponent.Textarea`.
|
||||||
- `Input.Any` means either will do.
|
|
||||||
|
|
||||||
ui_type: Optionally provides an extra type hint for the UI. In some situations, the field's type is not enough
|
:param bool ui_hidden: [False] Specifies whether or not this field should be hidden in the UI.
|
||||||
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.
|
|
||||||
|
|
||||||
ui_component: Optionally specifies a specific component to use in the UI. The UI will always render a suitable
|
:param int ui_order: [None] Specifies the order in which this field should be rendered in the UI.
|
||||||
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`.
|
|
||||||
|
|
||||||
ui_hidden: Specifies whether or not this field should be hidden in the UI.
|
:param dict[str, str] ui_choice_labels: [None] Specifies the labels to use for the choices in an enum field.
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
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(
|
json_schema_extra_ = InputFieldJSONSchemaExtra(
|
||||||
@@ -681,6 +537,8 @@ def InputField(
|
|||||||
field_kind=FieldKind.Input,
|
field_kind=FieldKind.Input,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if ui_type is not None:
|
||||||
|
json_schema_extra_.ui_type = ui_type
|
||||||
if ui_component is not None:
|
if ui_component is not None:
|
||||||
json_schema_extra_.ui_component = ui_component
|
json_schema_extra_.ui_component = ui_component
|
||||||
if ui_hidden is not None:
|
if ui_hidden is not None:
|
||||||
@@ -689,28 +547,6 @@ def InputField(
|
|||||||
json_schema_extra_.ui_order = ui_order
|
json_schema_extra_.ui_order = ui_order
|
||||||
if ui_choice_labels is not None:
|
if ui_choice_labels is not None:
|
||||||
json_schema_extra_.ui_choice_labels = ui_choice_labels
|
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]
|
|
||||||
if ui_type is not None:
|
|
||||||
json_schema_extra_.ui_type = ui_type
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
There is a conflict between the typing of invocation definitions and the typing of an invocation's
|
There is a conflict between the typing of invocation definitions and the typing of an invocation's
|
||||||
@@ -812,20 +648,20 @@ def OutputField(
|
|||||||
"""
|
"""
|
||||||
Creates an output field for an invocation output.
|
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.
|
that adds a few extra parameters to support graph execution and the node editor UI.
|
||||||
|
|
||||||
Args:
|
:param UIType ui_type: [None] Optionally provides an extra type hint for the UI. \
|
||||||
ui_type: Optionally provides an extra type hint for the UI. In some situations, the field's type is not enough
|
In some situations, the field's type is not enough to infer the correct UI type. \
|
||||||
to infer the correct UI type. For example, Scheduler fields are enums, but we want to render a special scheduler
|
For example, model selection fields should render a dropdown UI component to select a model. \
|
||||||
dropdown in the UI. Use `UIType.Scheduler` to indicate this.
|
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_hidden: Specifies whether or not this field should be hidden in the UI.
|
:param bool ui_hidden: [False] Specifies whether or not this field should be hidden in the UI. \
|
||||||
|
|
||||||
ui_order: Specifies the order in which this field should be rendered in the UI. If omitted, the field will be
|
:param int ui_order: [None] Specifies the order in which this field should be rendered in the UI. \
|
||||||
rendered after all fields with an explicit order, in the order they are defined in the Invocation class.
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
return Field(
|
return Field(
|
||||||
default=default,
|
default=default,
|
||||||
title=title,
|
title=title,
|
||||||
@@ -843,9 +679,9 @@ def OutputField(
|
|||||||
min_length=min_length,
|
min_length=min_length,
|
||||||
max_length=max_length,
|
max_length=max_length,
|
||||||
json_schema_extra=OutputFieldJSONSchemaExtra(
|
json_schema_extra=OutputFieldJSONSchemaExtra(
|
||||||
|
ui_type=ui_type,
|
||||||
ui_hidden=ui_hidden,
|
ui_hidden=ui_hidden,
|
||||||
ui_order=ui_order,
|
ui_order=ui_order,
|
||||||
ui_type=ui_type,
|
|
||||||
field_kind=FieldKind.Output,
|
field_kind=FieldKind.Output,
|
||||||
).model_dump(exclude_none=True),
|
).model_dump(exclude_none=True),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -4,10 +4,9 @@ from invokeai.app.invocations.baseinvocation import (
|
|||||||
invocation,
|
invocation,
|
||||||
invocation_output,
|
invocation_output,
|
||||||
)
|
)
|
||||||
from invokeai.app.invocations.fields import FieldDescriptions, ImageField, InputField, OutputField
|
from invokeai.app.invocations.fields import FieldDescriptions, ImageField, InputField, OutputField, UIType
|
||||||
from invokeai.app.invocations.model import ControlLoRAField, ModelIdentifierField
|
from invokeai.app.invocations.model import ControlLoRAField, ModelIdentifierField
|
||||||
from invokeai.app.services.shared.invocation_context import InvocationContext
|
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")
|
@invocation_output("flux_control_lora_loader_output")
|
||||||
@@ -30,10 +29,7 @@ class FluxControlLoRALoaderInvocation(BaseInvocation):
|
|||||||
"""LoRA model and Image to use with FLUX transformer generation."""
|
"""LoRA model and Image to use with FLUX transformer generation."""
|
||||||
|
|
||||||
lora: ModelIdentifierField = InputField(
|
lora: ModelIdentifierField = InputField(
|
||||||
description=FieldDescriptions.control_lora_model,
|
description=FieldDescriptions.control_lora_model, title="Control LoRA", ui_type=UIType.ControlLoRAModel
|
||||||
title="Control LoRA",
|
|
||||||
ui_model_base=BaseModelType.Flux,
|
|
||||||
ui_model_type=ModelType.ControlLoRa,
|
|
||||||
)
|
)
|
||||||
image: ImageField = InputField(description="The image to encode.")
|
image: ImageField = InputField(description="The image to encode.")
|
||||||
weight: float = InputField(description="The weight of the LoRA.", default=1.0)
|
weight: float = InputField(description="The weight of the LoRA.", default=1.0)
|
||||||
|
|||||||
@@ -6,12 +6,11 @@ from invokeai.app.invocations.baseinvocation import (
|
|||||||
invocation,
|
invocation,
|
||||||
invocation_output,
|
invocation_output,
|
||||||
)
|
)
|
||||||
from invokeai.app.invocations.fields import FieldDescriptions, ImageField, InputField, OutputField
|
from invokeai.app.invocations.fields import FieldDescriptions, ImageField, InputField, OutputField, UIType
|
||||||
from invokeai.app.invocations.model import ModelIdentifierField
|
from invokeai.app.invocations.model import ModelIdentifierField
|
||||||
from invokeai.app.invocations.util import validate_begin_end_step, validate_weights
|
from invokeai.app.invocations.util import validate_begin_end_step, validate_weights
|
||||||
from invokeai.app.services.shared.invocation_context import InvocationContext
|
from invokeai.app.services.shared.invocation_context import InvocationContext
|
||||||
from invokeai.app.util.controlnet_utils import CONTROLNET_RESIZE_VALUES
|
from invokeai.app.util.controlnet_utils import CONTROLNET_RESIZE_VALUES
|
||||||
from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType
|
|
||||||
|
|
||||||
|
|
||||||
class FluxControlNetField(BaseModel):
|
class FluxControlNetField(BaseModel):
|
||||||
@@ -58,9 +57,7 @@ class FluxControlNetInvocation(BaseInvocation):
|
|||||||
|
|
||||||
image: ImageField = InputField(description="The control image")
|
image: ImageField = InputField(description="The control image")
|
||||||
control_model: ModelIdentifierField = InputField(
|
control_model: ModelIdentifierField = InputField(
|
||||||
description=FieldDescriptions.controlnet_model,
|
description=FieldDescriptions.controlnet_model, ui_type=UIType.ControlNetModel
|
||||||
ui_model_base=BaseModelType.Flux,
|
|
||||||
ui_model_type=ModelType.ControlNet,
|
|
||||||
)
|
)
|
||||||
control_weight: float | list[float] = InputField(
|
control_weight: float | list[float] = InputField(
|
||||||
default=1.0, ge=-1, le=2, description="The weight given to the ControlNet"
|
default=1.0, ge=-1, le=2, description="The weight given to the ControlNet"
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ from pydantic import field_validator, model_validator
|
|||||||
from typing_extensions import Self
|
from typing_extensions import Self
|
||||||
|
|
||||||
from invokeai.app.invocations.baseinvocation import BaseInvocation, invocation
|
from invokeai.app.invocations.baseinvocation import BaseInvocation, invocation
|
||||||
from invokeai.app.invocations.fields import InputField
|
from invokeai.app.invocations.fields import InputField, UIType
|
||||||
from invokeai.app.invocations.ip_adapter import (
|
from invokeai.app.invocations.ip_adapter import (
|
||||||
CLIP_VISION_MODEL_MAP,
|
CLIP_VISION_MODEL_MAP,
|
||||||
IPAdapterField,
|
IPAdapterField,
|
||||||
@@ -20,7 +20,6 @@ from invokeai.backend.model_manager.config import (
|
|||||||
IPAdapterCheckpointConfig,
|
IPAdapterCheckpointConfig,
|
||||||
IPAdapterInvokeAIConfig,
|
IPAdapterInvokeAIConfig,
|
||||||
)
|
)
|
||||||
from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType
|
|
||||||
|
|
||||||
|
|
||||||
@invocation(
|
@invocation(
|
||||||
@@ -37,10 +36,7 @@ class FluxIPAdapterInvocation(BaseInvocation):
|
|||||||
|
|
||||||
image: ImageField = InputField(description="The IP-Adapter image prompt(s).")
|
image: ImageField = InputField(description="The IP-Adapter image prompt(s).")
|
||||||
ip_adapter_model: ModelIdentifierField = InputField(
|
ip_adapter_model: ModelIdentifierField = InputField(
|
||||||
description="The IP-Adapter model.",
|
description="The IP-Adapter model.", title="IP-Adapter Model", ui_type=UIType.IPAdapterModel
|
||||||
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.
|
# 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")
|
clip_vision_model: Literal["ViT-L"] = InputField(description="CLIP Vision model to use.", default="ViT-L")
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ from invokeai.app.invocations.baseinvocation import (
|
|||||||
invocation,
|
invocation,
|
||||||
invocation_output,
|
invocation_output,
|
||||||
)
|
)
|
||||||
from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField
|
from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField, UIType
|
||||||
from invokeai.app.invocations.model import CLIPField, LoRAField, ModelIdentifierField, T5EncoderField, TransformerField
|
from invokeai.app.invocations.model import CLIPField, LoRAField, ModelIdentifierField, T5EncoderField, TransformerField
|
||||||
from invokeai.app.services.shared.invocation_context import InvocationContext
|
from invokeai.app.services.shared.invocation_context import InvocationContext
|
||||||
from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType
|
from invokeai.backend.model_manager.taxonomy import BaseModelType
|
||||||
|
|
||||||
|
|
||||||
@invocation_output("flux_lora_loader_output")
|
@invocation_output("flux_lora_loader_output")
|
||||||
@@ -36,10 +36,7 @@ class FluxLoRALoaderInvocation(BaseInvocation):
|
|||||||
"""Apply a LoRA model to a FLUX transformer and/or text encoder."""
|
"""Apply a LoRA model to a FLUX transformer and/or text encoder."""
|
||||||
|
|
||||||
lora: ModelIdentifierField = InputField(
|
lora: ModelIdentifierField = InputField(
|
||||||
description=FieldDescriptions.lora_model,
|
description=FieldDescriptions.lora_model, title="LoRA", ui_type=UIType.LoRAModel
|
||||||
title="LoRA",
|
|
||||||
ui_model_base=BaseModelType.Flux,
|
|
||||||
ui_model_type=ModelType.LoRA,
|
|
||||||
)
|
)
|
||||||
weight: float = InputField(default=0.75, description=FieldDescriptions.lora_weight)
|
weight: float = InputField(default=0.75, description=FieldDescriptions.lora_weight)
|
||||||
transformer: TransformerField | None = InputField(
|
transformer: TransformerField | None = InputField(
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ from invokeai.app.invocations.baseinvocation import (
|
|||||||
invocation,
|
invocation,
|
||||||
invocation_output,
|
invocation_output,
|
||||||
)
|
)
|
||||||
from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField
|
from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField, UIType
|
||||||
from invokeai.app.invocations.model import CLIPField, ModelIdentifierField, T5EncoderField, TransformerField, VAEField
|
from invokeai.app.invocations.model import CLIPField, ModelIdentifierField, T5EncoderField, TransformerField, VAEField
|
||||||
from invokeai.app.services.shared.invocation_context import InvocationContext
|
from invokeai.app.services.shared.invocation_context import InvocationContext
|
||||||
from invokeai.app.util.t5_model_identifier import (
|
from invokeai.app.util.t5_model_identifier import (
|
||||||
@@ -17,7 +17,7 @@ from invokeai.backend.flux.util import max_seq_lengths
|
|||||||
from invokeai.backend.model_manager.config import (
|
from invokeai.backend.model_manager.config import (
|
||||||
CheckpointConfigBase,
|
CheckpointConfigBase,
|
||||||
)
|
)
|
||||||
from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType, SubModelType
|
from invokeai.backend.model_manager.taxonomy import SubModelType
|
||||||
|
|
||||||
|
|
||||||
@invocation_output("flux_model_loader_output")
|
@invocation_output("flux_model_loader_output")
|
||||||
@@ -46,30 +46,23 @@ class FluxModelLoaderInvocation(BaseInvocation):
|
|||||||
|
|
||||||
model: ModelIdentifierField = InputField(
|
model: ModelIdentifierField = InputField(
|
||||||
description=FieldDescriptions.flux_model,
|
description=FieldDescriptions.flux_model,
|
||||||
|
ui_type=UIType.FluxMainModel,
|
||||||
input=Input.Direct,
|
input=Input.Direct,
|
||||||
ui_model_base=BaseModelType.Flux,
|
|
||||||
ui_model_type=ModelType.Main,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
t5_encoder_model: ModelIdentifierField = InputField(
|
t5_encoder_model: ModelIdentifierField = InputField(
|
||||||
description=FieldDescriptions.t5_encoder,
|
description=FieldDescriptions.t5_encoder, ui_type=UIType.T5EncoderModel, input=Input.Direct, title="T5 Encoder"
|
||||||
input=Input.Direct,
|
|
||||||
title="T5 Encoder",
|
|
||||||
ui_model_type=ModelType.T5Encoder,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
clip_embed_model: ModelIdentifierField = InputField(
|
clip_embed_model: ModelIdentifierField = InputField(
|
||||||
description=FieldDescriptions.clip_embed_model,
|
description=FieldDescriptions.clip_embed_model,
|
||||||
|
ui_type=UIType.CLIPEmbedModel,
|
||||||
input=Input.Direct,
|
input=Input.Direct,
|
||||||
title="CLIP Embed",
|
title="CLIP Embed",
|
||||||
ui_model_type=ModelType.CLIPEmbed,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
vae_model: ModelIdentifierField = InputField(
|
vae_model: ModelIdentifierField = InputField(
|
||||||
description=FieldDescriptions.vae_model,
|
description=FieldDescriptions.vae_model, ui_type=UIType.FluxVAEModel, title="VAE"
|
||||||
title="VAE",
|
|
||||||
ui_model_base=BaseModelType.Flux,
|
|
||||||
ui_model_type=ModelType.VAE,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def invoke(self, context: InvocationContext) -> FluxModelLoaderOutput:
|
def invoke(self, context: InvocationContext) -> FluxModelLoaderOutput:
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ from invokeai.app.invocations.fields import (
|
|||||||
InputField,
|
InputField,
|
||||||
OutputField,
|
OutputField,
|
||||||
TensorField,
|
TensorField,
|
||||||
|
UIType,
|
||||||
)
|
)
|
||||||
from invokeai.app.invocations.model import ModelIdentifierField
|
from invokeai.app.invocations.model import ModelIdentifierField
|
||||||
from invokeai.app.invocations.primitives import ImageField
|
from invokeai.app.invocations.primitives import ImageField
|
||||||
@@ -63,8 +64,7 @@ class FluxReduxInvocation(BaseInvocation):
|
|||||||
redux_model: ModelIdentifierField = InputField(
|
redux_model: ModelIdentifierField = InputField(
|
||||||
description="The FLUX Redux model to use.",
|
description="The FLUX Redux model to use.",
|
||||||
title="FLUX Redux Model",
|
title="FLUX Redux Model",
|
||||||
ui_model_base=BaseModelType.Flux,
|
ui_type=UIType.FluxReduxModel,
|
||||||
ui_model_type=ModelType.FluxRedux,
|
|
||||||
)
|
)
|
||||||
downsampling_factor: int = InputField(
|
downsampling_factor: int = InputField(
|
||||||
ge=1,
|
ge=1,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ from pydantic import BaseModel, Field, field_validator, model_validator
|
|||||||
from typing_extensions import Self
|
from typing_extensions import Self
|
||||||
|
|
||||||
from invokeai.app.invocations.baseinvocation import BaseInvocation, BaseInvocationOutput, invocation, invocation_output
|
from invokeai.app.invocations.baseinvocation import BaseInvocation, BaseInvocationOutput, invocation, invocation_output
|
||||||
from invokeai.app.invocations.fields import FieldDescriptions, InputField, OutputField, TensorField
|
from invokeai.app.invocations.fields import FieldDescriptions, InputField, OutputField, TensorField, UIType
|
||||||
from invokeai.app.invocations.model import ModelIdentifierField
|
from invokeai.app.invocations.model import ModelIdentifierField
|
||||||
from invokeai.app.invocations.primitives import ImageField
|
from invokeai.app.invocations.primitives import ImageField
|
||||||
from invokeai.app.invocations.util import validate_begin_end_step, validate_weights
|
from invokeai.app.invocations.util import validate_begin_end_step, validate_weights
|
||||||
@@ -85,8 +85,7 @@ class IPAdapterInvocation(BaseInvocation):
|
|||||||
description="The IP-Adapter model.",
|
description="The IP-Adapter model.",
|
||||||
title="IP-Adapter Model",
|
title="IP-Adapter Model",
|
||||||
ui_order=-1,
|
ui_order=-1,
|
||||||
ui_model_base=[BaseModelType.StableDiffusion1, BaseModelType.StableDiffusionXL],
|
ui_type=UIType.IPAdapterModel,
|
||||||
ui_model_type=ModelType.IPAdapter,
|
|
||||||
)
|
)
|
||||||
clip_vision_model: Literal["ViT-H", "ViT-G", "ViT-L"] = InputField(
|
clip_vision_model: Literal["ViT-H", "ViT-G", "ViT-L"] = InputField(
|
||||||
description="CLIP Vision model to use. Overrides model settings. Mandatory for checkpoint models.",
|
description="CLIP Vision model to use. Overrides model settings. Mandatory for checkpoint models.",
|
||||||
|
|||||||
@@ -6,12 +6,11 @@ from pydantic import field_validator
|
|||||||
from transformers import AutoProcessor, LlavaOnevisionForConditionalGeneration, LlavaOnevisionProcessor
|
from transformers import AutoProcessor, LlavaOnevisionForConditionalGeneration, LlavaOnevisionProcessor
|
||||||
|
|
||||||
from invokeai.app.invocations.baseinvocation import BaseInvocation, Classification, invocation
|
from invokeai.app.invocations.baseinvocation import BaseInvocation, Classification, invocation
|
||||||
from invokeai.app.invocations.fields import FieldDescriptions, ImageField, InputField, UIComponent
|
from invokeai.app.invocations.fields import FieldDescriptions, ImageField, InputField, UIComponent, UIType
|
||||||
from invokeai.app.invocations.model import ModelIdentifierField
|
from invokeai.app.invocations.model import ModelIdentifierField
|
||||||
from invokeai.app.invocations.primitives import StringOutput
|
from invokeai.app.invocations.primitives import StringOutput
|
||||||
from invokeai.app.services.shared.invocation_context import InvocationContext
|
from invokeai.app.services.shared.invocation_context import InvocationContext
|
||||||
from invokeai.backend.llava_onevision_pipeline import LlavaOnevisionPipeline
|
from invokeai.backend.llava_onevision_pipeline import LlavaOnevisionPipeline
|
||||||
from invokeai.backend.model_manager.taxonomy import ModelType
|
|
||||||
from invokeai.backend.util.devices import TorchDevice
|
from invokeai.backend.util.devices import TorchDevice
|
||||||
|
|
||||||
|
|
||||||
@@ -35,7 +34,7 @@ class LlavaOnevisionVllmInvocation(BaseInvocation):
|
|||||||
vllm_model: ModelIdentifierField = InputField(
|
vllm_model: ModelIdentifierField = InputField(
|
||||||
title="LLaVA Model Type",
|
title="LLaVA Model Type",
|
||||||
description=FieldDescriptions.vllm_model,
|
description=FieldDescriptions.vllm_model,
|
||||||
ui_model_type=ModelType.LlavaOnevision,
|
ui_type=UIType.LlavaOnevisionModel,
|
||||||
)
|
)
|
||||||
|
|
||||||
@field_validator("images", mode="before")
|
@field_validator("images", mode="before")
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ from invokeai.app.invocations.primitives import (
|
|||||||
from invokeai.app.invocations.scheduler import SchedulerOutput
|
from invokeai.app.invocations.scheduler import SchedulerOutput
|
||||||
from invokeai.app.invocations.t2i_adapter import T2IAdapterField, T2IAdapterInvocation
|
from invokeai.app.invocations.t2i_adapter import T2IAdapterField, T2IAdapterInvocation
|
||||||
from invokeai.app.services.shared.invocation_context import InvocationContext
|
from invokeai.app.services.shared.invocation_context import InvocationContext
|
||||||
from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType, SubModelType
|
from invokeai.backend.model_manager.taxonomy import ModelType, SubModelType
|
||||||
from invokeai.backend.stable_diffusion.schedulers.schedulers import SCHEDULER_NAME_VALUES
|
from invokeai.backend.stable_diffusion.schedulers.schedulers import SCHEDULER_NAME_VALUES
|
||||||
from invokeai.version import __version__
|
from invokeai.version import __version__
|
||||||
|
|
||||||
@@ -473,6 +473,7 @@ class MetadataToModelOutput(BaseInvocationOutput):
|
|||||||
model: ModelIdentifierField = OutputField(
|
model: ModelIdentifierField = OutputField(
|
||||||
description=FieldDescriptions.main_model,
|
description=FieldDescriptions.main_model,
|
||||||
title="Model",
|
title="Model",
|
||||||
|
ui_type=UIType.MainModel,
|
||||||
)
|
)
|
||||||
name: str = OutputField(description="Model Name", title="Name")
|
name: str = OutputField(description="Model Name", title="Name")
|
||||||
unet: UNetField = OutputField(description=FieldDescriptions.unet, title="UNet")
|
unet: UNetField = OutputField(description=FieldDescriptions.unet, title="UNet")
|
||||||
@@ -487,6 +488,7 @@ class MetadataToSDXLModelOutput(BaseInvocationOutput):
|
|||||||
model: ModelIdentifierField = OutputField(
|
model: ModelIdentifierField = OutputField(
|
||||||
description=FieldDescriptions.main_model,
|
description=FieldDescriptions.main_model,
|
||||||
title="Model",
|
title="Model",
|
||||||
|
ui_type=UIType.SDXLMainModel,
|
||||||
)
|
)
|
||||||
name: str = OutputField(description="Model Name", title="Name")
|
name: str = OutputField(description="Model Name", title="Name")
|
||||||
unet: UNetField = OutputField(description=FieldDescriptions.unet, title="UNet")
|
unet: UNetField = OutputField(description=FieldDescriptions.unet, title="UNet")
|
||||||
@@ -517,7 +519,8 @@ class MetadataToModelInvocation(BaseInvocation, WithMetadata):
|
|||||||
input=Input.Direct,
|
input=Input.Direct,
|
||||||
)
|
)
|
||||||
default_value: ModelIdentifierField = InputField(
|
default_value: ModelIdentifierField = InputField(
|
||||||
description="The default model to use if not found in the metadata", ui_model_type=ModelType.Main
|
description="The default model to use if not found in the metadata",
|
||||||
|
ui_type=UIType.MainModel,
|
||||||
)
|
)
|
||||||
|
|
||||||
_validate_custom_label = model_validator(mode="after")(validate_custom_label)
|
_validate_custom_label = model_validator(mode="after")(validate_custom_label)
|
||||||
@@ -572,8 +575,7 @@ class MetadataToSDXLModelInvocation(BaseInvocation, WithMetadata):
|
|||||||
)
|
)
|
||||||
default_value: ModelIdentifierField = InputField(
|
default_value: ModelIdentifierField = InputField(
|
||||||
description="The default SDXL Model to use if not found in the metadata",
|
description="The default SDXL Model to use if not found in the metadata",
|
||||||
ui_model_type=ModelType.Main,
|
ui_type=UIType.SDXLMainModel,
|
||||||
ui_model_base=BaseModelType.StableDiffusionXL,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
_validate_custom_label = model_validator(mode="after")(validate_custom_label)
|
_validate_custom_label = model_validator(mode="after")(validate_custom_label)
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ from invokeai.app.invocations.baseinvocation import (
|
|||||||
invocation,
|
invocation,
|
||||||
invocation_output,
|
invocation_output,
|
||||||
)
|
)
|
||||||
from invokeai.app.invocations.fields import FieldDescriptions, ImageField, Input, InputField, OutputField
|
from invokeai.app.invocations.fields import FieldDescriptions, ImageField, Input, InputField, OutputField, UIType
|
||||||
from invokeai.app.services.shared.invocation_context import InvocationContext
|
from invokeai.app.services.shared.invocation_context import InvocationContext
|
||||||
from invokeai.app.shared.models import FreeUConfig
|
from invokeai.app.shared.models import FreeUConfig
|
||||||
from invokeai.backend.model_manager.config import (
|
from invokeai.backend.model_manager.config import (
|
||||||
@@ -145,7 +145,7 @@ class ModelIdentifierInvocation(BaseInvocation):
|
|||||||
|
|
||||||
@invocation(
|
@invocation(
|
||||||
"main_model_loader",
|
"main_model_loader",
|
||||||
title="Main Model - SD1.5, SD2",
|
title="Main Model - SD1.5",
|
||||||
tags=["model"],
|
tags=["model"],
|
||||||
category="model",
|
category="model",
|
||||||
version="1.0.4",
|
version="1.0.4",
|
||||||
@@ -153,11 +153,7 @@ class ModelIdentifierInvocation(BaseInvocation):
|
|||||||
class MainModelLoaderInvocation(BaseInvocation):
|
class MainModelLoaderInvocation(BaseInvocation):
|
||||||
"""Loads a main model, outputting its submodels."""
|
"""Loads a main model, outputting its submodels."""
|
||||||
|
|
||||||
model: ModelIdentifierField = InputField(
|
model: ModelIdentifierField = InputField(description=FieldDescriptions.main_model, ui_type=UIType.MainModel)
|
||||||
description=FieldDescriptions.main_model,
|
|
||||||
ui_model_base=[BaseModelType.StableDiffusion1, BaseModelType.StableDiffusion2],
|
|
||||||
ui_model_type=ModelType.Main,
|
|
||||||
)
|
|
||||||
# TODO: precision?
|
# TODO: precision?
|
||||||
|
|
||||||
def invoke(self, context: InvocationContext) -> ModelLoaderOutput:
|
def invoke(self, context: InvocationContext) -> ModelLoaderOutput:
|
||||||
@@ -191,10 +187,7 @@ class LoRALoaderInvocation(BaseInvocation):
|
|||||||
"""Apply selected lora to unet and text_encoder."""
|
"""Apply selected lora to unet and text_encoder."""
|
||||||
|
|
||||||
lora: ModelIdentifierField = InputField(
|
lora: ModelIdentifierField = InputField(
|
||||||
description=FieldDescriptions.lora_model,
|
description=FieldDescriptions.lora_model, title="LoRA", ui_type=UIType.LoRAModel
|
||||||
title="LoRA",
|
|
||||||
ui_model_base=BaseModelType.StableDiffusion1,
|
|
||||||
ui_model_type=ModelType.LoRA,
|
|
||||||
)
|
)
|
||||||
weight: float = InputField(default=0.75, description=FieldDescriptions.lora_weight)
|
weight: float = InputField(default=0.75, description=FieldDescriptions.lora_weight)
|
||||||
unet: Optional[UNetField] = InputField(
|
unet: Optional[UNetField] = InputField(
|
||||||
@@ -257,9 +250,7 @@ class LoRASelectorInvocation(BaseInvocation):
|
|||||||
"""Selects a LoRA model and weight."""
|
"""Selects a LoRA model and weight."""
|
||||||
|
|
||||||
lora: ModelIdentifierField = InputField(
|
lora: ModelIdentifierField = InputField(
|
||||||
description=FieldDescriptions.lora_model,
|
description=FieldDescriptions.lora_model, title="LoRA", ui_type=UIType.LoRAModel
|
||||||
title="LoRA",
|
|
||||||
ui_model_type=ModelType.LoRA,
|
|
||||||
)
|
)
|
||||||
weight: float = InputField(default=0.75, description=FieldDescriptions.lora_weight)
|
weight: float = InputField(default=0.75, description=FieldDescriptions.lora_weight)
|
||||||
|
|
||||||
@@ -341,10 +332,7 @@ class SDXLLoRALoaderInvocation(BaseInvocation):
|
|||||||
"""Apply selected lora to unet and text_encoder."""
|
"""Apply selected lora to unet and text_encoder."""
|
||||||
|
|
||||||
lora: ModelIdentifierField = InputField(
|
lora: ModelIdentifierField = InputField(
|
||||||
description=FieldDescriptions.lora_model,
|
description=FieldDescriptions.lora_model, title="LoRA", ui_type=UIType.LoRAModel
|
||||||
title="LoRA",
|
|
||||||
ui_model_base=BaseModelType.StableDiffusionXL,
|
|
||||||
ui_model_type=ModelType.LoRA,
|
|
||||||
)
|
)
|
||||||
weight: float = InputField(default=0.75, description=FieldDescriptions.lora_weight)
|
weight: float = InputField(default=0.75, description=FieldDescriptions.lora_weight)
|
||||||
unet: Optional[UNetField] = InputField(
|
unet: Optional[UNetField] = InputField(
|
||||||
@@ -485,26 +473,13 @@ class SDXLLoRACollectionLoader(BaseInvocation):
|
|||||||
|
|
||||||
|
|
||||||
@invocation(
|
@invocation(
|
||||||
"vae_loader",
|
"vae_loader", title="VAE Model - SD1.5, SDXL, SD3, FLUX", tags=["vae", "model"], category="model", version="1.0.4"
|
||||||
title="VAE Model - SD1.5, SD2, SDXL, SD3, FLUX",
|
|
||||||
tags=["vae", "model"],
|
|
||||||
category="model",
|
|
||||||
version="1.0.4",
|
|
||||||
)
|
)
|
||||||
class VAELoaderInvocation(BaseInvocation):
|
class VAELoaderInvocation(BaseInvocation):
|
||||||
"""Loads a VAE model, outputting a VaeLoaderOutput"""
|
"""Loads a VAE model, outputting a VaeLoaderOutput"""
|
||||||
|
|
||||||
vae_model: ModelIdentifierField = InputField(
|
vae_model: ModelIdentifierField = InputField(
|
||||||
description=FieldDescriptions.vae_model,
|
description=FieldDescriptions.vae_model, title="VAE", ui_type=UIType.VAEModel
|
||||||
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:
|
def invoke(self, context: InvocationContext) -> VAEOutput:
|
||||||
|
|||||||
@@ -6,14 +6,14 @@ from invokeai.app.invocations.baseinvocation import (
|
|||||||
invocation,
|
invocation,
|
||||||
invocation_output,
|
invocation_output,
|
||||||
)
|
)
|
||||||
from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField
|
from invokeai.app.invocations.fields import FieldDescriptions, Input, InputField, OutputField, UIType
|
||||||
from invokeai.app.invocations.model import CLIPField, ModelIdentifierField, T5EncoderField, TransformerField, VAEField
|
from invokeai.app.invocations.model import CLIPField, ModelIdentifierField, T5EncoderField, TransformerField, VAEField
|
||||||
from invokeai.app.services.shared.invocation_context import InvocationContext
|
from invokeai.app.services.shared.invocation_context import InvocationContext
|
||||||
from invokeai.app.util.t5_model_identifier import (
|
from invokeai.app.util.t5_model_identifier import (
|
||||||
preprocess_t5_encoder_model_identifier,
|
preprocess_t5_encoder_model_identifier,
|
||||||
preprocess_t5_tokenizer_model_identifier,
|
preprocess_t5_tokenizer_model_identifier,
|
||||||
)
|
)
|
||||||
from invokeai.backend.model_manager.taxonomy import BaseModelType, ClipVariantType, ModelType, SubModelType
|
from invokeai.backend.model_manager.taxonomy import SubModelType
|
||||||
|
|
||||||
|
|
||||||
@invocation_output("sd3_model_loader_output")
|
@invocation_output("sd3_model_loader_output")
|
||||||
@@ -39,43 +39,36 @@ class Sd3ModelLoaderInvocation(BaseInvocation):
|
|||||||
|
|
||||||
model: ModelIdentifierField = InputField(
|
model: ModelIdentifierField = InputField(
|
||||||
description=FieldDescriptions.sd3_model,
|
description=FieldDescriptions.sd3_model,
|
||||||
|
ui_type=UIType.SD3MainModel,
|
||||||
input=Input.Direct,
|
input=Input.Direct,
|
||||||
ui_model_base=BaseModelType.StableDiffusion3,
|
|
||||||
ui_model_type=ModelType.Main,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
t5_encoder_model: Optional[ModelIdentifierField] = InputField(
|
t5_encoder_model: Optional[ModelIdentifierField] = InputField(
|
||||||
description=FieldDescriptions.t5_encoder,
|
description=FieldDescriptions.t5_encoder,
|
||||||
|
ui_type=UIType.T5EncoderModel,
|
||||||
input=Input.Direct,
|
input=Input.Direct,
|
||||||
title="T5 Encoder",
|
title="T5 Encoder",
|
||||||
default=None,
|
default=None,
|
||||||
ui_model_type=ModelType.T5Encoder,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
clip_l_model: Optional[ModelIdentifierField] = InputField(
|
clip_l_model: Optional[ModelIdentifierField] = InputField(
|
||||||
description=FieldDescriptions.clip_embed_model,
|
description=FieldDescriptions.clip_embed_model,
|
||||||
|
ui_type=UIType.CLIPLEmbedModel,
|
||||||
input=Input.Direct,
|
input=Input.Direct,
|
||||||
title="CLIP L Encoder",
|
title="CLIP L Encoder",
|
||||||
default=None,
|
default=None,
|
||||||
ui_model_type=ModelType.CLIPEmbed,
|
|
||||||
ui_model_variant=ClipVariantType.L,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
clip_g_model: Optional[ModelIdentifierField] = InputField(
|
clip_g_model: Optional[ModelIdentifierField] = InputField(
|
||||||
description=FieldDescriptions.clip_g_model,
|
description=FieldDescriptions.clip_g_model,
|
||||||
|
ui_type=UIType.CLIPGEmbedModel,
|
||||||
input=Input.Direct,
|
input=Input.Direct,
|
||||||
title="CLIP G Encoder",
|
title="CLIP G Encoder",
|
||||||
default=None,
|
default=None,
|
||||||
ui_model_type=ModelType.CLIPEmbed,
|
|
||||||
ui_model_variant=ClipVariantType.G,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
vae_model: Optional[ModelIdentifierField] = InputField(
|
vae_model: Optional[ModelIdentifierField] = InputField(
|
||||||
description=FieldDescriptions.vae_model,
|
description=FieldDescriptions.vae_model, ui_type=UIType.VAEModel, title="VAE", default=None
|
||||||
title="VAE",
|
|
||||||
default=None,
|
|
||||||
ui_model_base=BaseModelType.StableDiffusion3,
|
|
||||||
ui_model_type=ModelType.VAE,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def invoke(self, context: InvocationContext) -> Sd3ModelLoaderOutput:
|
def invoke(self, context: InvocationContext) -> Sd3ModelLoaderOutput:
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
from invokeai.app.invocations.baseinvocation import BaseInvocation, BaseInvocationOutput, invocation, invocation_output
|
from invokeai.app.invocations.baseinvocation import BaseInvocation, BaseInvocationOutput, invocation, invocation_output
|
||||||
from invokeai.app.invocations.fields import FieldDescriptions, InputField, OutputField
|
from invokeai.app.invocations.fields import FieldDescriptions, InputField, OutputField, UIType
|
||||||
from invokeai.app.invocations.model import CLIPField, ModelIdentifierField, UNetField, VAEField
|
from invokeai.app.invocations.model import CLIPField, ModelIdentifierField, UNetField, VAEField
|
||||||
from invokeai.app.services.shared.invocation_context import InvocationContext
|
from invokeai.app.services.shared.invocation_context import InvocationContext
|
||||||
from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType, SubModelType
|
from invokeai.backend.model_manager.taxonomy import SubModelType
|
||||||
|
|
||||||
|
|
||||||
@invocation_output("sdxl_model_loader_output")
|
@invocation_output("sdxl_model_loader_output")
|
||||||
@@ -29,9 +29,7 @@ class SDXLModelLoaderInvocation(BaseInvocation):
|
|||||||
"""Loads an sdxl base model, outputting its submodels."""
|
"""Loads an sdxl base model, outputting its submodels."""
|
||||||
|
|
||||||
model: ModelIdentifierField = InputField(
|
model: ModelIdentifierField = InputField(
|
||||||
description=FieldDescriptions.sdxl_main_model,
|
description=FieldDescriptions.sdxl_main_model, ui_type=UIType.SDXLMainModel
|
||||||
ui_model_base=BaseModelType.StableDiffusionXL,
|
|
||||||
ui_model_type=ModelType.Main,
|
|
||||||
)
|
)
|
||||||
# TODO: precision?
|
# TODO: precision?
|
||||||
|
|
||||||
@@ -69,9 +67,7 @@ class SDXLRefinerModelLoaderInvocation(BaseInvocation):
|
|||||||
"""Loads an sdxl refiner model, outputting its submodels."""
|
"""Loads an sdxl refiner model, outputting its submodels."""
|
||||||
|
|
||||||
model: ModelIdentifierField = InputField(
|
model: ModelIdentifierField = InputField(
|
||||||
description=FieldDescriptions.sdxl_refiner_model,
|
description=FieldDescriptions.sdxl_refiner_model, ui_type=UIType.SDXLRefinerModel
|
||||||
ui_model_base=BaseModelType.StableDiffusionXLRefiner,
|
|
||||||
ui_model_type=ModelType.Main,
|
|
||||||
)
|
)
|
||||||
# TODO: precision?
|
# TODO: precision?
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ from invokeai.app.invocations.fields import (
|
|||||||
FieldDescriptions,
|
FieldDescriptions,
|
||||||
ImageField,
|
ImageField,
|
||||||
InputField,
|
InputField,
|
||||||
|
UIType,
|
||||||
WithBoard,
|
WithBoard,
|
||||||
WithMetadata,
|
WithMetadata,
|
||||||
)
|
)
|
||||||
@@ -18,7 +19,6 @@ from invokeai.app.invocations.model import ModelIdentifierField
|
|||||||
from invokeai.app.invocations.primitives import ImageOutput
|
from invokeai.app.invocations.primitives import ImageOutput
|
||||||
from invokeai.app.services.session_processor.session_processor_common import CanceledException
|
from invokeai.app.services.session_processor.session_processor_common import CanceledException
|
||||||
from invokeai.app.services.shared.invocation_context import InvocationContext
|
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.spandrel_image_to_image_model import SpandrelImageToImageModel
|
||||||
from invokeai.backend.tiles.tiles import calc_tiles_min_overlap
|
from invokeai.backend.tiles.tiles import calc_tiles_min_overlap
|
||||||
from invokeai.backend.tiles.utils import TBLR, Tile
|
from invokeai.backend.tiles.utils import TBLR, Tile
|
||||||
@@ -33,7 +33,7 @@ class SpandrelImageToImageInvocation(BaseInvocation, WithMetadata, WithBoard):
|
|||||||
image_to_image_model: ModelIdentifierField = InputField(
|
image_to_image_model: ModelIdentifierField = InputField(
|
||||||
title="Image-to-Image Model",
|
title="Image-to-Image Model",
|
||||||
description=FieldDescriptions.spandrel_image_to_image_model,
|
description=FieldDescriptions.spandrel_image_to_image_model,
|
||||||
ui_model_type=ModelType.SpandrelImageToImage,
|
ui_type=UIType.SpandrelImageToImageModel,
|
||||||
)
|
)
|
||||||
tile_size: int = InputField(
|
tile_size: int = InputField(
|
||||||
default=512, description="The tile size for tiled image-to-image. Set to 0 to disable tiling."
|
default=512, description="The tile size for tiled image-to-image. Set to 0 to disable tiling."
|
||||||
|
|||||||
@@ -8,12 +8,11 @@ from invokeai.app.invocations.baseinvocation import (
|
|||||||
invocation,
|
invocation,
|
||||||
invocation_output,
|
invocation_output,
|
||||||
)
|
)
|
||||||
from invokeai.app.invocations.fields import FieldDescriptions, ImageField, InputField, OutputField
|
from invokeai.app.invocations.fields import FieldDescriptions, ImageField, InputField, OutputField, UIType
|
||||||
from invokeai.app.invocations.model import ModelIdentifierField
|
from invokeai.app.invocations.model import ModelIdentifierField
|
||||||
from invokeai.app.invocations.util import validate_begin_end_step, validate_weights
|
from invokeai.app.invocations.util import validate_begin_end_step, validate_weights
|
||||||
from invokeai.app.services.shared.invocation_context import InvocationContext
|
from invokeai.app.services.shared.invocation_context import InvocationContext
|
||||||
from invokeai.app.util.controlnet_utils import CONTROLNET_RESIZE_VALUES
|
from invokeai.app.util.controlnet_utils import CONTROLNET_RESIZE_VALUES
|
||||||
from invokeai.backend.model_manager.taxonomy import BaseModelType, ModelType
|
|
||||||
|
|
||||||
|
|
||||||
class T2IAdapterField(BaseModel):
|
class T2IAdapterField(BaseModel):
|
||||||
@@ -61,8 +60,7 @@ class T2IAdapterInvocation(BaseInvocation):
|
|||||||
description="The T2I-Adapter model.",
|
description="The T2I-Adapter model.",
|
||||||
title="T2I-Adapter Model",
|
title="T2I-Adapter Model",
|
||||||
ui_order=-1,
|
ui_order=-1,
|
||||||
ui_model_base=[BaseModelType.StableDiffusion1, BaseModelType.StableDiffusionXL],
|
ui_type=UIType.T2IAdapterModel,
|
||||||
ui_model_type=ModelType.T2IAdapter,
|
|
||||||
)
|
)
|
||||||
weight: Union[float, list[float]] = InputField(
|
weight: Union[float, list[float]] = InputField(
|
||||||
default=1, ge=0, description="The weight given to the T2I-Adapter", title="Weight"
|
default=1, ge=0, description="The weight given to the T2I-Adapter", title="Weight"
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ from abc import ABC, abstractmethod
|
|||||||
from typing import Any, Coroutine, Optional
|
from typing import Any, Coroutine, Optional
|
||||||
|
|
||||||
from invokeai.app.services.session_queue.session_queue_common import (
|
from invokeai.app.services.session_queue.session_queue_common import (
|
||||||
QUEUE_ITEM_STATUS,
|
|
||||||
Batch,
|
Batch,
|
||||||
BatchStatus,
|
BatchStatus,
|
||||||
CancelAllExceptCurrentResult,
|
CancelAllExceptCurrentResult,
|
||||||
@@ -23,7 +22,6 @@ from invokeai.app.services.session_queue.session_queue_common import (
|
|||||||
SessionQueueStatus,
|
SessionQueueStatus,
|
||||||
)
|
)
|
||||||
from invokeai.app.services.shared.graph import GraphExecutionState
|
from invokeai.app.services.shared.graph import GraphExecutionState
|
||||||
from invokeai.app.services.shared.pagination import CursorPaginatedResults
|
|
||||||
from invokeai.app.services.shared.sqlite.sqlite_common import SQLiteDirection
|
from invokeai.app.services.shared.sqlite.sqlite_common import SQLiteDirection
|
||||||
|
|
||||||
|
|
||||||
@@ -137,19 +135,6 @@ class SessionQueueBase(ABC):
|
|||||||
"""Deletes all queue items except in-progress items"""
|
"""Deletes all queue items except in-progress items"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
|
||||||
def list_queue_items(
|
|
||||||
self,
|
|
||||||
queue_id: str,
|
|
||||||
limit: int,
|
|
||||||
priority: int,
|
|
||||||
cursor: Optional[int] = None,
|
|
||||||
status: Optional[QUEUE_ITEM_STATUS] = None,
|
|
||||||
destination: Optional[str] = None,
|
|
||||||
) -> CursorPaginatedResults[SessionQueueItem]:
|
|
||||||
"""Gets a page of session queue items. Do not remove."""
|
|
||||||
pass
|
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def list_all_queue_items(
|
def list_all_queue_items(
|
||||||
self,
|
self,
|
||||||
|
|||||||
@@ -34,7 +34,6 @@ from invokeai.app.services.session_queue.session_queue_common import (
|
|||||||
prepare_values_to_insert,
|
prepare_values_to_insert,
|
||||||
)
|
)
|
||||||
from invokeai.app.services.shared.graph import GraphExecutionState
|
from invokeai.app.services.shared.graph import GraphExecutionState
|
||||||
from invokeai.app.services.shared.pagination import CursorPaginatedResults
|
|
||||||
from invokeai.app.services.shared.sqlite.sqlite_common import SQLiteDirection
|
from invokeai.app.services.shared.sqlite.sqlite_common import SQLiteDirection
|
||||||
from invokeai.app.services.shared.sqlite.sqlite_database import SqliteDatabase
|
from invokeai.app.services.shared.sqlite.sqlite_database import SqliteDatabase
|
||||||
|
|
||||||
@@ -589,59 +588,6 @@ class SqliteSessionQueue(SessionQueueBase):
|
|||||||
)
|
)
|
||||||
return self.get_queue_item(item_id)
|
return self.get_queue_item(item_id)
|
||||||
|
|
||||||
def list_queue_items(
|
|
||||||
self,
|
|
||||||
queue_id: str,
|
|
||||||
limit: int,
|
|
||||||
priority: int,
|
|
||||||
cursor: Optional[int] = None,
|
|
||||||
status: Optional[QUEUE_ITEM_STATUS] = None,
|
|
||||||
destination: Optional[str] = None,
|
|
||||||
) -> CursorPaginatedResults[SessionQueueItem]:
|
|
||||||
with self._db.transaction() as cursor_:
|
|
||||||
item_id = cursor
|
|
||||||
query = """--sql
|
|
||||||
SELECT *
|
|
||||||
FROM session_queue
|
|
||||||
WHERE queue_id = ?
|
|
||||||
"""
|
|
||||||
params: list[Union[str, int]] = [queue_id]
|
|
||||||
|
|
||||||
if status is not None:
|
|
||||||
query += """--sql
|
|
||||||
AND status = ?
|
|
||||||
"""
|
|
||||||
params.append(status)
|
|
||||||
|
|
||||||
if destination is not None:
|
|
||||||
query += """---sql
|
|
||||||
AND destination = ?
|
|
||||||
"""
|
|
||||||
params.append(destination)
|
|
||||||
|
|
||||||
if item_id is not None:
|
|
||||||
query += """--sql
|
|
||||||
AND (priority < ?) OR (priority = ? AND item_id > ?)
|
|
||||||
"""
|
|
||||||
params.extend([priority, priority, item_id])
|
|
||||||
|
|
||||||
query += """--sql
|
|
||||||
ORDER BY
|
|
||||||
priority DESC,
|
|
||||||
item_id ASC
|
|
||||||
LIMIT ?
|
|
||||||
"""
|
|
||||||
params.append(limit + 1)
|
|
||||||
cursor_.execute(query, params)
|
|
||||||
results = cast(list[sqlite3.Row], cursor_.fetchall())
|
|
||||||
items = [SessionQueueItem.queue_item_from_dict(dict(result)) for result in results]
|
|
||||||
has_more = False
|
|
||||||
if len(items) > limit:
|
|
||||||
# remove the extra item
|
|
||||||
items.pop()
|
|
||||||
has_more = True
|
|
||||||
return CursorPaginatedResults(items=items, limit=limit, has_more=has_more)
|
|
||||||
|
|
||||||
def list_all_queue_items(
|
def list_all_queue_items(
|
||||||
self,
|
self,
|
||||||
queue_id: str,
|
queue_id: str,
|
||||||
|
|||||||
@@ -207,24 +207,15 @@ class IPAdapterPlusXL(IPAdapterPlus):
|
|||||||
|
|
||||||
|
|
||||||
def load_ip_adapter_tensors(ip_adapter_ckpt_path: pathlib.Path, device: str) -> IPAdapterStateDict:
|
def load_ip_adapter_tensors(ip_adapter_ckpt_path: pathlib.Path, device: str) -> IPAdapterStateDict:
|
||||||
state_dict: IPAdapterStateDict = {
|
state_dict: IPAdapterStateDict = {"ip_adapter": {}, "image_proj": {}}
|
||||||
"ip_adapter": {},
|
|
||||||
"image_proj": {},
|
|
||||||
"adapter_modules": {}, # added for noobai-mark-ipa
|
|
||||||
"image_proj_model": {}, # added for noobai-mark-ipa
|
|
||||||
}
|
|
||||||
|
|
||||||
if ip_adapter_ckpt_path.suffix == ".safetensors":
|
if ip_adapter_ckpt_path.suffix == ".safetensors":
|
||||||
model = safetensors.torch.load_file(ip_adapter_ckpt_path, device=device)
|
model = safetensors.torch.load_file(ip_adapter_ckpt_path, device=device)
|
||||||
for key in model.keys():
|
for key in model.keys():
|
||||||
if key.startswith("ip_adapter."):
|
if key.startswith("image_proj."):
|
||||||
state_dict["ip_adapter"][key.replace("ip_adapter.", "")] = model[key]
|
|
||||||
elif key.startswith("image_proj_model."):
|
|
||||||
state_dict["image_proj_model"][key.replace("image_proj_model.", "")] = model[key]
|
|
||||||
elif key.startswith("image_proj."):
|
|
||||||
state_dict["image_proj"][key.replace("image_proj.", "")] = model[key]
|
state_dict["image_proj"][key.replace("image_proj.", "")] = model[key]
|
||||||
elif key.startswith("adapter_modules."):
|
elif key.startswith("ip_adapter."):
|
||||||
state_dict["adapter_modules"][key.replace("adapter_modules.", "")] = model[key]
|
state_dict["ip_adapter"][key.replace("ip_adapter.", "")] = model[key]
|
||||||
else:
|
else:
|
||||||
raise RuntimeError(f"Encountered unexpected IP Adapter state dict key: '{key}'.")
|
raise RuntimeError(f"Encountered unexpected IP Adapter state dict key: '{key}'.")
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -5,7 +5,11 @@ import torch
|
|||||||
from diffusers.configuration_utils import ConfigMixin, register_to_config
|
from diffusers.configuration_utils import ConfigMixin, register_to_config
|
||||||
from diffusers.loaders.single_file_model import FromOriginalModelMixin
|
from diffusers.loaders.single_file_model import FromOriginalModelMixin
|
||||||
from diffusers.models.attention_processor import AttentionProcessor, AttnProcessor
|
from diffusers.models.attention_processor import AttentionProcessor, AttnProcessor
|
||||||
from diffusers.models.controlnet import ControlNetConditioningEmbedding, ControlNetOutput, zero_module
|
from diffusers.models.controlnets.controlnet import (
|
||||||
|
ControlNetConditioningEmbedding,
|
||||||
|
ControlNetOutput,
|
||||||
|
zero_module,
|
||||||
|
)
|
||||||
from diffusers.models.embeddings import (
|
from diffusers.models.embeddings import (
|
||||||
TextImageProjection,
|
TextImageProjection,
|
||||||
TextImageTimeEmbedding,
|
TextImageTimeEmbedding,
|
||||||
@@ -775,7 +779,15 @@ class ControlNetModel(ModelMixin, ConfigMixin, FromOriginalModelMixin):
|
|||||||
|
|
||||||
|
|
||||||
diffusers.ControlNetModel = ControlNetModel
|
diffusers.ControlNetModel = ControlNetModel
|
||||||
diffusers.models.controlnet.ControlNetModel = ControlNetModel
|
# Patch both the new and legacy module paths for compatibility
|
||||||
|
try:
|
||||||
|
diffusers.models.controlnets.controlnet.ControlNetModel = ControlNetModel
|
||||||
|
except Exception:
|
||||||
|
# Fallback for environments still exposing the legacy path
|
||||||
|
try:
|
||||||
|
diffusers.models.controlnet.ControlNetModel = ControlNetModel
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
# patch LoRACompatibleConv to use original Conv2D forward function
|
# patch LoRACompatibleConv to use original Conv2D forward function
|
||||||
|
|||||||
@@ -131,8 +131,7 @@
|
|||||||
"notInstalled": "Non $t(common.installed)",
|
"notInstalled": "Non $t(common.installed)",
|
||||||
"prevPage": "Pagina precedente",
|
"prevPage": "Pagina precedente",
|
||||||
"nextPage": "Pagina successiva",
|
"nextPage": "Pagina successiva",
|
||||||
"resetToDefaults": "Ripristina impostazioni predefinite",
|
"resetToDefaults": "Ripristina impostazioni predefinite"
|
||||||
"crop": "Ritaglia"
|
|
||||||
},
|
},
|
||||||
"gallery": {
|
"gallery": {
|
||||||
"galleryImageSize": "Dimensione dell'immagine",
|
"galleryImageSize": "Dimensione dell'immagine",
|
||||||
@@ -279,14 +278,6 @@
|
|||||||
"selectVideoTab": {
|
"selectVideoTab": {
|
||||||
"title": "Seleziona la scheda Video",
|
"title": "Seleziona la scheda Video",
|
||||||
"desc": "Seleziona la scheda Video."
|
"desc": "Seleziona la scheda Video."
|
||||||
},
|
|
||||||
"promptHistoryPrev": {
|
|
||||||
"title": "Prompt precedente nella cronologia",
|
|
||||||
"desc": "Quando il prompt è attivo, passa al prompt precedente (più vecchio) nella cronologia."
|
|
||||||
},
|
|
||||||
"promptHistoryNext": {
|
|
||||||
"title": "Prossimo prompt nella cronologia",
|
|
||||||
"desc": "Quando il prompt è attivo, passa al prompt successivo (più recente) nella cronologia."
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"hotkeys": "Tasti di scelta rapida",
|
"hotkeys": "Tasti di scelta rapida",
|
||||||
@@ -884,8 +875,7 @@
|
|||||||
"video": "Video",
|
"video": "Video",
|
||||||
"resolution": "Risoluzione",
|
"resolution": "Risoluzione",
|
||||||
"downloadImage": "Scarica l'immagine",
|
"downloadImage": "Scarica l'immagine",
|
||||||
"showOptionsPanel": "Mostra pannello laterale (O o T)",
|
"showOptionsPanel": "Mostra pannello laterale (O o T)"
|
||||||
"startingFrameImageAspectRatioWarning": "Le proporzioni dell'immagine non corrispondono alle proporzioni del video ({{videoAspectRatio}}). Ciò potrebbe causare ritagli imprevisti durante la generazione del video."
|
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"models": "Modelli",
|
"models": "Modelli",
|
||||||
@@ -2105,10 +2095,7 @@
|
|||||||
"generateFromImage": "Genera prompt dall'immagine",
|
"generateFromImage": "Genera prompt dall'immagine",
|
||||||
"resultTitle": "Espansione del prompt completata",
|
"resultTitle": "Espansione del prompt completata",
|
||||||
"resultSubtitle": "Scegli come gestire il prompt espanso:",
|
"resultSubtitle": "Scegli come gestire il prompt espanso:",
|
||||||
"insert": "Inserisci",
|
"insert": "Inserisci"
|
||||||
"noPromptHistory": "Nessuna cronologia di prompt registrata.",
|
|
||||||
"noMatchingPrompts": "Nessun prompt corrispondente nella cronologia.",
|
|
||||||
"toSwitchBetweenPrompts": "per passare da un prompt all'altro."
|
|
||||||
},
|
},
|
||||||
"controlLayers": {
|
"controlLayers": {
|
||||||
"addLayer": "Aggiungi Livello",
|
"addLayer": "Aggiungi Livello",
|
||||||
@@ -2804,8 +2791,7 @@
|
|||||||
"watchRecentReleaseVideos": "Guarda i video su questa versione",
|
"watchRecentReleaseVideos": "Guarda i video su questa versione",
|
||||||
"items": [
|
"items": [
|
||||||
"Seleziona oggetto v2: selezione degli oggetti migliorata con input di punti e riquadri o prompt di testo.",
|
"Seleziona oggetto v2: selezione degli oggetti migliorata con input di punti e riquadri o prompt di testo.",
|
||||||
"Regolazioni del livello raster: regola facilmente la luminosità, il contrasto, la saturazione, le curve e altro ancora del livello.",
|
"Regolazioni del livello raster: regola facilmente la luminosità, il contrasto, la saturazione, le curve e altro ancora del livello."
|
||||||
"Cronologia prompt: rivedi e richiama rapidamente i tuoi ultimi 100 prompt."
|
|
||||||
],
|
],
|
||||||
"watchUiUpdatesOverview": "Guarda la panoramica degli aggiornamenti dell'interfaccia utente"
|
"watchUiUpdatesOverview": "Guarda la panoramica degli aggiornamenti dell'interfaccia utente"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ export const RasterLayerAdjustmentsPanel = memo(() => {
|
|||||||
}
|
}
|
||||||
const rect = adapter.transformer.getRelativeRect();
|
const rect = adapter.transformer.getRelativeRect();
|
||||||
try {
|
try {
|
||||||
await adapter.renderer.rasterize({ rect, replaceObjects: true, attrs: { opacity: 1 } });
|
await adapter.renderer.rasterize({ rect, replaceObjects: true });
|
||||||
// Clear adjustments after baking
|
// Clear adjustments after baking
|
||||||
dispatch(rasterLayerAdjustmentsSet({ entityIdentifier, adjustments: null }));
|
dispatch(rasterLayerAdjustmentsSet({ entityIdentifier, adjustments: null }));
|
||||||
} catch {
|
} catch {
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ const modelPaneSx: SystemStyleObject = {
|
|||||||
},
|
},
|
||||||
h: 'full',
|
h: 'full',
|
||||||
minWidth: '300px',
|
minWidth: '300px',
|
||||||
overflow: 'auto',
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export const ModelPane = memo(() => {
|
export const ModelPane = memo(() => {
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ export const ModelView = memo(({ modelConfig }: Props) => {
|
|||||||
}, [modelConfig.base, modelConfig.type]);
|
}, [modelConfig.base, modelConfig.type]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Flex flexDir="column" gap={4} h="full">
|
<Flex flexDir="column" gap={4}>
|
||||||
<ModelHeader modelConfig={modelConfig}>
|
<ModelHeader modelConfig={modelConfig}>
|
||||||
{modelConfig.format === 'checkpoint' && modelConfig.type === 'main' && (
|
{modelConfig.format === 'checkpoint' && modelConfig.type === 'main' && (
|
||||||
<ModelConvertButton modelConfig={modelConfig} />
|
<ModelConvertButton modelConfig={modelConfig} />
|
||||||
@@ -48,7 +48,7 @@ export const ModelView = memo(({ modelConfig }: Props) => {
|
|||||||
<ModelEditButton />
|
<ModelEditButton />
|
||||||
</ModelHeader>
|
</ModelHeader>
|
||||||
<Divider />
|
<Divider />
|
||||||
<Flex flexDir="column" gap={4}>
|
<Flex flexDir="column" h="full" gap={4}>
|
||||||
<Box>
|
<Box>
|
||||||
<SimpleGrid columns={2} gap={4}>
|
<SimpleGrid columns={2} gap={4}>
|
||||||
<ModelAttrView label={t('modelManager.baseModel')} value={modelConfig.base} />
|
<ModelAttrView label={t('modelManager.baseModel')} value={modelConfig.base} />
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
import { FloatFieldInput } from 'features/nodes/components/flow/nodes/Invocation/fields/FloatField/FloatFieldInput';
|
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 { FloatFieldInputAndSlider } from 'features/nodes/components/flow/nodes/Invocation/fields/FloatField/FloatFieldInputAndSlider';
|
||||||
import { FloatFieldSlider } from 'features/nodes/components/flow/nodes/Invocation/fields/FloatField/FloatFieldSlider';
|
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 { FloatFieldCollectionInputComponent } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatFieldCollectionInputComponent';
|
||||||
import { FloatGeneratorFieldInputComponent } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/FloatGeneratorFieldComponent';
|
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 { ImageFieldCollectionInputComponent } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageFieldCollectionInputComponent';
|
||||||
import { ImageGeneratorFieldInputComponent } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ImageGeneratorFieldComponent';
|
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 { IntegerFieldCollectionInputComponent } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerFieldCollectionInputComponent';
|
||||||
import { IntegerGeneratorFieldInputComponent } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorFieldComponent';
|
import { IntegerGeneratorFieldInputComponent } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/IntegerGeneratorFieldComponent';
|
||||||
import ModelIdentifierFieldInputComponent from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelIdentifierFieldInputComponent';
|
import ModelIdentifierFieldInputComponent from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelIdentifierFieldInputComponent';
|
||||||
@@ -23,8 +27,22 @@ import {
|
|||||||
isBoardFieldInputTemplate,
|
isBoardFieldInputTemplate,
|
||||||
isBooleanFieldInputInstance,
|
isBooleanFieldInputInstance,
|
||||||
isBooleanFieldInputTemplate,
|
isBooleanFieldInputTemplate,
|
||||||
|
isChatGPT4oModelFieldInputInstance,
|
||||||
|
isChatGPT4oModelFieldInputTemplate,
|
||||||
|
isCLIPEmbedModelFieldInputInstance,
|
||||||
|
isCLIPEmbedModelFieldInputTemplate,
|
||||||
|
isCLIPGEmbedModelFieldInputInstance,
|
||||||
|
isCLIPGEmbedModelFieldInputTemplate,
|
||||||
|
isCLIPLEmbedModelFieldInputInstance,
|
||||||
|
isCLIPLEmbedModelFieldInputTemplate,
|
||||||
|
isCogView4MainModelFieldInputInstance,
|
||||||
|
isCogView4MainModelFieldInputTemplate,
|
||||||
isColorFieldInputInstance,
|
isColorFieldInputInstance,
|
||||||
isColorFieldInputTemplate,
|
isColorFieldInputTemplate,
|
||||||
|
isControlLoRAModelFieldInputInstance,
|
||||||
|
isControlLoRAModelFieldInputTemplate,
|
||||||
|
isControlNetModelFieldInputInstance,
|
||||||
|
isControlNetModelFieldInputTemplate,
|
||||||
isEnumFieldInputInstance,
|
isEnumFieldInputInstance,
|
||||||
isEnumFieldInputTemplate,
|
isEnumFieldInputTemplate,
|
||||||
isFloatFieldCollectionInputInstance,
|
isFloatFieldCollectionInputInstance,
|
||||||
@@ -33,28 +51,68 @@ import {
|
|||||||
isFloatFieldInputTemplate,
|
isFloatFieldInputTemplate,
|
||||||
isFloatGeneratorFieldInputInstance,
|
isFloatGeneratorFieldInputInstance,
|
||||||
isFloatGeneratorFieldInputTemplate,
|
isFloatGeneratorFieldInputTemplate,
|
||||||
|
isFluxKontextModelFieldInputInstance,
|
||||||
|
isFluxKontextModelFieldInputTemplate,
|
||||||
|
isFluxMainModelFieldInputInstance,
|
||||||
|
isFluxMainModelFieldInputTemplate,
|
||||||
|
isFluxReduxModelFieldInputInstance,
|
||||||
|
isFluxReduxModelFieldInputTemplate,
|
||||||
|
isFluxVAEModelFieldInputInstance,
|
||||||
|
isFluxVAEModelFieldInputTemplate,
|
||||||
isImageFieldCollectionInputInstance,
|
isImageFieldCollectionInputInstance,
|
||||||
isImageFieldCollectionInputTemplate,
|
isImageFieldCollectionInputTemplate,
|
||||||
isImageFieldInputInstance,
|
isImageFieldInputInstance,
|
||||||
isImageFieldInputTemplate,
|
isImageFieldInputTemplate,
|
||||||
isImageGeneratorFieldInputInstance,
|
isImageGeneratorFieldInputInstance,
|
||||||
isImageGeneratorFieldInputTemplate,
|
isImageGeneratorFieldInputTemplate,
|
||||||
|
isImagen3ModelFieldInputInstance,
|
||||||
|
isImagen3ModelFieldInputTemplate,
|
||||||
|
isImagen4ModelFieldInputInstance,
|
||||||
|
isImagen4ModelFieldInputTemplate,
|
||||||
isIntegerFieldCollectionInputInstance,
|
isIntegerFieldCollectionInputInstance,
|
||||||
isIntegerFieldCollectionInputTemplate,
|
isIntegerFieldCollectionInputTemplate,
|
||||||
isIntegerFieldInputInstance,
|
isIntegerFieldInputInstance,
|
||||||
isIntegerFieldInputTemplate,
|
isIntegerFieldInputTemplate,
|
||||||
isIntegerGeneratorFieldInputInstance,
|
isIntegerGeneratorFieldInputInstance,
|
||||||
isIntegerGeneratorFieldInputTemplate,
|
isIntegerGeneratorFieldInputTemplate,
|
||||||
|
isIPAdapterModelFieldInputInstance,
|
||||||
|
isIPAdapterModelFieldInputTemplate,
|
||||||
|
isLLaVAModelFieldInputInstance,
|
||||||
|
isLLaVAModelFieldInputTemplate,
|
||||||
|
isLoRAModelFieldInputInstance,
|
||||||
|
isLoRAModelFieldInputTemplate,
|
||||||
|
isMainModelFieldInputInstance,
|
||||||
|
isMainModelFieldInputTemplate,
|
||||||
isModelIdentifierFieldInputInstance,
|
isModelIdentifierFieldInputInstance,
|
||||||
isModelIdentifierFieldInputTemplate,
|
isModelIdentifierFieldInputTemplate,
|
||||||
|
isRunwayModelFieldInputInstance,
|
||||||
|
isRunwayModelFieldInputTemplate,
|
||||||
isSchedulerFieldInputInstance,
|
isSchedulerFieldInputInstance,
|
||||||
isSchedulerFieldInputTemplate,
|
isSchedulerFieldInputTemplate,
|
||||||
|
isSD3MainModelFieldInputInstance,
|
||||||
|
isSD3MainModelFieldInputTemplate,
|
||||||
|
isSDXLMainModelFieldInputInstance,
|
||||||
|
isSDXLMainModelFieldInputTemplate,
|
||||||
|
isSDXLRefinerModelFieldInputInstance,
|
||||||
|
isSDXLRefinerModelFieldInputTemplate,
|
||||||
|
isSigLipModelFieldInputInstance,
|
||||||
|
isSigLipModelFieldInputTemplate,
|
||||||
|
isSpandrelImageToImageModelFieldInputInstance,
|
||||||
|
isSpandrelImageToImageModelFieldInputTemplate,
|
||||||
isStringFieldCollectionInputInstance,
|
isStringFieldCollectionInputInstance,
|
||||||
isStringFieldCollectionInputTemplate,
|
isStringFieldCollectionInputTemplate,
|
||||||
isStringFieldInputInstance,
|
isStringFieldInputInstance,
|
||||||
isStringFieldInputTemplate,
|
isStringFieldInputTemplate,
|
||||||
isStringGeneratorFieldInputInstance,
|
isStringGeneratorFieldInputInstance,
|
||||||
isStringGeneratorFieldInputTemplate,
|
isStringGeneratorFieldInputTemplate,
|
||||||
|
isT2IAdapterModelFieldInputInstance,
|
||||||
|
isT2IAdapterModelFieldInputTemplate,
|
||||||
|
isT5EncoderModelFieldInputInstance,
|
||||||
|
isT5EncoderModelFieldInputTemplate,
|
||||||
|
isVAEModelFieldInputInstance,
|
||||||
|
isVAEModelFieldInputTemplate,
|
||||||
|
isVeo3ModelFieldInputInstance,
|
||||||
|
isVeo3ModelFieldInputTemplate,
|
||||||
} from 'features/nodes/types/field';
|
} from 'features/nodes/types/field';
|
||||||
import type { NodeFieldElement } from 'features/nodes/types/workflow';
|
import type { NodeFieldElement } from 'features/nodes/types/workflow';
|
||||||
import { memo } from 'react';
|
import { memo } from 'react';
|
||||||
@@ -63,10 +121,33 @@ import { assert } from 'tsafe';
|
|||||||
|
|
||||||
import BoardFieldInputComponent from './inputs/BoardFieldInputComponent';
|
import BoardFieldInputComponent from './inputs/BoardFieldInputComponent';
|
||||||
import BooleanFieldInputComponent from './inputs/BooleanFieldInputComponent';
|
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 ColorFieldInputComponent from './inputs/ColorFieldInputComponent';
|
||||||
|
import ControlLoRAModelFieldInputComponent from './inputs/ControlLoraModelFieldInputComponent';
|
||||||
|
import ControlNetModelFieldInputComponent from './inputs/ControlNetModelFieldInputComponent';
|
||||||
import EnumFieldInputComponent from './inputs/EnumFieldInputComponent';
|
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 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 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 = {
|
type Props = {
|
||||||
nodeId: string;
|
nodeId: string;
|
||||||
@@ -206,6 +287,13 @@ export const InputFieldRenderer = memo(({ nodeId, fieldName, settings }: Props)
|
|||||||
return <BoardFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
return <BoardFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isMainModelFieldInputTemplate(template)) {
|
||||||
|
if (!isMainModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <MainModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
if (isModelIdentifierFieldInputTemplate(template)) {
|
if (isModelIdentifierFieldInputTemplate(template)) {
|
||||||
if (!isModelIdentifierFieldInputInstance(field)) {
|
if (!isModelIdentifierFieldInputInstance(field)) {
|
||||||
return null;
|
return null;
|
||||||
@@ -213,6 +301,159 @@ export const InputFieldRenderer = memo(({ nodeId, fieldName, settings }: Props)
|
|||||||
return <ModelIdentifierFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
return <ModelIdentifierFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isSDXLRefinerModelFieldInputTemplate(template)) {
|
||||||
|
if (!isSDXLRefinerModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <RefinerModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isVAEModelFieldInputTemplate(template)) {
|
||||||
|
if (!isVAEModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <VAEModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isT5EncoderModelFieldInputTemplate(template)) {
|
||||||
|
if (!isT5EncoderModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <T5EncoderModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
if (isCLIPEmbedModelFieldInputTemplate(template)) {
|
||||||
|
if (!isCLIPEmbedModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <CLIPEmbedModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isCLIPLEmbedModelFieldInputTemplate(template)) {
|
||||||
|
if (!isCLIPLEmbedModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <CLIPLEmbedModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isCLIPGEmbedModelFieldInputTemplate(template)) {
|
||||||
|
if (!isCLIPGEmbedModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <CLIPGEmbedModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isControlLoRAModelFieldInputTemplate(template)) {
|
||||||
|
if (!isControlLoRAModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <ControlLoRAModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isLLaVAModelFieldInputTemplate(template)) {
|
||||||
|
if (!isLLaVAModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <LLaVAModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isFluxVAEModelFieldInputTemplate(template)) {
|
||||||
|
if (!isFluxVAEModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <FluxVAEModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isLoRAModelFieldInputTemplate(template)) {
|
||||||
|
if (!isLoRAModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <LoRAModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isControlNetModelFieldInputTemplate(template)) {
|
||||||
|
if (!isControlNetModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <ControlNetModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isIPAdapterModelFieldInputTemplate(template)) {
|
||||||
|
if (!isIPAdapterModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <IPAdapterModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isT2IAdapterModelFieldInputTemplate(template)) {
|
||||||
|
if (!isT2IAdapterModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <T2IAdapterModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isSpandrelImageToImageModelFieldInputTemplate(template)) {
|
||||||
|
if (!isSpandrelImageToImageModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <SpandrelImageToImageModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isSigLipModelFieldInputTemplate(template)) {
|
||||||
|
if (!isSigLipModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <SigLipModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isFluxReduxModelFieldInputTemplate(template)) {
|
||||||
|
if (!isFluxReduxModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <FluxReduxModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isImagen3ModelFieldInputTemplate(template)) {
|
||||||
|
if (!isImagen3ModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <Imagen3ModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isImagen4ModelFieldInputTemplate(template)) {
|
||||||
|
if (!isImagen4ModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <Imagen4ModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isFluxKontextModelFieldInputTemplate(template)) {
|
||||||
|
if (!isFluxKontextModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <FluxKontextModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isChatGPT4oModelFieldInputTemplate(template)) {
|
||||||
|
if (!isChatGPT4oModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <ChatGPT4oModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isVeo3ModelFieldInputTemplate(template)) {
|
||||||
|
if (!isVeo3ModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <Veo3ModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isRunwayModelFieldInputTemplate(template)) {
|
||||||
|
if (!isRunwayModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <RunwayModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
if (isColorFieldInputTemplate(template)) {
|
if (isColorFieldInputTemplate(template)) {
|
||||||
if (!isColorFieldInputInstance(field)) {
|
if (!isColorFieldInputInstance(field)) {
|
||||||
return null;
|
return null;
|
||||||
@@ -220,6 +461,34 @@ export const InputFieldRenderer = memo(({ nodeId, fieldName, settings }: Props)
|
|||||||
return <ColorFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
return <ColorFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isFluxMainModelFieldInputTemplate(template)) {
|
||||||
|
if (!isFluxMainModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <FluxMainModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isSD3MainModelFieldInputTemplate(template)) {
|
||||||
|
if (!isSD3MainModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <SD3MainModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isCogView4MainModelFieldInputTemplate(template)) {
|
||||||
|
if (!isCogView4MainModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <CogView4MainModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isSDXLMainModelFieldInputTemplate(template)) {
|
||||||
|
if (!isSDXLMainModelFieldInputInstance(field)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return <SDXLMainModelFieldInputComponent nodeId={nodeId} field={field} fieldTemplate={template} />;
|
||||||
|
}
|
||||||
|
|
||||||
if (isSchedulerFieldInputTemplate(template)) {
|
if (isSchedulerFieldInputTemplate(template)) {
|
||||||
if (!isSchedulerFieldInputInstance(field)) {
|
if (!isSchedulerFieldInputInstance(field)) {
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
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<CLIPEmbedModelFieldInputInstance, CLIPEmbedModelFieldInputTemplate>;
|
||||||
|
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(CLIPEmbedModelFieldInputComponent);
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
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<CLIPGEmbedModelFieldInputInstance, CLIPGEmbedModelFieldInputTemplate>;
|
||||||
|
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs.filter((config) => isCLIPGEmbedModelConfig(config))}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(CLIPGEmbedModelFieldInputComponent);
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
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<CLIPLEmbedModelFieldInputInstance, CLIPLEmbedModelFieldInputTemplate>;
|
||||||
|
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs.filter((config) => isCLIPLEmbedModelConfig(config))}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(CLIPLEmbedModelFieldInputComponent);
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
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<ChatGPT4oModelFieldInputInstance, ChatGPT4oModelFieldInputTemplate>
|
||||||
|
) => {
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(ChatGPT4oModelFieldInputComponent);
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
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<CogView4MainModelFieldInputInstance, CogView4MainModelFieldInputTemplate>;
|
||||||
|
|
||||||
|
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 (
|
||||||
|
<Flex w="full" alignItems="center" gap={2}>
|
||||||
|
<FormControl
|
||||||
|
className={`${NO_WHEEL_CLASS} ${NO_DRAG_CLASS}`}
|
||||||
|
isDisabled={!options.length}
|
||||||
|
isInvalid={!value && props.fieldTemplate.required}
|
||||||
|
>
|
||||||
|
<Combobox
|
||||||
|
value={value}
|
||||||
|
placeholder={placeholder}
|
||||||
|
options={options}
|
||||||
|
onChange={onChange}
|
||||||
|
noOptionsMessage={noOptionsMessage}
|
||||||
|
/>
|
||||||
|
</FormControl>
|
||||||
|
</Flex>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(CogView4MainModelFieldInputComponent);
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
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<ControlLoRAModelFieldInputInstance, ControlLoRAModelFieldInputTemplate>;
|
||||||
|
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(ControlLoRAModelFieldInputComponent);
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
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<ControlNetModelFieldInputInstance, ControlNetModelFieldInputTemplate>;
|
||||||
|
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(ControlNetModelFieldInputComponent);
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
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<FluxKontextModelFieldInputInstance, FluxKontextModelFieldInputTemplate>
|
||||||
|
) => {
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(FluxKontextModelFieldInputComponent);
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
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<FluxMainModelFieldInputInstance, FluxMainModelFieldInputTemplate>;
|
||||||
|
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(FluxMainModelFieldInputComponent);
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
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<FluxReduxModelFieldInputInstance, FluxReduxModelFieldInputTemplate>
|
||||||
|
) => {
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(FluxReduxModelFieldInputComponent);
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
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<FluxVAEModelFieldInputInstance, FluxVAEModelFieldInputTemplate>;
|
||||||
|
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(FluxVAEModelFieldInputComponent);
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
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<IPAdapterModelFieldInputInstance, IPAdapterModelFieldInputTemplate>
|
||||||
|
) => {
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(IPAdapterModelFieldInputComponent);
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
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<Imagen3ModelFieldInputInstance, Imagen3ModelFieldInputTemplate>
|
||||||
|
) => {
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(Imagen3ModelFieldInputComponent);
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
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<Imagen4ModelFieldInputInstance, Imagen4ModelFieldInputTemplate>
|
||||||
|
) => {
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(Imagen4ModelFieldInputComponent);
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
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<LLaVAModelFieldInputInstance, LLaVAModelFieldInputTemplate>;
|
||||||
|
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(LLaVAModelFieldInputComponent);
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
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<LoRAModelFieldInputInstance, LoRAModelFieldInputTemplate>;
|
||||||
|
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(LoRAModelFieldInputComponent);
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
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<MainModelFieldInputInstance, MainModelFieldInputTemplate>;
|
||||||
|
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(MainModelFieldInputComponent);
|
||||||
@@ -12,7 +12,7 @@ import type { FieldComponentProps } from './types';
|
|||||||
type Props = FieldComponentProps<ModelIdentifierFieldInputInstance, ModelIdentifierFieldInputTemplate>;
|
type Props = FieldComponentProps<ModelIdentifierFieldInputInstance, ModelIdentifierFieldInputTemplate>;
|
||||||
|
|
||||||
const ModelIdentifierFieldInputComponent = (props: Props) => {
|
const ModelIdentifierFieldInputComponent = (props: Props) => {
|
||||||
const { nodeId, field, fieldTemplate } = props;
|
const { nodeId, field } = props;
|
||||||
const dispatch = useAppDispatch();
|
const dispatch = useAppDispatch();
|
||||||
const { data, isLoading } = useGetModelConfigsQuery();
|
const { data, isLoading } = useGetModelConfigsQuery();
|
||||||
const onChange = useCallback(
|
const onChange = useCallback(
|
||||||
@@ -36,31 +36,8 @@ const ModelIdentifierFieldInputComponent = (props: Props) => {
|
|||||||
return EMPTY_ARRAY;
|
return EMPTY_ARRAY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fieldTemplate.ui_model_base && !fieldTemplate.ui_model_type) {
|
|
||||||
return modelConfigsAdapterSelectors.selectAll(data);
|
return modelConfigsAdapterSelectors.selectAll(data);
|
||||||
}
|
}, [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 (
|
return (
|
||||||
<ModelFieldCombobox
|
<ModelFieldCombobox
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
import { useAppDispatch } from 'app/store/storeHooks';
|
||||||
|
import { ModelFieldCombobox } from 'features/nodes/components/flow/nodes/Invocation/fields/inputs/ModelFieldCombobox';
|
||||||
|
import { fieldRefinerModelValueChanged } from 'features/nodes/store/nodesSlice';
|
||||||
|
import type {
|
||||||
|
SDXLRefinerModelFieldInputInstance,
|
||||||
|
SDXLRefinerModelFieldInputTemplate,
|
||||||
|
} from 'features/nodes/types/field';
|
||||||
|
import { memo, useCallback } from 'react';
|
||||||
|
import { useRefinerModels } from 'services/api/hooks/modelsByType';
|
||||||
|
import type { MainModelConfig } from 'services/api/types';
|
||||||
|
|
||||||
|
import type { FieldComponentProps } from './types';
|
||||||
|
|
||||||
|
type Props = FieldComponentProps<SDXLRefinerModelFieldInputInstance, SDXLRefinerModelFieldInputTemplate>;
|
||||||
|
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(RefinerModelFieldInputComponent);
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
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<RunwayModelFieldInputInstance, RunwayModelFieldInputTemplate>
|
||||||
|
) => {
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(RunwayModelFieldInputComponent);
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
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<SD3MainModelFieldInputInstance, SD3MainModelFieldInputTemplate>;
|
||||||
|
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(SD3MainModelFieldInputComponent);
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
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<SDXLMainModelFieldInputInstance, SDXLMainModelFieldInputTemplate>;
|
||||||
|
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(SDXLMainModelFieldInputComponent);
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
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<SigLipModelFieldInputInstance, SigLipModelFieldInputTemplate>
|
||||||
|
) => {
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(SigLipModelFieldInputComponent);
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
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<SpandrelImageToImageModelFieldInputInstance, SpandrelImageToImageModelFieldInputTemplate>
|
||||||
|
) => {
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(SpandrelImageToImageModelFieldInputComponent);
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
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<T2IAdapterModelFieldInputInstance, T2IAdapterModelFieldInputTemplate>
|
||||||
|
) => {
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(T2IAdapterModelFieldInputComponent);
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
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<T5EncoderModelFieldInputInstance, T5EncoderModelFieldInputTemplate>;
|
||||||
|
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(T5EncoderModelFieldInputComponent);
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
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<VAEModelFieldInputInstance, VAEModelFieldInputTemplate>;
|
||||||
|
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(VAEModelFieldInputComponent);
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
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<Veo3ModelFieldInputInstance, Veo3ModelFieldInputTemplate>
|
||||||
|
) => {
|
||||||
|
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 (
|
||||||
|
<ModelFieldCombobox
|
||||||
|
value={field.value}
|
||||||
|
modelConfigs={modelConfigs}
|
||||||
|
isLoadingConfigs={isLoading}
|
||||||
|
onChange={onChange}
|
||||||
|
required={props.fieldTemplate.required}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default memo(Veo3ModelFieldInputComponent);
|
||||||
@@ -2,16 +2,20 @@ import { createSelector } from '@reduxjs/toolkit';
|
|||||||
import { useAppSelector } from 'app/store/storeHooks';
|
import { useAppSelector } from 'app/store/storeHooks';
|
||||||
import { useInvocationNodeContext } from 'features/nodes/components/flow/nodes/Invocation/context';
|
import { useInvocationNodeContext } from 'features/nodes/components/flow/nodes/Invocation/context';
|
||||||
import type { FieldInputTemplate } from 'features/nodes/types/field';
|
import type { FieldInputTemplate } from 'features/nodes/types/field';
|
||||||
import { isSingleOrCollection, isStatefulFieldType } from 'features/nodes/types/field';
|
import { isSingleOrCollection } from 'features/nodes/types/field';
|
||||||
|
import { TEMPLATE_BUILDER_MAP } from 'features/nodes/util/schema/buildFieldInputTemplate';
|
||||||
import { useMemo } from 'react';
|
import { useMemo } from 'react';
|
||||||
|
|
||||||
const isConnectionInputField = (field: FieldInputTemplate) => {
|
const isConnectionInputField = (field: FieldInputTemplate) => {
|
||||||
return (field.input === 'connection' && !isSingleOrCollection(field.type)) || !isStatefulFieldType(field.type);
|
return (
|
||||||
|
(field.input === 'connection' && !isSingleOrCollection(field.type)) || !(field.type.name in TEMPLATE_BUILDER_MAP)
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const isAnyOrDirectInputField = (field: FieldInputTemplate) => {
|
const isAnyOrDirectInputField = (field: FieldInputTemplate) => {
|
||||||
return (
|
return (
|
||||||
(['any', 'direct'].includes(field.input) || isSingleOrCollection(field.type)) && isStatefulFieldType(field.type)
|
(['any', 'direct'].includes(field.input) || isSingleOrCollection(field.type)) &&
|
||||||
|
field.type.name in TEMPLATE_BUILDER_MAP
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -24,44 +24,90 @@ import { SHARED_NODE_PROPERTIES } from 'features/nodes/types/constants';
|
|||||||
import type {
|
import type {
|
||||||
BoardFieldValue,
|
BoardFieldValue,
|
||||||
BooleanFieldValue,
|
BooleanFieldValue,
|
||||||
|
ChatGPT4oModelFieldValue,
|
||||||
|
CLIPEmbedModelFieldValue,
|
||||||
|
CLIPGEmbedModelFieldValue,
|
||||||
|
CLIPLEmbedModelFieldValue,
|
||||||
ColorFieldValue,
|
ColorFieldValue,
|
||||||
|
ControlLoRAModelFieldValue,
|
||||||
|
ControlNetModelFieldValue,
|
||||||
EnumFieldValue,
|
EnumFieldValue,
|
||||||
FieldValue,
|
FieldValue,
|
||||||
FloatFieldValue,
|
FloatFieldValue,
|
||||||
FloatGeneratorFieldValue,
|
FloatGeneratorFieldValue,
|
||||||
|
FluxKontextModelFieldValue,
|
||||||
|
FluxReduxModelFieldValue,
|
||||||
|
FluxVAEModelFieldValue,
|
||||||
ImageFieldCollectionValue,
|
ImageFieldCollectionValue,
|
||||||
ImageFieldValue,
|
ImageFieldValue,
|
||||||
ImageGeneratorFieldValue,
|
ImageGeneratorFieldValue,
|
||||||
|
Imagen3ModelFieldValue,
|
||||||
|
Imagen4ModelFieldValue,
|
||||||
IntegerFieldCollectionValue,
|
IntegerFieldCollectionValue,
|
||||||
IntegerFieldValue,
|
IntegerFieldValue,
|
||||||
IntegerGeneratorFieldValue,
|
IntegerGeneratorFieldValue,
|
||||||
|
IPAdapterModelFieldValue,
|
||||||
|
LLaVAModelFieldValue,
|
||||||
|
LoRAModelFieldValue,
|
||||||
|
MainModelFieldValue,
|
||||||
ModelIdentifierFieldValue,
|
ModelIdentifierFieldValue,
|
||||||
|
RunwayModelFieldValue,
|
||||||
SchedulerFieldValue,
|
SchedulerFieldValue,
|
||||||
|
SDXLRefinerModelFieldValue,
|
||||||
|
SigLipModelFieldValue,
|
||||||
|
SpandrelImageToImageModelFieldValue,
|
||||||
StatefulFieldValue,
|
StatefulFieldValue,
|
||||||
StringFieldCollectionValue,
|
StringFieldCollectionValue,
|
||||||
StringFieldValue,
|
StringFieldValue,
|
||||||
StringGeneratorFieldValue,
|
StringGeneratorFieldValue,
|
||||||
|
T2IAdapterModelFieldValue,
|
||||||
|
T5EncoderModelFieldValue,
|
||||||
|
VAEModelFieldValue,
|
||||||
|
Veo3ModelFieldValue,
|
||||||
} from 'features/nodes/types/field';
|
} from 'features/nodes/types/field';
|
||||||
import {
|
import {
|
||||||
zBoardFieldValue,
|
zBoardFieldValue,
|
||||||
zBooleanFieldValue,
|
zBooleanFieldValue,
|
||||||
|
zChatGPT4oModelFieldValue,
|
||||||
|
zCLIPEmbedModelFieldValue,
|
||||||
|
zCLIPGEmbedModelFieldValue,
|
||||||
|
zCLIPLEmbedModelFieldValue,
|
||||||
zColorFieldValue,
|
zColorFieldValue,
|
||||||
|
zControlLoRAModelFieldValue,
|
||||||
|
zControlNetModelFieldValue,
|
||||||
zEnumFieldValue,
|
zEnumFieldValue,
|
||||||
zFloatFieldCollectionValue,
|
zFloatFieldCollectionValue,
|
||||||
zFloatFieldValue,
|
zFloatFieldValue,
|
||||||
zFloatGeneratorFieldValue,
|
zFloatGeneratorFieldValue,
|
||||||
|
zFluxKontextModelFieldValue,
|
||||||
|
zFluxReduxModelFieldValue,
|
||||||
|
zFluxVAEModelFieldValue,
|
||||||
zImageFieldCollectionValue,
|
zImageFieldCollectionValue,
|
||||||
zImageFieldValue,
|
zImageFieldValue,
|
||||||
zImageGeneratorFieldValue,
|
zImageGeneratorFieldValue,
|
||||||
|
zImagen3ModelFieldValue,
|
||||||
|
zImagen4ModelFieldValue,
|
||||||
zIntegerFieldCollectionValue,
|
zIntegerFieldCollectionValue,
|
||||||
zIntegerFieldValue,
|
zIntegerFieldValue,
|
||||||
zIntegerGeneratorFieldValue,
|
zIntegerGeneratorFieldValue,
|
||||||
|
zIPAdapterModelFieldValue,
|
||||||
|
zLLaVAModelFieldValue,
|
||||||
|
zLoRAModelFieldValue,
|
||||||
|
zMainModelFieldValue,
|
||||||
zModelIdentifierFieldValue,
|
zModelIdentifierFieldValue,
|
||||||
|
zRunwayModelFieldValue,
|
||||||
zSchedulerFieldValue,
|
zSchedulerFieldValue,
|
||||||
|
zSDXLRefinerModelFieldValue,
|
||||||
|
zSigLipModelFieldValue,
|
||||||
|
zSpandrelImageToImageModelFieldValue,
|
||||||
zStatefulFieldValue,
|
zStatefulFieldValue,
|
||||||
zStringFieldCollectionValue,
|
zStringFieldCollectionValue,
|
||||||
zStringFieldValue,
|
zStringFieldValue,
|
||||||
zStringGeneratorFieldValue,
|
zStringGeneratorFieldValue,
|
||||||
|
zT2IAdapterModelFieldValue,
|
||||||
|
zT5EncoderModelFieldValue,
|
||||||
|
zVAEModelFieldValue,
|
||||||
|
zVeo3ModelFieldValue,
|
||||||
} from 'features/nodes/types/field';
|
} from 'features/nodes/types/field';
|
||||||
import type { AnyEdge, AnyNode } from 'features/nodes/types/invocation';
|
import type { AnyEdge, AnyNode } from 'features/nodes/types/invocation';
|
||||||
import { isInvocationNode, isNotesNode } from 'features/nodes/types/invocation';
|
import { isInvocationNode, isNotesNode } from 'features/nodes/types/invocation';
|
||||||
@@ -447,9 +493,81 @@ const slice = createSlice({
|
|||||||
fieldColorValueChanged: (state, action: FieldValueAction<ColorFieldValue>) => {
|
fieldColorValueChanged: (state, action: FieldValueAction<ColorFieldValue>) => {
|
||||||
fieldValueReducer(state, action, zColorFieldValue);
|
fieldValueReducer(state, action, zColorFieldValue);
|
||||||
},
|
},
|
||||||
|
fieldMainModelValueChanged: (state, action: FieldValueAction<MainModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zMainModelFieldValue);
|
||||||
|
},
|
||||||
fieldModelIdentifierValueChanged: (state, action: FieldValueAction<ModelIdentifierFieldValue>) => {
|
fieldModelIdentifierValueChanged: (state, action: FieldValueAction<ModelIdentifierFieldValue>) => {
|
||||||
fieldValueReducer(state, action, zModelIdentifierFieldValue);
|
fieldValueReducer(state, action, zModelIdentifierFieldValue);
|
||||||
},
|
},
|
||||||
|
fieldRefinerModelValueChanged: (state, action: FieldValueAction<SDXLRefinerModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zSDXLRefinerModelFieldValue);
|
||||||
|
},
|
||||||
|
fieldVaeModelValueChanged: (state, action: FieldValueAction<VAEModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zVAEModelFieldValue);
|
||||||
|
},
|
||||||
|
fieldLoRAModelValueChanged: (state, action: FieldValueAction<LoRAModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zLoRAModelFieldValue);
|
||||||
|
},
|
||||||
|
fieldLLaVAModelValueChanged: (state, action: FieldValueAction<LLaVAModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zLLaVAModelFieldValue);
|
||||||
|
},
|
||||||
|
fieldControlNetModelValueChanged: (state, action: FieldValueAction<ControlNetModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zControlNetModelFieldValue);
|
||||||
|
},
|
||||||
|
fieldIPAdapterModelValueChanged: (state, action: FieldValueAction<IPAdapterModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zIPAdapterModelFieldValue);
|
||||||
|
},
|
||||||
|
fieldT2IAdapterModelValueChanged: (state, action: FieldValueAction<T2IAdapterModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zT2IAdapterModelFieldValue);
|
||||||
|
},
|
||||||
|
fieldSpandrelImageToImageModelValueChanged: (
|
||||||
|
state,
|
||||||
|
action: FieldValueAction<SpandrelImageToImageModelFieldValue>
|
||||||
|
) => {
|
||||||
|
fieldValueReducer(state, action, zSpandrelImageToImageModelFieldValue);
|
||||||
|
},
|
||||||
|
fieldT5EncoderValueChanged: (state, action: FieldValueAction<T5EncoderModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zT5EncoderModelFieldValue);
|
||||||
|
},
|
||||||
|
fieldCLIPEmbedValueChanged: (state, action: FieldValueAction<CLIPEmbedModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zCLIPEmbedModelFieldValue);
|
||||||
|
},
|
||||||
|
fieldCLIPLEmbedValueChanged: (state, action: FieldValueAction<CLIPLEmbedModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zCLIPLEmbedModelFieldValue);
|
||||||
|
},
|
||||||
|
fieldCLIPGEmbedValueChanged: (state, action: FieldValueAction<CLIPGEmbedModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zCLIPGEmbedModelFieldValue);
|
||||||
|
},
|
||||||
|
fieldControlLoRAModelValueChanged: (state, action: FieldValueAction<ControlLoRAModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zControlLoRAModelFieldValue);
|
||||||
|
},
|
||||||
|
fieldFluxVAEModelValueChanged: (state, action: FieldValueAction<FluxVAEModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zFluxVAEModelFieldValue);
|
||||||
|
},
|
||||||
|
fieldSigLipModelValueChanged: (state, action: FieldValueAction<SigLipModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zSigLipModelFieldValue);
|
||||||
|
},
|
||||||
|
fieldFluxReduxModelValueChanged: (state, action: FieldValueAction<FluxReduxModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zFluxReduxModelFieldValue);
|
||||||
|
},
|
||||||
|
fieldImagen3ModelValueChanged: (state, action: FieldValueAction<Imagen3ModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zImagen3ModelFieldValue);
|
||||||
|
},
|
||||||
|
fieldImagen4ModelValueChanged: (state, action: FieldValueAction<Imagen4ModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zImagen4ModelFieldValue);
|
||||||
|
},
|
||||||
|
fieldChatGPT4oModelValueChanged: (state, action: FieldValueAction<ChatGPT4oModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zChatGPT4oModelFieldValue);
|
||||||
|
},
|
||||||
|
fieldVeo3ModelValueChanged: (state, action: FieldValueAction<Veo3ModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zVeo3ModelFieldValue);
|
||||||
|
},
|
||||||
|
fieldRunwayModelValueChanged: (state, action: FieldValueAction<RunwayModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zRunwayModelFieldValue);
|
||||||
|
},
|
||||||
|
fieldFluxKontextModelValueChanged: (state, action: FieldValueAction<FluxKontextModelFieldValue>) => {
|
||||||
|
fieldValueReducer(state, action, zFluxKontextModelFieldValue);
|
||||||
|
},
|
||||||
fieldEnumModelValueChanged: (state, action: FieldValueAction<EnumFieldValue>) => {
|
fieldEnumModelValueChanged: (state, action: FieldValueAction<EnumFieldValue>) => {
|
||||||
fieldValueReducer(state, action, zEnumFieldValue);
|
fieldValueReducer(state, action, zEnumFieldValue);
|
||||||
},
|
},
|
||||||
@@ -588,22 +706,45 @@ export const {
|
|||||||
fieldBoardValueChanged,
|
fieldBoardValueChanged,
|
||||||
fieldBooleanValueChanged,
|
fieldBooleanValueChanged,
|
||||||
fieldColorValueChanged,
|
fieldColorValueChanged,
|
||||||
|
fieldControlNetModelValueChanged,
|
||||||
fieldEnumModelValueChanged,
|
fieldEnumModelValueChanged,
|
||||||
fieldImageValueChanged,
|
fieldImageValueChanged,
|
||||||
fieldImageCollectionValueChanged,
|
fieldImageCollectionValueChanged,
|
||||||
|
fieldIPAdapterModelValueChanged,
|
||||||
|
fieldT2IAdapterModelValueChanged,
|
||||||
|
fieldSpandrelImageToImageModelValueChanged,
|
||||||
fieldLabelChanged,
|
fieldLabelChanged,
|
||||||
|
fieldLoRAModelValueChanged,
|
||||||
|
fieldLLaVAModelValueChanged,
|
||||||
fieldModelIdentifierValueChanged,
|
fieldModelIdentifierValueChanged,
|
||||||
|
fieldMainModelValueChanged,
|
||||||
fieldIntegerValueChanged,
|
fieldIntegerValueChanged,
|
||||||
fieldFloatValueChanged,
|
fieldFloatValueChanged,
|
||||||
fieldFloatCollectionValueChanged,
|
fieldFloatCollectionValueChanged,
|
||||||
fieldIntegerCollectionValueChanged,
|
fieldIntegerCollectionValueChanged,
|
||||||
|
fieldRefinerModelValueChanged,
|
||||||
fieldSchedulerValueChanged,
|
fieldSchedulerValueChanged,
|
||||||
fieldStringValueChanged,
|
fieldStringValueChanged,
|
||||||
fieldStringCollectionValueChanged,
|
fieldStringCollectionValueChanged,
|
||||||
|
fieldVaeModelValueChanged,
|
||||||
|
fieldT5EncoderValueChanged,
|
||||||
|
fieldCLIPEmbedValueChanged,
|
||||||
|
fieldCLIPLEmbedValueChanged,
|
||||||
|
fieldCLIPGEmbedValueChanged,
|
||||||
|
fieldControlLoRAModelValueChanged,
|
||||||
|
fieldFluxVAEModelValueChanged,
|
||||||
|
fieldSigLipModelValueChanged,
|
||||||
|
fieldFluxReduxModelValueChanged,
|
||||||
|
fieldImagen3ModelValueChanged,
|
||||||
|
fieldImagen4ModelValueChanged,
|
||||||
|
fieldChatGPT4oModelValueChanged,
|
||||||
|
fieldFluxKontextModelValueChanged,
|
||||||
fieldFloatGeneratorValueChanged,
|
fieldFloatGeneratorValueChanged,
|
||||||
fieldIntegerGeneratorValueChanged,
|
fieldIntegerGeneratorValueChanged,
|
||||||
fieldStringGeneratorValueChanged,
|
fieldStringGeneratorValueChanged,
|
||||||
fieldImageGeneratorValueChanged,
|
fieldImageGeneratorValueChanged,
|
||||||
|
fieldVeo3ModelValueChanged,
|
||||||
|
fieldRunwayModelValueChanged,
|
||||||
fieldDescriptionChanged,
|
fieldDescriptionChanged,
|
||||||
nodeEditorReset,
|
nodeEditorReset,
|
||||||
nodeIsIntermediateChanged,
|
nodeIsIntermediateChanged,
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ describe(areTypesEqual.name, () => {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
const targetType: FieldType = {
|
const targetType: FieldType = {
|
||||||
name: 'StringField',
|
name: 'MainModelField',
|
||||||
cardinality: 'SINGLE',
|
cardinality: 'SINGLE',
|
||||||
batch: false,
|
batch: false,
|
||||||
originalType: {
|
originalType: {
|
||||||
@@ -54,7 +54,7 @@ describe(areTypesEqual.name, () => {
|
|||||||
|
|
||||||
it('should handle equal original source type and target type', () => {
|
it('should handle equal original source type and target type', () => {
|
||||||
const sourceType: FieldType = {
|
const sourceType: FieldType = {
|
||||||
name: 'FloatField',
|
name: 'MainModelField',
|
||||||
cardinality: 'SINGLE',
|
cardinality: 'SINGLE',
|
||||||
batch: false,
|
batch: false,
|
||||||
originalType: {
|
originalType: {
|
||||||
@@ -78,7 +78,7 @@ describe(areTypesEqual.name, () => {
|
|||||||
|
|
||||||
it('should handle equal original source type and original target type', () => {
|
it('should handle equal original source type and original target type', () => {
|
||||||
const sourceType: FieldType = {
|
const sourceType: FieldType = {
|
||||||
name: 'IntegerField',
|
name: 'MainModelField',
|
||||||
cardinality: 'SINGLE',
|
cardinality: 'SINGLE',
|
||||||
batch: false,
|
batch: false,
|
||||||
originalType: {
|
originalType: {
|
||||||
@@ -88,7 +88,7 @@ describe(areTypesEqual.name, () => {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
const targetType: FieldType = {
|
const targetType: FieldType = {
|
||||||
name: 'StringField',
|
name: 'LoRAModelField',
|
||||||
cardinality: 'SINGLE',
|
cardinality: 'SINGLE',
|
||||||
batch: false,
|
batch: false,
|
||||||
originalType: {
|
originalType: {
|
||||||
|
|||||||
@@ -247,15 +247,20 @@ export const main_model_loader: InvocationTemplate = {
|
|||||||
fieldKind: 'input',
|
fieldKind: 'input',
|
||||||
input: 'direct',
|
input: 'direct',
|
||||||
ui_hidden: false,
|
ui_hidden: false,
|
||||||
ui_model_base: ['sd-1'],
|
ui_type: 'MainModelField',
|
||||||
ui_model_type: ['main'],
|
|
||||||
type: {
|
type: {
|
||||||
|
name: 'MainModelField',
|
||||||
|
cardinality: 'SINGLE',
|
||||||
|
batch: false,
|
||||||
|
|
||||||
|
originalType: {
|
||||||
name: 'ModelIdentifierField',
|
name: 'ModelIdentifierField',
|
||||||
cardinality: 'SINGLE',
|
cardinality: 'SINGLE',
|
||||||
batch: false,
|
batch: false,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
},
|
||||||
outputs: {
|
outputs: {
|
||||||
vae: {
|
vae: {
|
||||||
fieldKind: 'output',
|
fieldKind: 'output',
|
||||||
@@ -791,8 +796,7 @@ export const schema = {
|
|||||||
input: 'direct',
|
input: 'direct',
|
||||||
orig_required: true,
|
orig_required: true,
|
||||||
ui_hidden: false,
|
ui_hidden: false,
|
||||||
ui_model_base: ['sd-1'],
|
ui_type: 'MainModelField',
|
||||||
ui_model_type: ['main'],
|
|
||||||
},
|
},
|
||||||
type: {
|
type: {
|
||||||
type: 'string',
|
type: 'string',
|
||||||
|
|||||||
@@ -12,15 +12,11 @@ import type {
|
|||||||
SchedulerField,
|
SchedulerField,
|
||||||
SubModelType,
|
SubModelType,
|
||||||
T2IAdapterField,
|
T2IAdapterField,
|
||||||
zClipVariantType,
|
|
||||||
zModelFormat,
|
|
||||||
zModelVariantType,
|
|
||||||
} from 'features/nodes/types/common';
|
} from 'features/nodes/types/common';
|
||||||
import type { Invocation, S } from 'services/api/types';
|
import type { Invocation, ModelType, S } from 'services/api/types';
|
||||||
import type { Equals, Extends } from 'tsafe';
|
import type { Equals, Extends } from 'tsafe';
|
||||||
import { assert } from 'tsafe';
|
import { assert } from 'tsafe';
|
||||||
import { describe, test } from 'vitest';
|
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.
|
* These types originate from the server and are recreated as zod schemas manually, for use at runtime.
|
||||||
@@ -42,9 +38,7 @@ describe('Common types', () => {
|
|||||||
test('ModelIdentifier', () => assert<Equals<ModelIdentifierField, S['ModelIdentifierField']>>());
|
test('ModelIdentifier', () => assert<Equals<ModelIdentifierField, S['ModelIdentifierField']>>());
|
||||||
test('ModelIdentifier', () => assert<Equals<BaseModelType, S['BaseModelType']>>());
|
test('ModelIdentifier', () => assert<Equals<BaseModelType, S['BaseModelType']>>());
|
||||||
test('ModelIdentifier', () => assert<Equals<SubModelType, S['SubModelType']>>());
|
test('ModelIdentifier', () => assert<Equals<SubModelType, S['SubModelType']>>());
|
||||||
test('ClipVariantType', () => assert<Equals<z.infer<typeof zClipVariantType>, S['ClipVariantType']>>());
|
test('ModelIdentifier', () => assert<Equals<ModelType, S['ModelType']>>());
|
||||||
test('ModelVariantType', () => assert<Equals<z.infer<typeof zModelVariantType>, S['ModelVariantType']>>());
|
|
||||||
test('ModelFormat', () => assert<Equals<z.infer<typeof zModelFormat>, S['ModelFormat']>>());
|
|
||||||
|
|
||||||
// Misc types
|
// Misc types
|
||||||
test('ProgressImage', () => assert<Equals<ProgressImage, S['ProgressImage']>>());
|
test('ProgressImage', () => assert<Equals<ProgressImage, S['ProgressImage']>>());
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ export type SchedulerField = z.infer<typeof zSchedulerField>;
|
|||||||
// #endregion
|
// #endregion
|
||||||
|
|
||||||
// #region Model-related schemas
|
// #region Model-related schemas
|
||||||
export const zBaseModelType = z.enum([
|
const zBaseModel = z.enum([
|
||||||
'any',
|
'any',
|
||||||
'sd-1',
|
'sd-1',
|
||||||
'sd-2',
|
'sd-2',
|
||||||
@@ -90,7 +90,7 @@ export const zBaseModelType = z.enum([
|
|||||||
'veo3',
|
'veo3',
|
||||||
'runway',
|
'runway',
|
||||||
]);
|
]);
|
||||||
export type BaseModelType = z.infer<typeof zBaseModelType>;
|
export type BaseModelType = z.infer<typeof zBaseModel>;
|
||||||
export const zMainModelBase = z.enum([
|
export const zMainModelBase = z.enum([
|
||||||
'sd-1',
|
'sd-1',
|
||||||
'sd-2',
|
'sd-2',
|
||||||
@@ -143,31 +143,11 @@ const zSubModelType = z.enum([
|
|||||||
'safety_checker',
|
'safety_checker',
|
||||||
]);
|
]);
|
||||||
export type SubModelType = z.infer<typeof zSubModelType>;
|
export type SubModelType = z.infer<typeof zSubModelType>;
|
||||||
|
|
||||||
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({
|
export const zModelIdentifierField = z.object({
|
||||||
key: z.string().min(1),
|
key: z.string().min(1),
|
||||||
hash: z.string().min(1),
|
hash: z.string().min(1),
|
||||||
name: z.string().min(1),
|
name: z.string().min(1),
|
||||||
base: zBaseModelType,
|
base: zBaseModel,
|
||||||
type: zModelType,
|
type: zModelType,
|
||||||
submodel_type: zSubModelType.nullish(),
|
submodel_type: zSubModelType.nullish(),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -9,18 +9,7 @@ import { assert } from 'tsafe';
|
|||||||
import { z } from 'zod';
|
import { z } from 'zod';
|
||||||
|
|
||||||
import type { ImageField } from './common';
|
import type { ImageField } from './common';
|
||||||
import {
|
import { zBoardField, zColorField, zImageField, zModelIdentifierField, zSchedulerField } from './common';
|
||||||
zBaseModelType,
|
|
||||||
zBoardField,
|
|
||||||
zClipVariantType,
|
|
||||||
zColorField,
|
|
||||||
zImageField,
|
|
||||||
zModelFormat,
|
|
||||||
zModelIdentifierField,
|
|
||||||
zModelType,
|
|
||||||
zModelVariantType,
|
|
||||||
zSchedulerField,
|
|
||||||
} from './common';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* zod schemas & inferred types for fields.
|
* zod schemas & inferred types for fields.
|
||||||
@@ -71,10 +60,6 @@ const zFieldInputTemplateBase = zFieldTemplateBase.extend({
|
|||||||
default: z.undefined(),
|
default: z.undefined(),
|
||||||
ui_component: zFieldUIComponent.nullish(),
|
ui_component: zFieldUIComponent.nullish(),
|
||||||
ui_choice_labels: z.record(z.string(), z.string()).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({
|
const zFieldOutputTemplateBase = zFieldTemplateBase.extend({
|
||||||
fieldKind: z.literal('output'),
|
fieldKind: z.literal('output'),
|
||||||
@@ -176,10 +161,118 @@ const zColorFieldType = zFieldTypeBase.extend({
|
|||||||
name: z.literal('ColorField'),
|
name: z.literal('ColorField'),
|
||||||
originalType: zStatelessFieldType.optional(),
|
originalType: zStatelessFieldType.optional(),
|
||||||
});
|
});
|
||||||
|
const zMainModelFieldType = zFieldTypeBase.extend({
|
||||||
|
name: z.literal('MainModelField'),
|
||||||
|
originalType: zStatelessFieldType.optional(),
|
||||||
|
});
|
||||||
const zModelIdentifierFieldType = zFieldTypeBase.extend({
|
const zModelIdentifierFieldType = zFieldTypeBase.extend({
|
||||||
name: z.literal('ModelIdentifierField'),
|
name: z.literal('ModelIdentifierField'),
|
||||||
originalType: zStatelessFieldType.optional(),
|
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({
|
const zSchedulerFieldType = zFieldTypeBase.extend({
|
||||||
name: z.literal('SchedulerField'),
|
name: z.literal('SchedulerField'),
|
||||||
originalType: zStatelessFieldType.optional(),
|
originalType: zStatelessFieldType.optional(),
|
||||||
@@ -209,6 +302,33 @@ const zStatefulFieldType = z.union([
|
|||||||
zImageFieldType,
|
zImageFieldType,
|
||||||
zBoardFieldType,
|
zBoardFieldType,
|
||||||
zModelIdentifierFieldType,
|
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,
|
zColorFieldType,
|
||||||
zSchedulerFieldType,
|
zSchedulerFieldType,
|
||||||
zFloatGeneratorFieldType,
|
zFloatGeneratorFieldType,
|
||||||
@@ -224,7 +344,36 @@ const zFieldType = z.union([zStatefulFieldType, zStatelessFieldType]);
|
|||||||
export type FieldType = z.infer<typeof zFieldType>;
|
export type FieldType = z.infer<typeof zFieldType>;
|
||||||
|
|
||||||
const modelFieldTypeNames = [
|
const modelFieldTypeNames = [
|
||||||
|
// Stateful model fields
|
||||||
zModelIdentifierFieldType.shape.name.value,
|
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',
|
'UNetField',
|
||||||
'VAEField',
|
'VAEField',
|
||||||
'CLIPField',
|
'CLIPField',
|
||||||
@@ -630,6 +779,26 @@ export const isColorFieldInputInstance = buildInstanceTypeGuard(zColorFieldInput
|
|||||||
export const isColorFieldInputTemplate = buildTemplateTypeGuard<ColorFieldInputTemplate>('ColorField');
|
export const isColorFieldInputTemplate = buildTemplateTypeGuard<ColorFieldInputTemplate>('ColorField');
|
||||||
// #endregion
|
// #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<typeof zMainModelFieldValue>;
|
||||||
|
export type MainModelFieldInputInstance = z.infer<typeof zMainModelFieldInputInstance>;
|
||||||
|
export type MainModelFieldInputTemplate = z.infer<typeof zMainModelFieldInputTemplate>;
|
||||||
|
export const isMainModelFieldInputInstance = buildInstanceTypeGuard(zMainModelFieldInputInstance);
|
||||||
|
export const isMainModelFieldInputTemplate = buildTemplateTypeGuard<MainModelFieldInputTemplate>('MainModelField');
|
||||||
|
// #endregion
|
||||||
|
|
||||||
// #region ModelIdentifierField
|
// #region ModelIdentifierField
|
||||||
export const zModelIdentifierFieldValue = zModelIdentifierField.optional();
|
export const zModelIdentifierFieldValue = zModelIdentifierField.optional();
|
||||||
const zModelIdentifierFieldInputInstance = zFieldInputInstanceBase.extend({
|
const zModelIdentifierFieldInputInstance = zFieldInputInstanceBase.extend({
|
||||||
@@ -651,6 +820,507 @@ export const isModelIdentifierFieldInputTemplate =
|
|||||||
buildTemplateTypeGuard<ModelIdentifierFieldInputTemplate>('ModelIdentifierField');
|
buildTemplateTypeGuard<ModelIdentifierFieldInputTemplate>('ModelIdentifierField');
|
||||||
// #endregion
|
// #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<typeof zSDXLMainModelFieldInputInstance>;
|
||||||
|
export type SDXLMainModelFieldInputTemplate = z.infer<typeof zSDXLMainModelFieldInputTemplate>;
|
||||||
|
export const isSDXLMainModelFieldInputInstance = buildInstanceTypeGuard(zSDXLMainModelFieldInputInstance);
|
||||||
|
export const isSDXLMainModelFieldInputTemplate =
|
||||||
|
buildTemplateTypeGuard<SDXLMainModelFieldInputTemplate>('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<typeof zSD3MainModelFieldInputInstance>;
|
||||||
|
export type SD3MainModelFieldInputTemplate = z.infer<typeof zSD3MainModelFieldInputTemplate>;
|
||||||
|
export const isSD3MainModelFieldInputInstance = buildInstanceTypeGuard(zSD3MainModelFieldInputInstance);
|
||||||
|
export const isSD3MainModelFieldInputTemplate =
|
||||||
|
buildTemplateTypeGuard<SD3MainModelFieldInputTemplate>('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<typeof zCogView4MainModelFieldInputInstance>;
|
||||||
|
export type CogView4MainModelFieldInputTemplate = z.infer<typeof zCogView4MainModelFieldInputTemplate>;
|
||||||
|
export const isCogView4MainModelFieldInputInstance = buildInstanceTypeGuard(zCogView4MainModelFieldInputInstance);
|
||||||
|
export const isCogView4MainModelFieldInputTemplate =
|
||||||
|
buildTemplateTypeGuard<CogView4MainModelFieldInputTemplate>('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<typeof zFluxMainModelFieldInputInstance>;
|
||||||
|
export type FluxMainModelFieldInputTemplate = z.infer<typeof zFluxMainModelFieldInputTemplate>;
|
||||||
|
export const isFluxMainModelFieldInputInstance = buildInstanceTypeGuard(zFluxMainModelFieldInputInstance);
|
||||||
|
export const isFluxMainModelFieldInputTemplate =
|
||||||
|
buildTemplateTypeGuard<FluxMainModelFieldInputTemplate>('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<typeof zSDXLRefinerModelFieldValue>;
|
||||||
|
export type SDXLRefinerModelFieldInputInstance = z.infer<typeof zSDXLRefinerModelFieldInputInstance>;
|
||||||
|
export type SDXLRefinerModelFieldInputTemplate = z.infer<typeof zSDXLRefinerModelFieldInputTemplate>;
|
||||||
|
export const isSDXLRefinerModelFieldInputInstance = buildInstanceTypeGuard(zSDXLRefinerModelFieldInputInstance);
|
||||||
|
export const isSDXLRefinerModelFieldInputTemplate =
|
||||||
|
buildTemplateTypeGuard<SDXLRefinerModelFieldInputTemplate>('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<typeof zVAEModelFieldValue>;
|
||||||
|
export type VAEModelFieldInputInstance = z.infer<typeof zVAEModelFieldInputInstance>;
|
||||||
|
export type VAEModelFieldInputTemplate = z.infer<typeof zVAEModelFieldInputTemplate>;
|
||||||
|
export const isVAEModelFieldInputInstance = buildInstanceTypeGuard(zVAEModelFieldInputInstance);
|
||||||
|
export const isVAEModelFieldInputTemplate = buildTemplateTypeGuard<VAEModelFieldInputTemplate>('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<typeof zLoRAModelFieldValue>;
|
||||||
|
export type LoRAModelFieldInputInstance = z.infer<typeof zLoRAModelFieldInputInstance>;
|
||||||
|
export type LoRAModelFieldInputTemplate = z.infer<typeof zLoRAModelFieldInputTemplate>;
|
||||||
|
export const isLoRAModelFieldInputInstance = buildInstanceTypeGuard(zLoRAModelFieldInputInstance);
|
||||||
|
export const isLoRAModelFieldInputTemplate = buildTemplateTypeGuard<LoRAModelFieldInputTemplate>('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<typeof zLLaVAModelFieldValue>;
|
||||||
|
export type LLaVAModelFieldInputInstance = z.infer<typeof zLLaVAModelFieldInputInstance>;
|
||||||
|
export type LLaVAModelFieldInputTemplate = z.infer<typeof zLLaVAModelFieldInputTemplate>;
|
||||||
|
export const isLLaVAModelFieldInputInstance = buildInstanceTypeGuard(zLLaVAModelFieldInputInstance);
|
||||||
|
export const isLLaVAModelFieldInputTemplate = buildTemplateTypeGuard<LLaVAModelFieldInputTemplate>('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<typeof zControlNetModelFieldValue>;
|
||||||
|
export type ControlNetModelFieldInputInstance = z.infer<typeof zControlNetModelFieldInputInstance>;
|
||||||
|
export type ControlNetModelFieldInputTemplate = z.infer<typeof zControlNetModelFieldInputTemplate>;
|
||||||
|
export const isControlNetModelFieldInputInstance = buildInstanceTypeGuard(zControlNetModelFieldInputInstance);
|
||||||
|
export const isControlNetModelFieldInputTemplate =
|
||||||
|
buildTemplateTypeGuard<ControlNetModelFieldInputTemplate>('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<typeof zIPAdapterModelFieldValue>;
|
||||||
|
export type IPAdapterModelFieldInputInstance = z.infer<typeof zIPAdapterModelFieldInputInstance>;
|
||||||
|
export type IPAdapterModelFieldInputTemplate = z.infer<typeof zIPAdapterModelFieldInputTemplate>;
|
||||||
|
export const isIPAdapterModelFieldInputInstance = buildInstanceTypeGuard(zIPAdapterModelFieldInputInstance);
|
||||||
|
export const isIPAdapterModelFieldInputTemplate =
|
||||||
|
buildTemplateTypeGuard<IPAdapterModelFieldInputTemplate>('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<typeof zT2IAdapterModelFieldValue>;
|
||||||
|
export type T2IAdapterModelFieldInputInstance = z.infer<typeof zT2IAdapterModelFieldInputInstance>;
|
||||||
|
export type T2IAdapterModelFieldInputTemplate = z.infer<typeof zT2IAdapterModelFieldInputTemplate>;
|
||||||
|
export const isT2IAdapterModelFieldInputInstance = buildInstanceTypeGuard(zT2IAdapterModelFieldInputInstance);
|
||||||
|
export const isT2IAdapterModelFieldInputTemplate =
|
||||||
|
buildTemplateTypeGuard<T2IAdapterModelFieldInputTemplate>('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<typeof zSpandrelImageToImageModelFieldValue>;
|
||||||
|
export type SpandrelImageToImageModelFieldInputInstance = z.infer<typeof zSpandrelImageToImageModelFieldInputInstance>;
|
||||||
|
export type SpandrelImageToImageModelFieldInputTemplate = z.infer<typeof zSpandrelImageToImageModelFieldInputTemplate>;
|
||||||
|
export const isSpandrelImageToImageModelFieldInputInstance = buildInstanceTypeGuard(
|
||||||
|
zSpandrelImageToImageModelFieldInputInstance
|
||||||
|
);
|
||||||
|
export const isSpandrelImageToImageModelFieldInputTemplate =
|
||||||
|
buildTemplateTypeGuard<SpandrelImageToImageModelFieldInputTemplate>('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<typeof zT5EncoderModelFieldValue>;
|
||||||
|
export type T5EncoderModelFieldInputInstance = z.infer<typeof zT5EncoderModelFieldInputInstance>;
|
||||||
|
export type T5EncoderModelFieldInputTemplate = z.infer<typeof zT5EncoderModelFieldInputTemplate>;
|
||||||
|
export const isT5EncoderModelFieldInputInstance = buildInstanceTypeGuard(zT5EncoderModelFieldInputInstance);
|
||||||
|
export const isT5EncoderModelFieldInputTemplate =
|
||||||
|
buildTemplateTypeGuard<T5EncoderModelFieldInputTemplate>('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<typeof zFluxVAEModelFieldValue>;
|
||||||
|
export type FluxVAEModelFieldInputInstance = z.infer<typeof zFluxVAEModelFieldInputInstance>;
|
||||||
|
export type FluxVAEModelFieldInputTemplate = z.infer<typeof zFluxVAEModelFieldInputTemplate>;
|
||||||
|
export const isFluxVAEModelFieldInputInstance = buildInstanceTypeGuard(zFluxVAEModelFieldInputInstance);
|
||||||
|
export const isFluxVAEModelFieldInputTemplate =
|
||||||
|
buildTemplateTypeGuard<FluxVAEModelFieldInputTemplate>('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<typeof zCLIPEmbedModelFieldValue>;
|
||||||
|
export type CLIPEmbedModelFieldInputInstance = z.infer<typeof zCLIPEmbedModelFieldInputInstance>;
|
||||||
|
export type CLIPEmbedModelFieldInputTemplate = z.infer<typeof zCLIPEmbedModelFieldInputTemplate>;
|
||||||
|
export const isCLIPEmbedModelFieldInputInstance = buildInstanceTypeGuard(zCLIPEmbedModelFieldInputInstance);
|
||||||
|
export const isCLIPEmbedModelFieldInputTemplate =
|
||||||
|
buildTemplateTypeGuard<CLIPEmbedModelFieldInputTemplate>('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<typeof zCLIPLEmbedModelFieldValue>;
|
||||||
|
export type CLIPLEmbedModelFieldInputInstance = z.infer<typeof zCLIPLEmbedModelFieldInputInstance>;
|
||||||
|
export type CLIPLEmbedModelFieldInputTemplate = z.infer<typeof zCLIPLEmbedModelFieldInputTemplate>;
|
||||||
|
export const isCLIPLEmbedModelFieldInputInstance = buildInstanceTypeGuard(zCLIPLEmbedModelFieldInputInstance);
|
||||||
|
export const isCLIPLEmbedModelFieldInputTemplate =
|
||||||
|
buildTemplateTypeGuard<CLIPLEmbedModelFieldInputTemplate>('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<typeof zCLIPLEmbedModelFieldValue>;
|
||||||
|
export type CLIPGEmbedModelFieldInputInstance = z.infer<typeof zCLIPGEmbedModelFieldInputInstance>;
|
||||||
|
export type CLIPGEmbedModelFieldInputTemplate = z.infer<typeof zCLIPGEmbedModelFieldInputTemplate>;
|
||||||
|
export const isCLIPGEmbedModelFieldInputInstance = buildInstanceTypeGuard(zCLIPGEmbedModelFieldInputInstance);
|
||||||
|
export const isCLIPGEmbedModelFieldInputTemplate =
|
||||||
|
buildTemplateTypeGuard<CLIPGEmbedModelFieldInputTemplate>('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<typeof zCLIPLEmbedModelFieldValue>;
|
||||||
|
export type ControlLoRAModelFieldInputInstance = z.infer<typeof zControlLoRAModelFieldInputInstance>;
|
||||||
|
export type ControlLoRAModelFieldInputTemplate = z.infer<typeof zControlLoRAModelFieldInputTemplate>;
|
||||||
|
export const isControlLoRAModelFieldInputInstance = buildInstanceTypeGuard(zControlLoRAModelFieldInputInstance);
|
||||||
|
export const isControlLoRAModelFieldInputTemplate =
|
||||||
|
buildTemplateTypeGuard<ControlLoRAModelFieldInputTemplate>('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<typeof zSigLipModelFieldValue>;
|
||||||
|
export type SigLipModelFieldInputInstance = z.infer<typeof zSigLipModelFieldInputInstance>;
|
||||||
|
export type SigLipModelFieldInputTemplate = z.infer<typeof zSigLipModelFieldInputTemplate>;
|
||||||
|
export const isSigLipModelFieldInputInstance = buildInstanceTypeGuard(zSigLipModelFieldInputInstance);
|
||||||
|
export const isSigLipModelFieldInputTemplate =
|
||||||
|
buildTemplateTypeGuard<SigLipModelFieldInputTemplate>('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<typeof zFluxReduxModelFieldValue>;
|
||||||
|
export type FluxReduxModelFieldInputInstance = z.infer<typeof zFluxReduxModelFieldInputInstance>;
|
||||||
|
export type FluxReduxModelFieldInputTemplate = z.infer<typeof zFluxReduxModelFieldInputTemplate>;
|
||||||
|
export const isFluxReduxModelFieldInputInstance = buildInstanceTypeGuard(zFluxReduxModelFieldInputInstance);
|
||||||
|
export const isFluxReduxModelFieldInputTemplate =
|
||||||
|
buildTemplateTypeGuard<FluxReduxModelFieldInputTemplate>('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<typeof zImagen3ModelFieldValue>;
|
||||||
|
export type Imagen3ModelFieldInputInstance = z.infer<typeof zImagen3ModelFieldInputInstance>;
|
||||||
|
export type Imagen3ModelFieldInputTemplate = z.infer<typeof zImagen3ModelFieldInputTemplate>;
|
||||||
|
export const isImagen3ModelFieldInputInstance = buildInstanceTypeGuard(zImagen3ModelFieldInputInstance);
|
||||||
|
export const isImagen3ModelFieldInputTemplate =
|
||||||
|
buildTemplateTypeGuard<Imagen3ModelFieldInputTemplate>('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<typeof zImagen4ModelFieldValue>;
|
||||||
|
export type Imagen4ModelFieldInputInstance = z.infer<typeof zImagen4ModelFieldInputInstance>;
|
||||||
|
export type Imagen4ModelFieldInputTemplate = z.infer<typeof zImagen4ModelFieldInputTemplate>;
|
||||||
|
export const isImagen4ModelFieldInputInstance = buildInstanceTypeGuard(zImagen4ModelFieldInputInstance);
|
||||||
|
export const isImagen4ModelFieldInputTemplate =
|
||||||
|
buildTemplateTypeGuard<Imagen4ModelFieldInputTemplate>('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<typeof zFluxKontextModelFieldValue>;
|
||||||
|
export type FluxKontextModelFieldInputInstance = z.infer<typeof zFluxKontextModelFieldInputInstance>;
|
||||||
|
export type FluxKontextModelFieldInputTemplate = z.infer<typeof zFluxKontextModelFieldInputTemplate>;
|
||||||
|
export const isFluxKontextModelFieldInputInstance = buildInstanceTypeGuard(zFluxKontextModelFieldInputInstance);
|
||||||
|
export const isFluxKontextModelFieldInputTemplate =
|
||||||
|
buildTemplateTypeGuard<FluxKontextModelFieldInputTemplate>('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<typeof zChatGPT4oModelFieldValue>;
|
||||||
|
export type ChatGPT4oModelFieldInputInstance = z.infer<typeof zChatGPT4oModelFieldInputInstance>;
|
||||||
|
export type ChatGPT4oModelFieldInputTemplate = z.infer<typeof zChatGPT4oModelFieldInputTemplate>;
|
||||||
|
export const isChatGPT4oModelFieldInputInstance = buildInstanceTypeGuard(zChatGPT4oModelFieldInputInstance);
|
||||||
|
export const isChatGPT4oModelFieldInputTemplate =
|
||||||
|
buildTemplateTypeGuard<ChatGPT4oModelFieldInputTemplate>('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<typeof zVeo3ModelFieldValue>;
|
||||||
|
export type Veo3ModelFieldInputInstance = z.infer<typeof zVeo3ModelFieldInputInstance>;
|
||||||
|
export type Veo3ModelFieldInputTemplate = z.infer<typeof zVeo3ModelFieldInputTemplate>;
|
||||||
|
export const isVeo3ModelFieldInputInstance = buildInstanceTypeGuard(zVeo3ModelFieldInputInstance);
|
||||||
|
export const isVeo3ModelFieldInputTemplate = buildTemplateTypeGuard<Veo3ModelFieldInputTemplate>('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<typeof zRunwayModelFieldValue>;
|
||||||
|
export type RunwayModelFieldInputInstance = z.infer<typeof zRunwayModelFieldInputInstance>;
|
||||||
|
export type RunwayModelFieldInputTemplate = z.infer<typeof zRunwayModelFieldInputTemplate>;
|
||||||
|
export const isRunwayModelFieldInputInstance = buildInstanceTypeGuard(zRunwayModelFieldInputInstance);
|
||||||
|
export const isRunwayModelFieldInputTemplate =
|
||||||
|
buildTemplateTypeGuard<RunwayModelFieldInputTemplate>('RunwayModelField');
|
||||||
|
// #endregion
|
||||||
|
|
||||||
// #region SchedulerField
|
// #region SchedulerField
|
||||||
export const zSchedulerFieldValue = zSchedulerField.optional();
|
export const zSchedulerFieldValue = zSchedulerField.optional();
|
||||||
const zSchedulerFieldInputInstance = zFieldInputInstanceBase.extend({
|
const zSchedulerFieldInputInstance = zFieldInputInstanceBase.extend({
|
||||||
@@ -1261,6 +1931,31 @@ export const zStatefulFieldValue = z.union([
|
|||||||
zImageFieldCollectionValue,
|
zImageFieldCollectionValue,
|
||||||
zBoardFieldValue,
|
zBoardFieldValue,
|
||||||
zModelIdentifierFieldValue,
|
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,
|
zColorFieldValue,
|
||||||
zSchedulerFieldValue,
|
zSchedulerFieldValue,
|
||||||
zFloatGeneratorFieldValue,
|
zFloatGeneratorFieldValue,
|
||||||
@@ -1288,6 +1983,22 @@ const zStatefulFieldInputInstance = z.union([
|
|||||||
zImageFieldCollectionInputInstance,
|
zImageFieldCollectionInputInstance,
|
||||||
zBoardFieldInputInstance,
|
zBoardFieldInputInstance,
|
||||||
zModelIdentifierFieldInputInstance,
|
zModelIdentifierFieldInputInstance,
|
||||||
|
zMainModelFieldInputInstance,
|
||||||
|
zFluxMainModelFieldInputInstance,
|
||||||
|
zSD3MainModelFieldInputInstance,
|
||||||
|
zCogView4MainModelFieldInputInstance,
|
||||||
|
zSDXLMainModelFieldInputInstance,
|
||||||
|
zSDXLRefinerModelFieldInputInstance,
|
||||||
|
zVAEModelFieldInputInstance,
|
||||||
|
zLoRAModelFieldInputInstance,
|
||||||
|
zLLaVAModelFieldInputInstance,
|
||||||
|
zControlNetModelFieldInputInstance,
|
||||||
|
zIPAdapterModelFieldInputInstance,
|
||||||
|
zT2IAdapterModelFieldInputInstance,
|
||||||
|
zSpandrelImageToImageModelFieldInputInstance,
|
||||||
|
zT5EncoderModelFieldInputInstance,
|
||||||
|
zFluxVAEModelFieldInputInstance,
|
||||||
|
zCLIPEmbedModelFieldInputInstance,
|
||||||
zColorFieldInputInstance,
|
zColorFieldInputInstance,
|
||||||
zSchedulerFieldInputInstance,
|
zSchedulerFieldInputInstance,
|
||||||
zFloatGeneratorFieldInputInstance,
|
zFloatGeneratorFieldInputInstance,
|
||||||
@@ -1314,6 +2025,33 @@ const zStatefulFieldInputTemplate = z.union([
|
|||||||
zImageFieldCollectionInputTemplate,
|
zImageFieldCollectionInputTemplate,
|
||||||
zBoardFieldInputTemplate,
|
zBoardFieldInputTemplate,
|
||||||
zModelIdentifierFieldInputTemplate,
|
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,
|
zColorFieldInputTemplate,
|
||||||
zSchedulerFieldInputTemplate,
|
zSchedulerFieldInputTemplate,
|
||||||
zStatelessFieldInputTemplate,
|
zStatelessFieldInputTemplate,
|
||||||
@@ -1341,6 +2079,19 @@ const zStatefulFieldOutputTemplate = z.union([
|
|||||||
zImageFieldCollectionOutputTemplate,
|
zImageFieldCollectionOutputTemplate,
|
||||||
zBoardFieldOutputTemplate,
|
zBoardFieldOutputTemplate,
|
||||||
zModelIdentifierFieldOutputTemplate,
|
zModelIdentifierFieldOutputTemplate,
|
||||||
|
zMainModelFieldOutputTemplate,
|
||||||
|
zFluxMainModelFieldOutputTemplate,
|
||||||
|
zSD3MainModelFieldOutputTemplate,
|
||||||
|
zCogView4MainModelFieldOutputTemplate,
|
||||||
|
zSDXLMainModelFieldOutputTemplate,
|
||||||
|
zSDXLRefinerModelFieldOutputTemplate,
|
||||||
|
zVAEModelFieldOutputTemplate,
|
||||||
|
zLoRAModelFieldOutputTemplate,
|
||||||
|
zLLaVAModelFieldOutputTemplate,
|
||||||
|
zControlNetModelFieldOutputTemplate,
|
||||||
|
zIPAdapterModelFieldOutputTemplate,
|
||||||
|
zT2IAdapterModelFieldOutputTemplate,
|
||||||
|
zSpandrelImageToImageModelFieldOutputTemplate,
|
||||||
zColorFieldOutputTemplate,
|
zColorFieldOutputTemplate,
|
||||||
zSchedulerFieldOutputTemplate,
|
zSchedulerFieldOutputTemplate,
|
||||||
zFloatGeneratorFieldOutputTemplate,
|
zFloatGeneratorFieldOutputTemplate,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { selectRefImagesSlice } from 'features/controlLayers/store/refImagesSlic
|
|||||||
import { selectCanvasMetadata } from 'features/controlLayers/store/selectors';
|
import { selectCanvasMetadata } from 'features/controlLayers/store/selectors';
|
||||||
import { isChatGPT4oAspectRatioID, isChatGPT4oReferenceImageConfig } from 'features/controlLayers/store/types';
|
import { isChatGPT4oAspectRatioID, isChatGPT4oReferenceImageConfig } from 'features/controlLayers/store/types';
|
||||||
import { getGlobalReferenceImageWarnings } from 'features/controlLayers/store/validators';
|
import { getGlobalReferenceImageWarnings } from 'features/controlLayers/store/validators';
|
||||||
import { type ImageField, zImageField, zModelIdentifierField } from 'features/nodes/types/common';
|
import { type ImageField, zModelIdentifierField } from 'features/nodes/types/common';
|
||||||
import { Graph } from 'features/nodes/util/graph/generation/Graph';
|
import { Graph } from 'features/nodes/util/graph/generation/Graph';
|
||||||
import {
|
import {
|
||||||
getOriginalAndScaledSizesForOtherModes,
|
getOriginalAndScaledSizesForOtherModes,
|
||||||
@@ -49,7 +49,9 @@ export const buildChatGPT4oGraph = async (arg: GraphBuilderArg): Promise<GraphBu
|
|||||||
reference_images = [];
|
reference_images = [];
|
||||||
for (const entity of validRefImages) {
|
for (const entity of validRefImages) {
|
||||||
assert(entity.config.image, 'Image is required for reference image');
|
assert(entity.config.image, 'Image is required for reference image');
|
||||||
reference_images.push(zImageField.parse(entity.config.image.crop?.image ?? entity.config.image.original.image));
|
reference_images.push({
|
||||||
|
image_name: entity.config.image.crop?.image.image_name ?? entity.config.image.original.image.image_name,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -164,7 +164,7 @@ export const buildFLUXGraph = async (arg: GraphBuilderArg): Promise<GraphBuilder
|
|||||||
const kontextImagePrep = g.addNode({
|
const kontextImagePrep = g.addNode({
|
||||||
id: getPrefixedId('flux_kontext_image_prep'),
|
id: getPrefixedId('flux_kontext_image_prep'),
|
||||||
type: 'flux_kontext_image_prep',
|
type: 'flux_kontext_image_prep',
|
||||||
images: [zImageField.parse(config.image?.crop?.image ?? config.image?.original.image)],
|
images: [zImageField.parse(config.image)],
|
||||||
});
|
});
|
||||||
const kontextConditioning = g.addNode({
|
const kontextConditioning = g.addNode({
|
||||||
type: 'flux_kontext',
|
type: 'flux_kontext',
|
||||||
|
|||||||
@@ -60,7 +60,9 @@ export const buildFluxKontextGraph = (arg: GraphBuilderArg): GraphBuilderReturn
|
|||||||
model: zModelIdentifierField.parse(model),
|
model: zModelIdentifierField.parse(model),
|
||||||
aspect_ratio: aspectRatio.id,
|
aspect_ratio: aspectRatio.id,
|
||||||
prompt_upsampling: true,
|
prompt_upsampling: true,
|
||||||
input_image: zImageField.parse(firstImage.crop?.image ?? firstImage.original.image),
|
input_image: {
|
||||||
|
image_name: firstImage.crop?.image.image_name ?? firstImage.original.image.image_name,
|
||||||
|
},
|
||||||
...selectCanvasOutputFields(state),
|
...selectCanvasOutputFields(state),
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
@@ -68,9 +70,7 @@ export const buildFluxKontextGraph = (arg: GraphBuilderArg): GraphBuilderReturn
|
|||||||
const kontextConcatenator = g.addNode({
|
const kontextConcatenator = g.addNode({
|
||||||
id: getPrefixedId('flux_kontext_image_prep'),
|
id: getPrefixedId('flux_kontext_image_prep'),
|
||||||
type: 'flux_kontext_image_prep',
|
type: 'flux_kontext_image_prep',
|
||||||
images: validRefImages.map(({ config }) =>
|
images: validRefImages.map(({ config }) => zImageField.parse(config.image)),
|
||||||
zImageField.parse(config.image?.crop?.image ?? config.image?.original.image)
|
|
||||||
),
|
|
||||||
});
|
});
|
||||||
|
|
||||||
fluxKontextImage = g.addNode({
|
fluxKontextImage = g.addNode({
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { selectMainModelConfig } from 'features/controlLayers/store/paramsSlice'
|
|||||||
import { selectRefImagesSlice } from 'features/controlLayers/store/refImagesSlice';
|
import { selectRefImagesSlice } from 'features/controlLayers/store/refImagesSlice';
|
||||||
import { isGemini2_5ReferenceImageConfig } from 'features/controlLayers/store/types';
|
import { isGemini2_5ReferenceImageConfig } from 'features/controlLayers/store/types';
|
||||||
import { getGlobalReferenceImageWarnings } from 'features/controlLayers/store/validators';
|
import { getGlobalReferenceImageWarnings } from 'features/controlLayers/store/validators';
|
||||||
import { type ImageField, zImageField } from 'features/nodes/types/common';
|
import type { ImageField } from 'features/nodes/types/common';
|
||||||
import { Graph } from 'features/nodes/util/graph/generation/Graph';
|
import { Graph } from 'features/nodes/util/graph/generation/Graph';
|
||||||
import { selectCanvasOutputFields } from 'features/nodes/util/graph/graphBuilderUtils';
|
import { selectCanvasOutputFields } from 'features/nodes/util/graph/graphBuilderUtils';
|
||||||
import type { GraphBuilderArg, GraphBuilderReturn } from 'features/nodes/util/graph/types';
|
import type { GraphBuilderArg, GraphBuilderReturn } from 'features/nodes/util/graph/types';
|
||||||
@@ -44,7 +44,9 @@ export const buildGemini2_5Graph = (arg: GraphBuilderArg): GraphBuilderReturn =>
|
|||||||
reference_images = [];
|
reference_images = [];
|
||||||
for (const entity of validRefImages) {
|
for (const entity of validRefImages) {
|
||||||
assert(entity.config.image, 'Image is required for reference image');
|
assert(entity.config.image, 'Image is required for reference image');
|
||||||
reference_images.push(zImageField.parse(entity.config.image.crop?.image ?? entity.config.image.original.image));
|
reference_images.push({
|
||||||
|
image_name: entity.config.image.crop?.image.image_name ?? entity.config.image.original.image.image_name,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,9 +9,36 @@ const FIELD_VALUE_FALLBACK_MAP: Record<StatefulFieldType['name'], FieldValue> =
|
|||||||
FloatField: 0,
|
FloatField: 0,
|
||||||
ImageField: undefined,
|
ImageField: undefined,
|
||||||
IntegerField: 0,
|
IntegerField: 0,
|
||||||
|
IPAdapterModelField: undefined,
|
||||||
|
LoRAModelField: undefined,
|
||||||
|
LLaVAModelField: undefined,
|
||||||
ModelIdentifierField: undefined,
|
ModelIdentifierField: undefined,
|
||||||
|
MainModelField: undefined,
|
||||||
SchedulerField: 'dpmpp_3m_k',
|
SchedulerField: 'dpmpp_3m_k',
|
||||||
|
SDXLMainModelField: undefined,
|
||||||
|
FluxMainModelField: undefined,
|
||||||
|
SD3MainModelField: undefined,
|
||||||
|
CogView4MainModelField: undefined,
|
||||||
|
SDXLRefinerModelField: undefined,
|
||||||
StringField: '',
|
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,
|
FloatGeneratorField: undefined,
|
||||||
IntegerGeneratorField: undefined,
|
IntegerGeneratorField: undefined,
|
||||||
StringGeneratorField: undefined,
|
StringGeneratorField: undefined,
|
||||||
|
|||||||
@@ -3,26 +3,53 @@ import { FieldParseError } from 'features/nodes/types/error';
|
|||||||
import type {
|
import type {
|
||||||
BoardFieldInputTemplate,
|
BoardFieldInputTemplate,
|
||||||
BooleanFieldInputTemplate,
|
BooleanFieldInputTemplate,
|
||||||
|
ChatGPT4oModelFieldInputTemplate,
|
||||||
|
CLIPEmbedModelFieldInputTemplate,
|
||||||
|
CLIPGEmbedModelFieldInputTemplate,
|
||||||
|
CLIPLEmbedModelFieldInputTemplate,
|
||||||
|
CogView4MainModelFieldInputTemplate,
|
||||||
ColorFieldInputTemplate,
|
ColorFieldInputTemplate,
|
||||||
|
ControlLoRAModelFieldInputTemplate,
|
||||||
|
ControlNetModelFieldInputTemplate,
|
||||||
EnumFieldInputTemplate,
|
EnumFieldInputTemplate,
|
||||||
FieldInputTemplate,
|
FieldInputTemplate,
|
||||||
FieldType,
|
FieldType,
|
||||||
FloatFieldCollectionInputTemplate,
|
FloatFieldCollectionInputTemplate,
|
||||||
FloatFieldInputTemplate,
|
FloatFieldInputTemplate,
|
||||||
FloatGeneratorFieldInputTemplate,
|
FloatGeneratorFieldInputTemplate,
|
||||||
|
FluxKontextModelFieldInputTemplate,
|
||||||
|
FluxMainModelFieldInputTemplate,
|
||||||
|
FluxReduxModelFieldInputTemplate,
|
||||||
|
FluxVAEModelFieldInputTemplate,
|
||||||
ImageFieldCollectionInputTemplate,
|
ImageFieldCollectionInputTemplate,
|
||||||
ImageFieldInputTemplate,
|
ImageFieldInputTemplate,
|
||||||
ImageGeneratorFieldInputTemplate,
|
ImageGeneratorFieldInputTemplate,
|
||||||
|
Imagen3ModelFieldInputTemplate,
|
||||||
|
Imagen4ModelFieldInputTemplate,
|
||||||
IntegerFieldCollectionInputTemplate,
|
IntegerFieldCollectionInputTemplate,
|
||||||
IntegerFieldInputTemplate,
|
IntegerFieldInputTemplate,
|
||||||
IntegerGeneratorFieldInputTemplate,
|
IntegerGeneratorFieldInputTemplate,
|
||||||
|
IPAdapterModelFieldInputTemplate,
|
||||||
|
LLaVAModelFieldInputTemplate,
|
||||||
|
LoRAModelFieldInputTemplate,
|
||||||
|
MainModelFieldInputTemplate,
|
||||||
ModelIdentifierFieldInputTemplate,
|
ModelIdentifierFieldInputTemplate,
|
||||||
|
RunwayModelFieldInputTemplate,
|
||||||
SchedulerFieldInputTemplate,
|
SchedulerFieldInputTemplate,
|
||||||
|
SD3MainModelFieldInputTemplate,
|
||||||
|
SDXLMainModelFieldInputTemplate,
|
||||||
|
SDXLRefinerModelFieldInputTemplate,
|
||||||
|
SigLipModelFieldInputTemplate,
|
||||||
|
SpandrelImageToImageModelFieldInputTemplate,
|
||||||
StatefulFieldType,
|
StatefulFieldType,
|
||||||
StatelessFieldInputTemplate,
|
StatelessFieldInputTemplate,
|
||||||
StringFieldCollectionInputTemplate,
|
StringFieldCollectionInputTemplate,
|
||||||
StringFieldInputTemplate,
|
StringFieldInputTemplate,
|
||||||
StringGeneratorFieldInputTemplate,
|
StringGeneratorFieldInputTemplate,
|
||||||
|
T2IAdapterModelFieldInputTemplate,
|
||||||
|
T5EncoderModelFieldInputTemplate,
|
||||||
|
VAEModelFieldInputTemplate,
|
||||||
|
Veo3ModelFieldInputTemplate,
|
||||||
} from 'features/nodes/types/field';
|
} from 'features/nodes/types/field';
|
||||||
import {
|
import {
|
||||||
getFloatGeneratorArithmeticSequenceDefaults,
|
getFloatGeneratorArithmeticSequenceDefaults,
|
||||||
@@ -275,6 +302,373 @@ const buildModelIdentifierFieldInputTemplate: FieldInputTemplateBuilder<ModelIde
|
|||||||
return template;
|
return template;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const buildMainModelFieldInputTemplate: FieldInputTemplateBuilder<MainModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: MainModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildSDXLMainModelFieldInputTemplate: FieldInputTemplateBuilder<SDXLMainModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: SDXLMainModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildFluxMainModelFieldInputTemplate: FieldInputTemplateBuilder<FluxMainModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: FluxMainModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildSD3MainModelFieldInputTemplate: FieldInputTemplateBuilder<SD3MainModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: SD3MainModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildCogView4MainModelFieldInputTemplate: FieldInputTemplateBuilder<CogView4MainModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: CogView4MainModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildRefinerModelFieldInputTemplate: FieldInputTemplateBuilder<SDXLRefinerModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: SDXLRefinerModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildVAEModelFieldInputTemplate: FieldInputTemplateBuilder<VAEModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: VAEModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildT5EncoderModelFieldInputTemplate: FieldInputTemplateBuilder<T5EncoderModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: T5EncoderModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildCLIPEmbedModelFieldInputTemplate: FieldInputTemplateBuilder<CLIPEmbedModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: CLIPEmbedModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildCLIPLEmbedModelFieldInputTemplate: FieldInputTemplateBuilder<CLIPLEmbedModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: CLIPLEmbedModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildCLIPGEmbedModelFieldInputTemplate: FieldInputTemplateBuilder<CLIPGEmbedModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: CLIPGEmbedModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildControlLoRAModelFieldInputTemplate: FieldInputTemplateBuilder<ControlLoRAModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: ControlLoRAModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildLLaVAModelFieldInputTemplate: FieldInputTemplateBuilder<LLaVAModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: LLaVAModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildFluxVAEModelFieldInputTemplate: FieldInputTemplateBuilder<FluxVAEModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: FluxVAEModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildLoRAModelFieldInputTemplate: FieldInputTemplateBuilder<LoRAModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: LoRAModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildControlNetModelFieldInputTemplate: FieldInputTemplateBuilder<ControlNetModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: ControlNetModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildIPAdapterModelFieldInputTemplate: FieldInputTemplateBuilder<IPAdapterModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: IPAdapterModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildT2IAdapterModelFieldInputTemplate: FieldInputTemplateBuilder<T2IAdapterModelFieldInputTemplate> = ({
|
||||||
|
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<SigLipModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: SigLipModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildFluxReduxModelFieldInputTemplate: FieldInputTemplateBuilder<FluxReduxModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: FluxReduxModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildImagen3ModelFieldInputTemplate: FieldInputTemplateBuilder<Imagen3ModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: Imagen3ModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildImagen4ModelFieldInputTemplate: FieldInputTemplateBuilder<Imagen4ModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: Imagen4ModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildFluxKontextModelFieldInputTemplate: FieldInputTemplateBuilder<FluxKontextModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: FluxKontextModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildVeo3ModelFieldInputTemplate: FieldInputTemplateBuilder<Veo3ModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: Veo3ModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildRunwayModelFieldInputTemplate: FieldInputTemplateBuilder<RunwayModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: RunwayModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
|
const buildChatGPT4oModelFieldInputTemplate: FieldInputTemplateBuilder<ChatGPT4oModelFieldInputTemplate> = ({
|
||||||
|
schemaObject,
|
||||||
|
baseField,
|
||||||
|
fieldType,
|
||||||
|
}) => {
|
||||||
|
const template: ChatGPT4oModelFieldInputTemplate = {
|
||||||
|
...baseField,
|
||||||
|
type: fieldType,
|
||||||
|
default: schemaObject.default ?? undefined,
|
||||||
|
};
|
||||||
|
return template;
|
||||||
|
};
|
||||||
|
|
||||||
const buildBoardFieldInputTemplate: FieldInputTemplateBuilder<BoardFieldInputTemplate> = ({
|
const buildBoardFieldInputTemplate: FieldInputTemplateBuilder<BoardFieldInputTemplate> = ({
|
||||||
schemaObject,
|
schemaObject,
|
||||||
baseField,
|
baseField,
|
||||||
@@ -449,41 +843,56 @@ const buildImageGeneratorFieldInputTemplate: FieldInputTemplateBuilder<ImageGene
|
|||||||
return template;
|
return template;
|
||||||
};
|
};
|
||||||
|
|
||||||
const TEMPLATE_BUILDER_MAP: Record<StatefulFieldType['name'], FieldInputTemplateBuilder> = {
|
export const TEMPLATE_BUILDER_MAP: Record<StatefulFieldType['name'], FieldInputTemplateBuilder> = {
|
||||||
BoardField: buildBoardFieldInputTemplate,
|
BoardField: buildBoardFieldInputTemplate,
|
||||||
BooleanField: buildBooleanFieldInputTemplate,
|
BooleanField: buildBooleanFieldInputTemplate,
|
||||||
ColorField: buildColorFieldInputTemplate,
|
ColorField: buildColorFieldInputTemplate,
|
||||||
|
ControlNetModelField: buildControlNetModelFieldInputTemplate,
|
||||||
EnumField: buildEnumFieldInputTemplate,
|
EnumField: buildEnumFieldInputTemplate,
|
||||||
FloatField: buildFloatFieldInputTemplate,
|
FloatField: buildFloatFieldInputTemplate,
|
||||||
ImageField: buildImageFieldInputTemplate,
|
ImageField: buildImageFieldInputTemplate,
|
||||||
IntegerField: buildIntegerFieldInputTemplate,
|
IntegerField: buildIntegerFieldInputTemplate,
|
||||||
|
IPAdapterModelField: buildIPAdapterModelFieldInputTemplate,
|
||||||
|
LoRAModelField: buildLoRAModelFieldInputTemplate,
|
||||||
|
LLaVAModelField: buildLLaVAModelFieldInputTemplate,
|
||||||
ModelIdentifierField: buildModelIdentifierFieldInputTemplate,
|
ModelIdentifierField: buildModelIdentifierFieldInputTemplate,
|
||||||
|
MainModelField: buildMainModelFieldInputTemplate,
|
||||||
SchedulerField: buildSchedulerFieldInputTemplate,
|
SchedulerField: buildSchedulerFieldInputTemplate,
|
||||||
|
SDXLMainModelField: buildSDXLMainModelFieldInputTemplate,
|
||||||
|
SD3MainModelField: buildSD3MainModelFieldInputTemplate,
|
||||||
|
CogView4MainModelField: buildCogView4MainModelFieldInputTemplate,
|
||||||
|
FluxMainModelField: buildFluxMainModelFieldInputTemplate,
|
||||||
|
SDXLRefinerModelField: buildRefinerModelFieldInputTemplate,
|
||||||
StringField: buildStringFieldInputTemplate,
|
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,
|
FloatGeneratorField: buildFloatGeneratorFieldInputTemplate,
|
||||||
IntegerGeneratorField: buildIntegerGeneratorFieldInputTemplate,
|
IntegerGeneratorField: buildIntegerGeneratorFieldInputTemplate,
|
||||||
StringGeneratorField: buildStringGeneratorFieldInputTemplate,
|
StringGeneratorField: buildStringGeneratorFieldInputTemplate,
|
||||||
ImageGeneratorField: buildImageGeneratorFieldInputTemplate,
|
ImageGeneratorField: buildImageGeneratorFieldInputTemplate,
|
||||||
};
|
} as const;
|
||||||
|
|
||||||
export const buildFieldInputTemplate = (
|
export const buildFieldInputTemplate = (
|
||||||
fieldSchema: InvocationFieldSchema,
|
fieldSchema: InvocationFieldSchema,
|
||||||
fieldName: string,
|
fieldName: string,
|
||||||
fieldType: FieldType
|
fieldType: FieldType
|
||||||
): FieldInputTemplate => {
|
): FieldInputTemplate => {
|
||||||
const {
|
const { input, ui_hidden, ui_component, ui_type, ui_order, ui_choice_labels, orig_required: required } = fieldSchema;
|
||||||
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
|
// This is the base field template that is common to all fields. The builder function will add all other
|
||||||
// properties to this template.
|
// properties to this template.
|
||||||
@@ -499,10 +908,6 @@ export const buildFieldInputTemplate = (
|
|||||||
ui_type,
|
ui_type,
|
||||||
ui_order,
|
ui_order,
|
||||||
ui_choice_labels,
|
ui_choice_labels,
|
||||||
ui_model_base,
|
|
||||||
ui_model_type,
|
|
||||||
ui_model_variant,
|
|
||||||
ui_model_format,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if (isStatefulFieldType(fieldType)) {
|
if (isStatefulFieldType(fieldType)) {
|
||||||
|
|||||||
@@ -12,25 +12,34 @@ import {
|
|||||||
isChatGPT4oModelConfig,
|
isChatGPT4oModelConfig,
|
||||||
isCLIPEmbedModelConfig,
|
isCLIPEmbedModelConfig,
|
||||||
isCLIPVisionModelConfig,
|
isCLIPVisionModelConfig,
|
||||||
|
isCogView4MainModelModelConfig,
|
||||||
isControlLayerModelConfig,
|
isControlLayerModelConfig,
|
||||||
isControlLoRAModelConfig,
|
isControlLoRAModelConfig,
|
||||||
isControlNetModelConfig,
|
isControlNetModelConfig,
|
||||||
isFluxKontextApiModelConfig,
|
isFluxKontextApiModelConfig,
|
||||||
isFluxKontextModelConfig,
|
isFluxKontextModelConfig,
|
||||||
|
isFluxMainModelModelConfig,
|
||||||
isFluxReduxModelConfig,
|
isFluxReduxModelConfig,
|
||||||
isFluxVAEModelConfig,
|
isFluxVAEModelConfig,
|
||||||
isGemini2_5ModelConfig,
|
isGemini2_5ModelConfig,
|
||||||
|
isImagen3ModelConfig,
|
||||||
|
isImagen4ModelConfig,
|
||||||
isIPAdapterModelConfig,
|
isIPAdapterModelConfig,
|
||||||
isLLaVAModelConfig,
|
isLLaVAModelConfig,
|
||||||
isLoRAModelConfig,
|
isLoRAModelConfig,
|
||||||
isNonRefinerMainModelConfig,
|
isNonRefinerMainModelConfig,
|
||||||
|
isNonSDXLMainModelConfig,
|
||||||
isRefinerMainModelModelConfig,
|
isRefinerMainModelModelConfig,
|
||||||
|
isRunwayModelConfig,
|
||||||
|
isSD3MainModelModelConfig,
|
||||||
|
isSDXLMainModelModelConfig,
|
||||||
isSigLipModelConfig,
|
isSigLipModelConfig,
|
||||||
isSpandrelImageToImageModelConfig,
|
isSpandrelImageToImageModelConfig,
|
||||||
isT2IAdapterModelConfig,
|
isT2IAdapterModelConfig,
|
||||||
isT5EncoderModelConfig,
|
isT5EncoderModelConfig,
|
||||||
isTIModelConfig,
|
isTIModelConfig,
|
||||||
isVAEModelConfig,
|
isVAEModelConfig,
|
||||||
|
isVeo3ModelConfig,
|
||||||
isVideoModelConfig,
|
isVideoModelConfig,
|
||||||
} from 'services/api/types';
|
} from 'services/api/types';
|
||||||
|
|
||||||
@@ -57,7 +66,12 @@ const buildModelsHook =
|
|||||||
return [modelConfigs, result] as const;
|
return [modelConfigs, result] as const;
|
||||||
};
|
};
|
||||||
export const useMainModels = buildModelsHook(isNonRefinerMainModelConfig);
|
export const useMainModels = buildModelsHook(isNonRefinerMainModelConfig);
|
||||||
|
export const useNonSDXLMainModels = buildModelsHook(isNonSDXLMainModelConfig);
|
||||||
export const useRefinerModels = buildModelsHook(isRefinerMainModelModelConfig);
|
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 useLoRAModels = buildModelsHook(isLoRAModelConfig);
|
||||||
export const useControlLoRAModel = buildModelsHook(isControlLoRAModelConfig);
|
export const useControlLoRAModel = buildModelsHook(isControlLoRAModelConfig);
|
||||||
export const useControlLayerModels = buildModelsHook(isControlLayerModelConfig);
|
export const useControlLayerModels = buildModelsHook(isControlLayerModelConfig);
|
||||||
@@ -89,6 +103,12 @@ export const useRegionalReferenceImageModels = buildModelsHook(
|
|||||||
(config) => isIPAdapterModelConfig(config) || isFluxReduxModelConfig(config)
|
(config) => isIPAdapterModelConfig(config) || isFluxReduxModelConfig(config)
|
||||||
);
|
);
|
||||||
export const useLLaVAModels = buildModelsHook(isLLaVAModelConfig);
|
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);
|
export const useVideoModels = buildModelsHook(isVideoModelConfig);
|
||||||
|
|
||||||
const buildModelsSelector =
|
const buildModelsSelector =
|
||||||
|
|||||||
@@ -5580,7 +5580,7 @@ export type components = {
|
|||||||
repo_variant?: components["schemas"]["ModelRepoVariant"] | null;
|
repo_variant?: components["schemas"]["ModelRepoVariant"] | null;
|
||||||
};
|
};
|
||||||
/**
|
/**
|
||||||
* ControlNet - SD1.5, SD2, SDXL
|
* ControlNet - SD1.5, SDXL
|
||||||
* @description Collects ControlNet info to pass to other nodes
|
* @description Collects ControlNet info to pass to other nodes
|
||||||
*/
|
*/
|
||||||
ControlNetInvocation: {
|
ControlNetInvocation: {
|
||||||
@@ -11805,26 +11805,6 @@ export type components = {
|
|||||||
ui_choice_labels: {
|
ui_choice_labels: {
|
||||||
[key: string]: string;
|
[key: string]: string;
|
||||||
} | null;
|
} | 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
|
* InstallStatus
|
||||||
@@ -15183,7 +15163,7 @@ export type components = {
|
|||||||
guidance?: number | null;
|
guidance?: number | null;
|
||||||
};
|
};
|
||||||
/**
|
/**
|
||||||
* Main Model - SD1.5, SD2
|
* Main Model - SD1.5
|
||||||
* @description Loads a main model, outputting its submodels.
|
* @description Loads a main model, outputting its submodels.
|
||||||
*/
|
*/
|
||||||
MainModelLoaderInvocation: {
|
MainModelLoaderInvocation: {
|
||||||
@@ -17739,18 +17719,11 @@ export type components = {
|
|||||||
*/
|
*/
|
||||||
OutputFieldJSONSchemaExtra: {
|
OutputFieldJSONSchemaExtra: {
|
||||||
field_kind: components["schemas"]["FieldKind"];
|
field_kind: components["schemas"]["FieldKind"];
|
||||||
/**
|
/** Ui Hidden */
|
||||||
* Ui Hidden
|
|
||||||
* @default false
|
|
||||||
*/
|
|
||||||
ui_hidden: boolean;
|
ui_hidden: boolean;
|
||||||
/**
|
|
||||||
* Ui Order
|
|
||||||
* @default null
|
|
||||||
*/
|
|
||||||
ui_order: number | null;
|
|
||||||
/** @default null */
|
|
||||||
ui_type: components["schemas"]["UIType"] | null;
|
ui_type: components["schemas"]["UIType"] | null;
|
||||||
|
/** Ui Order */
|
||||||
|
ui_order: number | null;
|
||||||
};
|
};
|
||||||
/** PaginatedResults[WorkflowRecordListItemWithThumbnailDTO] */
|
/** PaginatedResults[WorkflowRecordListItemWithThumbnailDTO] */
|
||||||
PaginatedResults_WorkflowRecordListItemWithThumbnailDTO_: {
|
PaginatedResults_WorkflowRecordListItemWithThumbnailDTO_: {
|
||||||
@@ -21857,7 +21830,7 @@ export type components = {
|
|||||||
* used, and the type will be ignored. They are included here for backwards compatibility.
|
* used, and the type will be ignored. They are included here for backwards compatibility.
|
||||||
* @enum {string}
|
* @enum {string}
|
||||||
*/
|
*/
|
||||||
UIType: "SchedulerField" | "AnyField" | "CollectionField" | "CollectionItemField" | "IsIntermediate" | "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_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";
|
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";
|
||||||
/** UNetField */
|
/** UNetField */
|
||||||
UNetField: {
|
UNetField: {
|
||||||
/** @description Info to load unet submodel */
|
/** @description Info to load unet submodel */
|
||||||
@@ -22203,7 +22176,7 @@ export type components = {
|
|||||||
seamless_axes?: string[];
|
seamless_axes?: string[];
|
||||||
};
|
};
|
||||||
/**
|
/**
|
||||||
* VAE Model - SD1.5, SD2, SDXL, SD3, FLUX
|
* VAE Model - SD1.5, SDXL, SD3, FLUX
|
||||||
* @description Loads a VAE model, outputting a VaeLoaderOutput
|
* @description Loads a VAE model, outputting a VaeLoaderOutput
|
||||||
*/
|
*/
|
||||||
VAELoaderInvocation: {
|
VAELoaderInvocation: {
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ export type T2IAdapterModelConfig = S['T2IAdapterConfig'];
|
|||||||
export type CLIPLEmbedModelConfig = S['CLIPLEmbedDiffusersConfig'];
|
export type CLIPLEmbedModelConfig = S['CLIPLEmbedDiffusersConfig'];
|
||||||
export type CLIPGEmbedModelConfig = S['CLIPGEmbedDiffusersConfig'];
|
export type CLIPGEmbedModelConfig = S['CLIPGEmbedDiffusersConfig'];
|
||||||
export type CLIPEmbedModelConfig = CLIPLEmbedModelConfig | CLIPGEmbedModelConfig;
|
export type CLIPEmbedModelConfig = CLIPLEmbedModelConfig | CLIPGEmbedModelConfig;
|
||||||
type LlavaOnevisionConfig = S['LlavaOnevisionConfig'];
|
export type LlavaOnevisionConfig = S['LlavaOnevisionConfig'];
|
||||||
export type T5EncoderModelConfig = S['T5EncoderConfig'];
|
export type T5EncoderModelConfig = S['T5EncoderConfig'];
|
||||||
export type T5EncoderBnbQuantizedLlmInt8bModelConfig = S['T5EncoderBnbQuantizedLlmInt8bConfig'];
|
export type T5EncoderBnbQuantizedLlmInt8bModelConfig = S['T5EncoderBnbQuantizedLlmInt8bConfig'];
|
||||||
export type SpandrelImageToImageModelConfig = S['SpandrelImageToImageConfig'];
|
export type SpandrelImageToImageModelConfig = S['SpandrelImageToImageConfig'];
|
||||||
@@ -130,14 +130,16 @@ type TextualInversionModelConfig = S['TextualInversionFileConfig'] | S['TextualI
|
|||||||
type DiffusersModelConfig = S['MainDiffusersConfig'];
|
type DiffusersModelConfig = S['MainDiffusersConfig'];
|
||||||
export type CheckpointModelConfig = S['MainCheckpointConfig'];
|
export type CheckpointModelConfig = S['MainCheckpointConfig'];
|
||||||
type CLIPVisionDiffusersConfig = S['CLIPVisionDiffusersConfig'];
|
type CLIPVisionDiffusersConfig = S['CLIPVisionDiffusersConfig'];
|
||||||
type SigLipModelConfig = S['SigLIPConfig'];
|
export type SigLipModelConfig = S['SigLIPConfig'];
|
||||||
export type FLUXReduxModelConfig = S['FluxReduxConfig'];
|
export type FLUXReduxModelConfig = S['FluxReduxConfig'];
|
||||||
type ApiModelConfig = S['ApiModelConfig'];
|
export type ApiModelConfig = S['ApiModelConfig'];
|
||||||
export type VideoApiModelConfig = S['VideoApiModelConfig'];
|
export type VideoApiModelConfig = S['VideoApiModelConfig'];
|
||||||
export type MainModelConfig = DiffusersModelConfig | CheckpointModelConfig | ApiModelConfig;
|
export type MainModelConfig = DiffusersModelConfig | CheckpointModelConfig | ApiModelConfig;
|
||||||
export type FLUXKontextModelConfig = MainModelConfig;
|
export type FLUXKontextModelConfig = MainModelConfig;
|
||||||
export type ChatGPT4oModelConfig = ApiModelConfig;
|
export type ChatGPT4oModelConfig = ApiModelConfig;
|
||||||
export type Gemini2_5ModelConfig = ApiModelConfig;
|
export type Gemini2_5ModelConfig = ApiModelConfig;
|
||||||
|
type Veo3ModelConfig = VideoApiModelConfig;
|
||||||
|
type RunwayModelConfig = VideoApiModelConfig;
|
||||||
export type AnyModelConfig =
|
export type AnyModelConfig =
|
||||||
| ControlLoRAModelConfig
|
| ControlLoRAModelConfig
|
||||||
| LoRAModelConfig
|
| LoRAModelConfig
|
||||||
@@ -308,6 +310,22 @@ export const isVideoModelConfig = (config: AnyModelConfig): config is VideoApiMo
|
|||||||
return config.type === 'video';
|
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 => {
|
export const isFluxKontextApiModelConfig = (config: AnyModelConfig): config is ApiModelConfig => {
|
||||||
return config.type === 'main' && config.base === 'flux-kontext';
|
return config.type === 'main' && config.base === 'flux-kontext';
|
||||||
};
|
};
|
||||||
@@ -332,10 +350,30 @@ export const isRefinerMainModelModelConfig = (config: AnyModelConfig): config is
|
|||||||
return config.type === 'main' && config.base === 'sdxl-refiner';
|
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 => {
|
export const isFluxFillMainModelModelConfig = (config: AnyModelConfig): config is MainModelConfig => {
|
||||||
return config.type === 'main' && config.base === 'flux' && config.variant === 'inpaint';
|
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 => {
|
export const isTIModelConfig = (config: AnyModelConfig): config is MainModelConfig => {
|
||||||
return config.type === 'embedding';
|
return config.type === 'embedding';
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user