mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
feat(app): dynamic type adapters for invocations & outputs
Keep track of whether or not the typeadapter needs to be updated. Allows for dynamic invocation and output unions.
This commit is contained in:
parent
5beec8211a
commit
50d3030471
@ -98,11 +98,13 @@ class BaseInvocationOutput(BaseModel):
|
|||||||
|
|
||||||
_output_classes: ClassVar[set[BaseInvocationOutput]] = set()
|
_output_classes: ClassVar[set[BaseInvocationOutput]] = set()
|
||||||
_typeadapter: ClassVar[Optional[TypeAdapter[Any]]] = None
|
_typeadapter: ClassVar[Optional[TypeAdapter[Any]]] = None
|
||||||
|
_typeadapter_needs_update: ClassVar[bool] = False
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def register_output(cls, output: BaseInvocationOutput) -> None:
|
def register_output(cls, output: BaseInvocationOutput) -> None:
|
||||||
"""Registers an invocation output."""
|
"""Registers an invocation output."""
|
||||||
cls._output_classes.add(output)
|
cls._output_classes.add(output)
|
||||||
|
cls._typeadapter_needs_update = True
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_outputs(cls) -> Iterable[BaseInvocationOutput]:
|
def get_outputs(cls) -> Iterable[BaseInvocationOutput]:
|
||||||
@ -112,11 +114,12 @@ class BaseInvocationOutput(BaseModel):
|
|||||||
@classmethod
|
@classmethod
|
||||||
def get_typeadapter(cls) -> TypeAdapter[Any]:
|
def get_typeadapter(cls) -> TypeAdapter[Any]:
|
||||||
"""Gets a pydantc TypeAdapter for the union of all invocation output types."""
|
"""Gets a pydantc TypeAdapter for the union of all invocation output types."""
|
||||||
if not cls._typeadapter:
|
if not cls._typeadapter or cls._typeadapter_needs_update:
|
||||||
AnyInvocationOutput = TypeAliasType(
|
AnyInvocationOutput = TypeAliasType(
|
||||||
"AnyInvocationOutput", Annotated[Union[tuple(cls._output_classes)], Field(discriminator="type")]
|
"AnyInvocationOutput", Annotated[Union[tuple(cls._output_classes)], Field(discriminator="type")]
|
||||||
)
|
)
|
||||||
cls._typeadapter = TypeAdapter(AnyInvocationOutput)
|
cls._typeadapter = TypeAdapter(AnyInvocationOutput)
|
||||||
|
cls._typeadapter_needs_update = False
|
||||||
return cls._typeadapter
|
return cls._typeadapter
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -168,6 +171,7 @@ class BaseInvocation(ABC, BaseModel):
|
|||||||
|
|
||||||
_invocation_classes: ClassVar[set[BaseInvocation]] = set()
|
_invocation_classes: ClassVar[set[BaseInvocation]] = set()
|
||||||
_typeadapter: ClassVar[Optional[TypeAdapter[Any]]] = None
|
_typeadapter: ClassVar[Optional[TypeAdapter[Any]]] = None
|
||||||
|
_typeadapter_needs_update: ClassVar[bool] = False
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_type(cls) -> str:
|
def get_type(cls) -> str:
|
||||||
@ -178,15 +182,17 @@ class BaseInvocation(ABC, BaseModel):
|
|||||||
def register_invocation(cls, invocation: BaseInvocation) -> None:
|
def register_invocation(cls, invocation: BaseInvocation) -> None:
|
||||||
"""Registers an invocation."""
|
"""Registers an invocation."""
|
||||||
cls._invocation_classes.add(invocation)
|
cls._invocation_classes.add(invocation)
|
||||||
|
cls._typeadapter_needs_update = True
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_typeadapter(cls) -> TypeAdapter[Any]:
|
def get_typeadapter(cls) -> TypeAdapter[Any]:
|
||||||
"""Gets a pydantc TypeAdapter for the union of all invocation types."""
|
"""Gets a pydantc TypeAdapter for the union of all invocation types."""
|
||||||
if not cls._typeadapter:
|
if not cls._typeadapter or cls._typeadapter_needs_update:
|
||||||
AnyInvocation = TypeAliasType(
|
AnyInvocation = TypeAliasType(
|
||||||
"AnyInvocation", Annotated[Union[tuple(cls._invocation_classes)], Field(discriminator="type")]
|
"AnyInvocation", Annotated[Union[tuple(cls._invocation_classes)], Field(discriminator="type")]
|
||||||
)
|
)
|
||||||
cls._typeadapter = TypeAdapter(AnyInvocation)
|
cls._typeadapter = TypeAdapter(AnyInvocation)
|
||||||
|
cls._typeadapter_needs_update = False
|
||||||
return cls._typeadapter
|
return cls._typeadapter
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
Loading…
Reference in New Issue
Block a user