From 4140263be5f7625dc6fb32c9a035eec24de769a8 Mon Sep 17 00:00:00 2001 From: Bahadir Ciloglu Date: Sat, 1 Nov 2025 14:44:15 +0300 Subject: [PATCH] Upload local ComfyUI-master files to create_image branch --- .../custom_nodes/example_node.py.example | 130 ++++++++++++++ .../custom_nodes/websocket_image_save.py | 44 +++++ ComfyUI-master/input/example.png | Bin 0 -> 8589 bytes .../put_audio_encoder_models_here | 0 .../models/checkpoints/put_checkpoints_here | 0 .../clip/put_clip_or_text_encoder_models_here | 0 .../clip_vision/put_clip_vision_models_here | 0 .../models/configs/anything_v3.yaml | 73 ++++++++ .../models/configs/v1-inference.yaml | 70 ++++++++ .../configs/v1-inference_clip_skip_2.yaml | 73 ++++++++ .../v1-inference_clip_skip_2_fp16.yaml | 74 ++++++++ .../models/configs/v1-inference_fp16.yaml | 71 ++++++++ .../configs/v1-inpainting-inference.yaml | 71 ++++++++ .../models/configs/v2-inference-v.yaml | 68 ++++++++ .../models/configs/v2-inference-v_fp32.yaml | 68 ++++++++ .../models/configs/v2-inference.yaml | 67 ++++++++ .../models/configs/v2-inference_fp32.yaml | 67 ++++++++ .../configs/v2-inpainting-inference.yaml | 158 ++++++++++++++++++ .../controlnet/put_controlnets_and_t2i_here | 0 .../diffusers/put_diffusers_models_here | 0 .../put_diffusion_model_files_here | 0 ...eddings_or_textual_inversion_concepts_here | 0 .../models/gligen/put_gligen_models_here | 0 .../hypernetworks/put_hypernetworks_here | 0 ComfyUI-master/models/loras/put_loras_here | 0 .../model_patches/put_model_patches_here | 0 .../photomaker/put_photomaker_models_here | 0 .../style_models/put_t2i_style_model_here | 0 .../text_encoders/put_text_encoder_files_here | 0 .../models/unet/put_unet_files_here | 0 .../put_esrgan_and_other_upscale_models_here | 0 ComfyUI-master/models/vae/put_vae_here | 0 ...esd_encoder_pth_and_taesd_decoder_pth_here | 0 .../output/_output_images_will_be_put_here | 0 34 files changed, 1034 insertions(+) create mode 100644 ComfyUI-master/custom_nodes/example_node.py.example create mode 100644 ComfyUI-master/custom_nodes/websocket_image_save.py create mode 100644 ComfyUI-master/input/example.png create mode 100644 ComfyUI-master/models/audio_encoders/put_audio_encoder_models_here create mode 100644 ComfyUI-master/models/checkpoints/put_checkpoints_here create mode 100644 ComfyUI-master/models/clip/put_clip_or_text_encoder_models_here create mode 100644 ComfyUI-master/models/clip_vision/put_clip_vision_models_here create mode 100644 ComfyUI-master/models/configs/anything_v3.yaml create mode 100644 ComfyUI-master/models/configs/v1-inference.yaml create mode 100644 ComfyUI-master/models/configs/v1-inference_clip_skip_2.yaml create mode 100644 ComfyUI-master/models/configs/v1-inference_clip_skip_2_fp16.yaml create mode 100644 ComfyUI-master/models/configs/v1-inference_fp16.yaml create mode 100644 ComfyUI-master/models/configs/v1-inpainting-inference.yaml create mode 100644 ComfyUI-master/models/configs/v2-inference-v.yaml create mode 100644 ComfyUI-master/models/configs/v2-inference-v_fp32.yaml create mode 100644 ComfyUI-master/models/configs/v2-inference.yaml create mode 100644 ComfyUI-master/models/configs/v2-inference_fp32.yaml create mode 100644 ComfyUI-master/models/configs/v2-inpainting-inference.yaml create mode 100644 ComfyUI-master/models/controlnet/put_controlnets_and_t2i_here create mode 100644 ComfyUI-master/models/diffusers/put_diffusers_models_here create mode 100644 ComfyUI-master/models/diffusion_models/put_diffusion_model_files_here create mode 100644 ComfyUI-master/models/embeddings/put_embeddings_or_textual_inversion_concepts_here create mode 100644 ComfyUI-master/models/gligen/put_gligen_models_here create mode 100644 ComfyUI-master/models/hypernetworks/put_hypernetworks_here create mode 100644 ComfyUI-master/models/loras/put_loras_here create mode 100644 ComfyUI-master/models/model_patches/put_model_patches_here create mode 100644 ComfyUI-master/models/photomaker/put_photomaker_models_here create mode 100644 ComfyUI-master/models/style_models/put_t2i_style_model_here create mode 100644 ComfyUI-master/models/text_encoders/put_text_encoder_files_here create mode 100644 ComfyUI-master/models/unet/put_unet_files_here create mode 100644 ComfyUI-master/models/upscale_models/put_esrgan_and_other_upscale_models_here create mode 100644 ComfyUI-master/models/vae/put_vae_here create mode 100644 ComfyUI-master/models/vae_approx/put_taesd_encoder_pth_and_taesd_decoder_pth_here create mode 100644 ComfyUI-master/output/_output_images_will_be_put_here diff --git a/ComfyUI-master/custom_nodes/example_node.py.example b/ComfyUI-master/custom_nodes/example_node.py.example new file mode 100644 index 000000000..779c35787 --- /dev/null +++ b/ComfyUI-master/custom_nodes/example_node.py.example @@ -0,0 +1,130 @@ +from typing_extensions import override + +from comfy_api.latest import ComfyExtension, io + + +class Example(io.ComfyNode): + """ + An example node + + Class methods + ------------- + define_schema (io.Schema): + Tell the main program the metadata, input, output parameters of nodes. + fingerprint_inputs: + optional method to control when the node is re executed. + check_lazy_status: + optional method to control list of input names that need to be evaluated. + + """ + + @classmethod + def define_schema(cls) -> io.Schema: + """ + Return a schema which contains all information about the node. + Some types: "Model", "Vae", "Clip", "Conditioning", "Latent", "Image", "Int", "String", "Float", "Combo". + For outputs the "io.Model.Output" should be used, for inputs the "io.Model.Input" can be used. + The type can be a "Combo" - this will be a list for selection. + """ + return io.Schema( + node_id="Example", + display_name="Example Node", + category="Example", + inputs=[ + io.Image.Input("image"), + io.Int.Input( + "int_field", + min=0, + max=4096, + step=64, # Slider's step + display_mode=io.NumberDisplay.number, # Cosmetic only: display as "number" or "slider" + lazy=True, # Will only be evaluated if check_lazy_status requires it + ), + io.Float.Input( + "float_field", + default=1.0, + min=0.0, + max=10.0, + step=0.01, + round=0.001, #The value representing the precision to round to, will be set to the step value by default. Can be set to False to disable rounding. + display_mode=io.NumberDisplay.number, + lazy=True, + ), + io.Combo.Input("print_to_screen", options=["enable", "disable"]), + io.String.Input( + "string_field", + multiline=False, # True if you want the field to look like the one on the ClipTextEncode node + default="Hello world!", + lazy=True, + ) + ], + outputs=[ + io.Image.Output(), + ], + ) + + @classmethod + def check_lazy_status(cls, image, string_field, int_field, float_field, print_to_screen): + """ + Return a list of input names that need to be evaluated. + + This function will be called if there are any lazy inputs which have not yet been + evaluated. As long as you return at least one field which has not yet been evaluated + (and more exist), this function will be called again once the value of the requested + field is available. + + Any evaluated inputs will be passed as arguments to this function. Any unevaluated + inputs will have the value None. + """ + if print_to_screen == "enable": + return ["int_field", "float_field", "string_field"] + else: + return [] + + @classmethod + def execute(cls, image, string_field, int_field, float_field, print_to_screen) -> io.NodeOutput: + if print_to_screen == "enable": + print(f"""Your input contains: + string_field aka input text: {string_field} + int_field: {int_field} + float_field: {float_field} + """) + #do some processing on the image, in this example I just invert it + image = 1.0 - image + return io.NodeOutput(image) + + """ + The node will always be re executed if any of the inputs change but + this method can be used to force the node to execute again even when the inputs don't change. + You can make this node return a number or a string. This value will be compared to the one returned the last time the node was + executed, if it is different the node will be executed again. + This method is used in the core repo for the LoadImage node where they return the image hash as a string, if the image hash + changes between executions the LoadImage node is executed again. + """ + #@classmethod + #def fingerprint_inputs(s, image, string_field, int_field, float_field, print_to_screen): + # return "" + +# Set the web directory, any .js file in that directory will be loaded by the frontend as a frontend extension +# WEB_DIRECTORY = "./somejs" + + +# Add custom API routes, using router +from aiohttp import web +from server import PromptServer + +@PromptServer.instance.routes.get("/hello") +async def get_hello(request): + return web.json_response("hello") + + +class ExampleExtension(ComfyExtension): + @override + async def get_node_list(self) -> list[type[io.ComfyNode]]: + return [ + Example, + ] + + +async def comfy_entrypoint() -> ExampleExtension: # ComfyUI calls this to load your extension and its nodes. + return ExampleExtension() diff --git a/ComfyUI-master/custom_nodes/websocket_image_save.py b/ComfyUI-master/custom_nodes/websocket_image_save.py new file mode 100644 index 000000000..15f87f9f5 --- /dev/null +++ b/ComfyUI-master/custom_nodes/websocket_image_save.py @@ -0,0 +1,44 @@ +from PIL import Image +import numpy as np +import comfy.utils +import time + +#You can use this node to save full size images through the websocket, the +#images will be sent in exactly the same format as the image previews: as +#binary images on the websocket with a 8 byte header indicating the type +#of binary message (first 4 bytes) and the image format (next 4 bytes). + +#Note that no metadata will be put in the images saved with this node. + +class SaveImageWebsocket: + @classmethod + def INPUT_TYPES(s): + return {"required": + {"images": ("IMAGE", ),} + } + + RETURN_TYPES = () + FUNCTION = "save_images" + + OUTPUT_NODE = True + + CATEGORY = "api/image" + + def save_images(self, images): + pbar = comfy.utils.ProgressBar(images.shape[0]) + step = 0 + for image in images: + i = 255. * image.cpu().numpy() + img = Image.fromarray(np.clip(i, 0, 255).astype(np.uint8)) + pbar.update_absolute(step, images.shape[0], ("PNG", img, None)) + step += 1 + + return {} + + @classmethod + def IS_CHANGED(s, images): + return time.time() + +NODE_CLASS_MAPPINGS = { + "SaveImageWebsocket": SaveImageWebsocket, +} diff --git a/ComfyUI-master/input/example.png b/ComfyUI-master/input/example.png new file mode 100644 index 0000000000000000000000000000000000000000..7b7f3c9cbbe6d8750c4a9eaf65d6ae4d2f108f79 GIT binary patch literal 8589 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