@@ -202,6 +202,7 @@ def as_dict_V1(self):
202202 return super ().as_dict_V1 () | prune_dict ({
203203 "default" : self .default ,
204204 "socketless" : self .socketless ,
205+ "widgetType" : self .widgetType ,
205206 "forceInput" : self .force_input ,
206207 })
207208
@@ -210,7 +211,7 @@ def get_io_type_V1(self):
210211
211212
212213class OutputV3 (IO_V3 ):
213- def __init__ (self , id : str , display_name : str = None , tooltip : str = None ,
214+ def __init__ (self , id : str = None , display_name : str = None , tooltip : str = None ,
214215 is_output_list = False ):
215216 self .id = id
216217 self .display_name = display_name
@@ -296,7 +297,7 @@ class Input(WidgetInputV3):
296297 def __init__ (self , id : str , display_name : str = None , optional = False , tooltip : str = None , lazy : bool = None ,
297298 default : bool = None , label_on : str = None , label_off : str = None ,
298299 socketless : bool = None , force_input : bool = None ):
299- super ().__init__ (id , display_name , optional , tooltip , lazy , default , socketless , self . io_type , force_input )
300+ super ().__init__ (id , display_name , optional , tooltip , lazy , default , socketless , None , force_input )
300301 self .label_on = label_on
301302 self .label_off = label_off
302303 self .default : bool
@@ -319,7 +320,7 @@ class Input(WidgetInputV3):
319320 def __init__ (self , id : str , display_name : str = None , optional = False , tooltip : str = None , lazy : bool = None ,
320321 default : int = None , min : int = None , max : int = None , step : int = None , control_after_generate : bool = None ,
321322 display_mode : NumberDisplay = None , socketless : bool = None , force_input : bool = None ):
322- super ().__init__ (id , display_name , optional , tooltip , lazy , default , socketless , self . io_type , force_input )
323+ super ().__init__ (id , display_name , optional , tooltip , lazy , default , socketless , None , force_input )
323324 self .min = min
324325 self .max = max
325326 self .step = step
@@ -348,7 +349,7 @@ class Input(WidgetInputV3):
348349 def __init__ (self , id : str , display_name : str = None , optional = False , tooltip : str = None , lazy : bool = None ,
349350 default : float = None , min : float = None , max : float = None , step : float = None , round : float = None ,
350351 display_mode : NumberDisplay = None , socketless : bool = None , force_input : bool = None ):
351- super ().__init__ (id , display_name , optional , tooltip , lazy , default , socketless , self . io_type , force_input )
352+ super ().__init__ (id , display_name , optional , tooltip , lazy , default , socketless , None , force_input )
352353 self .min = min
353354 self .max = max
354355 self .step = step
@@ -374,7 +375,7 @@ class Input(WidgetInputV3):
374375 def __init__ (self , id : str , display_name : str = None , optional = False , tooltip : str = None , lazy : bool = None ,
375376 multiline = False , placeholder : str = None , default : str = None ,
376377 socketless : bool = None , force_input : bool = None ):
377- super ().__init__ (id , display_name , optional , tooltip , lazy , default , socketless , self . io_type , force_input )
378+ super ().__init__ (id , display_name , optional , tooltip , lazy , default , socketless , None , force_input )
378379 self .multiline = multiline
379380 self .placeholder = placeholder
380381 self .default : str
@@ -396,7 +397,7 @@ def __init__(self, id: str, options: list[str]=None, display_name: str=None, opt
396397 image_upload : bool = None , image_folder : FolderType = None , content_types : list [Literal ["image" , "video" , "audio" , "model" ]]= None ,
397398 remote : RemoteOptions = None ,
398399 socketless : bool = None ):
399- super ().__init__ (id , display_name , optional , tooltip , lazy , default , socketless , self . io_type )
400+ super ().__init__ (id , display_name , optional , tooltip , lazy , default , socketless )
400401 self .multiselect = False
401402 self .options = options
402403 self .control_after_generate = control_after_generate
@@ -456,7 +457,7 @@ def __init__(
456457 self , id : str , display_name : str = None , optional = False ,
457458 tooltip : str = None , lazy : bool = None , default : str = None , socketless : bool = None
458459 ):
459- super ().__init__ (id , display_name , optional , tooltip , lazy , default , socketless , self . io_type )
460+ super ().__init__ (id , display_name , optional , tooltip , lazy , default , socketless )
460461
461462
462463@comfytype (io_type = "MASK" )
@@ -739,12 +740,15 @@ def __init__(self, id: str | InputV3, types: list[type[ComfyType] | ComfyType],
739740 # if id is an Input, then use that Input with overridden values
740741 self .input_override = None
741742 if isinstance (id , InputV3 ):
742- self .input_override = id
743+ self .input_override = copy . copy ( id )
743744 optional = id .optional if id .optional is True else optional
744745 tooltip = id .tooltip if id .tooltip is not None else tooltip
745746 display_name = id .display_name if id .display_name is not None else display_name
746747 lazy = id .lazy if id .lazy is not None else lazy
747748 id = id .id
749+ # if is a widget input, make sure widgetType is set appropriately
750+ if isinstance (self .input_override , WidgetInputV3 ):
751+ self .input_override .widgetType = self .input_override .get_io_type_V1 ()
748752 super ().__init__ (id , display_name , optional , tooltip , lazy , extra_dict )
749753 self ._io_types = types
750754
@@ -786,6 +790,10 @@ class DynamicOutput(OutputV3, ABC):
786790 '''
787791 Abstract class for dynamic output registration.
788792 '''
793+ def __init__ (self , id : str , display_name : str = None , tooltip : str = None ,
794+ is_output_list = False ):
795+ super ().__init__ (id , display_name , tooltip , is_output_list )
796+
789797 @abstractmethod
790798 def get_dynamic (self ) -> list [OutputV3 ]:
791799 ...
@@ -987,7 +995,7 @@ def validate(self):
987995 raise ValueError ("\n " .join (issues ))
988996
989997 def finalize (self ):
990- """Add hidden based on selected schema options."""
998+ """Add hidden based on selected schema options, and give outputs without ids default ids ."""
991999 # if is an api_node, will need key-related hidden
9921000 if self .is_api_node :
9931001 if self .hidden is None :
@@ -1004,6 +1012,11 @@ def finalize(self):
10041012 self .hidden .append (Hidden .prompt )
10051013 if Hidden .extra_pnginfo not in self .hidden :
10061014 self .hidden .append (Hidden .extra_pnginfo )
1015+ # give outputs without ids default ids
1016+ if self .outputs is not None :
1017+ for i , output in enumerate (self .outputs ):
1018+ if output .id is None :
1019+ output .id = f"_{ i } _{ output .io_type } _"
10071020
10081021
10091022class Serializer :
0 commit comments