mirror of
https://github.com/invoke-ai/InvokeAI.git
synced 2026-04-23 03:00:31 -04:00
updates
This commit is contained in:
131
invokeai/app/invocations/adapters-linked.py
Normal file
131
invokeai/app/invocations/adapters-linked.py
Normal file
@@ -0,0 +1,131 @@
|
||||
from typing import List, Optional, Union
|
||||
|
||||
from invokeai.app.invocations.baseinvocation import (
|
||||
BaseInvocationOutput,
|
||||
Input,
|
||||
InputField,
|
||||
InvocationContext,
|
||||
OutputField,
|
||||
invocation,
|
||||
invocation_output,
|
||||
)
|
||||
from invokeai.app.invocations.controlnet_image_processors import ControlField, ControlNetInvocation
|
||||
from invokeai.app.invocations.ip_adapter import IPAdapterField, IPAdapterInvocation
|
||||
from invokeai.app.invocations.t2i_adapter import T2IAdapterField, T2IAdapterInvocation
|
||||
from invokeai.app.shared.fields import FieldDescriptions
|
||||
|
||||
|
||||
def append_list(new_item, items, item_cls):
|
||||
"""Add an item to an exiting item or list of items then output as a list of items."""
|
||||
|
||||
result = []
|
||||
if items is None or len(items) == 0 or (isinstance(items, list) and len(items) == 0):
|
||||
pass
|
||||
elif isinstance(items, item_cls):
|
||||
result.append(items)
|
||||
elif isinstance(items, list) and all(isinstance(i, item_cls) for i in items):
|
||||
result.extend(items)
|
||||
else:
|
||||
raise ValueError(f"Invalid adapter list format: {items}")
|
||||
|
||||
result.append(new_item)
|
||||
return result
|
||||
|
||||
|
||||
@invocation_output("control_list_output")
|
||||
class ControlListOutput(BaseInvocationOutput):
|
||||
# Outputs
|
||||
control_list: list[ControlField] = OutputField(description=FieldDescriptions.control)
|
||||
|
||||
|
||||
@invocation(
|
||||
"controlnet-linked",
|
||||
title="ControlNet-Linked",
|
||||
tags=["controlnet"],
|
||||
category="controlnet",
|
||||
version="1.1.0",
|
||||
)
|
||||
class ControlNetLinkedInvocation(ControlNetInvocation):
|
||||
"""Collects ControlNet info to pass to other nodes."""
|
||||
|
||||
control_list: Optional[Union[ControlField, list[ControlField]]] = InputField(
|
||||
default=None,
|
||||
title="ControlNet-List",
|
||||
input=Input.Connection,
|
||||
ui_order=0,
|
||||
)
|
||||
|
||||
def invoke(self, context: InvocationContext) -> ControlListOutput:
|
||||
# Call parent
|
||||
output = super().invoke(context).control
|
||||
# Append the control output to the input list
|
||||
control_list = append_list(output, self.control_list, ControlField)
|
||||
return ControlListOutput(control_list=control_list)
|
||||
|
||||
|
||||
@invocation_output("ip_adapter_list_output")
|
||||
class IPAdapterListOutput(BaseInvocationOutput):
|
||||
# Outputs
|
||||
ip_adapter_list: list[IPAdapterField] = OutputField(
|
||||
description=FieldDescriptions.ip_adapter, title="IP-Adapter-List"
|
||||
)
|
||||
|
||||
|
||||
@invocation(
|
||||
"ip_adapter_linked",
|
||||
title="IP-Adapter-Linked",
|
||||
tags=["ip_adapter", "control"],
|
||||
category="ip_adapter",
|
||||
version="1.1.0",
|
||||
)
|
||||
class IPAdapterLinkedInvocation(IPAdapterInvocation):
|
||||
"""Collects IP-Adapter info to pass to other nodes."""
|
||||
|
||||
ip_adapter_list: Optional[Union[IPAdapterField, list[IPAdapterField]]] = InputField(
|
||||
description=FieldDescriptions.ip_adapter,
|
||||
title="IP-Adapter-List",
|
||||
default=None,
|
||||
input=Input.Connection,
|
||||
ui_order=0,
|
||||
)
|
||||
|
||||
def invoke(self, context: InvocationContext) -> IPAdapterListOutput:
|
||||
# Call parent
|
||||
output = super().invoke(context).ip_adapter
|
||||
# Append the control output to the input list
|
||||
result = append_list(output, self.ip_adapter_list, IPAdapterField)
|
||||
return IPAdapterListOutput(ip_adapter_list=result)
|
||||
|
||||
|
||||
@invocation_output("ip_adapters_output")
|
||||
class T2IAdapterListOutput(BaseInvocationOutput):
|
||||
# Outputs
|
||||
t2i_adapter_list: list[T2IAdapterField] = OutputField(
|
||||
description=FieldDescriptions.t2i_adapter, title="T2I Adapter-List"
|
||||
)
|
||||
|
||||
|
||||
@invocation(
|
||||
"t2i_adapter_linked",
|
||||
title="T2I-Adapter-Linked",
|
||||
tags=["t2i_adapter", "control"],
|
||||
category="t2i_adapter",
|
||||
version="1.0.0",
|
||||
)
|
||||
class T2IAdapterLinkedInvocation(T2IAdapterInvocation):
|
||||
"""Collects T2I-Adapter info to pass to other nodes."""
|
||||
|
||||
t2i_adapter_list: Optional[Union[T2IAdapterField, list[T2IAdapterField]]] = InputField(
|
||||
description=FieldDescriptions.ip_adapter,
|
||||
title="T2I-Adapter",
|
||||
default=None,
|
||||
input=Input.Connection,
|
||||
ui_order=0,
|
||||
)
|
||||
|
||||
def invoke(self, context: InvocationContext) -> T2IAdapterListOutput:
|
||||
# Call parent
|
||||
output = super().invoke(context).t2i_adapter
|
||||
# Append the control output to the input list
|
||||
t2i_adapter_list = append_list(output, self.t2i_adapter_list, T2IAdapterField)
|
||||
return T2IAdapterListOutput(t2i_adapter_list=t2i_adapter_list)
|
||||
@@ -91,7 +91,7 @@ def validate_custom_label(
|
||||
classification=Classification.Beta,
|
||||
)
|
||||
class MetadataItemLinkedInvocation(BaseInvocation, WithMetadata):
|
||||
"""Used to create a core metadata item then Add/Update it to the provided metadata"""
|
||||
"""Used to Create/Add/Update a value into a metadata label"""
|
||||
|
||||
label: CORE_LABELS = InputField(
|
||||
default=CUSTOM_LABEL,
|
||||
@@ -139,14 +139,14 @@ class MetadataFromImageInvocation(BaseInvocation):
|
||||
|
||||
@invocation(
|
||||
"metadata_to_string",
|
||||
title="Metadata Extract String",
|
||||
title="Metadata To String",
|
||||
tags=["metadata"],
|
||||
category="metadata",
|
||||
version="1.0.0",
|
||||
classification=Classification.Beta,
|
||||
)
|
||||
class MetadataToStringInvocation(BaseInvocation, WithMetadata):
|
||||
"""Extracts a string value a label from metadata"""
|
||||
"""Extracts a string value of a label from metadata"""
|
||||
|
||||
label: CORE_LABELS_STRING = InputField(
|
||||
default=CUSTOM_LABEL,
|
||||
Reference in New Issue
Block a user