From 9c47058b49166bf03af20deea0bfe4f37f5d2f44 Mon Sep 17 00:00:00 2001 From: Alexis Rolland Date: Wed, 17 Jun 2026 10:03:48 +0800 Subject: [PATCH] Remove caching feature --- comfy_api/latest/_io.py | 12 ------------ comfy_execution/caching.py | 20 ++++---------------- comfy_extras/nodes_audio.py | 4 ---- comfy_extras/nodes_images.py | 4 ---- comfy_extras/nodes_video.py | 2 -- nodes.py | 2 -- 6 files changed, 4 insertions(+), 40 deletions(-) diff --git a/comfy_api/latest/_io.py b/comfy_api/latest/_io.py index bc9190b6f..012fae3ac 100644 --- a/comfy_api/latest/_io.py +++ b/comfy_api/latest/_io.py @@ -1600,8 +1600,6 @@ class Schema: """Optional client-evaluated pricing badge declaration for this node.""" not_idempotent: bool=False """Flags a node as not idempotent; when True, the node will run and not reuse the cached outputs when identical inputs are provided on a different node in the graph.""" - cache_no_cascade: bool=False - """When True, changes to this node's widget inputs re-run this node but do not invalidate the caches of downstream nodes. Use for passthrough nodes whose widget inputs only affect side effects (e.g. a save node's filename), not the data passed to its outputs.""" enable_expand: bool=False """Flags a node as expandable, allowing NodeOutput to include 'expand' property.""" accept_all_inputs: bool=False @@ -2067,14 +2065,6 @@ class _ComfyNodeBaseInternal(_ComfyNodeInternal): cls.GET_SCHEMA() return cls._NOT_IDEMPOTENT - _CACHE_NO_CASCADE = None - @final - @classproperty - def CACHE_NO_CASCADE(cls): # noqa - if cls._CACHE_NO_CASCADE is None: - cls.GET_SCHEMA() - return cls._CACHE_NO_CASCADE - _ACCEPT_ALL_INPUTS = None @final @classproperty @@ -2125,8 +2115,6 @@ class _ComfyNodeBaseInternal(_ComfyNodeInternal): cls._INPUT_IS_LIST = schema.is_input_list if cls._NOT_IDEMPOTENT is None: cls._NOT_IDEMPOTENT = schema.not_idempotent - if cls._CACHE_NO_CASCADE is None: - cls._CACHE_NO_CASCADE = schema.cache_no_cascade if cls._ACCEPT_ALL_INPUTS is None: cls._ACCEPT_ALL_INPUTS = schema.accept_all_inputs diff --git a/comfy_execution/caching.py b/comfy_execution/caching.py index 038773736..ba1e8bc84 100644 --- a/comfy_execution/caching.py +++ b/comfy_execution/caching.py @@ -14,7 +14,6 @@ import nodes from comfy_execution.graph_utils import is_link NODE_CLASS_CONTAINS_UNIQUE_ID: Dict[str, bool] = {} -NODE_CLASS_CACHE_NO_CASCADE: Dict[str, bool] = {} def include_unique_id_in_input(class_type: str) -> bool: @@ -24,16 +23,6 @@ def include_unique_id_in_input(class_type: str) -> bool: NODE_CLASS_CONTAINS_UNIQUE_ID[class_type] = "UNIQUE_ID" in class_def.INPUT_TYPES().get("hidden", {}).values() return NODE_CLASS_CONTAINS_UNIQUE_ID[class_type] - -def is_cache_no_cascade(class_type: str) -> bool: - """Whether changes to this node's widget inputs should not invalidate downstream caches.""" - if class_type in NODE_CLASS_CACHE_NO_CASCADE: - return NODE_CLASS_CACHE_NO_CASCADE[class_type] - class_def = nodes.NODE_CLASS_MAPPINGS[class_type] - NODE_CLASS_CACHE_NO_CASCADE[class_type] = bool(getattr(class_def, "CACHE_NO_CASCADE", False)) - return NODE_CLASS_CACHE_NO_CASCADE[class_type] - - class CacheKeySet(ABC): def __init__(self, dynprompt, node_ids, is_changed_cache): self.keys = {} @@ -112,12 +101,12 @@ class CacheKeySetInputSignature(CacheKeySet): async def get_node_signature(self, dynprompt, node_id): signature = [] ancestors, order_mapping = self.get_ordered_ancestry(dynprompt, node_id) - signature.append(await self.get_immediate_node_signature(dynprompt, node_id, order_mapping, as_ancestor=False)) + signature.append(await self.get_immediate_node_signature(dynprompt, node_id, order_mapping)) for ancestor_id in ancestors: - signature.append(await self.get_immediate_node_signature(dynprompt, ancestor_id, order_mapping, as_ancestor=True)) + signature.append(await self.get_immediate_node_signature(dynprompt, ancestor_id, order_mapping)) return to_hashable(signature) - async def get_immediate_node_signature(self, dynprompt, node_id, ancestor_order_mapping, as_ancestor=False): + async def get_immediate_node_signature(self, dynprompt, node_id, ancestor_order_mapping): if not dynprompt.has_node(node_id): # This node doesn't exist -- we can't cache it. return [float("NaN")] @@ -128,13 +117,12 @@ class CacheKeySetInputSignature(CacheKeySet): if self.include_node_id_in_input() or (hasattr(class_def, "NOT_IDEMPOTENT") and class_def.NOT_IDEMPOTENT) or include_unique_id_in_input(class_type): signature.append(node_id) inputs = node["inputs"] - skip_widgets = as_ancestor and is_cache_no_cascade(class_type) for key in sorted(inputs.keys()): if is_link(inputs[key]): (ancestor_id, ancestor_socket) = inputs[key] ancestor_index = ancestor_order_mapping[ancestor_id] signature.append((key,("ANCESTOR", ancestor_index, ancestor_socket))) - elif not skip_widgets: + else: signature.append((key, inputs[key])) return signature diff --git a/comfy_extras/nodes_audio.py b/comfy_extras/nodes_audio.py index 647cd65ed..c91ae2451 100644 --- a/comfy_extras/nodes_audio.py +++ b/comfy_extras/nodes_audio.py @@ -168,7 +168,6 @@ class SaveAudio(IO.ComfyNode): hidden=[IO.Hidden.prompt, IO.Hidden.extra_pnginfo], is_deprecated=True, is_output_node=True, - cache_no_cascade=True, outputs=[IO.Audio.Output("audio")] ) @@ -199,7 +198,6 @@ class SaveAudioMP3(IO.ComfyNode): hidden=[IO.Hidden.prompt, IO.Hidden.extra_pnginfo], is_deprecated=True, is_output_node=True, - cache_no_cascade=True, outputs=[IO.Audio.Output("audio")] ) @@ -231,7 +229,6 @@ class SaveAudioOpus(IO.ComfyNode): hidden=[IO.Hidden.prompt, IO.Hidden.extra_pnginfo], is_deprecated=True, is_output_node=True, - cache_no_cascade=True, outputs=[IO.Audio.Output("audio")] ) @@ -279,7 +276,6 @@ class SaveAudioAdvanced(IO.ComfyNode): ], hidden=[IO.Hidden.prompt, IO.Hidden.extra_pnginfo], is_output_node=True, - cache_no_cascade=True, outputs=[IO.Audio.Output("audio")], ) diff --git a/comfy_extras/nodes_images.py b/comfy_extras/nodes_images.py index 835a1c979..fe1937ba5 100644 --- a/comfy_extras/nodes_images.py +++ b/comfy_extras/nodes_images.py @@ -214,7 +214,6 @@ class SaveAnimatedWEBP(IO.ComfyNode): ], hidden=[IO.Hidden.prompt, IO.Hidden.extra_pnginfo], is_output_node=True, - cache_no_cascade=True, outputs=[IO.Image.Output(display_name="images")] ) @@ -250,7 +249,6 @@ class SaveAnimatedPNG(IO.ComfyNode): ], hidden=[IO.Hidden.prompt, IO.Hidden.extra_pnginfo], is_output_node=True, - cache_no_cascade=True, outputs=[IO.Image.Output(display_name="images")] ) @@ -515,7 +513,6 @@ class SaveSVGNode(IO.ComfyNode): ], hidden=[IO.Hidden.prompt, IO.Hidden.extra_pnginfo], is_output_node=True, - cache_no_cascade=True, outputs=[IO.SVG.Output("svg")], ) @@ -1189,7 +1186,6 @@ class SaveImageAdvanced(IO.ComfyNode): ], hidden=[IO.Hidden.prompt, IO.Hidden.extra_pnginfo], is_output_node=True, - cache_no_cascade=True, outputs=[IO.Image.Output(display_name="images")] ) diff --git a/comfy_extras/nodes_video.py b/comfy_extras/nodes_video.py index 2e13a0ded..514edea20 100644 --- a/comfy_extras/nodes_video.py +++ b/comfy_extras/nodes_video.py @@ -27,7 +27,6 @@ class SaveWEBM(io.ComfyNode): ], hidden=[io.Hidden.prompt, io.Hidden.extra_pnginfo], is_output_node=True, - cache_no_cascade=True, outputs=[io.Image.Output(display_name="images")] ) @@ -91,7 +90,6 @@ class SaveVideo(io.ComfyNode): ], hidden=[io.Hidden.prompt, io.Hidden.extra_pnginfo], is_output_node=True, - cache_no_cascade=True, outputs=[io.Video.Output("video")], ) diff --git a/nodes.py b/nodes.py index 5025e8e58..e32dcde30 100644 --- a/nodes.py +++ b/nodes.py @@ -493,7 +493,6 @@ class SaveLatent: FUNCTION = "save" OUTPUT_NODE = True - CACHE_NO_CASCADE = True CATEGORY = "experimental" @@ -1649,7 +1648,6 @@ class SaveImage: FUNCTION = "save_images" OUTPUT_NODE = True - CACHE_NO_CASCADE = True CATEGORY = "image" ESSENTIALS_CATEGORY = "Basics"