mirror of
https://github.com/Comfy-Org/ComfyUI-Manager.git
synced 2026-05-14 02:47:24 +08:00
Compare commits
5 Commits
8b2541fe0f
...
c37a0e8acb
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c37a0e8acb | ||
|
|
7a8fc44f90 | ||
|
|
2757728935 | ||
|
|
bb46126fbd | ||
|
|
af1c698117 |
@ -3404,6 +3404,16 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI nodes for SCAIL input processing"
|
||||
},
|
||||
{
|
||||
"author": "kijai",
|
||||
"title": "ComfyUI-NativeLooping_testing",
|
||||
"reference": "https://github.com/kijai/ComfyUI-NativeLooping_testing",
|
||||
"files": [
|
||||
"https://github.com/kijai/ComfyUI-NativeLooping_testing"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Temporary repository for testing candidate for native ComfyUI loop nodes. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "hhhzzyang",
|
||||
"title": "Comfyui-Lama",
|
||||
@ -28925,56 +28935,6 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "Text translation node for ComfyUI: No need to apply for a translation API key, just use it. Currently supports more than thirty translation platforms."
|
||||
},
|
||||
{
|
||||
"author": "Charonartist",
|
||||
"title": "ComfyUI Auto LoRA",
|
||||
"reference": "https://github.com/Charonartist/comfyui-auto-lora-v2",
|
||||
"files": [
|
||||
"https://github.com/Charonartist/comfyui-auto-lora-v2"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This is a ComfyUI custom node that automatically detects trigger words from text prompts and applies the corresponding LoRA models."
|
||||
},
|
||||
{
|
||||
"author": "Charonartist",
|
||||
"title": "ComfyUI Smart Resize Node",
|
||||
"reference": "https://github.com/Charonartist/comfyui-smart-resize-node",
|
||||
"files": [
|
||||
"https://github.com/Charonartist/comfyui-smart-resize-node"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Smart resize node for ComfyUI that handles portrait/landscape images with short/long side specification"
|
||||
},
|
||||
{
|
||||
"author": "Charonartist",
|
||||
"title": "ComfyUI Tag Remover",
|
||||
"reference": "https://github.com/Charonartist/comfyui-tag-remover",
|
||||
"files": [
|
||||
"https://github.com/Charonartist/comfyui-tag-remover"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI custom node for removing specified tags and their content from text"
|
||||
},
|
||||
{
|
||||
"author": "Charonartist",
|
||||
"title": "comfyui-last-frame-extractor",
|
||||
"reference": "https://github.com/Charonartist/comfyui-last-frame-extractor",
|
||||
"files": [
|
||||
"https://github.com/Charonartist/comfyui-last-frame-extractor"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This is a ComfyUI custom node that extracts the last frame (image) from an input image batch. It is particularly useful when you want to obtain the final scene or frame in a video generation workflow."
|
||||
},
|
||||
{
|
||||
"author": "Charonartist",
|
||||
"title": "comfyui-lmstudio-conversation",
|
||||
"reference": "https://github.com/Charonartist/comfyui-lmstudio-conversation",
|
||||
"files": [
|
||||
"https://github.com/Charonartist/comfyui-lmstudio-conversation"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI custom nodes for LM Studio integration with conversation history support "
|
||||
},
|
||||
{
|
||||
"author": "ptmaster",
|
||||
"title": "ComfyUI-Load-Diffusion-Model-to-Muti-GPUs",
|
||||
@ -30035,6 +29995,16 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "A ComfyUI custom node pack implementing Diff-Aid-inspired inference-time text-conditioning patches for Flux and SDXL models."
|
||||
},
|
||||
{
|
||||
"author": "xmarre",
|
||||
"title": "ComfyUI-TIDE",
|
||||
"reference": "https://github.com/xmarre/ComfyUI-TIDE",
|
||||
"files": [
|
||||
"https://github.com/xmarre/ComfyUI-TIDE"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A ComfyUI custom node implementing TIDE (Text-Informed Dynamic Extrapolation with Step-Aware Temperature Control) for diffusion models."
|
||||
},
|
||||
{
|
||||
"author": "Pigidiy",
|
||||
"title": "ComfyUI-LikeSpiderAI-UI",
|
||||
@ -30830,16 +30800,6 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI custom nodes for Telegram bot integration"
|
||||
},
|
||||
{
|
||||
"author": "leonardomiramondi",
|
||||
"title": "Flux Context ComfyUI Node",
|
||||
"reference": "https://github.com/leonardomiramondi/flux-context-comfyui",
|
||||
"files": [
|
||||
"https://github.com/leonardomiramondi/flux-context-comfyui"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI node for Flux Context (Kontext) image editing"
|
||||
},
|
||||
{
|
||||
"author": "kpsss34",
|
||||
"title": "ComfyUI kpsss34 Custom Node",
|
||||
@ -33771,6 +33731,16 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "This project is a custom node for ComfyUI that integrates the power of the Google Gemini 2.5 Flash Image (“Nano Banana”) API. It provides a single versatile node, the Gemini Nano Banana, which allows you to perform image generation and editing operations directly within your workflows."
|
||||
},
|
||||
{
|
||||
"author": "orion4d",
|
||||
"title": "Orion4D_AutoCachedPreview",
|
||||
"reference": "https://github.com/orion4d/Orion4D_AutoCachedPreview",
|
||||
"files": [
|
||||
"https://github.com/orion4d/Orion4D_AutoCachedPreview"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A custom node for ComfyUI that allows you to cache an image and its mask to avoid recalculating upstream steps in your workflow."
|
||||
},
|
||||
{
|
||||
"author": "Fabio Sarracino",
|
||||
"title": "VibeVoice ComfyUI",
|
||||
@ -37295,6 +37265,16 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "Geekatplay Studio tiled generative upscale helpers for ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "GeekatplayStudio",
|
||||
"title": "ComfyUI-cluster",
|
||||
"reference": "https://github.com/GeekatplayStudio/ComfyUI-cluster",
|
||||
"files": [
|
||||
"https://github.com/GeekatplayStudio/ComfyUI-cluster"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Ollama-driven routing nodes and curated workflows for ComfyUI with checkpoint, LoRA, and Flux split-component flows plus image-guided variants using vision analysis."
|
||||
},
|
||||
{
|
||||
"author": "wouterverweirder",
|
||||
"title": "ComfyUI PenPlotter",
|
||||
@ -39210,16 +39190,6 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "Custom ComfyUI node supporting wildcard text processing from files with YAML tags, randomization, latent ratio selection and preset aspect ratios."
|
||||
},
|
||||
{
|
||||
"author": "bpmpnaito",
|
||||
"title": "comfyui-imageviewer",
|
||||
"reference": "https://github.com/bpmpnaito/comfyui-imageviewer",
|
||||
"files": [
|
||||
"https://github.com/bpmpnaito/comfyui-imageviewer"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Image viewer node that displays preview of images directly in the node."
|
||||
},
|
||||
{
|
||||
"author": "ChangeTheConstants",
|
||||
"title": "SeedVarianceEnhancer",
|
||||
@ -45229,6 +45199,16 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "A visual pill-based prompt composer node for ComfyUI. Features 4 prompt panels (Quality, Main, Aesthetic, Negative), tag browser, drag-to-reorder pills, weight control, presets, Lucky prompt generator, manual override mode, and wildcard (.yaml) file loader."
|
||||
},
|
||||
{
|
||||
"author": "cowneko",
|
||||
"title": "CWK_Checkpoints_Preset_Manager",
|
||||
"reference": "https://github.com/cowneko/CWK_Checkpoints_Preset_Manager",
|
||||
"files": [
|
||||
"https://github.com/cowneko/CWK_Checkpoints_Preset_Manager"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI node combining per-model preset system with full-featured model manager, CivitAI integration, and GGUF support for browsing and organizing checkpoints."
|
||||
},
|
||||
{
|
||||
"author": "dogodg3838",
|
||||
"title": "ComfyUI-NvEye",
|
||||
@ -45351,6 +45331,26 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI Qwen 3.5 Prompting nodes (captionate image, improve prompt, etc)"
|
||||
},
|
||||
{
|
||||
"author": "artemko7v",
|
||||
"title": "ComfyUI Prompt Enhance Nodes",
|
||||
"reference": "https://github.com/ArtemKo7v/ComfyUI-Prompt-Magic",
|
||||
"files": [
|
||||
"https://github.com/ArtemKo7v/ComfyUI-Prompt-Magic"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI prompt enhance nodes and string utilities"
|
||||
},
|
||||
{
|
||||
"author": "artemko7v",
|
||||
"title": "ComfyUI Complex Prompt Nodes",
|
||||
"reference": "https://github.com/ArtemKo7v/ComfyUI-Complex-Prompt",
|
||||
"files": [
|
||||
"https://github.com/ArtemKo7v/ComfyUI-Complex-Prompt"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI node for working with complex prompts with support for variables, randomness, and basic logic."
|
||||
},
|
||||
{
|
||||
"author": "TakkunRed",
|
||||
"title": "comfyui_checkpoint_preset_manager",
|
||||
@ -45485,6 +45485,16 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "A floating preview window node for ComfyUI. Ideal for multi-monitor setups."
|
||||
},
|
||||
{
|
||||
"author": "nekodificador",
|
||||
"title": "NKD Klein Tools",
|
||||
"reference": "https://github.com/Nekodificador/ComfyUI-NKD-Klein-Tools",
|
||||
"files": [
|
||||
"https://github.com/Nekodificador/ComfyUI-NKD-Klein-Tools"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "NKD Klein Presampling and Postsampling nodes for Flux Klein workflows in ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "IMGLAB-net",
|
||||
"title": "IMGLAB_ComfyUI",
|
||||
@ -46228,6 +46238,156 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "GPU-powered pro-grade image suite cho retouch chân dung. v0.1.0 alpha: Frequency Separation (N-01) + Sub-Pixel Mask Refiner (N-02). Kornia core, tensor thuần không rời VRAM."
|
||||
},
|
||||
{
|
||||
"author": "xxchinenxx",
|
||||
"title": "Qwen Clothing Selector",
|
||||
"reference": "https://github.com/xxchinenxx/ComfyUI-QwenClothingSelector",
|
||||
"files": [
|
||||
"https://github.com/xxchinenxx/ComfyUI-QwenClothingSelector"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI custom nodes for Qwen-Image-Edit outfit/clothing edits — toggles, presets, and identity-preserving prompt builders. Useful for fashion edits, costume changes, and outfit swaps."
|
||||
},
|
||||
{
|
||||
"author": "xav",
|
||||
"title": "XAV Anima Style Selector",
|
||||
"reference": "https://github.com/XAV-Games/comfyui-xav-anima-style-selector",
|
||||
"files": [
|
||||
"https://github.com/XAV-Games/comfyui-xav-anima-style-selector"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI nodes for quick and easy style selection for the Anima model"
|
||||
},
|
||||
{
|
||||
"author": "wsq194",
|
||||
"title": "Yeban Workflow Manager",
|
||||
"reference": "https://github.com/wsq194/yeban-workflow-manager",
|
||||
"files": [
|
||||
"https://github.com/wsq194/yeban-workflow-manager"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A ComfyUI workflow manager plugin with auto-save, version history, sidebar integration and more."
|
||||
},
|
||||
{
|
||||
"author": "szymonj",
|
||||
"title": "LoRA Range Loader",
|
||||
"reference": "https://github.com/esp-dev/comfyui-lora-range-loader",
|
||||
"files": [
|
||||
"https://github.com/esp-dev/comfyui-lora-range-loader"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI custom node: load a LoRA from current selection and automatically advance current within a first/last filename range."
|
||||
},
|
||||
{
|
||||
"author": "mitch-avis",
|
||||
"title": "ComfyUI-HoldCounter",
|
||||
"reference": "https://github.com/mitch-avis/ComfyUI-HoldCounter",
|
||||
"files": [
|
||||
"https://github.com/mitch-avis/ComfyUI-HoldCounter"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A ComfyUI custom node that emits a held, range-bound integer index with multiple advancement modes (loop, clamp, pingpong, random, shuffle) — useful as a Load Image batch index that advances every N runs."
|
||||
},
|
||||
{
|
||||
"author": "halr9000",
|
||||
"title": "Procgen 9000",
|
||||
"reference": "https://github.com/halr9000/procgen9000",
|
||||
"files": [
|
||||
"https://github.com/halr9000/procgen9000"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Procedural image generation toolkit designed as input to image edit workflows."
|
||||
},
|
||||
{
|
||||
"author": "capacap",
|
||||
"title": "ComfyUI-Selective-Sigma-Detailer",
|
||||
"reference": "https://github.com/Capacap/ComfyUI-Selective-Sigma-Detailer",
|
||||
"files": [
|
||||
"https://github.com/Capacap/ComfyUI-Selective-Sigma-Detailer"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A ComfyUI sampler that boosts detail only in latent regions that are already dense at the moment the schedule activates."
|
||||
},
|
||||
{
|
||||
"author": "brosequist",
|
||||
"title": "comfyui-pipeline-barrier",
|
||||
"reference": "https://github.com/brosequist/ComfyUI-PipelineBarrier",
|
||||
"files": [
|
||||
"https://github.com/brosequist/ComfyUI-PipelineBarrier"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI node that force-flushes GPU caches between pipeline stages to prevent OOM kills"
|
||||
},
|
||||
{
|
||||
"author": "amrnidal999-tech",
|
||||
"title": "Realisim Enhancor",
|
||||
"reference": "https://github.com/amrnidal999-tech/comfyui-realisim-enhancor",
|
||||
"files": [
|
||||
"https://github.com/amrnidal999-tech/comfyui-realisim-enhancor"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A ComfyUI image enhancement node with JPEG degradation, noise, blur, sharpening, contrast, and color controls."
|
||||
},
|
||||
{
|
||||
"author": "rikanrino",
|
||||
"title": "Rikannodes",
|
||||
"reference": "https://github.com/rikanrino/Rikannodes",
|
||||
"files": [
|
||||
"https://github.com/rikanrino/Rikannodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "kijai ComfyUI-PromptRelay with fps and max frame output"
|
||||
},
|
||||
{
|
||||
"author": "mexxmillion",
|
||||
"title": "ComfyUI-VLMPrompt",
|
||||
"reference": "https://github.com/mexxmillion/ComfyUI-VLMPrompt",
|
||||
"files": [
|
||||
"https://github.com/mexxmillion/ComfyUI-VLMPrompt"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI custom nodes for local VLM prompt generation with GGUF and Hugging Face backends."
|
||||
},
|
||||
{
|
||||
"author": "IA-gyz",
|
||||
"title": "comfyui-VarBoard",
|
||||
"reference": "https://github.com/IA-gyz/comfyui-VarBoard",
|
||||
"files": [
|
||||
"https://github.com/IA-gyz/comfyui-VarBoard"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Variables Board is a floating control center for ComfyUI workflows that centralizes parameters into a customizable overlay."
|
||||
},
|
||||
{
|
||||
"author": "hassan-mb",
|
||||
"title": "HB ComfyUI Nodes",
|
||||
"reference": "https://github.com/HassanEclipse/comfyui-hb-party",
|
||||
"files": [
|
||||
"https://github.com/HassanEclipse/comfyui-hb-party"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Utility nodes for ComfyUI featuring a dynamic Text Preset Switch with workflow-safe persistence and Node 2.0 support."
|
||||
},
|
||||
{
|
||||
"author": "Cordux",
|
||||
"title": "ComfyUI-PromptTagBuilder",
|
||||
"reference": "https://github.com/Cordux/ComfyUI-PromptTagBuilder",
|
||||
"files": [
|
||||
"https://github.com/Cordux/ComfyUI-PromptTagBuilder"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Flexible ComfyUI node that simplifies prompt building through organized dropdown categories for tag-based models."
|
||||
},
|
||||
{
|
||||
"author": "alikonfilms",
|
||||
"title": "comfyui-alikonfilms",
|
||||
"reference": "https://github.com/alikonfilms/comfyui_alikonfilms",
|
||||
"files": [
|
||||
"https://github.com/alikonfilms/comfyui_alikonfilms"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A CLIP text encoder with 18 cinematic camera movement presets (dolly, pan, tilt, zoom, orbit and more). Subject-aware and free-camera modes, blend slider to mix your prompt with camera movements, and a live text output to preview the final prompt."
|
||||
},
|
||||
|
||||
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
10555
github-stats.json
10555
github-stats.json
File diff suppressed because it is too large
Load Diff
@ -921,7 +921,7 @@ class UnifiedManager:
|
||||
except:
|
||||
return version.parse("0.0.0")
|
||||
|
||||
def execute_install_script(self, url, repo_path, instant_execution=False, lazy_mode=False, no_deps=False):
|
||||
def execute_install_script(self, url, repo_path, instant_execution=False, lazy_mode=False, no_deps=False, selected_dependencies=None):
|
||||
install_script_path = os.path.join(repo_path, "install.py")
|
||||
requirements_path = os.path.join(repo_path, "requirements.txt")
|
||||
|
||||
@ -933,8 +933,19 @@ class UnifiedManager:
|
||||
if os.path.exists(requirements_path) and not no_deps:
|
||||
print("Install: pip packages")
|
||||
pip_fixer = manager_util.PIPFixer(manager_util.get_installed_packages(), comfy_path, manager_files_path)
|
||||
|
||||
# Create a set of selected dependency lines for quick lookup
|
||||
selected_lines = set()
|
||||
if selected_dependencies:
|
||||
for dep in selected_dependencies:
|
||||
selected_lines.add(dep.get('line', '').strip())
|
||||
|
||||
lines = manager_util.robust_readlines(requirements_path)
|
||||
for line in lines:
|
||||
# Skip if selected_dependencies is provided and this line is not in the selected list
|
||||
if selected_dependencies is not None and line.strip() not in selected_lines:
|
||||
continue
|
||||
|
||||
package_name = remap_pip_package(line.strip())
|
||||
if package_name and not package_name.startswith('#') and package_name not in self.processed_install:
|
||||
self.processed_install.add(package_name)
|
||||
@ -1342,7 +1353,7 @@ class UnifiedManager:
|
||||
|
||||
return result
|
||||
|
||||
def repo_install(self, url: str, repo_path: str, instant_execution=False, no_deps=False, return_postinstall=False):
|
||||
def repo_install(self, url: str, repo_path: str, instant_execution=False, no_deps=False, return_postinstall=False, selected_dependencies=None):
|
||||
result = ManagedResult('install-git')
|
||||
result.append(url)
|
||||
|
||||
@ -1369,7 +1380,7 @@ class UnifiedManager:
|
||||
repo.close()
|
||||
|
||||
def postinstall():
|
||||
return self.execute_install_script(url, repo_path, instant_execution=instant_execution, no_deps=no_deps)
|
||||
return self.execute_install_script(url, repo_path, instant_execution=instant_execution, no_deps=no_deps, selected_dependencies=selected_dependencies)
|
||||
|
||||
if return_postinstall:
|
||||
return result.with_postinstall(postinstall)
|
||||
@ -1468,7 +1479,7 @@ class UnifiedManager:
|
||||
else:
|
||||
return self.cnr_switch_version(node_id, instant_execution=instant_execution, no_deps=no_deps, return_postinstall=return_postinstall).with_ver('cnr')
|
||||
|
||||
async def install_by_id(self, node_id: str, version_spec=None, channel=None, mode=None, instant_execution=False, no_deps=False, return_postinstall=False):
|
||||
async def install_by_id(self, node_id: str, version_spec=None, channel=None, mode=None, instant_execution=False, no_deps=False, return_postinstall=False, selected_dependencies=None):
|
||||
"""
|
||||
priority if version_spec == None
|
||||
1. CNR latest
|
||||
@ -1519,7 +1530,7 @@ class UnifiedManager:
|
||||
self.unified_disable(node_id, False)
|
||||
|
||||
to_path = os.path.abspath(os.path.join(get_default_custom_nodes_path(), node_id))
|
||||
res = self.repo_install(repo_url, to_path, instant_execution=instant_execution, no_deps=no_deps, return_postinstall=return_postinstall)
|
||||
res = self.repo_install(repo_url, to_path, instant_execution=instant_execution, no_deps=no_deps, return_postinstall=return_postinstall, selected_dependencies=selected_dependencies)
|
||||
if res.result:
|
||||
if version_spec == 'unknown':
|
||||
self.unknown_active_nodes[node_id] = repo_url, to_path
|
||||
@ -1968,7 +1979,7 @@ def __win_check_git_pull(path):
|
||||
process.wait()
|
||||
|
||||
|
||||
def execute_install_script(url, repo_path, lazy_mode=False, instant_execution=False, no_deps=False):
|
||||
def execute_install_script(url, repo_path, lazy_mode=False, instant_execution=False, no_deps=False, selected_dependencies=None):
|
||||
# import ipdb; ipdb.set_trace()
|
||||
install_script_path = os.path.join(repo_path, "install.py")
|
||||
requirements_path = os.path.join(repo_path, "requirements.txt")
|
||||
@ -1980,6 +1991,13 @@ def execute_install_script(url, repo_path, lazy_mode=False, instant_execution=Fa
|
||||
if os.path.exists(requirements_path) and not no_deps:
|
||||
print("Install: pip packages")
|
||||
pip_fixer = manager_util.PIPFixer(manager_util.get_installed_packages(), comfy_path, manager_files_path)
|
||||
|
||||
# Create a set of selected dependency lines for quick lookup
|
||||
selected_lines = set()
|
||||
if selected_dependencies:
|
||||
for dep in selected_dependencies:
|
||||
selected_lines.add(dep.get('line', '').strip())
|
||||
|
||||
with open(requirements_path, "r") as requirements_file:
|
||||
for line in requirements_file:
|
||||
#handle comments
|
||||
@ -1990,6 +2008,10 @@ def execute_install_script(url, repo_path, lazy_mode=False, instant_execution=Fa
|
||||
else:
|
||||
line = line.split('#')[0].strip()
|
||||
|
||||
# Skip if selected_dependencies is provided and this line is not in the selected list
|
||||
if selected_dependencies is not None and line.strip() not in selected_lines:
|
||||
continue
|
||||
|
||||
package_name = remap_pip_package(line.strip())
|
||||
|
||||
if package_name and not package_name.startswith('#'):
|
||||
|
||||
@ -494,7 +494,12 @@ async def task_worker():
|
||||
global tasks_in_progress
|
||||
|
||||
async def do_install(item) -> str:
|
||||
ui_id, node_spec_str, channel, mode, skip_post_install = item
|
||||
if len(item) == 6:
|
||||
ui_id, node_spec_str, channel, mode, skip_post_install, selected_dependencies = item
|
||||
else:
|
||||
# Backward compatibility
|
||||
ui_id, node_spec_str, channel, mode, skip_post_install = item
|
||||
selected_dependencies = []
|
||||
|
||||
try:
|
||||
node_spec = core.unified_manager.resolve_node_spec(node_spec_str)
|
||||
@ -503,7 +508,7 @@ async def task_worker():
|
||||
return f"Cannot resolve install target: '{node_spec_str}'"
|
||||
|
||||
node_name, version_spec, is_specified = node_spec
|
||||
res = await core.unified_manager.install_by_id(node_name, version_spec, channel, mode, return_postinstall=skip_post_install)
|
||||
res = await core.unified_manager.install_by_id(node_name, version_spec, channel, mode, return_postinstall=skip_post_install, selected_dependencies=selected_dependencies)
|
||||
# discard post install if skip_post_install mode
|
||||
|
||||
if res.action not in ['skip', 'enable', 'install-git', 'install-cnr', 'switch-cnr']:
|
||||
@ -1388,7 +1393,9 @@ async def install_custom_node(request):
|
||||
logging.error(SECURITY_MESSAGE_GENERAL)
|
||||
return web.Response(status=404, text="A security error has occurred. Please check the terminal logs")
|
||||
|
||||
install_item = json_data.get('ui_id'), node_spec_str, json_data['channel'], json_data['mode'], skip_post_install
|
||||
# Get selected dependencies if provided
|
||||
selected_dependencies = json_data.get('selectedDependencies', [])
|
||||
install_item = json_data.get('ui_id'), node_spec_str, json_data['channel'], json_data['mode'], skip_post_install, selected_dependencies
|
||||
task_queue.put(("install", install_item))
|
||||
|
||||
return web.Response(status=200)
|
||||
@ -1471,6 +1478,272 @@ async def install_custom_node_pip(request):
|
||||
return web.Response(status=200)
|
||||
|
||||
|
||||
@routes.post("/customnode/analyze_dependencies")
|
||||
async def analyze_dependencies(request):
|
||||
"""
|
||||
Analyze dependencies for a custom node from git URL.
|
||||
Fetches requirements.txt, checks installed packages, and returns dependency list with status.
|
||||
"""
|
||||
try:
|
||||
json_data = await request.json()
|
||||
url = json_data.get('url')
|
||||
commit_id = json_data.get('commitId')
|
||||
branch = json_data.get('branch')
|
||||
|
||||
if not url:
|
||||
return web.json_response({'error': 'URL is required'}, status=400)
|
||||
|
||||
# Fetch requirements.txt from git repository
|
||||
requirements_content = await fetch_requirements_from_git(url, commit_id, branch)
|
||||
|
||||
if requirements_content is None:
|
||||
return web.json_response({
|
||||
'success': True,
|
||||
'requirements': None,
|
||||
'dependencies': [],
|
||||
'noRequirementsFile': True
|
||||
})
|
||||
|
||||
# Parse requirements
|
||||
dependencies = parse_requirements(requirements_content)
|
||||
|
||||
# Get installed packages
|
||||
installed_packages = manager_util.get_installed_packages()
|
||||
|
||||
# Analyze each dependency with subdependencies
|
||||
analyzed_dependencies = []
|
||||
for dep_line in dependencies:
|
||||
if not dep_line.strip() or dep_line.strip().startswith('#'):
|
||||
continue
|
||||
|
||||
# Parse dependency line
|
||||
parsed = manager_util.parse_requirement_line(dep_line)
|
||||
if not parsed:
|
||||
continue
|
||||
|
||||
package_name = parsed.get('package')
|
||||
if not package_name:
|
||||
# Fallback: extract from line if package is missing
|
||||
import re
|
||||
match = re.match(r'^([a-zA-Z0-9_.-]+)', dep_line.strip())
|
||||
package_name = match.group(1) if match else "Unknown"
|
||||
|
||||
version_spec = parsed.get('version')
|
||||
# Convert version_spec to string if it's a StrictVersion object
|
||||
if version_spec is not None:
|
||||
version_spec = str(version_spec)
|
||||
|
||||
normalized_name = package_name.lower().replace('-', '_')
|
||||
|
||||
# Check if already installed
|
||||
installed_version = installed_packages.get(normalized_name)
|
||||
|
||||
status = 'new'
|
||||
if installed_version:
|
||||
status = 'installed'
|
||||
|
||||
# Convert version to string if it's not already (handle StrictVersion objects)
|
||||
current_version_str = str(installed_version) if installed_version else None
|
||||
|
||||
# Get subdependencies using pip install --dry-run
|
||||
# This is optional and failures should not block the main flow
|
||||
subdependencies = []
|
||||
# Skip subdependency analysis for already installed packages (not needed)
|
||||
if status != 'installed':
|
||||
try:
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
# Run pip install --dry-run to get subdependencies
|
||||
# Some packages like pymeshlab can take longer due to complex dependency resolution
|
||||
# Use a reasonable timeout - if it times out, we'll continue without subdependencies
|
||||
result = subprocess.run(
|
||||
[sys.executable, '-m', 'pip', 'install', '--dry-run', dep_line.strip()],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
timeout=45 # Increased timeout to 45 seconds
|
||||
)
|
||||
|
||||
output = result.stdout + result.stderr
|
||||
if output:
|
||||
subdependencies = parse_dry_run_output(output, package_name, installed_packages)
|
||||
except subprocess.TimeoutExpired:
|
||||
# Timeout is not critical - continue without subdependencies
|
||||
logging.debug(f"Subdependency analysis timed out for {package_name} (skipping subdependencies)")
|
||||
subdependencies = []
|
||||
except Exception as e:
|
||||
# Any other error is not critical - continue without subdependencies
|
||||
logging.debug(f"Failed to analyze subdependencies for {package_name}: {e}")
|
||||
subdependencies = []
|
||||
|
||||
# Add main dependency (always add, even if subdependency analysis failed)
|
||||
# Ensure all fields are properly set and clean
|
||||
clean_package_name = str(package_name).strip() if package_name else "Unknown"
|
||||
# Remove any None/null strings that might have been concatenated
|
||||
clean_package_name = clean_package_name.replace('None', '').replace('null', '').strip()
|
||||
if not clean_package_name:
|
||||
clean_package_name = "Unknown"
|
||||
|
||||
analyzed_dependencies.append({
|
||||
'name': clean_package_name,
|
||||
'version': str(version_spec) if version_spec else None,
|
||||
'line': dep_line.strip(),
|
||||
'status': status,
|
||||
'currentVersion': current_version_str,
|
||||
'selected': status != 'installed', # Deselect if already installed
|
||||
'subdependencies': subdependencies
|
||||
})
|
||||
|
||||
return web.json_response({
|
||||
'success': True,
|
||||
'requirements': requirements_content,
|
||||
'dependencies': analyzed_dependencies,
|
||||
'noRequirementsFile': False
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
logging.error(f"Error analyzing dependencies: {e}")
|
||||
traceback.print_exc()
|
||||
return web.json_response({'error': str(e)}, status=500)
|
||||
|
||||
|
||||
def parse_requirements(content):
|
||||
"""Parse requirements.txt content into list of dependency lines."""
|
||||
lines = []
|
||||
for line in content.split('\n'):
|
||||
line = line.strip()
|
||||
if line and not line.startswith('#'):
|
||||
lines.append(line)
|
||||
return lines
|
||||
|
||||
|
||||
def parse_dry_run_output(output, parent_name, installed_packages):
|
||||
"""Parse pip install --dry-run output to extract subdependencies."""
|
||||
import re
|
||||
subdependencies = []
|
||||
subdeps_map = {}
|
||||
|
||||
lines = output.split('\n')
|
||||
for line in lines:
|
||||
line = line.strip()
|
||||
|
||||
# Look for "Collecting package==version" lines
|
||||
if 'Collecting ' in line and 'Using cached' not in line:
|
||||
# Match: "Collecting package==version" or "Collecting package"
|
||||
match = re.search(r'Collecting\s+([a-zA-Z0-9_.-]+(?:\[[^\]]+\])?)(?:\s*==\s*([^\s\(]+))?', line)
|
||||
if match:
|
||||
dep_name = match.group(1).split('[')[0].strip()
|
||||
# Clean the name - remove any None/null strings
|
||||
if dep_name:
|
||||
dep_name = dep_name.replace('None', '').replace('null', '').strip()
|
||||
dep_version = match.group(2).strip() if match.group(2) else None
|
||||
# Clean version too
|
||||
if dep_version:
|
||||
dep_version = dep_version.replace('None', '').replace('null', '').strip() or None
|
||||
|
||||
# Skip the parent package itself
|
||||
if dep_name.lower() == parent_name.lower():
|
||||
continue
|
||||
|
||||
# Normalize name
|
||||
normalized_name = dep_name.lower().replace('-', '_')
|
||||
|
||||
# Check if already in map (avoid duplicates)
|
||||
if normalized_name not in subdeps_map:
|
||||
# Check if already installed
|
||||
installed_version = installed_packages.get(normalized_name)
|
||||
status = 'installed' if installed_version else 'new'
|
||||
current_version_str = str(installed_version) if installed_version else None
|
||||
|
||||
# Ensure name is always a string, not None
|
||||
if not dep_name:
|
||||
dep_name = "Unknown"
|
||||
|
||||
# Clean the name - remove any None/null strings
|
||||
clean_dep_name = str(dep_name).strip().replace('None', '').replace('null', '').strip()
|
||||
if not clean_dep_name:
|
||||
clean_dep_name = "Unknown"
|
||||
|
||||
subdeps_map[normalized_name] = {
|
||||
'name': clean_dep_name,
|
||||
'version': str(dep_version) if dep_version else None,
|
||||
'status': status,
|
||||
'currentVersion': current_version_str,
|
||||
'selected': status != 'installed'
|
||||
}
|
||||
|
||||
# Also look for "Would install" lines which have more accurate version info
|
||||
if 'Would install' in line:
|
||||
# Match: "Would install package-version"
|
||||
match = re.search(r'Would install\s+([a-zA-Z0-9_.-]+)-([\d.]+)', line)
|
||||
if match:
|
||||
dep_name = match.group(1)
|
||||
dep_version = match.group(2)
|
||||
normalized_name = dep_name.lower().replace('-', '_')
|
||||
|
||||
if normalized_name in subdeps_map:
|
||||
# Update with more accurate version
|
||||
subdeps_map[normalized_name]['version'] = dep_version
|
||||
|
||||
# Convert map to list
|
||||
for normalized_name, dep_info in subdeps_map.items():
|
||||
subdependencies.append(dep_info)
|
||||
|
||||
return subdependencies
|
||||
|
||||
|
||||
async def fetch_requirements_from_git(url, commit_id=None, branch=None):
|
||||
"""
|
||||
Fetch requirements.txt from a git repository URL.
|
||||
Supports GitHub URLs by converting to raw.githubusercontent.com.
|
||||
"""
|
||||
try:
|
||||
# Extract GitHub repo info
|
||||
if 'github.com' in url:
|
||||
# Convert to raw GitHub URL
|
||||
url = url.rstrip('/')
|
||||
if url.endswith('.git'):
|
||||
url = url[:-4]
|
||||
|
||||
# Extract owner/repo
|
||||
match = re.search(r'github\.com[:/]([^/]+)/([^/]+)', url)
|
||||
if not match:
|
||||
return None
|
||||
|
||||
owner = match.group(1)
|
||||
repo = match.group(2)
|
||||
|
||||
# Build raw URL
|
||||
if commit_id:
|
||||
raw_url = f"https://raw.githubusercontent.com/{owner}/{repo}/{commit_id}/requirements.txt"
|
||||
elif branch:
|
||||
raw_url = f"https://raw.githubusercontent.com/{owner}/{repo}/{branch}/requirements.txt"
|
||||
else:
|
||||
raw_url = f"https://raw.githubusercontent.com/{owner}/{repo}/main/requirements.txt"
|
||||
|
||||
# Try to fetch using aiohttp
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(raw_url) as response:
|
||||
if response.status == 200:
|
||||
return await response.text()
|
||||
# Try with master branch if main fails
|
||||
if 'main' in raw_url:
|
||||
raw_url = raw_url.replace('/main/', '/master/')
|
||||
async with session.get(raw_url) as response2:
|
||||
if response2.status == 200:
|
||||
return await response2.text()
|
||||
else:
|
||||
# For non-GitHub URLs, we'd need to clone temporarily
|
||||
# For now, return None (can be enhanced later)
|
||||
logging.warning(f"Non-GitHub URL not fully supported for dependency analysis: {url}")
|
||||
return None
|
||||
|
||||
return None
|
||||
except Exception as e:
|
||||
logging.error(f"Error fetching requirements from git: {e}")
|
||||
return None
|
||||
|
||||
|
||||
@routes.post("/manager/queue/uninstall")
|
||||
async def uninstall_custom_node(request):
|
||||
if not is_allowed_security_level('middle'):
|
||||
|
||||
@ -67,6 +67,7 @@ export class CustomNodesManager {
|
||||
this.filter = '';
|
||||
this.keywords = '';
|
||||
this.restartMap = {};
|
||||
this.analyzeDependenciesBeforeInstall = false; // Default: false
|
||||
|
||||
this.init();
|
||||
|
||||
@ -77,6 +78,36 @@ export class CustomNodesManager {
|
||||
}
|
||||
|
||||
init() {
|
||||
// Create checkbox for dependency analysis
|
||||
const analyzeDepsCheckbox = $el("input", {
|
||||
type: "checkbox",
|
||||
id: "cn-analyze-deps-checkbox",
|
||||
checked: this.analyzeDependenciesBeforeInstall,
|
||||
onchange: (e) => {
|
||||
this.analyzeDependenciesBeforeInstall = e.target.checked;
|
||||
},
|
||||
style: {
|
||||
marginRight: "6px",
|
||||
cursor: "pointer"
|
||||
}
|
||||
});
|
||||
|
||||
const analyzeDepsLabel = $el("label", {
|
||||
for: "cn-analyze-deps-checkbox",
|
||||
style: {
|
||||
display: "flex",
|
||||
alignItems: "center",
|
||||
cursor: "pointer",
|
||||
color: "#fff",
|
||||
fontSize: "12px",
|
||||
marginRight: "10px",
|
||||
whiteSpace: "nowrap"
|
||||
}
|
||||
}, [
|
||||
analyzeDepsCheckbox,
|
||||
$el("span", { textContent: "Analyse dependencies before node installation" })
|
||||
]);
|
||||
|
||||
const header = $el("div.cn-manager-header.px-2", {}, [
|
||||
// $el("label", {}, [
|
||||
// $el("span", { textContent: "Filter" }),
|
||||
@ -84,6 +115,7 @@ export class CustomNodesManager {
|
||||
// ]),
|
||||
createSettingsCombo("Filter", $el("select.cn-manager-filter")),
|
||||
$el("input.cn-manager-keywords.p-inputtext.p-component", { type: "search", placeholder: "Search" }),
|
||||
analyzeDepsLabel,
|
||||
$el("div.cn-manager-status"),
|
||||
$el("div.cn-flex-auto"),
|
||||
$el("div.cn-manager-channel")
|
||||
@ -105,6 +137,421 @@ export class CustomNodesManager {
|
||||
this.initGrid();
|
||||
}
|
||||
|
||||
showDependencySelectorDialog(dependencies, onSelect) {
|
||||
const dialog = new ComfyDialog();
|
||||
dialog.element.style.zIndex = 1100;
|
||||
dialog.element.style.width = "900px";
|
||||
dialog.element.style.maxHeight = "80vh";
|
||||
dialog.element.style.padding = "0";
|
||||
dialog.element.style.backgroundColor = "#2a2a2a";
|
||||
dialog.element.style.border = "1px solid #3a3a3a";
|
||||
dialog.element.style.borderRadius = "8px";
|
||||
dialog.element.style.boxSizing = "border-box";
|
||||
dialog.element.style.overflow = "hidden";
|
||||
|
||||
const contentStyle = {
|
||||
width: "100%",
|
||||
display: "flex",
|
||||
flexDirection: "column",
|
||||
padding: "20px",
|
||||
boxSizing: "border-box",
|
||||
gap: "15px"
|
||||
};
|
||||
|
||||
// Create scrollable table container with sticky header
|
||||
const tableContainer = $el("div", {
|
||||
style: {
|
||||
maxHeight: "500px",
|
||||
overflowY: "auto",
|
||||
border: "1px solid #4a4a4a",
|
||||
borderRadius: "4px",
|
||||
backgroundColor: "#1a1a1a",
|
||||
position: "relative"
|
||||
}
|
||||
});
|
||||
|
||||
// Create table
|
||||
const table = $el("table", {
|
||||
style: {
|
||||
width: "100%",
|
||||
borderCollapse: "separate",
|
||||
borderSpacing: "0",
|
||||
fontSize: "14px"
|
||||
}
|
||||
});
|
||||
|
||||
// Create table header with sticky positioning
|
||||
const thead = $el("thead", {
|
||||
style: {
|
||||
position: "sticky",
|
||||
top: "0",
|
||||
zIndex: "10",
|
||||
backgroundColor: "#2a2a2a",
|
||||
boxShadow: "0 2px 4px rgba(0,0,0,0.3)"
|
||||
}
|
||||
}, [
|
||||
$el("tr", {
|
||||
style: {
|
||||
backgroundColor: "#2a2a2a",
|
||||
borderBottom: "2px solid #4a4a4a"
|
||||
}
|
||||
}, [
|
||||
$el("th", {
|
||||
textContent: "",
|
||||
style: {
|
||||
padding: "10px",
|
||||
textAlign: "left",
|
||||
width: "40px",
|
||||
color: "#fff"
|
||||
}
|
||||
}),
|
||||
$el("th", {
|
||||
textContent: "Dependency Name",
|
||||
style: {
|
||||
padding: "10px",
|
||||
textAlign: "left",
|
||||
color: "#fff",
|
||||
fontWeight: "bold"
|
||||
}
|
||||
}),
|
||||
$el("th", {
|
||||
textContent: "Current Version",
|
||||
style: {
|
||||
padding: "10px",
|
||||
textAlign: "left",
|
||||
color: "#fff",
|
||||
fontWeight: "bold"
|
||||
}
|
||||
}),
|
||||
$el("th", {
|
||||
textContent: "Incoming Version",
|
||||
style: {
|
||||
padding: "10px",
|
||||
textAlign: "left",
|
||||
color: "#fff",
|
||||
fontWeight: "bold"
|
||||
}
|
||||
})
|
||||
])
|
||||
]);
|
||||
|
||||
// Create table body
|
||||
const tbody = $el("tbody", {});
|
||||
|
||||
// Create table rows for each dependency and its subdependencies
|
||||
let rowIndex = 0;
|
||||
dependencies.forEach((dep) => {
|
||||
// Ensure name is not null/undefined and clean it
|
||||
let depName = dep.name;
|
||||
if (!depName || depName === 'null' || depName === 'None') {
|
||||
// Fallback: extract from line
|
||||
if (dep.line) {
|
||||
depName = dep.line.split(/[=<>!~]/)[0].trim();
|
||||
} else {
|
||||
depName = "Unknown";
|
||||
}
|
||||
}
|
||||
// Remove any "null" suffix that might have been appended
|
||||
depName = String(depName).replace(/null$/i, '').trim();
|
||||
|
||||
const isInstalled = dep.status === 'installed';
|
||||
const incomingVersion = dep.version || "NA";
|
||||
const currentVersion = dep.currentVersion || "NA";
|
||||
|
||||
// Main dependency row
|
||||
const row = $el("tr", {
|
||||
style: {
|
||||
backgroundColor: rowIndex % 2 === 0 ? "#1a1a1a" : "#222222",
|
||||
borderBottom: "1px solid #3a3a3a"
|
||||
}
|
||||
}, [
|
||||
$el("td", {
|
||||
style: {
|
||||
padding: "10px",
|
||||
textAlign: "center"
|
||||
}
|
||||
}, [
|
||||
$el("input", {
|
||||
type: "checkbox",
|
||||
checked: dep.selected,
|
||||
onchange: (e) => {
|
||||
dep.selected = e.target.checked;
|
||||
},
|
||||
style: {
|
||||
cursor: "pointer",
|
||||
width: "18px",
|
||||
height: "18px"
|
||||
}
|
||||
})
|
||||
]),
|
||||
$el("td", {
|
||||
style: {
|
||||
padding: "10px",
|
||||
color: isInstalled ? "#888" : "#fff"
|
||||
}
|
||||
}, [
|
||||
$el("span", {
|
||||
textContent: depName,
|
||||
style: {
|
||||
fontWeight: "500",
|
||||
marginRight: isInstalled ? "8px" : "0"
|
||||
}
|
||||
}),
|
||||
isInstalled ? $el("span", {
|
||||
textContent: "Installed",
|
||||
style: {
|
||||
display: "inline-block",
|
||||
backgroundColor: "#2a4a2a",
|
||||
color: "#4a9",
|
||||
padding: "2px 6px",
|
||||
borderRadius: "3px",
|
||||
fontSize: "10px",
|
||||
fontWeight: "bold",
|
||||
border: "1px solid #4a9"
|
||||
}
|
||||
}) : ''
|
||||
]),
|
||||
$el("td", {
|
||||
textContent: currentVersion,
|
||||
style: {
|
||||
padding: "10px",
|
||||
color: isInstalled ? "#4a9" : "#aaa",
|
||||
fontFamily: "monospace"
|
||||
}
|
||||
}),
|
||||
$el("td", {
|
||||
textContent: incomingVersion,
|
||||
style: {
|
||||
padding: "10px",
|
||||
color: "#fff",
|
||||
fontFamily: "monospace"
|
||||
}
|
||||
})
|
||||
]);
|
||||
|
||||
tbody.appendChild(row);
|
||||
rowIndex++;
|
||||
|
||||
// Add subdependencies as indented rows
|
||||
if(dep.subdependencies && dep.subdependencies.length > 0) {
|
||||
dep.subdependencies.forEach((subdep) => {
|
||||
// Ensure subdependency name is not null/undefined and clean it
|
||||
let subdepName = subdep.name;
|
||||
if (!subdepName || subdepName === 'null' || subdepName === 'None') {
|
||||
subdepName = "Unknown";
|
||||
}
|
||||
// Remove any "null" suffix that might have been appended
|
||||
subdepName = String(subdepName).replace(/null$/i, '').trim();
|
||||
|
||||
const subIsInstalled = subdep.status === 'installed';
|
||||
const subIncomingVersion = subdep.version || "NA";
|
||||
const subCurrentVersion = subdep.currentVersion || "NA";
|
||||
|
||||
const subRow = $el("tr", {
|
||||
style: {
|
||||
backgroundColor: rowIndex % 2 === 0 ? "#1a1a1a" : "#222222",
|
||||
borderBottom: "1px solid #3a3a3a"
|
||||
}
|
||||
}, [
|
||||
$el("td", {
|
||||
style: {
|
||||
padding: "10px",
|
||||
textAlign: "center"
|
||||
}
|
||||
}, [
|
||||
$el("input", {
|
||||
type: "checkbox",
|
||||
checked: subdep.selected,
|
||||
onchange: (e) => {
|
||||
subdep.selected = e.target.checked;
|
||||
},
|
||||
style: {
|
||||
cursor: "pointer",
|
||||
width: "18px",
|
||||
height: "18px"
|
||||
}
|
||||
})
|
||||
]),
|
||||
$el("td", {
|
||||
style: {
|
||||
padding: "10px 10px 10px 30px",
|
||||
color: subIsInstalled ? "#888" : "#aaa",
|
||||
fontSize: "13px"
|
||||
}
|
||||
}, [
|
||||
$el("span", {
|
||||
textContent: "└─ " + subdepName,
|
||||
style: {
|
||||
fontWeight: "400",
|
||||
marginRight: subIsInstalled ? "8px" : "0"
|
||||
}
|
||||
}),
|
||||
subIsInstalled ? $el("span", {
|
||||
textContent: "Installed",
|
||||
style: {
|
||||
display: "inline-block",
|
||||
backgroundColor: "#2a4a2a",
|
||||
color: "#4a9",
|
||||
padding: "2px 6px",
|
||||
borderRadius: "3px",
|
||||
fontSize: "10px",
|
||||
fontWeight: "bold",
|
||||
border: "1px solid #4a9"
|
||||
}
|
||||
}) : ''
|
||||
]),
|
||||
$el("td", {
|
||||
textContent: subCurrentVersion,
|
||||
style: {
|
||||
padding: "10px",
|
||||
color: subIsInstalled ? "#4a9" : "#666",
|
||||
fontFamily: "monospace",
|
||||
fontSize: "13px"
|
||||
}
|
||||
}),
|
||||
$el("td", {
|
||||
textContent: subIncomingVersion,
|
||||
style: {
|
||||
padding: "10px",
|
||||
color: "#aaa",
|
||||
fontFamily: "monospace",
|
||||
fontSize: "13px"
|
||||
}
|
||||
})
|
||||
]);
|
||||
|
||||
tbody.appendChild(subRow);
|
||||
rowIndex++;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
table.appendChild(thead);
|
||||
table.appendChild(tbody);
|
||||
tableContainer.appendChild(table);
|
||||
|
||||
const content = $el("div", {
|
||||
style: contentStyle
|
||||
}, [
|
||||
$el("h3", {
|
||||
textContent: "Select Dependencies to Install",
|
||||
style: {
|
||||
color: "#ffffff",
|
||||
backgroundColor: "#1a1a1a",
|
||||
padding: "10px 15px",
|
||||
margin: "0 0 10px 0",
|
||||
width: "100%",
|
||||
textAlign: "center",
|
||||
borderRadius: "4px",
|
||||
boxSizing: "border-box"
|
||||
}
|
||||
}),
|
||||
$el("div", {
|
||||
textContent: `${dependencies.filter(d => d.status === 'installed').length} already installed, ${dependencies.filter(d => d.status !== 'installed').length} to install`,
|
||||
style: {
|
||||
color: "#aaa",
|
||||
fontSize: "12px",
|
||||
marginBottom: "5px"
|
||||
}
|
||||
}),
|
||||
tableContainer,
|
||||
$el("div", {
|
||||
style: {
|
||||
display: "flex",
|
||||
justifyContent: "space-between",
|
||||
width: "100%",
|
||||
gap: "10px",
|
||||
marginTop: "10px"
|
||||
}
|
||||
}, [
|
||||
$el("button", {
|
||||
textContent: "Cancel",
|
||||
onclick: () => {
|
||||
onSelect(null); // Pass null to indicate cancellation
|
||||
dialog.close();
|
||||
},
|
||||
style: {
|
||||
flex: "1",
|
||||
padding: "8px",
|
||||
backgroundColor: "#4a4a4a",
|
||||
color: "#ffffff",
|
||||
border: "none",
|
||||
borderRadius: "4px",
|
||||
cursor: "pointer"
|
||||
}
|
||||
}),
|
||||
$el("button", {
|
||||
textContent: "Select All",
|
||||
onclick: () => {
|
||||
dependencies.forEach(dep => {
|
||||
if (dep.status !== 'installed') {
|
||||
dep.selected = true;
|
||||
}
|
||||
// Also select subdependencies
|
||||
if(dep.subdependencies) {
|
||||
dep.subdependencies.forEach(subdep => {
|
||||
if(subdep.status !== 'installed') {
|
||||
subdep.selected = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
// Update checkboxes in the table
|
||||
const checkboxes = tableContainer.querySelectorAll('input[type="checkbox"]');
|
||||
checkboxes.forEach((checkbox) => {
|
||||
if(!checkbox.disabled) {
|
||||
checkbox.checked = true;
|
||||
}
|
||||
});
|
||||
},
|
||||
style: {
|
||||
padding: "8px 15px",
|
||||
backgroundColor: "#4a6a4a",
|
||||
color: "#ffffff",
|
||||
border: "none",
|
||||
borderRadius: "4px",
|
||||
cursor: "pointer"
|
||||
}
|
||||
}),
|
||||
$el("button", {
|
||||
textContent: "Install Selected",
|
||||
onclick: () => {
|
||||
// Collect all selected dependencies (main + subdependencies)
|
||||
const selected = [];
|
||||
dependencies.forEach(d => {
|
||||
if(d.selected) {
|
||||
selected.push(d);
|
||||
}
|
||||
// Also include selected subdependencies
|
||||
if(d.subdependencies) {
|
||||
d.subdependencies.forEach(subdep => {
|
||||
if(subdep.selected) {
|
||||
selected.push(subdep);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
onSelect(selected);
|
||||
dialog.close();
|
||||
},
|
||||
style: {
|
||||
flex: "1",
|
||||
padding: "8px",
|
||||
backgroundColor: "#4CAF50",
|
||||
color: "#ffffff",
|
||||
border: "none",
|
||||
borderRadius: "4px",
|
||||
cursor: "pointer"
|
||||
}
|
||||
}),
|
||||
])
|
||||
]);
|
||||
|
||||
console.log('[Dependency Dialog] Showing dialog with', dependencies.length, 'dependencies');
|
||||
dialog.show(content);
|
||||
console.log('[Dependency Dialog] Dialog shown');
|
||||
}
|
||||
|
||||
showVersionSelectorDialog(versions, onSelect) {
|
||||
const dialog = new ComfyDialog();
|
||||
dialog.element.style.zIndex = 1100;
|
||||
@ -1470,6 +1917,101 @@ export class CustomNodesManager {
|
||||
}
|
||||
}
|
||||
|
||||
// For install mode, analyze dependencies BEFORE starting installation
|
||||
let selectedDependencies = [];
|
||||
let dependencyDialogShown = false; // Track if dialog was shown
|
||||
if(mode === "install" && this.analyzeDependenciesBeforeInstall) {
|
||||
// Analyze dependencies for all items first (only if checkbox is enabled)
|
||||
for (const hash of list) {
|
||||
const item = this.grid.getRowItemBy("hash", hash);
|
||||
if (!item) {
|
||||
console.log('[Dependency Analysis] Item not found for hash:', hash);
|
||||
continue;
|
||||
}
|
||||
|
||||
const data = item.originalData;
|
||||
console.log('[Dependency Analysis] Item data:', {
|
||||
title: item.title,
|
||||
files: data.files,
|
||||
repository: data.repository,
|
||||
hasFiles: !!data.files,
|
||||
filesLength: data.files ? data.files.length : 0
|
||||
});
|
||||
|
||||
// Try multiple ways to get the git URL
|
||||
let gitUrl = null;
|
||||
if(data.files && data.files.length > 0) {
|
||||
gitUrl = data.files[0];
|
||||
} else if(data.repository) {
|
||||
gitUrl = data.repository;
|
||||
}
|
||||
|
||||
if(gitUrl && (gitUrl.includes('github.com') || gitUrl.includes('.git'))) {
|
||||
try {
|
||||
this.showStatus(`Analyzing dependencies for ${item.title}...`);
|
||||
console.log('[Dependency Analysis] Fetching dependencies for:', gitUrl);
|
||||
|
||||
const analyzeRes = await api.fetchApi('/customnode/analyze_dependencies', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
url: gitUrl,
|
||||
commitId: data.commit_id,
|
||||
branch: data.branch
|
||||
})
|
||||
});
|
||||
|
||||
console.log('[Dependency Analysis] Response status:', analyzeRes.status);
|
||||
|
||||
if(analyzeRes.status === 200) {
|
||||
const analyzeData = await analyzeRes.json();
|
||||
console.log('[Dependency Analysis] Response data:', {
|
||||
success: analyzeData.success,
|
||||
hasDependencies: !!analyzeData.dependencies,
|
||||
dependenciesCount: analyzeData.dependencies ? analyzeData.dependencies.length : 0,
|
||||
noRequirementsFile: analyzeData.noRequirementsFile
|
||||
});
|
||||
|
||||
if(analyzeData.success && analyzeData.dependencies && analyzeData.dependencies.length > 0) {
|
||||
console.log('[Dependency Analysis] Showing dialog with', analyzeData.dependencies.length, 'dependencies');
|
||||
dependencyDialogShown = true;
|
||||
|
||||
// Show dependency selection dialog and wait for user
|
||||
const userSelection = await new Promise((resolve) => {
|
||||
this.showDependencySelectorDialog(analyzeData.dependencies, (selected) => {
|
||||
console.log('[Dependency Analysis] User selected:', selected);
|
||||
resolve(selected);
|
||||
});
|
||||
});
|
||||
|
||||
// If user cancelled (null), stop installation
|
||||
if(userSelection === null) {
|
||||
console.log('[Dependency Analysis] User cancelled installation');
|
||||
this.showStatus("Installation cancelled");
|
||||
return;
|
||||
}
|
||||
|
||||
selectedDependencies = userSelection || [];
|
||||
console.log('[Dependency Analysis] Selected dependencies:', selectedDependencies.length);
|
||||
} else if(analyzeData.noRequirementsFile) {
|
||||
console.log('[Dependency Analysis] No requirements.txt file found');
|
||||
} else {
|
||||
console.log('[Dependency Analysis] No dependencies to show');
|
||||
}
|
||||
} else {
|
||||
const errorText = await analyzeRes.text();
|
||||
console.error('[Dependency Analysis] API error:', analyzeRes.status, errorText);
|
||||
}
|
||||
} catch(e) {
|
||||
console.error('[Dependency Analysis] Exception:', e);
|
||||
// Continue with installation even if dependency analysis fails
|
||||
}
|
||||
} else {
|
||||
console.log('[Dependency Analysis] Not a GitHub URL or no URL found:', gitUrl);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
target.classList.add("cn-btn-loading");
|
||||
this.showError("");
|
||||
|
||||
@ -1511,6 +2053,46 @@ export class CustomNodesManager {
|
||||
data.mode = this.mode;
|
||||
data.ui_id = hash;
|
||||
|
||||
// Add selected dependencies to data (including subdependencies)
|
||||
// Only install selected dependencies - respect user's selection
|
||||
const allSelected = [];
|
||||
if(selectedDependencies.length > 0) {
|
||||
selectedDependencies.forEach(d => {
|
||||
// Add main dependency if selected
|
||||
if(d.selected) {
|
||||
allSelected.push({
|
||||
name: d.name,
|
||||
version: d.version,
|
||||
line: d.line
|
||||
});
|
||||
}
|
||||
// Add selected subdependencies
|
||||
if(d.subdependencies) {
|
||||
d.subdependencies.forEach(subdep => {
|
||||
if(subdep.selected) {
|
||||
allSelected.push({
|
||||
name: subdep.name,
|
||||
version: subdep.version,
|
||||
line: `${subdep.name}${subdep.version ? '==' + subdep.version : ''}`
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
// Set selectedDependencies:
|
||||
// - If dialog was shown: always set (even if empty) to respect user's selection
|
||||
// - If dialog was not shown: don't set (install all dependencies - original behavior)
|
||||
if(dependencyDialogShown) {
|
||||
// User saw the dialog, respect their selection (even if empty)
|
||||
data.selectedDependencies = allSelected;
|
||||
} else if(allSelected.length > 0) {
|
||||
// Dialog wasn't shown but we have selections (shouldn't happen, but just in case)
|
||||
data.selectedDependencies = allSelected;
|
||||
}
|
||||
// If dialog wasn't shown and no selections, don't set selectedDependencies
|
||||
// This means backend will install all dependencies (original behavior)
|
||||
|
||||
let install_mode = mode;
|
||||
if(mode == 'switch') {
|
||||
install_mode = 'install';
|
||||
|
||||
@ -1,25 +1,5 @@
|
||||
{
|
||||
"custom_nodes": [
|
||||
{
|
||||
"author": "andreszs",
|
||||
"title": "ComfyUI-Lora-Pipeline",
|
||||
"reference": "https://github.com/andreszs/ComfyUI-Lora-Pipeline",
|
||||
"files": [
|
||||
"https://github.com/andreszs/ComfyUI-Lora-Pipeline"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Area-based LoRA and conditioning workflow tools for ComfyUI with multi-region control."
|
||||
},
|
||||
{
|
||||
"author": "Zinigo",
|
||||
"title": "Prompt Builder [NAME CONFLICT]",
|
||||
"reference": "https://github.com/zinigo-creations/comfyui-prompt-builder",
|
||||
"files": [
|
||||
"https://github.com/zinigo-creations/comfyui-prompt-builder"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Dropdown-based prompt builder for ComfyUI. Create characters, scenes, and styles without writing prompts. Designed for beginners and fast iteration."
|
||||
},
|
||||
{
|
||||
"author": "ethanfel",
|
||||
"title": "Comfyui-Return-Run-Logic",
|
||||
@ -461,16 +441,6 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "RunningHub Nano Banana Pro API node for ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "DazzleNodes",
|
||||
"title": "ComfyUI-DazzleSwitch",
|
||||
"reference": "https://github.com/DazzleNodes/ComfyUI-DazzleSwitch",
|
||||
"files": [
|
||||
"https://github.com/DazzleNodes/ComfyUI-DazzleSwitch"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Smart switch node for ComfyUI with dropdown-based input selection and INT override for cascading workflows. Route any data type through a named dropdown instead of moving noodles."
|
||||
},
|
||||
{
|
||||
"author": "Echoflare",
|
||||
"title": "ComfyUI-Reverse-Proxy-Fix",
|
||||
@ -1324,16 +1294,6 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "Custom ComfyUI nodes for JSON processing and transcription workflows, including text-to-JSON conversion, SRT subtitle parsing, and file saving. (Description by CC)[w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
|
||||
},
|
||||
{
|
||||
"author": "ShammiG",
|
||||
"title": "ComfyUI_Text_Tools_SG [UNSAFE]",
|
||||
"reference": "https://github.com/ShammiG/ComfyUI_Text_Tools_SG",
|
||||
"files": [
|
||||
"https://github.com/ShammiG/ComfyUI_Text_Tools_SG"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Text Editor node with Markdown editing plus quick shortcuts, Text Viewer node, with extra features plus Text Merge, Text Save and Load Text from anywhere nodes.[w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
|
||||
},
|
||||
{
|
||||
"author": "Smyshnikof",
|
||||
"title": "ComfyUI-PresetDownloadManager [UNSAFE]",
|
||||
@ -1914,17 +1874,6 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "NODES: StringToListNode"
|
||||
},
|
||||
{
|
||||
"author": "krakenunbound",
|
||||
"title": "Kraken Discord Bot",
|
||||
"id": "kraken-discord-bot",
|
||||
"reference": "https://github.com/krakenunbound/kraken-discord-bot",
|
||||
"files": [
|
||||
"https://github.com/krakenunbound/kraken-discord-bot"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "All-in-one Discord bot node for AI image generation. Simple setup - just add token, select model, and queue. Includes style presets, rate limiting, and queue management."
|
||||
},
|
||||
{
|
||||
"author": "quinteroac",
|
||||
"title": "comfyui_api_executor_nodes",
|
||||
@ -3668,16 +3617,6 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI node for a frame by frame Diffusion."
|
||||
},
|
||||
{
|
||||
"author": "tfernd",
|
||||
"title": "Auto CPU Offload for ComfyUI [WIP]",
|
||||
"reference": "https://github.com/tfernd/ComfyUI-AutoCPUOffload",
|
||||
"files": [
|
||||
"https://github.com/tfernd/ComfyUI-AutoCPUOffload"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This extension introduces an 'Auto CPU Offload' node designed to reduce GPU VRAM usage by automatically offloading model components to the CPU. It intelligently manages the movement of model layers between the GPU and CPU, aiming to keep only the necessary parts in VRAM during inference."
|
||||
},
|
||||
{
|
||||
"author": "hujuying",
|
||||
"title": "comfyui_gemini_banana_api [WIP]",
|
||||
@ -4440,26 +4379,6 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "First universal metadata system for AI image generation, with template-driven architecture allowing easy extension to new services; comprehensive dependency tracking with automatic download resolution; lossless conversion between platform formats where possible; future-proof design with extensible schema and validation system.[w/This nodepack has a vulnerability that allows remote access to arbitrary file paths.]"
|
||||
},
|
||||
{
|
||||
"author": "Charonartist",
|
||||
"title": "ComfyUI LoRA Random Selector",
|
||||
"reference": "https://github.com/Charonartist/comfyui-lora-random-selector",
|
||||
"files": [
|
||||
"https://github.com/Charonartist/comfyui-lora-random-selector"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "NODES: WanMoeKSampler, WanMoeKSamplerAdvanced"
|
||||
},
|
||||
{
|
||||
"author": "Charonartist",
|
||||
"title": "ComfyUI LoRA Random Selector [WIP]",
|
||||
"reference": "https://github.com/Charonartist/comfyui-lora-random-selector",
|
||||
"files": [
|
||||
"https://github.com/Charonartist/comfyui-lora-random-selector"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A ComfyUI custom node that randomly selects LoRA files by category and automatically applies corresponding trigger words.\nNOTE: The files in the repo are not organized."
|
||||
},
|
||||
{
|
||||
"author": "idoru",
|
||||
"title": "Filestash Upload Node [UNSAFE]",
|
||||
@ -5020,16 +4939,6 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "This project is the comfyui implementation of ComfyUI_SZtools, a labeling and naming tool developed for Kontext's local training package T2ITrainer.\nNOTE: The files in the repo are not organized."
|
||||
},
|
||||
{
|
||||
"author": "stalkervr",
|
||||
"title": "Custom Path Nodes for ComfyUI [UNSAFE]",
|
||||
"reference": "https://github.com/stalkervr/comfyui-custom-path-nodes",
|
||||
"files": [
|
||||
"https://github.com/stalkervr/comfyui-custom-path-nodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes for path handling and image cropping.[w/This nodepack contains a node that has a vulnerability allowing access to arbitrary file paths.]"
|
||||
},
|
||||
{
|
||||
"author": "gorillaframeai",
|
||||
"title": "GF_pixtral_node [WIP]",
|
||||
@ -5511,16 +5420,6 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "NODES: Trim Image Batch, Create Image Batch, Select Image Batch by Mask, Advanced Batch Creator"
|
||||
},
|
||||
{
|
||||
"author": "stalkervr",
|
||||
"title": "comfyui-custom-path-nodes [UNSAFE]",
|
||||
"reference": "https://github.com/stalkervr/comfyui-custom-path-nodes",
|
||||
"files": [
|
||||
"https://github.com/stalkervr/comfyui-custom-path-nodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes for path handling and image cropping.[w/This nodepack has a vulnerability that allows remote access to arbitrary file paths.]"
|
||||
},
|
||||
{
|
||||
"author": "vovler",
|
||||
"title": "comfyui-vovlertools",
|
||||
@ -6182,16 +6081,6 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "A ComfyUI custom node that ingests GitHub repositories and outputs their content as text along with token count.\nNOTE: The files in the repo are not organized."
|
||||
},
|
||||
{
|
||||
"author": "Charonartist",
|
||||
"title": "ComfyUI-send-eagle-pro",
|
||||
"reference": "https://github.com/Charonartist/ComfyUI-send-eagle-pro_2",
|
||||
"files": [
|
||||
"https://github.com/Charonartist/ComfyUI-send-eagle-pro_2"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Eagle integration extension node for ComfyUI (Pro version)"
|
||||
},
|
||||
{
|
||||
"author": "Mervent",
|
||||
"title": "comfyui-yaml-prompt",
|
||||
@ -9703,16 +9592,6 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:ComfyFlux Size\nNOTE: The files in the repo are not organized."
|
||||
},
|
||||
{
|
||||
"author": "yojimbodayne",
|
||||
"title": "ComfyUI-Dropbox-API [WIP]",
|
||||
"reference": "https://github.com/yojimbodayne/ComfyUI-Dropbox-API",
|
||||
"files": [
|
||||
"https://github.com/yojimbodayne/ComfyUI-Dropbox-API"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This custom nodepackage for ComfyUI allows users to interact with Dropbox API, enabling image, text, and video uploads, downloads, and management directly from ComfyUI workflows.\nNOTE: The files in the repo are not organized."
|
||||
},
|
||||
{
|
||||
"author": "ilovejohnwhite",
|
||||
"title": "Kolors Awesome Prompts [WIP]",
|
||||
@ -10241,16 +10120,6 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:Load SD3DiffusersPipeline, SD3 ControlNet Sampler"
|
||||
},
|
||||
{
|
||||
"author": "AustinMroz",
|
||||
"title": "ComfyUI-SD3-Medium-CN-Diffusers [WIP]",
|
||||
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SD3-Medium-CN-Diffusers",
|
||||
"files": [
|
||||
"https://github.com/AustinMroz/ComfyUI-WorkflowCheckpointing"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI SD3-Medium ControlNet (Diffusers)"
|
||||
},
|
||||
{
|
||||
"author": "redhottensors",
|
||||
"title": "ComfyUI-ODE",
|
||||
|
||||
@ -341,7 +341,6 @@
|
||||
"ImageBlendText",
|
||||
"ImageBlendV1",
|
||||
"ImageGridSplitter",
|
||||
"ImageRatioCrop",
|
||||
"Load_Images_Advance",
|
||||
"Load_Images_V1",
|
||||
"PD Image Resize_V1",
|
||||
@ -413,6 +412,7 @@
|
||||
"PD_image_to_text_v1",
|
||||
"PD_imagesave_path",
|
||||
"PD_load_image_v1",
|
||||
"PD_lora_loader",
|
||||
"PD_name_replacewordorder",
|
||||
"PD_number_star",
|
||||
"PD_number_start",
|
||||
@ -667,14 +667,6 @@
|
||||
"title_aux": "SplatViwer_comfyUI"
|
||||
}
|
||||
],
|
||||
"https://github.com/AiSatan/ComfyUI_CSM": [
|
||||
[
|
||||
"CSM_Transformers_Node"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI_CSM [NAME CONFLICT]"
|
||||
}
|
||||
],
|
||||
"https://github.com/AkiEvansDev/ComfyUI-Tools": [
|
||||
[
|
||||
"AE.AnySwitch",
|
||||
@ -838,15 +830,15 @@
|
||||
"TS_AudioPreview",
|
||||
"TS_BGRM_BiRefNet",
|
||||
"TS_BatchPromptLoader",
|
||||
"TS_CPULoraMerger",
|
||||
"TS_Color_Grade",
|
||||
"TS_Color_Match",
|
||||
"TS_DeflickerNode",
|
||||
"TS_Despill",
|
||||
"TS_FileBrowser",
|
||||
"TS_FilePathLoader",
|
||||
"TS_FilmGrain",
|
||||
"TS_Film_Emulation",
|
||||
"TS_FloatSlider",
|
||||
"TS_Frame_Interpolation",
|
||||
"TS_Free_Video_Memory",
|
||||
"TS_GetImageMegapixels",
|
||||
"TS_GetImageSizeSide",
|
||||
@ -860,11 +852,13 @@
|
||||
"TS_Int_Slider",
|
||||
"TS_Keyer",
|
||||
"TS_LTX_FirstLastFrame",
|
||||
"TS_LamaCleanup",
|
||||
"TS_Math_Int",
|
||||
"TS_ModelConverter",
|
||||
"TS_ModelConverterAdvanced",
|
||||
"TS_ModelConverterAdvancedDirect",
|
||||
"TS_ModelScanner",
|
||||
"TS_MultiReference",
|
||||
"TS_MusicStems",
|
||||
"TS_PromptBuilder",
|
||||
"TS_Qwen3_VL_V3",
|
||||
@ -876,6 +870,7 @@
|
||||
"TS_SileroTTS",
|
||||
"TS_Smart_Switch",
|
||||
"TS_StylePromptSelector",
|
||||
"TS_SuperPrompt",
|
||||
"TS_VideoDepthNode",
|
||||
"TS_Video_Upscale_With_Model",
|
||||
"TS_WAN_SafeResize"
|
||||
@ -1297,6 +1292,7 @@
|
||||
],
|
||||
"https://github.com/Chargeuk/ComfyUI-vts-nodes": [
|
||||
[
|
||||
"VAELoader VTS",
|
||||
"VTS Add Text To list",
|
||||
"VTS Calculate Upscale Amount",
|
||||
"VTS Clean Text",
|
||||
@ -1315,8 +1311,11 @@
|
||||
"VTS Create Character Mask",
|
||||
"VTS Delete Saved Images",
|
||||
"VTS Fix Image Tags",
|
||||
"VTS Frame Interpolate",
|
||||
"VTS Image Batch Extend With Overlap",
|
||||
"VTS Image Composite Masked",
|
||||
"VTS Image Composite Masked Old",
|
||||
"VTS Image From Batch",
|
||||
"VTS Image To Disk",
|
||||
"VTS Image Upscale With Model",
|
||||
"VTS Images Crop From Masks",
|
||||
@ -1327,6 +1326,8 @@
|
||||
"VTS Merge Delimited Text",
|
||||
"VTS Merge Text",
|
||||
"VTS Merge Text Lists",
|
||||
"VTS Prompt Batcher",
|
||||
"VTS Random Prompt Builder",
|
||||
"VTS Reduce Batch Size",
|
||||
"VTS Render People Kps",
|
||||
"VTS Repeat Text As List",
|
||||
@ -1339,6 +1340,7 @@
|
||||
"VTS To Text",
|
||||
"VTS To Text List",
|
||||
"VTS VAE Decode Tiled",
|
||||
"VTSLTXAddVideoICLoRAGuide",
|
||||
"VTS_Load_Pose_Keypoints",
|
||||
"Vts Text To Batch Prompt"
|
||||
],
|
||||
@ -1346,28 +1348,6 @@
|
||||
"title_aux": "ComfyUI-vts-nodes [WIP]"
|
||||
}
|
||||
],
|
||||
"https://github.com/Charonartist/ComfyUI-send-eagle-pro_2": [
|
||||
[
|
||||
"Batch Send Media to Eagle",
|
||||
"Send Audio to Eagle",
|
||||
"Send Eagle with text",
|
||||
"Send Media to Eagle",
|
||||
"Send Media to Eagle (Advanced)",
|
||||
"Send Video to Eagle",
|
||||
"Send Webp Image to Eagle"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-send-eagle-pro"
|
||||
}
|
||||
],
|
||||
"https://github.com/Charonartist/comfyui-lora-random-selector": [
|
||||
[
|
||||
"LoRARandomSelector"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI LoRA Random Selector [WIP]"
|
||||
}
|
||||
],
|
||||
"https://github.com/ChrisColeTech/ComfyUI-Get-Random-File": [
|
||||
[
|
||||
"Get Image File By Index",
|
||||
@ -1664,14 +1644,6 @@
|
||||
"title_aux": "comfyui-djb-utils"
|
||||
}
|
||||
],
|
||||
"https://github.com/DazzleNodes/ComfyUI-DazzleSwitch": [
|
||||
[
|
||||
"DazzleSwitch"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-DazzleSwitch"
|
||||
}
|
||||
],
|
||||
"https://github.com/DeTK/ComfyUI-Switch": [
|
||||
[
|
||||
"NodeSwitch"
|
||||
@ -1972,6 +1944,7 @@
|
||||
"Base64ToImageNode by IAT",
|
||||
"FloatInputNode by IAT",
|
||||
"GPTReversePrompt by IAT",
|
||||
"ImageColorPaletteExtractor by IAT",
|
||||
"ImageMatchSize by IAT",
|
||||
"ImageResizeLongestSide by IAT",
|
||||
"ImageResizeToSDXL by IAT",
|
||||
@ -1981,6 +1954,7 @@
|
||||
"Qwen35ReversePrompt by IAT",
|
||||
"QwenKontextTranslator by IAT",
|
||||
"QwenTranslator by IAT",
|
||||
"SaveAudioMP3WithCover by IAT",
|
||||
"SeedGeneratorNode by IAT",
|
||||
"SmartPathBuilderNode by IAT",
|
||||
"TextInputNode by IAT"
|
||||
@ -3205,6 +3179,7 @@
|
||||
"MpiInt",
|
||||
"MpiJsonLoad",
|
||||
"MpiJsonSave",
|
||||
"MpiListCount",
|
||||
"MpiLogger",
|
||||
"MpiLoraModel",
|
||||
"MpiLoraModelClip",
|
||||
@ -3347,6 +3322,7 @@
|
||||
"DownloadCivitaiModel",
|
||||
"ExtraCheckpointData",
|
||||
"ExtractTagFromString",
|
||||
"MergeData",
|
||||
"PrepareCheckpoint",
|
||||
"PrepareLoRA",
|
||||
"PromptTidy",
|
||||
@ -3830,6 +3806,7 @@
|
||||
[
|
||||
"DualEndpointColorBlendScheduler",
|
||||
"GemmaAPITextEncode",
|
||||
"LightLeaksTransition",
|
||||
"MaskClampedCrop",
|
||||
"MaskClampedCropSticky"
|
||||
],
|
||||
@ -4138,6 +4115,8 @@
|
||||
"UniRigLoadMesh",
|
||||
"UniRigLoadModel",
|
||||
"UniRigLoadRiggedMesh",
|
||||
"UniRigLoadSkeletonModel",
|
||||
"UniRigLoadSkinningModel",
|
||||
"UniRigOrientationCheck",
|
||||
"UniRigPreviewRiggedMesh",
|
||||
"UniRigSaveMesh",
|
||||
@ -4549,20 +4528,6 @@
|
||||
"title_aux": "ComfyUI-Mojen-Nodeset"
|
||||
}
|
||||
],
|
||||
"https://github.com/ShammiG/ComfyUI_Text_Tools_SG": [
|
||||
[
|
||||
"Text Tools Editor-SG",
|
||||
"Text Tools Load Text FilePath-SG",
|
||||
"Text Tools Load Text-SG",
|
||||
"Text Tools Merge Text Multi-SG",
|
||||
"Text Tools Merge Text-SG",
|
||||
"Text Tools Save Text File-SG",
|
||||
"Text Tools Viewer-SG"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI_Text_Tools_SG [UNSAFE]"
|
||||
}
|
||||
],
|
||||
"https://github.com/Shinsplat/ComfyUI-Shinsplat": [
|
||||
[
|
||||
"Clip Text Encode (Shinsplat)",
|
||||
@ -4740,6 +4705,7 @@
|
||||
"AdvancedSchedulerSelector",
|
||||
"ApplyPipeline",
|
||||
"AsyncDiffConfig",
|
||||
"AttentionBackendConfig",
|
||||
"BalancedConfig",
|
||||
"BitsAndBytesQuantizationConfig",
|
||||
"CheckpointSelector",
|
||||
@ -4768,6 +4734,7 @@
|
||||
"TorchAOQuantizationConfig",
|
||||
"TorchConfig",
|
||||
"UnsafeModelSelector",
|
||||
"WanSampler",
|
||||
"ZImageSampler"
|
||||
],
|
||||
{
|
||||
@ -4804,135 +4771,6 @@
|
||||
"title_aux": "PMSnodes [WIP]"
|
||||
}
|
||||
],
|
||||
"https://github.com/Solarish/ComfyUI-MidnightLook": [
|
||||
[
|
||||
"CameraBasicFromChaoJie",
|
||||
"CameraCombineFromChaoJie",
|
||||
"CameraJoinFromChaoJie",
|
||||
"CameraTrajectoryFromChaoJie",
|
||||
"CogVideoXFunInpaintSampler",
|
||||
"CogVideoXFunT2VSampler",
|
||||
"CogVideoXFunV2VSampler",
|
||||
"CombineFlux2Pipeline",
|
||||
"CombineQwenImagePipeline",
|
||||
"CombineWan2_2Pipeline",
|
||||
"CombineWan2_2VaceFunPipeline",
|
||||
"CombineWanPipeline",
|
||||
"CombineZImagePipeline",
|
||||
"CreateTrajectoryBasedOnKJNodes",
|
||||
"Flux2ControlSampler",
|
||||
"Flux2T2ISampler",
|
||||
"FunAttention",
|
||||
"FunCompile",
|
||||
"FunRiflex",
|
||||
"FunTextBox",
|
||||
"ImageCollectNode",
|
||||
"ImageMaximumNode",
|
||||
"ImageToCanny",
|
||||
"ImageToDepth",
|
||||
"ImageToPose",
|
||||
"LoadCogVideoXFunLora",
|
||||
"LoadCogVideoXFunModel",
|
||||
"LoadFlux2ControlNetInModel",
|
||||
"LoadFlux2ControlNetInPipeline",
|
||||
"LoadFlux2Lora",
|
||||
"LoadFlux2Model",
|
||||
"LoadFlux2TextEncoderModel",
|
||||
"LoadFlux2TransformerModel",
|
||||
"LoadFlux2VAEModel",
|
||||
"LoadQwenImageControlNetInModel",
|
||||
"LoadQwenImageControlNetInPipeline",
|
||||
"LoadQwenImageLora",
|
||||
"LoadQwenImageModel",
|
||||
"LoadQwenImageProcessor",
|
||||
"LoadQwenImageTextEncoderModel",
|
||||
"LoadQwenImageTransformerModel",
|
||||
"LoadQwenImageVAEModel",
|
||||
"LoadVaceWanTransformer3DModel",
|
||||
"LoadWan2_2FunLora",
|
||||
"LoadWan2_2FunModel",
|
||||
"LoadWan2_2Lora",
|
||||
"LoadWan2_2Model",
|
||||
"LoadWan2_2TransformerModel",
|
||||
"LoadWan2_2VaceFunModel",
|
||||
"LoadWanClipEncoderModel",
|
||||
"LoadWanFunLora",
|
||||
"LoadWanFunModel",
|
||||
"LoadWanLora",
|
||||
"LoadWanModel",
|
||||
"LoadWanTextEncoderModel",
|
||||
"LoadWanTransformerModel",
|
||||
"LoadWanVAEModel",
|
||||
"LoadZImageControlNetInModel",
|
||||
"LoadZImageControlNetInPipeline",
|
||||
"LoadZImageLora",
|
||||
"LoadZImageModel",
|
||||
"LoadZImageTextEncoderModel",
|
||||
"LoadZImageTransformerModel",
|
||||
"LoadZImageVAEModel",
|
||||
"MidnightLook-AnyToString",
|
||||
"MidnightLook-CanvasExpand",
|
||||
"MidnightLook-CropDataToBBox",
|
||||
"MidnightLook-CropForInpaint",
|
||||
"MidnightLook-DeepFaceCrop",
|
||||
"MidnightLook-DeepFaceVerify",
|
||||
"MidnightLook-Detailer",
|
||||
"MidnightLook-DisplayAny",
|
||||
"MidnightLook-ExpandCropMask",
|
||||
"MidnightLook-GrowMaskWithBlur",
|
||||
"MidnightLook-ImageCompare",
|
||||
"MidnightLook-IterativeUpscale",
|
||||
"MidnightLook-LatentSizePresets",
|
||||
"MidnightLook-LoadImageByURL",
|
||||
"MidnightLook-LoopEnd",
|
||||
"MidnightLook-LoopStart",
|
||||
"MidnightLook-MediaPipeFaceCrop",
|
||||
"MidnightLook-PasteAfterInpaint",
|
||||
"MidnightLook-PreFill",
|
||||
"MidnightLook-PresetPrompt",
|
||||
"MidnightLook-Qwen25Load",
|
||||
"MidnightLook-Qwen25Run",
|
||||
"MidnightLook-QwenGuidance",
|
||||
"MidnightLook-QwenSmartCropPad",
|
||||
"MidnightLook-SAM2Loader",
|
||||
"MidnightLook-StringToBBox",
|
||||
"MidnightLook-TextBox",
|
||||
"MidnightLook-URLLoRALoader",
|
||||
"MidnightLook-UploadToR2",
|
||||
"MidnightLook-UpscalerProvider",
|
||||
"MidnightLook-VRAMClear",
|
||||
"MidnightLook-ZImageCNLoader",
|
||||
"MidnightLook-ZImageCNSampler",
|
||||
"MidnightLook-ZImageInpaintSampler",
|
||||
"MidnightLook-ZImageLoader",
|
||||
"MidnightLook-ZImageOutpaintSampler",
|
||||
"MidnightLook-ZImagePrompt",
|
||||
"PassThroughImage",
|
||||
"QwenImageControlSampler",
|
||||
"QwenImageEditPlusSampler",
|
||||
"QwenImageEditSampler",
|
||||
"QwenImageT2VSampler",
|
||||
"VideoToCanny",
|
||||
"VideoToDepth",
|
||||
"VideoToOpenpose",
|
||||
"Wan2_2FunInpaintSampler",
|
||||
"Wan2_2FunT2VSampler",
|
||||
"Wan2_2FunV2VSampler",
|
||||
"Wan2_2I2VSampler",
|
||||
"Wan2_2T2VSampler",
|
||||
"Wan2_2VaceFunSampler",
|
||||
"WanFunInpaintSampler",
|
||||
"WanFunT2VSampler",
|
||||
"WanFunV2VSampler",
|
||||
"WanI2VSampler",
|
||||
"WanT2VSampler",
|
||||
"ZImageControlSampler",
|
||||
"ZImageT2ISampler"
|
||||
],
|
||||
{
|
||||
"title_aux": "fyUI-MidnightLook [WIP]"
|
||||
}
|
||||
],
|
||||
"https://github.com/Soliton80/ComfyUI-Watermark-Detection-YOLO": [
|
||||
[
|
||||
"WatermarkDetector",
|
||||
@ -4996,6 +4834,8 @@
|
||||
],
|
||||
"https://github.com/StableDiffusionVN/SDVN_Comfy_node": [
|
||||
[
|
||||
"InpaintCropImproved",
|
||||
"InpaintStitchImproved",
|
||||
"SDVM Image List Repeat",
|
||||
"SDVN API chatbot",
|
||||
"SDVN Any From List",
|
||||
@ -5459,6 +5299,17 @@
|
||||
"title_aux": "ComfyUI-yolov5-face [WIP]"
|
||||
}
|
||||
],
|
||||
"https://github.com/V-woodpecker-V/comfyui-stiffy-nodes": [
|
||||
[
|
||||
"StiffyComboNode",
|
||||
"StiffyComplexPresetNode",
|
||||
"StiffyDecoderNode",
|
||||
"StiffySimplePresetNode"
|
||||
],
|
||||
{
|
||||
"title_aux": "comfyui-stiffy-nodes"
|
||||
}
|
||||
],
|
||||
"https://github.com/VectorASD/ComfyUI-VectorASD": [
|
||||
[
|
||||
"ASD_CLIPLoader",
|
||||
@ -5808,6 +5659,7 @@
|
||||
"BlenderCombineXYZ",
|
||||
"BlenderCrop",
|
||||
"BlenderGamma",
|
||||
"BlenderGradientTexture",
|
||||
"BlenderHueSaturationValue",
|
||||
"BlenderInvertColor",
|
||||
"BlenderLensDistortion",
|
||||
@ -6474,6 +6326,7 @@
|
||||
"https://github.com/baoanhng/ComfyUI-utils": [
|
||||
[
|
||||
"TextJoiner",
|
||||
"TextJoinerTags",
|
||||
"TextSplitter"
|
||||
],
|
||||
{
|
||||
@ -6495,13 +6348,13 @@
|
||||
],
|
||||
"https://github.com/basenc/Comfyui-Nodes-basenc": [
|
||||
[
|
||||
"ChatMessagesCreate",
|
||||
"CustomOpenAIChatCompletion",
|
||||
"CustomOpenAIResponse",
|
||||
"DimensionsPresetPicker",
|
||||
"EnvVarNode",
|
||||
"Eval",
|
||||
"JMESPathSelect",
|
||||
"RescaleToDimensions",
|
||||
"ResponseInputAppend",
|
||||
"WanVideoSize"
|
||||
],
|
||||
{
|
||||
@ -7167,6 +7020,7 @@
|
||||
"https://github.com/comfyanonymous/ComfyUI": [
|
||||
[
|
||||
"APG",
|
||||
"ARVideoI2V",
|
||||
"AddNoise",
|
||||
"AlignYourStepsScheduler",
|
||||
"AudioAdjustVolume",
|
||||
@ -7190,6 +7044,8 @@
|
||||
"ByteDance2FirstLastFrameNode",
|
||||
"ByteDance2ReferenceNode",
|
||||
"ByteDance2TextToVideoNode",
|
||||
"ByteDanceCreateImageAsset",
|
||||
"ByteDanceCreateVideoAsset",
|
||||
"ByteDanceFirstLastFrameNode",
|
||||
"ByteDanceImageNode",
|
||||
"ByteDanceImageReferenceNode",
|
||||
@ -7275,6 +7131,7 @@
|
||||
"ElevenLabsTextToSoundEffects",
|
||||
"ElevenLabsTextToSpeech",
|
||||
"ElevenLabsVoiceSelector",
|
||||
"EmptyARVideoLatent",
|
||||
"EmptyAceStep1.5LatentAudio",
|
||||
"EmptyAceStepLatentAudio",
|
||||
"EmptyAudio",
|
||||
@ -7307,6 +7164,8 @@
|
||||
"FluxProExpandNode",
|
||||
"FluxProFillNode",
|
||||
"FluxProUltraImageNode",
|
||||
"FrameInterpolate",
|
||||
"FrameInterpolationModelLoader",
|
||||
"FreSca",
|
||||
"FreeU",
|
||||
"FreeU_V2",
|
||||
@ -7318,6 +7177,7 @@
|
||||
"GeminiImageNode",
|
||||
"GeminiInputFiles",
|
||||
"GeminiNanoBanana2",
|
||||
"GeminiNanoBanana2V2",
|
||||
"GeminiNode",
|
||||
"GenerateTracks",
|
||||
"GetImageSize",
|
||||
@ -7329,6 +7189,10 @@
|
||||
"GrokVideoNode",
|
||||
"GrokVideoReferenceNode",
|
||||
"GrowMask",
|
||||
"HappyHorseImageToVideoApi",
|
||||
"HappyHorseReferenceVideoApi",
|
||||
"HappyHorseTextToVideoApi",
|
||||
"HappyHorseVideoEditApi",
|
||||
"HitPawGeneralImageEnhance",
|
||||
"HitPawVideoEnhance",
|
||||
"Hunyuan3Dv2Conditioning",
|
||||
@ -7413,7 +7277,6 @@
|
||||
"LTXAVTextEncoderLoader",
|
||||
"LTXVAddGuide",
|
||||
"LTXVAudioVAEDecode",
|
||||
"LTXVAudioVAEEncode",
|
||||
"LTXVAudioVAELoader",
|
||||
"LTXVConcatAVLatent",
|
||||
"LTXVConditioning",
|
||||
@ -7453,6 +7316,7 @@
|
||||
"LazyCache",
|
||||
"Load3D",
|
||||
"LoadAudio",
|
||||
"LoadBackgroundRemovalModel",
|
||||
"LoadImage",
|
||||
"LoadImageDataSetFromFolder",
|
||||
"LoadImageMask",
|
||||
@ -7472,8 +7336,10 @@
|
||||
"LtxvApiImageToVideo",
|
||||
"LtxvApiTextToVideo",
|
||||
"LumaConceptsNode",
|
||||
"LumaImageEditNode2",
|
||||
"LumaImageModifyNode",
|
||||
"LumaImageNode",
|
||||
"LumaImageNode2",
|
||||
"LumaImageToVideoNode",
|
||||
"LumaReferenceNode",
|
||||
"LumaVideoNode",
|
||||
@ -7529,9 +7395,6 @@
|
||||
"ModelSamplingSD3",
|
||||
"ModelSamplingStableCascade",
|
||||
"ModelSave",
|
||||
"MoonvalleyImg2VideoNode",
|
||||
"MoonvalleyTxt2VideoNode",
|
||||
"MoonvalleyVideo2VideoNode",
|
||||
"Morphology",
|
||||
"NAGuidance",
|
||||
"NormalizeVideoLatentStart",
|
||||
@ -7542,6 +7405,7 @@
|
||||
"OpenAIGPTImage1",
|
||||
"OpenAIInputFiles",
|
||||
"OpenAIVideoSora2",
|
||||
"OpticalFlowLoader",
|
||||
"OptimalStepsScheduler",
|
||||
"Painter",
|
||||
"PatchModelAddDownscale",
|
||||
@ -7595,6 +7459,7 @@
|
||||
"RegexExtract",
|
||||
"RegexMatch",
|
||||
"RegexReplace",
|
||||
"RemoveBackground",
|
||||
"RenormCFG",
|
||||
"RepeatImageBatch",
|
||||
"RepeatLatentBatch",
|
||||
@ -7616,6 +7481,10 @@
|
||||
"RunwayImageToVideoNodeGen3a",
|
||||
"RunwayImageToVideoNodeGen4",
|
||||
"RunwayTextToImageNode",
|
||||
"SAM3_Detect",
|
||||
"SAM3_TrackPreview",
|
||||
"SAM3_TrackToMask",
|
||||
"SAM3_VideoTrack",
|
||||
"SDPoseDrawKeypoints",
|
||||
"SDPoseFaceBBoxes",
|
||||
"SDPoseKeypointExtractor",
|
||||
@ -7624,6 +7493,7 @@
|
||||
"SUPIRApply",
|
||||
"SV3D_Conditioning",
|
||||
"SVD_img2vid_Conditioning",
|
||||
"SamplerARVideo",
|
||||
"SamplerCustom",
|
||||
"SamplerCustomAdvanced",
|
||||
"SamplerDPMAdaptative",
|
||||
@ -7769,6 +7639,7 @@
|
||||
"TomePatchModel",
|
||||
"TopazImageEnhance",
|
||||
"TopazVideoEnhance",
|
||||
"TopazVideoEnhanceV2",
|
||||
"TorchCompileModel",
|
||||
"TrainLoraNode",
|
||||
"TrimAudioDuration",
|
||||
@ -7799,8 +7670,14 @@
|
||||
"VAEEncodeTiled",
|
||||
"VAELoader",
|
||||
"VAESave",
|
||||
"VOIDInpaintConditioning",
|
||||
"VOIDQuadmaskPreprocess",
|
||||
"VOIDSampler",
|
||||
"VOIDWarpedNoise",
|
||||
"VOIDWarpedNoiseSource",
|
||||
"VPScheduler",
|
||||
"Veo3FirstLastFrameNode",
|
||||
"Veo3VideoGenerationNode",
|
||||
"VeoVideoGenerationNode",
|
||||
"Video Slice",
|
||||
"VideoLinearCFGGuidance",
|
||||
@ -9121,6 +8998,7 @@
|
||||
"HolafLutGenerator",
|
||||
"HolafLutSaver",
|
||||
"HolafMaskToBoolean",
|
||||
"HolafNucleusImage",
|
||||
"HolafOverlayNode",
|
||||
"HolafRemote",
|
||||
"HolafRemoteSelector",
|
||||
@ -10509,15 +10387,6 @@
|
||||
"title_aux": "ComfyUI_was_image"
|
||||
}
|
||||
],
|
||||
"https://github.com/krakenunbound/kraken-discord-bot": [
|
||||
[
|
||||
"KrakenDiscordBot",
|
||||
"KrakenDiscordBotStatus"
|
||||
],
|
||||
{
|
||||
"title_aux": "Kraken Discord Bot"
|
||||
}
|
||||
],
|
||||
"https://github.com/krich-cto/ComfyUI-Flow-Control": [
|
||||
[
|
||||
"CLIPLoaderGGUF",
|
||||
@ -10656,18 +10525,25 @@
|
||||
],
|
||||
"https://github.com/lazybuttalented/ComfyUI_LBT": [
|
||||
[
|
||||
"LBT_BooleanAND",
|
||||
"LBT_CombineImagesFromBatch",
|
||||
"LBT_CombineImagesFromList",
|
||||
"LBT_CropByMask",
|
||||
"LBT_GetFolderInfo",
|
||||
"LBT_ListInfo",
|
||||
"LBT_LoadImageFromPath",
|
||||
"LBT_LoadImagesFromFolder",
|
||||
"LBT_LoadImagesFromList",
|
||||
"LBT_LoadMultilineText",
|
||||
"LBT_LoadTextFromFolder",
|
||||
"LBT_LoadVideoFromFolder",
|
||||
"LBT_SaveImage",
|
||||
"LBT_SaveVideo",
|
||||
"LBT_ShowTextEditable",
|
||||
"LBT_StringToList",
|
||||
"LBT_TextImageLibraryComparison"
|
||||
"LBT_SwitchNoPause",
|
||||
"LBT_TextImageLibraryComparison",
|
||||
"LBT_TextKeywordMatch"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI_LBT [WIP]"
|
||||
@ -11340,12 +11216,18 @@
|
||||
"KM_Aspect_Ratio_Selector2",
|
||||
"KM_CFGGuider",
|
||||
"KM_Color_Correct",
|
||||
"KM_Color_Match",
|
||||
"KM_Downscale_Image",
|
||||
"KM_Extract_Images",
|
||||
"KM_Merge_Images",
|
||||
"KM_Resize_Image",
|
||||
"KM_Resize_Image_With_Model",
|
||||
"KM_Safe_Mask_Bounds",
|
||||
"KM_Safe_SEGS_Bounds",
|
||||
"KM_Select_Every_Nth_Image",
|
||||
"KM_Select_Image",
|
||||
"KM_Split_Images",
|
||||
"KM_Video_Blend",
|
||||
"KM_Video_Image_Color_Match",
|
||||
"KM_WanVideoToVideo",
|
||||
"WanImageToVideo"
|
||||
@ -11755,6 +11637,45 @@
|
||||
"title_aux": "ComfyUI-TextOverlay"
|
||||
}
|
||||
],
|
||||
"https://github.com/nekotxt/ComfyUI-NTX-support-nodes": [
|
||||
[
|
||||
"ApplyLoraStack",
|
||||
"AutogrowNode",
|
||||
"CLIPTextEncodeWithCutoff",
|
||||
"CollectModelNtxdata",
|
||||
"ConvertLoraStackToString",
|
||||
"ConvertLoraStringToStack",
|
||||
"CreateImageLatent",
|
||||
"DictGet",
|
||||
"DictSet",
|
||||
"DictSetMulti",
|
||||
"DynamicComboNode",
|
||||
"DynamicTwinNode",
|
||||
"GenerationDataGet",
|
||||
"GenerationDataMaxSize",
|
||||
"GenerationDataSet",
|
||||
"ListCount",
|
||||
"ListGet",
|
||||
"ListSet",
|
||||
"LoadCharInfo",
|
||||
"LoadCharacterInfo",
|
||||
"LoadCheckpointInfo",
|
||||
"LoadCustomVae",
|
||||
"LoraStack",
|
||||
"MergeLoraStacks",
|
||||
"PipeBase",
|
||||
"PromptChainer",
|
||||
"ReplaceTextParameters",
|
||||
"RerouteBase",
|
||||
"SaveMultipleImages",
|
||||
"SwitchAny",
|
||||
"SwitchNode",
|
||||
"Test"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-NTX-support-nodes [WIP]"
|
||||
}
|
||||
],
|
||||
"https://github.com/neo0801/my-comfy-node": [
|
||||
[
|
||||
"DeepMosaicGetImageMosaicMask",
|
||||
@ -11889,9 +11810,11 @@
|
||||
"LoRATextDualInput",
|
||||
"LoraToCivitaiUrl",
|
||||
"LoraWildcardGenerator",
|
||||
"LoraWildcardGeneratorV2",
|
||||
"RepeatTextLines",
|
||||
"SDPromptSaverOptimized",
|
||||
"SDPromptSaverWithCompression",
|
||||
"SeedStepN",
|
||||
"TIPONobinCustom",
|
||||
"TextSplit3"
|
||||
],
|
||||
{
|
||||
@ -12334,6 +12257,7 @@
|
||||
"przewodo ImageScaleFactor",
|
||||
"przewodo ImageSizer",
|
||||
"przewodo IsInputDisabled",
|
||||
"przewodo LTXVAEDriftFix",
|
||||
"przewodo LtxKeyFrameIndexes",
|
||||
"przewodo SendFirstValidValue",
|
||||
"przewodo SwapAnyComparison",
|
||||
@ -12405,38 +12329,6 @@
|
||||
"title_aux": "ComfyUI-Qimi-Tiler"
|
||||
}
|
||||
],
|
||||
"https://github.com/qlikpetersen/ComfyUI-AI_Tools": [
|
||||
[
|
||||
"CreateListJSON",
|
||||
"CreateListString",
|
||||
"DoLogin",
|
||||
"FixLinksAndRevLinks",
|
||||
"HttpRequest",
|
||||
"Image_Attachment",
|
||||
"IncludeInSpiderData",
|
||||
"JSON_Attachment",
|
||||
"Json2String",
|
||||
"LoadSpiderData",
|
||||
"PNGtoImage",
|
||||
"Query_OpenAI",
|
||||
"RemoveCircularReferences",
|
||||
"RunPython",
|
||||
"RunPythonGriptapeTool",
|
||||
"SaveSpiderData",
|
||||
"SpiderCrawl",
|
||||
"SpiderSplit",
|
||||
"String2Json",
|
||||
"String_Attachment",
|
||||
"TextMultiSave"
|
||||
],
|
||||
{
|
||||
"author": "kierdran",
|
||||
"description": "Tools for agentic testing",
|
||||
"nickname": "ai_tools",
|
||||
"title": "AI_Tools",
|
||||
"title_aux": "ComfyUI-AI_Tools [UNSAFE]"
|
||||
}
|
||||
],
|
||||
"https://github.com/quinteroac/comfyui_api_executor_nodes": [
|
||||
[
|
||||
"AnyTo",
|
||||
@ -12599,6 +12491,7 @@
|
||||
"Seed 32-bit [Eclipse]",
|
||||
"Seed [Eclipse]",
|
||||
"Show Any [Eclipse]",
|
||||
"Show Text [Eclipse]",
|
||||
"Smart Detection [Eclipse]",
|
||||
"Smart Detection [SML]",
|
||||
"Smart Folder [Eclipse]",
|
||||
@ -12869,12 +12762,18 @@
|
||||
"Canny Edge",
|
||||
"Combine RGB Channels",
|
||||
"Create Empty Frames",
|
||||
"Crop Guide Frames",
|
||||
"Get Image Dimensions",
|
||||
"Image Grayscale",
|
||||
"LTXVMultiKeyframeGuide",
|
||||
"LTXVMultiLatentGuide",
|
||||
"Load Image Folder",
|
||||
"Load Images",
|
||||
"Load Images From List",
|
||||
"Pad Batch to 4n+1",
|
||||
"Pad Batch to kn+1",
|
||||
"Repeat Frames",
|
||||
"Resample Frames",
|
||||
"Resize Frame",
|
||||
"Save Image Folder",
|
||||
"Select Image From Batch",
|
||||
@ -13541,40 +13440,6 @@
|
||||
"title_aux": "ComfyUI-StalkerVr"
|
||||
}
|
||||
],
|
||||
"https://github.com/stalkervr/comfyui-custom-path-nodes": [
|
||||
[
|
||||
"AnyCollector",
|
||||
"ContextPipeIn",
|
||||
"ContextPipeOut",
|
||||
"ContextPipeReroute",
|
||||
"DataFileLoader",
|
||||
"ImageAspectRatioFixer",
|
||||
"ImageBatchCrop",
|
||||
"ImageGridCropper",
|
||||
"JsonArraySplitter",
|
||||
"JsonFieldRemover",
|
||||
"JsonFieldReplaceAdvanced",
|
||||
"JsonFieldValueExtractor",
|
||||
"JsonPathLoader",
|
||||
"JsonPromptToTextPromptConverter",
|
||||
"JsonToString",
|
||||
"ListItemExtractor",
|
||||
"LoopAny",
|
||||
"PathPipeIn",
|
||||
"PathPipeOut",
|
||||
"PathPipeReroute",
|
||||
"PromptPartJoin",
|
||||
"SavePath",
|
||||
"StringCollector",
|
||||
"StringConcatenation",
|
||||
"StringListToString",
|
||||
"StringWrapper",
|
||||
"WanVideoMultiPrompt"
|
||||
],
|
||||
{
|
||||
"title_aux": "comfyui-custom-path-nodes [UNSAFE]"
|
||||
}
|
||||
],
|
||||
"https://github.com/starsFriday/ComfyUI-Audio-Subtitle": [
|
||||
[
|
||||
"AudioSubtitle"
|
||||
@ -13765,7 +13630,8 @@
|
||||
"Supaidauen_Text_Concat",
|
||||
"Supaidauen_Text_Replace",
|
||||
"Supaidauen_Text_Wildcard",
|
||||
"Supaidauen_Text_w_Options_Replace_LoRA"
|
||||
"Supaidauen_Text_w_Options_Replace_LoRA",
|
||||
"Supaidauen_ZippedPromptFromTextAdvanced"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-supaidauen [WIP]"
|
||||
@ -13944,14 +13810,6 @@
|
||||
"title_aux": "mc_audio"
|
||||
}
|
||||
],
|
||||
"https://github.com/tfernd/ComfyUI-AutoCPUOffload": [
|
||||
[
|
||||
"AutoCPUOffload"
|
||||
],
|
||||
{
|
||||
"title_aux": "Auto CPU Offload for ComfyUI [WIP]"
|
||||
}
|
||||
],
|
||||
"https://github.com/tg-tjmitchell/comfyui-custom-node-lister": [
|
||||
[
|
||||
"CustomNodeLister"
|
||||
@ -15052,20 +14910,6 @@
|
||||
"title_aux": "ComfyUI-SEQLToolNode"
|
||||
}
|
||||
],
|
||||
"https://github.com/yojimbodayne/ComfyUI-Dropbox-API": [
|
||||
[
|
||||
"FetchTokenFromDropbox",
|
||||
"PostImagesToDropboxAPI",
|
||||
"PostPromptsToDropboxAPI",
|
||||
"PullImagesFromDropboxAPI",
|
||||
"PullTextFromDropboxAPI",
|
||||
"PullVideosFromDropboxAPI",
|
||||
"VideoCombineAndExportToDropboxAPI"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-Dropbox-API [WIP]"
|
||||
}
|
||||
],
|
||||
"https://github.com/yuvraj108c/ComfyUI-HYPIR": [
|
||||
[
|
||||
"HYPIRProcess",
|
||||
@ -15223,6 +15067,7 @@
|
||||
"MultiLineOperationZV",
|
||||
"PatternFillNodeZV",
|
||||
"ProductionDisplacementMapNodeZV",
|
||||
"PromptSelectorWithTimeoutZV",
|
||||
"RandomSelectListZV",
|
||||
"SaveImageToPathZV",
|
||||
"SaveTxtToPathZV",
|
||||
@ -15231,6 +15076,7 @@
|
||||
"TxtCounterNodeZV",
|
||||
"UniversalBBOXToMaskZV",
|
||||
"Veo31Image2VideoSubmitZV",
|
||||
"VideoCounterNodeZV",
|
||||
"VideoGeneratorFFmpegZV",
|
||||
"VideoSceneDetectorZV",
|
||||
"VideoSpeedZV",
|
||||
@ -15255,21 +15101,6 @@
|
||||
"title_aux": "ComfyUI-prompt-library"
|
||||
}
|
||||
],
|
||||
"https://github.com/zinigo-creations/comfyui-prompt-builder": [
|
||||
[
|
||||
"ActionNode",
|
||||
"CharacterNode",
|
||||
"CombinePromptNode",
|
||||
"CompositionNode",
|
||||
"EnvironmentNode",
|
||||
"NSFWNode",
|
||||
"PresetCharacterNode",
|
||||
"StylePresetNode"
|
||||
],
|
||||
{
|
||||
"title_aux": "Prompt Builder [NAME CONFLICT]"
|
||||
}
|
||||
],
|
||||
"https://github.com/zjkhurry/comfyui_MetalFX": [
|
||||
[
|
||||
"metalFXImg"
|
||||
@ -15315,14 +15146,6 @@
|
||||
"title_aux": "ComfyUI Stash"
|
||||
}
|
||||
],
|
||||
"https://raw.githubusercontent.com/jp0215/comfyUI_padding-resize_node/main/PaddingNode.py": [
|
||||
[
|
||||
"function"
|
||||
],
|
||||
{
|
||||
"title_aux": "comfyUI_padding-resize_node"
|
||||
}
|
||||
],
|
||||
"https://raw.githubusercontent.com/komojini/ComfyUI_Prompt_Template_CustomNodes/main/prompt_with_template.py": [
|
||||
[
|
||||
"ObjectPromptWithTemplate",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,125 @@
|
||||
{
|
||||
"custom_nodes": [
|
||||
{
|
||||
"author": "yojimbodayne",
|
||||
"title": "ComfyUI-Dropbox-API [WIP] [REMOVED]",
|
||||
"reference": "https://github.com/yojimbodayne/ComfyUI-Dropbox-API",
|
||||
"files": [
|
||||
"https://github.com/yojimbodayne/ComfyUI-Dropbox-API"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This custom nodepackage for ComfyUI allows users to interact with Dropbox API, enabling image, text, and video uploads, downloads, and management directly from ComfyUI workflows.\nNOTE: The files in the repo are not organized."
|
||||
},
|
||||
{
|
||||
"author": "tfernd",
|
||||
"title": "Auto CPU Offload for ComfyUI [WIP] [REMOVED]",
|
||||
"reference": "https://github.com/tfernd/ComfyUI-AutoCPUOffload",
|
||||
"files": [
|
||||
"https://github.com/tfernd/ComfyUI-AutoCPUOffload"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This extension introduces an 'Auto CPU Offload' node designed to reduce GPU VRAM usage by automatically offloading model components to the CPU. It intelligently manages the movement of model layers between the GPU and CPU, aiming to keep only the necessary parts in VRAM during inference."
|
||||
},
|
||||
{
|
||||
"author": "stalkervr",
|
||||
"title": "Custom Path Nodes for ComfyUI [UNSAFE] [REMOVED]",
|
||||
"reference": "https://github.com/stalkervr/comfyui-custom-path-nodes",
|
||||
"files": [
|
||||
"https://github.com/stalkervr/comfyui-custom-path-nodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes for path handling and image cropping.[w/This nodepack contains a node that has a vulnerability allowing access to arbitrary file paths.]"
|
||||
},
|
||||
{
|
||||
"author": "Charonartist",
|
||||
"title": "ComfyUI-send-eagle-pro [REMOVED]",
|
||||
"reference": "https://github.com/Charonartist/ComfyUI-send-eagle-pro_2",
|
||||
"files": [
|
||||
"https://github.com/Charonartist/ComfyUI-send-eagle-pro_2"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Eagle integration extension node for ComfyUI (Pro version)"
|
||||
},
|
||||
{
|
||||
"author": "Charonartist",
|
||||
"title": "ComfyUI LoRA Random Selector [REMOVED]",
|
||||
"reference": "https://github.com/Charonartist/comfyui-lora-random-selector",
|
||||
"files": [
|
||||
"https://github.com/Charonartist/comfyui-lora-random-selector"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "NODES: WanMoeKSampler, WanMoeKSamplerAdvanced"
|
||||
},
|
||||
{
|
||||
"author": "bpmpnaito",
|
||||
"title": "comfyui-imageviewer [REMOVED]",
|
||||
"reference": "https://github.com/bpmpnaito/comfyui-imageviewer",
|
||||
"files": [
|
||||
"https://github.com/bpmpnaito/comfyui-imageviewer"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Image viewer node that displays preview of images directly in the node."
|
||||
},
|
||||
{
|
||||
"author": "leonardomiramondi",
|
||||
"title": "Flux Context ComfyUI Node [REMOVED]",
|
||||
"reference": "https://github.com/leonardomiramondi/flux-context-comfyui",
|
||||
"files": [
|
||||
"https://github.com/leonardomiramondi/flux-context-comfyui"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI node for Flux Context (Kontext) image editing"
|
||||
},
|
||||
{
|
||||
"author": "Charonartist",
|
||||
"title": "comfyui-lmstudio-conversation [REMOVED]",
|
||||
"reference": "https://github.com/Charonartist/comfyui-lmstudio-conversation",
|
||||
"files": [
|
||||
"https://github.com/Charonartist/comfyui-lmstudio-conversation"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI custom nodes for LM Studio integration with conversation history support "
|
||||
},
|
||||
{
|
||||
"author": "Charonartist",
|
||||
"title": "comfyui-last-frame-extractor [REMOVED]",
|
||||
"reference": "https://github.com/Charonartist/comfyui-last-frame-extractor",
|
||||
"files": [
|
||||
"https://github.com/Charonartist/comfyui-last-frame-extractor"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This is a ComfyUI custom node that extracts the last frame (image) from an input image batch. It is particularly useful when you want to obtain the final scene or frame in a video generation workflow."
|
||||
},
|
||||
{
|
||||
"author": "Charonartist",
|
||||
"title": "ComfyUI Tag Remover [REMOVED]",
|
||||
"reference": "https://github.com/Charonartist/comfyui-tag-remover",
|
||||
"files": [
|
||||
"https://github.com/Charonartist/comfyui-tag-remover"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI custom node for removing specified tags and their content from text"
|
||||
},
|
||||
{
|
||||
"author": "Charonartist",
|
||||
"title": "ComfyUI Smart Resize Node [REMOVED]",
|
||||
"reference": "https://github.com/Charonartist/comfyui-smart-resize-node",
|
||||
"files": [
|
||||
"https://github.com/Charonartist/comfyui-smart-resize-node"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Smart resize node for ComfyUI that handles portrait/landscape images with short/long side specification"
|
||||
},
|
||||
{
|
||||
"author": "Charonartist",
|
||||
"title": "ComfyUI Auto LoRA [REMOVED]",
|
||||
"reference": "https://github.com/Charonartist/comfyui-auto-lora-v2",
|
||||
"files": [
|
||||
"https://github.com/Charonartist/comfyui-auto-lora-v2"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This is a ComfyUI custom node that automatically detects trigger words from text prompts and applies the corresponding LoRA models."
|
||||
},
|
||||
{
|
||||
"author": "qlikpetersen",
|
||||
"title": "ComfyUI-AI_Tools [UNSAFE] [REMOVED]",
|
||||
|
||||
@ -1,5 +1,235 @@
|
||||
{
|
||||
"custom_nodes": [
|
||||
{
|
||||
"author": "artemko7v",
|
||||
"title": "ComfyUI Complex Prompt Nodes",
|
||||
"reference": "https://github.com/ArtemKo7v/ComfyUI-Complex-Prompt",
|
||||
"files": [
|
||||
"https://github.com/ArtemKo7v/ComfyUI-Complex-Prompt"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI node for working with complex prompts with support for variables, randomness, and basic logic."
|
||||
},
|
||||
{
|
||||
"author": "orion4d",
|
||||
"title": "Orion4D_AutoCachedPreview",
|
||||
"reference": "https://github.com/orion4d/Orion4D_AutoCachedPreview",
|
||||
"files": [
|
||||
"https://github.com/orion4d/Orion4D_AutoCachedPreview"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A custom node for ComfyUI that allows you to cache an image and its mask to avoid recalculating upstream steps in your workflow."
|
||||
},
|
||||
{
|
||||
"author": "alikonfilms",
|
||||
"title": "comfyui-alikonfilms",
|
||||
"reference": "https://github.com/alikonfilms/comfyui_alikonfilms",
|
||||
"files": [
|
||||
"https://github.com/alikonfilms/comfyui_alikonfilms"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A CLIP text encoder with 18 cinematic camera movement presets (dolly, pan, tilt, zoom, orbit and more). Subject-aware and free-camera modes, blend slider to mix your prompt with camera movements, and a live text output to preview the final prompt."
|
||||
},
|
||||
{
|
||||
"author": "mexxmillion",
|
||||
"title": "ComfyUI-VLMPrompt",
|
||||
"reference": "https://github.com/mexxmillion/ComfyUI-VLMPrompt",
|
||||
"files": [
|
||||
"https://github.com/mexxmillion/ComfyUI-VLMPrompt"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI custom nodes for local VLM prompt generation with GGUF and Hugging Face backends."
|
||||
},
|
||||
{
|
||||
"author": "hassan-mb",
|
||||
"title": "HB ComfyUI Nodes",
|
||||
"reference": "https://github.com/HassanEclipse/comfyui-hb-party",
|
||||
"files": [
|
||||
"https://github.com/HassanEclipse/comfyui-hb-party"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Utility nodes for ComfyUI featuring a dynamic Text Preset Switch with workflow-safe persistence and Node 2.0 support."
|
||||
},
|
||||
{
|
||||
"author": "rikanrino",
|
||||
"title": "Rikannodes",
|
||||
"reference": "https://github.com/rikanrino/Rikannodes",
|
||||
"files": [
|
||||
"https://github.com/rikanrino/Rikannodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "kijai ComfyUI-PromptRelay with fps and max frame output"
|
||||
},
|
||||
{
|
||||
"author": "Cordux",
|
||||
"title": "ComfyUI-PromptTagBuilder",
|
||||
"reference": "https://github.com/Cordux/ComfyUI-PromptTagBuilder",
|
||||
"files": [
|
||||
"https://github.com/Cordux/ComfyUI-PromptTagBuilder"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Flexible ComfyUI node that simplifies prompt building through organized dropdown categories for tag-based models."
|
||||
},
|
||||
{
|
||||
"author": "GeekatplayStudio",
|
||||
"title": "ComfyUI-cluster",
|
||||
"reference": "https://github.com/GeekatplayStudio/ComfyUI-cluster",
|
||||
"files": [
|
||||
"https://github.com/GeekatplayStudio/ComfyUI-cluster"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Ollama-driven routing nodes and curated workflows for ComfyUI with checkpoint, LoRA, and Flux split-component flows plus image-guided variants using vision analysis."
|
||||
},
|
||||
{
|
||||
"author": "cowneko",
|
||||
"title": "CWK_Checkpoints_Preset_Manager",
|
||||
"reference": "https://github.com/cowneko/CWK_Checkpoints_Preset_Manager",
|
||||
"files": [
|
||||
"https://github.com/cowneko/CWK_Checkpoints_Preset_Manager"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI node combining per-model preset system with full-featured model manager, CivitAI integration, and GGUF support for browsing and organizing checkpoints."
|
||||
},
|
||||
{
|
||||
"author": "kijai",
|
||||
"title": "ComfyUI-NativeLooping_testing",
|
||||
"reference": "https://github.com/kijai/ComfyUI-NativeLooping_testing",
|
||||
"files": [
|
||||
"https://github.com/kijai/ComfyUI-NativeLooping_testing"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Temporary repository for testing candidate for native ComfyUI loop nodes. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "IA-gyz",
|
||||
"title": "comfyui-VarBoard",
|
||||
"reference": "https://github.com/IA-gyz/comfyui-VarBoard",
|
||||
"files": [
|
||||
"https://github.com/IA-gyz/comfyui-VarBoard"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Variables Board is a floating control center for ComfyUI workflows that centralizes parameters into a customizable overlay."
|
||||
},
|
||||
{
|
||||
"author": "wsq194",
|
||||
"title": "Yeban Workflow Manager",
|
||||
"reference": "https://github.com/wsq194/yeban-workflow-manager",
|
||||
"files": [
|
||||
"https://github.com/wsq194/yeban-workflow-manager"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A ComfyUI workflow manager plugin with auto-save, version history, sidebar integration and more."
|
||||
},
|
||||
{
|
||||
"author": "nekodificador",
|
||||
"title": "NKD Klein Tools",
|
||||
"reference": "https://github.com/Nekodificador/ComfyUI-NKD-Klein-Tools",
|
||||
"files": [
|
||||
"https://github.com/Nekodificador/ComfyUI-NKD-Klein-Tools"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "NKD Klein Presampling and Postsampling nodes for Flux Klein workflows in ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "szymonj",
|
||||
"title": "LoRA Range Loader",
|
||||
"reference": "https://github.com/esp-dev/comfyui-lora-range-loader",
|
||||
"files": [
|
||||
"https://github.com/esp-dev/comfyui-lora-range-loader"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI custom node: load a LoRA from current selection and automatically advance current within a first/last filename range."
|
||||
},
|
||||
{
|
||||
"author": "brosequist",
|
||||
"title": "comfyui-pipeline-barrier",
|
||||
"reference": "https://github.com/brosequist/ComfyUI-PipelineBarrier",
|
||||
"files": [
|
||||
"https://github.com/brosequist/ComfyUI-PipelineBarrier"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI node that force-flushes GPU caches between pipeline stages to prevent OOM kills"
|
||||
},
|
||||
{
|
||||
"author": "artemko7v",
|
||||
"title": "ComfyUI Prompt Enhance Nodes",
|
||||
"reference": "https://github.com/ArtemKo7v/ComfyUI-Prompt-Magic",
|
||||
"files": [
|
||||
"https://github.com/ArtemKo7v/ComfyUI-Prompt-Magic"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI prompt enhance nodes and string utilities"
|
||||
},
|
||||
{
|
||||
"author": "mitch-avis",
|
||||
"title": "ComfyUI-HoldCounter",
|
||||
"reference": "https://github.com/mitch-avis/ComfyUI-HoldCounter",
|
||||
"files": [
|
||||
"https://github.com/mitch-avis/ComfyUI-HoldCounter"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A ComfyUI custom node that emits a held, range-bound integer index with multiple advancement modes (loop, clamp, pingpong, random, shuffle) — useful as a Load Image batch index that advances every N runs."
|
||||
},
|
||||
{
|
||||
"author": "capacap",
|
||||
"title": "ComfyUI-Selective-Sigma-Detailer",
|
||||
"reference": "https://github.com/Capacap/ComfyUI-Selective-Sigma-Detailer",
|
||||
"files": [
|
||||
"https://github.com/Capacap/ComfyUI-Selective-Sigma-Detailer"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A ComfyUI sampler that boosts detail only in latent regions that are already dense at the moment the schedule activates."
|
||||
},
|
||||
{
|
||||
"author": "xav",
|
||||
"title": "XAV Anima Style Selector",
|
||||
"reference": "https://github.com/XAV-Games/comfyui-xav-anima-style-selector",
|
||||
"files": [
|
||||
"https://github.com/XAV-Games/comfyui-xav-anima-style-selector"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI nodes for quick and easy style selection for the Anima model"
|
||||
},
|
||||
{
|
||||
"author": "xxchinenxx",
|
||||
"title": "Qwen Clothing Selector",
|
||||
"reference": "https://github.com/xxchinenxx/ComfyUI-QwenClothingSelector",
|
||||
"files": [
|
||||
"https://github.com/xxchinenxx/ComfyUI-QwenClothingSelector"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI custom nodes for Qwen-Image-Edit outfit/clothing edits — toggles, presets, and identity-preserving prompt builders. Useful for fashion edits, costume changes, and outfit swaps."
|
||||
},
|
||||
{
|
||||
"author": "halr9000",
|
||||
"title": "Procgen 9000",
|
||||
"reference": "https://github.com/halr9000/procgen9000",
|
||||
"files": [
|
||||
"https://github.com/halr9000/procgen9000"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Procedural image generation toolkit designed as input to image edit workflows."
|
||||
},
|
||||
{
|
||||
"author": "amrnidal999-tech",
|
||||
"title": "Realisim Enhancor",
|
||||
"reference": "https://github.com/amrnidal999-tech/comfyui-realisim-enhancor",
|
||||
"files": [
|
||||
"https://github.com/amrnidal999-tech/comfyui-realisim-enhancor"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A ComfyUI image enhancement node with JPEG degradation, noise, blur, sharpening, contrast, and color controls."
|
||||
},
|
||||
{
|
||||
"author": "xmarre",
|
||||
"title": "ComfyUI-TIDE",
|
||||
"reference": "https://github.com/xmarre/ComfyUI-TIDE",
|
||||
"files": [
|
||||
"https://github.com/xmarre/ComfyUI-TIDE"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A ComfyUI custom node implementing TIDE (Text-Informed Dynamic Extrapolation with Step-Aware Temperature Control) for diffusion models."
|
||||
},
|
||||
{
|
||||
"author": "xmarre",
|
||||
"title": "ComfyUI-DiffAid-Patches",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user