diff --git a/comfy_api/latest/_io.py b/comfy_api/latest/_io.py index 1386cab5f..4969d3506 100644 --- a/comfy_api/latest/_io.py +++ b/comfy_api/latest/_io.py @@ -1030,8 +1030,8 @@ class Autogrow(ComfyTypeI): # account for the edge case that all inputs are optional and no values are received if not new_dict_added_to: finalized_prefix = finalize_prefix(curr_prefix) - out_dict["dynamic_paths"][finalized_prefix] = None - out_dict["dynamic_paths_empty_dict"][finalized_prefix] = finalized_prefix + out_dict["dynamic_paths"][finalized_prefix] = finalized_prefix + out_dict["dynamic_paths_default_value"][finalized_prefix] = DynamicPathsDefaultValue.EMPTY_DICT parse_class_inputs(out_dict, live_inputs, new_dict, curr_prefix) @comfytype(io_type="COMFY_DYNAMICCOMBO_V3") @@ -1169,6 +1169,8 @@ class V3Data(TypedDict): 'Dictionary where the keys are the hidden input ids and the values are the values of the hidden inputs.' dynamic_paths: dict[str, Any] 'Dictionary where the keys are the input ids and the values dictate how to turn the inputs into a nested dictionary.' + dynamic_paths_default_value: dict[str, Any] + 'Dictionary where the keys are the input ids and the values are a string from DynamicPathsDefaultValue for the inputs if value is None.' create_dynamic_tuple: bool 'When True, the value of the dynamic input will be in the format (value, path_key).' @@ -1522,7 +1524,7 @@ def get_finalized_class_inputs(d: dict[str, Any], live_inputs: dict[str, Any], i "required": {}, "optional": {}, "dynamic_paths": {}, - "dynamic_paths_empty_dict": {}, + "dynamic_paths_default_value": {}, } d = d.copy() # ignore hidden for parsing @@ -1535,9 +1537,9 @@ def get_finalized_class_inputs(d: dict[str, Any], live_inputs: dict[str, Any], i if dynamic_paths is not None and len(dynamic_paths) > 0: v3_data["dynamic_paths"] = dynamic_paths # this list is used for autogrow, in the case all inputs are optional and no values are passed - dynamic_paths_empty_dict = out_dict.pop("dynamic_paths_empty_dict", None) - if dynamic_paths_empty_dict is not None and len(dynamic_paths_empty_dict) > 0: - v3_data["dynamic_paths_empty_dict"] = dynamic_paths_empty_dict + dynamic_paths_default_value = out_dict.pop("dynamic_paths_default_value", None) + if dynamic_paths_default_value is not None and len(dynamic_paths_default_value) > 0: + v3_data["dynamic_paths_default_value"] = dynamic_paths_default_value return out_dict, hidden, v3_data def parse_class_inputs(out_dict: dict[str, Any], live_inputs: dict[str, Any], curr_dict: dict[str, Any], curr_prefix: list[str] | None=None) -> None: @@ -1574,14 +1576,15 @@ def add_to_dict_v1(i: Input, d: dict): def add_to_dict_v3(io: Input | Output, d: dict): d[io.id] = (io.get_io_type(), io.as_dict()) +class DynamicPathsDefaultValue: + EMPTY_DICT = "empty_dict" + def build_nested_inputs(values: dict[str, Any], v3_data: V3Data): paths = v3_data.get("dynamic_paths", None) - empty_dict = v3_data.get("dynamic_paths_empty_dict", None) - if paths is None and empty_dict is None: + default_value_dict = v3_data.get("dynamic_paths_default_value", {}) + if paths is None: return values values = values.copy() - if empty_dict is not None and len(empty_dict) > 0: - ... result = {} @@ -1596,6 +1599,11 @@ def build_nested_inputs(values: dict[str, Any], v3_data: V3Data): if is_last: value = values.pop(key, None) + if value is None: + # see if a default value was provided for this key + default_option = default_value_dict.get(key, None) + if default_option == DynamicPathsDefaultValue.EMPTY_DICT: + value = {} if create_tuple: value = (value, key) current[p] = value diff --git a/comfy_extras/nodes_logic.py b/comfy_extras/nodes_logic.py index eb888316a..ac9d643ec 100644 --- a/comfy_extras/nodes_logic.py +++ b/comfy_extras/nodes_logic.py @@ -186,7 +186,7 @@ class AutogrowNamesTestNode(io.ComfyNode): class AutogrowPrefixTestNode(io.ComfyNode): @classmethod def define_schema(cls): - template = _io.Autogrow.TemplatePrefix(input=io.Float.Input("float"), prefix="float", min=1, max=10) + template = _io.Autogrow.TemplatePrefix(input=io.Float.Input("float", optional=True), prefix="float", min=1, max=10) return io.Schema( node_id="AutogrowPrefixTestNode", display_name="AutogrowPrefixTest", @@ -257,9 +257,9 @@ class LogicExtension(ComfyExtension): CustomComboNode, # SoftSwitchNode, # ConvertStringToComboNode, - # DCTestNode, + DCTestNode, # AutogrowNamesTestNode, - # AutogrowPrefixTestNode, + AutogrowPrefixTestNode, # ComboOutputTestNode, # InvertBooleanNode, ]