Made id on static Outputs optional, still required on DynamicOutput

This commit is contained in:
kosinkadink1@gmail.com 2025-07-10 01:49:01 -05:00
parent fe2cadeaa0
commit 5423a4f262
4 changed files with 22 additions and 21 deletions

View File

@ -211,7 +211,7 @@ class WidgetInputV3(InputV3):
class OutputV3(IO_V3): 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): is_output_list=False):
self.id = id self.id = id
self.display_name = display_name self.display_name = display_name
@ -790,6 +790,10 @@ class DynamicOutput(OutputV3, ABC):
''' '''
Abstract class for dynamic output registration. 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 @abstractmethod
def get_dynamic(self) -> list[OutputV3]: def get_dynamic(self) -> list[OutputV3]:
... ...
@ -991,7 +995,7 @@ class SchemaV3:
raise ValueError("\n".join(issues)) raise ValueError("\n".join(issues))
def finalize(self): 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 is an api_node, will need key-related hidden
if self.is_api_node: if self.is_api_node:
if self.hidden is None: if self.hidden is None:
@ -1008,6 +1012,11 @@ class SchemaV3:
self.hidden.append(Hidden.prompt) self.hidden.append(Hidden.prompt)
if Hidden.extra_pnginfo not in self.hidden: if Hidden.extra_pnginfo not in self.hidden:
self.hidden.append(Hidden.extra_pnginfo) 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: class Serializer:

View File

@ -62,8 +62,8 @@ class V3TestNode(io.ComfyNodeV3):
# ]] # ]]
], ],
outputs=[ outputs=[
io.Int.Output("int_output"), io.Int.Output(),
io.Image.Output("img_output", display_name="img🖼", tooltip="This is an image"), io.Image.Output(display_name="img🖼", tooltip="This is an image"),
], ],
hidden=[ hidden=[
io.Hidden.prompt, io.Hidden.prompt,
@ -142,8 +142,8 @@ class V3LoraLoader(io.ComfyNodeV3):
), ),
], ],
outputs=[ outputs=[
io.Model.Output("model_out"), io.Model.Output(),
io.Clip.Output("clip_out"), 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), io.AutogrowDynamic.Input("nmock2", template_input=io.Int.Input("int"), optional=True, min=1, max=4),
], ],
outputs=[ outputs=[
io.Image.Output("image_out"), io.Image.Output(),
], ],
) )

View File

@ -87,7 +87,7 @@ class PreviewImage_V3(io.ComfyNodeV3):
@classmethod @classmethod
def execute(cls, images): 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): class LoadImage_V3(io.ComfyNodeV3):
@ -107,12 +107,8 @@ class LoadImage_V3(io.ComfyNodeV3):
), ),
], ],
outputs=[ outputs=[
io.Image.Output( io.Image.Output(),
"IMAGE", io.Mask.Output(),
),
io.Mask.Output(
"MASK",
),
], ],
) )
@ -207,12 +203,8 @@ class LoadImageOutput_V3(io.ComfyNodeV3):
), ),
], ],
outputs=[ outputs=[
io.Image.Output( io.Image.Output(),
"IMAGE", io.Mask.Output(),
),
io.Mask.Output(
"MASK",
),
], ],
) )

View File

@ -39,7 +39,7 @@ class WebcamCapture_V3(io.ComfyNodeV3):
io.Boolean.Input("capture_on_queue", default=True), io.Boolean.Input("capture_on_queue", default=True),
], ],
outputs=[ outputs=[
io.Image.Output("IMAGE"), io.Image.Output(),
], ],
) )