Merge remote-tracking branch 'upstream/main'

This commit is contained in:
kijai 2024-07-03 16:14:55 +03:00
commit 59395c0652
25 changed files with 8149 additions and 4497 deletions

View File

@ -315,6 +315,8 @@ NODE_CLASS_MAPPINGS.update({
* When you create the `pip_overrides.json` file, it changes the installation of specific pip packages to installations defined by the user.
* Please refer to the `pip_overrides.json.template` file.
* Use `aria2` as downloader
* [howto](docs/en/use_aria2.md)
## Scanner
When you run the `scan.sh` script:
@ -340,7 +342,8 @@ When you run the `scan.sh` script:
* Currently, `vid2vid` is not being updated, causing compatibility issues.
* If you encounter the error message `Overlapped Object has pending operation at deallocation on Comfyui Manager load` under Windows
* Edit `config.ini` file: add `windows_selector_event_loop_policy = True`
* if `SSL: CERTIFICATE_VERIFY_FAILED` error is occured.
* Edit `config.ini` file: add `bypass_ssl = True`
## Security policy
* Edit `config.ini` file: add `security_level = <LEVEL>`
@ -380,6 +383,8 @@ When you run the `scan.sh` script:
* https://github.com/SimithWang/comfyui-renameImages
* https://github.com/icefairy64/comfyui-model-tilt
* https://github.com/andrewharp/ComfyUI-EasyNodes
* https://github.com/SimithWang/comfyui-renameImages
* https://github.com/Tcheko243/ComfyUI-Photographer-Alpha7-Nodes
## Roadmap
@ -391,10 +396,10 @@ When you run the `scan.sh` script:
- [ ] Auto migration for custom nodes with changed structures.
- [ ] Version control feature for nodes.
- [ ] List of currently used custom nodes.
- [ ] Download support multiple model download.
- [ ] Model download via url.
- [x] Download support multiple model download.
- [x] Model download via url.
- [x] List sorting (custom nodes).
- [ ] List sorting (model).
- [x] List sorting (model).
- [ ] Provides description of node.

View File

@ -655,17 +655,6 @@
"install_type": "git-clone",
"description": "This extension aims to add support for various random image diffusion models to ComfyUI."
},
{
"author": "Kaharos94",
"title": "ComfyUI-Saveaswebp",
"id": "save-webp",
"reference": "https://github.com/Kaharos94/ComfyUI-Saveaswebp",
"files": [
"https://github.com/Kaharos94/ComfyUI-Saveaswebp"
],
"install_type": "git-clone",
"description": "Save a picture as Webp file in Comfy + Workflow loading"
},
{
"author": "SLAPaper",
"title": "ComfyUI-Image-Selector",
@ -791,13 +780,13 @@
"author": "TinyTerra",
"title": "ComfyUI_tinyterraNodes",
"id": "ttn",
"reference": "https://github.com/tinyterra/ComfyUI_tinyterraNodes",
"reference": "https://github.com/TinyTerra/ComfyUI_tinyterraNodes",
"files": [
"https://github.com/TinyTerra/ComfyUI_tinyterraNodes"
],
"install_type": "git-clone",
"nodename_pattern": "^ttN ",
"description": "This extension offers various pipe nodes, fullscreen image viewer based on node history, dynamic widgets, interface customization, and more."
"description": "This extension offers various pipe nodes, extensive XYZ plotting, fullscreen image viewer based on node history, dynamic widgets, interface customization, and more."
},
{
"author": "Jordach",
@ -821,17 +810,6 @@
"install_type": "git-clone",
"description": "ComfyUI custom nodes to apply various image processing techniques."
},
{
"author": "bvhari",
"title": "LatentToRGB",
"id": "latent2rgb",
"reference": "https://github.com/bvhari/ComfyUI_LatentToRGB",
"files": [
"https://github.com/bvhari/ComfyUI_LatentToRGB"
],
"install_type": "git-clone",
"description": "ComfyUI custom node to convert latent to RGB."
},
{
"author": "bvhari",
"title": "ComfyUI_PerpWeight",
@ -1414,6 +1392,17 @@
"install_type": "git-clone",
"description": "Nodes:MUJinjaRender, MUSimpleWildcard"
},
{
"author": "asagi4",
"title": "Adaptive Guidance for ComfyUI",
"id": "asagi-nodes",
"reference": "https://github.com/asagi4/ComfyUI-Adaptive-Guidance",
"files": [
"https://github.com/asagi4/ComfyUI-Adaptive-Guidance"
],
"install_type": "git-clone",
"description": "An implementation of adaptive guidance for ComfyUI\nSee [a/https://bcv-uniandes.github.io/adaptiveguidance-wp](https://bcv-uniandes.github.io/adaptiveguidance-wp)"
},
{
"author": "jamesWalker55",
"title": "ComfyUI - P2LDGAN Node",
@ -2588,6 +2577,17 @@
"install_type": "git-clone",
"description": "Basic support for StyleGAN2 and StyleGAN3 models."
},
{
"author": "spacepxl",
"title": "ComfyUI-Florence-2",
"id": "florence2-spacepxl",
"reference": "https://github.com/spacepxl/ComfyUI-Florence-2",
"files": [
"https://github.com/spacepxl/ComfyUI-Florence-2"
],
"install_type": "git-clone",
"description": "[a/https://huggingface.co/microsoft/Florence-2-large-ft](https://huggingface.co/microsoft/Florence-2-large-ft)\nLarge or base model, support for captioning and bbox task modes, more coming soon."
},
{
"author": "PTA",
"title": "auto nodes layout",
@ -2951,7 +2951,7 @@
{
"author": "kijai",
"title": "ComfyUI-Florence2",
"id": "florence2",
"id": "florence2-kijai",
"reference": "https://github.com/kijai/ComfyUI-Florence2",
"files": [
"https://github.com/kijai/ComfyUI-Florence2"
@ -3006,7 +3006,7 @@
{
"author": "mikkel",
"title": "ComfyUI - Text Overlay Plugin",
"id": "textoverlay",
"id": "textoverlay-mikkel",
"reference": "https://github.com/mikkel/ComfyUI-text-overlay",
"files": [
"https://github.com/mikkel/ComfyUI-text-overlay"
@ -3017,7 +3017,7 @@
{
"author": "avatechai",
"title": "Avatar Graph",
"id": "avatar",
"id": "avatar-graph",
"reference": "https://github.com/avatechai/avatar-graph-comfyui",
"files": [
"https://github.com/avatechai/avatar-graph-comfyui"
@ -3230,7 +3230,7 @@
"https://github.com/drustan-hawk/primitive-types"
],
"install_type": "git-clone",
"description": "This repository contains typed primitives for ComfyUI. The motivation for these primitives is that the standard primitive node cannot be routed."
"description": "Small collection of typed primitive nodes."
},
{
"author": "shadowcz007",
@ -3655,9 +3655,9 @@
"files": [
"https://github.com/Amorano/Jovimetrix"
],
"nodename_pattern": " \\(jov\\)$",
"nodename_pattern": " \\(JOV\\)$",
"install_type": "git-clone",
"description": "Compose like Substance Designer. Webcams, Media Streams (in/out), Tick animation, Color correction, Geometry manipulation, Pixel shader, Polygonal shape generator, Remap images gometry and color, Heavily inspired by WAS and MTB Node Suites."
"description": "Webcam, MIDI, Spout and GLSL shader support. Animation via tick. Parameter manipulation with wave generator. Math operations, universal value converstion, shape mask generation, image channel ops, batch splitting/merging/randomizing, load image/video from URL, Dynamic bus routing, support for GIPHY, save output anywhere! flatten, crop, transform; check color blindness, make stereograms or stereoscopic images, and much more."
},
{
"author": "Umikaze-job",
@ -4632,6 +4632,17 @@
"install_type": "git-clone",
"description": "Nodes: Save Text File, Download Image from URL, Groq LLM API, Generate Negative Prompt (experimental)"
},
{
"author": "AI2lab",
"title": "comfyUI-tool-2lab",
"id": "tool-2lab",
"reference": "https://github.com/AI2lab/comfyUI-tool-2lab",
"files": [
"https://github.com/AI2lab/comfyUI-tool-2lab"
],
"install_type": "git-clone",
"description": "tool set for developing workflow and publish to web api server"
},
{
"author": "AI2lab",
"title": "comfyUI-DeepSeek-2lab",
@ -4643,6 +4654,17 @@
"install_type": "git-clone",
"description": "Unofficial implementation of DeepSeek for ComfyUI"
},
{
"author": "AI2lab",
"title": "comfyUI-siliconflow-api-2lab",
"id": "siliconflow",
"reference": "https://github.com/AI2lab/comfyUI-siliconflow-api-2lab",
"files": [
"https://github.com/AI2lab/comfyUI-siliconflow-api-2lab"
],
"install_type": "git-clone",
"description": "Unofficial implementation of siliconflow API for ComfyUI\nHow to use:apply api key in https://cloud.siliconflow.cn/\nadd api key in config.json"
},
{
"author": "SpaceKendo",
"title": "Text to video for Stable Video Diffusion in ComfyUI",
@ -4674,7 +4696,7 @@
"https://github.com/NimaNzrii/comfyui-photoshop"
],
"install_type": "git-clone",
"description": "Photoshop node inside of ComfyUi, send and get data from Photoshop"
"description": "Photoshop node inside of ComfyUi, send and get data from Photoshop."
},
{
"author": "Rui",
@ -5877,7 +5899,7 @@
"https://github.com/JaredTherriault/ComfyUI-JNodes"
],
"install_type": "git-clone",
"description": "python and web UX improvements for ComfyUI.\n[w/'DynamicPrompts.js' and 'EditAttention.js' from the core, along with 'ImageFeed.js' and 'favicon.js' from the custom scripts of pythongosssss, are not compatible. Therefore, manual deletion of these files is required to use this web extension.]"
"description": "python and web UX improvements for ComfyUI: Lora/Embedding picker, web extension manager (enable/disable any extension without disabling python nodes), control any parameter with text prompts, image and video viewer, metadata viewer, token counter, comments in prompts, font control, and more! \n[w/'ImageFeed.js' from the custom scripts of pythongosssss is not compatible with this suite's ImageDrawer feature. Additionally, 'DynamicPrompts.js' and 'EditAttention.js' from the core, along with 'favicon.js' from the custom scripts of pythongosssss, are incompatible with advanced features of the suite. Please use the JNodes Extension Management setting in Settings > JNodes > Extension Management to disable these extensions by unchecking them to use the full functionality of the suite.]"
},
{
"author": "prozacgod",
@ -5899,7 +5921,7 @@
"https://github.com/Siberpone/lazy-pony-prompter"
],
"install_type": "git-clone",
"description": "A pony prompt helper extension for AUTOMATIC1111's Stable Diffusion Web UI and ComfyUI that utilizes the full power of your favorite booru query syntax. Currently supports [a/Derpibooru](https://derpibooru/org) and [a/E621](https://e621.net/)."
"description": "A booru API powered prompt generator for A1111 and ComfyUI with flexible tag filtering system and customizable prompt templates."
},
{
"author": "dave-palt",
@ -6230,6 +6252,17 @@
"install_type": "git-clone",
"description": "This project provides a Tensorrt implementation for fast image upscaling inside ComfyUI (3-4x faster)"
},
{
"author": "yuvraj108c",
"title": "ComfyUI YoloNasPose Tensorrt",
"id": "yolonaspose-tensorrt",
"reference": "https://github.com/yuvraj108c/ComfyUI-YoloNasPose-Tensorrt",
"files": [
"https://github.com/yuvraj108c/ComfyUI-YoloNasPose-Tensorrt"
],
"install_type": "git-clone",
"description": "This repo provides a ComfyUI Custom Node implementation of [a/YOLO-NAS-POSE](https://github.com/Deci-AI/super-gradients), powered by TensorRT for ultra fast pose estimation. It has been adapted to work with openpose controlnet (experimental)"
},
{
"author": "blepping",
"title": "ComfyUI-bleh",
@ -6728,6 +6761,17 @@
"install_type": "git-clone",
"description": "ComfyUI Node - Hugging Face repositories GTP2 Prompt"
},
{
"author": "1038lab",
"title": "ComfyUI-latentSizeSelector",
"id": "ComfyUI-latentSizeSelector",
"reference": "https://github.com/1038lab/ComfyUI_LatentSizeSelector",
"files": [
"https://github.com/1038lab/ComfyUI_LatentSizeSelector"
],
"install_type": "git-clone",
"description": "You'll get a new node Latent Size Selector, you can pick the x and y sizes from a list."
},
{
"author": "Klinter",
"title": "Klinter_nodes",
@ -6984,6 +7028,7 @@
{
"author": "munkyfoot",
"title": "ComfyUI-TextOverlay",
"id": "textoverlay-munkyfoot",
"reference": "https://github.com/Munkyfoot/ComfyUI-TextOverlay",
"files": [
"https://github.com/Munkyfoot/ComfyUI-TextOverlay"
@ -7151,6 +7196,17 @@
"install_type": "git-clone",
"description": "Partial redraw sampler and variant seed sampler"
},
{
"author": "11dogzi",
"title": "ComfUI-EGAdapterMadAssistant",
"id": "ergouzi-samplers",
"reference": "https://github.com/11dogzi/ComfUI-EGAdapterMadAssistant",
"files": [
"https://github.com/11dogzi/ComfUI-EGAdapterMadAssistant"
],
"install_type": "git-clone",
"description": "This is a hierarchical auxiliary project of the IPAdapter project, which uses a slider to quickly control the hierarchical weights and add fully random and semi random modes"
},
{
"author": "BXYMartin",
"title": "ComfyUI-InstantIDUtils",
@ -7289,7 +7345,7 @@
"https://github.com/ljleb/comfy-mecha"
],
"install_type": "git-clone",
"description": "Model merging node pack with a focus on low memory footprint."
"description": "model merging nodes powered by sd-mecha, a memory efficient state dict recipe merger."
},
{
"author": "diSty",
@ -7423,14 +7479,14 @@
"description": "This node is mainly based on [a/OmDet](https://github.com/om-ai-lab/OmDet) for object detection, and it outputs related images, masks, and Labelme JSON information."
},
{
"author": "Alysondao",
"author": "prodogape",
"title": "Comfyui-Yolov8-JSON",
"reference": "https://github.com/Alysondao/Comfyui-Yolov8-JSON",
"reference": "https://github.com/prodogape/Comfyui-Yolov8-JSON",
"files": [
"https://github.com/Alysondao/Comfyui-Yolov8-JSON"
"https://github.com/prodogape/Comfyui-Yolov8-JSON"
],
"install_type": "git-clone",
"description": "This node is mainly based on the Yolov8 model for object detection, and it outputs related images, masks, and JSON information."
"description": "This node is mainly based on the Yolov8 model for object detection, and it outputs related images, masks, and JSON information.[w/Repository url is changed. Please remove previous one and reinstall.]"
},
{
"author": "kingzcheung",
@ -7758,6 +7814,17 @@
"install_type": "git-clone",
"description": "Unofficial implementation of [a/dreamtalk](https://github.com/ali-vilab/dreamtalk) for ComfyUI"
},
{
"author": "hay86",
"title": "ComfyUI Hallo",
"id": "hallo-hay86",
"reference": "https://github.com/hay86/ComfyUI_Hallo",
"files": [
"https://github.com/hay86/ComfyUI_Hallo"
],
"install_type": "git-clone",
"description": "Unofficial implementation of [a/hallo](https://github.com/fudan-generative-vision/hallo) for ComfyUI"
},
{
"author": "hay86",
"title": "ComfyUI OpenVoice",
@ -8130,7 +8197,7 @@
"description": "Use RetinaFace to detect and automatically crop faces."
},
{
"author": "liusida",
"author": "Sida Liu",
"title": "ComfyUI-SD3-nodes",
"id": "sd3-nodes",
"reference": "https://github.com/liusida/ComfyUI-SD3-nodes",
@ -8141,7 +8208,7 @@
"description": "Nodes that support Stable Diffusion 3 Medium better."
},
{
"author": "liusida",
"author": "Sida Liu",
"title": "ComfyUI-B-LoRA",
"id": "b-lora",
"reference": "https://github.com/liusida/ComfyUI-B-LoRA",
@ -8173,6 +8240,17 @@
"install_type": "git-clone",
"description": "ComfyUI LayerDivider is custom nodes that generating layered psd files inside ComfyUI[w/Please follow readme and run install_windows_portable_win_py311_cu121 for ComfyUI embedded python.]"
},
{
"author": "jtydhr88",
"title": "ComfyUI Unique3D",
"id": "unique3d",
"reference": "https://github.com/jtydhr88/ComfyUI-Unique3D",
"files": [
"https://github.com/jtydhr88/ComfyUI-Unique3D"
],
"install_type": "git-clone",
"description": "ComfyUI Unique3D is custom nodes that running AiuniAI/Unique3D into ComfyUI[w/Please follow readme to install with ComfyUI embedded python.]"
},
{
"author": "SeaArtLab",
"title": "ComfyUI-Long-CLIP",
@ -8369,6 +8447,61 @@
"install_type": "git-clone",
"description": "a comfyui custom node for [a/3d-photo-inpainting](https://github.com/vt-vl-lab/3d-photo-inpainting),then you can render one image to zoom-in/dolly zoom/swing motion/circle motion video"
},
{
"author": "AIFSH",
"title": "AIFSH/ComfyUI-AuraSR",
"id": "aurasr-aifsh",
"reference": "https://github.com/AIFSH/ComfyUI-AuraSR",
"files": [
"https://github.com/AIFSH/ComfyUI-AuraSR"
],
"install_type": "git-clone",
"description": "a node for [a/AuraSR](https://github.com/fal-ai/aura-sr)"
},
{
"author": "AIFSH",
"title": "ComfyUI-MARS5-TTS",
"id": "mars5-tts",
"reference": "https://github.com/AIFSH/ComfyUI-MARS5-TTS",
"files": [
"https://github.com/AIFSH/ComfyUI-MARS5-TTS"
],
"install_type": "git-clone",
"description": "a comfyui custom node for [a/MARS5-TTS](https://github.com/Camb-ai/MARS5-TTS)"
},
{
"author": "AIFSH",
"title": "ComfyUI-I2V-Adapter",
"id": "i2v-adapter",
"reference": "https://github.com/AIFSH/ComfyUI-I2V-Adapter",
"files": [
"https://github.com/AIFSH/ComfyUI-I2V-Adapter"
],
"install_type": "git-clone",
"description": "a comfyui custom node for [a/I2V-Adapter](https://github.com/KwaiVGI/I2V-Adapter)"
},
{
"author": "AIFSH",
"title": "ComfyUI-MimicMotion",
"id": "mimicmotion-aifsh",
"reference": "https://github.com/AIFSH/ComfyUI-MimicMotion",
"files": [
"https://github.com/AIFSH/ComfyUI-MimicMotion"
],
"install_type": "git-clone",
"description": "a comfyui custom node for [a/MimicMotion](https://github.com/Tencent/MimicMotion)"
},
{
"author": "AIFSH",
"title": "ComfyUI-DiffSynth-Studio",
"id": "diffsynth-studio",
"reference": "https://github.com/AIFSH/ComfyUI-DiffSynth-Studio",
"files": [
"https://github.com/AIFSH/ComfyUI-DiffSynth-Studio"
],
"install_type": "git-clone",
"description": "make [a/DiffSynth-Studio](https://github.com/modelscope/DiffSynth-Studio) available in ComfyUI"
},
{
"author": "Koishi-Star",
"title": "Euler-Smea-Dyn-Sampler",
@ -8435,6 +8568,17 @@
"install_type": "git-clone",
"description": "A StoryDiffusion node for ComfyUI."
},
{
"author": "smthemex",
"title": "ComfyUI_MS_Diffusion",
"id": "MS_Diffusion",
"reference": "https://github.com/smthemex/ComfyUI_MS_Diffusion",
"files": [
"https://github.com/smthemex/ComfyUI_MS_Diffusion"
],
"install_type": "git-clone",
"description": "You can using MS-diffusion make story in comfyUI."
},
{
"author": "smthemex",
"title": "ComfyUI_Pic2Story",
@ -8512,6 +8656,17 @@
"install_type": "git-clone",
"description": "You can use [a/Popspaper](https://popspaper.github.io/pOps/) method in comfyUI"
},
{
"author": "smthemex",
"title": "ComfyUI_Streamv2v_Plus",
"id": "streamv2v",
"reference": "https://github.com/smthemex/ComfyUI_Streamv2v_Plus",
"files": [
"https://github.com/smthemex/ComfyUI_Streamv2v_Plus"
],
"install_type": "git-clone",
"description": "[a/StreamV2V](https://github.com/Jeff-LiangF/streamv2v) for ComfyUI"
},
{
"author": "choey",
"title": "Comfy-Topaz",
@ -8577,6 +8732,17 @@
"install_type": "git-clone",
"description": "Perturbed-Attention Guidance node for ComfyUI."
},
{
"author": "pamparamm",
"title": "ComfyUI Vectorscope CC",
"id": "vectorscope",
"reference": "https://github.com/pamparamm/ComfyUI-vectorscope-cc",
"files": [
"https://github.com/pamparamm/ComfyUI-vectorscope-cc"
],
"install_type": "git-clone",
"description": "ComfyUI port of a wonderful extension [a/SD Webui Vectorscope CC by Haoming02](https://github.com/Haoming02/sd-webui-vectorscope-cc).\nBased on (and probably incompatible with) [a/ComfyUI Diffusion Color Grading by Haoming02](https://github.com/Haoming02/comfyui-diffusion-cg)."
},
{
"author": "unwdef",
"title": "unwdef-nodes",
@ -8650,27 +8816,6 @@
"install_type": "git-clone",
"description": "Nodes:Shadertoy, Shader, ColorChannelOffset."
},
{
"author": "turkyden",
"title": "ComfyUI-Sticker",
"reference": "https://github.com/turkyden/ComfyUI-Sticker",
"files": [
"https://github.com/turkyden/ComfyUI-Sticker"
],
"install_type": "git-clone",
"description": "image to sticker"
},
{
"author": "turkyden",
"title": "ComfyUI-Comic",
"id": "comic",
"reference": "https://github.com/turkyden/ComfyUI-Comic",
"files": [
"https://github.com/turkyden/ComfyUI-Comic"
],
"install_type": "git-clone",
"description": "a comfyui plugin for image to comic"
},
{
"author": "royceschultz",
"title": "ComfyUI-TranscriptionTools",
@ -8879,6 +9024,17 @@
"install_type": "git-clone",
"description": "A stylized node with simple operation. The effect is achieved by I2I and lora. The clay style is currently implemented.Comes with watermark function."
},
{
"author": "MinusZoneAI",
"title": "ComfyUI-TrainTools-MZ",
"id": "traintools",
"reference": "https://github.com/MinusZoneAI/ComfyUI-TrainTools-MZ",
"files": [
"https://github.com/MinusZoneAI/ComfyUI-TrainTools-MZ"
],
"install_type": "git-clone",
"description": "Nodes for fine-tuning lora in ComfyUI, dependent on training tools such as kohya-ss/sd-scripts"
},
{
"author": "blueraincoatli",
"title": "comfyUI_SillyNodes",
@ -8977,6 +9133,27 @@
"install_type": "git-clone",
"description": "Original author is ByteDance.\nComfyUI sampler for HyperSDXL UNet\nPorted from: [a/https://huggingface.co/ByteDance/Hyper-SD](https://huggingface.co/ByteDance/Hyper-SD)"
},
{
"author": "fofr",
"title": "ComfyUI-Prompter-fofrAI",
"id": "prompter-fofr",
"reference": "https://github.com/fofr/ComfyUI-Prompter-fofrAI",
"files": [
"https://github.com/fofr/ComfyUI-Prompter-fofrAI"
],
"install_type": "git-clone",
"description": "A prompt helper. Use templates from [a/https://prompter.fofr.ai](https://prompter.fofr.ai) in ComfyUI."
},
{
"author": "fofr",
"title": "comfyui-replicate",
"reference": "https://github.com/fofr/comfyui-replicate",
"files": [
"https://github.com/fofr/comfyui-replicate"
],
"install_type": "git-clone",
"description": "Run [a/Replicate models](https://replicate.com/explore) in ComfyUI."
},
{
"author": "cfreilich",
"title": "Virtuoso Nodes for ComfyUI",
@ -9032,16 +9209,6 @@
"install_type": "git-clone",
"description": "workflow.json -> workflow_api.json"
},
{
"author": "nat-chan",
"title": "comfyui-paint",
"reference": "https://github.com/nat-chan/comfyui-paint",
"files": [
"https://github.com/nat-chan/comfyui-paint"
],
"install_type": "git-clone",
"description": "comfyui-paint"
},
{
"author": "web3nomad",
"title": "ComfyUI Invisible Watermark",
@ -9443,6 +9610,26 @@
"install_type": "git-clone",
"description": "Takes two images and matches their sizes using various methods, detailed below."
},
{
"author": "christian-byrne",
"title": "comfyui-search-navigation",
"reference": "https://github.com/christian-byrne/comfyui-search-navigation",
"files": [
"https://github.com/christian-byrne/comfyui-search-navigation"
],
"install_type": "git-clone",
"description": "Search navigation extension."
},
{
"author": "christian-byrne",
"title": "audio-separation-nodes-comfyui",
"reference": "https://github.com/christian-byrne/audio-separation-nodes-comfyui",
"files": [
"https://github.com/christian-byrne/audio-separation-nodes-comfyui"
],
"install_type": "git-clone",
"description": "Nodes:AudioSeparation, AudioCrop, AudioCombine, AudioTempoMatch."
},
{
"author": "oztrkoguz",
"title": "ComfyUI StoryCreater",
@ -10517,6 +10704,363 @@
"install_type": "git-clone",
"description": "Edit embeddings with a curve. Actually should work on any 1D input tensor. Tested with IPAdapter-Plus."
},
{
"author": "zhulu111",
"title": "ComfyUI_Bxb",
"id": "ComfyUI_Bxb",
"reference": "https://github.com/zhulu111/ComfyUI_Bxb",
"files": [
"https://github.com/zhulu111/ComfyUI_Bxb"
],
"install_type": "git-clone",
"description": "sdBxb, a tool that converts ComfyUI workflows into WeChat Mini Program, Douyin Mini Program, and H5 with one click, and supports payments."
},
{
"author": "lordgasmic",
"title": "comfyui_wildcards",
"reference": "https://github.com/lordgasmic/comfyui_wildcards",
"files": [
"https://github.com/lordgasmic/comfyui_wildcards"
],
"install_type": "git-clone",
"description": "This is an attempt to recreate the wildcards plugin for Automatic1111 but for ComfyUI."
},
{
"author": "lordgasmic",
"title": "comfyui_save_image_with_options",
"reference": "https://github.com/lordgasmic/comfyui_save_image_with_options",
"files": [
"https://github.com/lordgasmic/comfyui_save_image_with_options"
],
"install_type": "git-clone",
"description": "Nodes:Save Image with Options"
},
{
"author": "opvelll",
"title": "Comfy UI Text List Product",
"id": "listproduct",
"reference": "https://github.com/opvelll/ComfyUI_TextListProduct",
"files": [
"https://github.com/opvelll/ComfyUI_TextListProduct"
],
"install_type": "git-clone",
"description": "This is a custom node for Comfy UI. It mainly wraps itertools.product and can be used to create patterns by combining prompts. It is recommended to install this custom node in combination with the nodes from the WAS Node Suite."
},
{
"author": "jakechai",
"title": "ComfyUI-JakeUpgrade",
"id": "jkupgrade",
"reference": "https://github.com/jakechai/ComfyUI-JakeUpgrade",
"files": [
"https://github.com/jakechai/ComfyUI-JakeUpgrade"
],
"install_type": "git-clone",
"description": "A ComfyUI workflow customization by Jake."
},
{
"author": "celsojr2013",
"title": "ComfyUI SimpleTools Suit",
"reference": "https://github.com/celsojr2013/comfyui_simpletools",
"files": [
"https://github.com/celsojr2013/comfyui_simpletools"
],
"install_type": "git-clone",
"description": "Nodes:Simple Google Translator, Simple Resolution Solver.\nThis is a small set of simple nodes that help your workflow on ComfyUI."
},
{
"author": "celsojr2013",
"title": "comfyui_jamworks_client",
"reference": "https://github.com/celsojr2013/comfyui_jamworks_client",
"files": [
"https://github.com/celsojr2013/comfyui_jamworks_client"
],
"install_type": "git-clone",
"description": "Nodes:Jamworks_Login, Jamworks_Download, Shell_Command.\nA Simple Client for Jamworks Platform DAM Integration"
},
{
"author": "fablestudio",
"title": "ComfyUI-Showrunner-Utils",
"reference": "https://github.com/fablestudio/ComfyUI-Showrunner-Utils",
"files": [
"https://github.com/fablestudio/ComfyUI-Showrunner-Utils"
],
"install_type": "git-clone",
"description": "Comfyui Custom Nodes for Showrunner"
},
{
"author": "MilitantHitchhiker",
"title": "Militant Hitchhiker's Switchblade Pack",
"id": "hitchhiker",
"reference": "https://github.com/MilitantHitchhiker/MilitantHitchhiker-SwitchbladePack",
"files": [
"https://github.com/MilitantHitchhiker/MilitantHitchhiker-SwitchbladePack"
],
"install_type": "git-clone",
"description": "Militant Hitchhiker's Switchblade Pack is a collection of custom nodes for ComfyUI that provide various multi-function capabilities."
},
{
"author": "slyt",
"title": "comfyui-ollama-nodes",
"reference": "https://github.com/slyt/comfyui-ollama-nodes",
"files": [
"https://github.com/slyt/comfyui-ollama-nodes"
],
"install_type": "git-clone",
"description": "ComfyUI custom nodes for working with [a/Ollama](https://github.com/ollama/ollama).\nNOTE:Assumes that an Ollama server is running at http://127.0.0.1:11434 and accessible by the ComfyUI backend."
},
{
"author": "zwng",
"title": "ComfyUI_Zwng_Nodes",
"id": "zwng",
"reference": "https://github.com/za-wa-n-go/ComfyUI_Zwng_Nodes",
"files": [
"https://github.com/za-wa-n-go/ComfyUI_Zwng_Nodes"
],
"install_type": "git-clone",
"description": "Simple nodes for loading image files.Nodes that include a simple remote connection to Photoshop, a node that can overlay and preview an image with a mask, and a node that can load images directly from a file path."
},
{
"author": "RedRayz",
"title": "ComfyUI-Danbooru-To-WD",
"id": "danbooru2wd",
"reference": "https://github.com/RedRayz/ComfyUI-Danbooru-To-WD",
"files": [
"https://github.com/RedRayz/ComfyUI-Danbooru-To-WD"
],
"install_type": "git-clone",
"description": "Converts booru tags to a format suitable for Waifu Diffusion(or Danbooru based models)."
},
{
"author": "Shibiko-AI",
"title": "Shibiko AI ComfyUI Tools",
"id": "shibiko-ai-tools",
"reference": "https://github.com/Shibiko-AI/ShibikoAI-ComfyUI-Tools",
"files": [
"https://github.com/Shibiko-AI/ShibikoAI-ComfyUI-Tools"
],
"install_type": "git-clone",
"description": "This is a collection of tools that I use to make my life easier when developing ComfyUI applications. It is a collection of tools that I have created to help me with my development process. I have decided to share these tools with the community in the hopes that they will be useful to others as well. I use this tools to further develop features for [a/https://shibiko.ai](https://shibiko.ai)"
},
{
"author": "SaltAI",
"title": "SaltAI_AudioViz",
"id": "saltai-audioviz",
"reference": "https://github.com/get-salt-AI/SaltAI_AudioViz",
"files": [
"https://github.com/get-salt-AI/SaltAI_AudioViz"
],
"install_type": "git-clone",
"description": "SaltAI AudioViz contains ComfyUI nodes for generating complex audio reactive visualizations"
},
{
"author": "SherryXieYuchen",
"title": "ComfyUI-Image-Inpainting",
"id": "image-inpainting",
"reference": "https://github.com/SherryXieYuchen/ComfyUI-Image-Inpainting",
"files": [
"https://github.com/SherryXieYuchen/ComfyUI-Image-Inpainting"
],
"install_type": "git-clone",
"description": "Nodes:VAE Encode Inpaint, VAE Decode Inpaint, ColorCorrection Inpaint, ImagePreprocess Inpaint, ImagePostprocess Inpaint, Load Model Inpaint, Inpainting (using Model)"
},
{
"author": "zeroxoxo",
"title": "ComfyUI-Fast-Style-Transfer",
"id": "fast-style-transfer",
"reference": "https://github.com/zeroxoxo/ComfyUI-Fast-Style-Transfer",
"files": [
"https://github.com/zeroxoxo/ComfyUI-Fast-Style-Transfer"
],
"install_type": "git-clone",
"description": "ComfyUI node for fast neural style transfer. This is a simple conversion based on this: [a/https://github.com/rrmina/fast-neural-style-pytorch](https://github.com/rrmina/fast-neural-style-pytorch) Only basic inference functionality is ported for now."
},
{
"author": "iwanders",
"title": "iwanders/ComfyUI_nodes",
"id": "iwanders-nodes",
"reference": "https://github.com/iwanders/ComfyUI_nodes",
"files": [
"https://github.com/iwanders/ComfyUI_nodes"
],
"install_type": "git-clone",
"description": "Nodes:IW SaveString, IW PrintString, IW ReplaceString, IW StringNode, IW StringConcat, IW TokenizerVocab, IW JsonPickItem."
},
{
"author": "rhdunn",
"title": "comfyui-bus-plugin",
"id": "bus",
"reference": "https://github.com/rhdunn/comfyui-bus-plugin",
"files": [
"https://github.com/rhdunn/comfyui-bus-plugin"
],
"install_type": "git-clone",
"description": "A collection of nodes for rerouting multiple I/O lines together in a bus."
},
{
"author": "hyunamy",
"title": "Comfy-UI on-complete-email-me",
"id": "hyunamy",
"reference": "https://github.com/hyunamy/comfy-ui-on-complete-email-me",
"files": [
"https://github.com/hyunamy/comfy-ui-on-complete-email-me"
],
"install_type": "git-clone",
"description": "A feature that sends an email via Gmail once image generation is completed in Comfy-ui."
},
{
"author": "veighnsche",
"title": "comfyui_gr85",
"id": "gr85",
"reference": "https://github.com/veighnsche/comfyui_gr85",
"files": [
"https://github.com/veighnsche/comfyui_gr85"
],
"install_type": "git-clone",
"description": "Nodes:Image Dimension Resizer, Image Sizer, Random Ratio, Show Text, Random Title Character, Random Wildcard Tag Picker, Random Show Atm Loc Outfit, Contains Word, Elements Concatenator, ..."
},
{
"author": "leiweiqiang",
"title": "ComfyUI-TRA",
"id": "tra",
"reference": "https://github.com/leiweiqiang/ComfyUI-TRA",
"files": [
"https://github.com/leiweiqiang/ComfyUI-TRA"
],
"install_type": "git-clone",
"description": "Nodes:TCL EbSynth, TCL Extract Frames (From File), TCL Extract Frames (From Video), TCL Combine Frames, TCL Save Video (From Frames)"
},
{
"author": "hwhaocool",
"title": "ComfyUI-Select-Any",
"id": "select-any",
"reference": "https://github.com/hwhaocool/ComfyUI-Select-Any",
"files": [
"https://github.com/hwhaocool/ComfyUI-Select-Any"
],
"install_type": "git-clone",
"description": "a comfyui custom node, which can select value from inputs"
},
{
"author": "mingqizhang",
"title": "ComfyUI_InSPyResNet_zmq",
"id": "inspy",
"reference": "https://github.com/mingqizhang/ComfyUI_InSPyResNet_zmq",
"files": [
"https://github.com/mingqizhang/ComfyUI_InSPyResNet_zmq"
],
"install_type": "git-clone",
"description": "Nodes:INSPY removebg ModelLoader, INSPY RMBG"
},
{
"author": "GreenLandisaLie",
"title": "AuraSR-ComfyUI",
"id": "aurasr-greenlandisalie",
"reference": "https://github.com/GreenLandisaLie/AuraSR-ComfyUI",
"files": [
"https://github.com/GreenLandisaLie/AuraSR-ComfyUI"
],
"install_type": "git-clone",
"description": "ComfyUI implementation of [a/Aura-SR](https://github.com/fal-ai/aura-sr)"
},
{
"author": "licyk",
"title": "ComfyUI-Restart-Sampler",
"id": "restart-sampler-licyk",
"reference": "https://github.com/licyk/ComfyUI-Restart-Sampler",
"files": [
"https://github.com/licyk/ComfyUI-Restart-Sampler"
],
"install_type": "git-clone",
"description": "This extension is a node that directly expands the functionality of KSampler, rather than being in the form of a custom node. [w/Workflows created using this feature are not compatible with other users.]"
},
{
"author": "Fuou Marinas",
"title": "ComfyUI-FirstOrderMM",
"id": "fomm",
"reference": "https://github.com/FuouM/ComfyUI-FirstOrderMM",
"files": [
"https://github.com/FuouM/ComfyUI-FirstOrderMM"
],
"install_type": "git-clone",
"description": "Run [a/First Order Motion Model](https://github.com/AliaksandrSiarohin/first-order-model) for Image Animation in ComfyUI."
},
{
"author": "my-opencode",
"title": "ComfyUI_IndustrialMagick",
"id": "industrialmagick",
"reference": "https://github.com/my-opencode/ComfyUI_IndustrialMagick",
"files": [
"https://github.com/my-opencode/ComfyUI_IndustrialMagick"
],
"install_type": "git-clone",
"description": "[a/ImageMagick](https://imagemagick.org/index.php) nodes for ComfyUI. Adds nodes to call ImageMagick subprocesses from ComfyUI.\nRequirements: [a/ImagMagick7](https://imagemagick.org/script/download.php), 'magick' command in your CLI environment."
},
{
"author": "my-opencode",
"title": "ComfyUI_KSamplerTimer",
"id": "ksamplertimer",
"reference": "https://github.com/my-opencode/ComfyUI_KSamplerTimer",
"files": [
"https://github.com/my-opencode/ComfyUI_KSamplerTimer"
],
"install_type": "git-clone",
"description": "A custom node that returns the generation time of the KSampler. Intended for benchmarking or debugging."
},
{
"author": "SEkINVR",
"title": "ComfyUI SaveAS",
"id": "saveas",
"reference": "https://github.com/SEkINVR/ComfyUI-SaveAs",
"files": [
"https://github.com/SEkINVR/ComfyUI-SaveAs"
],
"install_type": "git-clone",
"description": "This custom node for ComfyUI allows you to save images in multiple formats, including PNG, JPG, WebP, and ICO.\n[w/ComfyUI-Save-Multi-Format is renamed to SaveAs. Remove previous one and reinstall to this.]"
},
{
"author": "MrSamSeen",
"title": "ComfyUI_SSStereoscope",
"id": "ssstereoscope",
"reference": "https://github.com/MrSamSeen/ComfyUI_SSStereoscope",
"files": [
"https://github.com/MrSamSeen/ComfyUI_SSStereoscope"
],
"install_type": "git-clone",
"description": "The SideBySide Node is a powerful tool designed for ComfyUI to generate stereoscopic images. It takes a base image and a corresponding depth map as inputs and produces a combined image that simulates a 3D effect when viewed with appropriate equipment."
},
{
"author": "jroc22",
"title": "ComfyUI-CSV-prompt-builder",
"id": "csv-prompt-builder",
"reference": "https://github.com/jroc22/ComfyUI-CSV-prompt-builder",
"files": [
"https://github.com/jroc22/ComfyUI-CSV-prompt-builder"
],
"install_type": "git-clone",
"description": "This is a simple node for creating prompts using a .csv file. I created this node as an easy way to output different prompts each time a workflow is run."
},
{
"author": "DeJoker",
"title": "Pipeline Parallel ComfyUI",
"reference": "https://github.com/DeJoker/pipeline-parallel-comfy",
"files": [
"https://github.com/DeJoker/pipeline-parallel-comfy"
],
"install_type": "git-clone",
"description": "provide extra api to run prompt request with parallel execution of independent node"
},
{
"author": "yiwangsimple",
"title": "comfy-groqchat",
"reference": "https://github.com/yiwangsimple/ComfyUI_GroqChat",
"files": [
"https://github.com/yiwangsimple/ComfyUI_GroqChat"
],
"install_type": "git-clone",
"description": "Content generation with open source models in comfyui via graq api implementation."
},
@ -10781,18 +11325,6 @@
"install_type": "copy",
"description": "Nodes:tensor_trans_pil, Make Transparent mask, MergeImages, words_generatee, load_PIL image"
},
{
"author": "celsojr2013",
"title": "ComfyUI SimpleTools Suit",
"reference": "https://github.com/celsojr2013/comfyui_simpletools",
"files": [
"https://github.com/celsojr2013/comfyui_simpletools/raw/main/google_translator.py",
"https://github.com/celsojr2013/comfyui_simpletools/raw/main/parameters.py",
"https://github.com/celsojr2013/comfyui_simpletools/raw/main/resolution_solver.py"
],
"install_type": "copy",
"description": "Nodes:Simple Gooogle Translator Client, Simple Mustache Parameter Switcher, Simple Latent Resolution Solver."
},
{
"author": "underclockeddev",
"title": "Preview Subselection Node for ComfyUI",
@ -10870,9 +11402,16 @@
"install_type": "copy",
"description": "Use LibreTranslation in ComfyUI [a/https://github.com/LibreTranslate/LibreTranslate](https://github.com/LibreTranslate/LibreTranslate)"
},
{
"author": "ImmortalPie",
"title": "PonySwitch Node",
"reference": "https://github.com/ImmortalPie/ComfyUI-PonySwitch",
"files": [
"https://github.com/ImmortalPie/ComfyUI-PonySwitch/raw/main/PonySwitch.py"
],
"install_type": "copy",
"description": "The PonySwitch node is a custom node for ComfyUI that modifies prompts based on a toggle switch and adds configurable pony tags."
},
{
"author": "theally",
"title": "TheAlly's Custom Nodes",

40
docs/en/use_aria2.md Normal file
View File

@ -0,0 +1,40 @@
# Use `aria2` as downloader
Two environment variables are needed to use `aria2` as the downloader.
```bash
export COMFYUI_MANAGER_ARIA2_SERVER=http://127.0.0.1:6800
export COMFYUI_MANAGER_ARIA2_SECRET=__YOU_MUST_CHANGE_IT__
```
An example `docker-compose.yml`
```yaml
services:
aria2:
container_name: aria2
image: p3terx/aria2-pro
environment:
- PUID=1000
- PGID=1000
- UMASK_SET=022
- RPC_SECRET=__YOU_MUST_CHANGE_IT__
- RPC_PORT=5080
- DISK_CACHE=64M
- IPV6_MODE=false
- UPDATE_TRACKERS=false
- CUSTOM_TRACKER_URL=
volumes:
- ./config:/config
- ./downloads:/downloads
- ~/ComfyUI/models:/models
- ~/ComfyUI/custom_nodes:/custom_nodes
ports:
- 6800:6800
restart: unless-stopped
logging:
driver: json-file
options:
max-size: 1m
```

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -23,12 +23,17 @@ sys.path.append(glob_path)
import cm_global
from manager_util import *
version = [2, 38, 2]
version = [2, 43]
version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '')
comfyui_manager_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
custom_nodes_path = os.path.abspath(os.path.join(comfyui_manager_path, '..'))
comfy_path = os.path.abspath(os.path.join(custom_nodes_path, '..'))
comfy_path = os.environ.get('COMFYUI_PATH')
if comfy_path is None:
comfy_path = os.path.abspath(os.path.join(custom_nodes_path, '..'))
channel_list_path = os.path.join(comfyui_manager_path, 'channels.list')
config_path = os.path.join(comfyui_manager_path, "config.ini")
startup_script_path = os.path.join(comfyui_manager_path, "startup-scripts")
@ -181,7 +186,9 @@ class ManagerFuncs:
print(f"[ComfyUI-Manager] Unexpected behavior: `{cmd}`")
return 0
subprocess.check_call(cmd, cwd=cwd)
new_env = os.environ.copy()
new_env["COMFYUI_PATH"] = comfy_path
subprocess.check_call(cmd, cwd=cwd, env=new_env)
return 0
@ -325,6 +332,8 @@ def __win_check_git_update(path, do_fetch=False, do_update=False):
else:
command = [sys.executable, git_script_path, "--check", path]
new_env = os.environ.copy()
new_env["COMFYUI_PATH"] = comfy_path
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=custom_nodes_path)
output, _ = process.communicate()
output = output.decode('utf-8').strip()
@ -334,10 +343,10 @@ def __win_check_git_update(path, do_fetch=False, do_update=False):
safedir_path = path.replace('\\', '/')
try:
print(f"[ComfyUI-Manager] Try fixing 'dubious repository' error on '{safedir_path}' repo")
process = subprocess.Popen(['git', 'config', '--global', '--add', 'safe.directory', safedir_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
process = subprocess.Popen(['git', 'config', '--global', '--add', 'safe.directory', safedir_path], env=new_env, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, _ = process.communicate()
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
process = subprocess.Popen(command, env=new_env, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, _ = process.communicate()
output = output.decode('utf-8').strip()
except Exception:
@ -376,8 +385,10 @@ def __win_check_git_update(path, do_fetch=False, do_update=False):
def __win_check_git_pull(path):
new_env = os.environ.copy()
new_env["COMFYUI_PATH"] = comfy_path
command = [sys.executable, git_script_path, "--pull", path]
process = subprocess.Popen(command, cwd=custom_nodes_path)
process = subprocess.Popen(command, env=new_env, cwd=custom_nodes_path)
process.wait()

View File

@ -0,0 +1,70 @@
import os
from urllib.parse import urlparse
aria2 = os.getenv('COMFYUI_MANAGER_ARIA2_SERVER')
HF_ENDPOINT = os.getenv('HF_ENDPOINT')
if aria2 is not None:
secret = os.getenv('COMFYUI_MANAGER_ARIA2_SECRET')
url = urlparse(aria2)
port = url.port
host = url.scheme + '://' + url.hostname
import aria2p
aria2 = aria2p.API(aria2p.Client(host=host, port=port, secret=secret))
def download_url(model_url: str, model_dir: str, filename: str):
if aria2:
return aria2_download_url(model_url, model_dir, filename)
else:
from torchvision.datasets.utils import download_url as torchvision_download_url
return torchvision_download_url(model_url, model_dir, filename)
def aria2_find_task(dir: str, filename: str):
target = os.path.join(dir, filename)
downloads = aria2.get_downloads()
for download in downloads:
for file in download.files:
if file.is_metadata:
continue
if str(file.path) == target:
return download
def aria2_download_url(model_url: str, model_dir: str, filename: str):
import manager_core as core
import tqdm
import time
if model_dir.startswith(core.comfy_path):
model_dir = model_dir[len(core.comfy_path) :]
if HF_ENDPOINT:
model_url = model_url.replace('https://huggingface.co', HF_ENDPOINT)
download_dir = model_dir if model_dir.startswith('/') else os.path.join('/models', model_dir)
download = aria2_find_task(download_dir, filename)
if download is None:
options = {'dir': download_dir, 'out': filename}
download = aria2.add(model_url, options)[0]
if download.is_active:
with tqdm.tqdm(
total=download.total_length,
bar_format='{l_bar}{bar}{r_bar}',
desc=filename,
unit='B',
unit_scale=True,
) as progress_bar:
while download.is_active:
if progress_bar.total == 0 and download.total_length != 0:
progress_bar.reset(download.total_length)
progress_bar.update(download.completed_length - progress_bar.n)
time.sleep(1)
download.update()

View File

@ -42,7 +42,7 @@ from comfy.cli_args import args
import latent_preview
is_local_mode = args.listen.startswith('127.')
is_local_mode = args.listen.startswith('127.') or args.listen.startswith('local.')
def is_allowed_security_level(level):
@ -106,7 +106,7 @@ core.manager_funcs = ManagerFuncsInComfyUI()
sys.path.append('../..')
from torchvision.datasets.utils import download_url
from manager_downloader import download_url
core.comfy_path = os.path.dirname(folder_paths.__file__)
core.js_path = os.path.join(core.comfy_path, "web", "extensions")

View File

@ -12,8 +12,8 @@ import {
} from "./comfyui-share-common.js";
import { OpenArtShareDialog } from "./comfyui-share-openart.js";
import { CustomNodesManager } from "./custom-nodes-manager.js";
import { ModelManager } from "./model-manager.js";
import { SnapshotManager } from "./snapshot.js";
import { ModelInstaller } from "./model-downloader.js";
import { manager_instance, setManagerInstance, install_via_git_url, install_pip, rebootAPI, free_models, show_message } from "./common.js";
import { ComponentBuilderDialog, load_components, set_component_policy, getPureName } from "./components-manager.js";
import { set_double_click_policy } from "./node_fixer.js";
@ -736,14 +736,16 @@ class ManagerMenuDialog extends ComfyDialog {
}
}),
$el("button.cm-button", {
type: "button",
textContent: "Install Models",
textContent: "Model Manager",
onclick:
() => {
if(!ModelInstaller.instance)
ModelInstaller.instance = new ModelInstaller(app, self);
ModelInstaller.instance.show();
if(!ModelManager.instance) {
ModelManager.instance = new ModelManager(app, self);
}
ModelManager.instance.show();
}
}),
@ -1276,6 +1278,20 @@ app.registerExtension({
separator.style.width = "100%";
menu.append(separator);
// new style Manager button
app.menu?.saveButton.element.after(new(await import("../../scripts/ui/components/button.js")).ComfyButton({
icon: "puzzle",
action: () => {
if(!manager_instance)
setManagerInstance(new ManagerMenuDialog());
manager_instance.show();
},
tooltip: "ComfyUI Manager",
content: "ComfyUI Manager",
classList: "comfyui-button comfyui-menu-mobile-collapse primary"
}).element);
// old style Manager button
const managerButton = document.createElement("button");
managerButton.textContent = "Manager";
managerButton.onclick = () => {

View File

@ -119,3 +119,95 @@ export async function free_models() {
show_message('Unloading of models failed.<BR><BR>Installed ComfyUI may be an outdated version.')
}
}
export function md5(inputString) {
const hc = '0123456789abcdef';
const rh = n => {let j,s='';for(j=0;j<=3;j++) s+=hc.charAt((n>>(j*8+4))&0x0F)+hc.charAt((n>>(j*8))&0x0F);return s;}
const ad = (x,y) => {let l=(x&0xFFFF)+(y&0xFFFF);let m=(x>>16)+(y>>16)+(l>>16);return (m<<16)|(l&0xFFFF);}
const rl = (n,c) => (n<<c)|(n>>>(32-c));
const cm = (q,a,b,x,s,t) => ad(rl(ad(ad(a,q),ad(x,t)),s),b);
const ff = (a,b,c,d,x,s,t) => cm((b&c)|((~b)&d),a,b,x,s,t);
const gg = (a,b,c,d,x,s,t) => cm((b&d)|(c&(~d)),a,b,x,s,t);
const hh = (a,b,c,d,x,s,t) => cm(b^c^d,a,b,x,s,t);
const ii = (a,b,c,d,x,s,t) => cm(c^(b|(~d)),a,b,x,s,t);
const sb = x => {
let i;const nblk=((x.length+8)>>6)+1;const blks=[];for(i=0;i<nblk*16;i++) { blks[i]=0 };
for(i=0;i<x.length;i++) {blks[i>>2]|=x.charCodeAt(i)<<((i%4)*8);}
blks[i>>2]|=0x80<<((i%4)*8);blks[nblk*16-2]=x.length*8;return blks;
}
let i,x=sb(inputString),a=1732584193,b=-271733879,c=-1732584194,d=271733878,olda,oldb,oldc,oldd;
for(i=0;i<x.length;i+=16) {olda=a;oldb=b;oldc=c;oldd=d;
a=ff(a,b,c,d,x[i+ 0], 7, -680876936);d=ff(d,a,b,c,x[i+ 1],12, -389564586);c=ff(c,d,a,b,x[i+ 2],17, 606105819);
b=ff(b,c,d,a,x[i+ 3],22,-1044525330);a=ff(a,b,c,d,x[i+ 4], 7, -176418897);d=ff(d,a,b,c,x[i+ 5],12, 1200080426);
c=ff(c,d,a,b,x[i+ 6],17,-1473231341);b=ff(b,c,d,a,x[i+ 7],22, -45705983);a=ff(a,b,c,d,x[i+ 8], 7, 1770035416);
d=ff(d,a,b,c,x[i+ 9],12,-1958414417);c=ff(c,d,a,b,x[i+10],17, -42063);b=ff(b,c,d,a,x[i+11],22,-1990404162);
a=ff(a,b,c,d,x[i+12], 7, 1804603682);d=ff(d,a,b,c,x[i+13],12, -40341101);c=ff(c,d,a,b,x[i+14],17,-1502002290);
b=ff(b,c,d,a,x[i+15],22, 1236535329);a=gg(a,b,c,d,x[i+ 1], 5, -165796510);d=gg(d,a,b,c,x[i+ 6], 9,-1069501632);
c=gg(c,d,a,b,x[i+11],14, 643717713);b=gg(b,c,d,a,x[i+ 0],20, -373897302);a=gg(a,b,c,d,x[i+ 5], 5, -701558691);
d=gg(d,a,b,c,x[i+10], 9, 38016083);c=gg(c,d,a,b,x[i+15],14, -660478335);b=gg(b,c,d,a,x[i+ 4],20, -405537848);
a=gg(a,b,c,d,x[i+ 9], 5, 568446438);d=gg(d,a,b,c,x[i+14], 9,-1019803690);c=gg(c,d,a,b,x[i+ 3],14, -187363961);
b=gg(b,c,d,a,x[i+ 8],20, 1163531501);a=gg(a,b,c,d,x[i+13], 5,-1444681467);d=gg(d,a,b,c,x[i+ 2], 9, -51403784);
c=gg(c,d,a,b,x[i+ 7],14, 1735328473);b=gg(b,c,d,a,x[i+12],20,-1926607734);a=hh(a,b,c,d,x[i+ 5], 4, -378558);
d=hh(d,a,b,c,x[i+ 8],11,-2022574463);c=hh(c,d,a,b,x[i+11],16, 1839030562);b=hh(b,c,d,a,x[i+14],23, -35309556);
a=hh(a,b,c,d,x[i+ 1], 4,-1530992060);d=hh(d,a,b,c,x[i+ 4],11, 1272893353);c=hh(c,d,a,b,x[i+ 7],16, -155497632);
b=hh(b,c,d,a,x[i+10],23,-1094730640);a=hh(a,b,c,d,x[i+13], 4, 681279174);d=hh(d,a,b,c,x[i+ 0],11, -358537222);
c=hh(c,d,a,b,x[i+ 3],16, -722521979);b=hh(b,c,d,a,x[i+ 6],23, 76029189);a=hh(a,b,c,d,x[i+ 9], 4, -640364487);
d=hh(d,a,b,c,x[i+12],11, -421815835);c=hh(c,d,a,b,x[i+15],16, 530742520);b=hh(b,c,d,a,x[i+ 2],23, -995338651);
a=ii(a,b,c,d,x[i+ 0], 6, -198630844);d=ii(d,a,b,c,x[i+ 7],10, 1126891415);c=ii(c,d,a,b,x[i+14],15,-1416354905);
b=ii(b,c,d,a,x[i+ 5],21, -57434055);a=ii(a,b,c,d,x[i+12], 6, 1700485571);d=ii(d,a,b,c,x[i+ 3],10,-1894986606);
c=ii(c,d,a,b,x[i+10],15, -1051523);b=ii(b,c,d,a,x[i+ 1],21,-2054922799);a=ii(a,b,c,d,x[i+ 8], 6, 1873313359);
d=ii(d,a,b,c,x[i+15],10, -30611744);c=ii(c,d,a,b,x[i+ 6],15,-1560198380);b=ii(b,c,d,a,x[i+13],21, 1309151649);
a=ii(a,b,c,d,x[i+ 4], 6, -145523070);d=ii(d,a,b,c,x[i+11],10,-1120210379);c=ii(c,d,a,b,x[i+ 2],15, 718787259);
b=ii(b,c,d,a,x[i+ 9],21, -343485551);a=ad(a,olda);b=ad(b,oldb);c=ad(c,oldc);d=ad(d,oldd);
}
return rh(a)+rh(b)+rh(c)+rh(d);
}
export async function fetchData(route, options) {
let err;
const res = await api.fetchApi(route, options).catch(e => {
err = e;
});
if (!res) {
return {
status: 400,
error: new Error("Unknown Error")
}
}
const { status, statusText } = res;
if (err) {
return {
status,
error: err
}
}
if (status !== 200) {
return {
status,
error: new Error(statusText || "Unknown Error")
}
}
const data = await res.json();
if (!data) {
return {
status,
error: new Error(`Failed to load data: ${route}`)
}
}
return {
status,
data
}
}
export const icons = {
search: '<svg viewBox="0 0 24 24" width="100%" height="100%" pointer-events="none" xmlns="http://www.w3.org/2000/svg"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m21 21-4.486-4.494M19 10.5a8.5 8.5 0 1 1-17 0 8.5 8.5 0 0 1 17 0"/></svg>',
extensions: '<svg viewBox="64 64 896 896" width="100%" height="100%" pointer-events="none" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M843.5 737.4c-12.4-75.2-79.2-129.1-155.3-125.4S550.9 676 546 752c-153.5-4.8-208-40.7-199.1-113.7 3.3-27.3 19.8-41.9 50.1-49 18.4-4.3 38.8-4.9 57.3-3.2 1.7.2 3.5.3 5.2.5 11.3 2.7 22.8 5 34.3 6.8 34.1 5.6 68.8 8.4 101.8 6.6 92.8-5 156-45.9 159.2-132.7 3.1-84.1-54.7-143.7-147.9-183.6-29.9-12.8-61.6-22.7-93.3-30.2-14.3-3.4-26.3-5.7-35.2-7.2-7.9-75.9-71.5-133.8-147.8-134.4S189.7 168 180.5 243.8s40 146.3 114.2 163.9 149.9-23.3 175.7-95.1c9.4 1.7 18.7 3.6 28 5.8 28.2 6.6 56.4 15.4 82.4 26.6 70.7 30.2 109.3 70.1 107.5 119.9-1.6 44.6-33.6 65.2-96.2 68.6-27.5 1.5-57.6-.9-87.3-5.8-8.3-1.4-15.9-2.8-22.6-4.3-3.9-.8-6.6-1.5-7.8-1.8l-3.1-.6c-2.2-.3-5.9-.8-10.7-1.3-25-2.3-52.1-1.5-78.5 4.6-55.2 12.9-93.9 47.2-101.1 105.8-15.7 126.2 78.6 184.7 276 188.9 29.1 70.4 106.4 107.9 179.6 87 73.3-20.9 119.3-93.4 106.9-168.6M329.1 345.2a83.3 83.3 0 1 1 .01-166.61 83.3 83.3 0 0 1-.01 166.61M695.6 845a83.3 83.3 0 1 1 .01-166.61A83.3 83.3 0 0 1 695.6 845"/></svg>',
conflicts: '<svg viewBox="0 0 400 400" width="100%" height="100%" pointer-events="none" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="m397.2 350.4.2-.2-180-320-.2.2C213.8 24.2 207.4 20 200 20s-13.8 4.2-17.2 10.4l-.2-.2-180 320 .2.2c-1.6 2.8-2.8 6-2.8 9.6 0 11 9 20 20 20h360c11 0 20-9 20-20 0-3.6-1.2-6.8-2.8-9.6M220 340h-40v-40h40zm0-60h-40V120h40z"/></svg>',
passed: '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 426.667 426.667"><path fill="#6AC259" d="M213.333,0C95.518,0,0,95.514,0,213.333s95.518,213.333,213.333,213.333c117.828,0,213.333-95.514,213.333-213.333S331.157,0,213.333,0z M174.199,322.918l-93.935-93.931l31.309-31.309l62.626,62.622l140.894-140.898l31.309,31.309L174.199,322.918z"/></svg>',
download: '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" width="100%" height="100%" viewBox="0 0 32 32"><path fill="currentColor" d="M26 24v4H6v-4H4v4a2 2 0 0 0 2 2h20a2 2 0 0 0 2-2v-4zm0-10l-1.41-1.41L17 20.17V2h-2v18.17l-7.59-7.58L6 14l10 10l10-10z"></path></svg>'
}

View File

@ -1,17 +1,13 @@
import { app } from "../../scripts/app.js";
import { api } from "../../scripts/api.js"
import { $el } from "../../scripts/ui.js";
import { manager_instance, rebootAPI, install_via_git_url } from "./common.js";
import {
manager_instance, rebootAPI, install_via_git_url,
fetchData, md5, icons
} from "./common.js";
// https://cenfun.github.io/turbogrid/api.html
import TG from "./turbogrid.esm.js";
const icons = {
search: '<svg viewBox="0 0 24 24" width="100%" height="100%" pointer-events="none" xmlns="http://www.w3.org/2000/svg"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m21 21-4.486-4.494M19 10.5a8.5 8.5 0 1 1-17 0 8.5 8.5 0 0 1 17 0"/></svg>',
extensions: '<svg viewBox="64 64 896 896" width="100%" height="100%" pointer-events="none" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M843.5 737.4c-12.4-75.2-79.2-129.1-155.3-125.4S550.9 676 546 752c-153.5-4.8-208-40.7-199.1-113.7 3.3-27.3 19.8-41.9 50.1-49 18.4-4.3 38.8-4.9 57.3-3.2 1.7.2 3.5.3 5.2.5 11.3 2.7 22.8 5 34.3 6.8 34.1 5.6 68.8 8.4 101.8 6.6 92.8-5 156-45.9 159.2-132.7 3.1-84.1-54.7-143.7-147.9-183.6-29.9-12.8-61.6-22.7-93.3-30.2-14.3-3.4-26.3-5.7-35.2-7.2-7.9-75.9-71.5-133.8-147.8-134.4S189.7 168 180.5 243.8s40 146.3 114.2 163.9 149.9-23.3 175.7-95.1c9.4 1.7 18.7 3.6 28 5.8 28.2 6.6 56.4 15.4 82.4 26.6 70.7 30.2 109.3 70.1 107.5 119.9-1.6 44.6-33.6 65.2-96.2 68.6-27.5 1.5-57.6-.9-87.3-5.8-8.3-1.4-15.9-2.8-22.6-4.3-3.9-.8-6.6-1.5-7.8-1.8l-3.1-.6c-2.2-.3-5.9-.8-10.7-1.3-25-2.3-52.1-1.5-78.5 4.6-55.2 12.9-93.9 47.2-101.1 105.8-15.7 126.2 78.6 184.7 276 188.9 29.1 70.4 106.4 107.9 179.6 87 73.3-20.9 119.3-93.4 106.9-168.6M329.1 345.2a83.3 83.3 0 1 1 .01-166.61 83.3 83.3 0 0 1-.01 166.61M695.6 845a83.3 83.3 0 1 1 .01-166.61A83.3 83.3 0 0 1 695.6 845"/></svg>',
conflicts: '<svg viewBox="0 0 400 400" width="100%" height="100%" pointer-events="none" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="m397.2 350.4.2-.2-180-320-.2.2C213.8 24.2 207.4 20 200 20s-13.8 4.2-17.2 10.4l-.2-.2-180 320 .2.2c-1.6 2.8-2.8 6-2.8 9.6 0 11 9 20 20 20h360c11 0 20-9 20-20 0-3.6-1.2-6.8-2.8-9.6M220 340h-40v-40h40zm0-60h-40V120h40z"/></svg>'
}
const pageCss = `
.cn-manager {
--grid-font: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
@ -123,6 +119,7 @@ const pageCss = `
.cn-manager-grid .cn-node-name a {
color: skyblue;
text-decoration: none;
word-break: break-word;
}
.cn-manager-grid .cn-node-desc a {
@ -164,6 +161,7 @@ const pageCss = `
border-radius: 5px;
padding: 10px;
filter: drop-shadow(2px 5px 5px rgb(0 0 0 / 30%));
white-space: normal;
}
.cn-manager-grid .cn-extensions-list {
@ -258,7 +256,7 @@ const pageCss = `
left: 0;
}
100% {
left: -100px;
left: -105px;
}
}
@ -283,7 +281,7 @@ const pageCss = `
transparent 10px,
transparent 15px
);
animation: cn-btn-loading-bg 3s linear infinite;
animation: cn-btn-loading-bg 2s linear infinite;
}
.cn-manager-light .cn-node-name a {
@ -305,7 +303,7 @@ const pageHtml = `
<label>Filter
<select class="cn-manager-filter"></select>
</label>
<input class="cn-manager-keywords" type="search" placeholder="input search keyword" />
<input class="cn-manager-keywords" type="search" placeholder="Search" />
<div class="cn-manager-status"></div>
<div class="cn-flex-auto"></div>
<div class="cn-manager-channel"></div>
@ -613,59 +611,16 @@ export class CustomNodesManager {
const container = this.element.querySelector(".cn-manager-grid");
const grid = new TG.Grid(container);
this.grid = grid;
const autoHeightColumns = ['description', "alternatives"];
let prevViewRowsLength = 0;
let prevViewRowsLength = -1;
grid.bind('onUpdated', (e, d) => {
const viewRows = grid.viewRows;
if (viewRows.length !== prevViewRowsLength) {
prevViewRowsLength = viewRows.length;
this.showStatus(`${prevViewRowsLength} custom nodes`);
this.showStatus(`${prevViewRowsLength.toLocaleString()} custom nodes`);
}
const visibleRowList = grid.viewport.rows;
const rows = [];
const heights = [];
visibleRowList.forEach(function(viewIndex) {
// display index after filter is no equal global index
const rowItem = grid.getViewRowItem(viewIndex);
if (rowItem.rowHeightFixed) {
return;
}
const list = autoHeightColumns.map(k => {
const cellNode = grid.getCellNode(rowItem, k);
if (cellNode) {
const div = cellNode.querySelector('.tg-multiline-fixing');
// 10px is padding top and bottom
const realHeight = Math.max(TG.$(div).height() + 10, grid.options.rowHeight);
return realHeight;
}
}).filter(n => n);
if (list.length) {
rowItem.rowHeightFixed = true;
rows.push(rowItem);
heights.push(Math.max.apply(null, list));
}
});
if (!rows.length) {
return;
}
grid.setRowHeight(rows, heights);
});
grid.bind('onColumnWidthChanged', (e, d) => {
if (autoHeightColumns.includes(d.id)) {
// reset when column width changed
grid.forEachRow(function(row) {
row.rowHeightFixed = false;
});
}
});
grid.bind('onSelectChanged', (e, changes) => {
@ -691,10 +646,15 @@ export class CustomNodesManager {
frozenColumn: 1,
rowNotFound: "No Results",
rowHeight: 30 * 3 + 3 * 4,
rowHeight: 40,
bindWindowResize: true,
bindContainerResize: true,
cellResizeObserver: (rowItem, columnItem) => {
const autoHeightColumns = ['title', 'installed', 'description', "alternatives"];
return autoHeightColumns.includes(columnItem.id)
},
// updateGrid handler for filter and keywords
rowFilter: (rowItem) => {
@ -765,12 +725,10 @@ export class CustomNodesManager {
width: 200,
minWidth: 100,
maxWidth: 500,
classMap: 'tg-multiline cn-node-name',
classMap: 'cn-node-name',
formatter: (title, rowItem, columnItem) => {
return `<div class="tg-multiline-wrapper">
${rowItem.installed === 'Fail' ? '<font color="red"><B>(IMPORT FAILED)</B></font>' : ''}
<a href=${rowItem.reference} target="_blank"><b>${title}</b></a>
</div>`;
return `${rowItem.installed === 'Fail' ? '<font color="red"><B>(IMPORT FAILED)</B></font>' : ''}
<a href=${rowItem.reference} target="_blank"><b>${title}</b></a>`;
}
}, {
id: 'installed',
@ -793,19 +751,13 @@ export class CustomNodesManager {
width: 400,
maxWidth: 5000,
invisible: !this.hasAlternatives(),
classMap: 'tg-multiline cn-node-desc',
formatter: (alternatives, rowItem, columnItem) => {
return `<div class="tg-multiline-fixing">${alternatives}</div>`;
}
classMap: 'cn-node-desc'
}, {
id: 'description',
name: 'Description',
width: 400,
maxWidth: 5000,
classMap: 'tg-multiline cn-node-desc',
formatter: (description, rowItem, columnItem) => {
return `<div class="tg-multiline-fixing">${description}</div>`;
}
classMap: 'cn-node-desc'
}, {
id: "extensions",
name: "Extensions",
@ -856,7 +808,7 @@ export class CustomNodesManager {
}, {
id: 'author',
name: 'Author',
width: 100,
width: 120,
classMap: "cn-node-author",
formatter: (author, rowItem, columnItem) => {
if (rowItem.trust) {
@ -907,9 +859,6 @@ export class CustomNodesManager {
if (this.grid) {
this.grid.update();
if (this.hasAlternatives()) {
this.grid.forEachRow(function(row) {
row.rowHeightFixed = false;
});
this.grid.showColumn("alternatives");
} else {
this.grid.hideColumn("alternatives");
@ -1000,7 +949,7 @@ export class CustomNodesManager {
this.showStatus(`${label} ${item.title} ...`);
const data = item.originalData;
const res = await this.fetchData(`/customnode/${mode}`, {
const res = await fetchData(`/customnode/${mode}`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
@ -1049,53 +998,10 @@ export class CustomNodesManager {
// ===========================================================================================
async fetchData(route, options) {
let err;
const res = await api.fetchApi(route, options).catch(e => {
err = e;
});
if (!res) {
return {
status: 400,
error: new Error("Unknown Error")
}
}
const { status, statusText } = res;
if (err) {
return {
status,
error: err
}
}
if (status !== 200) {
return {
status,
error: new Error(statusText || "Unknown Error")
}
}
const data = await res.json();
if (!data) {
return {
status,
error: new Error(`Failed to load data: ${route}`)
}
}
return {
status,
data
}
}
// ===========================================================================================
async getExtensionMappings() {
const mode = manager_instance.datasrc_combo.value;
this.showStatus(`Loading extension mappings (${mode}) ...`);
const res = await this.fetchData(`/customnode/getmappings?mode=${mode}`);
const res = await fetchData(`/customnode/getmappings?mode=${mode}`);
if (res.error) {
console.log(res.error);
return {}
@ -1149,7 +1055,7 @@ export class CustomNodesManager {
async getMissingNodes() {
const mode = manager_instance.datasrc_combo.value;
this.showStatus(`Loading missing nodes (${mode}) ...`);
const res = await this.fetchData(`/customnode/getmappings?mode=${mode}`);
const res = await fetchData(`/customnode/getmappings?mode=${mode}`);
if (res.error) {
this.showError(`Failed to get custom node mappings: ${res.error}`);
return;
@ -1219,7 +1125,7 @@ export class CustomNodesManager {
}
}
const resUnresolved = await this.fetchData(`/component/get_unresolved`);
const resUnresolved = await fetchData(`/component/get_unresolved`);
const unresolved = resUnresolved.data;
if (unresolved && unresolved.nodes) {
unresolved.nodes.forEach(node_type => {
@ -1243,7 +1149,7 @@ export class CustomNodesManager {
const mode = manager_instance.datasrc_combo.value;
this.showStatus(`Loading alternatives (${mode}) ...`);
const res = await this.fetchData(`/customnode/alternatives?mode=${mode}`);
const res = await fetchData(`/customnode/alternatives?mode=${mode}`);
if (res.error) {
this.showError(`Failed to get alternatives: ${res.error}`);
return [];
@ -1285,7 +1191,7 @@ export class CustomNodesManager {
this.showStatus(`Loading custom nodes (${mode}) ...`);
const skip_update = this.show_mode === ShowMode.UPDATE ? "" : "&skip_update=true";
const res = await this.fetchData(`/customnode/getlist?mode=${mode}${skip_update}`);
const res = await fetchData(`/customnode/getlist?mode=${mode}${skip_update}`);
if (res.error) {
this.showError("Failed to get custom node list.");
this.hideLoading();
@ -1302,7 +1208,8 @@ export class CustomNodesManager {
for (const item of custom_nodes) {
item.originalData = JSON.parse(JSON.stringify(item));
item.hash = await calculateHash(item);
const message = item.title + item.files[0];
item.hash = md5(message);
}
const filterItem = this.getFilterItem(this.show_mode);
@ -1471,54 +1378,4 @@ export class CustomNodesManager {
close() {
this.element.style.display = "none";
}
}
// ===========================================================================================
async function calculateHash(item) {
const message = item.title + item.files[0];
return md5(message);
}
function md5(inputString) {
const hc = '0123456789abcdef';
const rh = n => {let j,s='';for(j=0;j<=3;j++) s+=hc.charAt((n>>(j*8+4))&0x0F)+hc.charAt((n>>(j*8))&0x0F);return s;}
const ad = (x,y) => {let l=(x&0xFFFF)+(y&0xFFFF);let m=(x>>16)+(y>>16)+(l>>16);return (m<<16)|(l&0xFFFF);}
const rl = (n,c) => (n<<c)|(n>>>(32-c));
const cm = (q,a,b,x,s,t) => ad(rl(ad(ad(a,q),ad(x,t)),s),b);
const ff = (a,b,c,d,x,s,t) => cm((b&c)|((~b)&d),a,b,x,s,t);
const gg = (a,b,c,d,x,s,t) => cm((b&d)|(c&(~d)),a,b,x,s,t);
const hh = (a,b,c,d,x,s,t) => cm(b^c^d,a,b,x,s,t);
const ii = (a,b,c,d,x,s,t) => cm(c^(b|(~d)),a,b,x,s,t);
const sb = x => {
let i;const nblk=((x.length+8)>>6)+1;const blks=[];for(i=0;i<nblk*16;i++) { blks[i]=0 };
for(i=0;i<x.length;i++) {blks[i>>2]|=x.charCodeAt(i)<<((i%4)*8);}
blks[i>>2]|=0x80<<((i%4)*8);blks[nblk*16-2]=x.length*8;return blks;
}
let i,x=sb(inputString),a=1732584193,b=-271733879,c=-1732584194,d=271733878,olda,oldb,oldc,oldd;
for(i=0;i<x.length;i+=16) {olda=a;oldb=b;oldc=c;oldd=d;
a=ff(a,b,c,d,x[i+ 0], 7, -680876936);d=ff(d,a,b,c,x[i+ 1],12, -389564586);c=ff(c,d,a,b,x[i+ 2],17, 606105819);
b=ff(b,c,d,a,x[i+ 3],22,-1044525330);a=ff(a,b,c,d,x[i+ 4], 7, -176418897);d=ff(d,a,b,c,x[i+ 5],12, 1200080426);
c=ff(c,d,a,b,x[i+ 6],17,-1473231341);b=ff(b,c,d,a,x[i+ 7],22, -45705983);a=ff(a,b,c,d,x[i+ 8], 7, 1770035416);
d=ff(d,a,b,c,x[i+ 9],12,-1958414417);c=ff(c,d,a,b,x[i+10],17, -42063);b=ff(b,c,d,a,x[i+11],22,-1990404162);
a=ff(a,b,c,d,x[i+12], 7, 1804603682);d=ff(d,a,b,c,x[i+13],12, -40341101);c=ff(c,d,a,b,x[i+14],17,-1502002290);
b=ff(b,c,d,a,x[i+15],22, 1236535329);a=gg(a,b,c,d,x[i+ 1], 5, -165796510);d=gg(d,a,b,c,x[i+ 6], 9,-1069501632);
c=gg(c,d,a,b,x[i+11],14, 643717713);b=gg(b,c,d,a,x[i+ 0],20, -373897302);a=gg(a,b,c,d,x[i+ 5], 5, -701558691);
d=gg(d,a,b,c,x[i+10], 9, 38016083);c=gg(c,d,a,b,x[i+15],14, -660478335);b=gg(b,c,d,a,x[i+ 4],20, -405537848);
a=gg(a,b,c,d,x[i+ 9], 5, 568446438);d=gg(d,a,b,c,x[i+14], 9,-1019803690);c=gg(c,d,a,b,x[i+ 3],14, -187363961);
b=gg(b,c,d,a,x[i+ 8],20, 1163531501);a=gg(a,b,c,d,x[i+13], 5,-1444681467);d=gg(d,a,b,c,x[i+ 2], 9, -51403784);
c=gg(c,d,a,b,x[i+ 7],14, 1735328473);b=gg(b,c,d,a,x[i+12],20,-1926607734);a=hh(a,b,c,d,x[i+ 5], 4, -378558);
d=hh(d,a,b,c,x[i+ 8],11,-2022574463);c=hh(c,d,a,b,x[i+11],16, 1839030562);b=hh(b,c,d,a,x[i+14],23, -35309556);
a=hh(a,b,c,d,x[i+ 1], 4,-1530992060);d=hh(d,a,b,c,x[i+ 4],11, 1272893353);c=hh(c,d,a,b,x[i+ 7],16, -155497632);
b=hh(b,c,d,a,x[i+10],23,-1094730640);a=hh(a,b,c,d,x[i+13], 4, 681279174);d=hh(d,a,b,c,x[i+ 0],11, -358537222);
c=hh(c,d,a,b,x[i+ 3],16, -722521979);b=hh(b,c,d,a,x[i+ 6],23, 76029189);a=hh(a,b,c,d,x[i+ 9], 4, -640364487);
d=hh(d,a,b,c,x[i+12],11, -421815835);c=hh(c,d,a,b,x[i+15],16, 530742520);b=hh(b,c,d,a,x[i+ 2],23, -995338651);
a=ii(a,b,c,d,x[i+ 0], 6, -198630844);d=ii(d,a,b,c,x[i+ 7],10, 1126891415);c=ii(c,d,a,b,x[i+14],15,-1416354905);
b=ii(b,c,d,a,x[i+ 5],21, -57434055);a=ii(a,b,c,d,x[i+12], 6, 1700485571);d=ii(d,a,b,c,x[i+ 3],10,-1894986606);
c=ii(c,d,a,b,x[i+10],15, -1051523);b=ii(b,c,d,a,x[i+ 1],21,-2054922799);a=ii(a,b,c,d,x[i+ 8], 6, 1873313359);
d=ii(d,a,b,c,x[i+15],10, -30611744);c=ii(c,d,a,b,x[i+ 6],15,-1560198380);b=ii(b,c,d,a,x[i+13],21, 1309151649);
a=ii(a,b,c,d,x[i+ 4], 6, -145523070);d=ii(d,a,b,c,x[i+11],10,-1120210379);c=ii(c,d,a,b,x[i+ 2],15, 718787259);
b=ii(b,c,d,a,x[i+ 9],21, -343485551);a=ad(a,olda);b=ad(b,oldb);c=ad(c,oldc);d=ad(d,oldd);
}
return rh(a)+rh(b)+rh(c)+rh(d);
}

View File

@ -1,388 +0,0 @@
import { app } from "../../scripts/app.js";
import { api } from "../../scripts/api.js"
import { ComfyDialog, $el } from "../../scripts/ui.js";
import { manager_instance, rebootAPI, show_message } from "./common.js";
async function install_model(target) {
if(ModelInstaller.instance) {
ModelInstaller.instance.startInstall(target);
try {
const response = await api.fetchApi('/model/install', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(target)
});
const status = await response.json();
app.ui.dialog.close();
target.installed = 'True';
return true;
}
catch(exception) {
show_message(`Install failed: ${target.title} / ${exception}`);
return false;
}
finally {
await ModelInstaller.instance.invalidateControl();
ModelInstaller.instance.updateMessage("<BR>To apply the installed model, please click the 'Refresh' button on the main menu.");
}
}
}
async function getModelList() {
var mode = manager_instance.datasrc_combo.value;
const response = await api.fetchApi(`/externalmodel/getlist?mode=${mode}`);
const data = await response.json();
return data;
}
export class ModelInstaller extends ComfyDialog {
static instance = null;
install_buttons = [];
message_box = null;
data = null;
clear() {
this.install_buttons = [];
this.message_box = null;
this.data = null;
}
constructor(app, manager_dialog) {
super();
this.manager_dialog = manager_dialog;
this.search_keyword = '';
this.element = $el("div.comfy-modal", { parent: document.body }, []);
}
createControls() {
return [
$el("button.cm-small-button", {
type: "button",
textContent: "Close",
onclick: () => { this.close(); }
})
];
}
startInstall(target) {
const self = ModelInstaller.instance;
self.updateMessage(`<BR><font color="green">Installing '${target.name}'</font>`);
for(let i in self.install_buttons) {
self.install_buttons[i].disabled = true;
self.install_buttons[i].style.backgroundColor = 'gray';
}
}
apply_searchbox(data) {
let keyword = this.search_box.value.toLowerCase();
for(let i in this.grid_rows) {
let data = this.grid_rows[i].data;
let content = data.name.toLowerCase() + data.type.toLowerCase() + data.base.toLowerCase() + data.filename.toLowerCase() + data.description.toLowerCase();
if(this.filter && this.filter != '*') {
if(this.filter != data.installed) {
this.grid_rows[i].control.style.display = 'none';
continue;
}
}
if(keyword == "")
this.grid_rows[i].control.style.display = null;
else if(content.includes(keyword)) {
this.grid_rows[i].control.style.display = null;
}
else {
this.grid_rows[i].control.style.display = 'none';
}
}
}
async invalidateControl() {
this.clear();
this.data = (await getModelList()).models;
while (this.element.children.length) {
this.element.removeChild(this.element.children[0]);
}
await this.createHeaderControls();
if(this.search_keyword) {
this.search_box.value = this.search_keyword;
}
await this.createGrid();
await this.createBottomControls();
this.apply_searchbox(this.data);
}
updateMessage(msg, btn_id) {
this.message_box.innerHTML = msg;
if(btn_id) {
const rebootButton = document.getElementById(btn_id);
const self = this;
rebootButton.addEventListener("click",
function() {
if(rebootAPI()) {
self.close();
self.manager_dialog.close();
}
});
}
}
async createGrid(models_json) {
var grid = document.createElement('table');
grid.setAttribute('id', 'external-models-grid');
var thead = document.createElement('thead');
var tbody = document.createElement('tbody');
var headerRow = document.createElement('tr');
thead.style.position = "sticky";
thead.style.top = "0px";
thead.style.borderCollapse = "collapse";
thead.style.tableLayout = "fixed";
var header1 = document.createElement('th');
header1.innerHTML = '&nbsp;&nbsp;ID&nbsp;&nbsp;';
header1.style.width = "20px";
var header2 = document.createElement('th');
header2.innerHTML = 'Type';
header2.style.width = "100px";
var header3 = document.createElement('th');
header3.innerHTML = 'Base';
header3.style.width = "100px";
var header4 = document.createElement('th');
header4.innerHTML = 'Name';
header4.style.width = "30%";
var header5 = document.createElement('th');
header5.innerHTML = 'Filename';
header5.style.width = "20%";
header5.style.tableLayout = "fixed";
var header6 = document.createElement('th');
header6.innerHTML = 'Description';
header6.style.width = "50%";
var header_down = document.createElement('th');
header_down.innerHTML = 'Download';
header_down.style.width = "50px";
thead.appendChild(headerRow);
headerRow.appendChild(header1);
headerRow.appendChild(header2);
headerRow.appendChild(header3);
headerRow.appendChild(header4);
headerRow.appendChild(header5);
headerRow.appendChild(header6);
headerRow.appendChild(header_down);
headerRow.style.backgroundColor = "Black";
headerRow.style.color = "White";
headerRow.style.textAlign = "center";
headerRow.style.width = "100%";
headerRow.style.padding = "0";
grid.appendChild(thead);
grid.appendChild(tbody);
this.grid_rows = {};
if(this.data)
for (var i = 0; i < this.data.length; i++) {
const data = this.data[i];
var dataRow = document.createElement('tr');
var data1 = document.createElement('td');
data1.style.textAlign = "center";
data1.innerHTML = i+1;
var data2 = document.createElement('td');
data2.innerHTML = `&nbsp;${data.type}`;
var data3 = document.createElement('td');
data3.innerHTML = `&nbsp;${data.base}`;
var data4 = document.createElement('td');
data4.className = "cm-node-name";
data4.innerHTML = `&nbsp;<a href=${data.reference} target="_blank"><font color="skyblue"><b>${data.name}</b></font></a>`;
var data5 = document.createElement('td');
data5.className = "cm-node-filename";
data5.innerHTML = `&nbsp;${data.filename}`;
data5.style.wordBreak = "break-all";
var data6 = document.createElement('td');
data6.className = "cm-node-desc";
data6.innerHTML = data.description;
data6.style.wordBreak = "break-all";
var data_install = document.createElement('td');
var installBtn = document.createElement('button');
data_install.style.textAlign = "center";
installBtn.innerHTML = 'Install';
this.install_buttons.push(installBtn);
switch(data.installed) {
case 'True':
installBtn.innerHTML = 'Installed';
installBtn.style.backgroundColor = 'green';
installBtn.style.color = 'white';
installBtn.disabled = true;
break;
default:
installBtn.innerHTML = 'Install';
installBtn.style.backgroundColor = 'black';
installBtn.style.color = 'white';
break;
}
installBtn.style.width = "100px";
installBtn.addEventListener('click', function() {
install_model(data);
});
data_install.appendChild(installBtn);
dataRow.style.backgroundColor = "var(--bg-color)";
dataRow.style.color = "var(--fg-color)";
dataRow.style.textAlign = "left";
dataRow.appendChild(data1);
dataRow.appendChild(data2);
dataRow.appendChild(data3);
dataRow.appendChild(data4);
dataRow.appendChild(data5);
dataRow.appendChild(data6);
dataRow.appendChild(data_install);
tbody.appendChild(dataRow);
this.grid_rows[i] = {data:data, control:dataRow};
}
let self = this;
const panel = document.createElement('div');
panel.style.width = "100%";
panel.appendChild(grid);
function handleResize() {
const parentHeight = self.element.clientHeight;
const gridHeight = parentHeight - 200;
grid.style.height = gridHeight + "px";
}
window.addEventListener("resize", handleResize);
grid.style.position = "relative";
grid.style.display = "inline-block";
grid.style.width = "100%";
grid.style.height = "100%";
grid.style.overflowY = "scroll";
this.element.style.height = "85%";
this.element.style.width = "80%";
this.element.appendChild(panel);
handleResize();
}
createFilterCombo() {
let combo = document.createElement("select");
combo.style.cssFloat = "left";
combo.style.fontSize = "14px";
combo.style.padding = "4px";
combo.style.background = "black";
combo.style.marginLeft = "2px";
combo.style.width = "199px";
combo.id = `combo-manger-filter`;
combo.style.borderRadius = "15px";
let items =
[
{ value:'*', text:'Filter: all' },
{ value:'True', text:'Filter: installed' },
{ value:'False', text:'Filter: not-installed' },
];
items.forEach(item => {
const option = document.createElement("option");
option.value = item.value;
option.text = item.text;
combo.appendChild(option);
});
let self = this;
combo.addEventListener('change', function(event) {
self.filter = event.target.value;
self.apply_searchbox();
});
return combo;
}
createHeaderControls() {
let self = this;
this.search_box = $el('input.cm-search-filter', {type:'text', id:'manager-model-search-box', placeholder:'input search keyword', value:this.search_keyword}, []);
this.search_box.style.height = "25px";
this.search_box.onkeydown = (event) => {
if (event.key === 'Enter') {
self.search_keyword = self.search_box.value;
self.apply_searchbox();
}
if (event.key === 'Escape') {
self.search_keyword = self.search_box.value;
self.apply_searchbox();
}
};
let search_button = document.createElement("button");
search_button.className = "cm-small-button";
search_button.innerHTML = "Search";
search_button.onclick = () => {
self.search_keyword = self.search_box.value;
self.apply_searchbox();
};
search_button.style.display = "inline-block";
let filter_control = this.createFilterCombo();
filter_control.style.display = "inline-block";
let cell = $el('td', {width:'100%'}, [filter_control, this.search_box, ' ', search_button]);
let search_control = $el('table', {width:'100%'},
[
$el('tr', {}, [cell])
]
);
cell.style.textAlign = "right";
this.element.appendChild(search_control);
}
async createBottomControls() {
var close_button = document.createElement("button");
close_button.className = "cm-small-button";
close_button.innerHTML = "Close";
close_button.onclick = () => { this.close(); }
close_button.style.display = "inline-block";
this.message_box = $el('div', {id:'custom-download-message'}, [$el('br'), '']);
this.message_box.style.height = '60px';
this.message_box.style.verticalAlign = 'middle';
this.element.appendChild(this.message_box);
this.element.appendChild(close_button);
}
async show() {
try {
this.invalidateControl();
this.element.style.display = "block";
this.element.style.zIndex = 10001;
}
catch(exception) {
app.ui.dialog.show(`Failed to get external model list. / ${exception}`);
}
}
}

891
js/model-manager.js Normal file
View File

@ -0,0 +1,891 @@
import { $el } from "../../scripts/ui.js";
import {
manager_instance, rebootAPI,
fetchData, md5, icons
} from "./common.js";
// https://cenfun.github.io/turbogrid/api.html
import TG from "./turbogrid.esm.js";
const pageCss = `
.cmm-manager {
--grid-font: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
z-index: 10001;
width: 80%;
height: 80%;
display: flex;
flex-direction: column;
gap: 10px;
color: var(--fg-color);
font-family: arial, sans-serif;
}
.cmm-manager .cmm-flex-auto {
flex: auto;
}
.cmm-manager button {
font-size: 16px;
color: var(--input-text);
background-color: var(--comfy-input-bg);
border-radius: 8px;
border-color: var(--border-color);
border-style: solid;
margin: 0;
padding: 4px 8px;
min-width: 100px;
}
.cmm-manager button:disabled,
.cmm-manager input:disabled,
.cmm-manager select:disabled {
color: gray;
}
.cmm-manager button:disabled {
background-color: var(--comfy-input-bg);
}
.cmm-manager-header {
display: flex;
flex-wrap: wrap;
gap: 5px;
align-items: center;
padding: 0 5px;
}
.cmm-manager-header label {
display: flex;
gap: 5px;
align-items: center;
}
.cmm-manager-type,
.cmm-manager-base,
.cmm-manager-filter {
height: 28px;
line-height: 28px;
}
.cmm-manager-keywords {
height: 28px;
line-height: 28px;
padding: 0 5px 0 26px;
background-size: 16px;
background-position: 5px center;
background-repeat: no-repeat;
background-image: url("data:image/svg+xml;charset=utf8,${encodeURIComponent(icons.search.replace("currentColor", "#888"))}");
}
.cmm-manager-status {
padding-left: 10px;
}
.cmm-manager-grid {
flex: auto;
border: 1px solid var(--border-color);
overflow: hidden;
}
.cmm-manager-selection {
display: flex;
flex-wrap: wrap;
gap: 10px;
align-items: center;
}
.cmm-manager-message {
}
.cmm-manager-footer {
display: flex;
flex-wrap: wrap;
gap: 10px;
align-items: center;
}
.cmm-manager-grid .tg-turbogrid {
font-family: var(--grid-font);
font-size: 15px;
background: var(--bg-color);
}
.cmm-manager-grid .cmm-node-name a {
color: skyblue;
text-decoration: none;
word-break: break-word;
}
.cmm-manager-grid .cmm-node-desc a {
color: #5555FF;
font-weight: bold;
text-decoration: none;
}
.cmm-manager-grid .tg-cell a:hover {
text-decoration: underline;
}
.cmm-icon-passed {
width: 20px;
height: 20px;
position: absolute;
left: calc(50% - 10px);
top: calc(50% - 10px);
}
.cmm-manager .cmm-btn-enable {
background-color: blue;
color: white;
}
.cmm-manager .cmm-btn-disable {
background-color: MediumSlateBlue;
color: white;
}
.cmm-manager .cmm-btn-install {
background-color: black;
color: white;
}
.cmm-btn-download {
width: 18px;
height: 18px;
position: absolute;
left: calc(50% - 10px);
top: calc(50% - 10px);
cursor: pointer;
opacity: 0.8;
color: #fff;
}
.cmm-btn-download:hover {
opacity: 1;
}
.cmm-manager-light .cmm-btn-download {
color: #000;
}
@keyframes cmm-btn-loading-bg {
0% {
left: 0;
}
100% {
left: -105px;
}
}
.cmm-manager button.cmm-btn-loading {
position: relative;
overflow: hidden;
border-color: rgb(0 119 207 / 80%);
background-color: var(--comfy-input-bg);
}
.cmm-manager button.cmm-btn-loading::after {
position: absolute;
top: 0;
left: 0;
content: "";
width: 500px;
height: 100%;
background-image: repeating-linear-gradient(
-45deg,
rgb(0 119 207 / 30%),
rgb(0 119 207 / 30%) 10px,
transparent 10px,
transparent 15px
);
animation: cmm-btn-loading-bg 2s linear infinite;
}
.cmm-manager-light .cmm-node-name a {
color: blue;
}
.cmm-manager-light .cm-warn-note {
background-color: #ccc !important;
}
.cmm-manager-light .cmm-btn-install {
background-color: #333;
}
`;
const pageHtml = `
<div class="cmm-manager-header">
<label>Filter
<select class="cmm-manager-filter"></select>
</label>
<label>Type
<select class="cmm-manager-type"></select>
</label>
<label>Base
<select class="cmm-manager-base"></select>
</label>
<input class="cmm-manager-keywords" type="search" placeholder="Search" />
<div class="cmm-manager-status"></div>
<div class="cmm-flex-auto"></div>
</div>
<div class="cmm-manager-grid"></div>
<div class="cmm-manager-selection"></div>
<div class="cmm-manager-message"></div>
<div class="cmm-manager-footer">
<button class="cmm-manager-close">Close</button>
<div class="cmm-flex-auto"></div>
</div>
`;
export class ModelManager {
static instance = null;
constructor(app, manager_dialog) {
this.app = app;
this.manager_dialog = manager_dialog;
this.id = "cmm-manager";
this.filter = '';
this.type = '';
this.base = '';
this.keywords = '';
this.init();
}
init() {
if (!document.querySelector(`style[context="${this.id}"]`)) {
const $style = document.createElement("style");
$style.setAttribute("context", this.id);
$style.innerHTML = pageCss;
document.head.appendChild($style);
}
this.element = $el("div", {
parent: document.body,
className: "comfy-modal cmm-manager"
});
this.element.innerHTML = pageHtml;
this.initFilter();
this.bindEvents();
this.initGrid();
}
initFilter() {
this.filterList = [{
label: "All",
value: ""
}, {
label: "Installed",
value: "True"
}, {
label: "Not Installed",
value: "False"
}];
this.typeList = [{
label: "All",
value: ""
}];
this.baseList = [{
label: "All",
value: ""
}];
this.updateFilter();
}
updateFilter() {
const $filter = this.element.querySelector(".cmm-manager-filter");
$filter.innerHTML = this.filterList.map(item => {
const selected = item.value === this.filter ? " selected" : "";
return `<option value="${item.value}"${selected}>${item.label}</option>`
}).join("");
const $type = this.element.querySelector(".cmm-manager-type");
$type.innerHTML = this.typeList.map(item => {
const selected = item.value === this.type ? " selected" : "";
return `<option value="${item.value}"${selected}>${item.label}</option>`
}).join("");
const $base = this.element.querySelector(".cmm-manager-base");
$base.innerHTML = this.baseList.map(item => {
const selected = item.value === this.base ? " selected" : "";
return `<option value="${item.value}"${selected}>${item.label}</option>`
}).join("");
}
bindEvents() {
const eventsMap = {
".cmm-manager-filter": {
change: (e) => {
this.filter = e.target.value;
this.updateGrid();
}
},
".cmm-manager-type": {
change: (e) => {
this.type = e.target.value;
this.updateGrid();
}
},
".cmm-manager-base": {
change: (e) => {
this.base = e.target.value;
this.updateGrid();
}
},
".cmm-manager-keywords": {
input: (e) => {
const keywords = `${e.target.value}`.trim();
if (keywords !== this.keywords) {
this.keywords = keywords;
this.updateGrid();
}
},
focus: (e) => e.target.select()
},
".cmm-manager-selection": {
click: (e) => {
const target = e.target;
const mode = target.getAttribute("mode");
if (mode === "install") {
this.installModels(this.selectedModels, target);
}
}
},
".cmm-manager-close": {
click: (e) => this.close()
},
};
Object.keys(eventsMap).forEach(selector => {
const target = this.element.querySelector(selector);
if (target) {
const events = eventsMap[selector];
if (events) {
Object.keys(events).forEach(type => {
target.addEventListener(type, events[type]);
});
}
}
});
}
// ===========================================================================================
initGrid() {
const container = this.element.querySelector(".cmm-manager-grid");
const grid = new TG.Grid(container);
this.grid = grid;
grid.bind('onUpdated', (e, d) => {
this.showStatus(`${grid.viewRows.length.toLocaleString()} external models`);
});
grid.bind('onSelectChanged', (e, changes) => {
this.renderSelected();
});
grid.bind('onClick', (e, d) => {
const { rowItem } = d;
const target = d.e.target;
const mode = target.getAttribute("mode");
if (mode === "install") {
this.installModels([rowItem], target);
}
});
grid.setOption({
theme: 'dark',
selectVisible: true,
selectMultiple: true,
selectAllVisible: true,
textSelectable: true,
scrollbarRound: true,
frozenColumn: 1,
rowNotFound: "No Results",
rowHeight: 40,
bindWindowResize: true,
bindContainerResize: true,
cellResizeObserver: (rowItem, columnItem) => {
const autoHeightColumns = ['name', 'description'];
return autoHeightColumns.includes(columnItem.id)
},
// updateGrid handler for filter and keywords
rowFilter: (rowItem) => {
const searchableColumns = ["name", "type", "base", "description", "filename", "save_path"];
let shouldShown = grid.highlightKeywordsFilter(rowItem, searchableColumns, this.keywords);
if (shouldShown) {
if(this.filter && rowItem.installed !== this.filter) {
return false;
}
if(this.type && rowItem.type !== this.type) {
return false;
}
if(this.base && rowItem.base !== this.base) {
return false;
}
}
return shouldShown;
}
});
}
renderGrid() {
// update theme
const colorPalette = this.app.ui.settings.settingsValues['Comfy.ColorPalette'];
Array.from(this.element.classList).forEach(cn => {
if (cn.startsWith("cmm-manager-")) {
this.element.classList.remove(cn);
}
});
this.element.classList.add(`cmm-manager-${colorPalette}`);
const options = {
theme: colorPalette === "light" ? "" : "dark"
};
const rows = this.modelList || [];
const columns = [{
id: 'id',
name: 'ID',
width: 50,
align: 'center'
}, {
id: 'name',
name: 'Name',
width: 200,
minWidth: 100,
maxWidth: 500,
classMap: 'cmm-node-name',
formatter: function(name, rowItem, columnItem, cellNode) {
return `<a href=${rowItem.reference} target="_blank"><b>${name}</b></a>`;
}
}, {
id: 'installed',
name: 'Install',
width: 130,
minWidth: 110,
maxWidth: 200,
sortable: false,
align: 'center',
formatter: (installed, rowItem, columnItem) => {
if (rowItem.refresh) {
return `<font color="red">Refresh Required</span>`;
}
if (installed === "True") {
return `<div class="cmm-icon-passed">${icons.passed}</div>`;
}
return `<button class="cmm-btn-install" mode="install">Install</button>`;
}
}, {
id: 'url',
name: '',
width: 50,
sortable: false,
align: 'center',
formatter: (url, rowItem, columnItem) => {
return `<a class="cmm-btn-download" title="Download file" href="${url}" target="_blank">${icons.download}</a>`;
}
}, {
id: 'size',
name: 'Size',
width: 100,
formatter: (size) => {
if (typeof size === "number") {
return this.formatSize(size);
}
return size;
}
}, {
id: 'type',
name: 'Type',
width: 100
}, {
id: 'base',
name: 'Base'
}, {
id: 'description',
name: 'Description',
width: 400,
maxWidth: 5000,
classMap: 'cmm-node-desc'
}, {
id: "save_path",
name: 'Save Path',
width: 200
}, {
id: 'filename',
name: 'Filename',
width: 200
}];
this.grid.setData({
options,
rows,
columns
});
this.grid.render();
}
updateGrid() {
if (this.grid) {
this.grid.update();
}
}
// ===========================================================================================
renderSelected() {
const selectedList = this.grid.getSelectedRows();
if (!selectedList.length) {
this.showSelection("");
this.selectedModels = [];
return;
}
this.selectedModels = selectedList;
this.showSelection(`<span>Selected <b>${selectedList.length}</b> models <button class="cmm-btn-install" mode="install">Install</button>`);
}
focusInstall(item) {
const cellNode = this.grid.getCellNode(item, "installed");
if (cellNode) {
const cellBtn = cellNode.querySelector(`button[mode="install"]`);
if (cellBtn) {
cellBtn.classList.add("cmm-btn-loading");
return true
}
}
}
async installModels(list, btn) {
btn.classList.add("cmm-btn-loading");
this.showLoading();
this.showError("");
let needRestart = false;
let errorMsg = "";
for (const item of list) {
this.grid.scrollRowIntoView(item);
if (!this.focusInstall(item)) {
this.grid.onNextUpdated(() => {
this.focusInstall(item);
});
}
this.showStatus(`Install ${item.name} ...`);
const data = item.originalData;
const res = await fetchData('/model/install', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
});
if (res.error) {
errorMsg = `Install failed: ${item.name} ${res.error.message}`;
break;;
}
needRestart = true;
this.grid.setRowSelected(item, false);
item.refresh = true;
item.selectable = false;
this.grid.updateCell(item, "installed");
this.grid.updateCell(item, "tg-column-select");
this.showStatus(`Install ${item.name} successfully`);
}
this.hideLoading();
btn.classList.remove("cmm-btn-loading");
if (errorMsg) {
this.showError(errorMsg);
} else {
this.showStatus(`Install ${list.length} models successfully`);
}
if (needRestart) {
this.showMessage(`To apply the installed model, please click the 'Refresh' button on the main menu.`, "red")
}
}
getModelList(models) {
const typeMap = new Map();
const baseMap = new Map();
models.forEach((item, i) => {
const { type, base, name, reference, installed } = item;
item.originalData = JSON.parse(JSON.stringify(item));
item.size = this.sizeToBytes(item.size);
item.hash = md5(name + reference);
item.id = i + 1;
if (installed === "True") {
item.selectable = false;
}
typeMap.set(type, type);
baseMap.set(base, base);
});
const typeList = [];
typeMap.forEach(type => {
typeList.push({
label: type,
value: type
});
});
typeList.sort((a,b)=> {
const au = a.label.toUpperCase();
const bu = b.label.toUpperCase();
if (au !== bu) {
return au > bu ? 1 : -1;
}
return 0;
});
this.typeList = [{
label: "All",
value: ""
}].concat(typeList);
const baseList = [];
baseMap.forEach(base => {
baseList.push({
label: base,
value: base
});
});
baseList.sort((a,b)=> {
const au = a.label.toUpperCase();
const bu = b.label.toUpperCase();
if (au !== bu) {
return au > bu ? 1 : -1;
}
return 0;
});
this.baseList = [{
label: "All",
value: ""
}].concat(baseList);
return models;
}
// ===========================================================================================
async loadData() {
this.showLoading();
this.showStatus(`Loading external model list ...`);
const mode = manager_instance.datasrc_combo.value;
const res = await fetchData(`/externalmodel/getlist?mode=${mode}`);
if (res.error) {
this.showError("Failed to get external model list.");
this.hideLoading();
return
}
const { models } = res.data;
this.modelList = this.getModelList(models);
// console.log("models", this.modelList);
this.updateFilter();
this.renderGrid();
this.hideLoading();
}
// ===========================================================================================
formatSize(v) {
const base = 1000;
const units = ['', 'K', 'M', 'G', 'T', 'P'];
const space = '';
const postfix = 'B';
if (v <= 0) {
return `0${space}${postfix}`;
}
for (let i = 0, l = units.length; i < l; i++) {
const min = Math.pow(base, i);
const max = Math.pow(base, i + 1);
if (v > min && v <= max) {
const unit = units[i];
if (unit) {
const n = v / min;
const nl = n.toString().split('.')[0].length;
const fl = Math.max(3 - nl, 1);
v = n.toFixed(fl);
}
v = v + space + unit + postfix;
break;
}
}
return v;
}
// for size sort
sizeToBytes(v) {
if (typeof v === "number") {
return v;
}
if (typeof v === "string") {
const n = parseFloat(v);
const unit = v.replace(/[0-9.B]+/g, "").trim().toUpperCase();
if (unit === "K") {
return n * 1000;
}
if (unit === "M") {
return n * 1000 * 1000;
}
if (unit === "G") {
return n * 1000 * 1000 * 1000;
}
if (unit === "T") {
return n * 1000 * 1000 * 1000 * 1000;
}
}
return v;
}
showSelection(msg) {
this.element.querySelector(".cmm-manager-selection").innerHTML = msg;
}
showError(err) {
this.showMessage(err, "red");
}
showMessage(msg, color) {
if (color) {
msg = `<font color="${color}">${msg}</font>`;
}
this.element.querySelector(".cmm-manager-message").innerHTML = msg;
}
showStatus(msg, color) {
if (color) {
msg = `<font color="${color}">${msg}</font>`;
}
this.element.querySelector(".cmm-manager-status").innerHTML = msg;
}
showLoading() {
this.setDisabled(true);
if (this.grid) {
this.grid.showLoading();
this.grid.showMask({
opacity: 0.05
});
}
}
hideLoading() {
this.setDisabled(false);
if (this.grid) {
this.grid.hideLoading();
this.grid.hideMask();
}
}
setDisabled(disabled) {
const $close = this.element.querySelector(".cmm-manager-close");
const list = [
".cmm-manager-header input",
".cmm-manager-header select",
".cmm-manager-footer button",
".cmm-manager-selection button"
].map(s => {
return Array.from(this.element.querySelectorAll(s));
})
.flat()
.filter(it => {
return it !== $close;
});
list.forEach($elem => {
if (disabled) {
$elem.setAttribute("disabled", "disabled");
} else {
$elem.removeAttribute("disabled");
}
});
Array.from(this.element.querySelectorAll(".cmm-btn-loading")).forEach($elem => {
$elem.classList.remove("cmm-btn-loading");
});
}
setKeywords(keywords = "") {
this.keywords = keywords;
this.element.querySelector(".cmm-manager-keywords").value = keywords;
}
show() {
this.element.style.display = "flex";
this.setKeywords("");
this.showSelection("");
this.showMessage("");
this.loadData();
}
close() {
this.element.style.display = "none";
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -9,40 +9,241 @@
"description": "If you see this message, your ComfyUI-Manager is outdated.\nDev channel provides only the list of the developing nodes. If you want to find the complete node list, please go to the Default channel."
},
{
"author": "zhulu111",
"title": "ComfyUI_Bxb [UNSAFE]",
"id": "ComfyUI_Bxb",
"reference": "https://github.com/zhulu111/ComfyUI_Bxb",
"author": "kijai",
"title": "MimicMotion wrapper for ComfyUI [WIP]",
"id": "mimicmotion-wrapper",
"reference": "https://github.com/kijai/ComfyUI-MimicMotionWrapper",
"files": [
"https://github.com/zhulu111/ComfyUI_Bxb"
"https://github.com/kijai/ComfyUI-MimicMotionWrapper"
],
"install_type": "git-clone",
"description": "sdBxb, a tool that converts ComfyUI workflows into WeChat Mini Program, Douyin Mini Program, and H5 with one click, and supports payments."
"description": "Original repo: [a/https://github.com/tencent/MimicMotion](https://github.com/tencent/MimicMotion)"
},
{
"author": "mingqizhang",
"title": "ComfyUI_tool_zmq",
"id": "tool-zmq",
"reference": "https://github.com/mingqizhang/ComfyUI_tool_zmq",
"author": "thderoo",
"title": "_topfun_s_nodes",
"reference": "https://github.com/thderoo/ComfyUI-_topfun_s_nodes",
"files": [
"https://github.com/mingqizhang/ComfyUI_tool_zmq"
"https://github.com/thderoo/ComfyUI-_topfun_s_nodes"
],
"install_type": "git-clone",
"description": "Nodes:ImageConcat, ImageFlip, DWposeTransform, PoseFilter, DrawPose, ReplaceImgae, LoadImageFromPath."
"description": "Nodes:Conditioning Perturbation"
},
{
"author": "willblaschko",
"title": "ComfyUI-Unload-Models",
"reference": "https://github.com/willblaschko/ComfyUI-Unload-Models",
"files": [
"https://github.com/willblaschko/ComfyUI-Unload-Models"
],
"install_type": "git-clone",
"description": "This repository provides developers with a way to better manage their ComfyUI model memory. It includes nodes that allow developers to either unload all models or unload one model at a time. These nodes are designed as pass-through nodes, so they can be used anywhere in the flow. The nodes can be found in the 'Unload Model' section.[w/These are massive hammers, and it could be possible to break things, please don't use them if you need finesse.]"
},
{
"author": "kijai",
"title": "ComfyUI-LuminaWrapper [WIP]",
"id": "luminawrapper",
"reference": "https://github.com/kijai/ComfyUI-LuminaWrapper",
"title": "ComfyUI-OpenDiTWrapper [WIP]",
"id": "open-dit-wrapper",
"reference": "https://github.com/kijai/ComfyUI-OpenDiTWrapper",
"files": [
"https://github.com/kijai/ComfyUI-LuminaWrapper"
"https://github.com/kijai/ComfyUI-OpenDiTWrapper"
],
"install_type": "git-clone",
"description": "NOTE:Currently requires flash_attn!"
"description": "Original repo: [a/https://github.com/NUS-HPC-AI-Lab/OpenDiT](https://github.com/NUS-HPC-AI-Lab/OpenDiT)"
},
{
"author": "GeekyGhost",
"title": "ComfyUI-GeekyRemB v2",
"reference": "https://github.com/GeekyGhost/ComfyUI-GeekyRemB",
"files": [
"https://github.com/GeekyGhost/ComfyUI-GeekyRemB/raw/SketchUITest/GeekyRembv2.py"
],
"install_type": "copy",
"description": "GeekyRemB Node Description: GeekyRemB is a powerful and versatile image processing node for ComfyUI, designed to remove backgrounds from images with advanced customization options. This node leverages the rembg library and offers a wide range of features for fine-tuning the background removal process and enhancing the resulting images."
},
{
"author": "AIFSH",
"title": "ComfyUI-OpenDIT [WIP]",
"id": "opendit",
"reference": "https://github.com/AIFSH/ComfyUI-OpenDIT",
"files": [
"https://github.com/AIFSH/ComfyUI-OpenDIT"
],
"install_type": "git-clone",
"description": "make [a/OpenDIT](https://github.com/NUS-HPC-AI-Lab/OpenDiT) avaliable in ComfyUI"
},
{
"author": "alexisrolland",
"title": "alexisrolland/ComfyUI-AuraSR",
"id": "aurasr-alexisrolland",
"reference": "https://github.com/alexisrolland/ComfyUI-AuraSR",
"files": [
"https://github.com/alexisrolland/ComfyUI-AuraSR"
],
"install_type": "git-clone",
"description": "Custom ComfyUI nodes to run [a/fal-ai/AuraSR](https://huggingface.co/fal-ai/AuraSR) model.[w/This node cannot be installed simultaneously with AIFSH/ComfyUI-AuraSR due to overlapping repository names.]"
},
{
"author": "mingqizhang",
"title": "ComfyUI_AEMatter_zmq",
"id": "aematter",
"reference": "https://github.com/mingqizhang/ComfyUI_AEMatter_zmq",
"files": [
"https://github.com/mingqizhang/ComfyUI_AEMatter_zmq"
],
"install_type": "git-clone",
"description": "Nodes:AEMatter_ModelLoader, Create_Trimap, AEMatter_Apply, Mask_Transfor, Replace_Background, Gaussian_Filter, Guide_Filter, Improved_Aplha_Composite"
},
{
"author": "m-ai-studio",
"title": "mai-prompt-progress",
"reference": "https://github.com/m-ai-studio/mai-prompt-progress",
"files": [
"https://github.com/m-ai-studio/mai-prompt-progress"
],
"install_type": "git-clone",
"description": "mai-prompt-progress"
},
{
"author": "linhusyung",
"title": "ComfyUI Build and Train Your Network [WIP]",
"id": "cfgpp",
"reference": "https://github.com/linhusyung/comfyui-Build-and-train-your-network",
"files": [
"https://github.com/linhusyung/comfyui-Build-and-train-your-network"
],
"install_type": "git-clone",
"description": "Stable Diffusion is an image generation technique based on diffusion models. Its core idea involves simulating diffusion processes by iteratively adding noise and using neural networks to predict and remove the noise, thereby generating high-quality images. This approach is not limited to image generation; with appropriate network architecture and training data, it can be adapted for various other tasks. The application of neural networks extends beyond image generation. By adjusting network structures and loss functions, neural networks can also perform tasks such as classification and regression. This flexibility makes neural networks a powerful tool for handling a wide range of machine learning tasks. This project aims to expand custom neural network layers (such as linear layers, convolutional layers, etc.) within ComfyUI and provide simplified task training functionalities. Through this project, users can easily construct custom neural network layers and perform training in ComfyUI using a graphical interface."
},
{
"author": "alexgenovese",
"title": "comfyui_CfgPlusPlus [WIP]",
"id": "cfgpp",
"reference": "https://gitea.com/NotEvilGirl/cfgpp",
"files": [
"https://gitea.com/NotEvilGirl/cfgpp"
],
"install_type": "git-clone",
"description": "CFG++ implemented according to [a/https://cfgpp-diffusion.github.io](https://cfgpp-diffusion.github.io). Basically modified DDIM sampler that makes sampling work at low CFG values (0 ~ 2). Read the CFG++ paper for more details"
},
{
"author": "Fucci-Mateo",
"title": "ComfyUI-Airtable [WIP]",
"id": "airtable",
"reference": "https://github.com/Fucci-Mateo/ComfyUI-Airtable",
"files": [
"https://github.com/Fucci-Mateo/ComfyUI-Airtable"
],
"install_type": "git-clone",
"description": "A simple node to load image from local path or http url. You can find this node from 'image' category."
},
{
"author": "mingqizhang",
"title": "ComfyUI_AEMatter_zmq",
"id": "aematter-zmq",
"reference": "https://github.com/mingqizhang/ComfyUI_AEMatter_zmq",
"files": [
"https://github.com/mingqizhang/ComfyUI_AEMatter_zmq"
],
"install_type": "git-clone",
"description": "Nodes:AEMatter_ModelLoader, Create_Trimap, AEMatter_Apply, Mask_Transfor, Replace_Background, Gaussian_Filter, Guide_Filter"
},
{
"author": "majorsauce",
"title": "comfyui_indieTools [WIP]",
"id": "indie-tools",
"reference": "https://github.com/majorsauce/comfyui_indieTools",
"files": [
"https://github.com/majorsauce/comfyui_indieTools"
],
"install_type": "git-clone",
"description": "Nodes:[Indie] Cut by Mask, [Indie] Paste Image, [Indie] Local Scale, [Indie] Solidify, [Indie] Yolo Detector.[w/Install may fail due to invliad requirements.txt file]"
},
{
"author": "AIFSH",
"title": "ComfyUI-ViViD",
"id": "vivid",
"reference": "https://github.com/AIFSH/ComfyUI-ViViD",
"files": [
"https://github.com/AIFSH/ComfyUI-ViViD"
],
"install_type": "git-clone",
"description": "a comfyui custom node for ViViD"
},
{
"author": "NeuralNotW0rk",
"title": "ComfyUI-Waveform-Extensions",
"reference": "https://github.com/NeuralNotW0rk/ComfyUI-Waveform-Extensions",
"files": [
"https://github.com/NeuralNotW0rk/ComfyUI-Waveform-Extensions/raw/main/EXT_VariationUtils.py",
"https://github.com/NeuralNotW0rk/ComfyUI-Waveform-Extensions/raw/main/EXT_AudioManipulation.py"
],
"install_type": "copy",
"description": "Some additional audio utilites for use on top of Sample Diffusion ComfyUI Extension"
},
{
"author": "mingqizhang",
"title": "ComfyUI_AEMatter_zmq",
"reference": "https://github.com/mingqizhang/ComfyUI_AEMatter_zmq",
"files": [
"https://github.com/mingqizhang/ComfyUI_AEMatter_zmq"
],
"install_type": "git-clone",
"description": "Nodes:AEMatter_ModelLoader, Create_Trimap, AEMatter_Apply, Mask_Transfor, Replace_Background, Gaussian_Filter, Guide_Filter."
},
{
"author": "nat-chan",
"title": "comfyui-paint",
"reference": "https://github.com/nat-chan/comfyui-paint",
"files": [
"https://github.com/nat-chan/comfyui-paint"
],
"install_type": "git-clone",
"description": "comfyui-paint\n[w/You need to clone submodule manually after clone. There is permission issue.]"
},
{
"author": "prabinpebam",
"title": "anyPython [UNSAFE]",
"reference": "https://github.com/prabinpebam/anyPython",
"files": [
"https://github.com/prabinpebam/anyPython"
],
"install_type": "git-clone",
"description": "This node was inspired by AnyNode. I wanted to have a node where I can paste any python script and execute it. That way I can use this node in combination with a Custom node like the Ollama node that can generate the python code and feed into this node. This also makes it much easier to debug or modify the code iteratively. As of the current version, I've created separate nodes for no input, 1 input and 2 inputs. The input also currently takes only sting as input. Let me know in the discussion how you would use this node.\n[w/This extension allows the execution of arbitrary Python code from a workflow.]"
},
{
"author": "kijai",
"title": "ComfyUI DiffSynth wrapper nodes",
"id": "diffsynth-wrapper",
"reference": "https://github.com/kijai/ComfyUI-DiffSynthWrapper",
"files": [
"https://github.com/kijai/ComfyUI-DiffSynthWrapper"
],
"install_type": "git-clone",
"description": "Currently only the new extended SVD model 'ExVideo' is supported.\nOriginal repo:[a/https://github.com/modelscope/DiffSynth-Studio](https://github.com/modelscope/DiffSynth-Studio)"
},
{
"author": "AllenEdgarPoe",
"title": "ComfyUI-Xorbis-nodes",
"id": "xorbis",
"reference": "https://github.com/AllenEdgarPoe/ComfyUI-Xorbis-nodes",
"files": [
"https://github.com/AllenEdgarPoe/ComfyUI-Xorbis-nodes"
],
"install_type": "git-clone",
"description": "This repository is for MuseumX Update. We use ComfyUI as our framework, and the nodes are built for my comfort."
},
{
"author": "mikeymcfish",
"title": "LaserCutterFull and Deptherize Nodes",
"id": "fishtools",
"reference": "https://github.com/mikeymcfish/FishTools",
"files": [
"https://github.com/mikeymcfish/FishTools"
],
"install_type": "git-clone",
"description": "This repository contains two custom nodes, LaserCutterFull and Deptherize, designed for use in image processing workflows. The LaserCutterFull node processes input images to generate layers for laser cutting, while the Deptherize node converts SVG data into a depth map image."
},
{
"author": "pzzmyc",
@ -338,17 +539,6 @@
"install_type": "git-clone",
"description": "ComfyUI-Comflow."
},
{
"author": "AI2lab",
"title": "comfyUI-tool-2lab",
"id": "tool2lab",
"reference": "https://github.com/AI2lab/comfyUI-tool-2lab",
"files": [
"https://github.com/AI2lab/comfyUI-tool-2lab"
],
"install_type": "git-clone",
"description": "simple tool set for developing workflow and publish to web api server"
},
{
"author": "pamparamm",
"title": "ComfyUI-ppm",

View File

@ -196,6 +196,15 @@
"title_aux": "YANC- Yet Another Node Collection"
}
],
"https://github.com/AllenEdgarPoe/ComfyUI-Xorbis-nodes": [
[
"Add Human Styler",
"Save Log Info"
],
{
"title_aux": "ComfyUI-Xorbis-nodes"
}
],
"https://github.com/BadCafeCode/execution-inversion-demo-comfyui": [
[
"AccumulateNode",
@ -331,6 +340,7 @@
],
"https://github.com/GraftingRayman/ComfyUI_GR_PromptSelector": [
[
"GR Checkered Board",
"GR Flip Tile Random Inverted",
"GR Flip Tile Random Red Ring",
"GR Image Details Displayer",
@ -338,13 +348,16 @@
"GR Image Resize",
"GR Image Resize Methods",
"GR Image Size",
"GR Image/Depth Mask",
"GR Mask Create",
"GR Mask Create Random",
"GR Mask Resize",
"GR Multi Mask Create",
"GR Onomatopoeia",
"GR Prompt Selector",
"GR Prompt Selector Multi",
"GR Stack Image",
"GR Text Overlay",
"GR Tile and Border Image",
"GR Tile and Border Image Random Flip"
],
@ -506,6 +519,17 @@
"title_aux": "DJZ-Nodes"
}
],
"https://github.com/NeuralNotW0rk/ComfyUI-Waveform-Extensions/raw/main/EXT_VariationUtils.py": [
[
"BatchToList",
"ConcatAudioList",
"SequenceVariation",
"SliceAudio"
],
{
"title_aux": "ComfyUI-Waveform-Extensions"
}
],
"https://github.com/NitramDom/ComfyUI_FacialFlip": [
[
"Swapper"
@ -525,6 +549,7 @@
],
"https://github.com/Quasimondo/ComfyUI-QuasimondoNodes": [
[
"CPPN Generator",
"Color Match",
"Custom Shader",
"Folder Queue Manager",
@ -568,17 +593,9 @@
"https://github.com/Scorpinaus/ComfyUI-DiffusersLoader": [
[
"CombinedDiffusersLoader",
"CombinedDiffusersSD15Loader",
"CombinedDiffusersSDXLLoader",
"DiffusersClipLoader",
"DiffusersUNETLoader",
"DiffusersVAELoader",
"SD15CLIPLoader",
"SD15UNETLoader",
"SD15VAELoader",
"SDXLCLIPLoader",
"SDXLUNETLoader",
"SDXLVAELoader"
"DiffusersVAELoader"
],
{
"title_aux": "ComfyUI-DiffusersLoader"
@ -600,12 +617,17 @@
"Clip Text Encode (Shinsplat)",
"Clip Text Encode SD3 (Shinsplat)",
"Clip Text Encode SDXL (Shinsplat)",
"Clip Text Encode T5 (Shinsplat)",
"Clip Tokens Encode (Shinsplat)",
"Green Box (Shinsplat)",
"Hex To Other (Shinsplat)",
"Lora Loader (Shinsplat)",
"Python (Shinsplat)",
"Python - More Inputs (Shinsplat)",
"String Interpolated (Shinsplat)",
"Sum Wrap (Shinsplat)",
"Test Node (Shinsplat)",
"Text To Tokens (Shinsplat)",
"Variables (Shinsplat)"
],
{
@ -724,11 +746,13 @@
],
"https://github.com/baicai99/ComfyUI-FrameSkipping": [
[
"FrameSelector",
"FrameSkipping",
"FrameTruncating",
"IntOperationsNode",
"MaskFrameSkipping",
"WhiteMaskGenerator"
"MaskGenerator",
"MaskSelector"
],
{
"title_aux": "ComfyUI-FrameSkipping"
@ -914,6 +938,7 @@
"DualCFGGuider",
"DualCLIPLoader",
"EmptyImage",
"EmptyLatentAudio",
"EmptyLatentImage",
"EmptySD3LatentImage",
"ExponentialScheduler",
@ -921,6 +946,7 @@
"FlipSigmas",
"FreeU",
"FreeU_V2",
"GITSScheduler",
"GLIGENLoader",
"GLIGENTextBoxApply",
"GrowMask",
@ -967,6 +993,7 @@
"LatentSubtract",
"LatentUpscale",
"LatentUpscaleBy",
"LoadAudio",
"LoadImage",
"LoadImageMask",
"LoadLatent",
@ -978,10 +1005,12 @@
"ModelMergeBlocks",
"ModelMergeSD1",
"ModelMergeSD2",
"ModelMergeSD3_2B",
"ModelMergeSDXL",
"ModelMergeSimple",
"ModelMergeSubtract",
"ModelSamplingContinuousEDM",
"ModelSamplingContinuousV",
"ModelSamplingDiscrete",
"ModelSamplingSD3",
"ModelSamplingStableCascade",
@ -1012,10 +1041,12 @@
"SamplerDPMPP_3M_SDE",
"SamplerDPMPP_SDE",
"SamplerEulerAncestral",
"SamplerEulerCFGpp",
"SamplerLCMUpscale",
"SamplerLMS",
"SaveAnimatedPNG",
"SaveAnimatedWEBP",
"SaveAudio",
"SaveImage",
"SaveImageWebsocket",
"SaveLatent",
@ -1042,8 +1073,10 @@
"UNetTemporalAttentionMultiply",
"UpscaleModelLoader",
"VAEDecode",
"VAEDecodeAudio",
"VAEDecodeTiled",
"VAEEncode",
"VAEEncodeAudio",
"VAEEncodeForInpaint",
"VAEEncodeTiled",
"VAELoader",
@ -1254,6 +1287,14 @@
"title_aux": "ComfyUI-InstantStyle"
}
],
"https://github.com/horidream/ComfyUI-Horidream": [
[
"PassThroughWithSound"
],
{
"title_aux": "ComfyUI-Horidream"
}
],
"https://github.com/houdinii/comfy-magick": [
[
"AdaptiveBlur",
@ -1481,10 +1522,11 @@
"https://github.com/jtydhr88/ComfyUI-Unique3D": [
[
"Unique3DLoadPipeline",
"Unique3DRun"
"Unique3DRun - Geo Reconstruct",
"Unique3DRun - MVPrediction"
],
{
"title_aux": "ComfyUI-Unique3D"
"title_aux": "ComfyUI-Unique3D [WIP]"
}
],
"https://github.com/kadirnar/ComfyUI-Adapter": [
@ -1553,6 +1595,24 @@
"title_aux": "ComfyUI nodes to use DeepSeek-VL"
}
],
"https://github.com/kijai/ComfyUI-DiffSynthWrapper": [
[
"DiffSynthSampler",
"DownloadAndLoadDiffSynthExVideoSVD"
],
{
"title_aux": "ComfyUI DiffSynth wrapper nodes [WIP]"
}
],
"https://github.com/kijai/ComfyUI-DiffusersSD3Wrapper": [
[
"LoadSD3DiffusersPipeline",
"SD3ControlNetSampler"
],
{
"title_aux": "ComfyUI-DiffusersSD3Wrapper"
}
],
"https://github.com/komojini/ComfyUI_Prompt_Template_CustomNodes/raw/main/prompt_with_template.py": [
[
"ObjectPromptWithTemplate",
@ -1665,6 +1725,33 @@
"title_aux": "ComfyUI mashb1t nodes"
}
],
"https://github.com/mikeymcfish/FishTools": [
[
"Deptherize",
"LaserCutterFull"
],
{
"author": "Fish",
"description": "This extension provides tools for generating laser cutter ready files",
"nickname": "FishTools",
"title": "FishTools",
"title_aux": "LaserCutterFull and Deptherize Nodes"
}
],
"https://github.com/mingqizhang/ComfyUI_AEMatter_zmq": [
[
"AEMatter_Apply",
"AEMatter_ModelLoader",
"Create_Trimap",
"Gaussian_Filter",
"Guide_Filter",
"Mask_Transfor",
"Replace_Background"
],
{
"title_aux": "ComfyUI_AEMatter_zmq"
}
],
"https://github.com/mut-ex/comfyui-gligengui-node": [
[
"GLIGEN_GUI"
@ -1762,6 +1849,18 @@
"title_aux": "NudeNet-Detector-Provider [WIP]"
}
],
"https://github.com/prabinpebam/anyPython": [
[
"Any Python"
],
{
"author": "prabinpebam",
"description": "This node can take any input and use that to run a python script in ComfyUI",
"nickname": "AnyPython",
"title": "AnyPython v0.1",
"title_aux": "anyPython [UNSAFE]"
}
],
"https://github.com/prismwastaken/comfyui-tools": [
[
"Prism-RandomNormal"
@ -1770,6 +1869,14 @@
"title_aux": "prism-tools"
}
],
"https://github.com/pzzmyc/comfyui-sd3-simple-simpletuner": [
[
"sd not very simple simpletuner by hhy"
],
{
"title_aux": "comfyui-sd3-simple-simpletuner"
}
],
"https://github.com/redhottensors/ComfyUI-ODE": [
[
"Blended Transition [DVB]",

View File

@ -1,712 +1,762 @@
{
"https://github.com/17Retoucher/ComfyUI_Fooocus": {
"stars": 51,
"stars": 52,
"last_update": "2024-02-24 07:33:29",
"author_account_age_days": 162
"author_account_age_days": 171
},
"https://github.com/A719689614/ComfyUI_AC_FUNV8Beta1": {
"stars": 13,
"last_update": "2024-03-08 10:11:44",
"author_account_age_days": 305
"author_account_age_days": 314
},
"https://github.com/AI2lab/comfyUI-tool-2lab": {
"stars": 5,
"stars": 7,
"last_update": "2024-06-06 16:16:11",
"author_account_age_days": 183
"author_account_age_days": 192
},
"https://github.com/AIGODLIKE/ComfyUI-Studio": {
"stars": 202,
"stars": 203,
"last_update": "2024-06-05 00:52:46",
"author_account_age_days": 492
"author_account_age_days": 501
},
"https://github.com/ALatentPlace/ComfyUI_yanc": {
"stars": 15,
"stars": 18,
"last_update": "2024-06-14 09:04:57",
"author_account_age_days": 1450
"author_account_age_days": 1460
},
"https://github.com/AllenEdgarPoe/ComfyUI-Xorbis-nodes": {
"stars": 0,
"last_update": "2024-06-21 01:43:13",
"author_account_age_days": 2105
},
"https://github.com/AustinMroz/ComfyUI-WorkflowCheckpointing": {
"stars": 5,
"last_update": "2024-06-19 21:19:45",
"author_account_age_days": 4074
},
"https://github.com/BadCafeCode/execution-inversion-demo-comfyui": {
"stars": 3,
"last_update": "2024-03-23 23:53:13",
"author_account_age_days": 421
"stars": 4,
"last_update": "2024-06-19 06:59:39",
"author_account_age_days": 430
},
"https://github.com/Beinsezii/comfyui-amd-go-fast": {
"stars": 8,
"stars": 9,
"last_update": "2024-05-10 00:48:37",
"author_account_age_days": 2217
"author_account_age_days": 2226
},
"https://github.com/BlueDangerX/ComfyUI-BDXNodes": {
"stars": 1,
"last_update": "2023-12-10 04:01:19",
"author_account_age_days": 237
"author_account_age_days": 246
},
"https://github.com/Brandelan/ComfyUI_bd_customNodes": {
"stars": 1,
"last_update": "2023-10-09 00:40:26",
"author_account_age_days": 4142
"author_account_age_days": 4151
},
"https://github.com/DeTK/ComfyUI-Switch": {
"stars": 0,
"last_update": "2024-03-04 11:52:04",
"author_account_age_days": 2022
"author_account_age_days": 2031
},
"https://github.com/DrMWeigand/ComfyUI_LineBreakInserter": {
"stars": 0,
"last_update": "2024-04-19 11:37:19",
"author_account_age_days": 1022
"author_account_age_days": 1032
},
"https://github.com/Elawphant/ComfyUI-MusicGen": {
"stars": 4,
"last_update": "2024-05-11 13:33:24",
"author_account_age_days": 2579
"author_account_age_days": 2588
},
"https://github.com/ExponentialML/ComfyUI_LiveDirector": {
"stars": 34,
"stars": 35,
"last_update": "2024-04-09 19:01:49",
"author_account_age_days": 1614
"author_account_age_days": 1623
},
"https://github.com/Extraltodeus/Conditioning-token-experiments-for-ComfyUI": {
"stars": 13,
"last_update": "2024-03-10 01:04:02",
"author_account_age_days": 3140
"author_account_age_days": 3149
},
"https://github.com/FoundD-oka/ComfyUI-kisekae-OOTD": {
"stars": 0,
"last_update": "2024-06-02 06:13:42",
"author_account_age_days": 428
"author_account_age_days": 437
},
"https://github.com/GentlemanHu/ComfyUI-Notifier": {
"stars": 3,
"last_update": "2024-06-04 10:05:38",
"author_account_age_days": 2374
"author_account_age_days": 2383
},
"https://github.com/GraftingRayman/ComfyUI_GR_PromptSelector": {
"stars": 9,
"last_update": "2024-06-14 09:06:14",
"author_account_age_days": 154
"stars": 17,
"last_update": "2024-06-22 18:22:20",
"author_account_age_days": 163
},
"https://github.com/GrindHouse66/ComfyUI-GH_Tools": {
"stars": 0,
"last_update": "2024-03-10 13:27:14",
"author_account_age_days": 615
"author_account_age_days": 624
},
"https://github.com/IvanZhd/comfyui-codeformer": {
"stars": 0,
"last_update": "2023-12-02 20:51:52",
"author_account_age_days": 2569
"author_account_age_days": 2578
},
"https://github.com/Jaxkr/comfyui-terminal-command": {
"stars": 1,
"last_update": "2023-12-03 10:31:40",
"author_account_age_days": 4618
"author_account_age_days": 4627
},
"https://github.com/Jiffies-64/ComfyUI-SaveImagePlus": {
"stars": 0,
"last_update": "2024-04-01 10:52:59",
"author_account_age_days": 882
"author_account_age_days": 891
},
"https://github.com/Jordach/comfy-consistency-vae": {
"stars": 68,
"last_update": "2023-11-06 20:50:40",
"author_account_age_days": 4503
"author_account_age_days": 4513
},
"https://github.com/LZpenguin/ComfyUI-Text": {
"stars": 5,
"last_update": "2024-06-15 07:11:12",
"author_account_age_days": 1970
"stars": 9,
"last_update": "2024-06-20 13:38:16",
"author_account_age_days": 1979
},
"https://github.com/LarryJane491/ComfyUI-ModelUnloader": {
"stars": 1,
"last_update": "2024-01-14 08:22:39",
"author_account_age_days": 154
"author_account_age_days": 164
},
"https://github.com/LotzF/ComfyUI-Simple-Chat-GPT-completion": {
"stars": 0,
"last_update": "2024-02-04 21:15:22",
"author_account_age_days": 920
"author_account_age_days": 929
},
"https://github.com/LykosAI/ComfyUI-Inference-Core-Nodes": {
"stars": 14,
"stars": 16,
"last_update": "2024-04-05 05:11:51",
"author_account_age_days": 369
"author_account_age_days": 378
},
"https://github.com/MrAdamBlack/CheckProgress": {
"stars": 1,
"last_update": "2024-01-10 08:02:18",
"author_account_age_days": 2711
"author_account_age_days": 2720
},
"https://github.com/MushroomFleet/DJZ-Nodes": {
"stars": 4,
"last_update": "2024-03-18 11:18:42",
"author_account_age_days": 3712
"author_account_age_days": 3721
},
"https://github.com/NicholasKao1029/comfyui-hook": {
"stars": 0,
"last_update": "2024-03-07 05:50:56",
"author_account_age_days": 2021
"author_account_age_days": 2030
},
"https://github.com/NitramDom/ComfyUI_FacialFlip": {
"stars": 2,
"last_update": "2024-06-07 14:56:55",
"author_account_age_days": 3163
"author_account_age_days": 3172
},
"https://github.com/PluMaZero/ComfyUI-SpaceFlower": {
"stars": 4,
"last_update": "2023-12-09 05:55:15",
"author_account_age_days": 1049
"author_account_age_days": 1058
},
"https://github.com/Quasimondo/ComfyUI-QuasimondoNodes": {
"stars": 0,
"last_update": "2024-06-01 21:27:18",
"author_account_age_days": 5266
"stars": 4,
"last_update": "2024-06-21 19:55:21",
"author_account_age_days": 5275
},
"https://github.com/SadaleNet/ComfyUI-Prompt-To-Prompt": {
"stars": 19,
"stars": 20,
"last_update": "2024-03-17 04:30:01",
"author_account_age_days": 4030
"author_account_age_days": 4040
},
"https://github.com/Sai-ComfyUI/ComfyUI-MS-Nodes": {
"stars": 2,
"last_update": "2024-02-22 08:34:44",
"author_account_age_days": 200
"author_account_age_days": 209
},
"https://github.com/Scorpinaus/ComfyUI-DiffusersLoader": {
"stars": 3,
"last_update": "2024-06-14 09:02:43",
"author_account_age_days": 1101
"last_update": "2024-06-23 01:30:57",
"author_account_age_days": 1110
},
"https://github.com/SeedV/ComfyUI-SeedV-Nodes": {
"stars": 1,
"last_update": "2024-06-05 10:01:47",
"author_account_age_days": 1116
"author_account_age_days": 1126
},
"https://github.com/Shinsplat/ComfyUI-Shinsplat": {
"stars": 10,
"last_update": "2024-06-15 11:05:38",
"author_account_age_days": 1015
"stars": 13,
"last_update": "2024-06-22 14:29:36",
"author_account_age_days": 1024
},
"https://github.com/StartHua/Comfyui_CXH_CRM": {
"stars": 24,
"stars": 26,
"last_update": "2024-06-06 14:15:14",
"author_account_age_days": 2826
"author_account_age_days": 2835
},
"https://github.com/TSFSean/ComfyUI-TSFNodes": {
"stars": 4,
"last_update": "2024-05-18 00:59:06",
"author_account_age_days": 3463
"author_account_age_days": 3472
},
"https://github.com/TemryL/ComfyUI-IDM-VTON": {
"stars": 184,
"last_update": "2024-05-30 12:21:57",
"author_account_age_days": 859
"stars": 203,
"last_update": "2024-06-22 06:14:19",
"author_account_age_days": 868
},
"https://github.com/Video3DGenResearch/comfyui-batch-input-node": {
"stars": 1,
"last_update": "2024-04-28 15:21:17",
"author_account_age_days": 97
"author_account_age_days": 106
},
"https://github.com/WSJUSA/Comfyui-StableSR": {
"stars": 36,
"stars": 38,
"last_update": "2023-10-18 12:40:30",
"author_account_age_days": 1415
"author_account_age_days": 1424
},
"https://github.com/WilliamStanford/visuallabs_comfyui_nodes": {
"stars": 1,
"last_update": "2024-04-16 21:53:02",
"author_account_age_days": 1760
"author_account_age_days": 1769
},
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-AnyText": {
"stars": 44,
"stars": 45,
"last_update": "2024-05-22 14:30:05",
"author_account_age_days": 330
"author_account_age_days": 340
},
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-PuLID-ZHO": {
"stars": 182,
"stars": 184,
"last_update": "2024-05-22 13:38:23",
"author_account_age_days": 330
"author_account_age_days": 340
},
"https://github.com/alt-key-project/comfyui-dream-video-batches": {
"stars": 50,
"stars": 51,
"last_update": "2024-05-22 20:52:05",
"author_account_age_days": 651
"author_account_age_days": 660
},
"https://github.com/baicai99/ComfyUI-FrameSkipping": {
"stars": 1,
"last_update": "2024-06-15 04:48:19",
"author_account_age_days": 822
"stars": 6,
"last_update": "2024-06-18 10:25:55",
"author_account_age_days": 831
},
"https://github.com/beyastard/ComfyUI_BeySoft": {
"stars": 0,
"last_update": "2024-05-26 22:44:55",
"author_account_age_days": 4277
"author_account_age_days": 4286
},
"https://github.com/birnam/ComfyUI-GenData-Pack": {
"stars": 0,
"last_update": "2024-03-25 01:25:23",
"author_account_age_days": 5000
"author_account_age_days": 5009
},
"https://github.com/blepping/comfyui_overly_complicated_sampling": {
"stars": 5,
"last_update": "2024-06-12 01:05:41",
"author_account_age_days": 145
"author_account_age_days": 154
},
"https://github.com/blib-la/ComfyUI-Captain-Extensions": {
"stars": 0,
"last_update": "2024-05-17 23:27:25",
"author_account_age_days": 264
"author_account_age_days": 273
},
"https://github.com/bruce007lee/comfyui-cleaner": {
"stars": 3,
"last_update": "2024-04-20 15:36:03",
"author_account_age_days": 4503
"author_account_age_days": 4512
},
"https://github.com/bruce007lee/comfyui-tiny-utils": {
"stars": 0,
"last_update": "2024-06-07 03:44:47",
"author_account_age_days": 4503
"author_account_age_days": 4512
},
"https://github.com/brycegoh/comfyui-custom-nodes": {
"stars": 0,
"last_update": "2024-06-05 09:30:06",
"author_account_age_days": 3099
"author_account_age_days": 3108
},
"https://github.com/chaojie/ComfyUI-DynamiCrafter": {
"stars": 108,
"stars": 109,
"last_update": "2024-06-14 10:23:59",
"author_account_age_days": 4824
"author_account_age_days": 4833
},
"https://github.com/chaojie/ComfyUI-mobvoi-openapi": {
"stars": 2,
"last_update": "2024-05-29 09:02:52",
"author_account_age_days": 4824
"author_account_age_days": 4833
},
"https://github.com/christian-byrne/infinite-zoom-parallax-nodes": {
"stars": 3,
"stars": 4,
"last_update": "2024-05-27 01:51:24",
"author_account_age_days": 1339
"author_account_age_days": 1348
},
"https://github.com/christian-byrne/python-interpreter-node": {
"stars": 19,
"last_update": "2024-06-01 06:00:47",
"author_account_age_days": 1339
"stars": 20,
"last_update": "2024-06-23 22:22:20",
"author_account_age_days": 1348
},
"https://github.com/comfyanonymous/ComfyUI": {
"stars": 38239,
"last_update": "2024-06-15 07:12:27",
"author_account_age_days": 540
"stars": 39915,
"last_update": "2024-06-24 11:47:40",
"author_account_age_days": 549
},
"https://github.com/comfypod/ComfyUI-Comflow": {
"stars": 0,
"last_update": "2024-06-14 16:01:27",
"author_account_age_days": 14
"last_update": "2024-06-17 08:44:08",
"author_account_age_days": 23
},
"https://github.com/corbin-hayden13/ComfyUI-Better-Dimensions": {
"stars": 6,
"stars": 7,
"last_update": "2024-06-12 17:45:21",
"author_account_age_days": 1806
"author_account_age_days": 1815
},
"https://github.com/cubiq/Comfy_Dungeon": {
"stars": 169,
"stars": 174,
"last_update": "2024-04-26 11:00:58",
"author_account_age_days": 5002
"author_account_age_days": 5011
},
"https://github.com/dezi-ai/ComfyUI-AnimateLCM": {
"stars": 147,
"stars": 148,
"last_update": "2024-02-07 17:34:39",
"author_account_age_days": 168
"author_account_age_days": 177
},
"https://github.com/dfl/comfyui-stylegan": {
"stars": 1,
"last_update": "2024-03-14 14:34:25",
"author_account_age_days": 5965
"author_account_age_days": 5974
},
"https://github.com/dnl13/ComfyUI-dnl13-seg": {
"stars": 16,
"last_update": "2024-01-08 10:52:13",
"author_account_age_days": 4209
"author_account_age_days": 4218
},
"https://github.com/doucx/ComfyUI_WcpD_Utility_Kit": {
"stars": 1,
"last_update": "2024-01-06 19:07:45",
"author_account_age_days": 2314
"author_account_age_days": 2323
},
"https://github.com/eigenpunk/ComfyUI-audio": {
"stars": 58,
"stars": 59,
"last_update": "2024-03-03 21:14:14",
"author_account_age_days": 916
"author_account_age_days": 925
},
"https://github.com/ejektaflex/ComfyUI-Ty": {
"stars": 0,
"last_update": "2024-06-12 16:08:16",
"author_account_age_days": 2763
"author_account_age_days": 2772
},
"https://github.com/endman100/ComfyUI-SaveAndLoadPromptCondition": {
"stars": 0,
"last_update": "2024-06-06 06:07:49",
"author_account_age_days": 2464
"author_account_age_days": 2473
},
"https://github.com/ericbeyer/guidance_interval": {
"stars": 2,
"last_update": "2024-04-16 03:24:01",
"author_account_age_days": 2585
"author_account_age_days": 2594
},
"https://github.com/flowtyone/comfyui-flowty-lcm": {
"stars": 62,
"last_update": "2023-10-23 12:08:55",
"author_account_age_days": 264
"author_account_age_days": 273
},
"https://github.com/flyingdogsoftware/gyre_for_comfyui": {
"stars": 0,
"last_update": "2024-06-13 23:39:25",
"author_account_age_days": 2003
"last_update": "2024-06-21 15:35:49",
"author_account_age_days": 2013
},
"https://github.com/foglerek/comfyui-cem-tools": {
"stars": 1,
"last_update": "2024-01-13 23:22:07",
"author_account_age_days": 4029
"author_account_age_days": 4038
},
"https://github.com/gameltb/ComfyUI_paper_playground": {
"stars": 8,
"last_update": "2024-06-05 07:13:23",
"author_account_age_days": 4046
"stars": 9,
"last_update": "2024-06-20 07:16:06",
"author_account_age_days": 4055
},
"https://github.com/gameltb/ComfyUI_stable_fast": {
"stars": 182,
"stars": 183,
"last_update": "2024-06-06 12:43:16",
"author_account_age_days": 4046
"author_account_age_days": 4055
},
"https://github.com/gameltb/io_comfyui": {
"stars": 3,
"last_update": "2024-04-06 04:40:05",
"author_account_age_days": 4046
"author_account_age_days": 4055
},
"https://github.com/githubYiheng/comfyui_median_filter": {
"stars": 0,
"last_update": "2024-05-24 15:21:40",
"author_account_age_days": 3894
"author_account_age_days": 3903
},
"https://github.com/haofanwang/ComfyUI-InstantStyle": {
"stars": 5,
"last_update": "2024-05-23 16:11:13",
"author_account_age_days": 2968
"author_account_age_days": 2977
},
"https://github.com/horidream/ComfyUI-Horidream": {
"stars": 0,
"last_update": "2024-06-18 02:09:07",
"author_account_age_days": 5043
},
"https://github.com/houdinii/comfy-magick": {
"stars": 4,
"last_update": "2024-03-11 06:40:54",
"author_account_age_days": 3511
"author_account_age_days": 3520
},
"https://github.com/huchenlei/ComfyUI_densediffusion": {
"stars": 44,
"stars": 70,
"last_update": "2024-06-11 00:39:28",
"author_account_age_days": 2866
"author_account_age_days": 2875
},
"https://github.com/huchenlei/ComfyUI_omost": {
"stars": 281,
"stars": 321,
"last_update": "2024-06-14 12:45:52",
"author_account_age_days": 2866
"author_account_age_days": 2875
},
"https://github.com/huizhang0110/ComfyUI_Easy_Nodes_hui": {
"stars": 2,
"last_update": "2024-02-27 08:22:49",
"author_account_age_days": 2446
"author_account_age_days": 2455
},
"https://github.com/hy134300/comfyui-hb-node": {
"stars": 0,
"last_update": "2024-04-09 09:56:22",
"author_account_age_days": 1752
"author_account_age_days": 1761
},
"https://github.com/hy134300/comfyui-hydit": {
"stars": 5,
"stars": 7,
"last_update": "2024-06-07 09:52:15",
"author_account_age_days": 1752
"author_account_age_days": 1761
},
"https://github.com/ilovejohnwhite/UncleBillyGoncho": {
"stars": 0,
"last_update": "2024-02-29 00:16:42",
"author_account_age_days": 864
"author_account_age_days": 873
},
"https://github.com/immersiveexperience/ie-comfyui-color-nodes": {
"stars": 1,
"last_update": "2024-06-12 12:25:42",
"author_account_age_days": 260
"stars": 2,
"last_update": "2024-06-18 10:54:55",
"author_account_age_days": 269
},
"https://github.com/jh-leon-kim/ComfyUI-JHK-utils": {
"stars": 0,
"last_update": "2024-06-04 08:57:52",
"author_account_age_days": 163
"author_account_age_days": 172
},
"https://github.com/jimmm-ai/TimeUi-a-ComfyUi-Timeline-Node": {
"stars": 186,
"stars": 194,
"last_update": "2024-06-12 20:10:22",
"author_account_age_days": 11
"author_account_age_days": 20
},
"https://github.com/jn-jairo/jn_node_suite_comfyui": {
"stars": 5,
"last_update": "2024-06-08 05:15:33",
"author_account_age_days": 3975
"author_account_age_days": 3984
},
"https://github.com/jtscmw01/ComfyUI-DiffBIR": {
"stars": 59,
"stars": 61,
"last_update": "2024-05-21 05:28:34",
"author_account_age_days": 493
"author_account_age_days": 502
},
"https://github.com/jtydhr88/ComfyUI-Unique3D": {
"stars": 7,
"last_update": "2024-06-13 03:03:45",
"author_account_age_days": 4744
"stars": 57,
"last_update": "2024-06-24 00:30:37",
"author_account_age_days": 4753
},
"https://github.com/kadirnar/ComfyUI-Adapter": {
"stars": 3,
"last_update": "2024-04-03 12:05:39",
"author_account_age_days": 2320
"author_account_age_days": 2329
},
"https://github.com/kadirnar/comfyui_helpers": {
"stars": 2,
"last_update": "2024-03-04 16:25:30",
"author_account_age_days": 2320
"author_account_age_days": 2329
},
"https://github.com/kappa54m/ComfyUI_Usability": {
"stars": 0,
"last_update": "2024-02-05 14:49:45",
"author_account_age_days": 1502
"author_account_age_days": 1511
},
"https://github.com/kijai/ComfyUI-CV-VAE": {
"stars": 8,
"stars": 9,
"last_update": "2024-06-03 21:46:49",
"author_account_age_days": 2174
"author_account_age_days": 2183
},
"https://github.com/kijai/ComfyUI-DeepSeek-VL": {
"stars": 19,
"last_update": "2024-05-21 16:43:40",
"author_account_age_days": 2174
"author_account_age_days": 2183
},
"https://github.com/kijai/ComfyUI-DiffSynthWrapper": {
"stars": 22,
"last_update": "2024-06-22 00:16:46",
"author_account_age_days": 2183
},
"https://github.com/kijai/ComfyUI-DiffusersSD3Wrapper": {
"stars": 7,
"last_update": "2024-06-17 13:03:43",
"author_account_age_days": 2183
},
"https://github.com/kycg/comfyui-Kwtoolset": {
"stars": 0,
"last_update": "2024-06-12 17:04:09",
"author_account_age_days": 931
"author_account_age_days": 940
},
"https://github.com/laksjdjf/ssd-1b-comfyui": {
"stars": 1,
"last_update": "2023-10-27 20:05:06",
"author_account_age_days": 2822
"author_account_age_days": 2831
},
"https://github.com/logtd/ComfyUI-MotionThiefExperiment": {
"stars": 36,
"last_update": "2024-05-22 00:12:06",
"author_account_age_days": 113
"author_account_age_days": 122
},
"https://github.com/longgui0318/comfyui-one-more-step": {
"stars": 0,
"stars": 1,
"last_update": "2024-05-07 08:40:56",
"author_account_age_days": 4155
"author_account_age_days": 4165
},
"https://github.com/ltdrdata/ComfyUI-Workflow-Component": {
"stars": 192,
"stars": 195,
"last_update": "2024-04-26 01:39:09",
"author_account_age_days": 453
"author_account_age_days": 462
},
"https://github.com/marcueberall/ComfyUI-BuildPath": {
"stars": 0,
"last_update": "2024-02-06 07:57:33",
"author_account_age_days": 1773
"author_account_age_days": 1782
},
"https://github.com/marduk191/comfyui-marnodes": {
"stars": 0,
"last_update": "2024-06-14 10:24:11",
"author_account_age_days": 4405
"author_account_age_days": 4415
},
"https://github.com/maruhidd/ComfyUI_Transparent-Background": {
"stars": 0,
"stars": 1,
"last_update": "2024-06-14 07:02:56",
"author_account_age_days": 2246
"author_account_age_days": 2255
},
"https://github.com/mashb1t/comfyui-nodes-mashb1t": {
"stars": 0,
"last_update": "2024-06-11 15:55:53",
"author_account_age_days": 3526
"author_account_age_days": 3535
},
"https://github.com/mikeymcfish/FishTools": {
"stars": 12,
"last_update": "2024-06-21 20:35:44",
"author_account_age_days": 3403
},
"https://github.com/mingqizhang/ComfyUI_AEMatter_zmq": {
"stars": 0,
"last_update": "2024-06-24 07:22:59",
"author_account_age_days": 2594
},
"https://github.com/mut-ex/comfyui-gligengui-node": {
"stars": 29,
"stars": 30,
"last_update": "2024-02-28 02:46:05",
"author_account_age_days": 2849
"author_account_age_days": 2858
},
"https://github.com/nat-chan/comfyui-eval": {
"stars": 1,
"last_update": "2024-05-28 11:56:37",
"author_account_age_days": 2984
"author_account_age_days": 2993
},
"https://github.com/nat-chan/comfyui-in-memory-transceiver": {
"stars": 1,
"last_update": "2024-05-01 10:03:01",
"author_account_age_days": 2984
"author_account_age_days": 2993
},
"https://github.com/nat-chan/comfyui-paint": {
"stars": 2,
"last_update": "2024-06-14 11:01:38",
"author_account_age_days": 2993
},
"https://github.com/nidefawl/ComfyUI-nidefawl": {
"stars": 0,
"last_update": "2024-01-16 18:16:41",
"author_account_age_days": 4859
"author_account_age_days": 4868
},
"https://github.com/nkchocoai/ComfyUI-PromptUtilities": {
"stars": 6,
"last_update": "2024-05-22 23:10:42",
"author_account_age_days": 150
"last_update": "2024-06-23 04:58:30",
"author_account_age_days": 160
},
"https://github.com/norgeous/ComfyUI-UI-Builder": {
"stars": 2,
"last_update": "2024-06-15 11:15:59",
"author_account_age_days": 4020
"last_update": "2024-06-24 13:55:40",
"author_account_age_days": 4029
},
"https://github.com/oyvindg/ComfyUI-TrollSuite": {
"stars": 0,
"last_update": "2024-05-22 21:32:03",
"author_account_age_days": 2320
"author_account_age_days": 2329
},
"https://github.com/oztrkoguz/ComfyUI_Kosmos2_BBox_Cutter": {
"stars": 13,
"last_update": "2024-05-03 10:52:29",
"author_account_age_days": 832
"author_account_age_days": 841
},
"https://github.com/pamparamm/ComfyUI-ppm": {
"stars": 2,
"last_update": "2024-06-09 15:42:30",
"author_account_age_days": 2122
"stars": 3,
"last_update": "2024-06-15 15:19:13",
"author_account_age_days": 2131
},
"https://github.com/phineas-pta/comfy-trt-test": {
"stars": 83,
"last_update": "2024-06-04 21:09:17",
"author_account_age_days": 2279
"author_account_age_days": 2288
},
"https://github.com/poisenbery/NudeNet-Detector-Provider": {
"stars": 1,
"last_update": "2024-02-26 02:11:27",
"author_account_age_days": 1228
"author_account_age_days": 1237
},
"https://github.com/prabinpebam/anyPython": {
"stars": 3,
"last_update": "2024-06-21 16:58:16",
"author_account_age_days": 4242
},
"https://github.com/prismwastaken/comfyui-tools": {
"stars": 0,
"last_update": "2024-03-05 14:34:56",
"author_account_age_days": 148
"author_account_age_days": 157
},
"https://github.com/pzzmyc/comfyui-sd3-simple-simpletuner": {
"stars": 1,
"last_update": "2024-06-19 12:48:18",
"author_account_age_days": 2099
},
"https://github.com/redhottensors/ComfyUI-ODE": {
"stars": 2,
"last_update": "2024-06-15 03:29:48",
"author_account_age_days": 130
"stars": 12,
"last_update": "2024-06-23 22:16:53",
"author_account_age_days": 139
},
"https://github.com/romeobuilderotti/ComfyUI-EZ-Pipes": {
"stars": 3,
"last_update": "2023-11-15 22:00:49",
"author_account_age_days": 281
"author_account_age_days": 290
},
"https://github.com/runtime44/comfyui_r44_nodes": {
"stars": 26,
"stars": 28,
"last_update": "2024-06-11 10:49:02",
"author_account_age_days": 158
"author_account_age_days": 168
},
"https://github.com/sangeet/comfyui-testui": {
"stars": 2,
"last_update": "2024-05-15 00:55:17",
"author_account_age_days": 5071
"author_account_age_days": 5080
},
"https://github.com/sdfxai/SDFXBridgeForComfyUI": {
"stars": 4,
"stars": 6,
"last_update": "2024-06-14 10:26:56",
"author_account_age_days": 225
"author_account_age_days": 235
},
"https://github.com/shadowcz007/ComfyUI-PuLID-Test": {
"stars": 8,
"last_update": "2024-05-12 14:37:28",
"author_account_age_days": 3305
"author_account_age_days": 3314
},
"https://github.com/shadowcz007/comfyui-CLIPSeg": {
"stars": 0,
"stars": 1,
"last_update": "2024-02-08 02:16:24",
"author_account_age_days": 3305
"author_account_age_days": 3314
},
"https://github.com/shadowcz007/comfyui-llamafile": {
"stars": 15,
"last_update": "2024-05-21 19:47:56",
"author_account_age_days": 3305
"author_account_age_days": 3314
},
"https://github.com/shadowcz007/comfyui-musicgen": {
"stars": 21,
"last_update": "2024-06-14 10:26:44",
"author_account_age_days": 3305
"stars": 54,
"last_update": "2024-06-20 02:07:31",
"author_account_age_days": 3314
},
"https://github.com/shirazdesigner/CLIPTextEncodeAndEnhancev4": {
"stars": 0,
"last_update": "2024-04-27 13:25:08",
"author_account_age_days": 3953
"author_account_age_days": 3962
},
"https://github.com/sofakid/dandy": {
"stars": 30,
"last_update": "2024-05-27 21:46:18",
"author_account_age_days": 4044
"author_account_age_days": 4053
},
"https://github.com/stavsap/ComfyUI-React-SDK": {
"stars": 6,
"last_update": "2024-03-17 21:54:21",
"author_account_age_days": 4074
"author_account_age_days": 4084
},
"https://github.com/stutya/ComfyUI-Terminal": {
"stars": 0,
"last_update": "2024-02-05 16:47:28",
"author_account_age_days": 3829
"author_account_age_days": 3838
},
"https://github.com/sugarkwork/comfyui_psd": {
"stars": 1,
"last_update": "2024-03-26 08:24:56",
"author_account_age_days": 866
"author_account_age_days": 875
},
"https://github.com/tachyon-beep/comfyui-simplefeed": {
"stars": 3,
"last_update": "2024-05-22 03:30:57",
"author_account_age_days": 4912
"author_account_age_days": 4921
},
"https://github.com/talesofai/comfyui-supersave": {
"stars": 1,
"last_update": "2023-12-27 02:05:53",
"author_account_age_days": 546
"author_account_age_days": 556
},
"https://github.com/tjorbogarden/my-useful-comfyui-custom-nodes": {
"stars": 0,
"last_update": "2024-03-05 13:31:31",
"author_account_age_days": 104
"author_account_age_days": 113
},
"https://github.com/tracerstar/comfyui-p5js-node": {
"stars": 25,
"stars": 28,
"last_update": "2024-05-30 18:33:55",
"author_account_age_days": 5189
"author_account_age_days": 5198
},
"https://github.com/tuckerdarby/ComfyUI-TDNodes": {
"stars": 3,
"last_update": "2024-02-19 17:00:55",
"author_account_age_days": 2929
"author_account_age_days": 2938
},
"https://github.com/umisetokikaze/comfyui_mergekit": {
"stars": 0,
"last_update": "2024-04-28 07:21:00",
"author_account_age_days": 1814
"author_account_age_days": 1823
},
"https://github.com/unanan/ComfyUI-Dist": {
"stars": 5,
"last_update": "2024-02-28 10:03:50",
"author_account_age_days": 2889
"author_account_age_days": 2898
},
"https://github.com/unanan/ComfyUI-clip-interrogator": {
"stars": 21,
"stars": 22,
"last_update": "2024-02-01 09:46:57",
"author_account_age_days": 1021
"author_account_age_days": 1030
},
"https://github.com/wormley/comfyui-wormley-nodes": {
"stars": 0,
"last_update": "2023-11-12 19:05:11",
"author_account_age_days": 2464
"author_account_age_days": 2473
},
"https://github.com/yushan777/ComfyUI-Y7Nodes": {
"stars": 0,
"last_update": "2024-06-15 11:49:59",
"author_account_age_days": 508
"stars": 1,
"last_update": "2024-06-23 22:36:49",
"author_account_age_days": 517
},
"https://github.com/zmwv823/ComfyUI-AnyText": {
"stars": 34,
"last_update": "2024-06-14 10:18:27",
"author_account_age_days": 3260
"stars": 42,
"last_update": "2024-06-23 15:52:12",
"author_account_age_days": 3269
}
}

View File

@ -9,8 +9,61 @@
"description": "If you see this message, your ComfyUI-Manager is outdated.\nLegacy channel provides only the list of the deprecated nodes. If you want to find the complete node list, please go to the Default channel."
},
{
"author": "turkyden",
"title": "ComfyUI-Sticker [REMOVED]",
"reference": "https://github.com/turkyden/ComfyUI-Sticker",
"files": [
"https://github.com/turkyden/ComfyUI-Sticker"
],
"install_type": "git-clone",
"description": "image to sticker"
},
{
"author": "turkyden",
"title": "ComfyUI-Comic [REMOVED]",
"id": "comic",
"reference": "https://github.com/turkyden/ComfyUI-Comic",
"files": [
"https://github.com/turkyden/ComfyUI-Comic"
],
"install_type": "git-clone",
"description": "a comfyui plugin for image to comic"
},
{
"author": "turkyden",
"title": "ComfyUI-Avatar [REMOVED]",
"id": "avatar",
"reference": "https://github.com/turkyden/ComfyUI-Avatar",
"files": [
"https://github.com/turkyden/ComfyUI-Avatar"
],
"install_type": "git-clone",
"description": "a comfyui plugin for image to avatar"
},
{
"author": "bvhari",
"title": "LatentToRGB [DEPRECATED]",
"id": "latent2rgb",
"reference": "https://github.com/bvhari/ComfyUI_LatentToRGB",
"files": [
"https://github.com/bvhari/ComfyUI_LatentToRGB"
],
"install_type": "git-clone",
"description": "ComfyUI custom node to convert latent to RGB.\nNOTE:This repo has been archived because ComfyUI natively has similar functionality now"
},
{
"author": "Kaharos94",
"title": "ComfyUI-Saveaswebp [DEPRECATED]",
"id": "save-webp",
"reference": "https://github.com/Kaharos94/ComfyUI-Saveaswebp",
"files": [
"https://github.com/Kaharos94/ComfyUI-Saveaswebp"
],
"install_type": "git-clone",
"description": "Save a picture as Webp file in Comfy + Workflow loading"
},
{
"author": "udi0510",
"title": "comfyui-slicer [REMOVED]",

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,85 @@
{
"models": [
{
"name": "InstantX/SD3-Controlnet-Canny",
"type": "controlnet",
"base": "SD3",
"save_path": "controlnet/SD3/InstantX-Controlnet-Canny",
"description": "Controlnet SD3 Canny model.",
"reference": "https://huggingface.co/InstantX/SD3-Controlnet-Canny",
"filename": "diffusion_pytorch_model.safetensors",
"url": "https://huggingface.co/InstantX/SD3-Controlnet-Canny/resolve/main/diffusion_pytorch_model.safetensors",
"size": "1.19GB"
},
{
"name": "InstantX/SD3-Controlnet-Pose",
"type": "controlnet",
"base": "SD3",
"save_path": "controlnet/SD3/InstantX-Controlnet-Pose",
"description": "Controlnet SD3 Pose model.",
"reference": "https://huggingface.co/InstantX/SD3-Controlnet-Pose",
"filename": "diffusion_pytorch_model.safetensors",
"url": "https://huggingface.co/InstantX/SD3-Controlnet-Pose/resolve/main/diffusion_pytorch_model.safetensors",
"size": "1.19GB"
},
{
"name": "InstantX/SD3-Controlnet-Tile",
"type": "controlnet",
"base": "SD3",
"save_path": "controlnet/SD3/InstantX-Controlnet-Tile",
"description": "Controlnet SD3 Tile model.",
"reference": "https://huggingface.co/InstantX/SD3-Controlnet-Tile",
"filename": "diffusion_pytorch_model.safetensors",
"url": "https://huggingface.co/InstantX/SD3-Controlnet-Tile/resolve/main/diffusion_pytorch_model.safetensors",
"size": "1.19GB"
},
{
"name": "xinsir/ControlNet Depth SDXL, support zoe, midias",
"type": "controlnet",
"base": "SDXL",
"save_path": "controlnet/SDXL/controlnet-depth-sdxl-1.0",
"description": "Controlnet SDXL Depth model.",
"reference": "https://huggingface.co/xinsir/controlnet-depth-sdxl-1.0",
"filename": "diffusion_pytorch_model.safetensors",
"url": "https://huggingface.co/xinsir/controlnet-depth-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors",
"size": "2.50GB"
},
{
"name": "xinsir/ControlNet Tile SDXL",
"type": "controlnet",
"base": "SDXL",
"save_path": "controlnet/SDXL/controlnet-tile-sdxl-1.0",
"description": "Controlnet SDXL Tile model.",
"reference": "https://huggingface.co/xinsir/controlnet-tile-sdxl-1.0",
"filename": "diffusion_pytorch_model.safetensors",
"url": "https://huggingface.co/xinsir/controlnet-tile-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors",
"size": "2.50GB"
},
{
"name": "google-t5/t5-base",
"type": "clip",
"base": "t5-base",
"save_path": "clip/t5-base",
"description": "T5 Base: Text-To-Text Transfer Transformer. This model can be loaded via CLIPLoader for Stable Audio workflow.",
"reference": "https://huggingface.co/google-t5/t5-base",
"filename": "model.safetensors",
"url": "https://huggingface.co/google-t5/t5-base/resolve/main/model.safetensors",
"size": "892MB"
},
{
"name": "PixArt-Sigma-XL-2-1024-MS.pth",
"type": "checkpoint",
"base": "pixart-sigma",
"save_path": "checkpoints/PixArt-Sigma",
"description": "PixArt-Sigma Checkpoint model",
"reference": "https://huggingface.co/PixArt-alpha/PixArt-Sigma/tree/main",
"filename": "PixArt-Sigma-XL-2-1024-MS.pth",
"url": "https://huggingface.co/PixArt-alpha/PixArt-Sigma/resolve/main/PixArt-Sigma-XL-2-1024-MS.pth",
"size": "2.47GB"
},
{
"name": "TAESD3 Decoder",
"type": "TAESD",
@ -8,7 +88,8 @@
"description": "(SD3 Verison) To view the preview in high quality while running samples in ComfyUI, you will need this model.",
"reference": "https://github.com/madebyollin/taesd",
"filename": "taesd3_decoder.pth",
"url": "https://github.com/madebyollin/taesd/raw/main/taesd3_decoder.pth"
"url": "https://github.com/madebyollin/taesd/raw/main/taesd3_decoder.pth",
"size": "4.94MB"
},
{
"name": "TAESD3 Encoder",
@ -18,7 +99,8 @@
"description": "(SD3 Verison) To view the preview in high quality while running samples in ComfyUI, you will need this model.",
"reference": "https://github.com/madebyollin/taesd",
"filename": "taesd3_encoder.pth",
"url": "https://github.com/madebyollin/taesd/raw/main/taesd3_encoder.pth"
"url": "https://github.com/madebyollin/taesd/raw/main/taesd3_encoder.pth",
"size": "4.94MB"
},
{
@ -26,10 +108,11 @@
"type": "controlnet",
"base": "SDXL",
"save_path": "controlnet/SDXL",
"description": "[774MB] Controlnet SDXL Tile model realistic version.",
"description": "Controlnet SDXL Tile model realistic version.",
"reference": "https://huggingface.co/TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic",
"filename": "TTPLANET_Controlnet_Tile_realistic_v2_rank256.safetensors",
"url": "https://huggingface.co/TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic/resolve/main/TTPLANET_Controlnet_Tile_realistic_v2_rank256.safetensors"
"url": "https://huggingface.co/TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic/resolve/main/TTPLANET_Controlnet_Tile_realistic_v2_rank256.safetensors",
"size": "774.4MB"
},
{
@ -37,20 +120,22 @@
"type": "depthanything",
"base": "depthanything",
"save_path": "depthanything",
"description": "[195MB] DepthAnythingV2 model",
"description": "DepthAnythingV2 model",
"reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main",
"filename": "depth_anything_v2_vitb_fp16.safetensors",
"url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vitb_fp16.safetensors"
"url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vitb_fp16.safetensors",
"size": "195.0MB"
},
{
"name": "kijai/DepthAnythingV2 (vitb/fp32)",
"type": "depthanything",
"base": "depthanything",
"save_path": "depthanything",
"description": "[390MB] DepthAnythingV2 model",
"description": "DepthAnythingV2 model",
"reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main",
"filename": "depth_anything_v2_vitb_fp32.safetensors",
"url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vitb_fp32.safetensors"
"url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vitb_fp32.safetensors",
"size": "389.9MB"
},
{
"name": "kijai/DepthAnythingV2 (vitl/fp16)",
@ -60,7 +145,8 @@
"description": "[671MB] DepthAnythingV2 model",
"reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main",
"filename": "depth_anything_v2_vitl_fp16.safetensors",
"url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vitl_fp16.safetensors"
"url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vitl_fp16.safetensors",
"size": "670.7MB"
},
{
"name": "kijai/DepthAnythingV2 (vitl/fp32)",
@ -70,7 +156,8 @@
"description": "[195MB] DepthAnythingV2 model",
"reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main",
"filename": "depth_anything_v2_vitl_fp32.safetensors",
"url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vitl_fp32.safetensors"
"url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vitl_fp32.safetensors",
"size": "1.34GB"
},
{
"name": "kijai/DepthAnythingV2 (vits/fp16)",
@ -80,7 +167,8 @@
"description": "[49.6MB] DepthAnythingV2 model",
"reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main",
"filename": "depth_anything_v2_vits_fp16.safetensors",
"url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vits_fp16.safetensors"
"url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vits_fp16.safetensors",
"size": "49.6MB"
},
{
"name": "kijai/DepthAnythingV2 (vitb/fp32)",
@ -90,7 +178,8 @@
"description": "[99.2MB] DepthAnythingV2 model",
"reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main",
"filename": "depth_anything_v2_vits_fp32.safetensors",
"url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vits_fp32.safetensors"
"url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vits_fp32.safetensors",
"size": "99.2MB"
},
{
@ -101,7 +190,8 @@
"description": "[2.5GB] AnyTest Controlnet. A model for style transfer.",
"reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main",
"filename": "CN-anytest_v4-marged.safetensors",
"url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged.safetensors"
"url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged.safetensors",
"size": "2.50GB"
},
{
"name": "CN-anytest_v4-marged_am_dim256.safetensors (dim256/Animagine)",
@ -111,7 +201,8 @@
"description": "[774MB] AnyTest Controlnet Lora (dim256) for Animagine. A model for style transfer.",
"reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main",
"filename": "CN-anytest_v4-marged_am_dim256.safetensors",
"url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_am_dim256.safetensors"
"url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_am_dim256.safetensors",
"size": "774.4MB"
},
{
"name": "CN-anytest_v4-marged_am_dim128.safetensors (dim128/Animagine)",
@ -121,7 +212,8 @@
"description": "[396MB] AnyTest Controlnet Lora (dim128) for Animagine. A model for style transfer.",
"reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main",
"filename": "CN-anytest_v4-marged_am_dim128.safetensors",
"url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_am_dim128.safetensors"
"url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_am_dim128.safetensors",
"size": "395.7MB"
},
{
"name": "CN-anytest_v4-marged_pn_dim256.safetensors (dim256/Pony)",
@ -131,7 +223,8 @@
"description": "[774MB] AnyTest Controlnet Lora (dim256) for Pony. A model for style transfer.",
"reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main",
"filename": "CN-anytest_v4-marged_pn_dim256.safetensors",
"url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_pn_dim256.safetensors"
"url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_pn_dim256.safetensors",
"size": "774.4MB"
},
{
"name": "CN-anytest_v4-marged_pn_dim128.safetensors (dim128/Pony)",
@ -141,9 +234,9 @@
"description": "[396MB] AnyTest Controlnet Lora (dim128) for Pony. A model for style transfer.",
"reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main",
"filename": "CN-anytest_v4-marged_pn_dim128.safetensors",
"url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_pn_dim128.safetensors"
"url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_pn_dim128.safetensors",
"size": "395.7MB"
},
{
"name": "CN-anytest_v3-50000_fp16.safetensors (fp16)",
"type": "controlnet",
@ -152,7 +245,8 @@
"description": "[2.5GB] AnyTest Controlnet. A strict control model.",
"reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main",
"filename": "CN-anytest_v3-50000_fp16.safetensors",
"url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_fp16.safetensors"
"url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_fp16.safetensors",
"size": "2.50GB"
},
{
"name": "CN-anytest_v3-50000_am_dim256.safetensors (dim256/Animagine)",
@ -162,7 +256,8 @@
"description": "[774MB] AnyTest Controlnet Lora (dim256) for Animagine. A strict control model.",
"reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main",
"filename": "CN-anytest_v3-50000_am_dim256.safetensors",
"url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_am_dim256.safetensors"
"url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_am_dim256.safetensors",
"size": "774.4MB"
},
{
"name": "CN-anytest_v3-50000_am_dim128.safetensors (dim128/Animagine)",
@ -172,7 +267,8 @@
"description": "[396MB] AnyTest Controlnet Lora (dim128) for Animagine. A strict control model.",
"reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main",
"filename": "CN-anytest_v3-50000_am_dim128.safetensors",
"url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_am_dim128.safetensors"
"url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_am_dim128.safetensors",
"size": "395.7MB"
},
{
"name": "CN-anytest_v3-50000_pn_dim256.safetensors (dim256/Pony)",
@ -182,7 +278,8 @@
"description": "[774MB] AnyTest Controlnet Lora (dim256) for Pony. A strict control model.",
"reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main",
"filename": "CN-anytest_v3-50000_pn_dim256.safetensors",
"url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_pn_dim256.safetensors"
"url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_pn_dim256.safetensors",
"size": "774.4MB"
},
{
"name": "CN-anytest_v3-50000_pn_dim128.safetensors (dim128/Pony)",
@ -192,7 +289,8 @@
"description": "[396MB] AnyTest Controlnet Lora (dim128) for Pony. A strict control model.",
"reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main",
"filename": "CN-anytest_v3-50000_pn_dim128.safetensors",
"url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_pn_dim128.safetensors"
"url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_pn_dim128.safetensors",
"size": "395.7MB"
},
{
@ -203,7 +301,8 @@
"description": "[5.25GB] ToonCrafter checkpoint model for ComfyUI-DynamiCrafterWrapper",
"reference": "https://huggingface.co/Kijai/DynamiCrafter_pruned",
"filename": "tooncrafter_512_interp-fp16.safetensors",
"url": "https://huggingface.co/Kijai/DynamiCrafter_pruned/resolve/main/tooncrafter_512_interp-fp16.safetensors"
"url": "https://huggingface.co/Kijai/DynamiCrafter_pruned/resolve/main/tooncrafter_512_interp-fp16.safetensors",
"size": "5.25GB"
},
{
@ -214,7 +313,8 @@
"description": "[2.5GB] Controlnet SDXL Scribble model.",
"reference": "https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0",
"filename": "diffusion_pytorch_model.safetensors",
"url": "https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors"
"url": "https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors",
"size": "2.50GB"
},
{
"name": "xinsir/Controlnet-Canny-Sdxl-1.0 (V2)",
@ -224,7 +324,8 @@
"description": "[2.5GB] Controlnet SDXL Canny model.",
"reference": "https://huggingface.co/xinsir/controlnet-canny-sdxl-1.0",
"filename": "diffusion_pytorch_model_V2.safetensors",
"url": "https://huggingface.co/xinsir/controlnet-canny-sdxl-1.0/resolve/main/diffusion_pytorch_model_V2.safetensors"
"url": "https://huggingface.co/xinsir/controlnet-canny-sdxl-1.0/resolve/main/diffusion_pytorch_model_V2.safetensors",
"size": "2.50GB"
},
{
"name": "xinsir/Controlnet-Openpose-Sdxl-1.0",
@ -234,7 +335,8 @@
"description": "[2.5GB] Controlnet SDXL Openpose model.",
"reference": "https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0",
"filename": "diffusion_pytorch_model.safetensors",
"url": "https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors"
"url": "https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors",
"size": "2.50GB"
},
{
"name": "xinsir/Controlnet-Openpose-Sdxl-1.0 (Ver. twins)",
@ -244,7 +346,8 @@
"description": "[2.5GB] Controlnet SDXL Openpose model. (Ver. twins)",
"reference": "https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0",
"filename": "diffusion_pytorch_model_twins.safetensors",
"url": "https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0/resolve/main/diffusion_pytorch_model_twins.safetensors"
"url": "https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0/resolve/main/diffusion_pytorch_model_twins.safetensors",
"size": "2.50GB"
},
{
"name": "xinsir/Controlnet-Scribble-Sdxl-1.0-Anime",
@ -254,7 +357,8 @@
"description": "[2.5GB] Controlnet SDXL Scribble model. (Ver. anime)",
"reference": "https://huggingface.co/xinsir/anime-painter",
"filename": "diffusion_pytorch_model.safetensors",
"url": "https://huggingface.co/xinsir/anime-painter/resolve/main/diffusion_pytorch_model.safetensors"
"url": "https://huggingface.co/xinsir/anime-painter/resolve/main/diffusion_pytorch_model.safetensors",
"size": "2.50GB"
},
{
@ -265,9 +369,43 @@
"description": "[10.5GB] ToonCrafter checkpoint model for ComfyUI-ToonCrafter",
"reference": "https://huggingface.co/Doubiiu/ToonCrafter/tree/main",
"filename": "model.ckpt",
"url": "https://huggingface.co/Doubiiu/ToonCrafter/resolve/main/model.ckpt"
"url": "https://huggingface.co/Doubiiu/ToonCrafter/resolve/main/model.ckpt",
"size": "10.5GB"
},
{
"name": "ViperYX/RGT_x2.pth",
"type": "RGT",
"base": "RGT",
"save_path": "RGT/RGT",
"description": "[180MB] RGT x2 upscale model for ComfyUI-RGT",
"reference": "https://huggingface.co/ViperYX/RGT/tree/main",
"filename": "RGT_x2.pth",
"url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT/RGT_x2.pth",
"size": "179.8MB"
},
{
"name": "ViperYX/RGT_x3.pth",
"type": "RGT",
"base": "RGT",
"save_path": "RGT/RGT",
"description": "[180MB] RGT x3 upscale model for ComfyUI-RGT",
"reference": "https://huggingface.co/ViperYX/RGT/tree/main",
"filename": "RGT_x3.pth",
"url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT/RGT_x3.pth",
"size": "180.5MB"
},
{
"name": "ViperYX/RGT_x4.pth",
"type": "RGT",
"base": "RGT",
"save_path": "RGT/RGT",
"description": "[180MB] RGT_S x4 upscale model for ComfyUI-RGT",
"reference": "https://huggingface.co/ViperYX/RGT/tree/main",
"filename": "RGT_x4.pth",
"url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT/RGT_x4.pth",
"size": "180.4MB"
},
{
"name": "ViperYX/RGT_S_x2.pth",
"type": "RGT",
@ -276,7 +414,8 @@
"description": "[135MB] RGT_S x2 upscale model for ComfyUI-RGT",
"reference": "https://huggingface.co/ViperYX/RGT/tree/main",
"filename": "RGT_S_x2.pth",
"url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT_S/RGT_S_x2.pth"
"url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT_S/RGT_S_x2.pth",
"size": "135.4MB"
},
{
"name": "ViperYX/RGT_S_x3.pth",
@ -286,7 +425,8 @@
"description": "[136MB] RGT_S x3 upscale model for ComfyUI-RGT",
"reference": "https://huggingface.co/ViperYX/RGT/tree/main",
"filename": "RGT_S_x3.pth",
"url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT_S/RGT_S_x3.pth"
"url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT_S/RGT_S_x3.pth",
"size": "136.1MB"
},
{
"name": "ViperYX/RGT_S_x4.pth",
@ -296,7 +436,8 @@
"description": "[136MB] RGT_S x4 upscale model for ComfyUI-RGT",
"reference": "https://huggingface.co/ViperYX/RGT/tree/main",
"filename": "RGT_S_x4.pth",
"url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT_S/RGT_S_x4.pth"
"url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT_S/RGT_S_x4.pth",
"size": "136.0MB"
},
{
@ -307,7 +448,8 @@
"description": "[2.5GB] Controlnet SDXL Tile model realistic version.",
"reference": "https://huggingface.co/TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic",
"filename": "TTPLANET_Controlnet_Tile_realistic_v2_fp16.safetensors",
"url": "https://huggingface.co/TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic/resolve/main/TTPLANET_Controlnet_Tile_realistic_v2_fp16.safetensors"
"url": "https://huggingface.co/TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic/resolve/main/TTPLANET_Controlnet_Tile_realistic_v2_fp16.safetensors",
"size": "2.50GB"
},
{
@ -318,7 +460,8 @@
"description": "CustomNet pretrained model for ComfyUI_CustomNet",
"reference": "https://huggingface.co/TencentARC/CustomNet/tree/main",
"filename": "customnet_v1.pt",
"url": "https://huggingface.co/TencentARC/CustomNet/resolve/main/customnet_v1.pt"
"url": "https://huggingface.co/TencentARC/CustomNet/resolve/main/customnet_v1.pt",
"size": "5.71GB"
},
{
@ -329,7 +472,8 @@
"description": "ID-Animator checkpoint",
"reference": "https://huggingface.co/spaces/ID-Animator/ID-Animator",
"filename": "animator.ckpt",
"url": "https://huggingface.co/spaces/ID-Animator/ID-Animator/resolve/main/animator.ckpt"
"url": "https://huggingface.co/spaces/ID-Animator/ID-Animator/resolve/main/animator.ckpt",
"size": "247.3MB"
},
{
"name": "ID-Animator/mm_sd_v15_v2.ckpt",
@ -339,7 +483,8 @@
"description": "AnimateDiff checkpoint for ID-Animator",
"reference": "https://huggingface.co/spaces/ID-Animator/ID-Animator",
"filename": "mm_sd_v15_v2.ckpt",
"url": "https://huggingface.co/spaces/ID-Animator/ID-Animator/resolve/main/mm_sd_v15_v2.ckpt"
"url": "https://huggingface.co/spaces/ID-Animator/ID-Animator/resolve/main/mm_sd_v15_v2.ckpt",
"size": "1.82GB"
},
{
"name": "ID-Animator/image_encoder",
@ -349,7 +494,8 @@
"description": "CLIP Image encoder for ID-Animator",
"reference": "https://huggingface.co/spaces/ID-Animator/ID-Animator",
"filename": "model.safetensors",
"url": "https://huggingface.co/spaces/ID-Animator/ID-Animator/resolve/main/image_encoder/model.safetensors"
"url": "https://huggingface.co/spaces/ID-Animator/ID-Animator/resolve/main/image_encoder/model.safetensors",
"size": "2.53GB"
},
{
@ -360,7 +506,8 @@
"description": "The default relighting model, conditioned on text and foreground",
"reference": "https://huggingface.co/lllyasviel/ic-light",
"filename": "iclight_sd15_fc.safetensors",
"url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fc.safetensors"
"url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fc.safetensors",
"size": "1.72GB"
},
{
"name": "IC-Light/fbc",
@ -370,7 +517,8 @@
"description": "Relighting model conditioned with text, foreground, and background",
"reference": "https://huggingface.co/lllyasviel/ic-light",
"filename": "iclight_sd15_fbc.safetensors",
"url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fbc.safetensors"
"url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fbc.safetensors",
"size": "1.72GB"
},
{
"name": "IC-Light/fcon",
@ -380,7 +528,8 @@
"description": "Same as iclight_sd15_fc.safetensors, but trained with offset noise",
"reference": "https://huggingface.co/lllyasviel/ic-light",
"filename": "iclight_sd15_fcon.safetensors",
"url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fcon.safetensors"
"url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fcon.safetensors",
"size": "1.72GB"
},
{
@ -391,7 +540,8 @@
"description": "MonsterMMORPG insightface model for cubiq/InstantID",
"reference": "https://huggingface.co/MonsterMMORPG/tools/tree/main",
"filename": "antelopev2.zip",
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/antelopev2.zip"
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/antelopev2.zip",
"size": "360.7MB"
},
{
"name": "InstantID/ip-adapter",
@ -543,139 +693,6 @@
"reference": "https://huggingface.co/monster-labs/control_v1p_sdxl_qrcode_monster",
"filename": "control_v1p_sdxl_qrcode_monster.safetensors",
"url": "https://huggingface.co/monster-labs/control_v1p_sdxl_qrcode_monster/resolve/main/diffusion_pytorch_model.safetensors"
},
{
"name": "DynamiCrafter 1024 bf16 safetensors",
"type": "checkpoints",
"base": "DynamiCrafter",
"save_path": "checkpoints/dynamicrafter",
"description": "DynamiCrafter image2video model 1024x575",
"reference": "https://huggingface.co/Kijai/DynamiCrafter_pruned/",
"filename": "dynamicrafter_1024_v1_bf16.safetensors",
"url": "https://huggingface.co/Kijai/DynamiCrafter_pruned/resolve/main/dynamicrafter_1024_v1_bf16.safetensors"
},
{
"name": "DynamiCrafter 512 interpolation bf16 safetensors",
"type": "checkpoints",
"base": "DynamiCrafter",
"save_path": "checkpoints/dynamicrafter",
"description": "DynamiCrafter image2video interpolation model 512",
"reference": "https://huggingface.co/Kijai/DynamiCrafter_pruned/",
"filename": "dynamicrafter_512_interp_v1_bf16.safetensors",
"url": "https://huggingface.co/Kijai/DynamiCrafter_pruned/resolve/main/dynamicrafter_512_interp_v1_bf16.safetensors"
},
{
"name": "MobileSAM",
"type": "sam",
"base": "SAM",
"save_path": "sams",
"description": "MobileSAM",
"reference": "https://github.com/ChaoningZhang/MobileSAM/",
"filename": "mobile_sam.pt",
"url": "https://github.com/ChaoningZhang/MobileSAM/blob/master/weights/mobile_sam.pt"
},
{
"name": "BLIP ImageCaption (COCO) w/ ViT-B and CapFilt-L",
"type": "BLIP_MODEL",
"base": "blip_model",
"save_path": "blip",
"description": "BLIP ImageCaption (COCO) w/ ViT-B and CapFilt-L",
"reference": "https://github.com/salesforce/BLIP",
"filename": "model_base_capfilt_large.pth",
"url": "https://storage.googleapis.com/sfr-vision-language-research/BLIP/models/model_base_capfilt_large.pth"
},
{
"name": "GroundingDINO SwinT OGC - Model",
"type": "GroundingDINO",
"base": "DINO",
"save_path": "groundingdino",
"description": "GroundingDINO SwinT OGC Model",
"reference": "https://huggingface.co/ShilongLiu/GroundingDINO",
"filename": "groundingdino_swint_ogc.pth",
"url": "https://huggingface.co/ShilongLiu/GroundingDINO/resolve/main/groundingdino_swint_ogc.pth"
},
{
"name": "GroundingDINO SwinT OGC - CFG File",
"type": "GroundingDINO",
"base": "DINO",
"save_path": "groundingdino",
"description": "GroundingDINO SwinT OGC CFG File",
"reference": "https://huggingface.co/ShilongLiu/GroundingDINO/resolve/main/GroundingDINO_SwinT_OGC.cfg.py",
"filename": "GroundingDINO_SwinT_OGC.cfg.py",
"url": "https://huggingface.co/ShilongLiu/GroundingDINO/raw/main/GroundingDINO_SwinT_OGC.cfg.py"
},
{
"name": "SDXL Lightning LoRA (2step)",
"type": "lora",
"base": "SDXL",
"save_path": "loras/SDXL-Lightning",
"description": "SDXL Lightning LoRA (2step)",
"reference": "https://huggingface.co/ByteDance/SDXL-Lightning",
"filename": "sdxl_lightning_2step_lora.safetensors",
"url": "https://huggingface.co/ByteDance/SDXL-Lightning/resolve/main/sdxl_lightning_2step_lora.safetensors"
},
{
"name": "SDXL Lightning LoRA (4step)",
"type": "lora",
"base": "SDXL",
"save_path": "loras/SDXL-Lightning",
"description": "SDXL Lightning LoRA (4step)",
"reference": "https://huggingface.co/ByteDance/SDXL-Lightning",
"filename": "sdxl_lightning_4step_lora.safetensors",
"url": "https://huggingface.co/ByteDance/SDXL-Lightning/resolve/main/sdxl_lightning_4step_lora.safetensors"
},
{
"name": "SDXL Lightning LoRA (8step)",
"type": "lora",
"base": "SDXL",
"save_path": "loras/SDXL-Lightning",
"description": "SDXL Lightning LoRA (8tep)",
"reference": "https://huggingface.co/ByteDance/SDXL-Lightning",
"filename": "sdxl_lightning_8step_lora.safetensors",
"url": "https://huggingface.co/ByteDance/SDXL-Lightning/resolve/main/sdxl_lightning_8step_lora.safetensors"
},
{
"name": "shape_predictor_68_face_landmarks.dat [Face Analysis]",
"type": "Shape Predictor",
"base": "DLIB",
"save_path": "custom_nodes/ComfyUI_FaceAnalysis/dlib",
"description": "To use the Face Analysis for ComfyUI custom node, installation of this model is needed.",
"reference": "https://huggingface.co/matt3ounstable/dlib_predictor_recognition/tree/main",
"filename": "shape_predictor_68_face_landmarks.dat",
"url": "https://huggingface.co/matt3ounstable/dlib_predictor_recognition/resolve/main/shape_predictor_68_face_landmarks.dat"
},
{
"name": "dlib_face_recognition_resnet_model_v1.dat [Face Analysis]",
"type": "Face Recognition",
"base": "DLIB",
"save_path": "custom_nodes/ComfyUI_FaceAnalysis/dlib",
"description": "To use the Face Analysis for ComfyUI custom node, installation of this model is needed.",
"reference": "https://huggingface.co/matt3ounstable/dlib_predictor_recognition/tree/main",
"filename": "dlib_face_recognition_resnet_model_v1.dat",
"url": "https://huggingface.co/matt3ounstable/dlib_predictor_recognition/resolve/main/dlib_face_recognition_resnet_model_v1.dat"
},
{
"name": "efficient_sam_s_cpu.jit [ComfyUI-YoloWorld-EfficientSAM]",
"type": "efficient_sam",
"base": "efficient_sam",
"save_path": "custom_nodes/ComfyUI-YoloWorld-EfficientSAM",
"description": "Install efficient_sam_s_cpu.jit into ComfyUI-YoloWorld-EfficientSAM",
"reference": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/tree/main",
"filename": "efficient_sam_s_cpu.jit",
"url": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/resolve/main/efficient_sam_s_cpu.jit"
},
{
"name": "efficient_sam_s_gpu.jit [ComfyUI-YoloWorld-EfficientSAM]",
"type": "efficient_sam",
"base": "efficient_sam",
"save_path": "custom_nodes/ComfyUI-YoloWorld-EfficientSAM",
"description": "Install efficient_sam_s_gpu.jit into ComfyUI-YoloWorld-EfficientSAM",
"reference": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/tree/main",
"filename": "efficient_sam_s_gpu.jit",
"url": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/resolve/main/efficient_sam_s_gpu.jit"
}
]
}

View File

@ -209,6 +209,26 @@
],
"install_type": "git-clone",
"description": "Nodes:Signature|Ye, CheckpointLoader|Ye, PrintHelloWorld|Ye."
},
{
"author": "BoosterCore",
"title": "ComfyUI-BC-Experimental",
"reference": "https://github.com/BoosterCore/ComfyUI-BC-Experimental",
"files": [
"https://github.com/BoosterCore/ComfyUI-BC-Experimental"
],
"install_type": "git-clone",
"description": "Nodes:ClipTextEncodeBC, SaveAnyText, SimpleText"
},
{
"author": "sonyeon-sj",
"title": "ComfyUI-easy_ImageSize_Selecter",
"reference": "https://github.com/sonyeon-sj/ComfyUI-easy_ImageSize_Selecter",
"files": [
"https://github.com/sonyeon-sj/ComfyUI-easy_ImageSize_Selecter"
],
"install_type": "git-clone",
"description": "Custom node for ComfyUI Select the image size from the preset and select Vertical and Horizontal to output Width and Height."
}
]
}

View File

@ -10,6 +10,7 @@ import platform
import json
import ast
glob_path = os.path.join(os.path.dirname(__file__), "glob")
sys.path.append(glob_path)
@ -59,6 +60,9 @@ def check_file_logging():
check_file_logging()
comfy_path = os.environ.get('COMFYUI_PATH')
if comfy_path is None:
comfy_path = os.path.abspath(sys.modules['__main__'].__file__)
sys.__comfyui_manager_register_message_collapse = register_message_collapse
sys.__comfyui_manager_is_import_failed_extension = is_import_failed_extension
@ -137,8 +141,8 @@ def handle_stream(stream, prefix):
print(prefix, msg, end="")
def process_wrap(cmd_str, cwd_path, handler=None):
process = subprocess.Popen(cmd_str, cwd=cwd_path, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, bufsize=1)
def process_wrap(cmd_str, cwd_path, handler=None, env=None):
process = subprocess.Popen(cmd_str, cwd=cwd_path, env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, bufsize=1)
if handler is None:
handler = handle_stream
@ -333,6 +337,7 @@ print("** ComfyUI startup time:", datetime.datetime.now())
print("** Platform:", platform.system())
print("** Python version:", sys.version)
print("** Python executable:", sys.executable)
print("** ComfyUI Path:", comfy_path)
if enable_file_logging:
print("** Log path:", os.path.abspath('comfyui.log'))
@ -475,7 +480,10 @@ if os.path.exists(restore_snapshot_path):
print(f"[ComfyUI-Manager] Restore snapshot.")
cmd_str = [sys.executable, git_script_path, '--apply-snapshot', restore_snapshot_path]
exit_code = process_wrap(cmd_str, custom_nodes_path, handler=msg_capture)
new_env = os.environ.copy()
new_env["COMFYUI_PATH"] = comfy_path
exit_code = process_wrap(cmd_str, custom_nodes_path, handler=msg_capture, env=new_env)
repository_name = ''
for url in cloned_repos:
@ -502,7 +510,10 @@ if os.path.exists(restore_snapshot_path):
processed_install.add(f'{repo_path}/install.py')
install_cmd = [sys.executable, install_script_path]
print(f">>> {install_cmd} / {repo_path}")
this_exit_code += process_wrap(install_cmd, repo_path)
new_env = os.environ.copy()
new_env["COMFYUI_PATH"] = comfy_path
this_exit_code += process_wrap(install_cmd, repo_path, env=new_env)
if this_exit_code != 0:
print(f"[ComfyUI-Manager] Restoring '{repository_name}' is failed.")
@ -542,7 +553,10 @@ def execute_lazy_install_script(repo_path, executable):
processed_install.add(f'{repo_path}/install.py')
print(f"Install: install script for '{repo_path}'")
install_cmd = [executable, "install.py"]
process_wrap(install_cmd, repo_path)
new_env = os.environ.copy()
new_env["COMFYUI_PATH"] = comfy_path
process_wrap(install_cmd, repo_path, env=new_env)
# Check if script_list_path exists
@ -576,7 +590,9 @@ if os.path.exists(script_list_path):
print(f"\n## ComfyUI-Manager: EXECUTE => {script[1:]}")
print(f"\n## Execute install/(de)activation script for '{script[0]}'")
exit_code = process_wrap(script[1:], script[0])
new_env = os.environ.copy()
new_env["COMFYUI_PATH"] = comfy_path
exit_code = process_wrap(script[1:], script[0], env=new_env)
if exit_code != 0:
print(f"install/(de)activation script failed: {script[0]}")

View File

@ -1,7 +1,7 @@
[project]
name = "comfyui-manager"
description = "ComfyUI-Manager provides features to install and manage custom nodes for ComfyUI, as well as various functionalities to assist with ComfyUI."
version = "2.38.2"
version = "2.43"
license = "LICENSE"
dependencies = ["GitPython", "PyGithub", "matrix-client==0.4.0", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions"]