Merge branch 'ltdrdata:main' into main
@ -5,6 +5,7 @@
|
|||||||

|

|
||||||
|
|
||||||
## NOTICE
|
## NOTICE
|
||||||
|
* V2.37 Show a ✅ mark to accounts that have been active on GitHub for more than six months.
|
||||||
* V2.33 Security policy is applied.
|
* V2.33 Security policy is applied.
|
||||||
* V2.21 [cm-cli](docs/en/cm-cli.md) tool is added.
|
* V2.21 [cm-cli](docs/en/cm-cli.md) tool is added.
|
||||||
* V2.18 to V2.18.3 is not functioning due to a severe bug. Users on these versions are advised to promptly update to V2.18.4. Please navigate to the `ComfyUI/custom_nodes/ComfyUI-Manager` directory and execute `git pull` to update.
|
* V2.18 to V2.18.3 is not functioning due to a severe bug. Users on these versions are advised to promptly update to V2.18.4. Please navigate to the `ComfyUI/custom_nodes/ComfyUI-Manager` directory and execute `git pull` to update.
|
||||||
@ -85,6 +86,7 @@ This repository provides Colab notebooks that allow you to install and use Comfy
|
|||||||
* Support for automatically installing dependencies of custom nodes upon restarting Colab notebooks.
|
* Support for automatically installing dependencies of custom nodes upon restarting Colab notebooks.
|
||||||
|
|
||||||
## Changes
|
## Changes
|
||||||
|
* **2.38** `Install Custom Nodes` menu is changed to `Custom Nodes Manager`.
|
||||||
* **2.21** [cm-cli](docs/en/cm-cli.md) tool is added.
|
* **2.21** [cm-cli](docs/en/cm-cli.md) tool is added.
|
||||||
* **2.4** Copy the connections of the nearest node by double-clicking.
|
* **2.4** Copy the connections of the nearest node by double-clicking.
|
||||||
* **2.2.3** Support Components System
|
* **2.2.3** Support Components System
|
||||||
@ -277,11 +279,11 @@ NODE_CLASS_MAPPINGS.update({
|
|||||||
|
|
||||||
## Support of missing nodes installation
|
## Support of missing nodes installation
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
* When you click on the ```Install Missing Custom Nodes``` button in the menu, it displays a list of extension nodes that contain nodes not currently present in the workflow.
|
* When you click on the ```Install Missing Custom Nodes``` button in the menu, it displays a list of extension nodes that contain nodes not currently present in the workflow.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
## Additional Feature
|
## Additional Feature
|
||||||
|
|||||||
@ -126,7 +126,7 @@
|
|||||||
"description": "This is a ported version of ComfyUI for the sd-webui-roop-nsfw extension."
|
"description": "This is a ported version of ComfyUI for the sd-webui-roop-nsfw extension."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id":"https://github.com/laksjdjf/attention-couple-ComfyUI",
|
"id":"https://github.com/laksjdjf/cgem156-ComfyUI",
|
||||||
"tags":"regional prompt, latent couple, prompt",
|
"tags":"regional prompt, latent couple, prompt",
|
||||||
"description": "This custom nodes provide a functionality similar to regional prompts, offering couple features at the attention level."
|
"description": "This custom nodes provide a functionality similar to regional prompts, offering couple features at the attention level."
|
||||||
},
|
},
|
||||||
@ -214,6 +214,11 @@
|
|||||||
"id":"https://github.com/portu-sim/comfyui-bmab",
|
"id":"https://github.com/portu-sim/comfyui-bmab",
|
||||||
"tags":"bmab",
|
"tags":"bmab",
|
||||||
"description": "a comfyui custom node for [a/sd-webui-bmab](https://github.com/portu-sim/sd-webui-bmab)"
|
"description": "a comfyui custom node for [a/sd-webui-bmab](https://github.com/portu-sim/sd-webui-bmab)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id":"https://github.com/ThereforeGames/ComfyUI-Unprompted",
|
||||||
|
"tags":"unprompted",
|
||||||
|
"description": "This extension is a port of [a/unprompted](https://github.com/ThereforeGames/unprompted)"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
14
check.sh
@ -1,5 +1,8 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo CHECK1
|
||||||
|
|
||||||
files=(
|
files=(
|
||||||
"custom-node-list.json"
|
"custom-node-list.json"
|
||||||
"model-list.json"
|
"model-list.json"
|
||||||
@ -26,3 +29,14 @@ files=(
|
|||||||
for file in "${files[@]}"; do
|
for file in "${files[@]}"; do
|
||||||
python json-checker.py "$file"
|
python json-checker.py "$file"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo CHECK2
|
||||||
|
find ~/.tmp/default -name "*.py" -print0 | xargs -0 grep "crypto"
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo CHECK3
|
||||||
|
find ~/.tmp/default -name "requirements.txt" | xargs grep "^\s*https\\?:"
|
||||||
|
find ~/.tmp/default -name "requirements.txt" | xargs grep "\.whl"
|
||||||
|
|
||||||
|
echo
|
||||||
|
|||||||
@ -46,6 +46,17 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Nodes: ModelSamplerTonemapNoiseTest, TonemapNoiseWithRescaleCFG, ReferenceOnlySimple, RescaleClassifierFreeGuidanceTest, ModelMergeBlockNumber, ModelMergeSDXL, ModelMergeSDXLTransformers, ModelMergeSDXLDetailedTransformers."
|
"description": "Nodes: ModelSamplerTonemapNoiseTest, TonemapNoiseWithRescaleCFG, ReferenceOnlySimple, RescaleClassifierFreeGuidanceTest, ModelMergeBlockNumber, ModelMergeSDXL, ModelMergeSDXLTransformers, ModelMergeSDXLDetailedTransformers."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "comfyanonymous",
|
||||||
|
"title": "TensorRT Node for ComfyUI",
|
||||||
|
"id": "tensorrt",
|
||||||
|
"reference": "https://github.com/comfyanonymous/ComfyUI_TensorRT",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/comfyanonymous/ComfyUI_TensorRT"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This node enables the best performance on NVIDIA RTX™ Graphics Cards (GPUs) for Stable Diffusion by leveraging NVIDIA TensorRT."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "Stability-AI",
|
"author": "Stability-AI",
|
||||||
"title": "Stability API nodes for ComfyUI",
|
"title": "Stability API nodes for ComfyUI",
|
||||||
@ -2010,14 +2021,14 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"author": "laksjdjf",
|
"author": "laksjdjf",
|
||||||
"title": "attention-couple-ComfyUI",
|
"title": "cgem156-ComfyUI🍌",
|
||||||
"id": "attention-couple",
|
"id": "cgem156",
|
||||||
"reference": "https://github.com/laksjdjf/attention-couple-ComfyUI",
|
"reference": "https://github.com/laksjdjf/cgem156-ComfyUI",
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/laksjdjf/attention-couple-ComfyUI"
|
"https://github.com/laksjdjf/cgem156-ComfyUI"
|
||||||
],
|
],
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Nodes:Attention couple. This is a custom node that manipulates region-specific prompts. While vanilla ComfyUI employs an area specification method based on latent couples, this node divides regions using attention layers within UNet."
|
"description": "The custom nodes of laksjdjf have been integrated into the node pack of cgem156🍌.\nNOTE:This includes the attention couple feature."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"author": "laksjdjf",
|
"author": "laksjdjf",
|
||||||
@ -2063,17 +2074,6 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Nodes:CLIP Text Encode (Batch), String Input, Batch String"
|
"description": "Nodes:CLIP Text Encode (Batch), String Input, Batch String"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "laksjdjf",
|
|
||||||
"title": "cgem156-ComfyUI🍌",
|
|
||||||
"id": "cgem156",
|
|
||||||
"reference": "https://github.com/laksjdjf/cgem156-ComfyUI",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/laksjdjf/cgem156-ComfyUI"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "The custom nodes of laksjdjf have been integrated into the node pack of cgem156🍌."
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "alsritter",
|
"author": "alsritter",
|
||||||
"title": "asymmetric-tiling-comfyui",
|
"title": "asymmetric-tiling-comfyui",
|
||||||
@ -3210,6 +3210,17 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "[a/ImageReward](https://github.com/THUDM/ImageReward): Human preference learning in text-to-image generation. This is a [a/paper](https://arxiv.org/abs/2304.05977) from NeurIPS 2023"
|
"description": "[a/ImageReward](https://github.com/THUDM/ImageReward): Human preference learning in text-to-image generation. This is a [a/paper](https://arxiv.org/abs/2304.05977) from NeurIPS 2023"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "shadowcz007",
|
||||||
|
"title": "comfyui-sound-lab",
|
||||||
|
"id": "soundlab",
|
||||||
|
"reference": "https://github.com/shadowcz007/comfyui-sound-lab",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/shadowcz007/comfyui-sound-lab"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:Music Gen, Audio Play, Stable Audio"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "ostris",
|
"author": "ostris",
|
||||||
"title": "Ostris Nodes ComfyUI",
|
"title": "Ostris Nodes ComfyUI",
|
||||||
@ -4003,6 +4014,17 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Animated optical illusions in ComfyUI"
|
"description": "Animated optical illusions in ComfyUI"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "ZHO-ZHO-ZHO",
|
||||||
|
"title": "ComfyUI-Qwen-2",
|
||||||
|
"id": "qwen-2",
|
||||||
|
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-2",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-2"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Using Qwen-2 in ComfyUI"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "kenjiqq",
|
"author": "kenjiqq",
|
||||||
"title": "qq-nodes-comfyui",
|
"title": "qq-nodes-comfyui",
|
||||||
@ -6357,7 +6379,7 @@
|
|||||||
"description": "ComfyS3 seamlessly integrates with [a/Amazon S3](https://aws.amazon.com/en/s3/) in ComfyUI. This open-source project provides custom nodes for effortless loading and saving of images, videos, and checkpoint models directly from S3 buckets within the ComfyUI graph interface."
|
"description": "ComfyS3 seamlessly integrates with [a/Amazon S3](https://aws.amazon.com/en/s3/) in ComfyUI. This open-source project provides custom nodes for effortless loading and saving of images, videos, and checkpoint models directly from S3 buckets within the ComfyUI graph interface."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"author": "davask",
|
"author": "MaraScott",
|
||||||
"title": "🐰 MaraScott Nodes",
|
"title": "🐰 MaraScott Nodes",
|
||||||
"id": "marascott-nodes",
|
"id": "marascott-nodes",
|
||||||
"reference": "https://github.com/MaraScott/ComfyUI_MaraScott_Nodes",
|
"reference": "https://github.com/MaraScott/ComfyUI_MaraScott_Nodes",
|
||||||
@ -6365,7 +6387,7 @@
|
|||||||
"https://github.com/MaraScott/ComfyUI_MaraScott_Nodes"
|
"https://github.com/MaraScott/ComfyUI_MaraScott_Nodes"
|
||||||
],
|
],
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "A set of nodes including a universal bus, an Inpainting By Mask and a large Upscaler/Refiner\n[w/ComfyUI-MarasIT-Nodes has been changed to ComfyUI_MaraScott_Nodes. If you have previously installed ComfyUI-MarasIT-Nodes, Please uninstall the previous one and reinstall this.,\n!!! Deprecated Node will be removed sometime in June 2024. Please update your workflows !!!]"
|
"description": "A set of nodes including a universal bus, an Inpainting By Mask and a large Upscaler/Refiner\n[AnyBus,McInpainty,McBoaty]"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"author": "yffyhk",
|
"author": "yffyhk",
|
||||||
@ -6390,6 +6412,7 @@
|
|||||||
{
|
{
|
||||||
"author": "dfl",
|
"author": "dfl",
|
||||||
"title": "ComfyUI-TCD-scheduler",
|
"title": "ComfyUI-TCD-scheduler",
|
||||||
|
"id": "dfl-tcd",
|
||||||
"reference": "https://github.com/dfl/comfyui-tcd-scheduler",
|
"reference": "https://github.com/dfl/comfyui-tcd-scheduler",
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/dfl/comfyui-tcd-scheduler"
|
"https://github.com/dfl/comfyui-tcd-scheduler"
|
||||||
@ -6952,6 +6975,28 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "ComfyUI native implementation of [a/IC-Light](https://github.com/lllyasviel/IC-Light)."
|
"description": "ComfyUI native implementation of [a/IC-Light](https://github.com/lllyasviel/IC-Light)."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "huchenlei",
|
||||||
|
"title": "ComfyUI DenseDiffusion",
|
||||||
|
"id": "densediffusion",
|
||||||
|
"reference": "https://github.com/huchenlei/ComfyUI_densediffusion",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/huchenlei/ComfyUI_densediffusion"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "[a/DenseDiffusion](https://github.com/naver-ai/DenseDiffusion) custom node for ComfyUI."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "huchenlei",
|
||||||
|
"title": "ComfyUI_omost",
|
||||||
|
"id": "omost",
|
||||||
|
"reference": "https://github.com/huchenlei/ComfyUI_omost",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/huchenlei/ComfyUI_omost"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI implementation of [a/Omost](https://github.com/lllyasviel/Omost), and everything about regional prompt.\nNOTE: You need to install ComfyUI_densediffusion to use this node."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "nathannlu",
|
"author": "nathannlu",
|
||||||
"title": "ComfyUI Pets",
|
"title": "ComfyUI Pets",
|
||||||
@ -6977,7 +7022,7 @@
|
|||||||
{
|
{
|
||||||
"author": "11dogzi",
|
"author": "11dogzi",
|
||||||
"title": "Comfyui-ergouzi-Nodes",
|
"title": "Comfyui-ergouzi-Nodes",
|
||||||
"id": "ergouzi",
|
"id": "ergouzi-nodes",
|
||||||
"reference": "https://github.com/11dogzi/Comfyui-ergouzi-Nodes",
|
"reference": "https://github.com/11dogzi/Comfyui-ergouzi-Nodes",
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/11dogzi/Comfyui-ergouzi-Nodes"
|
"https://github.com/11dogzi/Comfyui-ergouzi-Nodes"
|
||||||
@ -6985,6 +7030,17 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "This is a node group kit that covers multiple nodes such as local refinement, tag management, random prompt words, text processing, image processing, mask processing, etc"
|
"description": "This is a node group kit that covers multiple nodes such as local refinement, tag management, random prompt words, text processing, image processing, mask processing, etc"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "11dogzi",
|
||||||
|
"title": "Comfyui-ergouzi-samplers",
|
||||||
|
"id": "ergouzi-samplers",
|
||||||
|
"reference": "https://github.com/11dogzi/Comfyui-ergouzi-samplers",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/11dogzi/Comfyui-ergouzi-samplers"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Partial redraw sampler and variant seed sampler"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "BXYMartin",
|
"author": "BXYMartin",
|
||||||
"title": "ComfyUI-InstantIDUtils",
|
"title": "ComfyUI-InstantIDUtils",
|
||||||
@ -7116,14 +7172,14 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"author": "ljleb",
|
"author": "ljleb",
|
||||||
"title": "comfy-mecha",
|
"title": "Mecha Merge Node Pack",
|
||||||
"id": "mecha",
|
"id": "mecha",
|
||||||
"reference": "https://github.com/ljleb/comfy-mecha",
|
"reference": "https://github.com/ljleb/comfy-mecha",
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/ljleb/comfy-mecha"
|
"https://github.com/ljleb/comfy-mecha"
|
||||||
],
|
],
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Nodes:Blocks Mecha Hyper, Mecha Merger, Model Mecha Recipe, Custom Code Mecha Recipe"
|
"description": "Model merging node pack with a focus on low memory footprint."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"author": "diSty",
|
"author": "diSty",
|
||||||
@ -7245,6 +7301,17 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "This node is primarily based on Easy-OCR to implement OCR text recognition functionality."
|
"description": "This node is primarily based on Easy-OCR to implement OCR text recognition functionality."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "prodogape",
|
||||||
|
"title": "ComfyUI-OmDet",
|
||||||
|
"id": "omdet",
|
||||||
|
"reference": "https://github.com/prodogape/ComfyUI-OmDet",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/prodogape/ComfyUI-OmDet"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"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": "Alysondao",
|
||||||
"title": "Comfyui-Yolov8-JSON",
|
"title": "Comfyui-Yolov8-JSON",
|
||||||
@ -7389,7 +7456,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"author": "MarkoCa1",
|
"author": "MarkoCa1",
|
||||||
"title": "ComfyUI_Text",
|
"title": "ComfyUI-Text",
|
||||||
"reference": "https://github.com/MarkoCa1/ComfyUI-Text",
|
"reference": "https://github.com/MarkoCa1/ComfyUI-Text",
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/MarkoCa1/ComfyUI-Text"
|
"https://github.com/MarkoCa1/ComfyUI-Text"
|
||||||
@ -7460,7 +7527,17 @@
|
|||||||
"https://github.com/daxcay/ComfyUI-DRMN"
|
"https://github.com/daxcay/ComfyUI-DRMN"
|
||||||
],
|
],
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Data Research And Manipulators Nodes for Model Trainers, Artists, Designers and Animators. Captions, Visualizer, Text Manipulator"
|
"description": "Data Research And Manipulators Nodes for Model Trainers, Artists, Designers and Animators. Captions, Visualizer, Text Manipulator\nNOTE: This repo is renamed to ComfyUI-DataSet."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "daxcay",
|
||||||
|
"title": "ComfyUI-NODEJS",
|
||||||
|
"reference": "https://github.com/daxcay/ComfyUI-NODEJS",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/daxcay/ComfyUI-NODEJS"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This node allows the execution of Node.js application within ComfyUI by leveraging the ComfyUI-NODEJS, which starts alongside ComfyUI and facilitates the installation of Node.js. The integration enables Python subprocesses to execute Node.js scripts."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"author": "Seedsa",
|
"author": "Seedsa",
|
||||||
@ -7879,16 +7956,6 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Custom Node for comfyUI for virtual lighting based on normal map.\nYou can use normal maps to add virtual lighting effects to your images."
|
"description": "Custom Node for comfyUI for virtual lighting based on normal map.\nYou can use normal maps to add virtual lighting effects to your images."
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "AppleBotzz",
|
|
||||||
"title": "ComfyUI_LLMVISION",
|
|
||||||
"reference": "https://github.com/AppleBotzz/ComfyUI_LLMVISION",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/AppleBotzz/ComfyUI_LLMVISION"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "This repository provides integration of GPT-4 and Claude 3 models into ComfyUI, allowing for both image and text-based interactions within the ComfyUI workflow."
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "A4P7J1N7M05OT",
|
"author": "A4P7J1N7M05OT",
|
||||||
"title": "ComfyUI-PixelOE",
|
"title": "ComfyUI-PixelOE",
|
||||||
@ -8075,7 +8142,7 @@
|
|||||||
{
|
{
|
||||||
"author": "AIFSH",
|
"author": "AIFSH",
|
||||||
"title": "ComfyUI-RVC",
|
"title": "ComfyUI-RVC",
|
||||||
"id": "rvc",
|
"id": "aifsh-rvc",
|
||||||
"reference": "https://github.com/AIFSH/ComfyUI-RVC",
|
"reference": "https://github.com/AIFSH/ComfyUI-RVC",
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/AIFSH/ComfyUI-RVC"
|
"https://github.com/AIFSH/ComfyUI-RVC"
|
||||||
@ -8119,7 +8186,7 @@
|
|||||||
{
|
{
|
||||||
"author": "AIFSH",
|
"author": "AIFSH",
|
||||||
"title": "ComfyUI_V-Express",
|
"title": "ComfyUI_V-Express",
|
||||||
"id": "v-express",
|
"id": "v-express-aifsh",
|
||||||
"reference": "https://github.com/AIFSH/ComfyUI_V-Express",
|
"reference": "https://github.com/AIFSH/ComfyUI_V-Express",
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/AIFSH/ComfyUI_V-Express"
|
"https://github.com/AIFSH/ComfyUI_V-Express"
|
||||||
@ -8160,6 +8227,17 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "You can call Chatglm's API in comfyUI to translate and describe pictures, and the API similar to OpenAI."
|
"description": "You can call Chatglm's API in comfyUI to translate and describe pictures, and the API similar to OpenAI."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "smthemex",
|
||||||
|
"title": "ComfyUI_StableAudio_Open",
|
||||||
|
"id": "stable-audio-open-1.0",
|
||||||
|
"reference": "https://github.com/smthemex/ComfyUI_StableAudio_Open",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/smthemex/ComfyUI_StableAudio_Open"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "You can use stable-audio-open-1.0 in comfyUI"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "smthemex",
|
"author": "smthemex",
|
||||||
"title": "ComfyUI_HiDiffusion_Pro",
|
"title": "ComfyUI_HiDiffusion_Pro",
|
||||||
@ -8248,6 +8326,17 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "This node allows you to use customnet."
|
"description": "This node allows you to use customnet."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "smthemex",
|
||||||
|
"title": "ComfyUI_Pops",
|
||||||
|
"id": "pops",
|
||||||
|
"reference": "https://github.com/smthemex/ComfyUI_Pops",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/smthemex/ComfyUI_Pops"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "You can use [a/Popspaper](https://popspaper.github.io/pOps/) method in comfyUI"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "choey",
|
"author": "choey",
|
||||||
"title": "Comfy-Topaz",
|
"title": "Comfy-Topaz",
|
||||||
@ -8542,7 +8631,7 @@
|
|||||||
{
|
{
|
||||||
"author": "JettHu",
|
"author": "JettHu",
|
||||||
"title": "ComfyUI-TCD",
|
"title": "ComfyUI-TCD",
|
||||||
"id": "tcd",
|
"id": "jetthu-tcd",
|
||||||
"reference": "https://github.com/JettHu/ComfyUI-TCD",
|
"reference": "https://github.com/JettHu/ComfyUI-TCD",
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/JettHu/ComfyUI-TCD"
|
"https://github.com/JettHu/ComfyUI-TCD"
|
||||||
@ -8724,17 +8813,6 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Photoshop type functions and adjustment layers: 30 blend modes, Selective Color, Blend If, Color Balance, Solid Color Images, Black and White, Hue/Saturation, Levels, and RGB Splitting and Merging."
|
"description": "Photoshop type functions and adjustment layers: 30 blend modes, Selective Color, Blend If, Color Balance, Solid Color Images, Black and White, Hue/Saturation, Levels, and RGB Splitting and Merging."
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "Shinsplat",
|
|
||||||
"title": "ComfyUI-Shinsplat",
|
|
||||||
"id": "shinsplat",
|
|
||||||
"reference": "https://github.com/Shinsplat/ComfyUI-Shinsplat",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/Shinsplat/ComfyUI-Shinsplat"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Nodes: Clip Text Encode (Shinsplat), Clip Text Encode SDXL (Shinsplat), Lora Loader (Shinsplat)."
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "da2el-ai",
|
"author": "da2el-ai",
|
||||||
"title": "D2 Steps",
|
"title": "D2 Steps",
|
||||||
@ -8875,6 +8953,17 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "This custom node for ComfyUI allows you to create layers of an image based on input masks and save them into a PSD file."
|
"description": "This custom node for ComfyUI allows you to create layers of an image based on input masks and save them into a PSD file."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "alessandrozonta",
|
||||||
|
"title": "OpenPose Node",
|
||||||
|
"id": "openpose-alessandrozonta",
|
||||||
|
"reference": "https://github.com/alessandrozonta/ComfyUI-OpenPose",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/alessandrozonta/ComfyUI-OpenPose"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This extension contains a custom node for ComfyUI. The node, called 'Bounding Box Crop', is designed to compute the top-left coordinates of a cropped bounding box based on input coordinates and dimensions of the final cropped image. It does so computing the center of the cropping area and then computing where the top-left coordinates would be."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "curiousjp",
|
"author": "curiousjp",
|
||||||
"title": "ComfyUI-MaskBatchPermutations",
|
"title": "ComfyUI-MaskBatchPermutations",
|
||||||
@ -8905,7 +8994,7 @@
|
|||||||
"https://github.com/runtime44/comfyui_r44_nodes"
|
"https://github.com/runtime44/comfyui_r44_nodes"
|
||||||
],
|
],
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Nodes: Runtime44Upscaler, Runtime44ColorMatch, Runtime44DynamicKSampler, Runtime44ImageOverlay, Runtime44ImageResizer, Runtime44ImageToNoise, Runtime44MaskSampler, Runtime44TiledMaskSampler, Runtime44IterativeUpscaleFactor, Runtime44ImageEnhance"
|
"description": "Nodes: Runtime44Upscaler, Runtime44ColorMatch, Runtime44DynamicKSampler, Runtime44ImageOverlay, Runtime44ImageResizer, Runtime44ImageToNoise, Runtime44MaskSampler, Runtime44TiledMaskSampler, Runtime44IterativeUpscaleFactor, Runtime44ImageEnhance, Runtime44FilmGrain"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"author": "osiworx",
|
"author": "osiworx",
|
||||||
@ -9387,6 +9476,17 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "ComfyUI-AutoLabel is a custom node for ComfyUI that uses BLIP (Bootstrapping Language-Image Pre-training) to generate detailed descriptions of the main object in an image. This node leverages the power of BLIP to provide accurate and context-aware captions for images."
|
"description": "ComfyUI-AutoLabel is a custom node for ComfyUI that uses BLIP (Bootstrapping Language-Image Pre-training) to generate detailed descriptions of the main object in an image. This node leverages the power of BLIP to provide accurate and context-aware captions for images."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "fexploit",
|
||||||
|
"title": "ComfyUI-Classifier",
|
||||||
|
"id": "classifier",
|
||||||
|
"reference": "https://github.com/fexploit/ComfyUI-Classifier",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/fexploit/ComfyUI-Classifier"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI-Classifier is a custom node for ComfyUI that uses a zero-shot classification model to classify text inputs based on a set of candidate labels. This node leverages the power of Hugging Face Transformers to provide accurate and flexible text classification."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "linshier",
|
"author": "linshier",
|
||||||
"title": "comfyui-remote-tools",
|
"title": "comfyui-remote-tools",
|
||||||
@ -9508,10 +9608,21 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Nodes: AnyNode. Nodes that can be anything you ask. Auto-Generate functional nodes using LLMs. Create impossible workflows. API Compatibility: (OpenAI, LocalLLMs, Gemini)."
|
"description": "Nodes: AnyNode. Nodes that can be anything you ask. Auto-Generate functional nodes using LLMs. Create impossible workflows. API Compatibility: (OpenAI, LocalLLMs, Gemini)."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "lks-ai",
|
||||||
|
"title": "ComfyUI Stable Audio Open 1.0 Sampler",
|
||||||
|
"id": "stableaudiosampler",
|
||||||
|
"reference": "https://github.com/lks-ai/ComfyUI-StableAudioSampler",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/lks-ai/ComfyUI-StableAudioSampler"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes: StableAudioSampler. Wraps the new Stable Audio Open Model in the sampler that dropped Jun 5th. See Github for Features"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "SayanoAI",
|
"author": "SayanoAI",
|
||||||
"title": "Comfy-RVC",
|
"title": "Comfy-RVC",
|
||||||
"id": "rvc",
|
"id": "sayano-rvc",
|
||||||
"reference": "https://github.com/SayanoAI/Comfy-RVC",
|
"reference": "https://github.com/SayanoAI/Comfy-RVC",
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/SayanoAI/Comfy-RVC"
|
"https://github.com/SayanoAI/Comfy-RVC"
|
||||||
@ -9792,15 +9903,313 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "A set of useful nodes for convenient use of ComfyUI, including: Seed randomization before the generation process starts, with saving of the last used values and the ability to automatically interrupt the current generation; A function to pause the generation process; Slider nodes for convenient control of input parameters; An alternative version of the standard Reroute node."
|
"description": "A set of useful nodes for convenient use of ComfyUI, including: Seed randomization before the generation process starts, with saving of the last used values and the ability to automatically interrupt the current generation; A function to pause the generation process; Slider nodes for convenient control of input parameters; An alternative version of the standard Reroute node."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "humgate",
|
||||||
|
"title": "simplecomfy",
|
||||||
|
"reference": "https://github.com/humgate/simplecomfy",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/humgate/simplecomfy"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Simple JS application based on ComfyUI which takes prompt and style picture from user and runs hardcoded workflow inference returning generated image to user."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "vanche1212",
|
||||||
|
"title": "ZMG PLUGIN",
|
||||||
|
"id": "zmg",
|
||||||
|
"reference": "https://github.com/vanche1212/ComfyUI-ZMG-Nodes",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/vanche1212/ComfyUI-ZMG-Nodes"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:ApiRequestNode, LoadVideoNode, JsonParserNode, OllamaRequestNode, OldPhotoColorizationNode."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "hben35096",
|
||||||
|
"title": "ComfyUI-ToolBox",
|
||||||
|
"id": "hben-toolbox",
|
||||||
|
"reference": "https://github.com/hben35096/ComfyUI-ToolBox",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/hben35096/ComfyUI-ToolBox"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:commonly_node."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "tiankuan93",
|
||||||
|
"title": "V-Express: Conditional Dropout for Progressive Training of Portrait Video Generation",
|
||||||
|
"id": "v-express",
|
||||||
|
"reference": "https://github.com/tiankuan93/ComfyUI-V-Express",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/tiankuan93/ComfyUI-V-Express"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "[Original] In the field of portrait video generation, the use of single images to generate portrait videos has become increasingly prevalent. A common approach involves leveraging generative models to enhance adapters for controlled generation. However, control signals can vary in strength, including text, audio, image reference, pose, depth map, etc. Among these, weaker conditions often struggle to be effective due to interference from stronger conditions, posing a challenge in balancing these conditions. In our work on portrait video generation, we identified audio signals as particularly weak, often overshadowed by stronger signals such as pose and original image. However, direct training with weak signals often leads to difficulties in convergence. To address this, we propose V-Express, a simple method that balances different control signals through a series of progressive drop operations. Our method gradually enables effective control by weak conditions, thereby achieving generation capabilities that simultaneously take into account pose, input image, and audio.\nNOTE: You need to downdload [a/model_ckpts](https://huggingface.co/tk93/V-Express/tree/main) manually."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "CMonk",
|
||||||
|
"title": "Stable Projectorz Bridge",
|
||||||
|
"id": "projectorz",
|
||||||
|
"reference": "https://github.com/tianlang0704/ComfyUI-StableProjectorzBridge",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/tianlang0704/ComfyUI-StableProjectorzBridge"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This custom nodes enables Stable Projectorz to work with ComfyUI Directly."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Scorpinaus",
|
||||||
|
"title": "Loaders for Diffusers-format checkpoints",
|
||||||
|
"id": "diffusersloader",
|
||||||
|
"reference": "https://github.com/Scorpinaus/ComfyUI-DiffusersLoader",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Scorpinaus/ComfyUI-DiffusersLoader"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This node pack allows loading of CLIP, MODEL, VAE aspects for both SD1.5 and SDXL checkpoints that is converted to diffusers format."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "chakib-belgaid",
|
||||||
|
"title": "ComfyUI Style Plugin",
|
||||||
|
"id": "style-plugin",
|
||||||
|
"reference": "https://github.com/chakib-belgaid/Comfyui_Prompt_styler",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/chakib-belgaid/Comfyui_Prompt_styler"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This is a simple plugin for ComfyUI that allows you to import A1111 CSV styles into ComfyUI prompts."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "chakib-belgaid",
|
||||||
|
"title": "ComfyUI-autosize",
|
||||||
|
"id": "autosize",
|
||||||
|
"reference": "https://github.com/chakib-belgaid/ComfyUI-autosize",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/chakib-belgaid/ComfyUI-autosize"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A ComfyUI utility plugin designed to optimize the latent space for generating high-quality results. It approximates the closest size model for better generation results."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "ThereforeGames",
|
||||||
|
"title": "ComfyUI-Unprompted",
|
||||||
|
"id": "unprompted",
|
||||||
|
"reference": "https://github.com/ThereforeGames/ComfyUI-Unprompted",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/ThereforeGames/ComfyUI-Unprompted"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This is a ComfyUI node that processes your input text with the [a/Unprompted templating language](https://github.com/ThereforeGames/unprompted). Early alpha release.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Tool Of North america",
|
||||||
|
"title": "Easy automatic (square) image cropper using Yolo",
|
||||||
|
"id": "tooldigital",
|
||||||
|
"reference": "https://github.com/tooldigital/ComfyUI-Yolo-Cropper",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/tooldigital/ComfyUI-Yolo-Cropper"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A very simple and easy to use node to automaticaaly create (square) image crops and masks using YoloV8. This can be very useful when using controlnet and ip adapters"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "luandev",
|
||||||
|
"title": "ComfyUI CrewAI",
|
||||||
|
"id": "crewai",
|
||||||
|
"reference": "https://github.com/luandev/ComfyUI-CrewAI",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/luandev/ComfyUI-CrewAI"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI-CrewAI aims to integrate Crew AI's multi-agent collaboration framework into the ComfyUI environment. By combining the strengths of Crew AI's role-based, collaborative AI agent system with ComfyUI's intuitive interface, we will create a robust platform for managing and executing complex AI tasks seamlessly"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "chandlergis",
|
||||||
|
"title": "ComfyUI_EmojiOverlay",
|
||||||
|
"id": "emoji-overlay",
|
||||||
|
"reference": "https://github.com/chandlergis/ComfyUI_EmojiOverlay",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/chandlergis/ComfyUI_EmojiOverlay"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:Image Emoji Overlay"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "JayLyu",
|
||||||
|
"title": "ComfyUI_BaiKong_Node",
|
||||||
|
"id": "baikong",
|
||||||
|
"reference": "https://github.com/JayLyu/ComfyUI_BaiKong_Node",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/JayLyu/ComfyUI_BaiKong_Node"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:BK Img To Color, BK Color Selector"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "risunobushi",
|
||||||
|
"title": "comfyUI_FrequencySeparation_RGB-HSV",
|
||||||
|
"id": "freq-sep",
|
||||||
|
"reference": "https://github.com/risunobushi/comfyUI_FrequencySeparation_RGB-HSV",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/risunobushi/comfyUI_FrequencySeparation_RGB-HSV"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A collection of simple nodes for Frequency Separation / Frequency Recombine with RGB and HSV methods"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "zohac",
|
||||||
|
"title": "ComfyUI_ZC_DrawShape",
|
||||||
|
"id": "drawshape",
|
||||||
|
"reference": "https://github.com/zohac/ComfyUI_ZC_DrawShape",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/zohac/ComfyUI_ZC_DrawShape"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:ZC DrawShape Node"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "DataCTE",
|
||||||
|
"title": "Prompt Injection Node for ComfyUI",
|
||||||
|
"id": "prompt-injection",
|
||||||
|
"reference": "https://github.com/DataCTE/prompt_injection",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/DataCTE/prompt_injection"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This custom node for ComfyUI allows you to inject specific prompts at specific blocks of the Stable Diffusion UNet, providing fine-grained control over the generated image. It is based on the concept that the content/subject understanding of the model is primarily contained within the MID0 and MID1 blocks, as demonstrated in the B-Lora (Content Style implicit separation) paper. Features.\nInject different prompts into specific UNet blocks Three different node variations for flexible workflow integration Customize the learning rate of specific blocks to focus on content, lighting, style, or other aspects Potential for developing a 'Mix of Experts' approach by swapping blocks on-the-fly based on prompt content"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "FrankChieng",
|
||||||
|
"title": "ComfyUI_llm_easyanimiate",
|
||||||
|
"id": "llm-easyanimate",
|
||||||
|
"nodename_pattern": "^FrankChiengEasyAnimate",
|
||||||
|
"reference": "https://github.com/frankchieng/ComfyUI_llm_easyanimiate",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/frankchieng/ComfyUI_llm_easyanimiate"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "implementation easyanimate with llama3-8b-6bit instruction LLM generation prompt help"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "nuanarchy",
|
||||||
|
"title": "ComfyUI-NuA-FlashFace",
|
||||||
|
"id": "nua-flashface",
|
||||||
|
"reference": "https://github.com/nuanarchy/ComfyUI-NuA-FlashFace",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/nuanarchy/ComfyUI-NuA-FlashFace"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI implementation of [a/FlashFace: Human Image Personalization with High-fidelity Identity Preservation](https://github.com/ali-vilab/FlashFace)\nNOTE: You need to downalod models manually."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "denfrost",
|
||||||
|
"title": "Den_ComfyUI_Workflows",
|
||||||
|
"id": "den",
|
||||||
|
"reference": "https://github.com/denfrost/Den_ComfyUI_Workflow",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/denfrost/Den_ComfyUI_Workflow"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Custom nodes make easy Advanced Workflows. Focus on Image/Video and ControlNet efficiency and performances. Manipulation of Latent Space, Automatic pipeline with a bit efforts."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "marduk191",
|
||||||
|
"title": "marduk191 workflow settings",
|
||||||
|
"id": "marnodes",
|
||||||
|
"reference": "https://github.com/marduk191/comfyui-marnodes",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/marduk191/comfyui-marnodes"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A node to set workflow settings."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "haohaocreates",
|
||||||
|
"title": "ComfyUI-HH-Image-Selector",
|
||||||
|
"id": "hh-image-selector",
|
||||||
|
"reference": "https://github.com/haohaocreates/ComfyUI-HH-Image-Selector",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/haohaocreates/ComfyUI-HH-Image-Selector"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "comfuio custom node that returns an image from a batch based on selected criteria such as RGB value, brightness, etc (credits to chris goringe's custom nodes tutorial )."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "exdysa",
|
||||||
|
"title": "comfyui-selector",
|
||||||
|
"reference": "https://github.com/exdysa/comfyui-selector",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/exdysa/comfyui-selector"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:Selector. Quick and dirty parameter generator node for ComfyUI."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Jin Liu",
|
||||||
|
"title": "ComfyUI-LJNodes",
|
||||||
|
"id": "ComfyUI-LJNodes",
|
||||||
|
"reference": "https://github.com/coolzilj/ComfyUI-LJNodes",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/coolzilj/ComfyUI-LJNodes"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A variety of custom nodes to enhance ComfyUI for a buttery smooth experience."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "GavChap",
|
||||||
|
"title": "ComfyUI-SD3LatentSelectRes",
|
||||||
|
"id": "sd3latent-select-res",
|
||||||
|
"reference": "https://github.com/GavChap/ComfyUI-SD3LatentSelectRes",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/GavChap/ComfyUI-SD3LatentSelectRes"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "You'll get a new node called SD3 Latent Select Resolution, you can pick the x and y sizes from a list."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "BenNarum",
|
||||||
|
"title": "SigmaWaveFormNodes",
|
||||||
|
"id": "sigmawaveform",
|
||||||
|
"reference": "https://github.com/BenNarum/SigmaWaveFormNode",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/BenNarum/SigmaWaveFormNode"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A set of tools for generating and altering sigmas in ComfyUI."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "shobhitic",
|
||||||
|
"title": "PlusMinusTextClip - Single node for Positive and Negative Prompts",
|
||||||
|
"id": "plusminustextclip",
|
||||||
|
"reference": "https://github.com/shobhitic/ComfyUI-PlusMinusTextClip",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/shobhitic/ComfyUI-PlusMinusTextClip"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This adds a node that has both the positive and negative prompts as input in one node. You can just add one node and be done with both Positive and Negative prompts, in place of adding two different nodes for them."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Late Night Labs",
|
||||||
|
"title": "LNL Frame Selector",
|
||||||
|
"id": "lnlframeselector",
|
||||||
|
"reference": "https://github.com/latenightlabs/ComfyUI-LNL",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/latenightlabs/ComfyUI-LNL"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Frame Selector & Sequence Selection Node for ComfyUI."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Michael Standen",
|
||||||
|
"title": "Ollama Prompt Encode",
|
||||||
|
"id": "ollamapromptencode",
|
||||||
|
"reference": "https://github.com/ScreamingHawk/comfyui-ollama-prompt-encode",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/ScreamingHawk/comfyui-ollama-prompt-encode"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A prompt generator and CLIP encoder using AI provided by Ollama."
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -10107,16 +10516,6 @@
|
|||||||
"install_type": "copy",
|
"install_type": "copy",
|
||||||
"description": "Extension to show random cat GIFs while queueing prompt."
|
"description": "Extension to show random cat GIFs while queueing prompt."
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "archifancy",
|
|
||||||
"title": "Image-vector-for-ComfyUI",
|
|
||||||
"reference": "https://github.com/archifancy/Image-vector-for-ComfyUI",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/archifancy/Image-vector-for-ComfyUI/raw/main/AIvector.py"
|
|
||||||
],
|
|
||||||
"install_type": "copy",
|
|
||||||
"description": "Nodes:AIvector. A wrapped comfyui node for converting pixels to vectors using Vtracer. Check it out here: [a/https://github.com/visioncortex/vtracer](https://github.com/visioncortex/vtracer)."
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "barckley75",
|
"author": "barckley75",
|
||||||
"title": "comfyUI_DaVinciResolve",
|
"title": "comfyUI_DaVinciResolve",
|
||||||
@ -10131,14 +10530,35 @@
|
|||||||
"description": "Nodes:TextToSpeech, phy_3_conditioning, SaveAudioToDaVinci, SaveImageToDaVinci.\nNOTE:In order to use DaVinci node you must have DaVinci Resolve Studio connected to the API. For more information check the help seciton in DaVinci Resolve Studio HELP>DOCUMENTATION>DEVELOPER. It will open a folder, search for scripting and the for README.txt file, the API documentation."
|
"description": "Nodes:TextToSpeech, phy_3_conditioning, SaveAudioToDaVinci, SaveImageToDaVinci.\nNOTE:In order to use DaVinci node you must have DaVinci Resolve Studio connected to the API. For more information check the help seciton in DaVinci Resolve Studio HELP>DOCUMENTATION>DEVELOPER. It will open a folder, search for scripting and the for README.txt file, the API documentation."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"author": "exdysa",
|
"author": "DannyStone1999",
|
||||||
"title": "comfyui-selector",
|
"title": "ComfyUI-Depth2Mask",
|
||||||
"reference": "https://github.com/exdysa/comfyui-selector",
|
"reference": "https://github.com/DannyStone1999/ComfyUI-Depth2Mask",
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/exdysa/comfyui-selector/raw/main/selector.py"
|
"https://github.com/DannyStone1999/ComfyUI-Depth2Mask/raw/main/Depth2Mask.py"
|
||||||
],
|
],
|
||||||
"install_type": "copy",
|
"install_type": "copy",
|
||||||
"description": "Nodes:Selector. Quick and dirty parameter generator node for ComfyUI."
|
"description": "Nodes:Depth2Mask"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Limbicnation",
|
||||||
|
"title": "ComfyUIDepthEstimation",
|
||||||
|
"reference": "https://github.com/Limbicnation/ComfyUIDepthEstimation",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Limbicnation/ComfyUIDepthEstimation/raw/main/depth_estimation_node.py"
|
||||||
|
],
|
||||||
|
"pip": ["transformers"],
|
||||||
|
"install_type": "copy",
|
||||||
|
"description": "A custom depth estimation node for ComfyUI using transformer models. It integrates depth estimation with automatic gamma correction, contrast adjustment, and edge detection, based on the [a/TransformDepth](https://github.com/Limbicnation/TransformDepth) repository."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "seghier",
|
||||||
|
"title": "ComfyUI_LibreTranslate",
|
||||||
|
"reference": "https://github.com/seghier/ComfyUI_LibreTranslate",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/seghier/ComfyUI_LibreTranslate/raw/main/translate_node.py"
|
||||||
|
],
|
||||||
|
"install_type": "copy",
|
||||||
|
"description": "Use LibreTranslation in ComfyUI [a/https://github.com/LibreTranslate/LibreTranslate](https://github.com/LibreTranslate/LibreTranslate)"
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
3866
github-stats.json
@ -23,7 +23,7 @@ sys.path.append(glob_path)
|
|||||||
import cm_global
|
import cm_global
|
||||||
from manager_util import *
|
from manager_util import *
|
||||||
|
|
||||||
version = [2, 36]
|
version = [2, 38]
|
||||||
version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '')
|
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__), '..'))
|
comfyui_manager_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
|
||||||
|
|||||||
@ -208,9 +208,11 @@ async def populate_github_stats(json_obj, json_obj_github):
|
|||||||
if url in json_obj_github:
|
if url in json_obj_github:
|
||||||
json_obj['custom_nodes'][i]['stars'] = json_obj_github[url]['stars']
|
json_obj['custom_nodes'][i]['stars'] = json_obj_github[url]['stars']
|
||||||
json_obj['custom_nodes'][i]['last_update'] = json_obj_github[url]['last_update']
|
json_obj['custom_nodes'][i]['last_update'] = json_obj_github[url]['last_update']
|
||||||
|
json_obj['custom_nodes'][i]['trust'] = json_obj_github[url]['author_account_age_days'] > 180
|
||||||
else:
|
else:
|
||||||
json_obj['custom_nodes'][i]['stars'] = -1
|
json_obj['custom_nodes'][i]['stars'] = -1
|
||||||
json_obj['custom_nodes'][i]['last_update'] = -1
|
json_obj['custom_nodes'][i]['last_update'] = -1
|
||||||
|
json_obj['custom_nodes'][i]['trust'] = False
|
||||||
return json_obj
|
return json_obj
|
||||||
|
|
||||||
|
|
||||||
@ -505,6 +507,16 @@ async def fetch_customnode_list(request):
|
|||||||
return web.json_response(json_obj, content_type='application/json')
|
return web.json_response(json_obj, content_type='application/json')
|
||||||
|
|
||||||
|
|
||||||
|
@PromptServer.instance.routes.get("/customnode/alternatives")
|
||||||
|
async def fetch_customnode_alternatives(request):
|
||||||
|
alter_json = await core.get_data_by_mode(request.rel_url.query["mode"], 'alter-list.json')
|
||||||
|
|
||||||
|
for item in alter_json['items']:
|
||||||
|
populate_markdown(item)
|
||||||
|
|
||||||
|
return web.json_response(alter_json, content_type='application/json')
|
||||||
|
|
||||||
|
|
||||||
@PromptServer.instance.routes.get("/alternatives/getlist")
|
@PromptServer.instance.routes.get("/alternatives/getlist")
|
||||||
async def fetch_alternatives_list(request):
|
async def fetch_alternatives_list(request):
|
||||||
if "skip_update" in request.rel_url.query and request.rel_url.query["skip_update"] == "true":
|
if "skip_update" in request.rel_url.query and request.rel_url.query["skip_update"] == "true":
|
||||||
|
|||||||
80
glob/security_check.py
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
import sys
|
||||||
|
import subprocess
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
def security_check():
|
||||||
|
print("[START] Security scan")
|
||||||
|
|
||||||
|
custom_nodes_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))
|
||||||
|
comfyui_path = os.path.abspath(os.path.join(custom_nodes_path, '..'))
|
||||||
|
|
||||||
|
guide = {
|
||||||
|
"ComfyUI_LLMVISION": """
|
||||||
|
0.Remove ComfyUI\\custom_nodes\\ComfyUI_LLMVISION.
|
||||||
|
1.Remove pip packages: openai-1.16.3.dist-info, anthropic-0.21.4.dist-info, openai-1.30.2.dist-info, anthropic-0.26.1.dist-info, %LocalAppData%\\rundll64.exe
|
||||||
|
(For portable versions, it is recommended to reinstall. If you are using a venv, it is advised to recreate the venv.)
|
||||||
|
2.Remove these files in your system: lib/browser/admin.py, Cadmino.py, Fadmino.py, VISION-D.exe, BeamNG.UI.exe
|
||||||
|
3.Check your Windows registry for the key listed above and remove it.
|
||||||
|
(HKEY_CURRENT_USER\\Software\\OpenAICLI)
|
||||||
|
4.Run a malware scanner.
|
||||||
|
5.Change all of your passwords, everywhere.
|
||||||
|
|
||||||
|
(Reinstall OS is recommended.)
|
||||||
|
\n
|
||||||
|
Detailed information: https://old.reddit.com/r/comfyui/comments/1dbls5n/psa_if_youve_used_the_comfyui_llmvision_node_from/
|
||||||
|
""",
|
||||||
|
"lolMiner": """
|
||||||
|
1. Remove pip packages: lolMiner*
|
||||||
|
2. Remove files: lolMiner*, 4G_Ethash_Linux_Readme.txt, mine* in ComfyUI dir.
|
||||||
|
|
||||||
|
(Reinstall ComfyUI is recommended.)
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
node_blacklist = {"ComfyUI_LLMVISION": "ComfyUI_LLMVISION"}
|
||||||
|
|
||||||
|
pip_blacklist = {"AppleBotzz": "ComfyUI_LLMVISION"}
|
||||||
|
|
||||||
|
file_blacklist = {
|
||||||
|
"ComfyUI_LLMVISION": ["%LocalAppData%\\rundll64.exe"],
|
||||||
|
"lolMiner": [os.path.join(comfyui_path, 'lolMiner')]
|
||||||
|
}
|
||||||
|
|
||||||
|
installed_pips = subprocess.check_output([sys.executable, '-m', "pip", "freeze"], text=True)
|
||||||
|
|
||||||
|
detected = set()
|
||||||
|
for k, v in node_blacklist.items():
|
||||||
|
if os.path.exists(os.path.join(custom_nodes_path, k)):
|
||||||
|
print(f"[SECURITY ALERT] custom node '{k}' is dangerous.")
|
||||||
|
detected.add(v)
|
||||||
|
|
||||||
|
for k, v in pip_blacklist.items():
|
||||||
|
if k in installed_pips:
|
||||||
|
detected.add(v)
|
||||||
|
break
|
||||||
|
|
||||||
|
for k, v in file_blacklist.items():
|
||||||
|
for x in v:
|
||||||
|
if os.path.exists(os.path.expandvars(x)):
|
||||||
|
detected.add(k)
|
||||||
|
break
|
||||||
|
|
||||||
|
if len(detected) > 0:
|
||||||
|
for line in installed_pips.split('\n'):
|
||||||
|
for k, v in pip_blacklist.items():
|
||||||
|
if k in line:
|
||||||
|
print(f"[SECURITY ALERT] '{line}' is dangerous.")
|
||||||
|
|
||||||
|
print("\n########################################################################")
|
||||||
|
print(" Malware has been detected, forcibly terminating ComfyUI execution.")
|
||||||
|
print("########################################################################\n")
|
||||||
|
|
||||||
|
for x in detected:
|
||||||
|
print(f"\n======== TARGET: {x} =========")
|
||||||
|
print(f"\nTODO:")
|
||||||
|
print(guide.get(x))
|
||||||
|
|
||||||
|
exit(-1)
|
||||||
|
|
||||||
|
print("[DONE] Security scan")
|
||||||
@ -1,566 +0,0 @@
|
|||||||
import { app } from "../../scripts/app.js";
|
|
||||||
import { api } from "../../scripts/api.js"
|
|
||||||
import { ComfyDialog, $el } from "../../scripts/ui.js";
|
|
||||||
import { install_checked_custom_node, manager_instance, rebootAPI } from "./common.js";
|
|
||||||
|
|
||||||
async function getAlterList() {
|
|
||||||
var mode = manager_instance.datasrc_combo.value;
|
|
||||||
|
|
||||||
var skip_update = "";
|
|
||||||
if(manager_instance.update_check_checkbox.checked)
|
|
||||||
skip_update = "&skip_update=true";
|
|
||||||
|
|
||||||
const response = await api.fetchApi(`/alternatives/getlist?mode=${mode}${skip_update}`);
|
|
||||||
|
|
||||||
const data = await response.json();
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class AlternativesInstaller 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 }, []);
|
|
||||||
}
|
|
||||||
|
|
||||||
startInstall(target) {
|
|
||||||
const self = AlternativesInstaller.instance;
|
|
||||||
|
|
||||||
self.updateMessage(`<BR><font color="green">Installing '${target.title}'</font>`);
|
|
||||||
}
|
|
||||||
|
|
||||||
disableButtons() {
|
|
||||||
for(let i in this.install_buttons) {
|
|
||||||
this.install_buttons[i].disabled = true;
|
|
||||||
this.install_buttons[i].style.backgroundColor = 'gray';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
apply_searchbox(data) {
|
|
||||||
let keyword = this.search_box.value.toLowerCase();
|
|
||||||
for(let i in this.grid_rows) {
|
|
||||||
let data1 = this.grid_rows[i].data;
|
|
||||||
let data2 = data1.custom_node;
|
|
||||||
|
|
||||||
if(!data2)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
let content = data1.tags.toLowerCase() + data1.description.toLowerCase() + data2.author.toLowerCase() + data2.description.toLowerCase() + data2.title.toLowerCase();
|
|
||||||
|
|
||||||
if(this.filter && this.filter != '*') {
|
|
||||||
if(this.filter != data2.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();
|
|
||||||
|
|
||||||
// splash
|
|
||||||
while (this.element.children.length) {
|
|
||||||
this.element.removeChild(this.element.children[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
const msg = $el('div', {id:'custom-message'},
|
|
||||||
[$el('br'),
|
|
||||||
'The custom node DB is currently being updated, and updates to custom nodes are being checked for.',
|
|
||||||
$el('br'),
|
|
||||||
'NOTE: Update only checks for extensions that have been fetched.',
|
|
||||||
$el('br')]);
|
|
||||||
msg.style.height = '100px';
|
|
||||||
msg.style.verticalAlign = 'middle';
|
|
||||||
this.element.appendChild(msg);
|
|
||||||
|
|
||||||
// invalidate
|
|
||||||
this.data = (await getAlterList()).items;
|
|
||||||
|
|
||||||
this.element.removeChild(msg);
|
|
||||||
|
|
||||||
while (this.element.children.length) {
|
|
||||||
this.element.removeChild(this.element.children[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.createHeaderControls();
|
|
||||||
await this.createGrid();
|
|
||||||
this.apply_searchbox(this.data);
|
|
||||||
this.createBottomControls();
|
|
||||||
}
|
|
||||||
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
invalidate_checks(is_checked, install_state) {
|
|
||||||
if(is_checked) {
|
|
||||||
for(let i in this.grid_rows) {
|
|
||||||
let data = this.grid_rows[i].data;
|
|
||||||
let checkbox = this.grid_rows[i].checkbox;
|
|
||||||
let buttons = this.grid_rows[i].buttons;
|
|
||||||
|
|
||||||
checkbox.disabled = data.custom_node.installed != install_state;
|
|
||||||
|
|
||||||
if(checkbox.disabled) {
|
|
||||||
for(let j in buttons) {
|
|
||||||
buttons[j].style.display = 'none';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
for(let j in buttons) {
|
|
||||||
buttons[j].style.display = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.checkbox_all.disabled = false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
for(let i in this.grid_rows) {
|
|
||||||
let checkbox = this.grid_rows[i].checkbox;
|
|
||||||
if(checkbox.check)
|
|
||||||
return; // do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
// every checkbox is unchecked -> enable all checkbox
|
|
||||||
for(let i in this.grid_rows) {
|
|
||||||
let checkbox = this.grid_rows[i].checkbox;
|
|
||||||
let buttons = this.grid_rows[i].buttons;
|
|
||||||
checkbox.disabled = false;
|
|
||||||
|
|
||||||
for(let j in buttons) {
|
|
||||||
buttons[j].style.display = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.checkbox_all.checked = false;
|
|
||||||
this.checkbox_all.disabled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
check_all(is_checked) {
|
|
||||||
if(is_checked) {
|
|
||||||
// lookup first checked item's state
|
|
||||||
let check_state = null;
|
|
||||||
for(let i in this.grid_rows) {
|
|
||||||
let checkbox = this.grid_rows[i].checkbox;
|
|
||||||
if(checkbox.checked) {
|
|
||||||
check_state = this.grid_rows[i].data.custom_node.installed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(check_state == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// check only same state items
|
|
||||||
for(let i in this.grid_rows) {
|
|
||||||
let checkbox = this.grid_rows[i].checkbox;
|
|
||||||
if(this.grid_rows[i].data.custom_node.installed == check_state)
|
|
||||||
checkbox.checked = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// uncheck all
|
|
||||||
for(let i in this.grid_rows) {
|
|
||||||
let checkbox = this.grid_rows[i].checkbox;
|
|
||||||
let buttons = this.grid_rows[i].buttons;
|
|
||||||
checkbox.checked = false;
|
|
||||||
checkbox.disabled = false;
|
|
||||||
|
|
||||||
for(let j in buttons) {
|
|
||||||
buttons[j].style.display = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.checkbox_all.disabled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async createGrid() {
|
|
||||||
var grid = document.createElement('table');
|
|
||||||
grid.setAttribute('id', 'alternatives-grid');
|
|
||||||
|
|
||||||
this.grid_rows = {};
|
|
||||||
|
|
||||||
let self = this;
|
|
||||||
|
|
||||||
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 header0 = document.createElement('th');
|
|
||||||
header0.style.width = "20px";
|
|
||||||
this.checkbox_all = $el("input",{type:'checkbox', id:'check_all'},[]);
|
|
||||||
header0.appendChild(this.checkbox_all);
|
|
||||||
this.checkbox_all.checked = false;
|
|
||||||
this.checkbox_all.disabled = true;
|
|
||||||
this.checkbox_all.addEventListener('change', function() { self.check_all.call(self, self.checkbox_all.checked); });
|
|
||||||
|
|
||||||
var header1 = document.createElement('th');
|
|
||||||
header1.innerHTML = ' ID ';
|
|
||||||
header1.style.width = "20px";
|
|
||||||
var header2 = document.createElement('th');
|
|
||||||
header2.innerHTML = 'Tags';
|
|
||||||
header2.style.width = "10%";
|
|
||||||
var header3 = document.createElement('th');
|
|
||||||
header3.innerHTML = 'Author';
|
|
||||||
header3.style.width = "150px";
|
|
||||||
var header4 = document.createElement('th');
|
|
||||||
header4.innerHTML = 'Title';
|
|
||||||
header4.style.width = "20%";
|
|
||||||
var header5 = document.createElement('th');
|
|
||||||
header5.innerHTML = 'Description';
|
|
||||||
header5.style.width = "50%";
|
|
||||||
var header6 = document.createElement('th');
|
|
||||||
header6.innerHTML = 'Install';
|
|
||||||
header6.style.width = "130px";
|
|
||||||
|
|
||||||
header1.style.position = "sticky";
|
|
||||||
header1.style.top = "0px";
|
|
||||||
header2.style.position = "sticky";
|
|
||||||
header2.style.top = "0px";
|
|
||||||
header3.style.position = "sticky";
|
|
||||||
header3.style.top = "0px";
|
|
||||||
header4.style.position = "sticky";
|
|
||||||
header4.style.top = "0px";
|
|
||||||
header5.style.position = "sticky";
|
|
||||||
header5.style.top = "0px";
|
|
||||||
|
|
||||||
thead.appendChild(headerRow);
|
|
||||||
headerRow.appendChild(header0);
|
|
||||||
headerRow.appendChild(header1);
|
|
||||||
headerRow.appendChild(header2);
|
|
||||||
headerRow.appendChild(header3);
|
|
||||||
headerRow.appendChild(header4);
|
|
||||||
headerRow.appendChild(header5);
|
|
||||||
headerRow.appendChild(header6);
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
if(this.data)
|
|
||||||
for (var i = 0; i < this.data.length; i++) {
|
|
||||||
const data = this.data[i];
|
|
||||||
var dataRow = document.createElement('tr');
|
|
||||||
|
|
||||||
let data0 = document.createElement('td');
|
|
||||||
let checkbox = $el("input",{type:'checkbox', id:`check_${i}`},[]);
|
|
||||||
data0.appendChild(checkbox);
|
|
||||||
checkbox.checked = false;
|
|
||||||
checkbox.addEventListener('change', function() { self.invalidate_checks.call(self, checkbox.checked, data.custom_node?.installed); });
|
|
||||||
|
|
||||||
var data1 = document.createElement('td');
|
|
||||||
data1.style.textAlign = "center";
|
|
||||||
data1.innerHTML = i+1;
|
|
||||||
var data2 = document.createElement('td');
|
|
||||||
data2.innerHTML = ` ${data.tags}`;
|
|
||||||
var data3 = document.createElement('td');
|
|
||||||
var data4 = document.createElement('td');
|
|
||||||
if(data.custom_node) {
|
|
||||||
data3.innerHTML = ` ${data.custom_node.author}`;
|
|
||||||
data4.innerHTML = ` <a href=${data.custom_node.reference} target="_blank"><font color="skyblue"><b>${data.custom_node.title}</b></font></a>`;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
data3.innerHTML = ` Unknown`;
|
|
||||||
data4.innerHTML = ` Unknown`;
|
|
||||||
}
|
|
||||||
var data5 = document.createElement('td');
|
|
||||||
data5.innerHTML = data.description;
|
|
||||||
var data6 = document.createElement('td');
|
|
||||||
data6.style.textAlign = "center";
|
|
||||||
|
|
||||||
var installBtn = document.createElement('button');
|
|
||||||
var installBtn2 = null;
|
|
||||||
var installBtn3 = null;
|
|
||||||
|
|
||||||
if(data.custom_node) {
|
|
||||||
this.install_buttons.push(installBtn);
|
|
||||||
|
|
||||||
switch(data.custom_node.installed) {
|
|
||||||
case 'Disabled':
|
|
||||||
installBtn3 = document.createElement('button');
|
|
||||||
installBtn3.innerHTML = 'Enable';
|
|
||||||
installBtn3.style.backgroundColor = 'blue';
|
|
||||||
installBtn3.style.color = 'white';
|
|
||||||
this.install_buttons.push(installBtn3);
|
|
||||||
|
|
||||||
installBtn.innerHTML = 'Uninstall';
|
|
||||||
installBtn.style.backgroundColor = 'red';
|
|
||||||
installBtn.style.color = 'white';
|
|
||||||
break;
|
|
||||||
case 'Update':
|
|
||||||
installBtn2 = document.createElement('button');
|
|
||||||
installBtn2.innerHTML = 'Update';
|
|
||||||
installBtn2.style.backgroundColor = 'blue';
|
|
||||||
installBtn2.style.color = 'white';
|
|
||||||
this.install_buttons.push(installBtn2);
|
|
||||||
|
|
||||||
installBtn3 = document.createElement('button');
|
|
||||||
installBtn3.innerHTML = 'Disable';
|
|
||||||
installBtn3.style.backgroundColor = 'MediumSlateBlue';
|
|
||||||
installBtn3.style.color = 'white';
|
|
||||||
this.install_buttons.push(installBtn3);
|
|
||||||
|
|
||||||
installBtn.innerHTML = 'Uninstall';
|
|
||||||
installBtn.style.backgroundColor = 'red';
|
|
||||||
installBtn.style.color = 'white';
|
|
||||||
break;
|
|
||||||
case 'True':
|
|
||||||
installBtn3 = document.createElement('button');
|
|
||||||
installBtn3.innerHTML = 'Disable';
|
|
||||||
installBtn3.style.backgroundColor = 'MediumSlateBlue';
|
|
||||||
installBtn3.style.color = 'white';
|
|
||||||
this.install_buttons.push(installBtn3);
|
|
||||||
|
|
||||||
installBtn.innerHTML = 'Uninstall';
|
|
||||||
installBtn.style.backgroundColor = 'red';
|
|
||||||
installBtn.style.color = 'white';
|
|
||||||
break;
|
|
||||||
case 'False':
|
|
||||||
installBtn.innerHTML = 'Install';
|
|
||||||
installBtn.style.backgroundColor = 'black';
|
|
||||||
installBtn.style.color = 'white';
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
installBtn.innerHTML = 'Try Install';
|
|
||||||
installBtn.style.backgroundColor = 'Gray';
|
|
||||||
installBtn.style.color = 'white';
|
|
||||||
}
|
|
||||||
|
|
||||||
let j = i;
|
|
||||||
if(installBtn2 != null) {
|
|
||||||
installBtn2.style.width = "120px";
|
|
||||||
installBtn2.addEventListener('click', function() {
|
|
||||||
install_checked_custom_node(self.grid_rows, j, AlternativesInstaller.instance, 'update');
|
|
||||||
});
|
|
||||||
|
|
||||||
data6.appendChild(installBtn2);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(installBtn3 != null) {
|
|
||||||
installBtn3.style.width = "120px";
|
|
||||||
installBtn3.addEventListener('click', function() {
|
|
||||||
install_checked_custom_node(self.grid_rows, j, AlternativesInstaller.instance, 'toggle_active');
|
|
||||||
});
|
|
||||||
|
|
||||||
data6.appendChild(installBtn3);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
installBtn.style.width = "120px";
|
|
||||||
installBtn.addEventListener('click', function() {
|
|
||||||
if(this.innerHTML == 'Uninstall') {
|
|
||||||
if (confirm(`Are you sure uninstall ${data.title}?`)) {
|
|
||||||
install_checked_custom_node(self.grid_rows, j, AlternativesInstaller.instance, 'uninstall');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
install_checked_custom_node(self.grid_rows, j, AlternativesInstaller.instance, 'install');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
data6.appendChild(installBtn);
|
|
||||||
}
|
|
||||||
|
|
||||||
dataRow.style.backgroundColor = "var(--bg-color)";
|
|
||||||
dataRow.style.color = "var(--fg-color)";
|
|
||||||
dataRow.style.textAlign = "left";
|
|
||||||
|
|
||||||
dataRow.appendChild(data0);
|
|
||||||
dataRow.appendChild(data1);
|
|
||||||
dataRow.appendChild(data2);
|
|
||||||
dataRow.appendChild(data3);
|
|
||||||
dataRow.appendChild(data4);
|
|
||||||
dataRow.appendChild(data5);
|
|
||||||
dataRow.appendChild(data6);
|
|
||||||
tbody.appendChild(dataRow);
|
|
||||||
|
|
||||||
let buttons = [];
|
|
||||||
if(installBtn) {
|
|
||||||
buttons.push(installBtn);
|
|
||||||
}
|
|
||||||
if(installBtn2) {
|
|
||||||
buttons.push(installBtn2);
|
|
||||||
}
|
|
||||||
if(installBtn3) {
|
|
||||||
buttons.push(installBtn3);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.grid_rows[i] = {data:data, buttons:buttons, checkbox:checkbox, control:dataRow};
|
|
||||||
}
|
|
||||||
|
|
||||||
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:'Disabled', text:'Filter: disabled' },
|
|
||||||
{ value:'Update', text:'Filter: update' },
|
|
||||||
{ 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();
|
|
||||||
});
|
|
||||||
|
|
||||||
if(self.filter) {
|
|
||||||
combo.value = self.filter;
|
|
||||||
}
|
|
||||||
|
|
||||||
return combo;
|
|
||||||
}
|
|
||||||
|
|
||||||
createHeaderControls() {
|
|
||||||
let self = this;
|
|
||||||
this.search_box = $el('input.cm-search-filter', {type:'text', id:'manager-alternode-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:'alternatives-installer-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 alternatives list. / ${exception}`);
|
|
||||||
console.error(exception);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -11,8 +11,7 @@ import {
|
|||||||
showYouMLShareDialog
|
showYouMLShareDialog
|
||||||
} from "./comfyui-share-common.js";
|
} from "./comfyui-share-common.js";
|
||||||
import { OpenArtShareDialog } from "./comfyui-share-openart.js";
|
import { OpenArtShareDialog } from "./comfyui-share-openart.js";
|
||||||
import { CustomNodesInstaller } from "./custom-nodes-downloader.js";
|
import { CustomNodesManager } from "./custom-nodes-manager.js";
|
||||||
import { AlternativesInstaller } from "./a1111-alter-downloader.js";
|
|
||||||
import { SnapshotManager } from "./snapshot.js";
|
import { SnapshotManager } from "./snapshot.js";
|
||||||
import { ModelInstaller } from "./model-downloader.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 { manager_instance, setManagerInstance, install_via_git_url, install_pip, rebootAPI, free_models, show_message } from "./common.js";
|
||||||
@ -568,10 +567,10 @@ async function fetchUpdates(update_check_checkbox) {
|
|||||||
async function() {
|
async function() {
|
||||||
app.ui.dialog.close();
|
app.ui.dialog.close();
|
||||||
|
|
||||||
if(!CustomNodesInstaller.instance)
|
if(!CustomNodesManager.instance) {
|
||||||
CustomNodesInstaller.instance = new CustomNodesInstaller(app, self);
|
CustomNodesManager.instance = new CustomNodesManager(app, self);
|
||||||
|
}
|
||||||
await CustomNodesInstaller.instance.show(CustomNodesInstaller.ShowMode.UPDATE);
|
await CustomNodesManager.instance.show(CustomNodesManager.ShowMode.UPDATE);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -714,12 +713,13 @@ class ManagerMenuDialog extends ComfyDialog {
|
|||||||
[
|
[
|
||||||
$el("button.cm-button", {
|
$el("button.cm-button", {
|
||||||
type: "button",
|
type: "button",
|
||||||
textContent: "Install Custom Nodes",
|
textContent: "Custom Nodes Manager",
|
||||||
onclick:
|
onclick:
|
||||||
() => {
|
() => {
|
||||||
if(!CustomNodesInstaller.instance)
|
if(!CustomNodesManager.instance) {
|
||||||
CustomNodesInstaller.instance = new CustomNodesInstaller(app, self);
|
CustomNodesManager.instance = new CustomNodesManager(app, self);
|
||||||
CustomNodesInstaller.instance.show(CustomNodesInstaller.ShowMode.NORMAL);
|
}
|
||||||
|
CustomNodesManager.instance.show(CustomNodesManager.ShowMode.NORMAL);
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
|
||||||
@ -728,9 +728,10 @@ class ManagerMenuDialog extends ComfyDialog {
|
|||||||
textContent: "Install Missing Custom Nodes",
|
textContent: "Install Missing Custom Nodes",
|
||||||
onclick:
|
onclick:
|
||||||
() => {
|
() => {
|
||||||
if(!CustomNodesInstaller.instance)
|
if(!CustomNodesManager.instance) {
|
||||||
CustomNodesInstaller.instance = new CustomNodesInstaller(app, self);
|
CustomNodesManager.instance = new CustomNodesManager(app, self);
|
||||||
CustomNodesInstaller.instance.show(CustomNodesInstaller.ShowMode.MISSING_NODES);
|
}
|
||||||
|
CustomNodesManager.instance.show(CustomNodesManager.ShowMode.MISSING);
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
|
||||||
@ -768,9 +769,10 @@ class ManagerMenuDialog extends ComfyDialog {
|
|||||||
textContent: "Alternatives of A1111",
|
textContent: "Alternatives of A1111",
|
||||||
onclick:
|
onclick:
|
||||||
() => {
|
() => {
|
||||||
if(!AlternativesInstaller.instance)
|
if(!CustomNodesManager.instance) {
|
||||||
AlternativesInstaller.instance = new AlternativesInstaller(app, self);
|
CustomNodesManager.instance = new CustomNodesManager(app, self);
|
||||||
AlternativesInstaller.instance.show();
|
}
|
||||||
|
CustomNodesManager.instance.show(CustomNodesManager.ShowMode.ALTERNATIVES);
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
|||||||
66
js/common.js
@ -24,72 +24,6 @@ export function rebootAPI() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function install_checked_custom_node(grid_rows, target_i, caller, mode) {
|
|
||||||
if(caller) {
|
|
||||||
let failed = '';
|
|
||||||
|
|
||||||
caller.disableButtons();
|
|
||||||
|
|
||||||
for(let i in grid_rows) {
|
|
||||||
if(!grid_rows[i].checkbox.checked && i != target_i)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
var target;
|
|
||||||
|
|
||||||
if(grid_rows[i].data.custom_node) {
|
|
||||||
target = grid_rows[i].data.custom_node;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
target = grid_rows[i].data;
|
|
||||||
}
|
|
||||||
|
|
||||||
caller.startInstall(target);
|
|
||||||
|
|
||||||
try {
|
|
||||||
const response = await api.fetchApi(`/customnode/${mode}`, {
|
|
||||||
method: 'POST',
|
|
||||||
headers: { 'Content-Type': 'application/json' },
|
|
||||||
body: JSON.stringify(target)
|
|
||||||
});
|
|
||||||
|
|
||||||
if(response.status == 403) {
|
|
||||||
show_message('This action is not allowed with this security level configuration.');
|
|
||||||
caller.updateMessage('');
|
|
||||||
await caller.invalidateControl();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(response.status == 404) {
|
|
||||||
show_message('With the current security level configuration, only custom nodes from the <B>"default channel"</B> can be installed.');
|
|
||||||
caller.updateMessage('');
|
|
||||||
await caller.invalidateControl();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(response.status == 400) {
|
|
||||||
show_message(`${mode} failed: ${target.title}`);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const status = await response.json();
|
|
||||||
app.ui.dialog.close();
|
|
||||||
target.installed = 'True';
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
catch(exception) {
|
|
||||||
failed += `<BR> ${target.title}`;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(failed != '') {
|
|
||||||
show_message(`${mode} failed: ${failed}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
await caller.invalidateControl();
|
|
||||||
caller.updateMessage("<BR>To apply the installed/updated/disabled/enabled custom node, please <button id='cm-reboot-button1' class='cm-small-button'>RESTART</button> ComfyUI. And refresh browser.", 'cm-reboot-button1');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export var manager_instance = null;
|
export var manager_instance = null;
|
||||||
|
|
||||||
export function setManagerInstance(obj) {
|
export function setManagerInstance(obj) {
|
||||||
|
|||||||
@ -1,943 +0,0 @@
|
|||||||
import { app } from "../../scripts/app.js";
|
|
||||||
import { api } from "../../scripts/api.js"
|
|
||||||
import { ComfyDialog, $el } from "../../scripts/ui.js";
|
|
||||||
import { install_checked_custom_node, manager_instance, rebootAPI } from "./common.js";
|
|
||||||
|
|
||||||
|
|
||||||
async function getCustomNodes() {
|
|
||||||
var mode = manager_instance.datasrc_combo.value;
|
|
||||||
|
|
||||||
var skip_update = "";
|
|
||||||
if(manager_instance.update_check_checkbox.checked)
|
|
||||||
skip_update = "&skip_update=true";
|
|
||||||
|
|
||||||
const response = await api.fetchApi(`/customnode/getlist?mode=${mode}${skip_update}`);
|
|
||||||
|
|
||||||
const data = await response.json();
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getCustomnodeMappings() {
|
|
||||||
var mode = manager_instance.datasrc_combo.value;
|
|
||||||
|
|
||||||
const response = await api.fetchApi(`/customnode/getmappings?mode=${mode}`);
|
|
||||||
|
|
||||||
const data = await response.json();
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getConflictMappings() {
|
|
||||||
var mode = manager_instance.datasrc_combo.value;
|
|
||||||
|
|
||||||
const response = await api.fetchApi(`/customnode/getmappings?mode=${mode}`);
|
|
||||||
|
|
||||||
const data = await response.json();
|
|
||||||
|
|
||||||
let node_to_extensions_map = {};
|
|
||||||
|
|
||||||
for(let k in data) {
|
|
||||||
for(let i in data[k][0]) {
|
|
||||||
let node = data[k][0][i];
|
|
||||||
let l = node_to_extensions_map[node];
|
|
||||||
if(!l) {
|
|
||||||
l = [];
|
|
||||||
node_to_extensions_map[node] = l;
|
|
||||||
}
|
|
||||||
l.push(k);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let conflict_map = {};
|
|
||||||
for(let node in node_to_extensions_map) {
|
|
||||||
if(node_to_extensions_map[node].length > 1) {
|
|
||||||
for(let i in node_to_extensions_map[node]) {
|
|
||||||
let extension = node_to_extensions_map[node][i];
|
|
||||||
let l = conflict_map[extension];
|
|
||||||
|
|
||||||
if(!l) {
|
|
||||||
l = [];
|
|
||||||
conflict_map[extension] = l;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(let j in node_to_extensions_map[node]) {
|
|
||||||
let extension2 = node_to_extensions_map[node][j];
|
|
||||||
if(extension != extension2)
|
|
||||||
l.push([node, extension2]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return conflict_map;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getUnresolvedNodesInComponent() {
|
|
||||||
try {
|
|
||||||
var mode = manager_instance.datasrc_combo.value;
|
|
||||||
|
|
||||||
const response = await api.fetchApi(`/component/get_unresolved`);
|
|
||||||
|
|
||||||
const data = await response.json();
|
|
||||||
return data.nodes;
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export class CustomNodesInstaller extends ComfyDialog {
|
|
||||||
static instance = null;
|
|
||||||
|
|
||||||
install_buttons = [];
|
|
||||||
message_box = null;
|
|
||||||
data = null;
|
|
||||||
|
|
||||||
static ShowMode = {
|
|
||||||
NORMAL: 0,
|
|
||||||
MISSING_NODES: 1,
|
|
||||||
UPDATE: 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
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 }, []);
|
|
||||||
|
|
||||||
this.currentSortProperty = ''; // The property currently being sorted
|
|
||||||
this.currentSortAscending = true; // The direction of the current sort
|
|
||||||
}
|
|
||||||
|
|
||||||
startInstall(target) {
|
|
||||||
const self = CustomNodesInstaller.instance;
|
|
||||||
|
|
||||||
self.updateMessage(`<BR><font color="green">Installing '${target.title}'</font>`);
|
|
||||||
}
|
|
||||||
|
|
||||||
disableButtons() {
|
|
||||||
for(let i in this.install_buttons) {
|
|
||||||
this.install_buttons[i].disabled = true;
|
|
||||||
this.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.author.toLowerCase() + data.description.toLowerCase() + data.title.toLowerCase() + data.reference.toLowerCase();
|
|
||||||
|
|
||||||
if(this.filter && this.filter != '*') {
|
|
||||||
if(this.filter == 'True' && (data.installed == 'Update' || data.installed == 'Fail')) {
|
|
||||||
this.grid_rows[i].control.style.display = null;
|
|
||||||
}
|
|
||||||
else 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 filter_missing_node(data) {
|
|
||||||
const mappings = await getCustomnodeMappings();
|
|
||||||
|
|
||||||
// build regex->url map
|
|
||||||
const regex_to_url = [];
|
|
||||||
for (let i in data) {
|
|
||||||
if(data[i]['nodename_pattern']) {
|
|
||||||
let item = {regex: new RegExp(data[i].nodename_pattern), url: data[i].files[0]};
|
|
||||||
regex_to_url.push(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// build name->url map
|
|
||||||
const name_to_urls = {};
|
|
||||||
for (const url in mappings) {
|
|
||||||
const names = mappings[url];
|
|
||||||
|
|
||||||
for(const name in names[0]) {
|
|
||||||
let v = name_to_urls[names[0][name]];
|
|
||||||
if(v == undefined) {
|
|
||||||
v = [];
|
|
||||||
name_to_urls[names[0][name]] = v;
|
|
||||||
}
|
|
||||||
v.push(url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const registered_nodes = new Set();
|
|
||||||
for (let i in LiteGraph.registered_node_types) {
|
|
||||||
registered_nodes.add(LiteGraph.registered_node_types[i].type);
|
|
||||||
}
|
|
||||||
|
|
||||||
const missing_nodes = new Set();
|
|
||||||
const workflow = app.graph.serialize();
|
|
||||||
const group_nodes = workflow.extra && workflow.extra.groupNodes ? workflow.extra.groupNodes : [];
|
|
||||||
let nodes = workflow.nodes;
|
|
||||||
|
|
||||||
for (let i in group_nodes) {
|
|
||||||
let group_node = group_nodes[i];
|
|
||||||
nodes = nodes.concat(group_node.nodes);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let i in nodes) {
|
|
||||||
const node_type = nodes[i].type;
|
|
||||||
if(node_type.startsWith('workflow/'))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!registered_nodes.has(node_type)) {
|
|
||||||
const urls = name_to_urls[node_type.trim()];
|
|
||||||
if(urls)
|
|
||||||
urls.forEach(url => {
|
|
||||||
missing_nodes.add(url);
|
|
||||||
});
|
|
||||||
else {
|
|
||||||
for(let j in regex_to_url) {
|
|
||||||
if(regex_to_url[j].regex.test(node_type)) {
|
|
||||||
missing_nodes.add(regex_to_url[j].url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let unresolved_nodes = await getUnresolvedNodesInComponent();
|
|
||||||
for (let i in unresolved_nodes) {
|
|
||||||
let node_type = unresolved_nodes[i];
|
|
||||||
const url = name_to_urls[node_type];
|
|
||||||
if(url)
|
|
||||||
missing_nodes.add(url);
|
|
||||||
}
|
|
||||||
|
|
||||||
return data.filter(node => node.files.some(file => missing_nodes.has(file)));
|
|
||||||
}
|
|
||||||
|
|
||||||
async invalidateControl() {
|
|
||||||
this.clear();
|
|
||||||
|
|
||||||
// splash
|
|
||||||
while (this.element.children.length) {
|
|
||||||
this.element.removeChild(this.element.children[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
const msg = $el('div', {id:'custom-message'},
|
|
||||||
[$el('br'),
|
|
||||||
'The custom node DB is currently being updated, and updates to custom nodes are being checked for.',
|
|
||||||
$el('br'),
|
|
||||||
'NOTE: Update only checks for extensions that have been fetched.',
|
|
||||||
$el('br')]);
|
|
||||||
msg.style.height = '100px';
|
|
||||||
msg.style.verticalAlign = 'middle';
|
|
||||||
msg.style.color = "var(--fg-color)";
|
|
||||||
|
|
||||||
this.element.appendChild(msg);
|
|
||||||
|
|
||||||
// invalidate
|
|
||||||
let data = await getCustomNodes();
|
|
||||||
this.data = data.custom_nodes;
|
|
||||||
this.channel = data.channel;
|
|
||||||
|
|
||||||
this.conflict_mappings = await getConflictMappings();
|
|
||||||
|
|
||||||
if(this.show_mode == CustomNodesInstaller.ShowMode.MISSING_NODES)
|
|
||||||
this.data = await this.filter_missing_node(this.data);
|
|
||||||
|
|
||||||
this.element.removeChild(msg);
|
|
||||||
|
|
||||||
while (this.element.children.length) {
|
|
||||||
this.element.removeChild(this.element.children[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.createHeaderControls();
|
|
||||||
await this.createGrid();
|
|
||||||
this.apply_searchbox(this.data);
|
|
||||||
this.createBottomControls();
|
|
||||||
}
|
|
||||||
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
console.log(rebootButton);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
invalidate_checks(is_checked, install_state) {
|
|
||||||
if(is_checked) {
|
|
||||||
for(let i in this.grid_rows) {
|
|
||||||
let data = this.grid_rows[i].data;
|
|
||||||
let checkbox = this.grid_rows[i].checkbox;
|
|
||||||
let buttons = this.grid_rows[i].buttons;
|
|
||||||
|
|
||||||
checkbox.disabled = data.installed != install_state;
|
|
||||||
|
|
||||||
if(checkbox.disabled) {
|
|
||||||
for(let j in buttons) {
|
|
||||||
buttons[j].style.display = 'none';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
for(let j in buttons) {
|
|
||||||
buttons[j].style.display = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.checkbox_all.disabled = false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
for(let i in this.grid_rows) {
|
|
||||||
let checkbox = this.grid_rows[i].checkbox;
|
|
||||||
if(checkbox.check)
|
|
||||||
return; // do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
// every checkbox is unchecked -> enable all checkbox
|
|
||||||
for(let i in this.grid_rows) {
|
|
||||||
let checkbox = this.grid_rows[i].checkbox;
|
|
||||||
let buttons = this.grid_rows[i].buttons;
|
|
||||||
checkbox.disabled = false;
|
|
||||||
|
|
||||||
for(let j in buttons) {
|
|
||||||
buttons[j].style.display = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.checkbox_all.checked = false;
|
|
||||||
this.checkbox_all.disabled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
check_all(is_checked) {
|
|
||||||
if(is_checked) {
|
|
||||||
// lookup first checked item's state
|
|
||||||
let check_state = null;
|
|
||||||
for(let i in this.grid_rows) {
|
|
||||||
let checkbox = this.grid_rows[i].checkbox;
|
|
||||||
if(checkbox.checked) {
|
|
||||||
check_state = this.grid_rows[i].data.installed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(check_state == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// check only same state items
|
|
||||||
for(let i in this.grid_rows) {
|
|
||||||
let checkbox = this.grid_rows[i].checkbox;
|
|
||||||
if(this.grid_rows[i].data.installed == check_state)
|
|
||||||
checkbox.checked = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// uncheck all
|
|
||||||
for(let i in this.grid_rows) {
|
|
||||||
let checkbox = this.grid_rows[i].checkbox;
|
|
||||||
let buttons = this.grid_rows[i].buttons;
|
|
||||||
checkbox.checked = false;
|
|
||||||
checkbox.disabled = false;
|
|
||||||
|
|
||||||
for(let j in buttons) {
|
|
||||||
buttons[j].style.display = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.checkbox_all.disabled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sortData(property, ascending = true) {
|
|
||||||
this.data.sort((a, b) => {
|
|
||||||
// Check if either value is -1 and handle accordingly
|
|
||||||
if (a[property] === -1) return 1; // Always put a at the end if its value is -1
|
|
||||||
if (b[property] === -1) return -1; // Always put b at the end if its value is -1
|
|
||||||
// And be careful here, (-1<'2024-01-01') and (-1>'2024-01-01') are both false! So I handle -1 seperately.
|
|
||||||
if (a[property] < b[property]) return ascending ? -1 : 1;
|
|
||||||
if (a[property] > b[property]) return ascending ? 1 : -1;
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
resetHeaderStyles() {
|
|
||||||
const headers = ['th_author', 'th_title', 'th_stars', 'th_last_update']; // Add the IDs of all your sortable headers here
|
|
||||||
headers.forEach(headerId => {
|
|
||||||
const header = this.element.querySelector(`#${headerId}`);
|
|
||||||
if (header) {
|
|
||||||
header.style.backgroundColor = ''; // Reset to default background color
|
|
||||||
// Add other style resets if necessary
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
toggleSort(property) {
|
|
||||||
// If currently sorted by this property, toggle the direction; else, sort ascending
|
|
||||||
if (this.currentSortProperty === property) {
|
|
||||||
this.currentSortAscending = !this.currentSortAscending;
|
|
||||||
} else {
|
|
||||||
this.currentSortAscending = false;
|
|
||||||
}
|
|
||||||
this.currentSortProperty = property;
|
|
||||||
|
|
||||||
this.resetHeaderStyles(); // Reset styles of all sortable headers
|
|
||||||
|
|
||||||
// Determine the ID of the header based on the property
|
|
||||||
let headerId = '';
|
|
||||||
if (property === 'stars') {
|
|
||||||
headerId = 'th_stars';
|
|
||||||
} else if (property === 'last_update') {
|
|
||||||
headerId = 'th_last_update';
|
|
||||||
} else if (property === 'author') {
|
|
||||||
headerId = 'th_author';
|
|
||||||
} else if (property === 'title') {
|
|
||||||
headerId = 'th_title';
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we have a valid headerId, change its style to indicate it's the active sort column
|
|
||||||
if (headerId) {
|
|
||||||
const activeHeader = this.element.querySelector(`#${headerId}`);
|
|
||||||
if (activeHeader) {
|
|
||||||
activeHeader.style.backgroundColor = '#222';
|
|
||||||
// Slightly brighter. Add other style changes if necessary.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Call sortData with the current property and direction
|
|
||||||
this.sortData(property, this.currentSortAscending);
|
|
||||||
|
|
||||||
// Refresh the grid to display sorted data
|
|
||||||
this.createGrid();
|
|
||||||
this.apply_searchbox(this.data);
|
|
||||||
}
|
|
||||||
|
|
||||||
async createGrid() {
|
|
||||||
// Remove existing table if present
|
|
||||||
var grid = this.element.querySelector('#custom-nodes-grid');
|
|
||||||
var panel;
|
|
||||||
let self = this;
|
|
||||||
if (grid) {
|
|
||||||
grid.querySelector('tbody').remove();
|
|
||||||
panel = grid.parentNode;
|
|
||||||
} else {
|
|
||||||
grid = document.createElement('table');
|
|
||||||
grid.setAttribute('id', 'custom-nodes-grid');
|
|
||||||
|
|
||||||
this.grid_rows = {};
|
|
||||||
|
|
||||||
var thead = document.createElement('thead');
|
|
||||||
|
|
||||||
var headerRow = document.createElement('tr');
|
|
||||||
thead.style.position = "sticky";
|
|
||||||
thead.style.top = "0px";
|
|
||||||
thead.style.borderCollapse = "collapse";
|
|
||||||
thead.style.tableLayout = "fixed";
|
|
||||||
|
|
||||||
var header0 = document.createElement('th');
|
|
||||||
header0.style.width = "20px";
|
|
||||||
this.checkbox_all = $el("input",{type:'checkbox', id:'check_all'},[]);
|
|
||||||
header0.appendChild(this.checkbox_all);
|
|
||||||
this.checkbox_all.checked = false;
|
|
||||||
this.checkbox_all.disabled = true;
|
|
||||||
this.checkbox_all.addEventListener('change', function() { self.check_all.call(self, self.checkbox_all.checked); });
|
|
||||||
|
|
||||||
var header1 = document.createElement('th');
|
|
||||||
header1.innerHTML = ' ID ';
|
|
||||||
header1.style.width = "20px";
|
|
||||||
|
|
||||||
var header2 = document.createElement('th');
|
|
||||||
header2.innerHTML = 'Author';
|
|
||||||
header2.style.width = "150px";
|
|
||||||
header2.style.cursor = 'pointer';
|
|
||||||
header2.setAttribute('id', 'th_author');
|
|
||||||
header2.onclick = () => this.toggleSort('author');
|
|
||||||
|
|
||||||
var header3 = document.createElement('th');
|
|
||||||
header3.innerHTML = 'Name';
|
|
||||||
header3.style.width = "20%";
|
|
||||||
header3.style.cursor = 'pointer';
|
|
||||||
header3.setAttribute('id', 'th_title');
|
|
||||||
header3.onclick = () => this.toggleSort('title');
|
|
||||||
|
|
||||||
var header4 = document.createElement('th');
|
|
||||||
header4.innerHTML = 'Description';
|
|
||||||
header4.style.width = "60%";
|
|
||||||
// header4.classList.add('expandable-column');
|
|
||||||
|
|
||||||
var header5 = document.createElement('th');
|
|
||||||
header5.innerHTML = ' ★ ';
|
|
||||||
header5.style.width = "130px";
|
|
||||||
header5.setAttribute('id', 'th_stars');
|
|
||||||
header5.style.cursor = 'pointer';
|
|
||||||
header5.onclick = () => this.toggleSort('stars');
|
|
||||||
|
|
||||||
var header6 = document.createElement('th');
|
|
||||||
header6.innerHTML = 'Last Update';
|
|
||||||
header6.style.width = "130px";
|
|
||||||
header6.setAttribute('id', 'th_last_update');
|
|
||||||
header6.style.cursor = 'pointer';
|
|
||||||
header6.onclick = () => this.toggleSort('last_update');
|
|
||||||
|
|
||||||
var header7 = document.createElement('th');
|
|
||||||
header7.innerHTML = 'Install';
|
|
||||||
header7.style.width = "130px";
|
|
||||||
|
|
||||||
header0.style.position = "sticky";
|
|
||||||
header0.style.top = "0px";
|
|
||||||
header1.style.position = "sticky";
|
|
||||||
header1.style.top = "0px";
|
|
||||||
header2.style.position = "sticky";
|
|
||||||
header2.style.top = "0px";
|
|
||||||
header3.style.position = "sticky";
|
|
||||||
header3.style.top = "0px";
|
|
||||||
header4.style.position = "sticky";
|
|
||||||
header4.style.top = "0px";
|
|
||||||
header5.style.position = "sticky";
|
|
||||||
header5.style.top = "0px";
|
|
||||||
header6.style.position = "sticky";
|
|
||||||
header6.style.top = "0px";
|
|
||||||
header7.style.position = "sticky";
|
|
||||||
header7.style.top = "0px";
|
|
||||||
|
|
||||||
thead.appendChild(headerRow);
|
|
||||||
headerRow.appendChild(header0);
|
|
||||||
headerRow.appendChild(header1);
|
|
||||||
headerRow.appendChild(header2);
|
|
||||||
headerRow.appendChild(header3);
|
|
||||||
headerRow.appendChild(header4);
|
|
||||||
headerRow.appendChild(header5);
|
|
||||||
headerRow.appendChild(header6);
|
|
||||||
headerRow.appendChild(header7);
|
|
||||||
|
|
||||||
headerRow.style.backgroundColor = "Black";
|
|
||||||
headerRow.style.color = "White";
|
|
||||||
headerRow.style.textAlign = "center";
|
|
||||||
headerRow.style.width = "100%";
|
|
||||||
headerRow.style.padding = "0";
|
|
||||||
|
|
||||||
grid.appendChild(thead);
|
|
||||||
|
|
||||||
panel = document.createElement('div');
|
|
||||||
panel.style.width = "100%";
|
|
||||||
panel.appendChild(grid);
|
|
||||||
this.element.appendChild(panel);
|
|
||||||
}
|
|
||||||
var tbody = document.createElement('tbody');
|
|
||||||
grid.appendChild(tbody);
|
|
||||||
|
|
||||||
if(this.data)
|
|
||||||
for (var i = 0; i < this.data.length; i++) {
|
|
||||||
const data = this.data[i];
|
|
||||||
let dataRow = document.createElement('tr');
|
|
||||||
|
|
||||||
let data0 = document.createElement('td');
|
|
||||||
let checkbox = $el("input",{type:'checkbox', id:`check_${i}`},[]);
|
|
||||||
data0.appendChild(checkbox);
|
|
||||||
checkbox.checked = false;
|
|
||||||
checkbox.addEventListener('change', function() { self.invalidate_checks.call(self, checkbox.checked, data.installed); });
|
|
||||||
|
|
||||||
var data1 = document.createElement('td');
|
|
||||||
data1.style.textAlign = "center";
|
|
||||||
data1.innerHTML = i+1;
|
|
||||||
|
|
||||||
var data2 = document.createElement('td');
|
|
||||||
data2.style.maxWidth = "100px";
|
|
||||||
data2.className = "cm-node-author"
|
|
||||||
data2.textContent = ` ${data.author}`;
|
|
||||||
data2.style.whiteSpace = "nowrap";
|
|
||||||
data2.style.overflow = "hidden";
|
|
||||||
data2.style.textOverflow = "ellipsis";
|
|
||||||
|
|
||||||
var data3 = document.createElement('td');
|
|
||||||
data3.style.maxWidth = "200px";
|
|
||||||
data3.style.wordWrap = "break-word";
|
|
||||||
data3.className = "cm-node-name"
|
|
||||||
data3.innerHTML = ` <a href=${data.reference} target="_blank"><font color="skyblue"><b>${data.title}</b></font></a>`;
|
|
||||||
if(data.installed == 'Fail')
|
|
||||||
data3.innerHTML = ' <font color="BLACK"><B>(IMPORT FAILED)</B></font>' + data3.innerHTML;
|
|
||||||
|
|
||||||
var data4 = document.createElement('td');
|
|
||||||
data4.innerHTML = data.description;
|
|
||||||
data4.className = "cm-node-desc"
|
|
||||||
|
|
||||||
let conflicts = this.conflict_mappings[data.files[0]];
|
|
||||||
if(conflicts) {
|
|
||||||
let buf = '<p class="cm-conflicted-nodes-text"><B><font color="BLACK">Conflicted Nodes:</FONT></B><BR>';
|
|
||||||
for(let k in conflicts) {
|
|
||||||
let node_name = conflicts[k][0];
|
|
||||||
|
|
||||||
let extension_name = conflicts[k][1].split('/').pop();
|
|
||||||
if(extension_name.endsWith('/')) {
|
|
||||||
extension_name = extension_name.slice(0, -1);
|
|
||||||
}
|
|
||||||
if(node_name.endsWith('.git')) {
|
|
||||||
extension_name = extension_name.slice(0, -4);
|
|
||||||
}
|
|
||||||
|
|
||||||
buf += `<B>${node_name}</B> [${extension_name}], `;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(buf.endsWith(', ')) {
|
|
||||||
buf = buf.slice(0, -2);
|
|
||||||
}
|
|
||||||
buf += "</p>";
|
|
||||||
data4.innerHTML += buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
var data5 = document.createElement('td');
|
|
||||||
data5.style.maxWidth = "100px";
|
|
||||||
data5.className = "cm-node-stars"
|
|
||||||
if(data.stars < 0) {
|
|
||||||
data5.textContent = 'N/A';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
data5.textContent = `${data.stars}`;
|
|
||||||
}
|
|
||||||
data5.style.whiteSpace = "nowrap";
|
|
||||||
data5.style.overflow = "hidden";
|
|
||||||
data5.style.textOverflow = "ellipsis";
|
|
||||||
data5.style.textAlign = "center";
|
|
||||||
|
|
||||||
var lastUpdateDate = new Date();
|
|
||||||
var data6 = document.createElement('td');
|
|
||||||
data6.style.maxWidth = "100px";
|
|
||||||
data6.className = "cm-node-last-update";
|
|
||||||
if(data.last_update < 0) {
|
|
||||||
data6.textContent = 'N/A';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
data6.textContent = `${data.last_update}`.split(' ')[0];
|
|
||||||
}
|
|
||||||
data6.style.whiteSpace = "nowrap";
|
|
||||||
data6.style.overflow = "hidden";
|
|
||||||
data6.style.textOverflow = "ellipsis";
|
|
||||||
data6.style.textAlign = "center";
|
|
||||||
|
|
||||||
var data7 = document.createElement('td');
|
|
||||||
data7.style.textAlign = "center";
|
|
||||||
|
|
||||||
var installBtn = document.createElement('button');
|
|
||||||
installBtn.className = "cm-btn-install";
|
|
||||||
var installBtn2 = null;
|
|
||||||
var installBtn3 = null;
|
|
||||||
var installBtn4 = null;
|
|
||||||
|
|
||||||
this.install_buttons.push(installBtn);
|
|
||||||
|
|
||||||
switch(data.installed) {
|
|
||||||
case 'Disabled':
|
|
||||||
installBtn3 = document.createElement('button');
|
|
||||||
installBtn3.innerHTML = 'Enable';
|
|
||||||
installBtn3.className = "cm-btn-enable";
|
|
||||||
installBtn3.style.backgroundColor = 'blue';
|
|
||||||
installBtn3.style.color = 'white';
|
|
||||||
this.install_buttons.push(installBtn3);
|
|
||||||
|
|
||||||
installBtn.innerHTML = 'Uninstall';
|
|
||||||
installBtn.style.backgroundColor = 'red';
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'Update':
|
|
||||||
installBtn2 = document.createElement('button');
|
|
||||||
installBtn2.innerHTML = 'Update';
|
|
||||||
installBtn2.className = "cm-btn-update";
|
|
||||||
installBtn2.style.backgroundColor = 'blue';
|
|
||||||
installBtn2.style.color = 'white';
|
|
||||||
this.install_buttons.push(installBtn2);
|
|
||||||
|
|
||||||
installBtn3 = document.createElement('button');
|
|
||||||
installBtn3.innerHTML = 'Disable';
|
|
||||||
installBtn3.className = "cm-btn-disable";
|
|
||||||
installBtn3.style.backgroundColor = 'MediumSlateBlue';
|
|
||||||
installBtn3.style.color = 'white';
|
|
||||||
this.install_buttons.push(installBtn3);
|
|
||||||
|
|
||||||
installBtn.innerHTML = 'Uninstall';
|
|
||||||
installBtn.style.backgroundColor = 'red';
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'Fail':
|
|
||||||
installBtn4 = document.createElement('button');
|
|
||||||
installBtn4.innerHTML = 'Try fix';
|
|
||||||
installBtn4.className = "cm-btn-disable";
|
|
||||||
installBtn4.style.backgroundColor = '#6495ED';
|
|
||||||
installBtn4.style.color = 'white';
|
|
||||||
this.install_buttons.push(installBtn4);
|
|
||||||
|
|
||||||
case 'True':
|
|
||||||
if(manager_instance.update_check_checkbox.checked) {
|
|
||||||
installBtn2 = document.createElement('button');
|
|
||||||
installBtn2.innerHTML = 'Try update';
|
|
||||||
installBtn2.className = "cm-btn-update";
|
|
||||||
installBtn2.style.backgroundColor = 'Gray';
|
|
||||||
installBtn2.style.color = 'white';
|
|
||||||
this.install_buttons.push(installBtn2);
|
|
||||||
}
|
|
||||||
|
|
||||||
installBtn3 = document.createElement('button');
|
|
||||||
installBtn3.innerHTML = 'Disable';
|
|
||||||
installBtn3.className = "cm-btn-disable";
|
|
||||||
installBtn3.style.backgroundColor = 'MediumSlateBlue';
|
|
||||||
installBtn3.style.color = 'white';
|
|
||||||
this.install_buttons.push(installBtn3);
|
|
||||||
|
|
||||||
installBtn.innerHTML = 'Uninstall';
|
|
||||||
installBtn.style.backgroundColor = 'red';
|
|
||||||
break;
|
|
||||||
case 'False':
|
|
||||||
installBtn.innerHTML = 'Install';
|
|
||||||
installBtn.style.backgroundColor = 'black';
|
|
||||||
installBtn.style.color = 'white';
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
installBtn.innerHTML = `Try Install`;
|
|
||||||
installBtn.style.backgroundColor = 'Gray';
|
|
||||||
installBtn.style.color = 'white';
|
|
||||||
}
|
|
||||||
|
|
||||||
let j = i;
|
|
||||||
if(installBtn2 != null) {
|
|
||||||
installBtn2.style.width = "120px";
|
|
||||||
installBtn2.addEventListener('click', function() {
|
|
||||||
install_checked_custom_node(self.grid_rows, j, CustomNodesInstaller.instance, 'update');
|
|
||||||
});
|
|
||||||
|
|
||||||
data7.appendChild(installBtn2);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(installBtn3 != null) {
|
|
||||||
installBtn3.style.width = "120px";
|
|
||||||
installBtn3.addEventListener('click', function() {
|
|
||||||
install_checked_custom_node(self.grid_rows, j, CustomNodesInstaller.instance, 'toggle_active');
|
|
||||||
});
|
|
||||||
|
|
||||||
data7.appendChild(installBtn3);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(installBtn4 != null) {
|
|
||||||
installBtn4.style.width = "120px";
|
|
||||||
installBtn4.addEventListener('click', function() {
|
|
||||||
install_checked_custom_node(self.grid_rows, j, CustomNodesInstaller.instance, 'fix');
|
|
||||||
});
|
|
||||||
|
|
||||||
data7.appendChild(installBtn4);
|
|
||||||
}
|
|
||||||
|
|
||||||
installBtn.style.width = "120px";
|
|
||||||
installBtn.addEventListener('click', function() {
|
|
||||||
if(this.innerHTML == 'Uninstall') {
|
|
||||||
if (confirm(`Are you sure uninstall ${data.title}?`)) {
|
|
||||||
install_checked_custom_node(self.grid_rows, j, CustomNodesInstaller.instance, 'uninstall');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
install_checked_custom_node(self.grid_rows, j, CustomNodesInstaller.instance, 'install');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if(!data.author.startsWith('#NOTICE')){
|
|
||||||
data7.appendChild(installBtn);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(data.installed == 'Fail' || data.author.startsWith('#NOTICE'))
|
|
||||||
dataRow.style.backgroundColor = "#880000";
|
|
||||||
else
|
|
||||||
dataRow.style.backgroundColor = "var(--bg-color)";
|
|
||||||
dataRow.style.color = "var(--fg-color)";
|
|
||||||
dataRow.style.textAlign = "left";
|
|
||||||
|
|
||||||
dataRow.appendChild(data0);
|
|
||||||
dataRow.appendChild(data1);
|
|
||||||
dataRow.appendChild(data2);
|
|
||||||
dataRow.appendChild(data3);
|
|
||||||
dataRow.appendChild(data4);
|
|
||||||
dataRow.appendChild(data5);
|
|
||||||
dataRow.appendChild(data6);
|
|
||||||
dataRow.appendChild(data7);
|
|
||||||
tbody.appendChild(dataRow);
|
|
||||||
|
|
||||||
let buttons = [];
|
|
||||||
if(installBtn) {
|
|
||||||
buttons.push(installBtn);
|
|
||||||
}
|
|
||||||
if(installBtn2) {
|
|
||||||
buttons.push(installBtn2);
|
|
||||||
}
|
|
||||||
if(installBtn3) {
|
|
||||||
buttons.push(installBtn3);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.grid_rows[i] = {data:data, buttons:buttons, checkbox:checkbox, control:dataRow};
|
|
||||||
}
|
|
||||||
|
|
||||||
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%";
|
|
||||||
|
|
||||||
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:'Disabled', text:'Filter: disabled' },
|
|
||||||
{ value:'Update', text:'Filter: update' },
|
|
||||||
{ value:'True', text:'Filter: installed' },
|
|
||||||
{ value:'False', text:'Filter: not-installed' },
|
|
||||||
{ value:'Fail', text:'Filter: import failed' },
|
|
||||||
];
|
|
||||||
|
|
||||||
items.forEach(item => {
|
|
||||||
const option = document.createElement("option");
|
|
||||||
option.value = item.value;
|
|
||||||
option.text = item.text;
|
|
||||||
combo.appendChild(option);
|
|
||||||
});
|
|
||||||
|
|
||||||
if(this.show_mode == CustomNodesInstaller.ShowMode.UPDATE) {
|
|
||||||
this.filter = 'Update';
|
|
||||||
}
|
|
||||||
else if(this.show_mode == CustomNodesInstaller.ShowMode.MISSING_NODES) {
|
|
||||||
this.filter = '*';
|
|
||||||
}
|
|
||||||
|
|
||||||
let self = this;
|
|
||||||
combo.addEventListener('change', function(event) {
|
|
||||||
self.filter = event.target.value;
|
|
||||||
self.apply_searchbox();
|
|
||||||
});
|
|
||||||
|
|
||||||
if(self.filter) {
|
|
||||||
combo.value = self.filter;
|
|
||||||
}
|
|
||||||
|
|
||||||
return combo;
|
|
||||||
}
|
|
||||||
|
|
||||||
createHeaderControls() {
|
|
||||||
let self = this;
|
|
||||||
this.search_box = $el('input.cm-search-filter', {type:'text', id:'manager-customnode-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 channel_badge = '';
|
|
||||||
if(this.channel != 'default') {
|
|
||||||
channel_badge = $el('span', {id:'cm-channel-badge'}, [`Channel: ${this.channel} (Incomplete list)`]);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
|
|
||||||
}
|
|
||||||
let cell = $el('td', {width:'100%'}, [filter_control, channel_badge, 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-installer-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(show_mode) {
|
|
||||||
this.show_mode = show_mode;
|
|
||||||
|
|
||||||
if(this.show_mode != CustomNodesInstaller.ShowMode.NORMAL) {
|
|
||||||
this.search_keyword = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
this.invalidateControl();
|
|
||||||
|
|
||||||
this.element.style.display = "block";
|
|
||||||
this.element.style.zIndex = 10001;
|
|
||||||
}
|
|
||||||
catch(exception) {
|
|
||||||
app.ui.dialog.show(`Failed to get custom node list. / ${exception}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
1524
js/custom-nodes-manager.js
Normal file
@ -1,7 +1,7 @@
|
|||||||
import { app } from "../../scripts/app.js";
|
import { app } from "../../scripts/app.js";
|
||||||
import { api } from "../../scripts/api.js"
|
import { api } from "../../scripts/api.js"
|
||||||
import { ComfyDialog, $el } from "../../scripts/ui.js";
|
import { ComfyDialog, $el } from "../../scripts/ui.js";
|
||||||
import { install_checked_custom_node, manager_instance, rebootAPI, show_message } from "./common.js";
|
import { manager_instance, rebootAPI, show_message } from "./common.js";
|
||||||
|
|
||||||
async function install_model(target) {
|
async function install_model(target) {
|
||||||
if(ModelInstaller.instance) {
|
if(ModelInstaller.instance) {
|
||||||
|
|||||||
1
js/turbogrid.esm.js
Normal file
|
Before Width: | Height: | Size: 193 KiB After Width: | Height: | Size: 160 KiB |
BIN
misc/main.png
|
Before Width: | Height: | Size: 28 KiB |
BIN
misc/menu.jpg
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 91 KiB |
BIN
misc/missing-list.jpg
Normal file
|
After Width: | Height: | Size: 170 KiB |
|
Before Width: | Height: | Size: 198 KiB |
BIN
misc/missing-menu.jpg
Normal file
|
After Width: | Height: | Size: 129 KiB |
|
Before Width: | Height: | Size: 165 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 29 KiB |
114
model-list.json
@ -120,6 +120,16 @@
|
|||||||
"filename": "8x_NMKD-Superscale_150000_G.pth",
|
"filename": "8x_NMKD-Superscale_150000_G.pth",
|
||||||
"url": "https://huggingface.co/uwg/upscaler/resolve/main/ESRGAN/8x_NMKD-Superscale_150000_G.pth"
|
"url": "https://huggingface.co/uwg/upscaler/resolve/main/ESRGAN/8x_NMKD-Superscale_150000_G.pth"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "8x_NMKD-Faces_160000_G",
|
||||||
|
"type": "upscale",
|
||||||
|
"base": "upscale",
|
||||||
|
"save_path": "default",
|
||||||
|
"description": "8x_NMKD-Faces_160000_G upscaler model",
|
||||||
|
"reference": "https://huggingface.co/gemasai/8x_NMKD-Faces_160000_G/tree/main",
|
||||||
|
"filename": "8x_NMKD-Faces_160000_G.pth",
|
||||||
|
"url": "https://huggingface.co/gemasai/8x_NMKD-Faces_160000_G/resolve/main/8x_NMKD-Faces_160000_G.pth"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "LDSR(Latent Diffusion Super Resolution)",
|
"name": "LDSR(Latent Diffusion Super Resolution)",
|
||||||
"type": "upscale",
|
"type": "upscale",
|
||||||
@ -2781,7 +2791,7 @@
|
|||||||
"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"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "xinsir/CControlnet-Scribble-Sdxl-1.0-Anime",
|
"name": "xinsir/Controlnet-Scribble-Sdxl-1.0-Anime",
|
||||||
"type": "controlnet",
|
"type": "controlnet",
|
||||||
"base": "SDXL",
|
"base": "SDXL",
|
||||||
"save_path": "controlnet/SDXL/controlnet-scribble-sdxl-1.0-anime",
|
"save_path": "controlnet/SDXL/controlnet-scribble-sdxl-1.0-anime",
|
||||||
@ -2800,6 +2810,108 @@
|
|||||||
"reference": "https://huggingface.co/Kijai/DynamiCrafter_pruned",
|
"reference": "https://huggingface.co/Kijai/DynamiCrafter_pruned",
|
||||||
"filename": "tooncrafter_512_interp-fp16.safetensors",
|
"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"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "CN-anytest_v4-marged.safetensors",
|
||||||
|
"type": "controlnet",
|
||||||
|
"base": "SDXL",
|
||||||
|
"save_path": "controlnet/SDXL",
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "CN-anytest_v4-marged_am_dim256.safetensors (dim256/Animagine)",
|
||||||
|
"type": "controlnet",
|
||||||
|
"base": "SDXL",
|
||||||
|
"save_path": "controlnet/SDXL",
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "CN-anytest_v4-marged_am_dim128.safetensors (dim128/Animagine)",
|
||||||
|
"type": "controlnet",
|
||||||
|
"base": "SDXL",
|
||||||
|
"save_path": "controlnet/SDXL",
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "CN-anytest_v4-marged_pn_dim256.safetensors (dim256/Pony)",
|
||||||
|
"type": "controlnet",
|
||||||
|
"base": "SDXL",
|
||||||
|
"save_path": "controlnet/SDXL",
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "CN-anytest_v4-marged_pn_dim128.safetensors (dim128/Pony)",
|
||||||
|
"type": "controlnet",
|
||||||
|
"base": "SDXL",
|
||||||
|
"save_path": "controlnet/SDXL",
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "CN-anytest_v3-50000_fp16.safetensors (fp16)",
|
||||||
|
"type": "controlnet",
|
||||||
|
"base": "SDXL",
|
||||||
|
"save_path": "controlnet/SDXL",
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "CN-anytest_v3-50000_am_dim256.safetensors (dim256/Animagine)",
|
||||||
|
"type": "controlnet",
|
||||||
|
"base": "SDXL",
|
||||||
|
"save_path": "controlnet/SDXL",
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "CN-anytest_v3-50000_am_dim128.safetensors (dim128/Animagine)",
|
||||||
|
"type": "controlnet",
|
||||||
|
"base": "SDXL",
|
||||||
|
"save_path": "controlnet/SDXL",
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "CN-anytest_v3-50000_pn_dim256.safetensors (dim256/Pony)",
|
||||||
|
"type": "controlnet",
|
||||||
|
"base": "SDXL",
|
||||||
|
"save_path": "controlnet/SDXL",
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "CN-anytest_v3-50000_pn_dim128.safetensors (dim128/Pony)",
|
||||||
|
"type": "controlnet",
|
||||||
|
"base": "SDXL",
|
||||||
|
"save_path": "controlnet/SDXL",
|
||||||
|
"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"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,6 +9,246 @@
|
|||||||
"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."
|
"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": "baicai99",
|
||||||
|
"title": "ComfyUI-FrameSkipping",
|
||||||
|
"id": "frame-skipping",
|
||||||
|
"reference": "https://github.com/baicai99/ComfyUI-FrameSkipping",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/baicai99/ComfyUI-FrameSkipping"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This plugin can precisely control the rendering between frames, completing the synthesis of multiple frames in a single load. My homepage includes my attached workflow."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "ejektaflex",
|
||||||
|
"title": "ComfyUI - Ty",
|
||||||
|
"id": "ty-nodes",
|
||||||
|
"reference": "https://github.com/ejektaflex/ComfyUI-Ty",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/ejektaflex/ComfyUI-Ty"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:Lora Block Weight Regex Loader"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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 [a/AiuniAI/Unique3D](https://github.com/AiuniAI/Unique3D) into ComfyUI."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "kycg",
|
||||||
|
"title": "comfyui-Kwtoolset",
|
||||||
|
"id": "kwtoolset",
|
||||||
|
"reference": "https://github.com/kycg/comfyui-Kwtoolset",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/kycg/comfyui-Kwtoolset"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:KwtoolsetLoraLoaderwithpreview, KwtoolsetCheckpointLoaderwithpreview, KwtoolsetLoadCheckpointsBatch, KwtoolsetGrowMaskPlus, KwtoolsetGetHipMask, KwtoolsetGetHipMasktest, KwtoolsetGetImageSize, KWPositiveString, KWNagetiveString, KWanywhereString, KwtoolsetChangeOpenpose, ..."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "mashb1t",
|
||||||
|
"title": "ComfyUI mashb1t nodes",
|
||||||
|
"id": "mashb1t",
|
||||||
|
"reference": "https://github.com/mashb1t/comfyui-nodes-mashb1t",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/mashb1t/comfyui-nodes-mashb1t"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This Python script is an optional add-on to the Comfy UI stable diffusion client."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "immersiveexperience",
|
||||||
|
"title": "ie-comfyui-color-nodes",
|
||||||
|
"reference": "https://github.com/immersiveexperience/ie-comfyui-color-nodes",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/immersiveexperience/ie-comfyui-color-nodes"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Custom ComfyUI nodes for simple color correction."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "LZpenguin",
|
||||||
|
"title": "ComfyUI-Text",
|
||||||
|
"id": "comfy-text",
|
||||||
|
"reference": "https://github.com/LZpenguin/ComfyUI-Text",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/LZpenguin/ComfyUI-Text"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:Add_text_by_mask.[w/This custom node cannot be installed simultaneously as it has the same repository name as MarkoCa1/ComfyUI-Text.]"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "yushan777",
|
||||||
|
"title": "Y7 Nodes for ComfyUI",
|
||||||
|
"id": "y7nodes",
|
||||||
|
"reference": "https://github.com/yushan777/ComfyUI-Y7Nodes",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/yushan777/ComfyUI-Y7Nodes"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:Count_Tokens_(Y7)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "norgeous",
|
||||||
|
"title": "UI Builder [WIP]",
|
||||||
|
"id": "norgeous",
|
||||||
|
"reference": "https://github.com/norgeous/ComfyUI-UI-Builder",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/norgeous/ComfyUI-UI-Builder"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Alternative configurable React UI overlay for Comfy UI."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Shinsplat",
|
||||||
|
"title": "ComfyUI-Shinsplat [UNSAFE]",
|
||||||
|
"id": "shinsplat",
|
||||||
|
"reference": "https://github.com/Shinsplat/ComfyUI-Shinsplat",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Shinsplat/ComfyUI-Shinsplat"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes: Clip Text Encode (Shinsplat), Clip Text Encode SDXL (Shinsplat), Lora Loader (Shinsplat).\n[w/This extension poses a risk of executing arbitrary commands through workflow execution. Please be cautious.]"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "NitramDom",
|
||||||
|
"title": "ComfyUI_FacialFlip",
|
||||||
|
"id": "facialflip",
|
||||||
|
"reference": "https://github.com/NitramDom/ComfyUI_FacialFlip",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/NitramDom/ComfyUI_FacialFlip"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:Swapper"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "hy134300",
|
||||||
|
"title": "comfyui-hydit",
|
||||||
|
"reference": "https://github.com/hy134300/comfyui-hydit",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/hy134300/comfyui-hydit"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This repository contains a customized node and workflow designed specifically for HunYuan DIT. The official tests conducted on DDPM, DDIM, and DPMMS have consistently yielded results that align with those obtained through the Diffusers library. However, it's important to note that we cannot assure the consistency of results from other ComfyUI native samplers with the Diffusers inference. We cordially invite users to explore our workflow and are open to receiving any inquiries or suggestions you may have."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "corbin-hayden13",
|
||||||
|
"title": "ComfyUI-Better-Dimensions",
|
||||||
|
"id": "better-dim",
|
||||||
|
"reference": "https://github.com/corbin-hayden13/ComfyUI-Better-Dimensions",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/corbin-hayden13/ComfyUI-Better-Dimensions"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:BetterImageDimensions, SDXLDimensions, PureRatio"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "endman100",
|
||||||
|
"title": "ComfyUI Nodes: SaveConditioning and LoadConditioning",
|
||||||
|
"id": "save-load-conditioning",
|
||||||
|
"reference": "https://github.com/endman100/ComfyUI-SaveAndLoadPromptCondition",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/endman100/ComfyUI-SaveAndLoadPromptCondition"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "The SaveConditioning node is designed to save conditioning data to binary files. This is useful for storing and reusing conditioning information across different sessions or applications.\n[w/This node can only handle very limited conditioning at the text prompt level.]"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "marduk191",
|
||||||
|
"title": "comfyui-marnodes",
|
||||||
|
"id": "marnodes",
|
||||||
|
"reference": "https://github.com/marduk191/comfyui-marnodes",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/marduk191/comfyui-marnodes"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:marduk191_workflow_settings"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "kijai",
|
||||||
|
"title": "ComfyUI-CV-VAE",
|
||||||
|
"id": "cv-vae",
|
||||||
|
"reference": "https://github.com/kijai/ComfyUI-CV-VAE",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/kijai/ComfyUI-CV-VAE"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:CV_VAE_Load, CV_VAE_Encode, CV_VAE_Decode"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "GentlemanHu",
|
||||||
|
"title": "ComfyUI Notifier",
|
||||||
|
"id": "notifier",
|
||||||
|
"reference": "https://github.com/GentlemanHu/ComfyUI-Notifier",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/GentlemanHu/ComfyUI-Notifier"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:GentlemanHu_Notifier"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "jimmm-ai",
|
||||||
|
"title": "TimeUi a ComfyUI Timeline Node System [WIP]",
|
||||||
|
"id": "timeline",
|
||||||
|
"reference": "https://github.com/jimmm-ai/TimeUi-a-ComfyUi-Timeline-Node",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/jimmm-ai/TimeUi-a-ComfyUi-Timeline-Node"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "I've been working on the UX/UI of a timeline custom node system for ComfyUI over the past two weeks. The goal is to create a timeline similar to video/animation editing tools, without relying on traditional timeframe code. You can effortlessly add, delete, or rearrange rows, providing a streamlined user experience."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "udi0510",
|
||||||
|
"title": "comfyui-slicer",
|
||||||
|
"id": "slicer",
|
||||||
|
"reference": "https://github.com/udi0510/comfyui-slicer",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/udi0510/comfyui-slicer"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:SlicerNode"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "jh-leon-kim",
|
||||||
|
"title": "ComfyUI-JHK-utils",
|
||||||
|
"id": "jhk",
|
||||||
|
"reference": "https://github.com/jh-leon-kim/ComfyUI-JHK-utils",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/jh-leon-kim/ComfyUI-JHK-utils"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:JHK_Utils_LoadEmbed, JHK_Utils_string_merge, JHK_Utils_ImageRemoveBackground"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "StartHua",
|
||||||
|
"title": "Comfyui_CXH_CRM",
|
||||||
|
"id": "cxh-crm",
|
||||||
|
"reference": "https://github.com/StartHua/Comfyui_CXH_CRM",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/StartHua/Comfyui_CXH_CRM"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:CRM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "comfypod",
|
||||||
|
"title": "ComfyUI-Comflow",
|
||||||
|
"id": "comflow",
|
||||||
|
"reference": "https://github.com/comfypod/ComfyUI-Comflow",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/comfypod/ComfyUI-Comflow"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI-Comflow."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "AI2lab",
|
"author": "AI2lab",
|
||||||
"title": "comfyUI-tool-2lab",
|
"title": "comfyUI-tool-2lab",
|
||||||
@ -78,13 +318,12 @@
|
|||||||
{
|
{
|
||||||
"author": "brycegoh",
|
"author": "brycegoh",
|
||||||
"title": "brycegoh/comfyui-custom-nodes",
|
"title": "brycegoh/comfyui-custom-nodes",
|
||||||
"id": "brycegoh",
|
|
||||||
"reference": "https://github.com/brycegoh/comfyui-custom-nodes",
|
"reference": "https://github.com/brycegoh/comfyui-custom-nodes",
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/brycegoh/comfyui-custom-nodes"
|
"https://github.com/brycegoh/comfyui-custom-nodes"
|
||||||
],
|
],
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Nodes:MaskAreaComparisonSegment, FillMaskedArea, OCRAndMask"
|
"description": "Nodes:MaskAreaComparisonSegment, FillMaskedArea, OCRAndMask, CombineTwoImageIntoOne"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"author": "LykosAI",
|
"author": "LykosAI",
|
||||||
@ -330,16 +569,6 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "This extension provides [a/DiffBIR](https://github.com/XPixelGroup/DiffBIR) feature."
|
"description": "This extension provides [a/DiffBIR](https://github.com/XPixelGroup/DiffBIR) feature."
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "runtime44",
|
|
||||||
"title": "Runtime44 ComfyUI Nodes",
|
|
||||||
"reference": "https://github.com/runtime44/comfyui_r44_nodes",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/runtime44/comfyui_r44_nodes"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Nodes: Runtime44Upscaler, Runtime44ColorMatch, Runtime44DynamicKSampler, Runtime44ImageOverlay, Runtime44ImageResizer, Runtime44ImageToNoise, Runtime44MaskSampler, Runtime44TiledMaskSampler, Runtime44IterativeUpscaleFactor, Runtime44ImageEnhance"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "ericbeyer",
|
"author": "ericbeyer",
|
||||||
"title": "guidance_interval",
|
"title": "guidance_interval",
|
||||||
@ -1120,16 +1349,6 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "After discovering @storyicon implementation here of Segment Anything, I realized its potential as a powerful tool for ComfyUI if implemented correctly. I delved into the SAM and Dino models. The following is my own adaptation of sam_hq for ComfyUI."
|
"description": "After discovering @storyicon implementation here of Segment Anything, I realized its potential as a powerful tool for ComfyUI if implemented correctly. I delved into the SAM and Dino models. The following is my own adaptation of sam_hq for ComfyUI."
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "phineas-pta",
|
|
||||||
"title": "comfy-trt-test [WIP]",
|
|
||||||
"reference": "https://github.com/phineas-pta/comfy-trt-test",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/phineas-pta/comfy-trt-test"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Test project for ComfyUI TensorRT Support.\nNOT WORKING YET.\nnot automatic yet, do not use ComfyUI-Manager to install !!!.\nnot beginner-friendly yet, still intended to technical users\nNOTE: The reason for registration in the Manager is for guidance, and for detailed installation instructions, please visit the repository."
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "Brandelan",
|
"author": "Brandelan",
|
||||||
"title": "ComfyUI_bd_customNodes",
|
"title": "ComfyUI_bd_customNodes",
|
||||||
|
|||||||
@ -504,8 +504,13 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/Quasimondo/ComfyUI-QuasimondoNodes": [
|
"https://github.com/Quasimondo/ComfyUI-QuasimondoNodes": [
|
||||||
[
|
[
|
||||||
|
"Color Match",
|
||||||
"Custom Shader",
|
"Custom Shader",
|
||||||
"Folder Queue Manager",
|
"Folder Queue Manager",
|
||||||
|
"Image Blend by Mask (Batch)",
|
||||||
|
"Image Noise Generator",
|
||||||
|
"Perlin Noise Generator",
|
||||||
|
"Random Image Generator",
|
||||||
"Spring Mesh",
|
"Spring Mesh",
|
||||||
"Video Queue Manager"
|
"Video Queue Manager"
|
||||||
],
|
],
|
||||||
@ -539,9 +544,25 @@
|
|||||||
"title_aux": "ComfyUI-MS-Nodes [WIP]"
|
"title_aux": "ComfyUI-MS-Nodes [WIP]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/Scorpinaus/ComfyUI-DiffusersLoader": [
|
||||||
|
[
|
||||||
|
"CombinedDiffusersSD15Loader",
|
||||||
|
"CombinedDiffusersSDXLLoader",
|
||||||
|
"SD15CLIPLoader",
|
||||||
|
"SD15UNETLoader",
|
||||||
|
"SD15VAELoader",
|
||||||
|
"SDXLCLIPLoader",
|
||||||
|
"SDXLUNETLoader",
|
||||||
|
"SDXLVAELoader"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-DiffusersLoader"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/SeedV/ComfyUI-SeedV-Nodes": [
|
"https://github.com/SeedV/ComfyUI-SeedV-Nodes": [
|
||||||
[
|
[
|
||||||
"CheckpointLoaderSimpleShared //SeedV",
|
"CheckpointLoaderSimpleShared //SeedV",
|
||||||
|
"ControlNetLoaderAdvancedShared",
|
||||||
"LoraLoader //SeedV",
|
"LoraLoader //SeedV",
|
||||||
"Script"
|
"Script"
|
||||||
],
|
],
|
||||||
@ -549,6 +570,14 @@
|
|||||||
"title_aux": "ComfyUI-SeedV-Nodes [UNSAFE]"
|
"title_aux": "ComfyUI-SeedV-Nodes [UNSAFE]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/StartHua/Comfyui_CXH_CRM": [
|
||||||
|
[
|
||||||
|
"CRM"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "Comfyui_CXH_CRM"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/TSFSean/ComfyUI-TSFNodes": [
|
"https://github.com/TSFSean/ComfyUI-TSFNodes": [
|
||||||
[
|
[
|
||||||
"GyroOSC"
|
"GyroOSC"
|
||||||
@ -712,8 +741,21 @@
|
|||||||
"title_aux": "comfyui-cleaner"
|
"title_aux": "comfyui-cleaner"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/bruce007lee/comfyui-tiny-utils": [
|
||||||
|
[
|
||||||
|
"CropImageByMask",
|
||||||
|
"FaceAlign",
|
||||||
|
"FaceAlignImageProcess",
|
||||||
|
"FaceAlignMaskProcess",
|
||||||
|
"ImageFillColorByMask"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "comfyui-tiny-utils"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/brycegoh/comfyui-custom-nodes": [
|
"https://github.com/brycegoh/comfyui-custom-nodes": [
|
||||||
[
|
[
|
||||||
|
"CombineTwoImageIntoOne",
|
||||||
"FillMaskedArea",
|
"FillMaskedArea",
|
||||||
"MaskAreaComparisonSegment",
|
"MaskAreaComparisonSegment",
|
||||||
"OCRAndMask"
|
"OCRAndMask"
|
||||||
@ -955,51 +997,38 @@
|
|||||||
"title_aux": "ComfyUI"
|
"title_aux": "ComfyUI"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/dezi-ai/ComfyUI-AnimateLCM": [
|
"https://github.com/comfypod/ComfyUI-Comflow": [
|
||||||
[
|
[
|
||||||
"ADE_AdjustPEFullStretch",
|
"ComflowInputBoolean",
|
||||||
"ADE_AdjustPEManual",
|
"ComflowInputCheckpoint",
|
||||||
"ADE_AdjustPESweetspotStretch",
|
"ComflowInputImage",
|
||||||
"ADE_AnimateDiffCombine",
|
"ComflowInputImageAlpha",
|
||||||
"ADE_AnimateDiffKeyframe",
|
"ComflowInputImageBatch",
|
||||||
"ADE_AnimateDiffLoRALoader",
|
"ComflowInputLora",
|
||||||
"ADE_AnimateDiffLoaderGen1",
|
"ComflowInputNumber",
|
||||||
"ADE_AnimateDiffLoaderV1Advanced",
|
"ComflowInputNumberInt",
|
||||||
"ADE_AnimateDiffLoaderWithContext",
|
"ComflowInputNumberSlider",
|
||||||
"ADE_AnimateDiffModelSettings",
|
"ComflowInputText",
|
||||||
"ADE_AnimateDiffModelSettingsAdvancedAttnStrengths",
|
"ComflowInputVid",
|
||||||
"ADE_AnimateDiffModelSettingsSimple",
|
"ComflowInputVideo",
|
||||||
"ADE_AnimateDiffModelSettings_Release",
|
"ComflowWebsocketImageInput",
|
||||||
"ADE_AnimateDiffSamplingSettings",
|
"ComflowWebsocketImageOutput"
|
||||||
"ADE_AnimateDiffSettings",
|
|
||||||
"ADE_AnimateDiffUniformContextOptions",
|
|
||||||
"ADE_AnimateDiffUnload",
|
|
||||||
"ADE_ApplyAnimateDiffModel",
|
|
||||||
"ADE_ApplyAnimateDiffModelSimple",
|
|
||||||
"ADE_BatchedContextOptions",
|
|
||||||
"ADE_EmptyLatentImageLarge",
|
|
||||||
"ADE_IterationOptsDefault",
|
|
||||||
"ADE_IterationOptsFreeInit",
|
|
||||||
"ADE_LoadAnimateDiffModel",
|
|
||||||
"ADE_LoopedUniformContextOptions",
|
|
||||||
"ADE_LoopedUniformViewOptions",
|
|
||||||
"ADE_MaskedLoadLora",
|
|
||||||
"ADE_MultivalDynamic",
|
|
||||||
"ADE_MultivalScaledMask",
|
|
||||||
"ADE_NoiseLayerAdd",
|
|
||||||
"ADE_NoiseLayerAddWeighted",
|
|
||||||
"ADE_NoiseLayerReplace",
|
|
||||||
"ADE_StandardStaticContextOptions",
|
|
||||||
"ADE_StandardStaticViewOptions",
|
|
||||||
"ADE_StandardUniformContextOptions",
|
|
||||||
"ADE_StandardUniformViewOptions",
|
|
||||||
"ADE_UseEvolvedSampling",
|
|
||||||
"ADE_ViewsOnlyContextOptions",
|
|
||||||
"AnimateDiffLoaderV1",
|
|
||||||
"CheckpointLoaderSimpleWithNoiseSelect"
|
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "ComfyUI Animate LCM"
|
"description": "",
|
||||||
|
"nickname": "Comflow",
|
||||||
|
"title": "comflow",
|
||||||
|
"title_aux": "ComfyUI-Comflow"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"https://github.com/corbin-hayden13/ComfyUI-Better-Dimensions": [
|
||||||
|
[
|
||||||
|
"BetterImageDimensions",
|
||||||
|
"PureRatio",
|
||||||
|
"SDXLDimensions"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-Better-Dimensions"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/dfl/comfyui-stylegan": [
|
"https://github.com/dfl/comfyui-stylegan": [
|
||||||
@ -1089,6 +1118,15 @@
|
|||||||
"title_aux": "ComfyUI-Ty"
|
"title_aux": "ComfyUI-Ty"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/endman100/ComfyUI-SaveAndLoadPromptCondition": [
|
||||||
|
[
|
||||||
|
"LoadContditioning",
|
||||||
|
"SaveConditioning"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI Nodes: SaveConditioning and LoadConditioning"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/ericbeyer/guidance_interval": [
|
"https://github.com/ericbeyer/guidance_interval": [
|
||||||
[
|
[
|
||||||
"Guidance Interval"
|
"Guidance Interval"
|
||||||
@ -1190,6 +1228,27 @@
|
|||||||
"title_aux": "comfy-magick [WIP]"
|
"title_aux": "comfy-magick [WIP]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/huchenlei/ComfyUI_densediffusion": [
|
||||||
|
[
|
||||||
|
"DenseDiffusionAddCondNode",
|
||||||
|
"DenseDiffusionApplyNode"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI DenseDiffusion [WIP]"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"https://github.com/huchenlei/ComfyUI_omost": [
|
||||||
|
[
|
||||||
|
"OmostLLMChatNode",
|
||||||
|
"OmostLLMLoaderNode",
|
||||||
|
"OmostLayoutCondNode",
|
||||||
|
"OmostLoadCanvasConditioningNode",
|
||||||
|
"OmostRenderCanvasConditioningNode"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI_omost [WIP]"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/huizhang0110/ComfyUI_Easy_Nodes_hui": [
|
"https://github.com/huizhang0110/ComfyUI_Easy_Nodes_hui": [
|
||||||
[
|
[
|
||||||
"EasyBgRemover",
|
"EasyBgRemover",
|
||||||
@ -1241,12 +1300,23 @@
|
|||||||
"https://github.com/immersiveexperience/ie-comfyui-color-nodes": [
|
"https://github.com/immersiveexperience/ie-comfyui-color-nodes": [
|
||||||
[
|
[
|
||||||
"Average Color",
|
"Average Color",
|
||||||
"Complementary Color"
|
"Complementary Color",
|
||||||
|
"Hex to Color Name"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "ie-comfyui-color-nodes"
|
"title_aux": "ie-comfyui-color-nodes"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/jh-leon-kim/ComfyUI-JHK-utils": [
|
||||||
|
[
|
||||||
|
"JHK_Utils_ImageRemoveBackground",
|
||||||
|
"JHK_Utils_LoadEmbed",
|
||||||
|
"JHK_Utils_string_merge"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-JHK-utils"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/jn-jairo/jn_node_suite_comfyui": [
|
"https://github.com/jn-jairo/jn_node_suite_comfyui": [
|
||||||
[
|
[
|
||||||
"JN_AreaInfo",
|
"JN_AreaInfo",
|
||||||
@ -1391,6 +1461,16 @@
|
|||||||
"title_aux": "ComfyUI_Usability (WIP)"
|
"title_aux": "ComfyUI_Usability (WIP)"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/kijai/ComfyUI-CV-VAE": [
|
||||||
|
[
|
||||||
|
"CV_VAE_Decode",
|
||||||
|
"CV_VAE_Encode",
|
||||||
|
"CV_VAE_Load"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-CV-VAE"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/kijai/ComfyUI-DeepSeek-VL": [
|
"https://github.com/kijai/ComfyUI-DeepSeek-VL": [
|
||||||
[
|
[
|
||||||
"deepseek_vl_inference",
|
"deepseek_vl_inference",
|
||||||
@ -1462,6 +1542,18 @@
|
|||||||
"title_aux": "ComfyUI-BuildPath"
|
"title_aux": "ComfyUI-BuildPath"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/marduk191/comfyui-marnodes": [
|
||||||
|
[
|
||||||
|
"marduk191_workflow_settings"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"author": "\u02f6marduk191",
|
||||||
|
"description": "A node to set workflow settings.",
|
||||||
|
"nickname": "marduk191 workflow settings",
|
||||||
|
"title": "marduk191 workflow settings",
|
||||||
|
"title_aux": "comfyui-marnodes"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/mut-ex/comfyui-gligengui-node": [
|
"https://github.com/mut-ex/comfyui-gligengui-node": [
|
||||||
[
|
[
|
||||||
"GLIGEN_GUI"
|
"GLIGEN_GUI"
|
||||||
@ -1533,18 +1625,19 @@
|
|||||||
"title_aux": "Kosmos2_BBox_Cutter Models"
|
"title_aux": "Kosmos2_BBox_Cutter Models"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/phineas-pta/comfy-trt-test": [
|
"https://github.com/pamparamm/ComfyUI-ppm": [
|
||||||
[
|
[
|
||||||
"TRT_Lora_Loader",
|
"CLIPMicroConditioning",
|
||||||
"TRT_Torch_Compile",
|
"CLIPNegPip",
|
||||||
"TRT_Unet_Loader"
|
"CLIPSetLastLayerFloat",
|
||||||
|
"CLIPTextEncodeBREAK",
|
||||||
|
"EmptyLatentImageAR",
|
||||||
|
"RandomPromptGenerator",
|
||||||
|
"StableCascade_AutoCompLatent",
|
||||||
|
"TokenCounter"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"author": "PTA",
|
"title_aux": "ComfyUI-ppm"
|
||||||
"description": "attempt to use TensorRT with ComfyUI, not yet compatible with ComfyUI-Manager, see README for instructions",
|
|
||||||
"nickname": "comfy trt test",
|
|
||||||
"title": "TensorRT with ComfyUI (work-in-progress)",
|
|
||||||
"title_aux": "comfy-trt-test [WIP]"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/poisenbery/NudeNet-Detector-Provider": [
|
"https://github.com/poisenbery/NudeNet-Detector-Provider": [
|
||||||
@ -1717,6 +1810,14 @@
|
|||||||
"title_aux": "ComfyUI-TDNodes [WIP]"
|
"title_aux": "ComfyUI-TDNodes [WIP]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/udi0510/comfyui-slicer": [
|
||||||
|
[
|
||||||
|
"SlicerNode"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "comfyui-slicer"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/umisetokikaze/comfyui_mergekit": [
|
"https://github.com/umisetokikaze/comfyui_mergekit": [
|
||||||
[
|
[
|
||||||
"DefineSaveName",
|
"DefineSaveName",
|
||||||
|
|||||||
@ -7,13 +7,17 @@
|
|||||||
"stars": 13,
|
"stars": 13,
|
||||||
"last_update": "2024-03-08 10:11:44"
|
"last_update": "2024-03-08 10:11:44"
|
||||||
},
|
},
|
||||||
|
"https://github.com/AI2lab/comfyUI-tool-2lab": {
|
||||||
|
"stars": 3,
|
||||||
|
"last_update": "2024-06-06 02:53:28"
|
||||||
|
},
|
||||||
"https://github.com/AIGODLIKE/ComfyUI-Studio": {
|
"https://github.com/AIGODLIKE/ComfyUI-Studio": {
|
||||||
"stars": 196,
|
"stars": 198,
|
||||||
"last_update": "2024-05-30 02:14:11"
|
"last_update": "2024-06-05 00:52:46"
|
||||||
},
|
},
|
||||||
"https://github.com/ALatentPlace/ComfyUI_yanc": {
|
"https://github.com/ALatentPlace/ComfyUI_yanc": {
|
||||||
"stars": 12,
|
"stars": 13,
|
||||||
"last_update": "2024-05-27 12:39:32"
|
"last_update": "2024-06-05 05:07:37"
|
||||||
},
|
},
|
||||||
"https://github.com/BadCafeCode/execution-inversion-demo-comfyui": {
|
"https://github.com/BadCafeCode/execution-inversion-demo-comfyui": {
|
||||||
"stars": 3,
|
"stars": 3,
|
||||||
@ -44,20 +48,24 @@
|
|||||||
"last_update": "2024-05-11 13:33:24"
|
"last_update": "2024-05-11 13:33:24"
|
||||||
},
|
},
|
||||||
"https://github.com/ExponentialML/ComfyUI_LiveDirector": {
|
"https://github.com/ExponentialML/ComfyUI_LiveDirector": {
|
||||||
"stars": 33,
|
"stars": 34,
|
||||||
"last_update": "2024-04-09 19:01:49"
|
"last_update": "2024-04-09 19:01:49"
|
||||||
},
|
},
|
||||||
"https://github.com/Extraltodeus/Conditioning-token-experiments-for-ComfyUI": {
|
"https://github.com/Extraltodeus/Conditioning-token-experiments-for-ComfyUI": {
|
||||||
"stars": 13,
|
"stars": 13,
|
||||||
"last_update": "2024-03-10 01:04:02"
|
"last_update": "2024-03-10 01:04:02"
|
||||||
},
|
},
|
||||||
|
"https://github.com/FoundD-oka/ComfyUI-kisekae-OOTD": {
|
||||||
|
"stars": 0,
|
||||||
|
"last_update": "2024-06-02 06:13:42"
|
||||||
|
},
|
||||||
"https://github.com/GentlemanHu/ComfyUI-Notifier": {
|
"https://github.com/GentlemanHu/ComfyUI-Notifier": {
|
||||||
"stars": 3,
|
"stars": 3,
|
||||||
"last_update": "2024-05-20 15:25:17"
|
"last_update": "2024-06-04 10:05:38"
|
||||||
},
|
},
|
||||||
"https://github.com/GraftingRayman/ComfyUI_GR_PromptSelector": {
|
"https://github.com/GraftingRayman/ComfyUI_GR_PromptSelector": {
|
||||||
"stars": 9,
|
"stars": 9,
|
||||||
"last_update": "2024-05-28 23:31:22"
|
"last_update": "2024-06-06 13:14:10"
|
||||||
},
|
},
|
||||||
"https://github.com/GrindHouse66/ComfyUI-GH_Tools": {
|
"https://github.com/GrindHouse66/ComfyUI-GH_Tools": {
|
||||||
"stars": 0,
|
"stars": 0,
|
||||||
@ -88,7 +96,7 @@
|
|||||||
"last_update": "2024-02-04 21:15:22"
|
"last_update": "2024-02-04 21:15:22"
|
||||||
},
|
},
|
||||||
"https://github.com/LykosAI/ComfyUI-Inference-Core-Nodes": {
|
"https://github.com/LykosAI/ComfyUI-Inference-Core-Nodes": {
|
||||||
"stars": 12,
|
"stars": 14,
|
||||||
"last_update": "2024-04-05 05:11:51"
|
"last_update": "2024-04-05 05:11:51"
|
||||||
},
|
},
|
||||||
"https://github.com/MrAdamBlack/CheckProgress": {
|
"https://github.com/MrAdamBlack/CheckProgress": {
|
||||||
@ -109,7 +117,7 @@
|
|||||||
},
|
},
|
||||||
"https://github.com/Quasimondo/ComfyUI-QuasimondoNodes": {
|
"https://github.com/Quasimondo/ComfyUI-QuasimondoNodes": {
|
||||||
"stars": 0,
|
"stars": 0,
|
||||||
"last_update": "2024-06-01 09:08:26"
|
"last_update": "2024-06-01 21:27:18"
|
||||||
},
|
},
|
||||||
"https://github.com/SadaleNet/ComfyUI-Prompt-To-Prompt": {
|
"https://github.com/SadaleNet/ComfyUI-Prompt-To-Prompt": {
|
||||||
"stars": 18,
|
"stars": 18,
|
||||||
@ -119,16 +127,24 @@
|
|||||||
"stars": 2,
|
"stars": 2,
|
||||||
"last_update": "2024-02-22 08:34:44"
|
"last_update": "2024-02-22 08:34:44"
|
||||||
},
|
},
|
||||||
|
"https://github.com/Scorpinaus/ComfyUI-DiffusersLoader": {
|
||||||
|
"stars": 2,
|
||||||
|
"last_update": "2024-06-06 01:36:46"
|
||||||
|
},
|
||||||
"https://github.com/SeedV/ComfyUI-SeedV-Nodes": {
|
"https://github.com/SeedV/ComfyUI-SeedV-Nodes": {
|
||||||
"stars": 1,
|
"stars": 1,
|
||||||
"last_update": "2024-05-21 06:39:00"
|
"last_update": "2024-06-05 10:01:47"
|
||||||
|
},
|
||||||
|
"https://github.com/StartHua/Comfyui_CXH_CRM": {
|
||||||
|
"stars": 16,
|
||||||
|
"last_update": "2024-06-06 14:15:14"
|
||||||
},
|
},
|
||||||
"https://github.com/TSFSean/ComfyUI-TSFNodes": {
|
"https://github.com/TSFSean/ComfyUI-TSFNodes": {
|
||||||
"stars": 3,
|
"stars": 3,
|
||||||
"last_update": "2024-05-18 00:59:06"
|
"last_update": "2024-05-18 00:59:06"
|
||||||
},
|
},
|
||||||
"https://github.com/TemryL/ComfyUI-IDM-VTON": {
|
"https://github.com/TemryL/ComfyUI-IDM-VTON": {
|
||||||
"stars": 138,
|
"stars": 162,
|
||||||
"last_update": "2024-05-30 12:21:57"
|
"last_update": "2024-05-30 12:21:57"
|
||||||
},
|
},
|
||||||
"https://github.com/Video3DGenResearch/comfyui-batch-input-node": {
|
"https://github.com/Video3DGenResearch/comfyui-batch-input-node": {
|
||||||
@ -144,15 +160,15 @@
|
|||||||
"last_update": "2024-04-16 21:53:02"
|
"last_update": "2024-04-16 21:53:02"
|
||||||
},
|
},
|
||||||
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-AnyText": {
|
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-AnyText": {
|
||||||
"stars": 41,
|
"stars": 42,
|
||||||
"last_update": "2024-05-22 14:30:05"
|
"last_update": "2024-05-22 14:30:05"
|
||||||
},
|
},
|
||||||
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-PuLID-ZHO": {
|
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-PuLID-ZHO": {
|
||||||
"stars": 175,
|
"stars": 180,
|
||||||
"last_update": "2024-05-22 13:38:23"
|
"last_update": "2024-05-22 13:38:23"
|
||||||
},
|
},
|
||||||
"https://github.com/alt-key-project/comfyui-dream-video-batches": {
|
"https://github.com/alt-key-project/comfyui-dream-video-batches": {
|
||||||
"stars": 48,
|
"stars": 49,
|
||||||
"last_update": "2024-05-22 20:52:05"
|
"last_update": "2024-05-22 20:52:05"
|
||||||
},
|
},
|
||||||
"https://github.com/beyastard/ComfyUI_BeySoft": {
|
"https://github.com/beyastard/ComfyUI_BeySoft": {
|
||||||
@ -165,7 +181,7 @@
|
|||||||
},
|
},
|
||||||
"https://github.com/blepping/comfyui_overly_complicated_sampling": {
|
"https://github.com/blepping/comfyui_overly_complicated_sampling": {
|
||||||
"stars": 5,
|
"stars": 5,
|
||||||
"last_update": "2024-05-31 20:01:41"
|
"last_update": "2024-06-01 20:54:03"
|
||||||
},
|
},
|
||||||
"https://github.com/blib-la/ComfyUI-Captain-Extensions": {
|
"https://github.com/blib-la/ComfyUI-Captain-Extensions": {
|
||||||
"stars": 0,
|
"stars": 0,
|
||||||
@ -175,16 +191,20 @@
|
|||||||
"stars": 3,
|
"stars": 3,
|
||||||
"last_update": "2024-04-20 15:36:03"
|
"last_update": "2024-04-20 15:36:03"
|
||||||
},
|
},
|
||||||
|
"https://github.com/bruce007lee/comfyui-tiny-utils": {
|
||||||
|
"stars": 0,
|
||||||
|
"last_update": "2024-06-05 10:38:57"
|
||||||
|
},
|
||||||
"https://github.com/brycegoh/comfyui-custom-nodes": {
|
"https://github.com/brycegoh/comfyui-custom-nodes": {
|
||||||
"stars": 0,
|
"stars": 0,
|
||||||
"last_update": "2024-06-01 04:34:06"
|
"last_update": "2024-06-05 09:30:06"
|
||||||
},
|
},
|
||||||
"https://github.com/chaojie/ComfyUI-DynamiCrafter": {
|
"https://github.com/chaojie/ComfyUI-DynamiCrafter": {
|
||||||
"stars": 102,
|
"stars": 105,
|
||||||
"last_update": "2024-03-16 19:08:28"
|
"last_update": "2024-03-16 19:08:28"
|
||||||
},
|
},
|
||||||
"https://github.com/chaojie/ComfyUI-mobvoi-openapi": {
|
"https://github.com/chaojie/ComfyUI-mobvoi-openapi": {
|
||||||
"stars": 0,
|
"stars": 1,
|
||||||
"last_update": "2024-05-29 09:02:52"
|
"last_update": "2024-05-29 09:02:52"
|
||||||
},
|
},
|
||||||
"https://github.com/christian-byrne/infinite-zoom-parallax-nodes": {
|
"https://github.com/christian-byrne/infinite-zoom-parallax-nodes": {
|
||||||
@ -192,15 +212,23 @@
|
|||||||
"last_update": "2024-05-27 01:51:24"
|
"last_update": "2024-05-27 01:51:24"
|
||||||
},
|
},
|
||||||
"https://github.com/christian-byrne/python-interpreter-node": {
|
"https://github.com/christian-byrne/python-interpreter-node": {
|
||||||
"stars": 16,
|
"stars": 18,
|
||||||
"last_update": "2024-06-01 06:00:47"
|
"last_update": "2024-06-01 06:00:47"
|
||||||
},
|
},
|
||||||
"https://github.com/comfyanonymous/ComfyUI": {
|
"https://github.com/comfyanonymous/ComfyUI": {
|
||||||
"stars": 36385,
|
"stars": 36931,
|
||||||
"last_update": "2024-06-01 04:09:34"
|
"last_update": "2024-06-06 03:31:08"
|
||||||
|
},
|
||||||
|
"https://github.com/comfypod/ComfyUI-Comflow": {
|
||||||
|
"stars": 0,
|
||||||
|
"last_update": "2024-06-03 15:12:25"
|
||||||
|
},
|
||||||
|
"https://github.com/corbin-hayden13/ComfyUI-Better-Dimensions": {
|
||||||
|
"stars": 0,
|
||||||
|
"last_update": "2024-06-06 14:25:31"
|
||||||
},
|
},
|
||||||
"https://github.com/cubiq/Comfy_Dungeon": {
|
"https://github.com/cubiq/Comfy_Dungeon": {
|
||||||
"stars": 162,
|
"stars": 164,
|
||||||
"last_update": "2024-04-26 11:00:58"
|
"last_update": "2024-04-26 11:00:58"
|
||||||
},
|
},
|
||||||
"https://github.com/dezi-ai/ComfyUI-AnimateLCM": {
|
"https://github.com/dezi-ai/ComfyUI-AnimateLCM": {
|
||||||
@ -220,13 +248,17 @@
|
|||||||
"last_update": "2024-01-06 19:07:45"
|
"last_update": "2024-01-06 19:07:45"
|
||||||
},
|
},
|
||||||
"https://github.com/eigenpunk/ComfyUI-audio": {
|
"https://github.com/eigenpunk/ComfyUI-audio": {
|
||||||
"stars": 56,
|
"stars": 58,
|
||||||
"last_update": "2024-03-03 21:14:14"
|
"last_update": "2024-03-03 21:14:14"
|
||||||
},
|
},
|
||||||
"https://github.com/ejektaflex/ComfyUI-Ty": {
|
"https://github.com/ejektaflex/ComfyUI-Ty": {
|
||||||
"stars": 0,
|
"stars": 0,
|
||||||
"last_update": "2024-05-15 21:34:21"
|
"last_update": "2024-05-15 21:34:21"
|
||||||
},
|
},
|
||||||
|
"https://github.com/endman100/ComfyUI-SaveAndLoadPromptCondition": {
|
||||||
|
"stars": 0,
|
||||||
|
"last_update": "2024-06-06 06:07:49"
|
||||||
|
},
|
||||||
"https://github.com/ericbeyer/guidance_interval": {
|
"https://github.com/ericbeyer/guidance_interval": {
|
||||||
"stars": 2,
|
"stars": 2,
|
||||||
"last_update": "2024-04-16 03:24:01"
|
"last_update": "2024-04-16 03:24:01"
|
||||||
@ -237,7 +269,7 @@
|
|||||||
},
|
},
|
||||||
"https://github.com/flyingdogsoftware/gyre_for_comfyui": {
|
"https://github.com/flyingdogsoftware/gyre_for_comfyui": {
|
||||||
"stars": 0,
|
"stars": 0,
|
||||||
"last_update": "2024-05-31 22:27:12"
|
"last_update": "2024-06-03 21:04:43"
|
||||||
},
|
},
|
||||||
"https://github.com/foglerek/comfyui-cem-tools": {
|
"https://github.com/foglerek/comfyui-cem-tools": {
|
||||||
"stars": 1,
|
"stars": 1,
|
||||||
@ -245,11 +277,11 @@
|
|||||||
},
|
},
|
||||||
"https://github.com/gameltb/ComfyUI_paper_playground": {
|
"https://github.com/gameltb/ComfyUI_paper_playground": {
|
||||||
"stars": 8,
|
"stars": 8,
|
||||||
"last_update": "2024-05-28 13:18:26"
|
"last_update": "2024-06-05 07:13:23"
|
||||||
},
|
},
|
||||||
"https://github.com/gameltb/ComfyUI_stable_fast": {
|
"https://github.com/gameltb/ComfyUI_stable_fast": {
|
||||||
"stars": 181,
|
"stars": 182,
|
||||||
"last_update": "2024-04-01 13:30:57"
|
"last_update": "2024-06-06 12:43:16"
|
||||||
},
|
},
|
||||||
"https://github.com/gameltb/io_comfyui": {
|
"https://github.com/gameltb/io_comfyui": {
|
||||||
"stars": 3,
|
"stars": 3,
|
||||||
@ -267,6 +299,14 @@
|
|||||||
"stars": 4,
|
"stars": 4,
|
||||||
"last_update": "2024-03-11 06:40:54"
|
"last_update": "2024-03-11 06:40:54"
|
||||||
},
|
},
|
||||||
|
"https://github.com/huchenlei/ComfyUI_densediffusion": {
|
||||||
|
"stars": 22,
|
||||||
|
"last_update": "2024-06-06 03:11:23"
|
||||||
|
},
|
||||||
|
"https://github.com/huchenlei/ComfyUI_omost": {
|
||||||
|
"stars": 187,
|
||||||
|
"last_update": "2024-06-05 18:48:11"
|
||||||
|
},
|
||||||
"https://github.com/huizhang0110/ComfyUI_Easy_Nodes_hui": {
|
"https://github.com/huizhang0110/ComfyUI_Easy_Nodes_hui": {
|
||||||
"stars": 2,
|
"stars": 2,
|
||||||
"last_update": "2024-02-27 08:22:49"
|
"last_update": "2024-02-27 08:22:49"
|
||||||
@ -281,14 +321,22 @@
|
|||||||
},
|
},
|
||||||
"https://github.com/immersiveexperience/ie-comfyui-color-nodes": {
|
"https://github.com/immersiveexperience/ie-comfyui-color-nodes": {
|
||||||
"stars": 0,
|
"stars": 0,
|
||||||
"last_update": "2024-05-27 09:42:17"
|
"last_update": "2024-06-06 14:27:54"
|
||||||
|
},
|
||||||
|
"https://github.com/jh-leon-kim/ComfyUI-JHK-utils": {
|
||||||
|
"stars": 0,
|
||||||
|
"last_update": "2024-06-04 08:57:52"
|
||||||
|
},
|
||||||
|
"https://github.com/jimmm-ai/TimeUi-a-ComfyUi-Timeline-Node": {
|
||||||
|
"stars": 164,
|
||||||
|
"last_update": "2024-06-05 07:55:40"
|
||||||
},
|
},
|
||||||
"https://github.com/jn-jairo/jn_node_suite_comfyui": {
|
"https://github.com/jn-jairo/jn_node_suite_comfyui": {
|
||||||
"stars": 5,
|
"stars": 5,
|
||||||
"last_update": "2024-01-11 20:39:36"
|
"last_update": "2024-06-02 01:11:02"
|
||||||
},
|
},
|
||||||
"https://github.com/jtscmw01/ComfyUI-DiffBIR": {
|
"https://github.com/jtscmw01/ComfyUI-DiffBIR": {
|
||||||
"stars": 52,
|
"stars": 55,
|
||||||
"last_update": "2024-05-21 05:28:34"
|
"last_update": "2024-05-21 05:28:34"
|
||||||
},
|
},
|
||||||
"https://github.com/kadirnar/ComfyUI-Adapter": {
|
"https://github.com/kadirnar/ComfyUI-Adapter": {
|
||||||
@ -303,8 +351,12 @@
|
|||||||
"stars": 0,
|
"stars": 0,
|
||||||
"last_update": "2024-02-05 14:49:45"
|
"last_update": "2024-02-05 14:49:45"
|
||||||
},
|
},
|
||||||
|
"https://github.com/kijai/ComfyUI-CV-VAE": {
|
||||||
|
"stars": 8,
|
||||||
|
"last_update": "2024-06-03 21:46:49"
|
||||||
|
},
|
||||||
"https://github.com/kijai/ComfyUI-DeepSeek-VL": {
|
"https://github.com/kijai/ComfyUI-DeepSeek-VL": {
|
||||||
"stars": 20,
|
"stars": 19,
|
||||||
"last_update": "2024-05-21 16:43:40"
|
"last_update": "2024-05-21 16:43:40"
|
||||||
},
|
},
|
||||||
"https://github.com/laksjdjf/ssd-1b-comfyui": {
|
"https://github.com/laksjdjf/ssd-1b-comfyui": {
|
||||||
@ -320,15 +372,19 @@
|
|||||||
"last_update": "2024-05-07 08:40:56"
|
"last_update": "2024-05-07 08:40:56"
|
||||||
},
|
},
|
||||||
"https://github.com/ltdrdata/ComfyUI-Workflow-Component": {
|
"https://github.com/ltdrdata/ComfyUI-Workflow-Component": {
|
||||||
"stars": 189,
|
"stars": 190,
|
||||||
"last_update": "2024-04-26 01:39:09"
|
"last_update": "2024-04-26 01:39:09"
|
||||||
},
|
},
|
||||||
"https://github.com/marcueberall/ComfyUI-BuildPath": {
|
"https://github.com/marcueberall/ComfyUI-BuildPath": {
|
||||||
"stars": 0,
|
"stars": 0,
|
||||||
"last_update": "2024-02-06 07:57:33"
|
"last_update": "2024-02-06 07:57:33"
|
||||||
},
|
},
|
||||||
|
"https://github.com/marduk191/comfyui-marnodes": {
|
||||||
|
"stars": 0,
|
||||||
|
"last_update": "2024-06-05 05:37:57"
|
||||||
|
},
|
||||||
"https://github.com/mut-ex/comfyui-gligengui-node": {
|
"https://github.com/mut-ex/comfyui-gligengui-node": {
|
||||||
"stars": 27,
|
"stars": 28,
|
||||||
"last_update": "2024-02-28 02:46:05"
|
"last_update": "2024-02-28 02:46:05"
|
||||||
},
|
},
|
||||||
"https://github.com/nat-chan/comfyui-eval": {
|
"https://github.com/nat-chan/comfyui-eval": {
|
||||||
@ -355,9 +411,13 @@
|
|||||||
"stars": 13,
|
"stars": 13,
|
||||||
"last_update": "2024-05-03 10:52:29"
|
"last_update": "2024-05-03 10:52:29"
|
||||||
},
|
},
|
||||||
|
"https://github.com/pamparamm/ComfyUI-ppm": {
|
||||||
|
"stars": 1,
|
||||||
|
"last_update": "2024-06-02 14:18:07"
|
||||||
|
},
|
||||||
"https://github.com/phineas-pta/comfy-trt-test": {
|
"https://github.com/phineas-pta/comfy-trt-test": {
|
||||||
"stars": 83,
|
"stars": 83,
|
||||||
"last_update": "2024-03-10 21:17:56"
|
"last_update": "2024-06-04 21:09:17"
|
||||||
},
|
},
|
||||||
"https://github.com/poisenbery/NudeNet-Detector-Provider": {
|
"https://github.com/poisenbery/NudeNet-Detector-Provider": {
|
||||||
"stars": 1,
|
"stars": 1,
|
||||||
@ -372,7 +432,7 @@
|
|||||||
"last_update": "2023-11-15 22:00:49"
|
"last_update": "2023-11-15 22:00:49"
|
||||||
},
|
},
|
||||||
"https://github.com/runtime44/comfyui_r44_nodes": {
|
"https://github.com/runtime44/comfyui_r44_nodes": {
|
||||||
"stars": 21,
|
"stars": 22,
|
||||||
"last_update": "2024-05-23 01:18:22"
|
"last_update": "2024-05-23 01:18:22"
|
||||||
},
|
},
|
||||||
"https://github.com/sangeet/comfyui-testui": {
|
"https://github.com/sangeet/comfyui-testui": {
|
||||||
@ -380,7 +440,7 @@
|
|||||||
"last_update": "2024-05-15 00:55:17"
|
"last_update": "2024-05-15 00:55:17"
|
||||||
},
|
},
|
||||||
"https://github.com/sdfxai/SDFXBridgeForComfyUI": {
|
"https://github.com/sdfxai/SDFXBridgeForComfyUI": {
|
||||||
"stars": 2,
|
"stars": 3,
|
||||||
"last_update": "2024-04-12 14:09:45"
|
"last_update": "2024-04-12 14:09:45"
|
||||||
},
|
},
|
||||||
"https://github.com/shadowcz007/ComfyUI-PuLID-Test": {
|
"https://github.com/shadowcz007/ComfyUI-PuLID-Test": {
|
||||||
@ -404,7 +464,7 @@
|
|||||||
"last_update": "2024-04-27 13:25:08"
|
"last_update": "2024-04-27 13:25:08"
|
||||||
},
|
},
|
||||||
"https://github.com/sofakid/dandy": {
|
"https://github.com/sofakid/dandy": {
|
||||||
"stars": 25,
|
"stars": 27,
|
||||||
"last_update": "2024-05-27 21:46:18"
|
"last_update": "2024-05-27 21:46:18"
|
||||||
},
|
},
|
||||||
"https://github.com/stavsap/ComfyUI-React-SDK": {
|
"https://github.com/stavsap/ComfyUI-React-SDK": {
|
||||||
@ -432,13 +492,17 @@
|
|||||||
"last_update": "2024-03-05 13:31:31"
|
"last_update": "2024-03-05 13:31:31"
|
||||||
},
|
},
|
||||||
"https://github.com/tracerstar/comfyui-p5js-node": {
|
"https://github.com/tracerstar/comfyui-p5js-node": {
|
||||||
"stars": 15,
|
"stars": 23,
|
||||||
"last_update": "2024-05-30 18:33:55"
|
"last_update": "2024-05-30 18:33:55"
|
||||||
},
|
},
|
||||||
"https://github.com/tuckerdarby/ComfyUI-TDNodes": {
|
"https://github.com/tuckerdarby/ComfyUI-TDNodes": {
|
||||||
"stars": 3,
|
"stars": 3,
|
||||||
"last_update": "2024-02-19 17:00:55"
|
"last_update": "2024-02-19 17:00:55"
|
||||||
},
|
},
|
||||||
|
"https://github.com/udi0510/comfyui-slicer": {
|
||||||
|
"stars": 0,
|
||||||
|
"last_update": "2024-06-04 08:30:38"
|
||||||
|
},
|
||||||
"https://github.com/umisetokikaze/comfyui_mergekit": {
|
"https://github.com/umisetokikaze/comfyui_mergekit": {
|
||||||
"stars": 0,
|
"stars": 0,
|
||||||
"last_update": "2024-04-28 07:21:00"
|
"last_update": "2024-04-28 07:21:00"
|
||||||
@ -454,5 +518,9 @@
|
|||||||
"https://github.com/wormley/comfyui-wormley-nodes": {
|
"https://github.com/wormley/comfyui-wormley-nodes": {
|
||||||
"stars": 0,
|
"stars": 0,
|
||||||
"last_update": "2023-11-12 19:05:11"
|
"last_update": "2023-11-12 19:05:11"
|
||||||
|
},
|
||||||
|
"https://github.com/zmwv823/ComfyUI-AnyText": {
|
||||||
|
"stars": 11,
|
||||||
|
"last_update": "2024-06-06 14:21:08"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -10,6 +10,38 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
"author": "MackinationsAi",
|
||||||
|
"title": "ComfyUi_Stuctured-Outputs [REMOVED]",
|
||||||
|
"id": "struct-output",
|
||||||
|
"reference": "https://github.com/MackinationsAi/ComfyUi_Stuctured-Outputs",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/MackinationsAi/ComfyUi_Stuctured-Outputs"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This repository contains a custom node for ComfyUI that allows users to save generative image outputs with custom filenames and folder structures. The filenames are padded to four digits, and the positive and negative prompts are embedded in the image metadata."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "laksjdjf",
|
||||||
|
"title": "attention-couple-ComfyUI [DEPRECATED]",
|
||||||
|
"id": "attention-couple",
|
||||||
|
"reference": "https://github.com/laksjdjf/attention-couple-ComfyUI",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/laksjdjf/attention-couple-ComfyUI"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:Attention couple. This is a custom node that manipulates region-specific prompts. While vanilla ComfyUI employs an area specification method based on latent couples, this node divides regions using attention layers within UNet.\nNOTE: This has been integrated with cgem156-ComfyUI."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "phineas-pta",
|
||||||
|
"title": "comfy-trt-test [DEPRECATED]",
|
||||||
|
"reference": "https://github.com/phineas-pta/comfy-trt-test",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/phineas-pta/comfy-trt-test"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Test project for ComfyUI TensorRT Support.\nNOT WORKING YET.\nnot automatic yet, do not use ComfyUI-Manager to install !!!.\nnot beginner-friendly yet, still intended to technical users\nNOTE: The reason for registration in the Manager is for guidance, and for detailed installation instructions, please visit the repository.\nNOTE: Use 'TensorRT Node for ComfyUI' instead of this."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "dezi-ai",
|
"author": "dezi-ai",
|
||||||
"title": "ComfyUI Animate LCM [NOT MAINTAINED]",
|
"title": "ComfyUI Animate LCM [NOT MAINTAINED]",
|
||||||
|
|||||||
@ -11,6 +11,480 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
"author": "ljleb",
|
||||||
|
"title": "Mecha Merge Node Pack",
|
||||||
|
"id": "mecha",
|
||||||
|
"reference": "https://github.com/ljleb/comfy-mecha",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/ljleb/comfy-mecha"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Model merging node pack with a focus on low memory footprint."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Michael Standen",
|
||||||
|
"title": "Ollama Prompt Encode",
|
||||||
|
"id": "ollamapromptencode",
|
||||||
|
"reference": "https://github.com/ScreamingHawk/comfyui-ollama-prompt-encode",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/ScreamingHawk/comfyui-ollama-prompt-encode"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A prompt generator and CLIP encoder using AI provided by Ollama."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "smthemex",
|
||||||
|
"title": "ComfyUI_Pops",
|
||||||
|
"id": "pops",
|
||||||
|
"reference": "https://github.com/smthemex/ComfyUI_Pops",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/smthemex/ComfyUI_Pops"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "You can use [a/Popspaper](https://popspaper.github.io/pOps/) method in comfyUI"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Late Night Labs",
|
||||||
|
"title": "LNL Frame Selector",
|
||||||
|
"id": "lnlframeselector",
|
||||||
|
"reference": "https://github.com/latenightlabs/ComfyUI-LNL",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/latenightlabs/ComfyUI-LNL"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Frame Selector & Sequence Selection Node for ComfyUI."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "shobhitic",
|
||||||
|
"title": "PlusMinusTextClip - Single node for Positive and Negative Prompts",
|
||||||
|
"id": "plusminustextclip",
|
||||||
|
"reference": "https://github.com/shobhitic/ComfyUI-PlusMinusTextClip",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/shobhitic/ComfyUI-PlusMinusTextClip"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This adds a node that has both the positive and negative prompts as input in one node. You can just add one node and be done with both Positive and Negative prompts, in place of adding two different nodes for them."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "huchenlei",
|
||||||
|
"title": "ComfyUI_omost",
|
||||||
|
"id": "omost",
|
||||||
|
"reference": "https://github.com/huchenlei/ComfyUI_omost",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/huchenlei/ComfyUI_omost"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI implementation of [a/Omost](https://github.com/lllyasviel/Omost), and everything about regional prompt.\nNOTE: You need to install ComfyUI_densediffusion to use this node."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "huchenlei",
|
||||||
|
"title": "ComfyUI DenseDiffusion",
|
||||||
|
"id": "densediffusion",
|
||||||
|
"reference": "https://github.com/huchenlei/ComfyUI_densediffusion",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/huchenlei/ComfyUI_densediffusion"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "[a/DenseDiffusion](https://github.com/naver-ai/DenseDiffusion) custom node for ComfyUI."
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"author": "ZHO-ZHO-ZHO",
|
||||||
|
"title": "ComfyUI-Qwen-2",
|
||||||
|
"id": "qwen-2",
|
||||||
|
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-2",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-2"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Using Qwen-2 in ComfyUI"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "BenNarum",
|
||||||
|
"title": "SigmaWaveFormNodes",
|
||||||
|
"id": "sigmawaveform",
|
||||||
|
"reference": "https://github.com/BenNarum/SigmaWaveFormNode",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/BenNarum/SigmaWaveFormNode"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A set of tools for generating and altering sigmas in ComfyUI."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "alessandrozonta",
|
||||||
|
"title": "OpenPose Node",
|
||||||
|
"id": "openpose-alessandrozonta",
|
||||||
|
"reference": "https://github.com/alessandrozonta/ComfyUI-OpenPose",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/alessandrozonta/ComfyUI-OpenPose"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This extension contains a custom node for ComfyUI. The node, called 'Bounding Box Crop', is designed to compute the top-left coordinates of a cropped bounding box based on input coordinates and dimensions of the final cropped image. It does so computing the center of the cropping area and then computing where the top-left coordinates would be."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "GavChap",
|
||||||
|
"title": "ComfyUI-SD3LatentSelectRes",
|
||||||
|
"id": "sd3latent-select-res",
|
||||||
|
"reference": "https://github.com/GavChap/ComfyUI-SD3LatentSelectRes",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/GavChap/ComfyUI-SD3LatentSelectRes"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "You'll get a new node called SD3 Latent Select Resolution, you can pick the x and y sizes from a list."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Jin Liu",
|
||||||
|
"title": "ComfyUI-LJNodes",
|
||||||
|
"id": "ComfyUI-LJNodes",
|
||||||
|
"reference": "https://github.com/coolzilj/ComfyUI-LJNodes",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/coolzilj/ComfyUI-LJNodes"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A variety of custom nodes to enhance ComfyUI for a buttery smooth experience."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "marduk191",
|
||||||
|
"title": "marduk191 workflow settings",
|
||||||
|
"id": "marnodes",
|
||||||
|
"reference": "https://github.com/marduk191/comfyui-marnodes",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/marduk191/comfyui-marnodes"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A node to set workflow settings."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "denfrost",
|
||||||
|
"title": "Den_ComfyUI_Workflows",
|
||||||
|
"id": "den",
|
||||||
|
"reference": "https://github.com/denfrost/Den_ComfyUI_Workflow",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/denfrost/Den_ComfyUI_Workflow"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Custom nodes make easy Advanced Workflows. Focus on Image/Video and ControlNet efficiency and performances. Manipulation of Latent Space, Automatic pipeline with a bit efforts."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "seghier",
|
||||||
|
"title": "ComfyUI_LibreTranslate",
|
||||||
|
"reference": "https://github.com/seghier/ComfyUI_LibreTranslate",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/seghier/ComfyUI_LibreTranslate/raw/main/translate_node.py"
|
||||||
|
],
|
||||||
|
"install_type": "copy",
|
||||||
|
"description": "Use LibreTranslation in ComfyUI [a/https://github.com/LibreTranslate/LibreTranslate](https://github.com/LibreTranslate/LibreTranslate)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Limbicnation",
|
||||||
|
"title": "ComfyUIDepthEstimation",
|
||||||
|
"reference": "https://github.com/Limbicnation/ComfyUIDepthEstimation",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Limbicnation/ComfyUIDepthEstimation/raw/main/depth_estimation_node.py"
|
||||||
|
],
|
||||||
|
"pip": ["transformers"],
|
||||||
|
"install_type": "copy",
|
||||||
|
"description": "A custom depth estimation node for ComfyUI using transformer models. It integrates depth estimation with automatic gamma correction, contrast adjustment, and edge detection, based on the [a/TransformDepth](https://github.com/Limbicnation/TransformDepth) repository."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "shadowcz007",
|
||||||
|
"title": "comfyui-sound-lab",
|
||||||
|
"id": "soundlab",
|
||||||
|
"reference": "https://github.com/shadowcz007/comfyui-sound-lab",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/shadowcz007/comfyui-sound-lab"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:Music Gen, Audio Play, Stable Audio"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "DannyStone1999",
|
||||||
|
"title": "ComfyUI-Depth2Mask",
|
||||||
|
"reference": "https://github.com/DannyStone1999/ComfyUI-Depth2Mask",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/DannyStone1999/ComfyUI-Depth2Mask/raw/main/Depth2Mask.py"
|
||||||
|
],
|
||||||
|
"install_type": "copy",
|
||||||
|
"description": "Nodes:Depth2Mask"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "smthemex",
|
||||||
|
"title": "ComfyUI_StableAudio_Open",
|
||||||
|
"id": "stable-audio-open-1.0",
|
||||||
|
"reference": "https://github.com/smthemex/ComfyUI_StableAudio_Open",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/smthemex/ComfyUI_StableAudio_Open"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "You can use stable-audio-open-1.0 in comfyUI"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "nuanarchy",
|
||||||
|
"title": "ComfyUI-NuA-FlashFace",
|
||||||
|
"id": "nua-flashface",
|
||||||
|
"reference": "https://github.com/nuanarchy/ComfyUI-NuA-FlashFace",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/nuanarchy/ComfyUI-NuA-FlashFace"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI implementation of [a/FlashFace: Human Image Personalization with High-fidelity Identity Preservation](https://github.com/ali-vilab/FlashFace)\nNOTE: You need to downalod models manually."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "FrankChieng",
|
||||||
|
"title": "ComfyUI_llm_easyanimiate",
|
||||||
|
"id": "llm-easyanimate",
|
||||||
|
"nodename_pattern": "^FrankChiengEasyAnimate",
|
||||||
|
"reference": "https://github.com/frankchieng/ComfyUI_llm_easyanimiate",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/frankchieng/ComfyUI_llm_easyanimiate"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "implementation easyanimate with llama3-8b-6bit instruction LLM generation prompt help"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "chakib-belgaid",
|
||||||
|
"title": "ComfyUI-autosize",
|
||||||
|
"id": "autosize",
|
||||||
|
"reference": "https://github.com/chakib-belgaid/ComfyUI-autosize",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/chakib-belgaid/ComfyUI-autosize"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A ComfyUI utility plugin designed to optimize the latent space for generating high-quality results. It approximates the closest size model for better generation results."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "DataCTE",
|
||||||
|
"title": "Prompt Injection Node for ComfyUI",
|
||||||
|
"id": "prompt-injection",
|
||||||
|
"reference": "https://github.com/DataCTE/prompt_injection",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/DataCTE/prompt_injection"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This custom node for ComfyUI allows you to inject specific prompts at specific blocks of the Stable Diffusion UNet, providing fine-grained control over the generated image. It is based on the concept that the content/subject understanding of the model is primarily contained within the MID0 and MID1 blocks, as demonstrated in the B-Lora (Content Style implicit separation) paper. Features.\nInject different prompts into specific UNet blocks Three different node variations for flexible workflow integration Customize the learning rate of specific blocks to focus on content, lighting, style, or other aspects Potential for developing a 'Mix of Experts' approach by swapping blocks on-the-fly based on prompt content"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "lks-ai",
|
||||||
|
"title": "ComfyUI Stable Audio Open 1.0 Sampler",
|
||||||
|
"id": "stableaudiosampler",
|
||||||
|
"reference": "https://github.com/lks-ai/ComfyUI-StableAudioSampler",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/lks-ai/ComfyUI-StableAudioSampler"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes: StableAudioSampler. Wraps the new Stable Audio Open Model in the sampler that dropped Jun 5th. See Github for Features"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "luandev",
|
||||||
|
"title": "ComfyUI CrewAI",
|
||||||
|
"id": "crewai",
|
||||||
|
"reference": "https://github.com/luandev/ComfyUI-CrewAI",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/luandev/ComfyUI-CrewAI"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI-CrewAI aims to integrate Crew AI's multi-agent collaboration framework into the ComfyUI environment. By combining the strengths of Crew AI's role-based, collaborative AI agent system with ComfyUI's intuitive interface, we will create a robust platform for managing and executing complex AI tasks seamlessly"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Tool Of North america",
|
||||||
|
"title": "Easy automatic (square) image cropper using Yolo",
|
||||||
|
"id": "tooldigital",
|
||||||
|
"reference": "https://github.com/tooldigital/ComfyUI-Yolo-Cropper",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/tooldigital/ComfyUI-Yolo-Cropper"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A very simple and easy to use node to automaticaaly create (square) image crops and masks using YoloV8. This can be very useful when using controlnet and ip adapters"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "11dogzi",
|
||||||
|
"title": "Comfyui-ergouzi-samplers",
|
||||||
|
"id": "ergouzi-samplers",
|
||||||
|
"reference": "https://github.com/11dogzi/Comfyui-ergouzi-samplers",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/11dogzi/Comfyui-ergouzi-samplers"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Partial redraw sampler and variant seed sampler"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "prodogape",
|
||||||
|
"title": "ComfyUI-OmDet",
|
||||||
|
"id": "omdet",
|
||||||
|
"reference": "https://github.com/prodogape/ComfyUI-OmDet",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/prodogape/ComfyUI-OmDet"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"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": "risunobushi",
|
||||||
|
"title": "comfyUI_FrequencySeparation_RGB-HSV",
|
||||||
|
"id": "freq-sep",
|
||||||
|
"reference": "https://github.com/risunobushi/comfyUI_FrequencySeparation_RGB-HSV",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/risunobushi/comfyUI_FrequencySeparation_RGB-HSV"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A collection of simple nodes for Frequency Separation / Frequency Recombine with RGB and HSV methods"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "chandlergis",
|
||||||
|
"title": "ComfyUI_EmojiOverlay",
|
||||||
|
"id": "emoji-overlay",
|
||||||
|
"reference": "https://github.com/chandlergis/ComfyUI_EmojiOverlay",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/chandlergis/ComfyUI_EmojiOverlay"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:Image Emoji Overlay"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "JayLyu",
|
||||||
|
"title": "ComfyUI_BaiKong_Node",
|
||||||
|
"id": "baikong",
|
||||||
|
"reference": "https://github.com/JayLyu/ComfyUI_BaiKong_Node",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/JayLyu/ComfyUI_BaiKong_Node"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:BK Img To Color, BK Color Selector"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "zohac",
|
||||||
|
"title": "ComfyUI_ZC_DrawShape",
|
||||||
|
"id": "drawshape",
|
||||||
|
"reference": "https://github.com/zohac/ComfyUI_ZC_DrawShape",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/zohac/ComfyUI_ZC_DrawShape"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:ZC DrawShape Node"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "ThereforeGames",
|
||||||
|
"title": "ComfyUI-Unprompted",
|
||||||
|
"id": "unprompted",
|
||||||
|
"reference": "https://github.com/ThereforeGames/ComfyUI-Unprompted",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/ThereforeGames/ComfyUI-Unprompted"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This is a ComfyUI node that processes your input text with the [a/Unprompted templating language](https://github.com/ThereforeGames/unprompted). Early alpha release.\n"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Scorpinaus",
|
||||||
|
"title": "Loaders for Diffusers-format checkpoints",
|
||||||
|
"id": "diffusersloader",
|
||||||
|
"reference": "https://github.com/Scorpinaus/ComfyUI-DiffusersLoader",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Scorpinaus/ComfyUI-DiffusersLoader"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This node pack allows loading of CLIP, MODEL, VAE aspects for both SD1.5 and SDXL checkpoints that is converted to diffusers format."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "chakib-belgaid",
|
||||||
|
"title": "ComfyUI Style Plugin",
|
||||||
|
"id": "style-plugin",
|
||||||
|
"reference": "https://github.com/chakib-belgaid/Comfyui_Prompt_styler",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/chakib-belgaid/Comfyui_Prompt_styler"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This is a simple plugin for ComfyUI that allows you to import A1111 CSV styles into ComfyUI prompts."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "tiankuan93",
|
||||||
|
"title": "V-Express: Conditional Dropout for Progressive Training of Portrait Video Generation",
|
||||||
|
"id": "v-express",
|
||||||
|
"reference": "https://github.com/tiankuan93/ComfyUI-V-Express",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/tiankuan93/ComfyUI-V-Express"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "[Original] In the field of portrait video generation, the use of single images to generate portrait videos has become increasingly prevalent. A common approach involves leveraging generative models to enhance adapters for controlled generation. However, control signals can vary in strength, including text, audio, image reference, pose, depth map, etc. Among these, weaker conditions often struggle to be effective due to interference from stronger conditions, posing a challenge in balancing these conditions. In our work on portrait video generation, we identified audio signals as particularly weak, often overshadowed by stronger signals such as pose and original image. However, direct training with weak signals often leads to difficulties in convergence. To address this, we propose V-Express, a simple method that balances different control signals through a series of progressive drop operations. Our method gradually enables effective control by weak conditions, thereby achieving generation capabilities that simultaneously take into account pose, input image, and audio.\nNOTE: You need to downdload [a/model_ckpts](https://huggingface.co/tk93/V-Express/tree/main) manually."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "CMonk",
|
||||||
|
"title": "Stable Projectorz Bridge",
|
||||||
|
"id": "projectorz",
|
||||||
|
"reference": "https://github.com/tianlang0704/ComfyUI-StableProjectorzBridge",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/tianlang0704/ComfyUI-StableProjectorzBridge"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This custom nodes enables Stable Projectorz to work with ComfyUI Directly."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "comfyanonymous",
|
||||||
|
"title": "TensorRT Node for ComfyUI",
|
||||||
|
"id": "tensorrt",
|
||||||
|
"reference": "https://github.com/comfyanonymous/ComfyUI_TensorRT",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/comfyanonymous/ComfyUI_TensorRT"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This node enables the best performance on NVIDIA RTX™ Graphics Cards (GPUs) for Stable Diffusion by leveraging NVIDIA TensorRT."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "fexploit",
|
||||||
|
"title": "ComfyUI-Classifier",
|
||||||
|
"id": "classifier",
|
||||||
|
"reference": "https://github.com/fexploit/ComfyUI-Classifier",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/fexploit/ComfyUI-Classifier"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI-Classifier is a custom node for ComfyUI that uses a zero-shot classification model to classify text inputs based on a set of candidate labels. This node leverages the power of Hugging Face Transformers to provide accurate and flexible text classification."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "humgate",
|
||||||
|
"title": "simplecomfy",
|
||||||
|
"reference": "https://github.com/humgate/simplecomfy",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/humgate/simplecomfy"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Simple JS application based on ComfyUI which takes prompt and style picture from user and runs hardcoded workflow inference returning generated image to user."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "hben35096",
|
||||||
|
"title": "ComfyUI-ToolBox",
|
||||||
|
"id": "hben-toolbox",
|
||||||
|
"reference": "https://github.com/hben35096/ComfyUI-ToolBox",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/hben35096/ComfyUI-ToolBox"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:commonly_node."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "vanche1212",
|
||||||
|
"title": "ZMG PLUGIN",
|
||||||
|
"id": "zmg",
|
||||||
|
"reference": "https://github.com/vanche1212/ComfyUI-ZMG-Nodes",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/vanche1212/ComfyUI-ZMG-Nodes"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes:ApiRequestNode, LoadVideoNode, JsonParserNode, OllamaRequestNode, OldPhotoColorizationNode."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "daxcay",
|
||||||
|
"title": "ComfyUI-NODEJS",
|
||||||
|
"reference": "https://github.com/daxcay/ComfyUI-NODEJS",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/daxcay/ComfyUI-NODEJS"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This node allows the execution of Node.js application within ComfyUI by leveraging the ComfyUI-NODEJS, which starts alongside ComfyUI and facilitates the installation of Node.js. The integration enables Python subprocesses to execute Node.js scripts."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "Smirnov75",
|
"author": "Smirnov75",
|
||||||
"title": "ComfyUI-mxToolkit",
|
"title": "ComfyUI-mxToolkit",
|
||||||
@ -242,500 +716,6 @@
|
|||||||
],
|
],
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Nodes:Private ImageCPostprocessor"
|
"description": "Nodes:Private ImageCPostprocessor"
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "SozeInc",
|
|
||||||
"title": "ComfyUI-Mobile",
|
|
||||||
"id": "comfyui-mobile",
|
|
||||||
"reference": "https://github.com/SozeInc/ComfyUI-Mobile",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/SozeInc/ComfyUI-Mobile"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Nodes: Ultimate Concat (Mobile), Send Notification (Mobile), Settings Launcher (Mobile), Settings Launcher Outputs (Mobile)"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "AIFSH",
|
|
||||||
"title": "ComfyUI_V-Express",
|
|
||||||
"id": "v-express",
|
|
||||||
"reference": "https://github.com/AIFSH/ComfyUI_V-Express",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/AIFSH/ComfyUI_V-Express"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "the comfyui custom node of [a/V-Express](https://github.com/tencent-ailab/V-Express) to make audio driven videos!"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "AonekoSS",
|
|
||||||
"title": "ComfyUI-LoRA-Tuner",
|
|
||||||
"id": "lora-tuner",
|
|
||||||
"reference": "https://github.com/AonekoSS/ComfyUI-LoRA-Tuner",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/AonekoSS/ComfyUI-LoRA-Tuner"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Nodes: LoRA-Tuner. For using multiple LoRA easily."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "nirex0",
|
|
||||||
"title": "ComfyUI_pytorch_openpose",
|
|
||||||
"id": "pytorch-openpose",
|
|
||||||
"reference": "https://github.com/nirex0/ComfyUI_pytorch_openpose",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/nirex0/ComfyUI_pytorch_openpose"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "All Credits go to the original Repo: [a/Hzzone/pytorch-openpose](https://github.com/Hzzone/pytorch-openpose)."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "Mason-McGough",
|
|
||||||
"title": "Mosaica",
|
|
||||||
"id": "mosaica",
|
|
||||||
"reference": "https://github.com/Mason-McGough/ComfyUI-Mosaica",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/Mason-McGough/ComfyUI-Mosaica"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Create colorful mosaic images in ComfyUI by computing label images and applying lookup tables."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "moyi7712",
|
|
||||||
"title": "ComfyUI_Seamless_Patten",
|
|
||||||
"id": "seamless-pattern",
|
|
||||||
"reference": "https://github.com/moyi7712/ComfyUI_Seamless_Patten",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/moyi7712/ComfyUI_Seamless_Patten"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "It make any text2image create seamless patten"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "discus0434",
|
|
||||||
"title": "ComfyUI Aesthetic Predictor V2.5",
|
|
||||||
"id": "caching-embeddings",
|
|
||||||
"reference": "https://github.com/discus0434/comfyui-aesthetic-predictor-v2-5",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/discus0434/comfyui-aesthetic-predictor-v2-5"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Simple ComfyUI node that predicts the score of an aesthetic image with SigLIP-based predictor."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "Ron-Digital",
|
|
||||||
"title": "ComfyUI-SceneGenerator",
|
|
||||||
"id": "scenegenerator",
|
|
||||||
"reference": "https://github.com/Ron-Digital/ComfyUI-SceneGenerator",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/Ron-Digital/ComfyUI-SceneGenerator"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "ComfyUI-SceneGenerator is a ComfyUI plugin used to generate scene preview photos from JSON files. This plugin creates scenes based on the provided JSON configuration and produces two different image outputs: one containing only the products and the other containing both the products and the props."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "spacepxl",
|
|
||||||
"title": "ComfyUI-StyleGan",
|
|
||||||
"id": "stylegan",
|
|
||||||
"reference": "https://github.com/spacepxl/ComfyUI-StyleGan",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/spacepxl/ComfyUI-StyleGan"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Basic support for StyleGAN2 and StyleGAN3 models."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "Mason-McGough",
|
|
||||||
"title": "🎨 ComfyUI-Mosaica",
|
|
||||||
"id": "mosaica",
|
|
||||||
"reference": "https://github.com/Mason-McGough/ComfyUI-Mosaica",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/Mason-McGough/ComfyUI-Mosaica"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Create colorful mosaic images in ComfyUI by computing label images and applying lookup tables."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "larsupb",
|
|
||||||
"title": "LoRA Power-Merger ComfyUI",
|
|
||||||
"id": "lora-powermerger",
|
|
||||||
"reference": "https://github.com/larsupb/LoRA-Merger-ComfyUI",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/larsupb/LoRA-Merger-ComfyUI"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "An extension for merging LoRAs. Offers a wide range of LoRA merge techniques (including dare) and XY plots. XY plots require efficiency nodes."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "alessandrozonta",
|
|
||||||
"title": "Save Layers Node for ComfyUI",
|
|
||||||
"id": "layers",
|
|
||||||
"reference": "https://github.com/alessandrozonta/ComfyUI-Layers",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/alessandrozonta/ComfyUI-Layers"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "This custom node for ComfyUI allows you to create layers of an image based on input masks and save them into a PSD file."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "githubYiheng",
|
|
||||||
"title": "comfyui_meanshift_filter",
|
|
||||||
"id": "meanshift-filter",
|
|
||||||
"reference": "https://github.com/githubYiheng/comfyui_meanshift_filter",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/githubYiheng/comfyui_meanshift_filter"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Nodes:Apply Meanshift Filter"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "cuongloveit",
|
|
||||||
"title": "comfy_http_request",
|
|
||||||
"reference": "https://github.com/cuongloveit/comfy_http_request",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/cuongloveit/comfy_http_request"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Nodes:Send Http Request. You can use this node to save full size images through the websocket."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "SayanoAI",
|
|
||||||
"title": "Comfy-RVC",
|
|
||||||
"id": "rvc",
|
|
||||||
"reference": "https://github.com/SayanoAI/Comfy-RVC",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/SayanoAI/Comfy-RVC"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "ComfyUI custom nodes for RVC related inference and image generation"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "nirbhay-faaya",
|
|
||||||
"title": "ImgProcessing_ComfyUI",
|
|
||||||
"id": "imgprocessing",
|
|
||||||
"reference": "https://github.com/nirbhay-faaya/ImgProcessing_ComfyUI",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/nirbhay-faaya/ImgProcessing_ComfyUI"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Custom Image processing ComfyUI Nodes"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "smthemex",
|
|
||||||
"title": "ComfyUI_StoryDiffusion",
|
|
||||||
"id": "StoryDiffusion",
|
|
||||||
"reference": "https://github.com/smthemex/ComfyUI_StoryDiffusion",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/smthemex/ComfyUI_StoryDiffusion"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "A StoryDiffusion node for ComfyUI."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "christian-byrne",
|
|
||||||
"title": "Node - Size Matcher",
|
|
||||||
"id": "sizematcher",
|
|
||||||
"reference": "https://github.com/christian-byrne/size-match-compositing-nodes",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/christian-byrne/size-match-compositing-nodes"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Takes two images and matches their sizes using various methods, detailed below."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "lks-ai",
|
|
||||||
"title": "ComfyUI AnyNode: Any Node you ask for",
|
|
||||||
"id": "anynode",
|
|
||||||
"reference": "https://github.com/lks-ai/anynode",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/lks-ai/anynode"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Nodes: AnyNode. Nodes that can be anything you ask. Auto-Generate functional nodes using LLMs. Create impossible workflows. API Compatibility: (OpenAI, LocalLLMs, Gemini)."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "Thomas Ward",
|
|
||||||
"title": "TW-CUI-Util",
|
|
||||||
"id": "tw-cui-util",
|
|
||||||
"reference": "https://github.com/TW-CUI/TW-CUI-Util",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/TW-CUI/TW-CUI-Util"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "A collection of custom nodes to help with saving images, providing generation parameters, static literal nodes, and other useful nodes."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "fexploit",
|
|
||||||
"title": "ComfyUI-AutoLabel",
|
|
||||||
"id": "autolabel",
|
|
||||||
"reference": "https://github.com/fexploit/ComfyUI-AutoLabel",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/fexploit/ComfyUI-AutoLabel"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "ComfyUI-AutoLabel is a custom node for ComfyUI that uses BLIP (Bootstrapping Language-Image Pre-training) to generate detailed descriptions of the main object in an image. This node leverages the power of BLIP to provide accurate and context-aware captions for images."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "christian-byrne",
|
|
||||||
"title": "img2colors-comfyui-node",
|
|
||||||
"id": "img2colors-nodes",
|
|
||||||
"reference": "https://github.com/christian-byrne/img2colors-comfyui-node",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/christian-byrne/img2colors-comfyui-node"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Nodes:Img2Color - Color Palette Extractor"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "xuhongming251",
|
|
||||||
"title": "ComfyUI-MuseTalkUtils",
|
|
||||||
"id": "musetalk-utils",
|
|
||||||
"reference": "https://github.com/xuhongming251/ComfyUI-MuseTalkUtils",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/xuhongming251/ComfyUI-MuseTalkUtils"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "MuseTalk ComfyUI Preprocess and Postprocess Nodes"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "xuhongming251",
|
|
||||||
"title": "ComfyUI-GPEN",
|
|
||||||
"id": "gpen",
|
|
||||||
"reference": "https://github.com/xuhongming251/ComfyUI-GPEN",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/xuhongming251/ComfyUI-GPEN"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Nodes:FaceEnhancement. Based on modelscope pipeline."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "exdysa",
|
|
||||||
"title": "comfyui-selector",
|
|
||||||
"reference": "https://github.com/exdysa/comfyui-selector",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/exdysa/comfyui-selector/raw/main/selector.py"
|
|
||||||
],
|
|
||||||
"install_type": "copy",
|
|
||||||
"description": "Nodes:Selector. Quick and dirty parameter generator node for ComfyUI."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "barckley75",
|
|
||||||
"title": "comfyUI_DaVinciResolve",
|
|
||||||
"reference": "https://github.com/barckley75/comfyUI_DaVinciResolve",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/barckley75/comfyUI_DaVinciResolve/raw/main/custom_nodes/node_text_to_speech.py",
|
|
||||||
"https://github.com/barckley75/comfyUI_DaVinciResolve/raw/main/custom_nodes/nodes_phy_3_contitioning.py",
|
|
||||||
"https://github.com/barckley75/comfyUI_DaVinciResolve/raw/main/custom_nodes/save_audio_to_davinci.py",
|
|
||||||
"https://github.com/barckley75/comfyUI_DaVinciResolve/raw/main/custom_nodes/save_image_to_davinci.py"
|
|
||||||
],
|
|
||||||
"install_type": "copy",
|
|
||||||
"description": "Nodes:TextToSpeech, phy_3_conditioning, SaveAudioToDaVinci, SaveImageToDaVinci.\nNOTE:In order to use DaVinci node you must have DaVinci Resolve Studio connected to the API. For more information check the help seciton in DaVinci Resolve Studio HELP>DOCUMENTATION>DEVELOPER. It will open a folder, search for scripting and the for README.txt file, the API documentation."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "archifancy",
|
|
||||||
"title": "Image-vector-for-ComfyUI",
|
|
||||||
"reference": "https://github.com/archifancy/Image-vector-for-ComfyUI",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/archifancy/Image-vector-for-ComfyUI/raw/main/AIvector.py"
|
|
||||||
],
|
|
||||||
"install_type": "copy",
|
|
||||||
"description": "Nodes:AIvector. A wrapped comfyui node for converting pixels to vectors using Vtracer. Check it out here: [a/https://github.com/visioncortex/vtracer](https://github.com/visioncortex/vtracer)."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "muzi12888",
|
|
||||||
"title": "m9-prompts-comfyui",
|
|
||||||
"id": "m9-prompts",
|
|
||||||
"reference": "https://github.com/MarcusNyne/m9-prompts-comfyui",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/MarcusNyne/m9-prompts-comfyui"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Two custom nodes are included for modifying a prompt to create prompt variations.\nScramblePrompts [m9]: Reorder prompts, remove prompts, modify weights\nTweakWeights [m9]: Modify the weights of prompts matching keywords"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "SaltAI",
|
|
||||||
"title": "SaltAI Language Toolkit",
|
|
||||||
"id": "saltai-langtool",
|
|
||||||
"reference": "https://github.com/get-salt-AI/SaltAI_Language_Toolkit",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/get-salt-AI/SaltAI_Language_Toolkit"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "The project integrates the Retrieval Augmented Generation (RAG) tool [a/Llama-Index](https://www.llamaindex.ai/), [a/Microsoft's AutoGen](https://microsoft.github.io/autogen/), and [a/LlaVA-Next](https://github.com/LLaVA-VL/LLaVA-NeXT) with ComfyUI's adaptable node interface, enhancing the functionality and user experience of the platform."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "muzi12888",
|
|
||||||
"title": "PoseKeypoint Mask",
|
|
||||||
"id": "posekeypoint-mask",
|
|
||||||
"reference": "https://github.com/muzi12888/ComfyUI-PoseKeypoint-Mask",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/muzi12888/ComfyUI-PoseKeypoint-Mask"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Convert PoseKeypoint to mask, please refer to the example workflow for usage instructions."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "if-ai",
|
|
||||||
"title": "ComfyUI-IF_AI_HFDownloaderNode",
|
|
||||||
"id": "if-ai-hfdownloader",
|
|
||||||
"reference": "https://github.com/if-ai/ComfyUI-IF_AI_HFDownloaderNode",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/if-ai/ComfyUI-IF_AI_HFDownloaderNode"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Talking avatars Heads for the IF_AI tools integrates dreamtalk in ComfyUI"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "iFREEGROUP",
|
|
||||||
"title": "comfyui-undistort",
|
|
||||||
"id": "undistort",
|
|
||||||
"reference": "https://github.com/iFREEGROUP/comfyui-undistort",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/iFREEGROUP/comfyui-undistort"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Node:Load Checkerboard Images for Calibrate Camera, Matrix and distortion coefficient to text, Undistort"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "Auttasak-L",
|
|
||||||
"title": "ComfyUI-ImageCropper",
|
|
||||||
"id": "imagecropper",
|
|
||||||
"reference": "https://github.com/Auttasak-L/ComfyUI-ImageCropper",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/Auttasak-L/ComfyUI-ImageCropper"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Nodes:Image cropping tool"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "AIFSH",
|
|
||||||
"title": "ComfyUI-Live2DViewer",
|
|
||||||
"reference": "https://github.com/AIFSH/ComfyUI-Live2DViewer",
|
|
||||||
"id": "live2dviewer",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/AIFSH/ComfyUI-Live2DViewer"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "a comfyui node for viewing Live2D model"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "daniabib",
|
|
||||||
"title": "ComfyUI ProPainter Nodes",
|
|
||||||
"id": "propainter",
|
|
||||||
"reference": "https://github.com/daniabib/ComfyUI_ProPainter_Nodes",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/daniabib/ComfyUI_ProPainter_Nodes"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "ComfyUI custom node implementation of [a/ProPainter](https://github.com/sczhou/ProPainter) framework for video inpainting."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "fexploit",
|
|
||||||
"title": "ComfyUI-AutoTrimBG",
|
|
||||||
"id": "autotrimbg",
|
|
||||||
"reference": "https://github.com/fexploit/ComfyUI-AutoTrimBG",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/fexploit/ComfyUI-AutoTrimBG"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "ComfyUI-AutoCropBgTrim is a powerful tool designed to automatically clean up the background of your images. This tool trims unnecessary spaces and pixels, leaving only the main subject of the image. It generates both a mask and an image output, making it easy to focus on the essential elements. Perfect for enhancing your photos and preparing them for professional use."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "StartHua",
|
|
||||||
"title": "ComfyUI_PCDMs",
|
|
||||||
"id": "pcdms",
|
|
||||||
"reference": "https://github.com/StartHua/ComfyUI_PCDMs",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/StartHua/ComfyUI_PCDMs"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Original project: [a/link](https://github.com/tencent-ailab/PCDMs)\nBased on testing, the author's original images work very well, but using my own images generally requires some luck!"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "linshier",
|
|
||||||
"title": "comfyui-remote-tools",
|
|
||||||
"id": "remote-tools",
|
|
||||||
"reference": "https://github.com/linshier/comfyui-remote-tools",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/linshier/comfyui-remote-tools"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Node:SendBase64ToRemote. To connect to another ComfyUI server."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "Fantaxico",
|
|
||||||
"title": "ComfyUI-GCP-Storage",
|
|
||||||
"id": "gcp-storage",
|
|
||||||
"reference": "https://github.com/Fantaxico/ComfyUI-GCP-Storage",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/Fantaxico/ComfyUI-GCP-Storage"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Node:GCP Storage Node. Support google-cloud-storage."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "storyicon",
|
|
||||||
"title": "ComfyUI MuseV Evolved",
|
|
||||||
"id": "musev-evolved",
|
|
||||||
"reference": "https://github.com/storyicon/comfyui_musev_evolved",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/storyicon/comfyui_musev_evolved"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Nodes:MuseVImg2Vid (comfyui_musev_evolved)\nNOTE: Download [a/MuseV](https://huggingface.co/TMElyralab/MuseV) to ComfyUI/models/diffusers"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "smthemex",
|
|
||||||
"title": "ComfyUI_CustomNet",
|
|
||||||
"id": "customnet",
|
|
||||||
"reference": "https://github.com/smthemex/ComfyUI_CustomNet",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/smthemex/ComfyUI_CustomNet"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "This node allows you to use customnet."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "githubYiheng",
|
|
||||||
"title": "comfyui_median_filter",
|
|
||||||
"id": "median-filter",
|
|
||||||
"reference": "https://github.com/githubYiheng/comfyui_median_filter",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/githubYiheng/comfyui_median_filter"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Nodes:Apply Median Filter"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "githubYiheng",
|
|
||||||
"title": "ComfyUI_Change_IMAGE_BOREDER",
|
|
||||||
"id": "change-image-border",
|
|
||||||
"reference": "https://github.com/githubYiheng/ComfyUI_Change_IMAGE_BOREDER",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/githubYiheng/ComfyUI_Change_IMAGE_BOREDER"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Nodes:Change Image Border"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "ai-liam",
|
|
||||||
"title": "LiamUtil",
|
|
||||||
"id": "liam-util",
|
|
||||||
"reference": "https://github.com/ai-liam/comfyui-liam",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/ai-liam/comfyui-liam"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Nodes: LiamLibLoadImage, LiamLibImageToGray, LiamLibSaveImg, LiamLibFillImage, PreviewReliefImage, GetBetterDepthImage, LiamLibSaveText"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "Isaac Emesowum",
|
|
||||||
"title": "Isaac's Nodes",
|
|
||||||
"id": "isaac",
|
|
||||||
"reference": "https://github.com/iemesowum/ComfyUI_IsaacNodes",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/iemesowum/ComfyUI_IsaacNodes"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "This extension offers automatic drums extraction from audio files, as well as a few helper nodes to support my audio synchronization AnimateDiff workflows."
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,107 @@
|
|||||||
{
|
{
|
||||||
"models": [
|
"models": [
|
||||||
|
{
|
||||||
|
"name": "CN-anytest_v4-marged.safetensors",
|
||||||
|
"type": "controlnet",
|
||||||
|
"base": "SDXL",
|
||||||
|
"save_path": "controlnet/SDXL",
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "CN-anytest_v4-marged_am_dim256.safetensors (dim256/Animagine)",
|
||||||
|
"type": "controlnet",
|
||||||
|
"base": "SDXL",
|
||||||
|
"save_path": "controlnet/SDXL",
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "CN-anytest_v4-marged_am_dim128.safetensors (dim128/Animagine)",
|
||||||
|
"type": "controlnet",
|
||||||
|
"base": "SDXL",
|
||||||
|
"save_path": "controlnet/SDXL",
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "CN-anytest_v4-marged_pn_dim256.safetensors (dim256/Pony)",
|
||||||
|
"type": "controlnet",
|
||||||
|
"base": "SDXL",
|
||||||
|
"save_path": "controlnet/SDXL",
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "CN-anytest_v4-marged_pn_dim128.safetensors (dim128/Pony)",
|
||||||
|
"type": "controlnet",
|
||||||
|
"base": "SDXL",
|
||||||
|
"save_path": "controlnet/SDXL",
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "CN-anytest_v3-50000_fp16.safetensors (fp16)",
|
||||||
|
"type": "controlnet",
|
||||||
|
"base": "SDXL",
|
||||||
|
"save_path": "controlnet/SDXL",
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "CN-anytest_v3-50000_am_dim256.safetensors (dim256/Animagine)",
|
||||||
|
"type": "controlnet",
|
||||||
|
"base": "SDXL",
|
||||||
|
"save_path": "controlnet/SDXL",
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "CN-anytest_v3-50000_am_dim128.safetensors (dim128/Animagine)",
|
||||||
|
"type": "controlnet",
|
||||||
|
"base": "SDXL",
|
||||||
|
"save_path": "controlnet/SDXL",
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "CN-anytest_v3-50000_pn_dim256.safetensors (dim256/Pony)",
|
||||||
|
"type": "controlnet",
|
||||||
|
"base": "SDXL",
|
||||||
|
"save_path": "controlnet/SDXL",
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "CN-anytest_v3-50000_pn_dim128.safetensors (dim128/Pony)",
|
||||||
|
"type": "controlnet",
|
||||||
|
"base": "SDXL",
|
||||||
|
"save_path": "controlnet/SDXL",
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"name": "Kijai/ToonCrafter model checkpoint (interpolation fp16)",
|
"name": "Kijai/ToonCrafter model checkpoint (interpolation fp16)",
|
||||||
"type": "checkpoint",
|
"type": "checkpoint",
|
||||||
@ -52,7 +154,7 @@
|
|||||||
"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"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "xinsir/CControlnet-Scribble-Sdxl-1.0-Anime",
|
"name": "xinsir/Controlnet-Scribble-Sdxl-1.0-Anime",
|
||||||
"type": "controlnet",
|
"type": "controlnet",
|
||||||
"base": "SDXL",
|
"base": "SDXL",
|
||||||
"save_path": "controlnet/SDXL/controlnet-scribble-sdxl-1.0-anime",
|
"save_path": "controlnet/SDXL/controlnet-scribble-sdxl-1.0-anime",
|
||||||
|
|||||||
@ -9,13 +9,14 @@ import locale
|
|||||||
import platform
|
import platform
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
|
||||||
glob_path = os.path.join(os.path.dirname(__file__), "glob")
|
glob_path = os.path.join(os.path.dirname(__file__), "glob")
|
||||||
sys.path.append(glob_path)
|
sys.path.append(glob_path)
|
||||||
|
|
||||||
|
import security_check
|
||||||
from manager_util import *
|
from manager_util import *
|
||||||
import cm_global
|
import cm_global
|
||||||
|
|
||||||
|
security_check.security_check()
|
||||||
|
|
||||||
cm_global.pip_downgrade_blacklist = ['torch', 'torchsde', 'torchvision', 'transformers', 'safetensors', 'kornia']
|
cm_global.pip_downgrade_blacklist = ['torch', 'torchsde', 'torchvision', 'transformers', 'safetensors', 'kornia']
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "comfyui-manager"
|
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."
|
description = "ComfyUI-Manager provides features to install and manage custom nodes for ComfyUI, as well as various functionalities to assist with ComfyUI."
|
||||||
version = "2.36"
|
version = "2.38"
|
||||||
license = "LICENSE"
|
license = "LICENSE"
|
||||||
dependencies = ["GitPython", "PyGithub", "matrix-client==0.4.0", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions"]
|
dependencies = ["GitPython", "PyGithub", "matrix-client==0.4.0", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions"]
|
||||||
|
|
||||||
|
|||||||
14
scanner.py
@ -293,12 +293,16 @@ def update_custom_nodes():
|
|||||||
if len(path_parts) >= 2 and domain == "github.com":
|
if len(path_parts) >= 2 and domain == "github.com":
|
||||||
owner_repo = "/".join(path_parts[-2:])
|
owner_repo = "/".join(path_parts[-2:])
|
||||||
repo = g.get_repo(owner_repo)
|
repo = g.get_repo(owner_repo)
|
||||||
|
owner = repo.owner
|
||||||
|
now = datetime.datetime.now(datetime.timezone.utc)
|
||||||
|
author_time_diff = now - owner.created_at
|
||||||
|
|
||||||
last_update = repo.pushed_at.strftime("%Y-%m-%d %H:%M:%S") if repo.pushed_at else 'N/A'
|
last_update = repo.pushed_at.strftime("%Y-%m-%d %H:%M:%S") if repo.pushed_at else 'N/A'
|
||||||
item = {
|
item = {
|
||||||
"stars": repo.stargazers_count,
|
"stars": repo.stargazers_count,
|
||||||
"last_update": last_update,
|
"last_update": last_update,
|
||||||
"cached_time": datetime.datetime.now().timestamp(),
|
"cached_time": now.timestamp(),
|
||||||
|
"author_account_age_days": author_time_diff.days,
|
||||||
}
|
}
|
||||||
return url, item
|
return url, item
|
||||||
else:
|
else:
|
||||||
@ -453,7 +457,13 @@ def gen_json(node_info):
|
|||||||
git_url, title, preemptions, node_pattern = node_info[extension]
|
git_url, title, preemptions, node_pattern = node_info[extension]
|
||||||
|
|
||||||
with open(node_list_json_path, 'r', encoding='utf-8') as f:
|
with open(node_list_json_path, 'r', encoding='utf-8') as f:
|
||||||
node_list_json = json.load(f)
|
try:
|
||||||
|
node_list_json = json.load(f)
|
||||||
|
except Exception as e:
|
||||||
|
print(f"\nERROR: Invalid json format '{node_list_json_path}'")
|
||||||
|
print("------------------------------------------------------")
|
||||||
|
print(e)
|
||||||
|
print("------------------------------------------------------")
|
||||||
|
|
||||||
metadata_in_url = {}
|
metadata_in_url = {}
|
||||||
if git_url not in data:
|
if git_url not in data:
|
||||||
|
|||||||