From 23338b538293ba076950a236d9333eeffd44672b Mon Sep 17 00:00:00 2001 From: Jedrzej Kosinski Date: Thu, 12 Feb 2026 22:23:26 -0800 Subject: [PATCH] Move node replacement registration for core nodes into nodes_replacements.py --- comfy_extras/nodes_post_processing.py | 97 ------------------------ comfy_extras/nodes_replacements.py | 103 ++++++++++++++++++++++++++ nodes.py | 1 + 3 files changed, 104 insertions(+), 97 deletions(-) create mode 100644 comfy_extras/nodes_replacements.py diff --git a/comfy_extras/nodes_post_processing.py b/comfy_extras/nodes_post_processing.py index 32b0a1da0..66dac10b1 100644 --- a/comfy_extras/nodes_post_processing.py +++ b/comfy_extras/nodes_post_processing.py @@ -656,102 +656,6 @@ class BatchImagesMasksLatentsNode(io.ComfyNode): return io.NodeOutput(batched) -from comfy_api.latest import node_replace -from server import PromptServer - -def _register(nr: node_replace.NodeReplace): - """Helper to register replacements via PromptServer.""" - PromptServer.instance.node_replace_manager.register(nr) - -async def register_replacements(): - """Register all built-in node replacements.""" - register_replacements_longeredge() - register_replacements_batchimages() - register_replacements_upscaleimage() - register_replacements_controlnet() - register_replacements_load3d() - register_replacements_preview3d() - register_replacements_svdimg2vid() - register_replacements_conditioningavg() - -def register_replacements_longeredge(): - # No dynamic inputs here - _register(node_replace.NodeReplace( - new_node_id="ImageScaleToMaxDimension", - old_node_id="ResizeImagesByLongerEdge", - old_widget_ids=["longer_edge"], - input_mapping=[ - {"new_id": "image", "old_id": "images"}, - {"new_id": "largest_size", "old_id": "longer_edge"}, - {"new_id": "upscale_method", "set_value": "lanczos"}, - ], - # just to test the frontend output_mapping code, does nothing really here - output_mapping=[{"new_idx": 0, "old_idx": 0}], - )) - -def register_replacements_batchimages(): - # BatchImages node uses Autogrow - _register(node_replace.NodeReplace( - new_node_id="BatchImagesNode", - old_node_id="ImageBatch", - input_mapping=[ - {"new_id": "images.image0", "old_id": "image1"}, - {"new_id": "images.image1", "old_id": "image2"}, - ], - )) - -def register_replacements_upscaleimage(): - # ResizeImageMaskNode uses DynamicCombo - _register(node_replace.NodeReplace( - new_node_id="ResizeImageMaskNode", - old_node_id="ImageScaleBy", - old_widget_ids=["upscale_method", "scale_by"], - input_mapping=[ - {"new_id": "input", "old_id": "image"}, - {"new_id": "resize_type", "set_value": "scale by multiplier"}, - {"new_id": "resize_type.multiplier", "old_id": "scale_by"}, - {"new_id": "scale_method", "old_id": "upscale_method"}, - ], - )) - -def register_replacements_controlnet(): - # T2IAdapterLoader → ControlNetLoader - _register(node_replace.NodeReplace( - new_node_id="ControlNetLoader", - old_node_id="T2IAdapterLoader", - input_mapping=[ - {"new_id": "control_net_name", "old_id": "t2i_adapter_name"}, - ], - )) - -def register_replacements_load3d(): - # Load3DAnimation merged into Load3D - _register(node_replace.NodeReplace( - new_node_id="Load3D", - old_node_id="Load3DAnimation", - )) - -def register_replacements_preview3d(): - # Preview3DAnimation merged into Preview3D - _register(node_replace.NodeReplace( - new_node_id="Preview3D", - old_node_id="Preview3DAnimation", - )) - -def register_replacements_svdimg2vid(): - # Typo fix: SDV → SVD - _register(node_replace.NodeReplace( - new_node_id="SVD_img2vid_Conditioning", - old_node_id="SDV_img2vid_Conditioning", - )) - -def register_replacements_conditioningavg(): - # Typo fix: trailing space in node name - _register(node_replace.NodeReplace( - new_node_id="ConditioningAverage", - old_node_id="ConditioningAverage ", - )) - class PostProcessingExtension(ComfyExtension): @override async def get_node_list(self) -> list[type[io.ComfyNode]]: @@ -769,5 +673,4 @@ class PostProcessingExtension(ComfyExtension): ] async def comfy_entrypoint() -> PostProcessingExtension: - await register_replacements() return PostProcessingExtension() diff --git a/comfy_extras/nodes_replacements.py b/comfy_extras/nodes_replacements.py new file mode 100644 index 000000000..de0ba6db0 --- /dev/null +++ b/comfy_extras/nodes_replacements.py @@ -0,0 +1,103 @@ +from comfy_api.latest import ComfyExtension, io, node_replace +from server import PromptServer + +def _register(nr: node_replace.NodeReplace): + """Helper to register replacements via PromptServer.""" + PromptServer.instance.node_replace_manager.register(nr) + +async def register_replacements(): + """Register all built-in node replacements.""" + register_replacements_longeredge() + register_replacements_batchimages() + register_replacements_upscaleimage() + register_replacements_controlnet() + register_replacements_load3d() + register_replacements_preview3d() + register_replacements_svdimg2vid() + register_replacements_conditioningavg() + +def register_replacements_longeredge(): + # No dynamic inputs here + _register(node_replace.NodeReplace( + new_node_id="ImageScaleToMaxDimension", + old_node_id="ResizeImagesByLongerEdge", + old_widget_ids=["longer_edge"], + input_mapping=[ + {"new_id": "image", "old_id": "images"}, + {"new_id": "largest_size", "old_id": "longer_edge"}, + {"new_id": "upscale_method", "set_value": "lanczos"}, + ], + # just to test the frontend output_mapping code, does nothing really here + output_mapping=[{"new_idx": 0, "old_idx": 0}], + )) + +def register_replacements_batchimages(): + # BatchImages node uses Autogrow + _register(node_replace.NodeReplace( + new_node_id="BatchImagesNode", + old_node_id="ImageBatch", + input_mapping=[ + {"new_id": "images.image0", "old_id": "image1"}, + {"new_id": "images.image1", "old_id": "image2"}, + ], + )) + +def register_replacements_upscaleimage(): + # ResizeImageMaskNode uses DynamicCombo + _register(node_replace.NodeReplace( + new_node_id="ResizeImageMaskNode", + old_node_id="ImageScaleBy", + old_widget_ids=["upscale_method", "scale_by"], + input_mapping=[ + {"new_id": "input", "old_id": "image"}, + {"new_id": "resize_type", "set_value": "scale by multiplier"}, + {"new_id": "resize_type.multiplier", "old_id": "scale_by"}, + {"new_id": "scale_method", "old_id": "upscale_method"}, + ], + )) + +def register_replacements_controlnet(): + # T2IAdapterLoader → ControlNetLoader + _register(node_replace.NodeReplace( + new_node_id="ControlNetLoader", + old_node_id="T2IAdapterLoader", + input_mapping=[ + {"new_id": "control_net_name", "old_id": "t2i_adapter_name"}, + ], + )) + +def register_replacements_load3d(): + # Load3DAnimation merged into Load3D + _register(node_replace.NodeReplace( + new_node_id="Load3D", + old_node_id="Load3DAnimation", + )) + +def register_replacements_preview3d(): + # Preview3DAnimation merged into Preview3D + _register(node_replace.NodeReplace( + new_node_id="Preview3D", + old_node_id="Preview3DAnimation", + )) + +def register_replacements_svdimg2vid(): + # Typo fix: SDV → SVD + _register(node_replace.NodeReplace( + new_node_id="SVD_img2vid_Conditioning", + old_node_id="SDV_img2vid_Conditioning", + )) + +def register_replacements_conditioningavg(): + # Typo fix: trailing space in node name + _register(node_replace.NodeReplace( + new_node_id="ConditioningAverage", + old_node_id="ConditioningAverage ", + )) + +class NodeReplacementsExtension(ComfyExtension): + async def get_node_list(self) -> list[type[io.ComfyNode]]: + return [] + +async def comfy_entrypoint() -> NodeReplacementsExtension: + await register_replacements() + return NodeReplacementsExtension() diff --git a/nodes.py b/nodes.py index 91de7a9d7..3b4e52683 100644 --- a/nodes.py +++ b/nodes.py @@ -2435,6 +2435,7 @@ async def init_builtin_extra_nodes(): "nodes_lora_debug.py", "nodes_color.py", "nodes_toolkit.py", + "nodes_replacements.py", ] import_failed = []