diff --git a/comfy_api/v3/io.py b/comfy_api/v3/io.py index e8cf8fea5..6351432ca 100644 --- a/comfy_api/v3/io.py +++ b/comfy_api/v3/io.py @@ -211,7 +211,7 @@ class WidgetInputV3(InputV3): class OutputV3(IO_V3): - def __init__(self, id: str, display_name: str=None, tooltip: str=None, + def __init__(self, id: str=None, display_name: str=None, tooltip: str=None, is_output_list=False): self.id = id self.display_name = display_name @@ -790,6 +790,10 @@ class DynamicOutput(OutputV3, ABC): ''' Abstract class for dynamic output registration. ''' + def __init__(self, id: str, display_name: str=None, tooltip: str=None, + is_output_list=False): + super().__init__(id, display_name, tooltip, is_output_list) + @abstractmethod def get_dynamic(self) -> list[OutputV3]: ... @@ -991,7 +995,7 @@ class SchemaV3: raise ValueError("\n".join(issues)) def finalize(self): - """Add hidden based on selected schema options.""" + """Add hidden based on selected schema options, and give outputs without ids default ids.""" # if is an api_node, will need key-related hidden if self.is_api_node: if self.hidden is None: @@ -1008,6 +1012,11 @@ class SchemaV3: self.hidden.append(Hidden.prompt) if Hidden.extra_pnginfo not in self.hidden: self.hidden.append(Hidden.extra_pnginfo) + # give outputs without ids default ids + if self.outputs is not None: + for i, output in enumerate(self.outputs): + if output.id is None: + output.id = f"_{i}_{output.io_type}_" class Serializer: diff --git a/comfy_extras/nodes_v3_test.py b/comfy_extras/nodes_v3_test.py index 55f179f2a..6f2d21895 100644 --- a/comfy_extras/nodes_v3_test.py +++ b/comfy_extras/nodes_v3_test.py @@ -62,8 +62,8 @@ class V3TestNode(io.ComfyNodeV3): # ]] ], outputs=[ - io.Int.Output("int_output"), - io.Image.Output("img_output", display_name="img🖼️", tooltip="This is an image"), + io.Int.Output(), + io.Image.Output(display_name="img🖼️", tooltip="This is an image"), ], hidden=[ io.Hidden.prompt, @@ -142,8 +142,8 @@ class V3LoraLoader(io.ComfyNodeV3): ), ], outputs=[ - io.Model.Output("model_out"), - io.Clip.Output("clip_out"), + io.Model.Output(), + io.Clip.Output(), ], ) @@ -169,7 +169,7 @@ class NInputsTest(io.ComfyNodeV3): io.AutogrowDynamic.Input("nmock2", template_input=io.Int.Input("int"), optional=True, min=1, max=4), ], outputs=[ - io.Image.Output("image_out"), + io.Image.Output(), ], ) diff --git a/comfy_extras/v3/nodes_images.py b/comfy_extras/v3/nodes_images.py index c13dadd22..105904581 100644 --- a/comfy_extras/v3/nodes_images.py +++ b/comfy_extras/v3/nodes_images.py @@ -87,7 +87,7 @@ class PreviewImage_V3(io.ComfyNodeV3): @classmethod def execute(cls, images): - return io.NodeOutput(ui=ui.PreviewImage(images)) + return io.NodeOutput(ui=ui.PreviewImage(images, cls=cls)) class LoadImage_V3(io.ComfyNodeV3): @@ -107,12 +107,8 @@ class LoadImage_V3(io.ComfyNodeV3): ), ], outputs=[ - io.Image.Output( - "IMAGE", - ), - io.Mask.Output( - "MASK", - ), + io.Image.Output(), + io.Mask.Output(), ], ) @@ -207,12 +203,8 @@ class LoadImageOutput_V3(io.ComfyNodeV3): ), ], outputs=[ - io.Image.Output( - "IMAGE", - ), - io.Mask.Output( - "MASK", - ), + io.Image.Output(), + io.Mask.Output(), ], ) diff --git a/comfy_extras/v3/nodes_webcam.py b/comfy_extras/v3/nodes_webcam.py index c63352803..3a4cf8da0 100644 --- a/comfy_extras/v3/nodes_webcam.py +++ b/comfy_extras/v3/nodes_webcam.py @@ -39,7 +39,7 @@ class WebcamCapture_V3(io.ComfyNodeV3): io.Boolean.Input("capture_on_queue", default=True), ], outputs=[ - io.Image.Output("IMAGE"), + io.Image.Output(), ], )