This commit is contained in:
madtunebk 2024-03-16 09:23:25 +00:00 committed by GitHub
commit 2e03f24bda
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
23 changed files with 5672 additions and 1119 deletions

View File

@ -29,7 +29,7 @@ except:
print(f"[WARN] ComfyUI-Manager: Your ComfyUI version is outdated. Please update to the latest version.") print(f"[WARN] ComfyUI-Manager: Your ComfyUI version is outdated. Please update to the latest version.")
version = [2, 7, 2] version = [2, 10, 1]
version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '') version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '')
print(f"### Loading: ComfyUI-Manager ({version_str})") print(f"### Loading: ComfyUI-Manager ({version_str})")
@ -39,6 +39,22 @@ comfy_ui_hash = "-"
cache_lock = threading.Lock() cache_lock = threading.Lock()
def is_blacklisted(name):
name = name.strip()
pattern = r'([^<>!=]+)([<>!=]=?)'
match = re.search(pattern, name)
if match:
name = match.group(1)
if name in cm_global.pip_downgrade_blacklist:
if match is None or match.group(2) in ['<=', '==', '<']:
return True
return False
def handle_stream(stream, prefix): def handle_stream(stream, prefix):
stream.reconfigure(encoding=locale.getpreferredencoding(), errors='replace') stream.reconfigure(encoding=locale.getpreferredencoding(), errors='replace')
for msg in stream: for msg in stream:
@ -178,6 +194,7 @@ def write_config():
'component_policy': get_config()['component_policy'], 'component_policy': get_config()['component_policy'],
'double_click_policy': get_config()['double_click_policy'], 'double_click_policy': get_config()['double_click_policy'],
'windows_selector_event_loop_policy': get_config()['windows_selector_event_loop_policy'], 'windows_selector_event_loop_policy': get_config()['windows_selector_event_loop_policy'],
'model_download_by_agent': get_config()['model_download_by_agent']
} }
with open(config_path, 'w') as configfile: with open(config_path, 'w') as configfile:
config.write(configfile) config.write(configfile)
@ -201,6 +218,7 @@ def read_config():
'component_policy': default_conf['component_policy'] if 'component_policy' in default_conf else 'workflow', 'component_policy': default_conf['component_policy'] if 'component_policy' in default_conf else 'workflow',
'double_click_policy': default_conf['double_click_policy'] if 'double_click_policy' in default_conf else 'copy-all', 'double_click_policy': default_conf['double_click_policy'] if 'double_click_policy' in default_conf else 'copy-all',
'windows_selector_event_loop_policy': default_conf['windows_selector_event_loop_policy'] if 'windows_selector_event_loop_policy' in default_conf else False, 'windows_selector_event_loop_policy': default_conf['windows_selector_event_loop_policy'] if 'windows_selector_event_loop_policy' in default_conf else False,
'model_download_by_agent': default_conf['model_download_by_agent'] if 'model_download_by_agent' in default_conf else False,
} }
except Exception: except Exception:
@ -215,7 +233,8 @@ def read_config():
'default_ui': 'none', 'default_ui': 'none',
'component_policy': 'workflow', 'component_policy': 'workflow',
'double_click_policy': 'copy-all', 'double_click_policy': 'copy-all',
'windows_selector_event_loop_policy': False 'windows_selector_event_loop_policy': False,
'model_download_by_agent': False,
} }
@ -272,7 +291,7 @@ def set_double_click_policy(mode):
def try_install_script(url, repo_path, install_cmd): def try_install_script(url, repo_path, install_cmd):
if platform.system() == "Windows" and comfy_ui_commit_datetime.date() >= comfy_ui_required_commit_datetime.date(): if (len(install_cmd) > 0 and install_cmd[0].startswith('#')) or (platform.system() == "Windows" and comfy_ui_commit_datetime.date() >= comfy_ui_required_commit_datetime.date()):
if not os.path.exists(startup_script_path): if not os.path.exists(startup_script_path):
os.makedirs(startup_script_path) os.makedirs(startup_script_path)
@ -283,6 +302,12 @@ def try_install_script(url, repo_path, install_cmd):
return True return True
else: else:
if len(install_cmd) == 5 and install_cmd[2:4] == ['pip', 'install']:
if is_blacklisted(install_cmd[4]):
print(f"[ComfyUI-Manager] skip black listed pip installation: '{install_cmd[4]}'")
return True
print(f"\n## ComfyUI-Manager: EXECUTE => {install_cmd}") print(f"\n## ComfyUI-Manager: EXECUTE => {install_cmd}")
code = run_script(install_cmd, cwd=repo_path) code = run_script(install_cmd, cwd=repo_path)
@ -447,6 +472,9 @@ def git_repo_has_updates(path, do_fetch=False, do_update=False):
# Fetch the latest commits from the remote repository # Fetch the latest commits from the remote repository
repo = git.Repo(path) repo = git.Repo(path)
current_branch = repo.active_branch
branch_name = current_branch.name
remote_name = 'origin' remote_name = 'origin'
remote = repo.remote(name=remote_name) remote = repo.remote(name=remote_name)
@ -460,8 +488,6 @@ def git_repo_has_updates(path, do_fetch=False, do_update=False):
if repo.head.is_detached: if repo.head.is_detached:
switch_to_default_branch(repo) switch_to_default_branch(repo)
current_branch = repo.active_branch
branch_name = current_branch.name
remote_commit_hash = repo.refs[f'{remote_name}/{branch_name}'].object.hexsha remote_commit_hash = repo.refs[f'{remote_name}/{branch_name}'].object.hexsha
if commit_hash == remote_commit_hash: if commit_hash == remote_commit_hash:
@ -521,16 +547,17 @@ def git_pull(path):
else: else:
repo = git.Repo(path) repo = git.Repo(path)
print(f"path={path} / repo.is_dirty: {repo.is_dirty()}")
if repo.is_dirty(): if repo.is_dirty():
repo.git.stash() repo.git.stash()
if repo.head.is_detached: if repo.head.is_detached:
switch_to_default_branch(repo) switch_to_default_branch(repo)
origin = repo.remote(name='origin') current_branch = repo.active_branch
origin.pull() remote_name = current_branch.tracking_branch().remote_name
remote = repo.remote(name=remote_name)
remote.pull()
repo.git.submodule('update', '--init', '--recursive') repo.git.submodule('update', '--init', '--recursive')
repo.close() repo.close()
@ -777,9 +804,47 @@ def check_custom_nodes_installed(json_obj, do_fetch=False, do_update_check=True,
print(f"\x1b[2K\rUpdate check done.") print(f"\x1b[2K\rUpdate check done.")
def nickname_filter(json_obj):
preemptions_map = {}
for k, x in json_obj.items():
if 'preemptions' in x[1]:
for y in x[1]['preemptions']:
preemptions_map[y] = k
elif k.endswith("/ComfyUI"):
for y in x[0]:
preemptions_map[y] = k
updates = {}
for k, x in json_obj.items():
removes = set()
for y in x[0]:
k2 = preemptions_map.get(y)
if k2 is not None and k != k2:
removes.add(y)
if len(removes) > 0:
updates[k] = [y for y in x[0] if y not in removes]
for k, v in updates.items():
json_obj[k][0] = v
return json_obj
@server.PromptServer.instance.routes.get("/customnode/getmappings") @server.PromptServer.instance.routes.get("/customnode/getmappings")
async def fetch_customnode_mappings(request): async def fetch_customnode_mappings(request):
json_obj = await get_data_by_mode(request.rel_url.query["mode"], 'extension-node-map.json') mode = request.rel_url.query["mode"]
nickname_mode = False
if mode == "nickname":
mode = "local"
nickname_mode = True
json_obj = await get_data_by_mode(mode, 'extension-node-map.json')
if nickname_mode:
json_obj = nickname_filter(json_obj)
all_nodes = set() all_nodes = set()
patterns = [] patterns = []
@ -1647,7 +1712,7 @@ async def update_comfyui(request):
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 = current_branch.tracking_branch().remote_name
remote = repo.remote(name=remote_name) remote = repo.remote(name=remote_name)
try: try:
@ -1716,8 +1781,7 @@ async def install_model(request):
print(f"Install model '{json_data['name']}' into '{model_path}'") print(f"Install model '{json_data['name']}' into '{model_path}'")
model_url = json_data['url'] model_url = json_data['url']
if not get_config()['model_download_by_agent'] and (model_url.startswith('https://github.com') or model_url.startswith('https://huggingface.co') or model_url.startswith('https://heibox.uni-heidelberg.de')):
if model_url.startswith('https://github.com') or model_url.startswith('https://huggingface.co') or model_url.startswith('https://heibox.uni-heidelberg.de'):
model_dir = get_model_dir(json_data) model_dir = get_model_dir(json_data)
download_url(model_url, model_dir, filename=json_data['filename']) download_url(model_url, model_dir, filename=json_data['filename'])

View File

@ -199,6 +199,11 @@
"id":"https://github.com/abyz22/image_control", "id":"https://github.com/abyz22/image_control",
"tags":"BMAB", "tags":"BMAB",
"description": "This extension provides some alternative functionalities of the [a/sd-webui-bmab](https://github.com/portu-sim/sd-webui-bmab) extension." "description": "This extension provides some alternative functionalities of the [a/sd-webui-bmab](https://github.com/portu-sim/sd-webui-bmab) extension."
},
{
"id":"https://github.com/blepping/ComfyUI-sonar",
"tags":"sonar",
"description": "This extension provides some alternative functionalities of the [a/stable-diffusion-webui-sonar](https://github.com/Kahsolt/stable-diffusion-webui-sonar) extension."
} }
] ]
} }

21
check.bat Normal file
View File

