Merge remote-tracking branch 'upstream/main' into image-chooser

This commit is contained in:
Chris 2023-09-25 08:17:50 +10:00
commit b5451c9200
16 changed files with 1408 additions and 401 deletions

View File

@ -45,6 +45,7 @@ This repository provides Colab notebooks that allow you to install and use Comfy
* Support for automatically installing dependencies of custom nodes upon restarting Colab notebooks. * Support for automatically installing dependencies of custom nodes upon restarting Colab notebooks.
## Changes ## Changes
* **0.29** Add `Update all` feature
* **0.25** support db channel * **0.25** support db channel
* You can directly modify the db channel settings in the `config.ini` file. * You can directly modify the db channel settings in the `config.ini` file.
* If you want to maintain a new DB channel, please modify the `channels.list` and submit a PR. * If you want to maintain a new DB channel, please modify the `channels.list` and submit a PR.
@ -95,6 +96,11 @@ This repository provides Colab notebooks that allow you to install and use Comfy
![model-install-dialog](misc/nickname.jpg) ![model-install-dialog](misc/nickname.jpg)
## How to register your custom node into ComfyUI-Manager
* Add an entry to `custom-node-list.json` located in the root of ComfyUI-Manager and submit a Pull Request.
* NOTE: Before submitting the PR after making changes, please check `Use local DB` and ensure that the extension list loads without any issues in the `Install custom nodes` dialog. Occasionally, missing or extra commas can lead to JSON syntax errors.
* The remaining JSON will be updated through scripts in the future, so you don't need to worry about it.
## Custom node support guide ## Custom node support guide
@ -131,6 +137,7 @@ NODE_CLASS_MAPPINGS.update({
""" """
``` ```
* **Special purpose files** (optional) * **Special purpose files** (optional)
* `node_list.js` - When your custom nodes pattern of NODE_CLASS_MAPPINGS is not conventional, it is used to manually provide a list of nodes for reference. ([example](https://github.com/melMass/comfy_mtb/raw/main/node_list.json)) * `node_list.js` - When your custom nodes pattern of NODE_CLASS_MAPPINGS is not conventional, it is used to manually provide a list of nodes for reference. ([example](https://github.com/melMass/comfy_mtb/raw/main/node_list.json))
* `requirements.txt` - When installing, this pip requirements will be installed automatically * `requirements.txt` - When installing, this pip requirements will be installed automatically
@ -155,17 +162,16 @@ NODE_CLASS_MAPPINGS.update({
## Troubleshooting ## Troubleshooting
* If your `git.exe` is installed in a specific location other than system git, please install ComfyUI-Manager and run ComfyUI. Then, specify the path including the file name in `git_exe = ` in the ComfyUI-Manager/config.ini file that is generated.
* If updating ComfyUI-Manager itself fails, please go to the **ComfyUI-Manager** directory and execute the command `git update-ref refs/remotes/origin/main a361cc1 && git fetch --all && git pull`. * If updating ComfyUI-Manager itself fails, please go to the **ComfyUI-Manager** directory and execute the command `git update-ref refs/remotes/origin/main a361cc1 && git fetch --all && git pull`.
* Alternatively, download the update-fix.py script from [update-fix.py](https://github.com/ltdrdata/ComfyUI-Manager/raw/main/scripts/update-fix.py) and place it in the ComfyUI-Manager directory. Then, run it using your Python command. * Alternatively, download the update-fix.py script from [update-fix.py](https://github.com/ltdrdata/ComfyUI-Manager/raw/main/scripts/update-fix.py) and place it in the ComfyUI-Manager directory. Then, run it using your Python command.
For the portable version, use `..\..\..\python_embeded\python.exe update-fix.py`. For the portable version, use `..\..\..\python_embeded\python.exe update-fix.py`.
* If Controlnet is set to skip_v1 true, nodes like `CannyEdgePreprocessor` will appear as extensions of missing nodes, but simply installing them is not enough, and direct modification of the user's config.yaml is required.
* For cases where nodes like `PreviewTextNode` from `ComfyUI_Custom_Nodes_AlekPet` are only supported as front-end nodes, we currently do not provide missing nodes for them. * For cases where nodes like `PreviewTextNode` from `ComfyUI_Custom_Nodes_AlekPet` are only supported as front-end nodes, we currently do not provide missing nodes for them.
* Currently, `vid2vid` is not being updated, causing compatibility issues. * Currently, `vid2vid` is not being updated, causing compatibility issues.
## TODO: Unconventional form of custom node list ## TODO: Unconventional form of custom node list
* https://github.com/bmad4ever/ComfyUI-Bmad-Custom-Nodes
* https://github.com/diontimmer/Sample-Diffusion-ComfyUI-Extension * https://github.com/diontimmer/Sample-Diffusion-ComfyUI-Extension
* https://github.com/senshilabs/NINJA-plugin * https://github.com/senshilabs/NINJA-plugin
@ -175,8 +181,8 @@ NODE_CLASS_MAPPINGS.update({
- [x] category/keyword filter - [x] category/keyword filter
- [x] Automatic recognition of missing custom nodes - [x] Automatic recognition of missing custom nodes
- [x] Automatic installation suggestion of missing custom nodes - [x] Automatic installation suggestion of missing custom nodes
- [x] 3rd party repository
- [ ] installation from git url - [ ] installation from git url
- [ ] 3rd party repository
- [ ] Specification of custom nodes - [ ] Specification of custom nodes
- [ ] Specification scanner - [ ] Specification scanner
- [ ] Search extension by node name - [ ] Search extension by node name

View File

@ -1,9 +1,10 @@
import configparser import configparser
import shutil import shutil
import folder_paths import folder_paths
import os, sys import os
import subprocess import sys
import threading import threading
import subprocess
def handle_stream(stream, prefix): def handle_stream(stream, prefix):
@ -55,7 +56,7 @@ sys.path.append('../..')
from torchvision.datasets.utils import download_url from torchvision.datasets.utils import download_url
# ensure .js # ensure .js
print("### Loading: ComfyUI-Manager (V0.26.2)") print("### Loading: ComfyUI-Manager (V0.30.4)")
comfy_ui_required_revision = 1240 comfy_ui_required_revision = 1240
comfy_ui_revision = "Unknown" comfy_ui_revision = "Unknown"
@ -91,6 +92,7 @@ def write_config():
config['default'] = { config['default'] = {
'preview_method': get_current_preview_method(), 'preview_method': get_current_preview_method(),
'badge_mode': get_config()['badge_mode'], 'badge_mode': get_config()['badge_mode'],
'git_exe': get_config()['git_exe'],
'channel_url': get_config()['channel_url'], 'channel_url': get_config()['channel_url'],
'channel_url_list': get_config()['channel_url_list'] 'channel_url_list': get_config()['channel_url_list']
} }
@ -120,6 +122,7 @@ def read_config():
return { return {
'preview_method': default_conf['preview_method'] if 'preview_method' in default_conf else get_current_preview_method(), 'preview_method': default_conf['preview_method'] if 'preview_method' in default_conf else get_current_preview_method(),
'badge_mode': default_conf['badge_mode'] if 'badge_mode' in default_conf else 'none', 'badge_mode': default_conf['badge_mode'] if 'badge_mode' in default_conf else 'none',
'git_exe': default_conf['git_exe'] if 'git_exe' in default_conf else '',
'channel_url': default_conf['channel_url'] if 'channel_url' in default_conf else 'https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main', 'channel_url': default_conf['channel_url'] if 'channel_url' in default_conf else 'https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main',
'channel_url_list': ch_url_list 'channel_url_list': ch_url_list
} }
@ -128,6 +131,7 @@ def read_config():
return { return {
'preview_method': get_current_preview_method(), 'preview_method': get_current_preview_method(),
'badge_mode': 'none', 'badge_mode': 'none',
'git_exe': '',
'channel_url': 'https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main', 'channel_url': 'https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main',
'channel_url_list': '' 'channel_url_list': ''
} }
@ -236,9 +240,11 @@ print_comfyui_version()
# use subprocess to avoid file system lock by git (Windows) # use subprocess to avoid file system lock by git (Windows)
def __win_check_git_update(path, do_fetch=False): def __win_check_git_update(path, do_fetch=False, do_update=False):
if do_fetch: if do_fetch:
command = [sys.executable, git_script_path, "--fetch", path] command = [sys.executable, git_script_path, "--fetch", path]
elif do_update:
command = [sys.executable, git_script_path, "--pull", path]
else: else:
command = [sys.executable, git_script_path, "--check", path] command = [sys.executable, git_script_path, "--check", path]
@ -246,12 +252,29 @@ def __win_check_git_update(path, do_fetch=False):
output, _ = process.communicate() output, _ = process.communicate()
output = output.decode('utf-8').strip() output = output.decode('utf-8').strip()
if "CUSTOM NODE CHECK: True" in output: if do_update:
process.wait() if "CUSTOM NODE PULL: True" in output:
return True process.wait()
print(f"\rUpdated: {path}")
return True
elif "CUSTOM NODE PULL: None" in output:
process.wait()
return True
else:
print(f"\rUpdate error: {path}")
process.wait()
return False
else: else:
process.wait() if "CUSTOM NODE CHECK: True" in output:
return False process.wait()
return True
elif "CUSTOM NODE CHECK: False" in output:
process.wait()
return False
else:
print(f"\rFetch error: {path}")
process.wait()
return False
def __win_check_git_pull(path): def __win_check_git_pull(path):
@ -260,13 +283,18 @@ def __win_check_git_pull(path):
process.wait() process.wait()
def git_repo_has_updates(path, do_fetch=False): def git_repo_has_updates(path, do_fetch=False, do_update=False):
if do_fetch:
print(f"\x1b[2K\rFetching: {path}", end='')
elif do_update:
print(f"\x1b[2K\rUpdating: {path}", end='')
# Check if the path is a git repository # Check if the path is a git repository
if not os.path.exists(os.path.join(path, '.git')): if not os.path.exists(os.path.join(path, '.git')):
raise ValueError('Not a git repository') raise ValueError('Not a git repository')
if platform.system() == "Windows": if platform.system() == "Windows":
return __win_check_git_update(path, do_fetch) return __win_check_git_update(path, do_fetch, do_update)
else: else:
# Fetch the latest commits from the remote repository # Fetch the latest commits from the remote repository
repo = git.Repo(path) repo = git.Repo(path)
@ -277,11 +305,28 @@ def git_repo_has_updates(path, do_fetch=False):
remote_name = 'origin' remote_name = 'origin'
remote = repo.remote(name=remote_name) remote = repo.remote(name=remote_name)
if do_fetch: # Get the current commit hash
commit_hash = repo.head.commit.hexsha
if do_fetch or do_update:
remote.fetch() remote.fetch()
# Get the current commit hash and the commit hash of the remote branch if do_update:
commit_hash = repo.head.commit.hexsha try:
remote.pull(rebase=True)
repo.git.submodule('update', '--init', '--recursive')
new_commit_hash = repo.head.commit.hexsha
if commit_hash != new_commit_hash:
print(f"\x1b[2K\rUpdated: {path}")
return True
else:
return False
except Exception as e:
print(f"\nUpdating failed: {path}\n{e}", file=sys.stderr)
# Get commit hash of the remote branch
remote_commit_hash = repo.refs[f'{remote_name}/{branch_name}'].object.hexsha remote_commit_hash = repo.refs[f'{remote_name}/{branch_name}'].object.hexsha
# Compare the commit hashes to determine if the local repository is behind the remote repository # Compare the commit hashes to determine if the local repository is behind the remote repository
@ -350,9 +395,20 @@ def setup_js():
print(f"### ComfyUI-Manager: Copy .js from '{js_src_path}' to '{js_dest_path}'") print(f"### ComfyUI-Manager: Copy .js from '{js_src_path}' to '{js_dest_path}'")
shutil.copy(js_src_path, js_dest_path) shutil.copy(js_src_path, js_dest_path)
setup_js() setup_js()
def setup_environment():
git_exe = get_config()['git_exe']
if git_exe != '':
git.Git().update_environment(GIT_PYTHON_GIT_EXECUTABLE=git_exe)
setup_environment()
# Expand Server api # Expand Server api
import server import server
@ -408,7 +464,7 @@ def get_model_path(data):
return os.path.join(base_model, data['filename']) return os.path.join(base_model, data['filename'])
def check_a_custom_node_installed(item, do_fetch=False, do_update_check=True): def check_a_custom_node_installed(item, do_fetch=False, do_update_check=True, do_update=False):
item['installed'] = 'None' item['installed'] = 'None'
if item['install_type'] == 'git-clone' and len(item['files']) == 1: if item['install_type'] == 'git-clone' and len(item['files']) == 1:
@ -416,7 +472,7 @@ def check_a_custom_node_installed(item, do_fetch=False, do_update_check=True):
dir_path = os.path.join(custom_nodes_path, dir_name) dir_path = os.path.join(custom_nodes_path, dir_name)
if os.path.exists(dir_path): if os.path.exists(dir_path):
try: try:
if do_update_check and git_repo_has_updates(dir_path, do_fetch): if do_update_check and git_repo_has_updates(dir_path, do_fetch, do_update):
item['installed'] = 'Update' item['installed'] = 'Update'
else: else:
item['installed'] = 'True' item['installed'] = 'True'
@ -448,9 +504,27 @@ def check_a_custom_node_installed(item, do_fetch=False, do_update_check=True):
item['installed'] = 'False' item['installed'] = 'False'
def check_custom_nodes_installed(json_obj, do_fetch=False, do_update_check=True): def check_custom_nodes_installed(json_obj, do_fetch=False, do_update_check=True, do_update=False):
if do_fetch:
print("Start fetching...", end="")
elif do_update:
print("Start updating...", end="")
elif do_update_check:
print("Start update check...", end="")
for item in json_obj['custom_nodes']: for item in json_obj['custom_nodes']:
check_a_custom_node_installed(item, do_fetch, do_update_check) check_a_custom_node_installed(item, do_fetch, do_update_check, do_update)
if do_fetch:
print(f"\x1b[2K\rFetching done.")
elif do_update:
update_exists = any(item['installed'] == 'Update' for item in json_obj['custom_nodes'])
if update_exists:
print(f"\x1b[2K\rUpdate done.")
else:
print(f"\x1b[2K\rAll extensions are already up-to-date.")
elif do_update_check:
print(f"\x1b[2K\rUpdate check done.")
@server.PromptServer.instance.routes.get("/customnode/getmappings") @server.PromptServer.instance.routes.get("/customnode/getmappings")
@ -487,6 +561,27 @@ async def fetch_updates(request):
return web.Response(status=400) return web.Response(status=400)
@server.PromptServer.instance.routes.get("/customnode/update_all")
async def update_all(request):
try:
if request.rel_url.query["mode"] == "local":
uri = local_db_custom_node_list
else:
uri = get_config()['channel_url'] + '/custom-node-list.json'
json_obj = await get_data(uri)
check_custom_nodes_installed(json_obj, do_update=True)
update_exists = any(item['installed'] == 'Update' for item in json_obj['custom_nodes'])
if update_exists:
return web.Response(status=201)
return web.Response(status=200)
except:
return web.Response(status=400)
@server.PromptServer.instance.routes.get("/customnode/getlist") @server.PromptServer.instance.routes.get("/customnode/getlist")
async def fetch_customnode_list(request): async def fetch_customnode_list(request):
if "skip_update" in request.rel_url.query and request.rel_url.query["skip_update"] == "true": if "skip_update" in request.rel_url.query and request.rel_url.query["skip_update"] == "true":
@ -582,7 +677,7 @@ def unzip_install(files):
os.remove(temp_filename) os.remove(temp_filename)
except Exception as e: except Exception as e:
print(f"Install(unzip) error: {url} / {e}") print(f"Install(unzip) error: {url} / {e}", file=sys.stderr)
return False return False
print("Installation was successful.") print("Installation was successful.")
@ -605,7 +700,7 @@ def download_url_with_agent(url, save_path):
f.write(data) f.write(data)
except Exception as e: except Exception as e:
print(f"Download error: {url} / {e}") print(f"Download error: {url} / {e}", file=sys.stderr)
return False return False
print("Installation was successful.") print("Installation was successful.")
@ -624,7 +719,7 @@ def copy_install(files, js_path_name=None):
download_url(url, path) download_url(url, path)
except Exception as e: except Exception as e:
print(f"Install(copy) error: {url} / {e}") print(f"Install(copy) error: {url} / {e}", file=sys.stderr)
return False return False
print("Installation was successful.") print("Installation was successful.")
@ -643,7 +738,7 @@ def copy_uninstall(files, js_path_name='.'):
elif os.path.exists(file_path + ".disabled"): elif os.path.exists(file_path + ".disabled"):
os.remove(file_path + ".disabled") os.remove(file_path + ".disabled")
except Exception as e: except Exception as e:
print(f"Uninstall(copy) error: {url} / {e}") print(f"Uninstall(copy) error: {url} / {e}", file=sys.stderr)
return False return False
print("Uninstallation was successful.") print("Uninstallation was successful.")
@ -672,7 +767,7 @@ def copy_set_active(files, is_disable, js_path_name='.'):
os.rename(current_name, new_name) os.rename(current_name, new_name)
except Exception as e: except Exception as e:
print(f"{action_name}(copy) error: {url} / {e}") print(f"{action_name}(copy) error: {url} / {e}", file=sys.stderr)
return False return False
@ -722,7 +817,7 @@ def gitclone_install(files):
return False return False
except Exception as e: except Exception as e:
print(f"Install(git-clone) error: {url} / {e}") print(f"Install(git-clone) error: {url} / {e}", file=sys.stderr)
return False return False
print("Installation was successful.") print("Installation was successful.")
@ -791,7 +886,7 @@ def gitclone_uninstall(files):
elif os.path.exists(dir_path + ".disabled"): elif os.path.exists(dir_path + ".disabled"):
rmtree(dir_path + ".disabled") rmtree(dir_path + ".disabled")
except Exception as e: except Exception as e:
print(f"Uninstall(git-clone) error: {url} / {e}") print(f"Uninstall(git-clone) error: {url} / {e}", file=sys.stderr)
return False return False
print("Uninstallation was successful.") print("Uninstallation was successful.")
@ -836,7 +931,7 @@ def gitclone_set_active(files, is_disable):
try_install_script(url, new_path, enable_script) try_install_script(url, new_path, enable_script)
except Exception as e: except Exception as e:
print(f"{action_name}(git-clone) error: {url} / {e}") print(f"{action_name}(git-clone) error: {url} / {e}", file=sys.stderr)
return False return False
print(f"{action_name} was successful.") print(f"{action_name} was successful.")
@ -857,7 +952,7 @@ def gitclone_update(files):
return False return False
except Exception as e: except Exception as e:
print(f"Update(git-clone) error: {url} / {e}") print(f"Update(git-clone) error: {url} / {e}", file=sys.stderr)
return False return False
print("Update was successful.") print("Update was successful.")
@ -974,7 +1069,7 @@ async def install_custom_node(request):
else: else:
return web.Response(status=200) return web.Response(status=200)
except Exception as e: except Exception as e:
print(f"ComfyUI update fail: {e}") print(f"ComfyUI update fail: {e}", file=sys.stderr)
pass pass
return web.Response(status=400) return web.Response(status=400)
@ -1026,7 +1121,7 @@ async def install_model(request):
if res: if res:
return web.json_response({}, content_type='application/json') return web.json_response({}, content_type='application/json')
except Exception as e: except Exception as e:
print(f"[ERROR] {e}") print(f"[ERROR] {e}", file=sys.stderr)
pass pass
return web.Response(status=400) return web.Response(status=400)

View File

@ -159,6 +159,16 @@
"id":"https://github.com/spinagon/ComfyUI-seamless-tiling", "id":"https://github.com/spinagon/ComfyUI-seamless-tiling",
"tags":"tiling", "tags":"tiling",
"description": "ComfyUI node for generating seamless textures Replicates 'Tiling' option from A1111" "description": "ComfyUI node for generating seamless textures Replicates 'Tiling' option from A1111"
},
{
"id":"https://github.com/laksjdjf/cd-tuner_negpip-ComfyUI",
"tags":"cd-tuner, negpip",
"description": "This extension is a port of the <a href='https://github.com/hako-mikan/sd-webui-cd-tuner' target='blank'>sd-webui-cd-tuner</a>(a.k.a. CD(color/Detail) Tuner )and <a href='https://github.com/hako-mikan/sd-webui-negpip' target='blank'>sd-webui-negpip</a>(a.k.a. NegPiP) extensions of A1111 to ComfyUI."
},
{
"id":"https://github.com/mcmonkeyprojects/sd-dynamic-thresholding",
"tags":"DT, dynamic thresholding",
"description": "This custom node is a port of the Dynamic Thresholding extension from A1111 to make it available for use in ComfyUI."
} }
] ]
} }

View File

@ -1,4 +1,5 @@
default::https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main default::https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main
recent::https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/node_db/new recent::https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/node_db/new
legacy::https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/node_db/legacy legacy::https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/node_db/legacy
forked::https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/node_db/forked forked::https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/node_db/forked
dev::https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/node_db/dev

View File

@ -225,6 +225,16 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "Power Noise Suite contains nodes centered around latent noise input, and diffusion, as well as latent adjustments." "description": "Power Noise Suite contains nodes centered around latent noise input, and diffusion, as well as latent adjustments."
}, },
{
"author": "WASasquatch",
"title": "FreeU_Advanced",
"reference": "https://github.com/WASasquatch/FreeU_Advanced",
"files": [
"https://github.com/WASasquatch/FreeU_Advanced"
],
"install_type": "git-clone",
"description": "This custom node provides advanced settings for FreeU."
},
{ {
"author": "omar92", "author": "omar92",
"title": "Quality of life Suit:V2", "title": "Quality of life Suit:V2",
@ -1384,6 +1394,16 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "Nodes:Attention couple. This is a custom node that manipulates region-specific prompts. While vanilla ComfyUI employs an area specification method based on latent couples, this node divides regions using attention layers within UNet." "description": "Nodes:Attention couple. This is a custom node that manipulates region-specific prompts. While vanilla ComfyUI employs an area specification method based on latent couples, this node divides regions using attention layers within UNet."
}, },
{
"author": "laksjdjf",
"title": "cd-tuner_negpip-ComfyUI",
"reference": "https://github.com/laksjdjf/cd-tuner_negpip-ComfyUI",
"files": [
"https://github.com/laksjdjf/cd-tuner_negpip-ComfyUI"
],
"install_type": "git-clone",
"description": "Nodes:Apply CDTuner, Apply Negapip. This extension provides the <a href='https://github.com/hako-mikan/sd-webui-cd-tuner' target='blank'>CD(Color/Detail) Tuner</a> and the <a href='https://github.com/hako-mikan/sd-webui-negpip' target='blank'>Negative Prompt in the Prompt</a>features."
},
{ {
"author": "alsritter", "author": "alsritter",
"title": "asymmetric-tiling-comfyui", "title": "asymmetric-tiling-comfyui",
@ -1404,6 +1424,16 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "Pause image generation when GPU temperature exceeds threshold." "description": "Pause image generation when GPU temperature exceeds threshold."
}, },
{
"author": "meap158",
"title": "ComfyUI-Prompt-Expansion",
"reference": "https://github.com/meap158/ComfyUI-Prompt-Expansion",
"files": [
"https://github.com/meap158/ComfyUI-Prompt-Expansion"
],
"install_type": "git-clone",
"description": "Dynamic prompt expansion, powered by GPT-2 locally on your device."
},
{ {
"author": "TeaCrab", "author": "TeaCrab",
"title": "ComfyUI-TeaNodes", "title": "ComfyUI-TeaNodes",
@ -1594,16 +1624,6 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "Nodes: Latent Mirror. Node to mirror a latent along the Y (vertical / left to right) or X (horizontal / top to bottom) axis." "description": "Nodes: Latent Mirror. Node to mirror a latent along the Y (vertical / left to right) or X (horizontal / top to bottom) axis."
}, },
{
"author": "Vrahn",
"title": "ComfyUI-MasaCtrl-Node",
"reference": "https://github.com/Vrahn/ComfyUI-MasaCtrl-Node",
"files": [
"https://github.com/Vrahn/ComfyUI-MasaCtrl-Node"
],
"install_type": "git-clone",
"description": "Nodes: MasaCtrl."
},
{ {
"author": "Tropfchen", "author": "Tropfchen",
"title": "Embedding Picker", "title": "Embedding Picker",
@ -1612,7 +1632,7 @@
"https://github.com/Tropfchen/ComfyUI-Embedding_Picker" "https://github.com/Tropfchen/ComfyUI-Embedding_Picker"
], ],
"install_type": "git-clone", "install_type": "git-clone",
"description": "Nodes: Embedding Picker. Tired of forgetting and misspelling often weird names of embeddings you use? Or perhaps you use only one, cause you forgot you have tens of them installed? Try this." "description": "Tired of forgetting and misspelling often weird names of embeddings you use? Or perhaps you use only one, cause you forgot you have tens of them installed?"
}, },
{ {
"author": "Acly", "author": "Acly",
@ -1712,16 +1732,6 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "Manage models: browsing, donwload and delete." "description": "Manage models: browsing, donwload and delete."
}, },
{
"author": "Tropfchen",
"title": "Embedding Picker",
"reference": "https://github.com/Tropfchen/ComfyUI-Embedding_Picker",
"files": [
"https://github.com/Tropfchen/ComfyUI-Embedding_Picker"
],
"install_type": "git-clone",
"description": "Tired of forgetting and misspelling often weird names of embeddings you use? Or perhaps you use only one, cause you forgot you have tens of them installed?"
},
{ {
"author": "ali1234", "author": "ali1234",
"title": "comfyui-job-iterator", "title": "comfyui-job-iterator",
@ -1772,6 +1782,106 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "Node for generating almost seamless textures, based on similar setting from A1111." "description": "Node for generating almost seamless textures, based on similar setting from A1111."
}, },
{
"author": "chrisgoringe",
"title": "Variation seeds",
"reference": "https://github.com/chrisgoringe/cg-noise",
"files": [
"https://github.com/chrisgoringe/cg-noise"
],
"install_type": "git-clone",
"description": "Adds KSampler custom nodes with variation seed and variation strength."
},
{
"author": "Endless Sea of Stars",
"title": "Endless Nodes",
"reference": "https://github.com/tusharbhutt/Endless-Nodes",
"files": [
"https://github.com/tusharbhutt/Endless-Nodes"
],
"install_type": "git-clone",
"description": "A small set of nodes I created for various numerical and text inputs."
},
{
"author": "spacepxl",
"title": "ComfyUI-HQ-Image-Save",
"reference": "https://github.com/spacepxl/ComfyUI-HQ-Image-Save",
"files": [
"https://github.com/spacepxl/ComfyUI-HQ-Image-Save"
],
"install_type": "git-clone",
"description": "Add Image Save nodes for TIFF 16 bit and EXR 32 bit formats. Probably only useful if you're applying a LUT or other color corrections, and care about preserving as much color accuracy as possible."
},
{
"author": "PTA",
"title": "auto nodes layout",
"reference": "https://github.com/phineas-pta/comfyui-auto-nodes-layout",
"files": [
"https://github.com/phineas-pta/comfyui-auto-nodes-layout"
],
"install_type": "git-clone",
"description": "A ComfyUI extension to apply better nodes layout algorithm to ComfyUI workflow (mostly for visualization purpose)"
},
{
"author": "receyuki",
"title": "comfyui-prompt-reader-node",
"reference": "https://github.com/receyuki/comfyui-prompt-reader-node",
"files": [
"https://github.com/receyuki/comfyui-prompt-reader-node"
],
"install_type": "git-clone",
"description": "Nodes: SDPromptReader"
},
{
"author": "rklaffehn",
"title": "rk-comfy-nodes",
"reference": "https://github.com/rklaffehn/rk-comfy-nodes",
"files": [
"https://github.com/rklaffehn/rk-comfy-nodes"
],
"install_type": "git-clone",
"description": "Nodes: RK_CivitAIMetaChecker, RK_CivitAIAddHashes."
},
{
"author": "cubiq",
"title": "ComfyUI Essentials",
"reference": "https://github.com/cubiq/ComfyUI_essentials",
"files": [
"https://github.com/cubiq/ComfyUI_essentials"
],
"install_type": "git-clone",
"description": "Essential nodes that are weirdly missing from ComfyUI core. With few exceptions they are new features and not commodities. I hope this will be just a temporary repository until the nodes get included into ComfyUI."
},
{
"author": "Clybius",
"title": "ComfyUI-Latent-Modifiers",
"reference": "https://github.com/Clybius/ComfyUI-Latent-Modifiers",
"files": [
"https://github.com/Clybius/ComfyUI-Latent-Modifiers"
],
"install_type": "git-clone",
"description": "Nodes: Latent Diffusion Mega Modifier. ComfyUI nodes which modify the latent during the diffusion process. (Sharpness, Tonemap, Rescale, Extra Noise)"
},
{
"author": "mcmonkeyprojects",
"title": "Stable Diffusion Dynamic Thresholding (CFG Scale Fix)",
"reference": "https://github.com/mcmonkeyprojects/sd-dynamic-thresholding",
"files": [
"https://github.com/mcmonkeyprojects/sd-dynamic-thresholding"
],
"install_type": "git-clone",
"description": "Extension for StableSwarmUI, ComfyUI, and AUTOMATIC1111 Stable Diffusion WebUI that enables a way to use higher CFG Scales without color issues. This works by clamping latents between steps."
},
{
"author": "Tropfchen",
"title": "YARS: Yet Another Resolution Selector",
"reference": "https://github.com/Tropfchen/ComfyUI-yaResolutionSelector",
"files": [
"https://github.com/Tropfchen/ComfyUI-yaResolutionSelector"
],
"install_type": "git-clone",
"description": "A slightly different Resolution Selector node, allowing to freely change base resolution and aspect ratio, with options to maintain the pixel count or use the base resolution as the highest or lowest dimension."
},
{ {
"author": "taabata", "author": "taabata",
"title": "Syrian Falcon Nodes", "title": "Syrian Falcon Nodes",
@ -1980,16 +2090,6 @@
"install_type": "copy", "install_type": "copy",
"description": "Nodes:LatentGarbageCollector. This ComfyUI custom node flushes the GPU cache and empty cuda interprocess memory. It's helpfull for low memory environment such as the free Google Colab, especially when the workflow VAE decode latents of the size above 1500x1500." "description": "Nodes:LatentGarbageCollector. This ComfyUI custom node flushes the GPU cache and empty cuda interprocess memory. It's helpfull for low memory environment such as the free Google Colab, especially when the workflow VAE decode latents of the size above 1500x1500."
}, },
{
"author": "Clybius",
"title": "ComfyUI-Latent-Modifiers",
"reference": "https://github.com/Clybius/ComfyUI-Latent-Modifiers",
"files": [
"https://github.com/Clybius/ComfyUI-Latent-Modifiers/raw/main/sampler_mega_modifier.py"
],
"install_type": "copy",
"description": "Nodes: Latent Diffusion Mega Modifier. ComfyUI nodes which modify the latent during the diffusion process. (Sharpness, Tonemap, Rescale, Extra Noise)"
},
{ {
"author": "theally", "author": "theally",
"title": "TheAlly's Custom Nodes", "title": "TheAlly's Custom Nodes",

View File

@ -42,9 +42,11 @@
"https://github.com/ArtVentureX/comfyui-animatediff": [ "https://github.com/ArtVentureX/comfyui-animatediff": [
[ [
"AnimateDiffCombine", "AnimateDiffCombine",
"AnimateDiffLoader", "AnimateDiffModuleLoader",
"AnimateDiffLoader_v2", "AnimateDiffSampler",
"AnimateDiffUnload" "AnimateDiffSlidingWindowOptions",
"ImageSizeAndBatchSize",
"LoadVideo"
], ],
{ {
"title_aux": "AnimateDiff" "title_aux": "AnimateDiff"
@ -167,7 +169,7 @@
"title_aux": "ComfyUI_Ib_CustomNodes" "title_aux": "ComfyUI_Ib_CustomNodes"
} }
], ],
"https://github.com/Clybius/ComfyUI-Latent-Modifiers/raw/main/sampler_mega_modifier.py": [ "https://github.com/Clybius/ComfyUI-Latent-Modifiers": [
[ [
"Latent Diffusion Mega Modifier" "Latent Diffusion Mega Modifier"
], ],
@ -354,6 +356,9 @@
"DWPreprocessor", "DWPreprocessor",
"FakeScribblePreprocessor", "FakeScribblePreprocessor",
"HEDPreprocessor", "HEDPreprocessor",
"HintImageEnchance",
"ImageGenResolutionFromImage",
"ImageGenResolutionFromLatent",
"InpaintPreprocessor", "InpaintPreprocessor",
"LeReS-DepthMapPreprocessor", "LeReS-DepthMapPreprocessor",
"LineArtPreprocessor", "LineArtPreprocessor",
@ -366,6 +371,8 @@
"OneFormer-COCO-SemSegPreprocessor", "OneFormer-COCO-SemSegPreprocessor",
"OpenposePreprocessor", "OpenposePreprocessor",
"PiDiNetPreprocessor", "PiDiNetPreprocessor",
"PixelPerfectResolution",
"RaftOpticalFlowPreprocessor",
"SAMPreprocessor", "SAMPreprocessor",
"ScribblePreprocessor", "ScribblePreprocessor",
"Scribble_XDoG_Preprocessor", "Scribble_XDoG_Preprocessor",
@ -515,12 +522,13 @@
], ],
"https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet": [ "https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet": [
[ [
"ControlNetApplyPartialBatch",
"ControlNetLoaderAdvanced", "ControlNetLoaderAdvanced",
"CustomControlNetWeights", "CustomControlNetWeights",
"CustomT2IAdapterWeights", "CustomT2IAdapterWeights",
"DiffControlNetLoaderAdvanced", "DiffControlNetLoaderAdvanced",
"LatentKeyframe", "LatentKeyframe",
"LatentKeyframeGroup",
"LatentKeyframeTiming",
"LoadImagesFromDirectory", "LoadImagesFromDirectory",
"ScaledSoftControlNetWeights", "ScaledSoftControlNetWeights",
"SoftControlNetWeights", "SoftControlNetWeights",
@ -534,8 +542,11 @@
"https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved": [ "https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved": [
[ [
"ADE_AnimateDiffCombine", "ADE_AnimateDiffCombine",
"ADE_AnimateDiffLoaderLegacy", "ADE_AnimateDiffLoaderV1Advanced",
"ADE_AnimateDiffLoaderWithContext",
"ADE_AnimateDiffUniformContextOptions",
"ADE_AnimateDiffUnload", "ADE_AnimateDiffUnload",
"ADE_EmptyLatentImageLarge",
"AnimateDiffLoaderV1", "AnimateDiffLoaderV1",
"CheckpointLoaderSimpleWithNoiseSelect" "CheckpointLoaderSimpleWithNoiseSelect"
], ],
@ -800,6 +811,7 @@
"https://github.com/RockOfFire/CR_Animation_Nodes": [ "https://github.com/RockOfFire/CR_Animation_Nodes": [
[ [
"CR Central Schedule", "CR Central Schedule",
"CR Combine Schedules",
"CR Current Frame", "CR Current Frame",
"CR Cycle Images", "CR Cycle Images",
"CR Cycle Images Simple", "CR Cycle Images Simple",
@ -822,15 +834,17 @@
"CR Keyframe List", "CR Keyframe List",
"CR LoRA List", "CR LoRA List",
"CR Load Animation Frames", "CR Load Animation Frames",
"CR Load Schedule From File",
"CR Load Scheduled ControlNets",
"CR Load Scheduled LoRAs", "CR Load Scheduled LoRAs",
"CR Load Scheduled Models", "CR Load Scheduled Models",
"CR Model List", "CR Model List",
"CR Output Schedule List",
"CR Output Schedule To File", "CR Output Schedule To File",
"CR Prompt List", "CR Prompt List",
"CR Prompt List Keyframes", "CR Prompt List Keyframes",
"CR Prompt Text", "CR Prompt Text",
"CR Schedule Input Switch", "CR Schedule Input Switch",
"CR Schedule To ScheduleList",
"CR Simple Prompt List", "CR Simple Prompt List",
"CR Simple Prompt List Keyframes", "CR Simple Prompt List Keyframes",
"CR Simple Schedule", "CR Simple Schedule",
@ -852,6 +866,7 @@
"CR Apply ControlNet", "CR Apply ControlNet",
"CR Apply LoRA Stack", "CR Apply LoRA Stack",
"CR Apply Model Merge", "CR Apply Model Merge",
"CR Apply Multi Upscale",
"CR Apply Multi-ControlNet", "CR Apply Multi-ControlNet",
"CR Aspect Ratio", "CR Aspect Ratio",
"CR Aspect Ratio SDXL", "CR Aspect Ratio SDXL",
@ -883,6 +898,7 @@
"CR Module Input", "CR Module Input",
"CR Module Output", "CR Module Output",
"CR Module Pipe Loader", "CR Module Pipe Loader",
"CR Multi Upscale Stack",
"CR Multi-ControlNet Stack", "CR Multi-ControlNet Stack",
"CR Pipe Switch", "CR Pipe Switch",
"CR Process Switch", "CR Process Switch",
@ -896,7 +912,8 @@
"CR Seed to Int", "CR Seed to Int",
"CR Switch Model and CLIP", "CR Switch Model and CLIP",
"CR Text Input Switch", "CR Text Input Switch",
"CR Text Input Switch (4 way)" "CR Text Input Switch (4 way)",
"CR Upscale Image"
], ],
{ {
"title_aux": "ComfyUI_Comfyroll_CustomNodes" "title_aux": "ComfyUI_Comfyroll_CustomNodes"
@ -1043,7 +1060,10 @@
], ],
"https://github.com/TRI3D-LC/tri3d-comfyui-nodes": [ "https://github.com/TRI3D-LC/tri3d-comfyui-nodes": [
[ [
"tri3d-extract-hand" "tri3d-atr-parse",
"tri3d-extract-hand",
"tri3d-fuzzification",
"tri3d-position-hands"
], ],
{ {
"title_aux": "tri3d-comfyui-nodes" "title_aux": "tri3d-comfyui-nodes"
@ -1104,6 +1124,15 @@
"title_aux": "Embedding Picker" "title_aux": "Embedding Picker"
} }
], ],
"https://github.com/Tropfchen/ComfyUI-yaResolutionSelector": [
[
"YARS",
"YARSAdv"
],
{
"title_aux": "YARS: Yet Another Resolution Selector"
}
],
"https://github.com/Ttl/ComfyUi_NNLatentUpscale": [ "https://github.com/Ttl/ComfyUi_NNLatentUpscale": [
[ [
"NNLatentUpscale" "NNLatentUpscale"
@ -1112,14 +1141,6 @@
"title_aux": "ComfyUI Neural network latent upscale custom node" "title_aux": "ComfyUI Neural network latent upscale custom node"
} }
], ],
"https://github.com/Vrahn/ComfyUI-MasaCtrl-Node": [
[
"MasaCtrl"
],
{
"title_aux": "ComfyUI-MasaCtrl-Node"
}
],
"https://github.com/WASasquatch/ComfyUI_Preset_Merger": [ "https://github.com/WASasquatch/ComfyUI_Preset_Merger": [
[ [
"Preset_Model_Merge" "Preset_Model_Merge"
@ -1128,6 +1149,14 @@
"title_aux": "ComfyUI Preset Merger" "title_aux": "ComfyUI Preset Merger"
} }
], ],
"https://github.com/WASasquatch/FreeU_Advanced": [
[
"FreeU (Advanced)"
],
{
"title_aux": "FreeU_Advanced"
}
],
"https://github.com/WASasquatch/PPF_Noise_ComfyUI": [ "https://github.com/WASasquatch/PPF_Noise_ComfyUI": [
[ [
"Blend Latents (PPF Noise)", "Blend Latents (PPF Noise)",
@ -1393,7 +1422,9 @@
"https://github.com/Zuellni/ComfyUI-ExLlama": [ "https://github.com/Zuellni/ComfyUI-ExLlama": [
[ [
"ZuellniExLlamaGenerator", "ZuellniExLlamaGenerator",
"ZuellniExLlamaLoader" "ZuellniExLlamaLoader",
"ZuellniExLlamaLora",
"ZuellniExLlamaPreviewer"
], ],
{ {
"title_aux": "ComfyUI-ExLlama" "title_aux": "ComfyUI-ExLlama"
@ -1437,22 +1468,32 @@
"CSV Generator [Dream]", "CSV Generator [Dream]",
"Calculation [Dream]", "Calculation [Dream]",
"Common Frame Dimensions [Dream]", "Common Frame Dimensions [Dream]",
"Compare Palettes [Dream]",
"FFMPEG Video Encoder [Dream]", "FFMPEG Video Encoder [Dream]",
"File Count [Dream]", "File Count [Dream]",
"Finalize Prompt [Dream]", "Finalize Prompt [Dream]",
"Float Input [Dream]", "Float Input [Dream]",
"Float to Log Entry [Dream]",
"Frame Count Calculator [Dream]", "Frame Count Calculator [Dream]",
"Frame Counter (Directory) [Dream]", "Frame Counter (Directory) [Dream]",
"Frame Counter (Simple) [Dream]", "Frame Counter (Simple) [Dream]",
"Frame Counter Info [Dream]", "Frame Counter Info [Dream]",
"Frame Counter Offset [Dream]", "Frame Counter Offset [Dream]",
"Frame Counter Time Offset [Dream]",
"Image Brightness Adjustment [Dream]",
"Image Color Shift [Dream]",
"Image Contrast Adjustment [Dream]",
"Image Motion [Dream]", "Image Motion [Dream]",
"Image Sequence Blend [Dream]", "Image Sequence Blend [Dream]",
"Image Sequence Loader [Dream]", "Image Sequence Loader [Dream]",
"Image Sequence Saver [Dream]", "Image Sequence Saver [Dream]",
"Image Sequence Tweening [Dream]", "Image Sequence Tweening [Dream]",
"Int Input [Dream]", "Int Input [Dream]",
"Int to Log Entry [Dream]",
"Laboratory [Dream]",
"Linear Curve [Dream]", "Linear Curve [Dream]",
"Log Entry Joiner [Dream]",
"Log File [Dream]",
"Noise from Area Palettes [Dream]", "Noise from Area Palettes [Dream]",
"Noise from Palette [Dream]", "Noise from Palette [Dream]",
"Palette Color Align [Dream]", "Palette Color Align [Dream]",
@ -1463,10 +1504,13 @@
"Sine Curve [Dream]", "Sine Curve [Dream]",
"Smooth Event Curve [Dream]", "Smooth Event Curve [Dream]",
"String Input [Dream]", "String Input [Dream]",
"String Tokenizer [Dream]",
"String to Log Entry [Dream]",
"Text Input [Dream]", "Text Input [Dream]",
"Triangle Curve [Dream]", "Triangle Curve [Dream]",
"Triangle Event Curve [Dream]", "Triangle Event Curve [Dream]",
"Video Encoder (mpegCoder) [Dream]" "Video Encoder (mpegCoder) [Dream]",
"WAV Curve [Dream]"
], ],
{ {
"title_aux": "Dream Project Animation Nodes" "title_aux": "Dream Project Animation Nodes"
@ -1535,6 +1579,8 @@
"Prompt With Style", "Prompt With Style",
"Prompt With Style V2", "Prompt With Style V2",
"Prompt With Style V3", "Prompt With Style V3",
"Range Float",
"Range Integer",
"Ratio Advanced", "Ratio Advanced",
"Resize Image for SDXL", "Resize Image for SDXL",
"Save Image If True", "Save Image If True",
@ -1579,8 +1625,12 @@
"ChameleonMask", "ChameleonMask",
"CheckpointLoader (dirty)", "CheckpointLoader (dirty)",
"CheckpointLoaderSimple (dirty)", "CheckpointLoaderSimple (dirty)",
"Color (RGB)",
"Color (hexadecimal)",
"Color Clip", "Color Clip",
"Color Clip (advanced)",
"Color Clip ADE20k", "Color Clip ADE20k",
"ColorDictionary",
"CondList", "CondList",
"Conditioning (combine multiple)", "Conditioning (combine multiple)",
"Conditioning (combine selective)", "Conditioning (combine selective)",
@ -1591,10 +1641,15 @@
"Contours", "Contours",
"ControlNetHadamard", "ControlNetHadamard",
"ControlNetHadamard (manual)", "ControlNetHadamard (manual)",
"ConvertImg",
"CopyMakeBorder",
"CreateRequestMetadata", "CreateRequestMetadata",
"Draw Contour(s)", "Draw Contour(s)",
"EqualizeHistogram", "EqualizeHistogram",
"EstimateColorInterval (hsv)",
"Filter Contour", "Filter Contour",
"FindComplementaryColor",
"FindThreshold",
"FlatLatentsIntoSingleGrid", "FlatLatentsIntoSingleGrid",
"Framed Mask Grab Cut", "Framed Mask Grab Cut",
"Framed Mask Grab Cut 2", "Framed Mask Grab Cut 2",
@ -1602,14 +1657,19 @@
"Get Models", "Get Models",
"Get Prompt", "Get Prompt",
"HypernetworkLoader (dirty)", "HypernetworkLoader (dirty)",
"InRange (hsv)",
"Inpaint", "Inpaint",
"Input/String to Int Array", "Input/String to Int Array",
"KMeansColor",
"Load 64 Encoded Image", "Load 64 Encoded Image",
"LoraLoader (dirty)", "LoraLoader (dirty)",
"MaskGrid N KSamplers Advanced", "MaskGrid N KSamplers Advanced",
"Merge Latent Batch Gridwise", "Merge Latent Batch Gridwise",
"MonoMerge", "MonoMerge",
"MorphologicOperation",
"MorphologicSkeletoning",
"OtsuThreshold", "OtsuThreshold",
"RGB to HSV",
"Rect Grab Cut", "Rect Grab Cut",
"Repeat Into Grid (image)", "Repeat Into Grid (image)",
"Repeat Into Grid (latent)", "Repeat Into Grid (latent)",
@ -1728,6 +1788,17 @@
"title_aux": "sc-node-comfyui" "title_aux": "sc-node-comfyui"
} }
], ],
"https://github.com/chrisgoringe/cg-noise": [
[
"Hijack",
"KSampler Advanced with Variations",
"KSampler with Variations",
"UnHijack"
],
{
"title_aux": "Variation seeds"
}
],
"https://github.com/city96/ComfyUI_DiT": [ "https://github.com/city96/ComfyUI_DiT": [
[ [
"DiTCheckpointLoader", "DiTCheckpointLoader",
@ -1821,7 +1892,6 @@
"https://github.com/cubiq/ComfyUI_IPAdapter_plus": [ "https://github.com/cubiq/ComfyUI_IPAdapter_plus": [
[ [
"IPAdapterApply", "IPAdapterApply",
"IPAdapterCLIPVisionEncode",
"IPAdapterModelLoader" "IPAdapterModelLoader"
], ],
{ {
@ -1837,6 +1907,26 @@
"title_aux": "Simple Math" "title_aux": "Simple Math"
} }
], ],
"https://github.com/cubiq/ComfyUI_essentials": [
[
"ConsoleDebug+",
"GetImageSize+",
"GrowShrinkMask+",
"ImageCASharpening+",
"ImageCrop+",
"ImageDesaturate+",
"ImageFlip+",
"ImagePosterize+",
"ImageResize+",
"MaskBlur+",
"MaskFlip+",
"MaskPreview+",
"SimpleMath+"
],
{
"title_aux": "ComfyUI Essentials"
}
],
"https://github.com/dagthomas/comfyui_dagthomas": [ "https://github.com/dagthomas/comfyui_dagthomas": [
[ [
"CSL", "CSL",
@ -2136,6 +2226,16 @@
"title_aux": "attention-couple-ComfyUI" "title_aux": "attention-couple-ComfyUI"
} }
], ],
"https://github.com/laksjdjf/cd-tuner_negpip-ComfyUI": [
[
"CDTuner",
"Negapip",
"Negpip"
],
{
"title_aux": "cd-tuner_negpip-ComfyUI"
}
],
"https://github.com/laksjdjf/pfg-ComfyUI": [ "https://github.com/laksjdjf/pfg-ComfyUI": [
[ [
"PFG" "PFG"
@ -2273,6 +2373,7 @@
"ReencodeLatentPipe", "ReencodeLatentPipe",
"RegionalPrompt", "RegionalPrompt",
"RegionalSampler", "RegionalSampler",
"RegionalSamplerAdvanced",
"RemoveNoiseMask", "RemoveNoiseMask",
"SAMDetectorCombined", "SAMDetectorCombined",
"SAMDetectorSegmented", "SAMDetectorSegmented",
@ -2316,9 +2417,14 @@
[ [
"Canny_Preprocessor_Provider_for_SEGS //Inspire", "Canny_Preprocessor_Provider_for_SEGS //Inspire",
"DWPreprocessor_Provider_for_SEGS //Inspire", "DWPreprocessor_Provider_for_SEGS //Inspire",
"FakeScribblePreprocessor_Provider_for_SEGS //Inspire",
"GlobalSeed //Inspire",
"HEDPreprocessor_Provider_for_SEGS //Inspire",
"KSampler //Inspire", "KSampler //Inspire",
"KSamplerAdvanced //Inspire",
"LeRes_DepthMap_Preprocessor_Provider_for_SEGS //Inspire", "LeRes_DepthMap_Preprocessor_Provider_for_SEGS //Inspire",
"LoadPromptsFromDir //Inspire", "LoadPromptsFromDir //Inspire",
"LoadPromptsFromFile //Inspire",
"LoraBlockInfo //Inspire", "LoraBlockInfo //Inspire",
"LoraLoaderBlockWeight //Inspire", "LoraLoaderBlockWeight //Inspire",
"MediaPipeFaceMeshDetectorProvider //Inspire", "MediaPipeFaceMeshDetectorProvider //Inspire",
@ -2377,6 +2483,15 @@
"title_aux": "Facerestore CF (Code Former)" "title_aux": "Facerestore CF (Code Former)"
} }
], ],
"https://github.com/mcmonkeyprojects/sd-dynamic-thresholding": [
[
"DynamicThresholdingFull",
"DynamicThresholdingSimple"
],
{
"title_aux": "Stable Diffusion Dynamic Thresholding (CFG Scale Fix)"
}
],
"https://github.com/meap158/ComfyUI-GPU-temperature-protection": [ "https://github.com/meap158/ComfyUI-GPU-temperature-protection": [
[ [
"GPUTemperatureProtection" "GPUTemperatureProtection"
@ -2385,6 +2500,14 @@
"title_aux": "GPU temperature protection" "title_aux": "GPU temperature protection"
} }
], ],
"https://github.com/meap158/ComfyUI-Prompt-Expansion": [
[
"PromptExpansion"
],
{
"title_aux": "ComfyUI-Prompt-Expansion"
}
],
"https://github.com/melMass/comfy_mtb": [ "https://github.com/melMass/comfy_mtb": [
[ [
"Animation Builder (mtb)", "Animation Builder (mtb)",
@ -2558,9 +2681,7 @@
[ [
"AdaptiveCannyDetector_PoP", "AdaptiveCannyDetector_PoP",
"AnyAspectRatio", "AnyAspectRatio",
"ConditioningMultiplierPoP",
"ConditioningMultiplier_PoP", "ConditioningMultiplier_PoP",
"ConditioningNormalizerPoP",
"ConditioningNormalizer_PoP", "ConditioningNormalizer_PoP",
"LoadImageResizer_PoP", "LoadImageResizer_PoP",
"LoraStackLoader10_PoP", "LoraStackLoader10_PoP",
@ -2608,6 +2729,21 @@
"title_aux": "A8R8 ComfyUI Nodes" "title_aux": "A8R8 ComfyUI Nodes"
} }
], ],
"https://github.com/receyuki/comfyui-prompt-reader-node": [
[
"SDParameterGenerator",
"SDPromptMerger",
"SDPromptReader",
"SDPromptSaver"
],
{
"author": "receyuki",
"description": "ComfyUI node version of SD Prompt Reader",
"nickname": "SD Prompt Reader",
"title": "SD Prompt Reader",
"title_aux": "comfyui-prompt-reader-node"
}
],
"https://github.com/richinsley/Comfy-LFO": [ "https://github.com/richinsley/Comfy-LFO": [
[ [
"LFO_Pulse", "LFO_Pulse",
@ -2620,6 +2756,15 @@
"title_aux": "Comfy-LFO" "title_aux": "Comfy-LFO"
} }
], ],
"https://github.com/rklaffehn/rk-comfy-nodes": [
[
"RK_CivitAIAddHashes",
"RK_CivitAIMetaChecker"
],
{
"title_aux": "rk-comfy-nodes"
}
],
"https://github.com/s1dlx/comfy_meh/raw/main/meh.py": [ "https://github.com/s1dlx/comfy_meh/raw/main/meh.py": [
[ [
"MergingExecutionHelper" "MergingExecutionHelper"
@ -2675,6 +2820,7 @@
[ [
"AV_CheckpointModelsToParametersPipe", "AV_CheckpointModelsToParametersPipe",
"AV_ControlNetEfficientLoader", "AV_ControlNetEfficientLoader",
"AV_ControlNetEfficientLoaderAdvanced",
"AV_ControlNetEfficientStacker", "AV_ControlNetEfficientStacker",
"AV_ControlNetLoader", "AV_ControlNetLoader",
"AV_ControlNetPreprocessor", "AV_ControlNetPreprocessor",
@ -2688,6 +2834,7 @@
"BLIPCaption", "BLIPCaption",
"ColorBlend", "ColorBlend",
"ColorCorrect", "ColorCorrect",
"DeepDanbooruCaption",
"DependenciesEdit", "DependenciesEdit",
"Fooocus_KSampler", "Fooocus_KSampler",
"Fooocus_KSamplerAdvanced", "Fooocus_KSamplerAdvanced",
@ -2742,8 +2889,22 @@
"title_aux": "nui suite" "title_aux": "nui suite"
} }
], ],
"https://github.com/spacepxl/ComfyUI-HQ-Image-Save": [
[
"LoadLatentEXR",
"SaveEXR",
"SaveLatentEXR",
"SaveTiff"
],
{
"title_aux": "ComfyUI-HQ-Image-Save"
}
],
"https://github.com/spinagon/ComfyUI-seamless-tiling": [ "https://github.com/spinagon/ComfyUI-seamless-tiling": [
[ [
"CircularVAEDecode",
"MakeCircularVAE",
"OffsetImage",
"SeamlessTile" "SeamlessTile"
], ],
{ {
@ -2836,7 +2997,10 @@
], ],
"https://github.com/szhublox/ambw_comfyui": [ "https://github.com/szhublox/ambw_comfyui": [
[ [
"Auto Merge Block Weighted" "Auto Merge Block Weighted",
"CLIPMergeSimple",
"ModelMergeBlocks",
"ModelMergeSimple"
], ],
{ {
"title_aux": "Auto-MBW" "title_aux": "Auto-MBW"
@ -2910,6 +3074,25 @@
"title_aux": "Hakkun-ComfyUI-nodes" "title_aux": "Hakkun-ComfyUI-nodes"
} }
], ],
"https://github.com/tusharbhutt/Endless-Nodes": [
[
"Endless Nodes Combo Parameterizer",
"Endless Nodes Combo Parameterizer & Prompts",
"Endless Nodes Eight Input Text Switch",
"Endless Nodes Parameterizer",
"Endless Nodes Parameterizer & Prompts",
"Endless Nodes Six Input Text Switch",
"Endless Nodes Six Integer IO Switch",
"Endless Nodes Six Integer IO Widget"
],
{
"author": "Endless Sea of Stars",
"description": "A small set of nodes I created for various numerical and text inputs.",
"nickname": "Endless Nodes",
"title": "Endless Nodes",
"title_aux": "Endless Nodes"
}
],
"https://github.com/twri/sdxl_prompt_styler": [ "https://github.com/twri/sdxl_prompt_styler": [
[ [
"SDXLPromptStyler", "SDXLPromptStyler",
@ -2939,6 +3122,7 @@
"CLIP Positive-Negative XL w/Text (WLSH)", "CLIP Positive-Negative XL w/Text (WLSH)",
"CLIP Positive-Negative w/Text (WLSH)", "CLIP Positive-Negative w/Text (WLSH)",
"Checkpoint Loader w/Name (WLSH)", "Checkpoint Loader w/Name (WLSH)",
"Empty Latent by Pixels (WLSH)",
"Empty Latent by Ratio (WLSH)", "Empty Latent by Ratio (WLSH)",
"Generate Edge Mask (WLSH)", "Generate Edge Mask (WLSH)",
"Generate Face Mask (WLSH)", "Generate Face Mask (WLSH)",
@ -2952,6 +3136,7 @@
"Resolutions by Ratio (WLSH)", "Resolutions by Ratio (WLSH)",
"SDXL Quick Empty Latent (WLSH)", "SDXL Quick Empty Latent (WLSH)",
"SDXL Quick Image Scale (WLSH)", "SDXL Quick Image Scale (WLSH)",
"SDXL Resolution Multiplier (WLSH)",
"SDXL Resolutions (WLSH)", "SDXL Resolutions (WLSH)",
"SDXL Steps (WLSH)", "SDXL Steps (WLSH)",
"Save Positive Prompt File (WLSH)", "Save Positive Prompt File (WLSH)",
@ -2969,6 +3154,7 @@
], ],
"https://github.com/wolfden/ComfyUi_PromptStylers": [ "https://github.com/wolfden/ComfyUi_PromptStylers": [
[ [
"SDXLPromptStylerAll",
"SDXLPromptStylerHorror", "SDXLPromptStylerHorror",
"SDXLPromptStylerMisc", "SDXLPromptStylerMisc",
"SDXLPromptStylerbyArtist", "SDXLPromptStylerbyArtist",
@ -2994,11 +3180,14 @@
"SDXLPromptStylerbyTimeofDay", "SDXLPromptStylerbyTimeofDay",
"SDXLPromptStylerbyWyvern", "SDXLPromptStylerbyWyvern",
"SDXLPromptbyCelticArt", "SDXLPromptbyCelticArt",
"SDXLPromptbyContemporaryNordicArt",
"SDXLPromptbyFashionArt", "SDXLPromptbyFashionArt",
"SDXLPromptbyGothicRevival", "SDXLPromptbyGothicRevival",
"SDXLPromptbyIrishFolkArt", "SDXLPromptbyIrishFolkArt",
"SDXLPromptbyRomanticNationalismArt",
"SDXLPromptbySportsArt", "SDXLPromptbySportsArt",
"SDXLPromptbyStreetArt", "SDXLPromptbyStreetArt",
"SDXLPromptbyVikingArt",
"SDXLPromptbyWildlifeArt" "SDXLPromptbyWildlifeArt"
], ],
{ {
@ -3050,12 +3239,20 @@
], ],
"https://github.com/youyegit/tdxh_node_comfyui": [ "https://github.com/youyegit/tdxh_node_comfyui": [
[ [
"TdxhBoolNumber",
"TdxhClipVison",
"TdxhControlNetApply",
"TdxhControlNetProcessor",
"TdxhFloatInput", "TdxhFloatInput",
"TdxhImageToSize", "TdxhImageToSize",
"TdxhImageToSizeAdvanced", "TdxhImageToSizeAdvanced",
"TdxhImg2ImgLatent",
"TdxhIntInput", "TdxhIntInput",
"TdxhLoraLoader", "TdxhLoraLoader",
"TdxhStringInput" "TdxhOnOrOff",
"TdxhReference",
"TdxhStringInput",
"TdxhStringInputTranslator"
], ],
{ {
"title_aux": "tdxh_node_comfyui" "title_aux": "tdxh_node_comfyui"

View File

@ -1,6 +1,9 @@
import sys import sys
import os import os
import git import git
import configparser
config_path = os.path.join(os.path.dirname(__file__), "config.ini")
def gitclone(custom_nodes_path, url): def gitclone(custom_nodes_path, url):
repo_name = os.path.splitext(os.path.basename(url))[0] repo_name = os.path.splitext(os.path.basename(url))[0]
@ -12,33 +15,38 @@ def gitclone(custom_nodes_path, url):
repo.close() repo.close()
def gitcheck(path, do_fetch=False): def gitcheck(path, do_fetch=False):
# Fetch the latest commits from the remote repository try:
repo = git.Repo(path) # Fetch the latest commits from the remote repository
repo = git.Repo(path)
current_branch = repo.active_branch current_branch = repo.active_branch
branch_name = current_branch.name branch_name = current_branch.name
remote_name = 'origin' remote_name = 'origin'
remote = repo.remote(name=remote_name) remote = repo.remote(name=remote_name)
if do_fetch: if do_fetch:
remote.fetch() remote.fetch()
# Get the current commit hash and the commit hash of the remote branch # Get the current commit hash and the commit hash of the remote branch
commit_hash = repo.head.commit.hexsha commit_hash = repo.head.commit.hexsha
remote_commit_hash = repo.refs[f'{remote_name}/{branch_name}'].object.hexsha remote_commit_hash = repo.refs[f'{remote_name}/{branch_name}'].object.hexsha
# Compare the commit hashes to determine if the local repository is behind the remote repository # Compare the commit hashes to determine if the local repository is behind the remote repository
if commit_hash != remote_commit_hash: if commit_hash != remote_commit_hash:
# Get the commit dates # Get the commit dates
commit_date = repo.head.commit.committed_datetime commit_date = repo.head.commit.committed_datetime
remote_commit_date = repo.refs[f'{remote_name}/{branch_name}'].object.committed_datetime remote_commit_date = repo.refs[f'{remote_name}/{branch_name}'].object.committed_datetime
# Compare the commit dates to determine if the local repository is behind the remote repository
if commit_date < remote_commit_date:
print("CUSTOM NODE CHECK: True")
else:
print("CUSTOM NODE CHECK: False")
except Exception as e:
print(e)
print("CUSTOM NODE CHECK: Error")
# Compare the commit dates to determine if the local repository is behind the remote repository
if commit_date < remote_commit_date:
print("CUSTOM NODE CHECK: True")
else:
print("CUSTOM NODE CHECK: False")
def gitpull(path): def gitpull(path):
# Check if the path is a git repository # Check if the path is a git repository
@ -50,12 +58,34 @@ def gitpull(path):
if repo.is_dirty(): if repo.is_dirty():
repo.git.stash() repo.git.stash()
origin = repo.remote(name='origin') commit_hash = repo.head.commit.hexsha
origin.pull(rebase=True) try:
repo.git.submodule('update', '--init', '--recursive') origin = repo.remote(name='origin')
origin.pull(rebase=True)
repo.git.submodule('update', '--init', '--recursive')
new_commit_hash = repo.head.commit.hexsha
if commit_hash != new_commit_hash:
print("CUSTOM NODE PULL: True")
else:
print("CUSTOM NODE PULL: None")
except Exception as e:
print(e)
print("CUSTOM NODE PULL: False")
repo.close() repo.close()
def setup_environment():
config = configparser.ConfigParser()
config.read(config_path)
if 'default' in config and 'git_exe' in config['default'] and config['default']['git_exe'] != '':
git.Git().update_environment(GIT_PYTHON_GIT_EXECUTABLE=config['default']['git_exe'])
setup_environment()
try: try:
if sys.argv[1] == "--clone": if sys.argv[1] == "--clone":
gitclone(sys.argv[2], sys.argv[3]) gitclone(sys.argv[2], sys.argv[3])

View File

@ -5,6 +5,7 @@ import {ComfyWidgets} from "../../scripts/widgets.js";
var update_comfyui_button = null; var update_comfyui_button = null;
var fetch_updates_button = null; var fetch_updates_button = null;
var update_all_button = null;
var badge_mode = "none"; var badge_mode = "none";
async function init_badge_mode() { async function init_badge_mode() {
@ -214,7 +215,7 @@ async function fetchUpdates(update_check_checkbox) {
const response = await api.fetchApi(`/customnode/fetch_updates?mode=${mode}`); const response = await api.fetchApi(`/customnode/fetch_updates?mode=${mode}`);
if(response.status == 400) { if(response.status != 200 && response.status != 201) {
app.ui.dialog.show('Failed to fetch updates.'); app.ui.dialog.show('Failed to fetch updates.');
app.ui.dialog.element.style.zIndex = 9999; app.ui.dialog.element.style.zIndex = 9999;
return false; return false;
@ -244,6 +245,49 @@ async function fetchUpdates(update_check_checkbox) {
} }
} }
async function updateAll(update_check_checkbox) {
let prev_text = update_all_button.innerText;
update_all_button.innerText = "Updating all...(ComfyUI)";
update_all_button.disabled = true;
update_all_button.style.backgroundColor = "gray";
try {
var mode = "url";
if(ManagerMenuDialog.instance.local_mode_checkbox.checked)
mode = "local";
update_all_button.innerText = "Updating all...";
const response1 = await api.fetchApi('/comfyui_manager/update_comfyui');
const response2 = await api.fetchApi(`/customnode/update_all?mode=${mode}`);
if(response1.status != 200 && response2.status != 201) {
app.ui.dialog.show('Failed to update ComfyUI or several extensions.<BR><BR>See terminal log.<BR>');
app.ui.dialog.element.style.zIndex = 9999;
return false;
}
if(response1.status == 201 || response2.status == 201) {
app.ui.dialog.show('ComfyUI and all extensions have been updated to the latest version.');
app.ui.dialog.element.style.zIndex = 9999;
}
else {
app.ui.dialog.show('ComfyUI and all extensions are already up-to-date with the latest versions.');
app.ui.dialog.element.style.zIndex = 9999;
}
return true;
}
catch(exception) {
app.ui.dialog.show(`Failed to update ComfyUI or several extensions / ${exception}`);
app.ui.dialog.element.style.zIndex = 9999;
return false;
}
finally {
update_all_button.disabled = false;
update_all_button.innerText = prev_text;
update_all_button.style.backgroundColor = "";
}
}
async function install_model(target) { async function install_model(target) {
if(ModelInstaller.instance) { if(ModelInstaller.instance) {
ModelInstaller.instance.startInstall(target); ModelInstaller.instance.startInstall(target);
@ -1768,6 +1812,14 @@ class ManagerMenuDialog extends ComfyDialog {
() => fetchUpdates(this.update_check_checkbox) () => fetchUpdates(this.update_check_checkbox)
}); });
update_all_button =
$el("button", {
type: "button",
textContent: "Update All",
onclick:
() => updateAll(this.update_check_checkbox)
});
// preview method // preview method
let preview_combo = document.createElement("select"); let preview_combo = document.createElement("select");
preview_combo.appendChild($el('option', {value:'auto', text:'Preview method: Auto'}, [])); preview_combo.appendChild($el('option', {value:'auto', text:'Preview method: Auto'}, []));
@ -1864,6 +1916,7 @@ class ManagerMenuDialog extends ComfyDialog {
}), }),
$el("br", {}, []), $el("br", {}, []),
update_all_button,
update_comfyui_button, update_comfyui_button,
fetch_updates_button, fetch_updates_button,
@ -1948,7 +2001,7 @@ app.registerExtension({
nodeType.prototype.onDrawForeground = function (ctx) { nodeType.prototype.onDrawForeground = function (ctx) {
const r = onDrawForeground?.apply?.(this, arguments); const r = onDrawForeground?.apply?.(this, arguments);
if(!this.flags.collapsed && badge_mode != 'none' && this.size[1] > LiteGraph.NODE_TITLE_HEIGHT) { if(!this.flags.collapsed && badge_mode != 'none' && nodeType.title_mode != LiteGraph.NO_TITLE) {
let text = ""; let text = "";
if(badge_mode == 'id_nick') if(badge_mode == 'id_nick')
text = `#${this.id} `; text = `#${this.id} `;

View File

@ -10,6 +10,16 @@
], ],
"install_type": "git-clone", "install_type": "git-clone",
"description": "A LaMa prerocessor for ComfyUi. You can find the processor in image/processors. <p style='background-color: black; color: red;'>NOTE: BEWARE THIS EXTENSION IS NOT FINISHED YET. At the moment it returns a preprocessed image that still needs to be injected with a custom controlnet implementation(missing)</p>" "description": "A LaMa prerocessor for ComfyUi. You can find the processor in image/processors. <p style='background-color: black; color: red;'>NOTE: BEWARE THIS EXTENSION IS NOT FINISHED YET. At the moment it returns a preprocessed image that still needs to be injected with a custom controlnet implementation(missing)</p>"
},
{
"author": "Dr.Lt.Data",
"title": "ComfyUI-Workflow-Component [WIP]",
"reference": "https://github.com/ltdrdata/ComfyUI-Workflow-Component",
"files": [
"https://github.com/ltdrdata/ComfyUI-Workflow-Component"
],
"install_type": "git-clone",
"description": "This extension provides the capability to use ComfyUI Workflow as a component and the ability to use the Image Refiner functionality based on components. NOTE: This is an experimental extension feature with no consideration for backward compatibility and can be highly unstable."
} }
] ]
} }

View File

@ -1,5 +1,125 @@
{ {
"custom_nodes": [ "custom_nodes": [
{
"author": "WASasquatch",
"title": "FreeU_Advanced",
"reference": "https://github.com/WASasquatch/FreeU_Advanced",
"files": [
"https://github.com/WASasquatch/FreeU_Advanced"
],
"install_type": "git-clone",
"description": "This custom node provides advanced settings for FreeU."
},
{
"author": "Tropfchen",
"title": "YARS: Yet Another Resolution Selector",
"reference": "https://github.com/Tropfchen/ComfyUI-yaResolutionSelector",
"files": [
"https://github.com/Tropfchen/ComfyUI-yaResolutionSelector"
],
"install_type": "git-clone",
"description": "A slightly different Resolution Selector node, allowing to freely change base resolution and aspect ratio, with options to maintain the pixel count or use the base resolution as the highest or lowest dimension."
},
{
"author": "mcmonkeyprojects",
"title": "Stable Diffusion Dynamic Thresholding (CFG Scale Fix)",
"reference": "https://github.com/mcmonkeyprojects/sd-dynamic-thresholding",
"files": [
"https://github.com/mcmonkeyprojects/sd-dynamic-thresholding"
],
"install_type": "git-clone",
"description": "Extension for StableSwarmUI, ComfyUI, and AUTOMATIC1111 Stable Diffusion WebUI that enables a way to use higher CFG Scales without color issues. This works by clamping latents between steps."
},
{
"author": "cubiq",
"title": "ComfyUI Essentials",
"reference": "https://github.com/cubiq/ComfyUI_essentials",
"files": [
"https://github.com/cubiq/ComfyUI_essentials"
],
"install_type": "git-clone",
"description": "Essential nodes that are weirdly missing from ComfyUI core. With few exceptions they are new features and not commodities. I hope this will be just a temporary repository until the nodes get included into ComfyUI."
},
{
"author": "laksjdjf",
"title": "cd-tuner_negpip-ComfyUI",
"reference": "https://github.com/laksjdjf/cd-tuner_negpip-ComfyUI",
"files": [
"https://github.com/laksjdjf/cd-tuner_negpip-ComfyUI"
],
"install_type": "git-clone",
"description": "Nodes:Apply CDTuner, Apply Negapip. This extension provides the <a href='https://github.com/hako-mikan/sd-webui-cd-tuner' target='blank'>CD(Color/Detail) Tuner</a> and the <a href='https://github.com/hako-mikan/sd-webui-negpip' target='blank'>Negative Prompt in the Prompt</a>features."
},
{
"author": "PTA",
"title": "auto nodes layout",
"reference": "https://github.com/phineas-pta/comfyui-auto-nodes-layout",
"files": [
"https://github.com/phineas-pta/comfyui-auto-nodes-layout"
],
"install_type": "git-clone",
"description": "A ComfyUI extension to apply better nodes layout algorithm to ComfyUI workflow (mostly for visualization purpose)"
},
{
"author": "rklaffehn",
"title": "rk-comfy-nodes",
"reference": "https://github.com/rklaffehn/rk-comfy-nodes",
"files": [
"https://github.com/rklaffehn/rk-comfy-nodes"
],
"install_type": "git-clone",
"description": "Nodes: RK_CivitAIMetaChecker, RK_CivitAIAddHashes."
},
{
"author": "receyuki",
"title": "comfyui-prompt-reader-node",
"reference": "https://github.com/receyuki/comfyui-prompt-reader-node",
"files": [
"https://github.com/receyuki/comfyui-prompt-reader-node"
],
"install_type": "git-clone",
"description": "Nodes: SDPromptReader"
},
{
"author": "spacepxl",
"title": "ComfyUI-HQ-Image-Save",
"reference": "https://github.com/spacepxl/ComfyUI-HQ-Image-Save",
"files": [
"https://github.com/spacepxl/ComfyUI-HQ-Image-Save"
],
"install_type": "git-clone",
"description": "Add Image Save nodes for TIFF 16 bit and EXR 32 bit formats. Probably only useful if you're applying a LUT or other color corrections, and care about preserving as much color accuracy as possible."
},
{
"author": "meap158",
"title": "ComfyUI-Prompt-Expansion",
"reference": "https://github.com/meap158/ComfyUI-Prompt-Expansion",
"files": [
"https://github.com/meap158/ComfyUI-Prompt-Expansion"
],
"install_type": "git-clone",
"description": "Dynamic prompt expansion, powered by GPT-2 locally on your device."
},
{
"author": "tusharbhutt",
"title": "Endless Nodes",
"reference": "https://github.com/tusharbhutt/Endless-Nodes",
"files": [
"https://github.com/tusharbhutt/Endless-Nodes"
],
"install_type": "git-clone",
"description": "A small set of nodes I created for various numerical and text inputs and outputs."
},
{
"author": "chrisgoringe",
"title": "Variation seeds",
"reference": "https://github.com/chrisgoringe/cg-noise",
"files": [
"https://github.com/chrisgoringe/cg-noise"
],
"install_type": "git-clone",
"description": "Adds KSampler custom nodes with variation seed and variation strength."
},
{ {
"author": "spinagon", "author": "spinagon",
"title": "Seamless tiling Node for ComfyUI", "title": "Seamless tiling Node for ComfyUI",
@ -106,9 +226,9 @@
"title": "ComfyUI-Latent-Modifiers", "title": "ComfyUI-Latent-Modifiers",
"reference": "https://github.com/Clybius/ComfyUI-Latent-Modifiers", "reference": "https://github.com/Clybius/ComfyUI-Latent-Modifiers",
"files": [ "files": [
"https://github.com/Clybius/ComfyUI-Latent-Modifiers/raw/main/sampler_mega_modifier.py" "https://github.com/Clybius/ComfyUI-Latent-Modifiers"
], ],
"install_type": "copy", "install_type": "git-clone",
"description": "Nodes: Latent Diffusion Mega Modifier. ComfyUI nodes which modify the latent during the diffusion process. (Sharpness, Tonemap, Rescale, Extra Noise)" "description": "Nodes: Latent Diffusion Mega Modifier. ComfyUI nodes which modify the latent during the diffusion process. (Sharpness, Tonemap, Rescale, Extra Noise)"
}, },
{ {
@ -361,26 +481,6 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "Nodes:Attention couple. This is a custom node that manipulates region-specific prompts. While vanilla ComfyUI employs an area specification method based on latent couples, this node divides regions using attention layers within UNet." "description": "Nodes:Attention couple. This is a custom node that manipulates region-specific prompts. While vanilla ComfyUI employs an area specification method based on latent couples, this node divides regions using attention layers within UNet."
}, },
{
"author": "Tropfchen",
"title": "Embedding Picker",
"reference": "https://github.com/Tropfchen/ComfyUI-Embedding_Picker",
"files": [
"https://github.com/Tropfchen/ComfyUI-Embedding_Picker"
],
"install_type": "git-clone",
"description": "Nodes: Embedding Picker. Tired of forgetting and misspelling often weird names of embeddings you use? Or perhaps you use only one, cause you forgot you have tens of them installed? Try this."
},
{
"author": "Vrahn",
"title": "ComfyUI-MasaCtrl-Node",
"reference": "https://github.com/Vrahn/ComfyUI-MasaCtrl-Node",
"files": [
"https://github.com/Vrahn/ComfyUI-MasaCtrl-Node"
],
"install_type": "git-clone",
"description": "Nodes: MasaCtrl."
},
{ {
"author": "spro", "author": "spro",
"title": "Latent Mirror node for ComfyUI", "title": "Latent Mirror node for ComfyUI",
@ -700,207 +800,6 @@
], ],
"install_type": "git-clone", "install_type": "git-clone",
"description": "Nodes: KSampler With Refiner (Fooocus). The KSampler from <a href='https://github.com/lllyasviel/Fooocus' target='blank'>Fooocus</a> as a ComfyUI node <p style='background-color: black; color: red;'>NOTE: This patches basic ComfyUI behaviour - don't use together with other samplers. Or perhaps do? Other samplers might profit from those changes ... ymmv.</p>" "description": "Nodes: KSampler With Refiner (Fooocus). The KSampler from <a href='https://github.com/lllyasviel/Fooocus' target='blank'>Fooocus</a> as a ComfyUI node <p style='background-color: black; color: red;'>NOTE: This patches basic ComfyUI behaviour - don't use together with other samplers. Or perhaps do? Other samplers might profit from those changes ... ymmv.</p>"
},
{
"author": "city96",
"title": "SD-Latent-Upscaler",
"reference": "https://github.com/city96/SD-Latent-Upscaler",
"files": [
"https://github.com/city96/SD-Latent-Upscaler"
],
"pip": ["huggingface-hub"],
"install_type": "git-clone",
"description": "Upscaling stable diffusion latents using a small neural network."
},
{
"author": "JPS-GER",
"title": "JPS Custom Nodes for ComfyUI",
"reference": "https://github.com/JPS-GER/ComfyUI_JPS-Nodes",
"files": [
"https://github.com/JPS-GER/ComfyUI_JPS-Nodes"
],
"install_type": "git-clone",
"description": "Nodes: SDXL - Resolutions, SDXL - Basic Settings, SDXL - Additional Settings, Math - Resolution Multiply, Math - Largest Integer, Switch - Generation Mode, ..."
},
{
"author": "hustille",
"title": "hus' utils for ComfyUI",
"reference": "https://github.com/hustille/ComfyUI_hus_utils",
"files": [
"https://github.com/hustille/ComfyUI_hus_utils"
],
"install_type": "git-clone",
"description": "ComfyUI nodes primarily for seed and filename generation"
},
{
"author": "m-sokes",
"title": "ComfyUI Sokes Nodes",
"reference": "https://github.com/m-sokes/ComfyUI-Sokes-Nodes",
"files": [
"https://github.com/m-sokes/ComfyUI-Sokes-Nodes"
],
"install_type": "git-clone",
"description": "Nodes: Empty Latent Randomizer (9 Inputs)"
},
{
"author": "Extraltodeus",
"title": "noise latent perlinpinpin",
"reference": "https://github.com/Extraltodeus/noise_latent_perlinpinpin",
"files": [
"https://github.com/Extraltodeus/noise_latent_perlinpinpin"
],
"install_type": "git-clone",
"description": "Nodes: NoisyLatentPerlin. This allows to create latent spaces filled with perlin-based noise that can actually be used by the samplers."
},
{
"author": "theUpsider",
"title": "ComfyUI-Logic",
"reference": "https://github.com/theUpsider/ComfyUI-Logic",
"files": [
"https://github.com/theUpsider/ComfyUI-Logic"
],
"install_type": "git-clone",
"description": "An extension to ComfyUI that introduces logic nodes and conditional rendering capabilities."
},
{
"author": "tkoenig89",
"title": "Load Image with metadata",
"reference": "https://github.com/tkoenig89/ComfyUI_Load_Image_With_Metadata",
"files": [
"https://github.com/tkoenig89/ComfyUI_Load_Image_With_Metadata"
],
"install_type": "git-clone",
"description": "A custom node for comfy ui to read generation data from images (prompt, seed, size...). This could be used when upscaling generated images to use the original prompt and seed."
},
{
"author": "mpiquero7164",
"title": "SaveImgPrompt",
"reference": "https://github.com/mpiquero7164/ComfyUI-SaveImgPrompt",
"files": [
"https://github.com/mpiquero7164/ComfyUI-SaveImgPrompt"
],
"install_type": "git-clone",
"description": "Save a png or jpeg and option to save prompt/workflow in a text or json file for each image in Comfy + Workflow loading."
},
{
"author": "city96",
"title": "SD-Advanced-Noise",
"reference": "https://github.com/city96/SD-Advanced-Noise",
"files": [
"https://github.com/city96/SD-Advanced-Noise"
],
"install_type": "git-clone",
"description": "Nodes: LatentGaussianNoise, MathEncode. An experimental custom node that generates latent noise directly by utilizing the linear characteristics of the latent space."
},
{
"author": "WASasquatch",
"title": "ComfyUI Preset Merger",
"reference": "https://github.com/WASasquatch/ComfyUI_Preset_Merger",
"files": [
"https://github.com/WASasquatch/ComfyUI_Preset_Merger"
],
"install_type": "git-clone",
"description": "Nodes: ModelMergeByPreset. Merge checkpoint models by preset"
},
{
"author": "jamesWalker55",
"title": "Various ComfyUI Nodes by Type",
"reference": "https://github.com/jamesWalker55/comfyui-various",
"files": [
"https://github.com/jamesWalker55/comfyui-various"
],
"install_type": "git-clone",
"description": "Nodes: JWInteger, JWFloat, JWString, JWImageLoadRGB, JWImageResize, ..."
},
{
"author": "NicholasMcCarthy",
"title": "ComfyUI_TravelSuite",
"reference": "https://github.com/NicholasMcCarthy/ComfyUI_TravelSuite",
"files": [
"https://github.com/NicholasMcCarthy/ComfyUI_TravelSuite"
],
"install_type": "git-clone",
"description": "ComfyUI custom nodes to apply various latent travel techniques."
},
{
"author": "ManglerFTW",
"title": "ComfyI2I",
"reference": "https://github.com/ManglerFTW/ComfyI2I",
"files": [
"https://github.com/ManglerFTW/ComfyI2I"
],
"install_type": "git-clone",
"description": "A set of custom nodes to perform image 2 image functions in ComfyUI."
},
{
"author": "city96",
"title": "Latent-Interposer",
"reference": "https://github.com/city96/SD-Latent-Interposer",
"files": [
"https://github.com/city96/SD-Latent-Interposer"
],
"install_type": "git-clone",
"description": "Custom node to convert the lantents between SDXL and SD v1.5 directly without the VAE decoding/encoding step."
},
{
"author": "coreyryanhanson",
"title": "ComfyQR",
"reference": "https://github.com/coreyryanhanson/ComfyQR",
"files": [
"https://github.com/coreyryanhanson/ComfyQR"
],
"install_type": "git-clone",
"description": "QR generation within ComfyUI. Contains nodes suitable for workflows from generating basic QR images to techniques with advanced QR masking."
},
{
"author": "uarefans",
"title": "ComfyUI-Fans",
"reference": "https://github.com/uarefans/ComfyUI-Fans",
"files": [
"https://github.com/uarefans/ComfyUI-Fans"
],
"install_type": "git-clone",
"description": "Nodes: Fans Styler (Max 10 Style), Fans Text Concat (Until 10 text)."
},
{
"author": "theUpsider",
"title": "Styles CSV Loader Extension for ComfyUI",
"reference": "https://github.com/theUpsider/ComfyUI-Styles_CSV_Loader",
"files": [
"https://github.com/theUpsider/ComfyUI-Styles_CSV_Loader"
],
"install_type": "git-clone",
"description": "This extension allows users to load styles from a CSV file, primarily for migration purposes from the automatic1111 Stable Diffusion web UI."
},
{
"author": "M1kep",
"title": "ComfyLiterals",
"reference": "https://github.com/M1kep/ComfyLiterals",
"files": [
"https://github.com/M1kep/ComfyLiterals"
],
"install_type": "git-clone",
"description": "Nodes: Int, Float, String, Operation, Checkpoint"
},
{
"author": "dimtoneff",
"title": "ComfyUI PixelArt Detector",
"reference": "https://github.com/dimtoneff/ComfyUI-PixelArt-Detector",
"files": [
"https://github.com/dimtoneff/ComfyUI-PixelArt-Detector"
],
"install_type": "git-clone",
"description": "This node manipulates the pixel art image in ways that it should look pixel perfect (downscales, changes palette, upscales etc.)."
},
{
"author": "dimtoneff",
"title": "Eagle PNGInfo",
"reference": "https://github.com/hylarucoder/ComfyUI-Eagle-PNGInfo",
"files": [
"https://github.com/hylarucoder/ComfyUI-Eagle-PNGInfo"
],
"install_type": "git-clone",
"description": "Nodes: EagleImageNode"
} }
] ]
} }

View File

@ -42,9 +42,11 @@
"https://github.com/ArtVentureX/comfyui-animatediff": [ "https://github.com/ArtVentureX/comfyui-animatediff": [
[ [
"AnimateDiffCombine", "AnimateDiffCombine",
"AnimateDiffLoader", "AnimateDiffModuleLoader",
"AnimateDiffLoader_v2", "AnimateDiffSampler",
"AnimateDiffUnload" "AnimateDiffSlidingWindowOptions",
"ImageSizeAndBatchSize",
"LoadVideo"
], ],
{ {
"title_aux": "AnimateDiff" "title_aux": "AnimateDiff"
@ -167,7 +169,7 @@
"title_aux": "ComfyUI_Ib_CustomNodes" "title_aux": "ComfyUI_Ib_CustomNodes"
} }
], ],
"https://github.com/Clybius/ComfyUI-Latent-Modifiers/raw/main/sampler_mega_modifier.py": [ "https://github.com/Clybius/ComfyUI-Latent-Modifiers": [
[ [
"Latent Diffusion Mega Modifier" "Latent Diffusion Mega Modifier"
], ],
@ -354,6 +356,9 @@
"DWPreprocessor", "DWPreprocessor",
"FakeScribblePreprocessor", "FakeScribblePreprocessor",
"HEDPreprocessor", "HEDPreprocessor",
"HintImageEnchance",
"ImageGenResolutionFromImage",
"ImageGenResolutionFromLatent",
"InpaintPreprocessor", "InpaintPreprocessor",
"LeReS-DepthMapPreprocessor", "LeReS-DepthMapPreprocessor",
"LineArtPreprocessor", "LineArtPreprocessor",
@ -366,6 +371,8 @@
"OneFormer-COCO-SemSegPreprocessor", "OneFormer-COCO-SemSegPreprocessor",
"OpenposePreprocessor", "OpenposePreprocessor",
"PiDiNetPreprocessor", "PiDiNetPreprocessor",
"PixelPerfectResolution",
"RaftOpticalFlowPreprocessor",
"SAMPreprocessor", "SAMPreprocessor",
"ScribblePreprocessor", "ScribblePreprocessor",
"Scribble_XDoG_Preprocessor", "Scribble_XDoG_Preprocessor",
@ -515,12 +522,13 @@
], ],
"https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet": [ "https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet": [
[ [
"ControlNetApplyPartialBatch",
"ControlNetLoaderAdvanced", "ControlNetLoaderAdvanced",
"CustomControlNetWeights", "CustomControlNetWeights",
"CustomT2IAdapterWeights", "CustomT2IAdapterWeights",
"DiffControlNetLoaderAdvanced", "DiffControlNetLoaderAdvanced",
"LatentKeyframe", "LatentKeyframe",
"LatentKeyframeGroup",
"LatentKeyframeTiming",
"LoadImagesFromDirectory", "LoadImagesFromDirectory",
"ScaledSoftControlNetWeights", "ScaledSoftControlNetWeights",
"SoftControlNetWeights", "SoftControlNetWeights",
@ -534,8 +542,11 @@
"https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved": [ "https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved": [
[ [
"ADE_AnimateDiffCombine", "ADE_AnimateDiffCombine",
"ADE_AnimateDiffLoaderLegacy", "ADE_AnimateDiffLoaderV1Advanced",
"ADE_AnimateDiffLoaderWithContext",
"ADE_AnimateDiffUniformContextOptions",
"ADE_AnimateDiffUnload", "ADE_AnimateDiffUnload",
"ADE_EmptyLatentImageLarge",
"AnimateDiffLoaderV1", "AnimateDiffLoaderV1",
"CheckpointLoaderSimpleWithNoiseSelect" "CheckpointLoaderSimpleWithNoiseSelect"
], ],
@ -800,6 +811,7 @@
"https://github.com/RockOfFire/CR_Animation_Nodes": [ "https://github.com/RockOfFire/CR_Animation_Nodes": [
[ [
"CR Central Schedule", "CR Central Schedule",
"CR Combine Schedules",
"CR Current Frame", "CR Current Frame",
"CR Cycle Images", "CR Cycle Images",
"CR Cycle Images Simple", "CR Cycle Images Simple",
@ -822,15 +834,17 @@
"CR Keyframe List", "CR Keyframe List",
"CR LoRA List", "CR LoRA List",
"CR Load Animation Frames", "CR Load Animation Frames",
"CR Load Schedule From File",
"CR Load Scheduled ControlNets",
"CR Load Scheduled LoRAs", "CR Load Scheduled LoRAs",
"CR Load Scheduled Models", "CR Load Scheduled Models",
"CR Model List", "CR Model List",
"CR Output Schedule List",
"CR Output Schedule To File", "CR Output Schedule To File",
"CR Prompt List", "CR Prompt List",
"CR Prompt List Keyframes", "CR Prompt List Keyframes",
"CR Prompt Text", "CR Prompt Text",
"CR Schedule Input Switch", "CR Schedule Input Switch",
"CR Schedule To ScheduleList",
"CR Simple Prompt List", "CR Simple Prompt List",
"CR Simple Prompt List Keyframes", "CR Simple Prompt List Keyframes",
"CR Simple Schedule", "CR Simple Schedule",
@ -852,6 +866,7 @@
"CR Apply ControlNet", "CR Apply ControlNet",
"CR Apply LoRA Stack", "CR Apply LoRA Stack",
"CR Apply Model Merge", "CR Apply Model Merge",
"CR Apply Multi Upscale",
"CR Apply Multi-ControlNet", "CR Apply Multi-ControlNet",
"CR Aspect Ratio", "CR Aspect Ratio",
"CR Aspect Ratio SDXL", "CR Aspect Ratio SDXL",
@ -883,6 +898,7 @@
"CR Module Input", "CR Module Input",
"CR Module Output", "CR Module Output",
"CR Module Pipe Loader", "CR Module Pipe Loader",
"CR Multi Upscale Stack",
"CR Multi-ControlNet Stack", "CR Multi-ControlNet Stack",
"CR Pipe Switch", "CR Pipe Switch",
"CR Process Switch", "CR Process Switch",
@ -896,7 +912,8 @@
"CR Seed to Int", "CR Seed to Int",
"CR Switch Model and CLIP", "CR Switch Model and CLIP",
"CR Text Input Switch", "CR Text Input Switch",
"CR Text Input Switch (4 way)" "CR Text Input Switch (4 way)",
"CR Upscale Image"
], ],
{ {
"title_aux": "ComfyUI_Comfyroll_CustomNodes" "title_aux": "ComfyUI_Comfyroll_CustomNodes"
@ -1043,7 +1060,10 @@
], ],
"https://github.com/TRI3D-LC/tri3d-comfyui-nodes": [ "https://github.com/TRI3D-LC/tri3d-comfyui-nodes": [
[ [
"tri3d-extract-hand" "tri3d-atr-parse",
"tri3d-extract-hand",
"tri3d-fuzzification",
"tri3d-position-hands"
], ],
{ {
"title_aux": "tri3d-comfyui-nodes" "title_aux": "tri3d-comfyui-nodes"
@ -1104,6 +1124,15 @@
"title_aux": "Embedding Picker" "title_aux": "Embedding Picker"
} }
], ],
"https://github.com/Tropfchen/ComfyUI-yaResolutionSelector": [
[
"YARS",
"YARSAdv"
],
{
"title_aux": "YARS: Yet Another Resolution Selector"
}
],
"https://github.com/Ttl/ComfyUi_NNLatentUpscale": [ "https://github.com/Ttl/ComfyUi_NNLatentUpscale": [
[ [
"NNLatentUpscale" "NNLatentUpscale"
@ -1112,14 +1141,6 @@
"title_aux": "ComfyUI Neural network latent upscale custom node" "title_aux": "ComfyUI Neural network latent upscale custom node"
} }
], ],
"https://github.com/Vrahn/ComfyUI-MasaCtrl-Node": [
[
"MasaCtrl"
],
{
"title_aux": "ComfyUI-MasaCtrl-Node"
}
],
"https://github.com/WASasquatch/ComfyUI_Preset_Merger": [ "https://github.com/WASasquatch/ComfyUI_Preset_Merger": [
[ [
"Preset_Model_Merge" "Preset_Model_Merge"
@ -1128,6 +1149,14 @@
"title_aux": "ComfyUI Preset Merger" "title_aux": "ComfyUI Preset Merger"
} }
], ],
"https://github.com/WASasquatch/FreeU_Advanced": [
[
"FreeU (Advanced)"
],
{
"title_aux": "FreeU_Advanced"
}
],
"https://github.com/WASasquatch/PPF_Noise_ComfyUI": [ "https://github.com/WASasquatch/PPF_Noise_ComfyUI": [
[ [
"Blend Latents (PPF Noise)", "Blend Latents (PPF Noise)",
@ -1393,7 +1422,9 @@
"https://github.com/Zuellni/ComfyUI-ExLlama": [ "https://github.com/Zuellni/ComfyUI-ExLlama": [
[ [
"ZuellniExLlamaGenerator", "ZuellniExLlamaGenerator",
"ZuellniExLlamaLoader" "ZuellniExLlamaLoader",
"ZuellniExLlamaLora",
"ZuellniExLlamaPreviewer"
], ],
{ {
"title_aux": "ComfyUI-ExLlama" "title_aux": "ComfyUI-ExLlama"
@ -1437,22 +1468,32 @@
"CSV Generator [Dream]", "CSV Generator [Dream]",
"Calculation [Dream]", "Calculation [Dream]",
"Common Frame Dimensions [Dream]", "Common Frame Dimensions [Dream]",
"Compare Palettes [Dream]",
"FFMPEG Video Encoder [Dream]", "FFMPEG Video Encoder [Dream]",
"File Count [Dream]", "File Count [Dream]",
"Finalize Prompt [Dream]", "Finalize Prompt [Dream]",
"Float Input [Dream]", "Float Input [Dream]",
"Float to Log Entry [Dream]",
"Frame Count Calculator [Dream]", "Frame Count Calculator [Dream]",
"Frame Counter (Directory) [Dream]", "Frame Counter (Directory) [Dream]",
"Frame Counter (Simple) [Dream]", "Frame Counter (Simple) [Dream]",
"Frame Counter Info [Dream]", "Frame Counter Info [Dream]",
"Frame Counter Offset [Dream]", "Frame Counter Offset [Dream]",
"Frame Counter Time Offset [Dream]",
"Image Brightness Adjustment [Dream]",
"Image Color Shift [Dream]",
"Image Contrast Adjustment [Dream]",
"Image Motion [Dream]", "Image Motion [Dream]",
"Image Sequence Blend [Dream]", "Image Sequence Blend [Dream]",
"Image Sequence Loader [Dream]", "Image Sequence Loader [Dream]",
"Image Sequence Saver [Dream]", "Image Sequence Saver [Dream]",
"Image Sequence Tweening [Dream]", "Image Sequence Tweening [Dream]",
"Int Input [Dream]", "Int Input [Dream]",
"Int to Log Entry [Dream]",
"Laboratory [Dream]",
"Linear Curve [Dream]", "Linear Curve [Dream]",
"Log Entry Joiner [Dream]",
"Log File [Dream]",
"Noise from Area Palettes [Dream]", "Noise from Area Palettes [Dream]",
"Noise from Palette [Dream]", "Noise from Palette [Dream]",
"Palette Color Align [Dream]", "Palette Color Align [Dream]",
@ -1463,10 +1504,13 @@
"Sine Curve [Dream]", "Sine Curve [Dream]",
"Smooth Event Curve [Dream]", "Smooth Event Curve [Dream]",
"String Input [Dream]", "String Input [Dream]",
"String Tokenizer [Dream]",
"String to Log Entry [Dream]",
"Text Input [Dream]", "Text Input [Dream]",
"Triangle Curve [Dream]", "Triangle Curve [Dream]",
"Triangle Event Curve [Dream]", "Triangle Event Curve [Dream]",
"Video Encoder (mpegCoder) [Dream]" "Video Encoder (mpegCoder) [Dream]",
"WAV Curve [Dream]"
], ],
{ {
"title_aux": "Dream Project Animation Nodes" "title_aux": "Dream Project Animation Nodes"
@ -1535,6 +1579,8 @@
"Prompt With Style", "Prompt With Style",
"Prompt With Style V2", "Prompt With Style V2",
"Prompt With Style V3", "Prompt With Style V3",
"Range Float",
"Range Integer",
"Ratio Advanced", "Ratio Advanced",
"Resize Image for SDXL", "Resize Image for SDXL",
"Save Image If True", "Save Image If True",
@ -1579,8 +1625,12 @@
"ChameleonMask", "ChameleonMask",
"CheckpointLoader (dirty)", "CheckpointLoader (dirty)",
"CheckpointLoaderSimple (dirty)", "CheckpointLoaderSimple (dirty)",
"Color (RGB)",
"Color (hexadecimal)",
"Color Clip", "Color Clip",
"Color Clip (advanced)",
"Color Clip ADE20k", "Color Clip ADE20k",
"ColorDictionary",
"CondList", "CondList",
"Conditioning (combine multiple)", "Conditioning (combine multiple)",
"Conditioning (combine selective)", "Conditioning (combine selective)",
@ -1591,10 +1641,15 @@
"Contours", "Contours",
"ControlNetHadamard", "ControlNetHadamard",
"ControlNetHadamard (manual)", "ControlNetHadamard (manual)",
"ConvertImg",
"CopyMakeBorder",
"CreateRequestMetadata", "CreateRequestMetadata",
"Draw Contour(s)", "Draw Contour(s)",
"EqualizeHistogram", "EqualizeHistogram",
"EstimateColorInterval (hsv)",
"Filter Contour", "Filter Contour",
"FindComplementaryColor",
"FindThreshold",
"FlatLatentsIntoSingleGrid", "FlatLatentsIntoSingleGrid",
"Framed Mask Grab Cut", "Framed Mask Grab Cut",
"Framed Mask Grab Cut 2", "Framed Mask Grab Cut 2",
@ -1602,14 +1657,19 @@
"Get Models", "Get Models",
"Get Prompt", "Get Prompt",
"HypernetworkLoader (dirty)", "HypernetworkLoader (dirty)",
"InRange (hsv)",
"Inpaint", "Inpaint",
"Input/String to Int Array", "Input/String to Int Array",
"KMeansColor",
"Load 64 Encoded Image", "Load 64 Encoded Image",
"LoraLoader (dirty)", "LoraLoader (dirty)",
"MaskGrid N KSamplers Advanced", "MaskGrid N KSamplers Advanced",
"Merge Latent Batch Gridwise", "Merge Latent Batch Gridwise",
"MonoMerge", "MonoMerge",
"MorphologicOperation",
"MorphologicSkeletoning",
"OtsuThreshold", "OtsuThreshold",
"RGB to HSV",
"Rect Grab Cut", "Rect Grab Cut",
"Repeat Into Grid (image)", "Repeat Into Grid (image)",
"Repeat Into Grid (latent)", "Repeat Into Grid (latent)",
@ -1728,6 +1788,17 @@
"title_aux": "sc-node-comfyui" "title_aux": "sc-node-comfyui"
} }
], ],
"https://github.com/chrisgoringe/cg-noise": [
[
"Hijack",
"KSampler Advanced with Variations",
"KSampler with Variations",
"UnHijack"
],
{
"title_aux": "Variation seeds"
}
],
"https://github.com/city96/ComfyUI_DiT": [ "https://github.com/city96/ComfyUI_DiT": [
[ [
"DiTCheckpointLoader", "DiTCheckpointLoader",
@ -1821,7 +1892,6 @@
"https://github.com/cubiq/ComfyUI_IPAdapter_plus": [ "https://github.com/cubiq/ComfyUI_IPAdapter_plus": [
[ [
"IPAdapterApply", "IPAdapterApply",
"IPAdapterCLIPVisionEncode",
"IPAdapterModelLoader" "IPAdapterModelLoader"
], ],
{ {
@ -1837,6 +1907,26 @@
"title_aux": "Simple Math" "title_aux": "Simple Math"
} }
], ],
"https://github.com/cubiq/ComfyUI_essentials": [
[
"ConsoleDebug+",
"GetImageSize+",
"GrowShrinkMask+",
"ImageCASharpening+",
"ImageCrop+",
"ImageDesaturate+",
"ImageFlip+",
"ImagePosterize+",
"ImageResize+",
"MaskBlur+",
"MaskFlip+",
"MaskPreview+",
"SimpleMath+"
],
{
"title_aux": "ComfyUI Essentials"
}
],
"https://github.com/dagthomas/comfyui_dagthomas": [ "https://github.com/dagthomas/comfyui_dagthomas": [
[ [
"CSL", "CSL",
@ -2136,6 +2226,16 @@
"title_aux": "attention-couple-ComfyUI" "title_aux": "attention-couple-ComfyUI"
} }
], ],
"https://github.com/laksjdjf/cd-tuner_negpip-ComfyUI": [
[
"CDTuner",
"Negapip",
"Negpip"
],
{
"title_aux": "cd-tuner_negpip-ComfyUI"
}
],
"https://github.com/laksjdjf/pfg-ComfyUI": [ "https://github.com/laksjdjf/pfg-ComfyUI": [
[ [
"PFG" "PFG"
@ -2273,6 +2373,7 @@
"ReencodeLatentPipe", "ReencodeLatentPipe",
"RegionalPrompt", "RegionalPrompt",
"RegionalSampler", "RegionalSampler",
"RegionalSamplerAdvanced",
"RemoveNoiseMask", "RemoveNoiseMask",
"SAMDetectorCombined", "SAMDetectorCombined",
"SAMDetectorSegmented", "SAMDetectorSegmented",
@ -2316,9 +2417,14 @@
[ [
"Canny_Preprocessor_Provider_for_SEGS //Inspire", "Canny_Preprocessor_Provider_for_SEGS //Inspire",
"DWPreprocessor_Provider_for_SEGS //Inspire", "DWPreprocessor_Provider_for_SEGS //Inspire",
"FakeScribblePreprocessor_Provider_for_SEGS //Inspire",
"GlobalSeed //Inspire",
"HEDPreprocessor_Provider_for_SEGS //Inspire",
"KSampler //Inspire", "KSampler //Inspire",
"KSamplerAdvanced //Inspire",
"LeRes_DepthMap_Preprocessor_Provider_for_SEGS //Inspire", "LeRes_DepthMap_Preprocessor_Provider_for_SEGS //Inspire",
"LoadPromptsFromDir //Inspire", "LoadPromptsFromDir //Inspire",
"LoadPromptsFromFile //Inspire",
"LoraBlockInfo //Inspire", "LoraBlockInfo //Inspire",
"LoraLoaderBlockWeight //Inspire", "LoraLoaderBlockWeight //Inspire",
"MediaPipeFaceMeshDetectorProvider //Inspire", "MediaPipeFaceMeshDetectorProvider //Inspire",
@ -2377,6 +2483,15 @@
"title_aux": "Facerestore CF (Code Former)" "title_aux": "Facerestore CF (Code Former)"
} }
], ],
"https://github.com/mcmonkeyprojects/sd-dynamic-thresholding": [
[
"DynamicThresholdingFull",
"DynamicThresholdingSimple"
],
{
"title_aux": "Stable Diffusion Dynamic Thresholding (CFG Scale Fix)"
}
],
"https://github.com/meap158/ComfyUI-GPU-temperature-protection": [ "https://github.com/meap158/ComfyUI-GPU-temperature-protection": [
[ [
"GPUTemperatureProtection" "GPUTemperatureProtection"
@ -2385,6 +2500,14 @@
"title_aux": "GPU temperature protection" "title_aux": "GPU temperature protection"
} }
], ],
"https://github.com/meap158/ComfyUI-Prompt-Expansion": [
[
"PromptExpansion"
],
{
"title_aux": "ComfyUI-Prompt-Expansion"
}
],
"https://github.com/melMass/comfy_mtb": [ "https://github.com/melMass/comfy_mtb": [
[ [
"Animation Builder (mtb)", "Animation Builder (mtb)",
@ -2558,9 +2681,7 @@
[ [
"AdaptiveCannyDetector_PoP", "AdaptiveCannyDetector_PoP",
"AnyAspectRatio", "AnyAspectRatio",
"ConditioningMultiplierPoP",
"ConditioningMultiplier_PoP", "ConditioningMultiplier_PoP",
"ConditioningNormalizerPoP",
"ConditioningNormalizer_PoP", "ConditioningNormalizer_PoP",
"LoadImageResizer_PoP", "LoadImageResizer_PoP",
"LoraStackLoader10_PoP", "LoraStackLoader10_PoP",
@ -2608,6 +2729,21 @@
"title_aux": "A8R8 ComfyUI Nodes" "title_aux": "A8R8 ComfyUI Nodes"
} }
], ],
"https://github.com/receyuki/comfyui-prompt-reader-node": [
[
"SDParameterGenerator",
"SDPromptMerger",
"SDPromptReader",
"SDPromptSaver"
],
{
"author": "receyuki",
"description": "ComfyUI node version of SD Prompt Reader",
"nickname": "SD Prompt Reader",
"title": "SD Prompt Reader",
"title_aux": "comfyui-prompt-reader-node"
}
],
"https://github.com/richinsley/Comfy-LFO": [ "https://github.com/richinsley/Comfy-LFO": [
[ [
"LFO_Pulse", "LFO_Pulse",
@ -2620,6 +2756,15 @@
"title_aux": "Comfy-LFO" "title_aux": "Comfy-LFO"
} }
], ],
"https://github.com/rklaffehn/rk-comfy-nodes": [
[
"RK_CivitAIAddHashes",
"RK_CivitAIMetaChecker"
],
{
"title_aux": "rk-comfy-nodes"
}
],
"https://github.com/s1dlx/comfy_meh/raw/main/meh.py": [ "https://github.com/s1dlx/comfy_meh/raw/main/meh.py": [
[ [
"MergingExecutionHelper" "MergingExecutionHelper"
@ -2675,6 +2820,7 @@
[ [
"AV_CheckpointModelsToParametersPipe", "AV_CheckpointModelsToParametersPipe",
"AV_ControlNetEfficientLoader", "AV_ControlNetEfficientLoader",
"AV_ControlNetEfficientLoaderAdvanced",
"AV_ControlNetEfficientStacker", "AV_ControlNetEfficientStacker",
"AV_ControlNetLoader", "AV_ControlNetLoader",
"AV_ControlNetPreprocessor", "AV_ControlNetPreprocessor",
@ -2688,6 +2834,7 @@
"BLIPCaption", "BLIPCaption",
"ColorBlend", "ColorBlend",
"ColorCorrect", "ColorCorrect",
"DeepDanbooruCaption",
"DependenciesEdit", "DependenciesEdit",
"Fooocus_KSampler", "Fooocus_KSampler",
"Fooocus_KSamplerAdvanced", "Fooocus_KSamplerAdvanced",
@ -2742,8 +2889,22 @@
"title_aux": "nui suite" "title_aux": "nui suite"
} }
], ],
"https://github.com/spacepxl/ComfyUI-HQ-Image-Save": [
[
"LoadLatentEXR",
"SaveEXR",
"SaveLatentEXR",
"SaveTiff"
],
{
"title_aux": "ComfyUI-HQ-Image-Save"
}
],
"https://github.com/spinagon/ComfyUI-seamless-tiling": [ "https://github.com/spinagon/ComfyUI-seamless-tiling": [
[ [
"CircularVAEDecode",
"MakeCircularVAE",
"OffsetImage",
"SeamlessTile" "SeamlessTile"
], ],
{ {
@ -2836,7 +2997,10 @@
], ],
"https://github.com/szhublox/ambw_comfyui": [ "https://github.com/szhublox/ambw_comfyui": [
[ [
"Auto Merge Block Weighted" "Auto Merge Block Weighted",
"CLIPMergeSimple",
"ModelMergeBlocks",
"ModelMergeSimple"
], ],
{ {
"title_aux": "Auto-MBW" "title_aux": "Auto-MBW"
@ -2910,6 +3074,25 @@
"title_aux": "Hakkun-ComfyUI-nodes" "title_aux": "Hakkun-ComfyUI-nodes"
} }
], ],
"https://github.com/tusharbhutt/Endless-Nodes": [
[
"Endless Nodes Combo Parameterizer",
"Endless Nodes Combo Parameterizer & Prompts",
"Endless Nodes Eight Input Text Switch",
"Endless Nodes Parameterizer",
"Endless Nodes Parameterizer & Prompts",
"Endless Nodes Six Input Text Switch",
"Endless Nodes Six Integer IO Switch",
"Endless Nodes Six Integer IO Widget"
],
{
"author": "Endless Sea of Stars",
"description": "A small set of nodes I created for various numerical and text inputs.",
"nickname": "Endless Nodes",
"title": "Endless Nodes",
"title_aux": "Endless Nodes"
}
],
"https://github.com/twri/sdxl_prompt_styler": [ "https://github.com/twri/sdxl_prompt_styler": [
[ [
"SDXLPromptStyler", "SDXLPromptStyler",
@ -2939,6 +3122,7 @@
"CLIP Positive-Negative XL w/Text (WLSH)", "CLIP Positive-Negative XL w/Text (WLSH)",
"CLIP Positive-Negative w/Text (WLSH)", "CLIP Positive-Negative w/Text (WLSH)",
"Checkpoint Loader w/Name (WLSH)", "Checkpoint Loader w/Name (WLSH)",
"Empty Latent by Pixels (WLSH)",
"Empty Latent by Ratio (WLSH)", "Empty Latent by Ratio (WLSH)",
"Generate Edge Mask (WLSH)", "Generate Edge Mask (WLSH)",
"Generate Face Mask (WLSH)", "Generate Face Mask (WLSH)",
@ -2952,6 +3136,7 @@
"Resolutions by Ratio (WLSH)", "Resolutions by Ratio (WLSH)",
"SDXL Quick Empty Latent (WLSH)", "SDXL Quick Empty Latent (WLSH)",
"SDXL Quick Image Scale (WLSH)", "SDXL Quick Image Scale (WLSH)",
"SDXL Resolution Multiplier (WLSH)",
"SDXL Resolutions (WLSH)", "SDXL Resolutions (WLSH)",
"SDXL Steps (WLSH)", "SDXL Steps (WLSH)",
"Save Positive Prompt File (WLSH)", "Save Positive Prompt File (WLSH)",
@ -2969,6 +3154,7 @@
], ],
"https://github.com/wolfden/ComfyUi_PromptStylers": [ "https://github.com/wolfden/ComfyUi_PromptStylers": [
[ [
"SDXLPromptStylerAll",
"SDXLPromptStylerHorror", "SDXLPromptStylerHorror",
"SDXLPromptStylerMisc", "SDXLPromptStylerMisc",
"SDXLPromptStylerbyArtist", "SDXLPromptStylerbyArtist",
@ -2994,11 +3180,14 @@
"SDXLPromptStylerbyTimeofDay", "SDXLPromptStylerbyTimeofDay",
"SDXLPromptStylerbyWyvern", "SDXLPromptStylerbyWyvern",
"SDXLPromptbyCelticArt", "SDXLPromptbyCelticArt",
"SDXLPromptbyContemporaryNordicArt",
"SDXLPromptbyFashionArt", "SDXLPromptbyFashionArt",
"SDXLPromptbyGothicRevival", "SDXLPromptbyGothicRevival",
"SDXLPromptbyIrishFolkArt", "SDXLPromptbyIrishFolkArt",
"SDXLPromptbyRomanticNationalismArt",
"SDXLPromptbySportsArt", "SDXLPromptbySportsArt",
"SDXLPromptbyStreetArt", "SDXLPromptbyStreetArt",
"SDXLPromptbyVikingArt",
"SDXLPromptbyWildlifeArt" "SDXLPromptbyWildlifeArt"
], ],
{ {
@ -3050,12 +3239,20 @@
], ],
"https://github.com/youyegit/tdxh_node_comfyui": [ "https://github.com/youyegit/tdxh_node_comfyui": [
[ [
"TdxhBoolNumber",
"TdxhClipVison",
"TdxhControlNetApply",
"TdxhControlNetProcessor",
"TdxhFloatInput", "TdxhFloatInput",
"TdxhImageToSize", "TdxhImageToSize",
"TdxhImageToSizeAdvanced", "TdxhImageToSizeAdvanced",
"TdxhImg2ImgLatent",
"TdxhIntInput", "TdxhIntInput",
"TdxhLoraLoader", "TdxhLoraLoader",
"TdxhStringInput" "TdxhOnOrOff",
"TdxhReference",
"TdxhStringInput",
"TdxhStringInputTranslator"
], ],
{ {
"title_aux": "tdxh_node_comfyui" "title_aux": "tdxh_node_comfyui"

File diff suppressed because one or more lines are too long

View File

@ -4,44 +4,81 @@ import subprocess
import sys import sys
import atexit import atexit
import threading import threading
import re
# Logger setup try:
if os.path.exists("comfyui.log"): # Logger setup
if os.path.exists("comfyui.prev.log"): if os.path.exists("comfyui.log"):
os.remove("comfyui.prev.log") if os.path.exists("comfyui.prev.log"):
os.rename("comfyui.log", "comfyui.prev.log") if os.path.exists("comfyui.prev2.log"):
os.remove("comfyui.prev2.log")
os.rename("comfyui.prev.log", "comfyui.prev2.log")
os.rename("comfyui.log", "comfyui.prev.log")
original_stdout = sys.stdout original_stdout = sys.stdout
original_stderr = sys.stderr original_stderr = sys.stderr
tqdm = r'\d+%.*\[(.*?)\]'
log_file = open("comfyui.log", "w", encoding="utf-8")
log_lock = threading.Lock()
class Logger:
def __init__(self, is_stdout):
self.is_stdout = is_stdout
def write(self, message):
if not self.is_stdout:
match = re.search(tqdm, message)
if match:
message = re.sub(r'([#|])\d', r'\1▌', message)
message = re.sub('#', '', message)
if '100%' in message:
self.sync_write(message)
else:
original_stderr.write(message)
original_stderr.flush()
else:
self.sync_write(message)
else:
self.sync_write(message)
def sync_write(self, message):
with log_lock:
log_file.write(message)
log_file.flush()
if self.is_stdout:
original_stdout.write(message)
original_stdout.flush()
else:
original_stderr.write(message)
original_stderr.flush()
def flush(self):
log_file.flush()
if self.is_stdout:
original_stdout.flush()
else:
original_stderr.flush()
class Logger: def handle_stream(stream, prefix):
def __init__(self, filename): for line in stream:
self.file = open(filename, "w", encoding="utf-8") print(prefix, line, end="")
def write(self, message):
self.file.write(message)
self.file.flush()
original_stdout.write(message)
original_stdout.flush()
def flush(self):
self.file.flush()
original_stdout.flush()
def close_file(self):
self.file.close()
def handle_stream(stream, prefix): def close_log():
for line in stream: log_file.close()
print(prefix, line, end="")
sys.stdout = Logger("comfyui.log") sys.stdout = Logger(True)
sys.stderr = sys.stdout sys.stderr = Logger(False)
atexit.register(close_log)
except Exception as e:
print(f"[ComfyUI-Manager] Logging failed: {e}")
atexit.register(sys.stdout.close_file)
print("** ComfyUI start up time:", datetime.datetime.now()) print("** ComfyUI start up time:", datetime.datetime.now())

View File

@ -4,7 +4,7 @@ import json
from git import Repo from git import Repo
from torchvision.datasets.utils import download_url from torchvision.datasets.utils import download_url
builtin_nodes = ["KSampler"] builtin_nodes = ["KSampler", "CheckpointSave"]
def scan_in_file(filename): def scan_in_file(filename):
try: try:

View File

@ -5,24 +5,29 @@ import subprocess
def get_enabled_subdirectories_with_files(base_directory): def get_enabled_subdirectories_with_files(base_directory):
subdirs_with_files = [] subdirs_with_files = []
for subdir in os.listdir(base_directory): for subdir in os.listdir(base_directory):
full_path = os.path.join(base_directory, subdir) try:
if os.path.isdir(full_path) and not subdir.endswith(".disabled") and not subdir.startswith('.') and subdir != '__pycache__': full_path = os.path.join(base_directory, subdir)
print(f"## Install dependencies for '{subdir}'") if os.path.isdir(full_path) and not subdir.endswith(".disabled") and not subdir.startswith('.') and subdir != '__pycache__':
requirements_file = os.path.join(full_path, "requirements.txt") print(f"## Install dependencies for '{subdir}'")
install_script = os.path.join(full_path, "install.py") requirements_file = os.path.join(full_path, "requirements.txt")
install_script = os.path.join(full_path, "install.py")
if os.path.isfile(requirements_file) and os.path.isfile(install_script): if os.path.exists(requirements_file) or os.path.exists(install_script):
subdirs_with_files.append((full_path, requirements_file, install_script)) subdirs_with_files.append((full_path, requirements_file, install_script))
except Exception as e:
print(f"EXCEPTION During Dependencies INSTALL on '{subdir}':\n{e}")
return subdirs_with_files return subdirs_with_files
def install_requirements(requirements_file_path): def install_requirements(requirements_file_path):
subprocess.run(["pip", "install", "-r", requirements_file_path]) if os.path.exists(requirements_file_path):
subprocess.run(["pip", "install", "-r", requirements_file_path])
def run_install_script(install_script_path): def run_install_script(install_script_path):
subprocess.run(["python", install_script_path]) if os.path.exists(install_script_path):
subprocess.run(["python", install_script_path])
custom_nodes_directory = "custom_nodes" custom_nodes_directory = "custom_nodes"

View File

@ -0,0 +1,20 @@
git clone https://github.com/comfyanonymous/ComfyUI
cd ComfyUI/custom_nodes
git clone https://github.com/ltdrdata/ComfyUI-Manager
cd ..
python -m venv venv
call venv/Scripts/activate
python -m pip install -r requirements.txt
python -m pip install -r custom_nodes/ComfyUI-Manager/requirements.txt
python -m pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu118 xformers
cd ..
echo "cd ComfyUI" >> run_gpu.sh
echo "call venv/Scripts/activate" >> run_gpu.sh
echo "python main.py" >> run_gpu.sh
chmod +x run_gpu.sh
echo "#!/bin/bash" > run_cpu.sh
echo "cd ComfyUI" >> run_cpu.sh
echo "call venv/Scripts/activate" >> run_cpu.sh
echo "python main.py --cpu" >> run_cpu.sh
chmod +x run_cpu.sh