@ -0,0 +1,21 @@
@echo off
python json-checker.py "custom-node-list.json"
python json-checker.py "model-list.json"
python json-checker.py "alter-list.json"
python json-checker.py "extension-node-map.json"
python json-checker.py "node_db\new\custom-node-list.json"
python json-checker.py "node_db\new\model-list.json"
python json-checker.py "node_db\new\extension-node-map.json"
python json-checker.py "node_db\dev\custom-node-list.json"
python json-checker.py "node_db\dev\model-list.json"
python json-checker.py "node_db\dev\extension-node-map.json"
python json-checker.py "node_db\tutorial\custom-node-list.json"
python json-checker.py "node_db\tutorial\model-list.json"
python json-checker.py "node_db\tutorial\extension-node-map.json"
python json-checker.py "node_db\legacy\custom-node-list.json"
python json-checker.py "node_db\legacy\model-list.json"
python json-checker.py "node_db\legacy\extension-node-map.json"
python json-checker.py "node_db\forked\custom-node-list.json"
python json-checker.py "node_db\forked\model-list.json"
python json-checker.py "node_db\forked\extension-node-map.json"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -52,7 +52,7 @@ def gitcheck(path, do_fetch=False):
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 = current_branch.tracking_branch().remote_name
remote = repo.remote(name=remote_name) remote = repo.remote(name=remote_name)
if do_fetch: if do_fetch:
@ -104,7 +104,7 @@ def gitpull(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 = current_branch.tracking_branch().remote_name
remote = repo.remote(name=remote_name) remote = repo.remote(name=remote_name)
remote.fetch() remote.fetch()

View File

@ -148,13 +148,13 @@ docStyle.innerHTML = `
} }
.cm-notice-board > ul { .cm-notice-board > ul {
display: block; display: block;
list-style-type: disc; list-style-type: disc;
margin-block-start: 1em; margin-block-start: 1em;
margin-block-end: 1em; margin-block-end: 1em;
margin-inline-start: 0px; margin-inline-start: 0px;
margin-inline-end: 0px; margin-inline-end: 0px;
padding-inline-start: 40px; padding-inline-start: 40px;
} }
.cm-conflicted-nodes-text { .cm-conflicted-nodes-text {
@ -383,7 +383,7 @@ await init_badge_mode();
await init_share_option(); await init_share_option();
async function fetchNicknames() { async function fetchNicknames() {
const response1 = await api.fetchApi(`/customnode/getmappings?mode=local`); const response1 = await api.fetchApi(`/customnode/getmappings?mode=nickname`);
const mappings = await response1.json(); const mappings = await response1.json();
let result = {}; let result = {};
@ -629,12 +629,12 @@ async function updateAll(update_check_checkbox, manager_dialog) {
} }
app.ui.dialog.show( app.ui.dialog.show(
"ComfyUI and all extensions have been updated to the latest version.<BR>To apply the updated custom node, please <button class='cm-small-button' id='cm-reboot-button'>RESTART</button> ComfyUI. And refresh browser.<BR>" "ComfyUI and all extensions have been updated to the latest version.<BR>To apply the updated custom node, please <button class='cm-small-button' id='cm-reboot-button5'>RESTART</button> ComfyUI. And refresh browser.<BR>"
+failed_list +failed_list
+updated_list +updated_list
); );
const rebootButton = document.getElementById('cm-reboot-button'); const rebootButton = document.getElementById('cm-reboot-button5');
rebootButton.addEventListener("click", rebootButton.addEventListener("click",
function() { function() {
if(rebootAPI()) { if(rebootAPI()) {

View File

@ -67,7 +67,7 @@ export async function install_checked_custom_node(grid_rows, target_i, caller, m
} }
await caller.invalidateControl(); await caller.invalidateControl();
caller.updateMessage("<BR>To apply the installed/updated/disabled/enabled custom node, please <button id='cm-reboot-button' class='cm-small-button'>RESTART</button> ComfyUI. And refresh browser.", 'cm-reboot-button'); caller.updateMessage("<BR>To apply the installed/updated/disabled/enabled custom node, please <button id='cm-reboot-button1' class='cm-small-button'>RESTART</button> ComfyUI. And refresh browser.", 'cm-reboot-button1');
} }
}; };
@ -92,9 +92,9 @@ export async function install_pip(packages) {
const res = await api.fetchApi(`/customnode/install/pip?packages=${packages}`); const res = await api.fetchApi(`/customnode/install/pip?packages=${packages}`);
if(res.status == 200) { if(res.status == 200) {
app.ui.dialog.show(`PIP package installation is processed.<br>To apply the pip packages, please click the <button id='cm-reboot-button'><font size='3px'>RESTART</font></button> button in ComfyUI.`); app.ui.dialog.show(`PIP package installation is processed.<br>To apply the pip packages, please click the <button id='cm-reboot-button3'><font size='3px'>RESTART</font></button> button in ComfyUI.`);
const rebootButton = document.getElementById('cm-reboot-button'); const rebootButton = document.getElementById('cm-reboot-button3');
const self = this; const self = this;
rebootButton.addEventListener("click", rebootAPI); rebootButton.addEventListener("click", rebootAPI);
@ -124,9 +124,9 @@ export async function install_via_git_url(url, manager_dialog) {
const res = await api.fetchApi(`/customnode/install/git_url?url=${url}`); const res = await api.fetchApi(`/customnode/install/git_url?url=${url}`);
if(res.status == 200) { if(res.status == 200) {
app.ui.dialog.show(`'${url}' is installed<BR>To apply the installed custom node, please <button id='cm-reboot-button'><font size='3px'>RESTART</font></button> ComfyUI.`); app.ui.dialog.show(`'${url}' is installed<BR>To apply the installed custom node, please <button id='cm-reboot-button4'><font size='3px'>RESTART</font></button> ComfyUI.`);
const rebootButton = document.getElementById('cm-reboot-button'); const rebootButton = document.getElementById('cm-reboot-button4');
const self = this; const self = this;
rebootButton.addEventListener("click", rebootButton.addEventListener("click",

View File

@ -154,7 +154,6 @@ export class CustomNodesInstaller extends ComfyDialog {
async filter_missing_node(data) { async filter_missing_node(data) {
const mappings = await getCustomnodeMappings(); const mappings = await getCustomnodeMappings();
// build regex->url map // build regex->url map
const regex_to_url = []; const regex_to_url = [];
for (let i in data) { for (let i in data) {
@ -165,11 +164,17 @@ export class CustomNodesInstaller extends ComfyDialog {
} }
// build name->url map // build name->url map
const name_to_url = {}; const name_to_urls = {};
for (const url in mappings) { for (const url in mappings) {
const names = mappings[url]; const names = mappings[url];
for(const name in names[0]) { for(const name in names[0]) {
name_to_url[names[0][name]] = url; let v = name_to_urls[names[0][name]];
if(v == undefined) {
v = [];
name_to_urls[names[0][name]] = v;
}
v.push(url);
} }
} }
@ -194,9 +199,11 @@ export class CustomNodesInstaller extends ComfyDialog {
continue; continue;
if (!registered_nodes.has(node_type)) { if (!registered_nodes.has(node_type)) {
const url = name_to_url[node_type.trim()]; const urls = name_to_urls[node_type.trim()];
if(url) if(urls)
missing_nodes.add(url); urls.forEach(url => {
missing_nodes.add(url);
});
else { else {
for(let j in regex_to_url) { for(let j in regex_to_url) {
if(regex_to_url[j].regex.test(node_type)) { if(regex_to_url[j].regex.test(node_type)) {
@ -210,7 +217,7 @@ export class CustomNodesInstaller extends ComfyDialog {
let unresolved_nodes = await getUnresolvedNodesInComponent(); let unresolved_nodes = await getUnresolvedNodesInComponent();
for (let i in unresolved_nodes) { for (let i in unresolved_nodes) {
let node_type = unresolved_nodes[i]; let node_type = unresolved_nodes[i];
const url = name_to_url[node_type]; const url = name_to_urls[node_type];
if(url) if(url)
missing_nodes.add(url); missing_nodes.add(url);
} }

View File

@ -23,7 +23,7 @@ async function restore_snapshot(target) {
} }
finally { finally {
await SnapshotManager.instance.invalidateControl(); await SnapshotManager.instance.invalidateControl();
SnapshotManager.instance.updateMessage("<BR>To apply the snapshot, please <button id='cm-reboot-button' class='cm-small-button'>RESTART</button> ComfyUI. And refresh browser.", 'cm-reboot-button'); SnapshotManager.instance.updateMessage("<BR>To apply the snapshot, please <button id='cm-reboot-button2' class='cm-small-button'>RESTART</button> ComfyUI. And refresh browser.", 'cm-reboot-button2');
} }
} }
} }

View File

@ -270,6 +270,138 @@
"filename": "easynegative.safetensors", "filename": "easynegative.safetensors",
"url": "https://civitai.com/api/download/models/9208" "url": "https://civitai.com/api/download/models/9208"
}, },
{
"name": "stabilityai/comfyui_checkpoints/stable_cascade_stage_b.safetensors",
"type": "checkpoints",
"base": "Stable Cascade",
"save_path": "checkpoints/Stable-Cascade",
"description": "[4.55GB] Stable Cascade stage_b checkpoints",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stable_cascade_stage_b.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/comfyui_checkpoints/stable_cascade_stage_b.safetensors"
},
{
"name": "stabilityai/comfyui_checkpoints/stable_cascade_stage_c.safetensors",
"type": "checkpoints",
"base": "Stable Cascade",
"save_path": "checkpoints/Stable-Cascade",
"description": "[9.22GB] Stable Cascade stage_c checkpoints",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stable_cascade_stage_c.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/comfyui_checkpoints/stable_cascade_stage_c.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_a.safetensors (VAE)",
"type": "VAE",
"base": "Stable Cascade",
"save_path": "vae/Stable-Cascade",
"description": "[73.7MB] Stable Cascade: stage_a",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_a.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_a.safetensors"
},
{
"name": "stabilityai/Stable Cascade: effnet_encoder.safetensors (VAE)",
"type": "VAE",
"base": "Stable Cascade",
"save_path": "vae/Stable-Cascade",
"description": "[81.5MB] Stable Cascade: effnet_encoder.\nVAE encoder for stage_c latent.",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "effnet_encoder.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/effnet_encoder.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_b.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[6.25GB] Stable Cascade: stage_b",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_b.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_b_bf16.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[3.13GB] Stable Cascade: stage_b/bf16",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_b_bf16.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_bf16.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_b_lite.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[2.8GB] Stable Cascade: stage_b/lite",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_b_lite.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_lite.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_b_lite.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[1.4GB] Stable Cascade: stage_b/bf16,lite",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_b_lite_bf16.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_lite_bf16.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_c.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[14.4GB] Stable Cascade: stage_c",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_c.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_c_bf16.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[7.18GB] Stable Cascade: stage_c/bf16",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_c_bf16.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_bf16.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_c_lite.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[4.12GB] Stable Cascade: stage_c/lite",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_c_lite.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_lite.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_c_lite.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[2.06GB] Stable Cascade: stage_c/bf16,lite",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_c_lite_bf16.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_lite_bf16.safetensors"
},
{
"name": "stabilityai/Stable Cascade: text_encoder (CLIP)",
"type": "clip",
"base": "Stable Cascade",
"save_path": "clip/Stable-Cascade",
"description": "[1.39GB] Stable Cascade: text_encoder",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "model.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/text_encoder/model.safetensors"
},
{ {
"name": "SDXL-Turbo 1.0 (fp16)", "name": "SDXL-Turbo 1.0 (fp16)",
"type": "checkpoints", "type": "checkpoints",
@ -360,6 +492,39 @@
"filename": "sd_xl_offset_example-lora_1.0.safetensors", "filename": "sd_xl_offset_example-lora_1.0.safetensors",
"url": "https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_offset_example-lora_1.0.safetensors" "url": "https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_offset_example-lora_1.0.safetensors"
}, },
{
"name": "SDXL Lightning LoRA (2step)",
"type": "lora",
"base": "SDXL",
"save_path": "loras/SDXL-Lightning",
"description": "SDXL Lightning LoRA (2step)",
"reference": "https://huggingface.co/ByteDance/SDXL-Lightning",
"filename": "sdxl_lightning_2step_lora.safetensors",
"url": "https://huggingface.co/ByteDance/SDXL-Lightning/resolve/main/sdxl_lightning_2step_lora.safetensors"
},
{
"name": "SDXL Lightning LoRA (4step)",
"type": "lora",
"base": "SDXL",
"save_path": "loras/SDXL-Lightning",
"description": "SDXL Lightning LoRA (4step)",
"reference": "https://huggingface.co/ByteDance/SDXL-Lightning",
"filename": "sdxl_lightning_4step_lora.safetensors",
"url": "https://huggingface.co/ByteDance/SDXL-Lightning/resolve/main/sdxl_lightning_4step_lora.safetensors"
},
{
"name": "SDXL Lightning LoRA (8step)",
"type": "lora",
"base": "SDXL",
"save_path": "loras/SDXL-Lightning",
"description": "SDXL Lightning LoRA (8tep)",
"reference": "https://huggingface.co/ByteDance/SDXL-Lightning",
"filename": "sdxl_lightning_8step_lora.safetensors",
"url": "https://huggingface.co/ByteDance/SDXL-Lightning/resolve/main/sdxl_lightning_8step_lora.safetensors"
},
{ {
"name": "v1-5-pruned-emaonly.ckpt", "name": "v1-5-pruned-emaonly.ckpt",
"type": "checkpoints", "type": "checkpoints",
@ -420,16 +585,6 @@
"filename": "AOM3A3_orangemixs.safetensors", "filename": "AOM3A3_orangemixs.safetensors",
"url": "https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/Models/AbyssOrangeMix3/AOM3A3_orangemixs.safetensors" "url": "https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/Models/AbyssOrangeMix3/AOM3A3_orangemixs.safetensors"
}, },
{
"name": "Anything v3 (fp16; pruned)",
"type": "checkpoints",
"base": "SD1.5",
"save_path": "default",
"description": "Anything v3 (anime style)",
"reference": "https://huggingface.co/Linaqruf/anything-v3.0",
"filename": "anything-v3-fp16-pruned.safetensors",
"url": "https://huggingface.co/Linaqruf/anything-v3.0/resolve/main/anything-v3-fp16-pruned.safetensors"
},
{ {
"name": "Waifu Diffusion 1.5 Beta3 (fp16)", "name": "Waifu Diffusion 1.5 Beta3 (fp16)",
"type": "checkpoints", "type": "checkpoints",
@ -660,6 +815,116 @@
"filename": "t2iadapter_style_sd14v1.pth", "filename": "t2iadapter_style_sd14v1.pth",
"url": "https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_style_sd14v1.pth" "url": "https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_style_sd14v1.pth"
}, },
{
"name": "T2I-Adapter XL (lineart) FP16",
"type": "T2I-Adapter",
"base": "SDXL 1.0",
"save_path": "default",
"description": "ControlNet T2I-Adapter XL for lineart",
"reference": "https://huggingface.co/TencentARC/t2i-adapter-lineart-sdxl-1.0",
"filename": "t2i-adapter-lineart-sdxl-1.0.fp16.safetensors",
"url": "https://huggingface.co/TencentARC/t2i-adapter-lineart-sdxl-1.0/resolve/main/diffusion_pytorch_model.fp16.safetensors"
},
{
"name": "T2I-Adapter XL (canny) FP16",
"type": "T2I-Adapter",
"base": "SDXL 1.0",
"save_path": "default",
"description": "ControlNet T2I-Adapter XL for canny",
"reference": "https://huggingface.co/TencentARC/t2i-adapter-canny-sdxl-1.0",
"filename": "t2i-adapter-canny-sdxl-1.0.fp16.safetensors",
"url": "https://huggingface.co/TencentARC/t2i-adapter-canny-sdxl-1.0/resolve/main/diffusion_pytorch_model.fp16.safetensors"
},
{
"name": "T2I-Adapter XL (depth-zoe) FP16",
"type": "T2I-Adapter",
"base": "SDXL 1.0",
"save_path": "default",
"description": "ControlNet T2I-Adapter XL for depth-zoe",
"reference": "https://huggingface.co/TencentARC/t2i-adapter-depth-zoe-sdxl-1.0",
"filename": "t2i-adapter-depth-zoe-sdxl-1.0.fp16.safetensors",
"url": "https://huggingface.co/TencentARC/t2i-adapter-depth-zoe-sdxl-1.0/resolve/main/diffusion_pytorch_model.fp16.safetensors"
},
{
"name": "T2I-Adapter XL (depth-midas) FP16",
"type": "T2I-Adapter",
"base": "SDXL 1.0",
"save_path": "default",
"description": "ControlNet T2I-Adapter XL for depth-midas",
"reference": "https://huggingface.co/TencentARC/t2i-adapter-depth-midas-sdxl-1.0",
"filename": "t2i-adapter-depth-midas-sdxl-1.0.fp16.safetensors",
"url": "https://huggingface.co/TencentARC/t2i-adapter-depth-midas-sdxl-1.0/resolve/main/diffusion_pytorch_model.fp16.safetensors"
},
{
"name": "T2I-Adapter XL (sketch) FP16",
"type": "T2I-Adapter",
"base": "SDXL 1.0",
"save_path": "default",
"description": "ControlNet T2I-Adapter XL for sketch",
"reference": "https://huggingface.co/TencentARC/t2i-adapter-sketch-sdxl-1.0",
"filename": "t2i-adapter-sketch-sdxl-1.0.fp16.safetensors",
"url": "https://huggingface.co/TencentARC/t2i-adapter-sketch-sdxl-1.0/resolve/main/diffusion_pytorch_model.fp16.safetensors"
},
{
"name": "T2I-Adapter XL (lineart)",
"type": "T2I-Adapter",
"base": "SDXL 1.0",
"save_path": "default",
"description": "ControlNet T2I-Adapter XL for lineart",
"reference": "https://huggingface.co/TencentARC/t2i-adapter-lineart-sdxl-1.0",
"filename": "t2i-adapter-lineart-sdxl-1.0.safetensors",
"url": "https://huggingface.co/TencentARC/t2i-adapter-lineart-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors"
},
{
"name": "T2I-Adapter XL (canny)",
"type": "T2I-Adapter",
"base": "SDXL 1.0",
"save_path": "default",
"description": "ControlNet T2I-Adapter XL for canny",
"reference": "https://huggingface.co/TencentARC/t2i-adapter-canny-sdxl-1.0",
"filename": "t2i-adapter-canny-sdxl-1.0.safetensors",
"url": "https://huggingface.co/TencentARC/t2i-adapter-canny-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors"
},
{
"name": "T2I-Adapter XL (depth-zoe)",
"type": "T2I-Adapter",
"base": "SDXL 1.0",
"save_path": "default",
"description": "ControlNet T2I-Adapter XL for depth-zoe",
"reference": "https://huggingface.co/TencentARC/t2i-adapter-depth-zoe-sdxl-1.0",
"filename": "t2i-adapter-depth-zoe-sdxl-1.0.safetensors",
"url": "https://huggingface.co/TencentARC/t2i-adapter-depth-zoe-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors"
},
{
"name": "T2I-Adapter XL (depth-midas)",
"type": "T2I-Adapter",
"base": "SDXL 1.0",
"save_path": "default",
"description": "ControlNet T2I-Adapter XL for depth-midas",
"reference": "https://huggingface.co/TencentARC/t2i-adapter-depth-midas-sdxl-1.0",
"filename": "t2i-adapter-depth-midas-sdxl-1.0.safetensors",
"url": "https://huggingface.co/TencentARC/t2i-adapter-depth-midas-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors"
},
{
"name": "T2I-Adapter XL (sketch)",
"type": "T2I-Adapter",
"base": "SDXL 1.0",
"save_path": "default",
"description": "ControlNet T2I-Adapter XL for sketch",
"reference": "https://huggingface.co/TencentARC/t2i-adapter-sketch-sdxl-1.0",
"filename": "t2i-adapter-sketch-sdxl-1.0.safetensors",
"url": "https://huggingface.co/TencentARC/t2i-adapter-sketch-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors"
},
{
"name": "T2I-Adapter XL (openpose)",
"type": "T2I-Adapter",
"base": "SDXL 1.0",
"save_path": "default",
"description": "ControlNet T2I-Adapter XL for openpose",
"reference": "https://huggingface.co/TencentARC/t2i-adapter-openpose-sdxl-1.0",
"filename": "t2i-adapter-openpose-sdxl-1.0.safetensors",
"url": "https://huggingface.co/TencentARC/t2i-adapter-openpose-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors"
},
{ {
"name": "CiaraRowles/TemporalNet2", "name": "CiaraRowles/TemporalNet2",
"type": "controlnet", "type": "controlnet",
@ -1882,6 +2147,188 @@
"reference": "https://huggingface.co/InstantX/InstantID", "reference": "https://huggingface.co/InstantX/InstantID",
"filename": "diffusion_pytorch_model.safetensors", "filename": "diffusion_pytorch_model.safetensors",
"url": "https://huggingface.co/InstantX/InstantID/resolve/main/ControlNetModel/diffusion_pytorch_model.safetensors" "url": "https://huggingface.co/InstantX/InstantID/resolve/main/ControlNetModel/diffusion_pytorch_model.safetensors"
},
{
"name": "efficient_sam_s_cpu.jit [ComfyUI-YoloWorld-EfficientSAM]",
"type": "efficient_sam",
"base": "efficient_sam",
"save_path": "custom_nodes/ComfyUI-YoloWorld-EfficientSAM",
"description": "Install efficient_sam_s_cpu.jit into ComfyUI-YoloWorld-EfficientSAM",
"reference": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/tree/main",
"filename": "efficient_sam_s_cpu.jit",
"url": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/resolve/main/efficient_sam_s_cpu.jit"
},
{
"name": "efficient_sam_s_gpu.jit [ComfyUI-YoloWorld-EfficientSAM]",
"type": "efficient_sam",
"base": "efficient_sam",
"save_path": "custom_nodes/ComfyUI-YoloWorld-EfficientSAM",
"description": "Install efficient_sam_s_gpu.jit into ComfyUI-YoloWorld-EfficientSAM",
"reference": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/tree/main",
"filename": "efficient_sam_s_gpu.jit",
"url": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/resolve/main/efficient_sam_s_gpu.jit"
},
{
"name": "shape_predictor_68_face_landmarks.dat [Face Analysis]",
"type": "Shape Predictor",
"base": "DLIB",
"save_path": "custom_nodes/ComfyUI_FaceAnalysis/dlib",
"description": "To use the Face Analysis for ComfyUI custom node, installation of this model is needed.",
"reference": "https://huggingface.co/matt3ounstable/dlib_predictor_recognition/tree/main",
"filename": "shape_predictor_68_face_landmarks.dat",
"url": "https://huggingface.co/matt3ounstable/dlib_predictor_recognition/resolve/main/shape_predictor_68_face_landmarks.dat"
},
{
"name": "dlib_face_recognition_resnet_model_v1.dat [Face Analysis]",
"type": "Face Recognition",
"base": "DLIB",
"save_path": "custom_nodes/ComfyUI_FaceAnalysis/dlib",
"description": "To use the Face Analysis for ComfyUI custom node, installation of this model is needed.",
"reference": "https://huggingface.co/matt3ounstable/dlib_predictor_recognition/tree/main",
"filename": "dlib_face_recognition_resnet_model_v1.dat",
"url": "https://huggingface.co/matt3ounstable/dlib_predictor_recognition/resolve/main/dlib_face_recognition_resnet_model_v1.dat"
},
{
"name": "InstanceDiffusion/fusers",
"type": "InstanceDiffusion",
"base": "SD1.5",
"save_path": "instance_models/fuser_models",
"description": "Fusers checkpoints for multi-object prompting with InstanceDiffusion.",
"reference": "https://huggingface.co/logtd/instance_diffusion",
"filename": "fusers.ckpt",
"url": "https://huggingface.co/logtd/instance_diffusion/resolve/main/fusers.ckpt"
},
{
"name": "InstanceDiffusion/position_net",
"type": "InstanceDiffusion",
"base": "SD1.5",
"save_path": "instance_models/positionnet_models",
"description": "PositionNet checkpoints for multi-object prompting with InstanceDiffusion.",
"reference": "https://huggingface.co/logtd/instance_diffusion",
"filename": "position_net.ckpt",
"url": "https://huggingface.co/logtd/instance_diffusion/resolve/main/position_net.ckpt"
},
{
"name": "InstanceDiffusion/scaleu",
"type": "InstanceDiffusion",
"base": "SD1.5",
"save_path": "instance_models/scaleu_models",
"description": "ScaleU checkpoints for multi-object prompting with InstanceDiffusion.",
"reference": "https://huggingface.co/logtd/instance_diffusion",
"filename": "scaleu.ckpt",
"url": "https://huggingface.co/logtd/instance_diffusion/resolve/main/scaleu.ckpt"
},
{
"name": "1k3d68.onnx",
"type": "insightface",
"base": "inswapper",
"save_path": "insightface/models/buffalo_l",
"description": "Buffalo_l 1k3d68.onnx model for IpAdapterPlus",
"reference": "https://github.com/cubiq/ComfyUI_IPAdapter_plus?tab=readme-ov-file#faceid",
"filename": "1k3d68.onnx",
"url": "https://huggingface.co/public-data/insightface/resolve/main/models/buffalo_l/1k3d68.onnx"
},
{
"name": "2d106det.onnx",
"type": "insightface",
"base": "inswapper",
"save_path": "insightface/models/buffalo_l",
"description": "Buffalo_l 2d106det.onnx model for IpAdapterPlus",
"reference": "https://github.com/cubiq/ComfyUI_IPAdapter_plus?tab=readme-ov-file#faceid",
"filename": "2d106det.onnx",
"url": "https://huggingface.co/public-data/insightface/resolve/main/models/buffalo_l/2d106det.onnx"
},
{
"name": "det_10g.onnx",
"type": "insightface",
"base": "inswapper",
"save_path": "insightface/models/buffalo_l",
"description": "Buffalo_l det_10g.onnx model for IpAdapterPlus",
"reference": "https://github.com/cubiq/ComfyUI_IPAdapter_plus?tab=readme-ov-file#faceid",
"filename": "det_10g.onnx",
"url": "https://huggingface.co/public-data/insightface/resolve/main/models/buffalo_l/det_10g.onnx"
},
{
"name": "genderage.onnx",
"type": "insightface",
"base": "inswapper",
"save_path": "insightface/models/buffalo_l",
"description": "Buffalo_l genderage.onnx model for IpAdapterPlus",
"reference": "https://github.com/cubiq/ComfyUI_IPAdapter_plus?tab=readme-ov-file#faceid",
"filename": "genderage.onnx",
"url": "https://huggingface.co/public-data/insightface/resolve/main/models/buffalo_l/genderage.onnx"
},
{
"name": "w600k_r50.onnx",
"type": "insightface",
"base": "inswapper",
"save_path": "insightface/models/buffalo_l",
"description": "Buffalo_l w600k_r50.onnx model for IpAdapterPlus",
"reference": "https://github.com/cubiq/ComfyUI_IPAdapter_plus?tab=readme-ov-file#faceid",
"filename": "w600k_r50.onnx",
"url": "https://huggingface.co/public-data/insightface/resolve/main/models/buffalo_l/w600k_r50.onnx"
},
{
"name": "BLIP ImageCaption (COCO) w/ ViT-B and CapFilt-L",
"type": "BLIP_MODEL",
"base": "blip_model",
"save_path": "blip",
"description": "BLIP ImageCaption (COCO) w/ ViT-B and CapFilt-L",
"reference": "https://github.com/salesforce/BLIP",
"filename": "model_base_capfilt_large.pth",
"url": "https://storage.googleapis.com/sfr-vision-language-research/BLIP/models/model_base_capfilt_large.pth"
},
{
"name": "GroundingDINO SwinT OGC - Model",
"type": "GroundingDINO",
"base": "DINO",
"save_path": "groundingdino",
"description": "GroundingDINO SwinT OGC Model",
"reference": "https://huggingface.co/ShilongLiu/GroundingDINO",
"filename": "groundingdino_swint_ogc.pth",
"url": "https://huggingface.co/ShilongLiu/GroundingDINO/resolve/main/groundingdino_swint_ogc.pth"
},
{
"name": "GroundingDINO SwinT OGC - CFG File",
"type": "GroundingDINO",
"base": "DINO",
"save_path": "groundingdino",
"description": "GroundingDINO SwinT OGC CFG File",
"reference": "https://huggingface.co/ShilongLiu/GroundingDINO/resolve/main/GroundingDINO_SwinT_OGC.cfg.py",
"filename": "GroundingDINO_SwinT_OGC.cfg.py",
"url": "https://huggingface.co/ShilongLiu/GroundingDINO/raw/main/GroundingDINO_SwinT_OGC.cfg.py"
},
{
"name": "ViT-H SAM model",
"type": "sam",
"base": "SAM",
"save_path": "sams",
"description": "Segmenty Anything SAM model (ViT-H)",
"reference": "https://github.com/facebookresearch/segment-anything#model-checkpoints",
"filename": "sam_vit_h_4b8939.pth",
"url": "https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth"
},
{
"name": "ViT-L SAM model",
"type": "sam",
"base": "SAM",
"save_path": "sams",
"description": "Segmenty Anything SAM model (ViT-L)",
"reference": "https://github.com/facebookresearch/segment-anything#model-checkpoints",
"filename": "sam_vit_l_0b3195.pth",
"url": "https://dl.fbaipublicfiles.com/segment_anything/sam_vit_l_0b3195.pth"
},
{
"name": "MobileSAM",
"type": "sam",
"base": "SAM",
"save_path": "sams",
"description": "MobileSAM",
"reference": "https://github.com/ChaoningZhang/MobileSAM/",
"filename": "mobile_sam.pt",
"url": "https://github.com/ChaoningZhang/MobileSAM/blob/master/weights/mobile_sam.pt"
} }
] ]
} }

View File

@ -10,6 +10,236 @@
}, },
{
"author": "ExponentialML",
"title": "comfyui-ComfyUI_VisualStylePrompting [WIP]",
"reference": "https://github.com/ExponentialML/ComfyUI_VisualStylePrompting",
"files": [
"https://github.com/ExponentialML/ComfyUI_VisualStylePrompting"
],
"install_type": "git-clone",
"description": "ComfyUI Version of '[a/Visual Style Prompting with Swapping Self-Attention](https://github.com/naver-ai/Visual-Style-Prompting)'"
},
{
"author": "cubiq",
"title": "Comfy Dungeon [WIP]",
"reference": "https://github.com/cubiq/Comfy_Dungeon",
"files": [
"https://github.com/cubiq/Comfy_Dungeon"
],
"install_type": "git-clone",
"description": "Build D&D Character Portraits with ComfyUI.\nIMPORTANT: At the moment this is mostly a tech demo to show how to build a web app on top of ComfyUI. The code is very messy and the application doesn't guaratee consistent results."
},
{
"author": "dfl",
"title": "comfyui-stylegan",
"reference": "https://github.com/dfl/comfyui-stylegan",
"files": [
"https://github.com/dfl/comfyui-stylegan"
],
"install_type": "git-clone",
"description": "Generator for StyleGAN 3"
},
{
"author": "christian-byrne",
"title": "elimination-nodes",
"reference": "https://github.com/christian-byrne/elimination-nodes",
"files": [
"https://github.com/christian-byrne/elimination-nodes"
],
"install_type": "git-clone",
"description": "Nodes:Paste Cutout on Base Image"
},
{
"author": "A719689614",
"title": "ComfyUI_AC_FUNV8Beta1",
"reference": "https://github.com/A719689614/ComfyUI_AC_FUNV8Beta1",
"files": [
"https://github.com/A719689614/ComfyUI_AC_FUNV8Beta1"
],
"install_type": "git-clone",
"description": "Nodes:AC_Super_Controlnet/Checkpoint/Loras/Lora&LCM/KSampler/UpKSampler/SaveImage/PreviewImage/CKPT&LCM/CLIPEN/EmptLatent, AC_FUN_SUPER_LARGE, AC_Super_Come_Ckpt, AC_Super_Come_Lora"
},
{
"author": "houdinii",
"title": "comfy-magick [WIP]",
"reference": "https://github.com/houdinii/comfy-magick",
"files": [
"https://github.com/houdinii/comfy-magick"
],
"install_type": "git-clone",
"description": "This is a way to implement ImageMagick functionality in ComfyUI, which is generally PIL (pillow) based. I'm not sure the best way to handle this, as batch images make it a lot more complex, but the general idea will be two nodes to translate the IMAGE type, a torch.tensor of shape [batch, height, width, channels], or [1, 600, 800, 3] for a single 800x600 image, into/from a wand Image object."
},
{
"author": "tjorbogarden",
"title": "my-useful-comfyui-custom-nodes",
"reference": "https://github.com/tjorbogarden/my-useful-comfyui-custom-nodes",
"files": [
"https://github.com/tjorbogarden/my-useful-comfyui-custom-nodes"
],
"install_type": "git-clone",
"description": "Nodes:My-Image Sizer, KSamplerSDXLAdvanced."
},
{
"author": "DeTK",
"title": "ComfyUI Node Switcher",
"reference": "https://github.com/DeTK/ComfyUI-Switch",
"files": [
"https://github.com/DeTK/ComfyUI-Switch"
],
"install_type": "git-clone",
"description": "Nodes:NodeSwitch."
},
{
"author": "GrindHouse66",
"title": "GH Tools for ComfyUI",
"reference": "https://github.com/GrindHouse66/ComfyUI-GH_Tools",
"files": [
"https://github.com/GrindHouse66/ComfyUI-GH_Tools"
],
"install_type": "git-clone",
"description": "Nodes:GH Tools Image Sizer, GH Tools Simple Scale. Simple quality of life Tools for ComfyUI. Basically, If it makes my life easier, it will be here. The list will grow over time."
},
{
"author": "sdfxai",
"title": "SDFXBridgeForComfyUI - ComfyUI Custom Node for SDFX Integration",
"reference": "https://github.com/sdfxai/SDFXBridgeForComfyUI",
"files": [
"https://github.com/sdfxai/SDFXBridgeForComfyUI"
],
"install_type": "git-clone",
"description": "SDFXBridgeForComfyUI is a custom node designed for seamless integration between ComfyUI and the SDFX solution. This custom node allows users to make ComfyUI compatible with SDFX when running the ComfyUI instance on their local machines."
},
{
"author": "Beinsezii",
"title": "comfyui-amd-go-fast",
"reference": "https://github.com/Beinsezii/comfyui-amd-go-fast",
"files": [
"https://github.com/Beinsezii/comfyui-amd-go-fast"
],
"install_type": "git-clone",
"description": "See details: [a/link](https://github.com/Beinsezii/comfyui-amd-go-fast?tab=readme-ov-file)"
},
{
"author": "SeedV",
"title": "ComfyUI-SeedV-Nodes [UNSAFE]",
"reference": "https://github.com/SeedV/ComfyUI-SeedV-Nodes",
"files": [
"https://github.com/SeedV/ComfyUI-SeedV-Nodes"
],
"install_type": "git-clone",
"description": "Nodes:Script.\n[w/This extension poses a risk of executing arbitrary commands through workflow execution. Please be cautious.]"
},
{
"author": "mut-ex",
"title": "ComfyUI GLIGEN GUI Node",
"reference": "https://github.com/mut-ex/comfyui-gligengui-node",
"files": [
"https://github.com/mut-ex/comfyui-gligengui-node"
],
"install_type": "git-clone",
"description": "This is a simple, straightforward ComfyUI node to be used along with the [a/GLIGEN GUI](https://github.com/mut-ex/gligen-gui) I developed.\nNOTE:[a/Make sure you have the GLIGEN GUI up and running](https://github.com/mut-ex/gligen-gui/tree/main)"
},
{
"author": "unanan",
"title": "ComfyUI-Dist [WIP]",
"reference": "https://github.com/unanan/ComfyUI-Dist",
"files": [
"https://github.com/unanan/ComfyUI-Dist"
],
"install_type": "git-clone",
"description": "For distributed processing ComfyUI workflows within a local area network.\nNot Finished Yet."
},
{
"author": "NicholasKao1029",
"title": "comfyui-hook",
"reference": "https://github.com/NicholasKao1029/comfyui-hook",
"files": [
"https://github.com/NicholasKao1029/comfyui-hook"
],
"install_type": "git-clone",
"description": "This extension provides additional API"
},
{
"author": "ForeignGods",
"title": "ComfyUI-Mana-Nodes",
"reference": "https://github.com/ForeignGods/ComfyUI-Mana-Nodes",
"files": [
"https://github.com/ForeignGods/ComfyUI-Mana-Nodes"
],
"install_type": "git-clone",
"description": "Nodes:font2img"
},
{
"author": "Extraltodeus",
"title": "Conditioning-token-experiments-for-ComfyUI",
"reference": "https://github.com/Extraltodeus/Conditioning-token-experiments-for-ComfyUI",
"files": [
"https://github.com/Extraltodeus/Conditioning-token-experiments-for-ComfyUI"
],
"install_type": "git-clone",
"description": "I made these nodes for experimenting so it's far from perfect but at least it is entertaining!\nIt uses cosine similarities or smallest euclidean distances to find the closest tokens."
},
{
"author": "kijai",
"title": "ComfyUI SUPIR upscaler wrapper node [WIP]",
"reference": "https://github.com/kijai/ComfyUI-SUPIR",
"files": [
"https://github.com/kijai/ComfyUI-SUPIR"
],
"install_type": "git-clone",
"description": "ComfyUI [a/SUPIR](https://github.com/Fanghua-Yu/SUPIR) upscaler wrapper node"
},
{
"author": "logtd",
"title": "ComfyUI-FLATTEN",
"reference": "https://github.com/logtd/ComfyUI-FLATTEN",
"files": [
"https://github.com/logtd/ComfyUI-FLATTEN"
],
"install_type": "git-clone",
"description": "Load Checkpoint with FLATTEN model, KSampler (Flatten), Unsampler (Flatten), Sample Trajectories"
},
{
"author": "shadowcz007",
"title": "comfyui-llamafile [WIP]",
"reference": "https://github.com/shadowcz007/comfyui-llamafile",
"files": [
"https://github.com/shadowcz007/comfyui-llamafile"
],
"install_type": "git-clone",
"description": "This node is an experimental node aimed at exploring the collaborative way of human-machine creation."
},
{
"author": "gameltb",
"title": "ComfyUI paper playground",
"reference": "https://github.com/gameltb/ComfyUI_paper_playground",
"files": [
"https://github.com/gameltb/ComfyUI_paper_playground"
],
"install_type": "git-clone",
"description": "Evaluate some papers in ComfyUI, just playground.\nNOTE: Various models need to be installed, so please visit the repository to check."
},
{
"author": "huizhang0110",
"title": "ComfyUI_Easy_Nodes_hui",
"reference": "https://github.com/huizhang0110/ComfyUI_Easy_Nodes_hui",
"files": [
"https://github.com/huizhang0110/ComfyUI_Easy_Nodes_hui"
],
"install_type": "git-clone",
"description": "Nodes:EasyEmptyLatentImage"
},
{
"author": "tuckerdarby",
"title": "ComfyUI-TDNodes [WIP]",
"reference": "https://github.com/tuckerdarby/ComfyUI-TDNodes",
"files": [
"https://github.com/tuckerdarby/ComfyUI-TDNodes"
],
"install_type": "git-clone",
"description": "Nodes:KSampler (RAVE), KSampler (TF), Object Tracker, KSampler Batched, Video Tracker Prompt, TemporalNet Preprocessor, Instance Tracker Prompt, Instance Diffusion Loader, Hand Tracker Node"
},
{ {
"author": "shadowcz007", "author": "shadowcz007",
"title": "comfyui-musicgen", "title": "comfyui-musicgen",
@ -30,16 +260,6 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "Nodes:Continuous CFG rescaler (pre CFG), Intermediary latent merge (post CFG), Intensity/Brightness limiter (post CFG), Dynamic renoising (post CFG), Automatic CFG scale (pre/post CFG), CFG multiplier per channel (pre CFG), Self-Attention Guidance delayed activation mod (post CFG)" "description": "Nodes:Continuous CFG rescaler (pre CFG), Intermediary latent merge (post CFG), Intensity/Brightness limiter (post CFG), Dynamic renoising (post CFG), Automatic CFG scale (pre/post CFG), CFG multiplier per channel (pre CFG), Self-Attention Guidance delayed activation mod (post CFG)"
}, },
{
"author": "kijai",
"title": "ComfyUI-ADMotionDirector [WIP]",
"reference": "https://github.com/kijai/ComfyUI-ADMotionDirector",
"files": [
"https://github.com/kijai/ComfyUI-ADMotionDirector"
],
"install_type": "git-clone",
"description": "ComfyUI custom nodes for using [a/AnimateDiff-MotionDirector](https://github.com/ExponentialML/AnimateDiff-MotionDirector)\nAfter training, the LoRAs are intended to be used with the ComfyUI Extension [a/ComfyUI-AnimateDiff-Evolved](https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved)."
},
{ {
"author": "shadowcz007", "author": "shadowcz007",
"title": "comfyui-CLIPSeg", "title": "comfyui-CLIPSeg",
@ -100,16 +320,6 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "A simple node to request ChatGPT completions. [w/Do not share your workflows including the API key! I'll take no responsibility for your leaked keys.]" "description": "A simple node to request ChatGPT completions. [w/Do not share your workflows including the API key! I'll take no responsibility for your leaked keys.]"
}, },
{
"author": "blepping",
"title": "ComfyUI-sonar (WIP)",
"reference": "https://github.com/blepping/ComfyUI-sonar",
"files": [
"https://github.com/blepping/ComfyUI-sonar"
],
"install_type": "git-clone",
"description": "Extremely WIP and untested implementation of Sonar sampling. Currently it may not be even close to working properly. Only supports Euler and Euler Ancestral sampling. See [a/stable-diffusion-webui-sonar](https://github.com/Kahsolt/stable-diffusion-webui-sonar) for a more in-depth explanation."
},
{ {
"author": "kappa54m", "author": "kappa54m",
"title": "ComfyUI_Usability (WIP)", "title": "ComfyUI_Usability (WIP)",

View File

@ -1,5 +1,15 @@
{ {
"custom_nodes": [ "custom_nodes": [
{
"author": "BlenderNeko",
"title": "Dr.Lt.Data/Advanced CLIP Text Encode (PR21)",
"reference": "https://github.com/ltdrdata/ComfyUI_ADV_CLIP_emb",
"files": [
"https://github.com/ltdrdata/ComfyUI_ADV_CLIP_emb"
],
"install_type": "git-clone",
"description": "[a/PR21](https://github.com/BlenderNeko/ComfyUI_ADV_CLIP_emb/pull/21) is applied.\nmissing 'clip_layer' method fix."
},
{ {
"author": "gameltb", "author": "gameltb",
"title": "comfyui-stablsr", "title": "comfyui-stablsr",

View File

@ -10,6 +10,36 @@
}, },
{
"author": "ssitu",
"title": "NestedNodeBuilder [DEPRECATED]",
"reference": "https://github.com/ssitu/ComfyUI_NestedNodeBuilder",
"files": [
"https://github.com/ssitu/ComfyUI_NestedNodeBuilder"
],
"install_type": "git-clone",
"description": "This extension provides the ability to combine multiple nodes into a single node.\nNOTE:An identical feature now exists in ComfyUI. Additionally, this extension is largely broken with the recent versions of the codebase, so please use the built-in feature for group nodes."
},
{
"author": "ccvv804",
"title": "ComfyUI StableCascade using diffusers for Low VRAM [DEPRECATED]",
"reference": "https://github.com/ccvv804/ComfyUI-DiffusersStableCascade-LowVRAM",
"files": [
"https://github.com/ccvv804/ComfyUI-DiffusersStableCascade-LowVRAM"
],
"install_type": "git-clone",
"description": "Works with RTX 4070ti 12GB.\nSimple quick wrapper for [a/https://huggingface.co/stabilityai/stable-cascade](https://huggingface.co/stabilityai/stable-cascade)\nComfy is going to implement this properly soon, this repo is just for quick testing for the impatient!"
},
{
"author": "kijai",
"title": "ComfyUI StableCascade using diffusers [DEPRECATED]",
"reference": "https://github.com/kijai/ComfyUI-DiffusersStableCascade",
"files": [
"https://github.com/kijai/ComfyUI-DiffusersStableCascade"
],
"install_type": "git-clone",
"description": "Simple quick wrapper for [a/https://huggingface.co/stabilityai/stable-cascade](https://huggingface.co/stabilityai/stable-cascade)\nComfy is going to implement this properly soon, this repo is just for quick testing for the impatient!"
},
{ {
"author": "solarpush", "author": "solarpush",
"title": "comfyui_sendimage_node [REMOVED]", "title": "comfyui_sendimage_node [REMOVED]",

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,239 @@
{ {
"models": [ "models": [
{
"name": "BLIP ImageCaption (COCO) w/ ViT-B and CapFilt-L",
"type": "BLIP_MODEL",
"base": "blip_model",
"save_path": "blip",
"description": "BLIP ImageCaption (COCO) w/ ViT-B and CapFilt-L",
"reference": "https://github.com/salesforce/BLIP",
"filename": "model_base_capfilt_large.pth",
"url": "https://storage.googleapis.com/sfr-vision-language-research/BLIP/models/model_base_capfilt_large.pth"
},
{
"name": "GroundingDINO SwinT OGC - Model",
"type": "GroundingDINO",
"base": "DINO",
"save_path": "groundingdino",
"description": "GroundingDINO SwinT OGC Model",
"reference": "https://huggingface.co/ShilongLiu/GroundingDINO",
"filename": "groundingdino_swint_ogc.pth",
"url": "https://huggingface.co/ShilongLiu/GroundingDINO/resolve/main/groundingdino_swint_ogc.pth"
},
{
"name": "GroundingDINO SwinT OGC - CFG File",
"type": "GroundingDINO",
"base": "DINO",
"save_path": "groundingdino",
"description": "GroundingDINO SwinT OGC CFG File",
"reference": "https://huggingface.co/ShilongLiu/GroundingDINO/resolve/main/GroundingDINO_SwinT_OGC.cfg.py",
"filename": "GroundingDINO_SwinT_OGC.cfg.py",
"url": "https://huggingface.co/ShilongLiu/GroundingDINO/raw/main/GroundingDINO_SwinT_OGC.cfg.py"
},
{
"name": "SDXL Lightning LoRA (2step)",
"type": "lora",
"base": "SDXL",
"save_path": "loras/SDXL-Lightning",
"description": "SDXL Lightning LoRA (2step)",
"reference": "https://huggingface.co/ByteDance/SDXL-Lightning",
"filename": "sdxl_lightning_2step_lora.safetensors",
"url": "https://huggingface.co/ByteDance/SDXL-Lightning/resolve/main/sdxl_lightning_2step_lora.safetensors"
},
{
"name": "SDXL Lightning LoRA (4step)",
"type": "lora",
"base": "SDXL",
"save_path": "loras/SDXL-Lightning",
"description": "SDXL Lightning LoRA (4step)",
"reference": "https://huggingface.co/ByteDance/SDXL-Lightning",
"filename": "sdxl_lightning_4step_lora.safetensors",
"url": "https://huggingface.co/ByteDance/SDXL-Lightning/resolve/main/sdxl_lightning_4step_lora.safetensors"
},
{
"name": "SDXL Lightning LoRA (8step)",
"type": "lora",
"base": "SDXL",
"save_path": "loras/SDXL-Lightning",
"description": "SDXL Lightning LoRA (8tep)",
"reference": "https://huggingface.co/ByteDance/SDXL-Lightning",
"filename": "sdxl_lightning_8step_lora.safetensors",
"url": "https://huggingface.co/ByteDance/SDXL-Lightning/resolve/main/sdxl_lightning_8step_lora.safetensors"
},
{
"name": "shape_predictor_68_face_landmarks.dat [Face Analysis]",
"type": "Shape Predictor",
"base": "DLIB",
"save_path": "custom_nodes/ComfyUI_FaceAnalysis/dlib",
"description": "To use the Face Analysis for ComfyUI custom node, installation of this model is needed.",
"reference": "https://huggingface.co/matt3ounstable/dlib_predictor_recognition/tree/main",
"filename": "shape_predictor_68_face_landmarks.dat",
"url": "https://huggingface.co/matt3ounstable/dlib_predictor_recognition/resolve/main/shape_predictor_68_face_landmarks.dat"
},
{
"name": "dlib_face_recognition_resnet_model_v1.dat [Face Analysis]",
"type": "Face Recognition",
"base": "DLIB",
"save_path": "custom_nodes/ComfyUI_FaceAnalysis/dlib",
"description": "To use the Face Analysis for ComfyUI custom node, installation of this model is needed.",
"reference": "https://huggingface.co/matt3ounstable/dlib_predictor_recognition/tree/main",
"filename": "dlib_face_recognition_resnet_model_v1.dat",
"url": "https://huggingface.co/matt3ounstable/dlib_predictor_recognition/resolve/main/dlib_face_recognition_resnet_model_v1.dat"
},
{
"name": "efficient_sam_s_cpu.jit [ComfyUI-YoloWorld-EfficientSAM]",
"type": "efficient_sam",
"base": "efficient_sam",
"save_path": "custom_nodes/ComfyUI-YoloWorld-EfficientSAM",
"description": "Install efficient_sam_s_cpu.jit into ComfyUI-YoloWorld-EfficientSAM",
"reference": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/tree/main",
"filename": "efficient_sam_s_cpu.jit",
"url": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/resolve/main/efficient_sam_s_cpu.jit"
},
{
"name": "efficient_sam_s_gpu.jit [ComfyUI-YoloWorld-EfficientSAM]",
"type": "efficient_sam",
"base": "efficient_sam",
"save_path": "custom_nodes/ComfyUI-YoloWorld-EfficientSAM",
"description": "Install efficient_sam_s_gpu.jit into ComfyUI-YoloWorld-EfficientSAM",
"reference": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/tree/main",
"filename": "efficient_sam_s_gpu.jit",
"url": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/resolve/main/efficient_sam_s_gpu.jit"
},
{
"name": "stabilityai/comfyui_checkpoints/stable_cascade_stage_b.safetensors",
"type": "checkpoints",
"base": "Stable Cascade",
"save_path": "checkpoints/Stable-Cascade",
"description": "[4.55GB] Stable Cascade stage_b checkpoints",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stable_cascade_stage_b.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/comfyui_checkpoints/stable_cascade_stage_b.safetensors"
},
{
"name": "stabilityai/comfyui_checkpoints/stable_cascade_stage_c.safetensors",
"type": "checkpoints",
"base": "Stable Cascade",
"save_path": "checkpoints/Stable-Cascade",
"description": "[9.22GB] Stable Cascade stage_c checkpoints",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stable_cascade_stage_c.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/comfyui_checkpoints/stable_cascade_stage_c.safetensors"
},
{
"name": "stabilityai/Stable Cascade: effnet_encoder.safetensors (VAE)",
"type": "VAE",
"base": "Stable Cascade",
"save_path": "vae/Stable-Cascade",
"description": "[81.5MB] Stable Cascade: effnet_encoder.\nVAE encoder for stage_c latent.",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "effnet_encoder.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/effnet_encoder.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_a.safetensors (VAE)",
"type": "VAE",
"base": "Stable Cascade",
"save_path": "vae/Stable-Cascade",
"description": "[73.7MB] Stable Cascade: stage_a",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_a.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_a.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_b.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[6.25GB] Stable Cascade: stage_b",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_b.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_b_bf16.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[3.13GB] Stable Cascade: stage_b/bf16",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_b_bf16.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_bf16.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_b_lite.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[2.8GB] Stable Cascade: stage_b/lite",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_b_lite.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_lite.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_b_lite.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[1.4GB] Stable Cascade: stage_b/bf16,lite",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_b_lite_bf16.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_lite_bf16.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_c.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[14.4GB] Stable Cascade: stage_c",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_c.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_c_bf16.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[7.18GB] Stable Cascade: stage_c/bf16",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_c_bf16.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_bf16.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_c_lite.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[4.12GB] Stable Cascade: stage_c/lite",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_c_lite.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_lite.safetensors"
},
{
"name": "stabilityai/Stable Cascade: stage_c_lite.safetensors (UNET)",
"type": "unet",
"base": "Stable Cascade",
"save_path": "unet/Stable-Cascade",
"description": "[2.06GB] Stable Cascade: stage_c/bf16,lite",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "stage_c_lite_bf16.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_lite_bf16.safetensors"
},
{
"name": "stabilityai/Stable Cascade: text_encoder (CLIP)",
"type": "clip",
"base": "Stable Cascade",
"save_path": "clip/Stable-Cascade",
"description": "[1.39GB] Stable Cascade: text_encoder",
"reference": "https://huggingface.co/stabilityai/stable-cascade",
"filename": "model.safetensors",
"url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/text_encoder/model.safetensors"
},
{ {
"name": "1k3d68.onnx", "name": "1k3d68.onnx",
"type": "insightface", "type": "insightface",
@ -458,251 +692,6 @@
"reference": "https://huggingface.co/stabilityai/stable-video-diffusion-img2vid", "reference": "https://huggingface.co/stabilityai/stable-video-diffusion-img2vid",
"filename": "svd.safetensors", "filename": "svd.safetensors",
"url": "https://huggingface.co/stabilityai/stable-video-diffusion-img2vid/resolve/main/svd.safetensors" "url": "https://huggingface.co/stabilityai/stable-video-diffusion-img2vid/resolve/main/svd.safetensors"
},
{
"name": "Stable Video Diffusion Image-to-Video (XT)",
"type": "checkpoints",
"base": "SVD",
"save_path": "checkpoints/SVD",
"description": "Stable Video Diffusion (SVD) Image-to-Video is a diffusion model that takes in a still image as a conditioning frame, and generates a video from it.\nNOTE: 25 frames @ 576x1024 ",
"reference": "https://huggingface.co/stabilityai/stable-video-diffusion-img2vid-xt",
"filename": "svd_xt.safetensors",
"url": "https://huggingface.co/stabilityai/stable-video-diffusion-img2vid-xt/resolve/main/svd_xt.safetensors"
},
{
"name": "animatediff/mm_sdxl_v10_beta.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "animatediff",
"base": "SDXL",
"save_path": "animatediff_models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "mm_sdxl_v10_beta.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sdxl_v10_beta.ckpt"
},
{
"name": "animatediff/v2_lora_PanLeft.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_PanLeft.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_PanLeft.ckpt"
},
{
"name": "animatediff/v2_lora_PanRight.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_PanRight.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_PanRight.ckpt"
},
{
"name": "animatediff/v2_lora_RollingAnticlockwise.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_RollingAnticlockwise.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_RollingAnticlockwise.ckpt"
},
{
"name": "animatediff/v2_lora_RollingClockwise.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_RollingClockwise.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_RollingClockwise.ckpt"
},
{
"name": "animatediff/v2_lora_TiltDown.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_TiltDown.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_TiltDown.ckpt"
},
{
"name": "animatediff/v2_lora_TiltUp.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_TiltUp.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_TiltUp.ckpt"
},
{
"name": "animatediff/v2_lora_ZoomIn.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_ZoomIn.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_ZoomIn.ckpt"
},
{
"name": "animatediff/v2_lora_ZoomOut.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "motion lora",
"base": "SD1.x",
"save_path": "animatediff_motion_lora",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v2_lora_ZoomOut.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_ZoomOut.ckpt"
},
{
"name": "CiaraRowles/TemporalNet1XL (1.0)",
"type": "controlnet",
"base": "SD1.5",
"save_path": "controlnet/TemporalNet1XL",
"description": "This is TemporalNet1XL, it is a re-train of the controlnet TemporalNet1 with Stable Diffusion XL.",
"reference": "https://huggingface.co/CiaraRowles/controlnet-temporalnet-sdxl-1.0",
"filename": "diffusion_pytorch_model.safetensors",
"url": "https://huggingface.co/CiaraRowles/controlnet-temporalnet-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors"
},
{
"name": "LCM LoRA SD1.5",
"type": "lora",
"base": "SD1.5",
"save_path": "loras/lcm/SD1.5",
"description": "Latent Consistency LoRA for SD1.5",
"reference": "https://huggingface.co/latent-consistency/lcm-lora-sdv1-5",
"filename": "pytorch_lora_weights.safetensors",
"url": "https://huggingface.co/latent-consistency/lcm-lora-sdv1-5/resolve/main/pytorch_lora_weights.safetensors"
},
{
"name": "LCM LoRA SSD-1B",
"type": "lora",
"base": "SSD-1B",
"save_path": "loras/lcm/SSD-1B",
"description": "Latent Consistency LoRA for SSD-1B",
"reference": "https://huggingface.co/latent-consistency/lcm-lora-ssd-1b",
"filename": "pytorch_lora_weights.safetensors",
"url": "https://huggingface.co/latent-consistency/lcm-lora-ssd-1b/resolve/main/pytorch_lora_weights.safetensors"
},
{
"name": "LCM LoRA SDXL",
"type": "lora",
"base": "SSD-1B",
"save_path": "loras/lcm/SDXL",
"description": "Latent Consistency LoRA for SDXL",
"reference": "https://huggingface.co/latent-consistency/lcm-lora-sdxl",
"filename": "pytorch_lora_weights.safetensors",
"url": "https://huggingface.co/latent-consistency/lcm-lora-sdxl/resolve/main/pytorch_lora_weights.safetensors"
},
{
"name": "face_yolov8m-seg_60.pt (segm)",
"type": "Ultralytics",
"base": "Ultralytics",
"save_path": "ultralytics/segm",
"description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
"reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
"filename": "face_yolov8m-seg_60.pt",
"url": "https://github.com/hben35096/assets/releases/download/yolo8/face_yolov8m-seg_60.pt"
},
{
"name": "face_yolov8n-seg2_60.pt (segm)",
"type": "Ultralytics",
"base": "Ultralytics",
"save_path": "ultralytics/segm",
"description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
"reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
"filename": "face_yolov8n-seg2_60.pt",
"url": "https://github.com/hben35096/assets/releases/download/yolo8/face_yolov8n-seg2_60.pt"
},
{
"name": "hair_yolov8n-seg_60.pt (segm)",
"type": "Ultralytics",
"base": "Ultralytics",
"save_path": "ultralytics/segm",
"description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
"reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
"filename": "hair_yolov8n-seg_60.pt",
"url": "https://github.com/hben35096/assets/releases/download/yolo8/hair_yolov8n-seg_60.pt"
},
{
"name": "skin_yolov8m-seg_400.pt (segm)",
"type": "Ultralytics",
"base": "Ultralytics",
"save_path": "ultralytics/segm",
"description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
"reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
"filename": "skin_yolov8m-seg_400.pt",
"url": "https://github.com/hben35096/assets/releases/download/yolo8/skin_yolov8m-seg_400.pt"
},
{
"name": "skin_yolov8n-seg_400.pt (segm)",
"type": "Ultralytics",
"base": "Ultralytics",
"save_path": "ultralytics/segm",
"description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
"reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
"filename": "skin_yolov8n-seg_400.pt",
"url": "https://github.com/hben35096/assets/releases/download/yolo8/skin_yolov8n-seg_400.pt"
},
{
"name": "skin_yolov8n-seg_800.pt (segm)",
"type": "Ultralytics",
"base": "Ultralytics",
"save_path": "ultralytics/segm",
"description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.",
"reference": "https://github.com/hben35096/assets/releases/tag/yolo8",
"filename": "skin_yolov8n-seg_800.pt",
"url": "https://github.com/hben35096/assets/releases/download/yolo8/skin_yolov8n-seg_800.pt"
},
{
"name": "CiaraRowles/temporaldiff-v1-animatediff.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "animatediff_models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/CiaraRowles/TemporalDiff",
"filename": "temporaldiff-v1-animatediff.ckpt",
"url": "https://huggingface.co/CiaraRowles/TemporalDiff/resolve/main/temporaldiff-v1-animatediff.ckpt"
},
{
"name": "animatediff/mm_sd_v15_v2.ckpt (ComfyUI-AnimateDiff-Evolved)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "mm_sd_v15_v2.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v15_v2.ckpt"
},
{
"name": "AD_Stabilized_Motion/mm-Stabilized_high.pth (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "animatediff_models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/manshoety/AD_Stabilized_Motion",
"filename": "mm-Stabilized_high.pth",
"url": "https://huggingface.co/manshoety/AD_Stabilized_Motion/resolve/main/mm-Stabilized_high.pth"
},
{
"name": "AD_Stabilized_Motion/mm-Stabilized_mid.pth (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "animatediff_models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/manshoety/AD_Stabilized_Motion",
"filename": "mm-Stabilized_mid.pth",
"url": "https://huggingface.co/manshoety/AD_Stabilized_Motion/resolve/main/mm-Stabilized_mid.pth"
} }
] ]
} }

View File

@ -10,6 +10,26 @@
"install_type": "git-clone", "install_type": "git-clone",
"description": "There is a small node pack attached to this guide. This includes the init file and 3 nodes associated with the tutorials." "description": "There is a small node pack attached to this guide. This includes the init file and 3 nodes associated with the tutorials."
}, },
{
"author": "BadCafeCode",
"title": "execution-inversion-demo-comfyui",
"reference": "https://github.com/BadCafeCode/execution-inversion-demo-comfyui",
"files": [
"https://github.com/BadCafeCode/execution-inversion-demo-comfyui"
],
"install_type": "git-clone",
"description": "These are demo nodes for [a/PR2666](https://github.com/comfyanonymous/ComfyUI/pull/2666)"
},
{
"author": "ecjojo",
"title": "ecjojo_example_nodes",
"reference": "https://github.com/ecjojo/ecjojo-example-nodes",
"files": [
"https://github.com/ecjojo/ecjojo-example-nodes"
],
"install_type": "git-clone",
"description": "Welcome to ecjojo_example_nodes! This example is specifically designed for beginners who want to learn how to write a simple custom node.\nFeel free to modify this example and make it your own. Experiment with different features and functionalities to enhance your understanding of ComfyUI custom nodes. Don't be afraid to explore and customize the code to suit your needs.\nBy diving into this example and making it your own, you'll gain valuable hands-on experience in creating custom nodes in ComfyUI. Enjoy the process of learning and have fun with your custom node development journey!"
},
{ {
"author": "dynamixar", "author": "dynamixar",
"title": "Atluris", "title": "Atluris",
@ -119,6 +139,16 @@
], ],
"install_type": "git-clone", "install_type": "git-clone",
"description": "Nodes:M_Layer, M_Output" "description": "Nodes:M_Layer, M_Output"
},
{
"author": "andrewharp",
"title": "ComfyUI Function Annotator",
"reference": "https://github.com/andrewharp/ComfyUI-Annotations",
"files": [
"https://github.com/andrewharp/ComfyUI-Annotations"
],
"install_type": "git-clone",
"description": "This module provides an annotation @ComfyFunc to streamline adding custom node types in ComfyUI. It processes your function's signature to create a wrapped function and custom node definition required for ComfyUI, eliminating all the boilerplate code. In most cases you can just add a @ComfyFunc(\"category\") annotation to your existing function."
} }
] ]
} }

View File

@ -15,7 +15,14 @@ sys.path.append(glob_path)
import cm_global import cm_global
message_collapses = [] cm_global.pip_downgrade_blacklist = ['torch', 'torchsde', 'torchvision', 'transformers', 'safetensors', 'kornia']
def skip_pip_spam(x):
return 'Requirement already satisfied:' in x
message_collapses = [skip_pip_spam]
import_failed_extensions = set() import_failed_extensions = set()
cm_global.variables['cm.on_revision_detected_handler'] = [] cm_global.variables['cm.on_revision_detected_handler'] = []
enable_file_logging = True enable_file_logging = True
@ -166,11 +173,9 @@ try:
write_stderr = wrapper_stderr write_stderr = wrapper_stderr
pat_tqdm = r'\d+%.*\[(.*?)\]' pat_tqdm = r'\d+%.*\[(.*?)\]'
pat_import_fail = r'seconds \(IMPORT FAILED\):' pat_import_fail = r'seconds \(IMPORT FAILED\):.*[/\\]custom_nodes[/\\](.*)$'
pat_custom_node = r'[/\\]custom_nodes[/\\](.*)$'
is_start_mode = True is_start_mode = True
is_import_fail_mode = False
class ComfyUIManagerLogger: class ComfyUIManagerLogger:
def __init__(self, is_stdout): def __init__(self, is_stdout):
@ -190,26 +195,17 @@ try:
def write(self, message): def write(self, message):
global is_start_mode global is_start_mode
global is_import_fail_mode
if any(f(message) for f in message_collapses): if any(f(message) for f in message_collapses):
return return
if is_start_mode: if is_start_mode:
if is_import_fail_mode: match = re.search(pat_import_fail, message)
match = re.search(pat_custom_node, message) if match:
if match: import_failed_extensions.add(match.group(1))
import_failed_extensions.add(match.group(1))
is_import_fail_mode = False
else:
match = re.search(pat_import_fail, message)
if match:
is_import_fail_mode = True
else:
is_import_fail_mode = False
if 'Starting server' in message: if 'Starting server' in message:
is_start_mode = False is_start_mode = False
if not self.is_stdout: if not self.is_stdout:
match = re.search(pat_tqdm, message) match = re.search(pat_tqdm, message)
@ -347,6 +343,11 @@ def is_installed(name):
if match: if match:
name = match.group(1) name = match.group(1)
if name in cm_global.pip_downgrade_blacklist:
if match is None or match.group(2) in ['<=', '==', '<']:
print(f"[ComfyUI-Manager] skip black listed pip installation: '{name}'")
return True
return name.lower() in get_installed_packages() return name.lower() in get_installed_packages()

View File

@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
rm ~/.tmp/default/*.py > /dev/null 2>&1 rm ~/.tmp/default/*.py > /dev/null 2>&1
python scanner.py ~/.tmp/default python scanner.py ~/.tmp/default $@
cp extension-node-map.json node_db/new/. cp extension-node-map.json node_db/new/.
echo Integrity check echo Integrity check

View File

@ -20,6 +20,8 @@ else:
if not os.path.exists(temp_dir): if not os.path.exists(temp_dir):
os.makedirs(temp_dir) os.makedirs(temp_dir)
skip_update = '--skip-update' in sys.argv
print(f"TEMP DIR: {temp_dir}") print(f"TEMP DIR: {temp_dir}")
@ -159,9 +161,9 @@ def get_git_urls_from_json(json_file):
if node.get('install_type') == 'git-clone': if node.get('install_type') == 'git-clone':
files = node.get('files', []) files = node.get('files', [])
if files: if files:
git_clone_files.append((files[0], node.get('title'), node.get('nodename_pattern'))) git_clone_files.append((files[0], node.get('title'), node.get('preemptions'), node.get('nodename_pattern')))
git_clone_files.append(("https://github.com/comfyanonymous/ComfyUI", "ComfyUI", None)) git_clone_files.append(("https://github.com/comfyanonymous/ComfyUI", "ComfyUI", None, None))
return git_clone_files return git_clone_files
@ -176,7 +178,7 @@ def get_py_urls_from_json(json_file):
if node.get('install_type') == 'copy': if node.get('install_type') == 'copy':
files = node.get('files', []) files = node.get('files', [])
if files: if files:
py_files.append((files[0], node.get('title'), node.get('nodename_pattern'))) py_files.append((files[0], node.get('title'), node.get('preemptions'), node.get('nodename_pattern')))
return py_files return py_files
@ -208,27 +210,31 @@ def update_custom_nodes():
node_info = {} node_info = {}
git_url_titles = get_git_urls_from_json('custom-node-list.json') git_url_titles_preemptions = get_git_urls_from_json('custom-node-list.json')
def process_git_url_title(url, title, preemptions, node_pattern):
if 'Jovimetrix' in title:
pass
def process_git_url_title(url, title, node_pattern):
name = os.path.basename(url) name = os.path.basename(url)
if name.endswith(".git"): if name.endswith(".git"):
name = name[:-4] name = name[:-4]
node_info[name] = (url, title, node_pattern) node_info[name] = (url, title, preemptions, node_pattern)
clone_or_pull_git_repository(url) if not skip_update:
clone_or_pull_git_repository(url)
with concurrent.futures.ThreadPoolExecutor(10) as executor: with concurrent.futures.ThreadPoolExecutor(10) as executor:
for url, title, node_pattern in git_url_titles: for url, title, preemptions, node_pattern in git_url_titles_preemptions:
executor.submit(process_git_url_title, url, title, node_pattern) executor.submit(process_git_url_title, url, title, preemptions, node_pattern)
py_url_titles_and_pattern = get_py_urls_from_json('custom-node-list.json') py_url_titles_and_pattern = get_py_urls_from_json('custom-node-list.json')
def download_and_store_info(url_title_and_pattern): def download_and_store_info(url_title_preemptions_and_pattern):
url, title, node_pattern = url_title_and_pattern url, title, preemptions, node_pattern = url_title_preemptions_and_pattern
name = os.path.basename(url) name = os.path.basename(url)
if name.endswith(".py"): if name.endswith(".py"):
node_info[name] = (url, title, node_pattern) node_info[name] = (url, title, preemptions, node_pattern)
try: try:
download_url(url, temp_dir) download_url(url, temp_dir)
@ -262,15 +268,24 @@ def gen_json(node_info):
dirname = os.path.basename(dirname) dirname = os.path.basename(dirname)
if len(nodes) > 0 or (dirname in node_info and node_info[dirname][2] is not None): if 'Jovimetrix' in dirname:
pass
if len(nodes) > 0 or (dirname in node_info and node_info[dirname][3] is not None):
nodes = list(nodes) nodes = list(nodes)
nodes.sort() nodes.sort()
if dirname in node_info: if dirname in node_info:
git_url, title, node_pattern = node_info[dirname] git_url, title, preemptions, node_pattern = node_info[dirname]
metadata['title_aux'] = title metadata['title_aux'] = title
if preemptions is not None:
metadata['preemptions'] = preemptions
if node_pattern is not None: if node_pattern is not None:
metadata['nodename_pattern'] = node_pattern metadata['nodename_pattern'] = node_pattern
data[git_url] = (nodes, metadata) data[git_url] = (nodes, metadata)
else: else:
print(f"WARN: {dirname} is removed from custom-node-list.json") print(f"WARN: {dirname} is removed from custom-node-list.json")
@ -278,17 +293,22 @@ def gen_json(node_info):
for file in node_files: for file in node_files:
nodes, metadata = scan_in_file(file) nodes, metadata = scan_in_file(file)
if len(nodes) > 0 or (dirname in node_info and node_info[dirname][2] is not None): if len(nodes) > 0 or (dirname in node_info and node_info[dirname][3] is not None):
nodes = list(nodes) nodes = list(nodes)
nodes.sort() nodes.sort()
file = os.path.basename(file) file = os.path.basename(file)
if file in node_info: if file in node_info:
url, title, node_pattern = node_info[file] url, title, preemptions, node_pattern = node_info[file]
metadata['title_aux'] = title metadata['title_aux'] = title
if preemptions is not None:
metadata['preemptions'] = preemptions
if node_pattern is not None: if node_pattern is not None:
metadata['nodename_pattern'] = node_pattern metadata['nodename_pattern'] = node_pattern
data[url] = (nodes, metadata) data[url] = (nodes, metadata)
else: else:
print(f"Missing info: {file}") print(f"Missing info: {file}")
@ -299,7 +319,7 @@ def gen_json(node_info):
for extension in extensions: for extension in extensions:
node_list_json_path = os.path.join(temp_dir, extension, 'node_list.json') node_list_json_path = os.path.join(temp_dir, extension, 'node_list.json')
if os.path.exists(node_list_json_path): if os.path.exists(node_list_json_path):
git_url, title, node_pattern = node_info[extension] git_url, title, preemptions, node_pattern = node_info[extension]
with open(node_list_json_path, 'r', encoding='utf-8') as f: with open(node_list_json_path, 'r', encoding='utf-8') as f:
node_list_json = json.load(f) node_list_json = json.load(f)
@ -315,8 +335,13 @@ def gen_json(node_info):
nodes.add(x.strip()) nodes.add(x.strip())
metadata_in_url['title_aux'] = title metadata_in_url['title_aux'] = title
if preemptions is not None:
metadata['preemptions'] = preemptions
if node_pattern is not None: if node_pattern is not None:
metadata_in_url['nodename_pattern'] = node_pattern metadata_in_url['nodename_pattern'] = node_pattern
nodes = list(nodes) nodes = list(nodes)
nodes.sort() nodes.sort()
data[git_url] = (nodes, metadata_in_url) data[git_url] = (nodes, metadata_in_url)

View File

@ -4,9 +4,9 @@ git clone https://github.com/ltdrdata/ComfyUI-Manager
cd .. cd ..
python -m venv venv python -m venv venv
source venv/bin/activate source venv/bin/activate
pythoh -m pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu121
python -m pip install -r requirements.txt python -m pip install -r requirements.txt
python -m pip install -r custom_nodes/ComfyUI-Manager/requirements.txt python -m pip install -r custom_nodes/ComfyUI-Manager/requirements.txt
python -m pip install torchvision
cd .. cd ..
echo "#!/bin/bash" > run_gpu.sh echo "#!/bin/bash" > run_gpu.sh
echo "cd ComfyUI" >> run_gpu.sh echo "cd ComfyUI" >> run_gpu.sh

View File

@ -4,17 +4,14 @@ git clone https://github.com/ltdrdata/ComfyUI-Manager
cd .. cd ..
python -m venv venv python -m venv venv
call venv/Scripts/activate call venv/Scripts/activate
pythoh -m pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu121
python -m pip install -r requirements.txt python -m pip install -r requirements.txt
python -m pip install -r custom_nodes/ComfyUI-Manager/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 .. cd ..
echo "cd ComfyUI" >> run_gpu.sh echo "cd ComfyUI" >> run_gpu.bat
echo "call venv/Scripts/activate" >> run_gpu.sh echo "call venv/Scripts/activate" >> run_gpu.bat
echo "python main.py" >> run_gpu.sh echo "python main.py" >> run_gpu.bat
chmod +x run_gpu.sh
echo "#!/bin/bash" > run_cpu.sh echo "cd ComfyUI" >> run_cpu.bat
echo "cd ComfyUI" >> run_cpu.sh echo "call venv/Scripts/activate" >> run_cpu.bat
echo "call venv/Scripts/activate" >> run_cpu.sh echo "python main.py --cpu" >> run_cpu.bat
echo "python main.py --cpu" >> run_cpu.sh
chmod +x run_cpu.sh