Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
816a53a7b1 | ||
|
|
ced93b0525 | ||
|
|
524ff9a4a6 | ||
|
|
f15032f905 | ||
|
|
d7d31a19e5 | ||
|
|
df2a7ddca4 | ||
|
|
ba9c71ffa4 | ||
|
|
21b6c6569c | ||
|
|
92aba9565a | ||
|
|
6ea0aebb0b | ||
|
|
b5cdcb75b4 | ||
|
|
bd9aae40b8 | ||
|
|
33f931c0a4 | ||
|
|
ede8279c17 | ||
|
|
268b84a2b6 |
20
README.md
20
README.md
@@ -5,6 +5,7 @@
|
|||||||

|

|
||||||
|
|
||||||
## NOTICE
|
## NOTICE
|
||||||
|
* V3.16: Support for `uv` has been added. Set `use_uv` in `config.ini`.
|
||||||
* V3.10: `double-click feature` is removed
|
* V3.10: `double-click feature` is removed
|
||||||
* This feature has been moved to https://github.com/ltdrdata/comfyui-connection-helper
|
* This feature has been moved to https://github.com/ltdrdata/comfyui-connection-helper
|
||||||
* V3.3.2: Overhauled. Officially supports [https://comfyregistry.org/](https://comfyregistry.org/).
|
* V3.3.2: Overhauled. Officially supports [https://comfyregistry.org/](https://comfyregistry.org/).
|
||||||
@@ -246,6 +247,25 @@ The following settings are applied based on the section marked as `is_default`.
|
|||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
# Config
|
||||||
|
* You can modify the `config.ini` file to apply the settings for ComfyUI-Manager.
|
||||||
|
* The path to the `config.ini` used by ComfyUI-Manager is displayed in the startup log messages.
|
||||||
|
* See also: [https://github.com/ltdrdata/ComfyUI-Manager#paths]
|
||||||
|
* Configuration options:
|
||||||
|
```
|
||||||
|
[default]
|
||||||
|
git_exe = <Manually specify the path to the git executable. If left empty, the default git executable path will be used.>
|
||||||
|
use_uv = <Use uv instead of pip for dependency installation.>
|
||||||
|
default_cache_as_channel_url = <Determines whether to retrieve the DB designated as channel_url at startup>
|
||||||
|
bypass_ssl = <Set to True if SSL errors occur to disable SSL.>
|
||||||
|
file_logging = <Configure whether to create a log file used by ComfyUI-Manager.>
|
||||||
|
windows_selector_event_loop_policy = <If an event loop error occurs on Windows, set this to True.>
|
||||||
|
model_download_by_agent = <When downloading models, use an agent instead of torchvision_download_url.>
|
||||||
|
downgrade_blacklist = <Set a list of packages to prevent downgrades. List them separated by commas.>
|
||||||
|
security_level = <Set the security level.>
|
||||||
|
always_lazy_install = <Whether to perform dependency installation on restart even in environments other than Windows.>
|
||||||
|
```
|
||||||
|
|
||||||
## Additional Feature
|
## Additional Feature
|
||||||
* Logging to file feature
|
* Logging to file feature
|
||||||
* This feature is enabled by default and can be disabled by setting `file_logging = False` in the `config.ini`.
|
* This feature is enabled by default and can be disabled by setting `file_logging = False` in the `config.ini`.
|
||||||
|
|||||||
@@ -5108,7 +5108,7 @@
|
|||||||
"https://github.com/MNeMoNiCuZ/ComfyUI-mnemic-nodes"
|
"https://github.com/MNeMoNiCuZ/ComfyUI-mnemic-nodes"
|
||||||
],
|
],
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Added new models to Groq LLM. Added a new node: Tiktoken Tokenizer Info."
|
"description": "Added Lora Loader - Tag node, originally by badjeff"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"author": "AI2lab",
|
"author": "AI2lab",
|
||||||
@@ -20417,15 +20417,15 @@
|
|||||||
"description": "This my implemenation of a `pipe` in ComfyUI. Is it better or worse than others? No idea."
|
"description": "This my implemenation of a `pipe` in ComfyUI. Is it better or worse than others? No idea."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"title": "A2V Multi Image Composite",
|
|
||||||
"author": "AiartvnTeam",
|
"author": "AiartvnTeam",
|
||||||
|
"title": "A2V Multi Image Composite",
|
||||||
"id": "Aiartvn",
|
"id": "Aiartvn",
|
||||||
"description": "Node for compositing multiple images with interactive preview and layer management",
|
"reference": "https://github.com/aiartvn/A2V_Multi_Image_Composite",
|
||||||
"repository": "https://github.com/aiartvn/A2V_Multi_Image_Composite",
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/aiartvn/A2V_Multi_Image_Composite"
|
"https://github.com/aiartvn/A2V_Multi_Image_Composite"
|
||||||
],
|
],
|
||||||
|
"description": "Node for compositing multiple images with interactive preview and layer management",
|
||||||
|
"install_type": "git-clone",
|
||||||
"tags": ["image", "composite", "layer", "blend", "transform"]
|
"tags": ["image", "composite", "layer", "blend", "transform"]
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -5854,6 +5854,7 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/MNeMoNiCuZ/ComfyUI-mnemic-nodes": [
|
"https://github.com/MNeMoNiCuZ/ComfyUI-mnemic-nodes": [
|
||||||
[
|
[
|
||||||
|
"LoraTagLoader",
|
||||||
"StringCleaning",
|
"StringCleaning",
|
||||||
"TiktokenTokenizer",
|
"TiktokenTokenizer",
|
||||||
"\u26d4 Generate Negative Prompt",
|
"\u26d4 Generate Negative Prompt",
|
||||||
@@ -5861,6 +5862,7 @@
|
|||||||
"\u2728\ud83d\udcac Groq LLM API",
|
"\u2728\ud83d\udcac Groq LLM API",
|
||||||
"\u2728\ud83d\udcdd Groq ALM API - Transcribe",
|
"\u2728\ud83d\udcdd Groq ALM API - Transcribe",
|
||||||
"\u2728\ud83d\udcf7 Groq VLM API",
|
"\u2728\ud83d\udcf7 Groq VLM API",
|
||||||
|
"\ud83c\udff7\ufe0f LoRA Loader Prompt Tags",
|
||||||
"\ud83d\udcbe Save Text File With Path",
|
"\ud83d\udcbe Save Text File With Path",
|
||||||
"\ud83d\udcc1 Get File Path",
|
"\ud83d\udcc1 Get File Path",
|
||||||
"\ud83d\udd20 Tiktoken Tokenizer Info",
|
"\ud83d\udd20 Tiktoken Tokenizer Info",
|
||||||
@@ -8478,6 +8480,7 @@
|
|||||||
"Star Face Loader",
|
"Star Face Loader",
|
||||||
"StarFiveWildcards",
|
"StarFiveWildcards",
|
||||||
"StarImageSwitch",
|
"StarImageSwitch",
|
||||||
|
"StarLatentSwitch",
|
||||||
"StarTextFilter",
|
"StarTextFilter",
|
||||||
"StarTextInput",
|
"StarTextInput",
|
||||||
"Starupscale"
|
"Starupscale"
|
||||||
@@ -20790,6 +20793,7 @@
|
|||||||
"Enhanced Random Light Source",
|
"Enhanced Random Light Source",
|
||||||
"Float Relay",
|
"Float Relay",
|
||||||
"HLFrequencyDetailRestore",
|
"HLFrequencyDetailRestore",
|
||||||
|
"Hex to Color",
|
||||||
"Image Add Alpha",
|
"Image Add Alpha",
|
||||||
"Image Frequency Analyzer",
|
"Image Frequency Analyzer",
|
||||||
"Image Relay",
|
"Image Relay",
|
||||||
|
|||||||
2315
github-stats.json
2315
github-stats.json
File diff suppressed because it is too large
Load Diff
@@ -4,6 +4,7 @@ description:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import json
|
import json
|
||||||
|
import logging
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import subprocess
|
import subprocess
|
||||||
@@ -41,7 +42,7 @@ import manager_downloader
|
|||||||
from node_package import InstalledNodePackage
|
from node_package import InstalledNodePackage
|
||||||
|
|
||||||
|
|
||||||
version_code = [3, 14]
|
version_code = [3, 17, 7]
|
||||||
version_str = f"V{version_code[0]}.{version_code[1]}" + (f'.{version_code[2]}' if len(version_code) > 2 else '')
|
version_str = f"V{version_code[0]}.{version_code[1]}" + (f'.{version_code[2]}' if len(version_code) > 2 else '')
|
||||||
|
|
||||||
|
|
||||||
@@ -173,7 +174,7 @@ git_script_path = os.path.join(manager_util.comfyui_manager_path, "git_helper.py
|
|||||||
manager_files_path = None
|
manager_files_path = None
|
||||||
manager_config_path = None
|
manager_config_path = None
|
||||||
manager_channel_list_path = None
|
manager_channel_list_path = None
|
||||||
manager_startup_script_path = None
|
manager_startup_script_path:str = None
|
||||||
manager_snapshot_path = None
|
manager_snapshot_path = None
|
||||||
manager_pip_overrides_path = None
|
manager_pip_overrides_path = None
|
||||||
manager_components_path = None
|
manager_components_path = None
|
||||||
@@ -324,6 +325,8 @@ def normalize_channel(channel):
|
|||||||
return None
|
return None
|
||||||
elif channel.startswith('https://'):
|
elif channel.startswith('https://'):
|
||||||
return channel
|
return channel
|
||||||
|
elif channel.startswith('http://') and get_config()['http_channel_enabled'] == True:
|
||||||
|
return channel
|
||||||
|
|
||||||
tmp_dict = get_channel_dict()
|
tmp_dict = get_channel_dict()
|
||||||
channel_url = tmp_dict.get(channel)
|
channel_url = tmp_dict.get(channel)
|
||||||
@@ -808,7 +811,7 @@ class UnifiedManager:
|
|||||||
package_name = remap_pip_package(line.strip())
|
package_name = remap_pip_package(line.strip())
|
||||||
if package_name and not package_name.startswith('#') and package_name not in self.processed_install:
|
if package_name and not package_name.startswith('#') and package_name not in self.processed_install:
|
||||||
self.processed_install.add(package_name)
|
self.processed_install.add(package_name)
|
||||||
install_cmd = [sys.executable, "-m", "pip", "install", package_name]
|
install_cmd = manager_util.make_pip_cmd(["install", package_name])
|
||||||
if package_name.strip() != "" and not package_name.startswith('#'):
|
if package_name.strip() != "" and not package_name.startswith('#'):
|
||||||
res = res and try_install_script(url, repo_path, install_cmd, instant_execution=instant_execution)
|
res = res and try_install_script(url, repo_path, install_cmd, instant_execution=instant_execution)
|
||||||
|
|
||||||
@@ -818,7 +821,7 @@ class UnifiedManager:
|
|||||||
if os.path.exists(install_script_path) and install_script_path not in self.processed_install:
|
if os.path.exists(install_script_path) and install_script_path not in self.processed_install:
|
||||||
self.processed_install.add(install_script_path)
|
self.processed_install.add(install_script_path)
|
||||||
print("Install: install script")
|
print("Install: install script")
|
||||||
install_cmd = [sys.executable, "install.py"]
|
install_cmd = manager_util.make_pip_cmd(["install.py"])
|
||||||
return try_install_script(url, repo_path, install_cmd, instant_execution=instant_execution)
|
return try_install_script(url, repo_path, install_cmd, instant_execution=instant_execution)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
@@ -1544,18 +1547,19 @@ def write_config():
|
|||||||
config = configparser.ConfigParser()
|
config = configparser.ConfigParser()
|
||||||
config['default'] = {
|
config['default'] = {
|
||||||
'preview_method': manager_funcs.get_current_preview_method(),
|
'preview_method': manager_funcs.get_current_preview_method(),
|
||||||
'git_exe': get_config()['git_exe'],
|
'git_exe': get_config()['git_exe'],
|
||||||
|
'use_uv': get_config()['use_uv'],
|
||||||
'channel_url': get_config()['channel_url'],
|
'channel_url': get_config()['channel_url'],
|
||||||
'share_option': get_config()['share_option'],
|
'share_option': get_config()['share_option'],
|
||||||
'bypass_ssl': get_config()['bypass_ssl'],
|
'bypass_ssl': get_config()['bypass_ssl'],
|
||||||
"file_logging": get_config()['file_logging'],
|
"file_logging": get_config()['file_logging'],
|
||||||
'default_ui': get_config()['default_ui'],
|
|
||||||
'component_policy': get_config()['component_policy'],
|
'component_policy': get_config()['component_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'],
|
'model_download_by_agent': get_config()['model_download_by_agent'],
|
||||||
'downgrade_blacklist': get_config()['downgrade_blacklist'],
|
'downgrade_blacklist': get_config()['downgrade_blacklist'],
|
||||||
'security_level': get_config()['security_level'],
|
'security_level': get_config()['security_level'],
|
||||||
'skip_migration_check': get_config()['skip_migration_check'],
|
'skip_migration_check': get_config()['skip_migration_check'],
|
||||||
|
'always_lazy_install': get_config()['always_lazy_install']
|
||||||
}
|
}
|
||||||
|
|
||||||
directory = os.path.dirname(manager_config_path)
|
directory = os.path.dirname(manager_config_path)
|
||||||
@@ -1581,36 +1585,45 @@ def read_config():
|
|||||||
else:
|
else:
|
||||||
security_level = default_conf['security_level'] if 'security_level' in default_conf else 'normal'
|
security_level = default_conf['security_level'] if 'security_level' in default_conf else 'normal'
|
||||||
|
|
||||||
|
manager_util.use_uv = default_conf['use_uv'].lower() == 'true' if 'use_uv' in default_conf else False
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
'http_channel_enabled': default_conf['http_channel_enabled'].lower() == 'true' if 'http_channel_enabled' in default_conf else False,
|
||||||
'preview_method': default_conf['preview_method'] if 'preview_method' in default_conf else manager_funcs.get_current_preview_method(),
|
'preview_method': default_conf['preview_method'] if 'preview_method' in default_conf else manager_funcs.get_current_preview_method(),
|
||||||
'git_exe': default_conf['git_exe'] if 'git_exe' in default_conf else '',
|
'git_exe': default_conf['git_exe'] if 'git_exe' in default_conf else '',
|
||||||
|
'use_uv': default_conf['use_uv'].lower() == 'true' if 'use_uv' in default_conf else False,
|
||||||
'channel_url': default_conf['channel_url'] if 'channel_url' in default_conf else DEFAULT_CHANNEL,
|
'channel_url': default_conf['channel_url'] if 'channel_url' in default_conf else DEFAULT_CHANNEL,
|
||||||
|
'default_cache_as_channel_url': default_conf['default_cache_as_channel_url'].lower() == 'true' if 'default_cache_as_channel_url' in default_conf else False,
|
||||||
'share_option': default_conf['share_option'] if 'share_option' in default_conf else 'all',
|
'share_option': default_conf['share_option'] if 'share_option' in default_conf else 'all',
|
||||||
'bypass_ssl': default_conf['bypass_ssl'].lower() == 'true' if 'bypass_ssl' in default_conf else False,
|
'bypass_ssl': default_conf['bypass_ssl'].lower() == 'true' if 'bypass_ssl' in default_conf else False,
|
||||||
'file_logging': default_conf['file_logging'].lower() == 'true' if 'file_logging' in default_conf else True,
|
'file_logging': default_conf['file_logging'].lower() == 'true' if 'file_logging' in default_conf else True,
|
||||||
'default_ui': default_conf['default_ui'] if 'default_ui' in default_conf else 'none',
|
|
||||||
'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',
|
||||||
'windows_selector_event_loop_policy': default_conf['windows_selector_event_loop_policy'].lower() == 'true' if 'windows_selector_event_loop_policy' in default_conf else False,
|
'windows_selector_event_loop_policy': default_conf['windows_selector_event_loop_policy'].lower() == 'true' if 'windows_selector_event_loop_policy' in default_conf else False,
|
||||||
'model_download_by_agent': default_conf['model_download_by_agent'].lower() == 'true' if 'model_download_by_agent' in default_conf else False,
|
'model_download_by_agent': default_conf['model_download_by_agent'].lower() == 'true' if 'model_download_by_agent' in default_conf else False,
|
||||||
'downgrade_blacklist': default_conf['downgrade_blacklist'] if 'downgrade_blacklist' in default_conf else '',
|
'downgrade_blacklist': default_conf['downgrade_blacklist'] if 'downgrade_blacklist' in default_conf else '',
|
||||||
'skip_migration_check': default_conf['skip_migration_check'].lower() == 'true' if 'skip_migration_check' in default_conf else False,
|
'skip_migration_check': default_conf['skip_migration_check'].lower() == 'true' if 'skip_migration_check' in default_conf else False,
|
||||||
'security_level': security_level
|
'always_lazy_install': default_conf['always_lazy_install'].lower() == 'true' if 'always_lazy_install' in default_conf else False,
|
||||||
|
'security_level': security_level,
|
||||||
}
|
}
|
||||||
|
|
||||||
except Exception:
|
except Exception:
|
||||||
|
manager_util.use_uv = False
|
||||||
return {
|
return {
|
||||||
|
'http_channel_enabled': False,
|
||||||
'preview_method': manager_funcs.get_current_preview_method(),
|
'preview_method': manager_funcs.get_current_preview_method(),
|
||||||
'git_exe': '',
|
'git_exe': '',
|
||||||
|
'use_uv': False,
|
||||||
'channel_url': DEFAULT_CHANNEL,
|
'channel_url': DEFAULT_CHANNEL,
|
||||||
|
'default_cache_as_channel_url': False,
|
||||||
'share_option': 'all',
|
'share_option': 'all',
|
||||||
'bypass_ssl': False,
|
'bypass_ssl': False,
|
||||||
'file_logging': True,
|
'file_logging': True,
|
||||||
'default_ui': 'none',
|
|
||||||
'component_policy': 'workflow',
|
'component_policy': 'workflow',
|
||||||
'windows_selector_event_loop_policy': False,
|
'windows_selector_event_loop_policy': False,
|
||||||
'model_download_by_agent': False,
|
'model_download_by_agent': False,
|
||||||
'downgrade_blacklist': '',
|
'downgrade_blacklist': '',
|
||||||
'skip_migration_check': False,
|
'skip_migration_check': False,
|
||||||
|
'always_lazy_install': False,
|
||||||
'security_level': 'normal',
|
'security_level': 'normal',
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1620,6 +1633,8 @@ def get_config():
|
|||||||
|
|
||||||
if cached_config is None:
|
if cached_config is None:
|
||||||
cached_config = read_config()
|
cached_config = read_config()
|
||||||
|
if cached_config['http_channel_enabled']:
|
||||||
|
print("[ComfyUI-Manager] Warning: http channel enabled, make sure server in secure env")
|
||||||
|
|
||||||
return cached_config
|
return cached_config
|
||||||
|
|
||||||
@@ -1668,7 +1683,9 @@ def switch_to_default_branch(repo):
|
|||||||
|
|
||||||
|
|
||||||
def try_install_script(url, repo_path, install_cmd, instant_execution=False):
|
def try_install_script(url, repo_path, install_cmd, instant_execution=False):
|
||||||
if not instant_execution and ((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 instant_execution and (
|
||||||
|
(len(install_cmd) > 0 and install_cmd[0].startswith('#')) or platform.system() == "Windows" or get_config()['always_lazy_install']
|
||||||
|
):
|
||||||
if not os.path.exists(manager_startup_script_path):
|
if not os.path.exists(manager_startup_script_path):
|
||||||
os.makedirs(manager_startup_script_path)
|
os.makedirs(manager_startup_script_path)
|
||||||
|
|
||||||
@@ -1683,6 +1700,10 @@ def try_install_script(url, repo_path, install_cmd, instant_execution=False):
|
|||||||
if is_blacklisted(install_cmd[4]):
|
if is_blacklisted(install_cmd[4]):
|
||||||
print(f"[ComfyUI-Manager] skip black listed pip installation: '{install_cmd[4]}'")
|
print(f"[ComfyUI-Manager] skip black listed pip installation: '{install_cmd[4]}'")
|
||||||
return True
|
return True
|
||||||
|
elif len(install_cmd) == 6 and install_cmd[3:5] == ['pip', 'install']: # uv mode
|
||||||
|
if is_blacklisted(install_cmd[5]):
|
||||||
|
print(f"[ComfyUI-Manager] skip black listed pip installation: '{install_cmd[5]}'")
|
||||||
|
return True
|
||||||
|
|
||||||
print(f"\n## ComfyUI-Manager: EXECUTE => {install_cmd}")
|
print(f"\n## ComfyUI-Manager: EXECUTE => {install_cmd}")
|
||||||
code = manager_funcs.run_script(install_cmd, cwd=repo_path)
|
code = manager_funcs.run_script(install_cmd, cwd=repo_path)
|
||||||
@@ -1799,9 +1820,9 @@ def execute_install_script(url, repo_path, lazy_mode=False, instant_execution=Fa
|
|||||||
if package_name and not package_name.startswith('#'):
|
if package_name and not package_name.startswith('#'):
|
||||||
if '--index-url' in package_name:
|
if '--index-url' in package_name:
|
||||||
s = package_name.split('--index-url')
|
s = package_name.split('--index-url')
|
||||||
install_cmd = [sys.executable, "-m", "pip", "install", s[0].strip(), '--index-url', s[1].strip()]
|
install_cmd = manager_util.make_pip_cmd(["install", s[0].strip(), '--index-url', s[1].strip()])
|
||||||
else:
|
else:
|
||||||
install_cmd = [sys.executable, "-m", "pip", "install", package_name]
|
install_cmd = manager_util.make_pip_cmd(["install", package_name])
|
||||||
|
|
||||||
if package_name.strip() != "" and not package_name.startswith('#'):
|
if package_name.strip() != "" and not package_name.startswith('#'):
|
||||||
try_install_script(url, repo_path, install_cmd, instant_execution=instant_execution)
|
try_install_script(url, repo_path, install_cmd, instant_execution=instant_execution)
|
||||||
@@ -2073,14 +2094,8 @@ async def get_data_by_mode(mode, filename, channel_url=None):
|
|||||||
cache_uri = str(manager_util.simple_hash(uri))+'_'+filename
|
cache_uri = str(manager_util.simple_hash(uri))+'_'+filename
|
||||||
cache_uri = os.path.join(manager_util.cache_dir, cache_uri)
|
cache_uri = os.path.join(manager_util.cache_dir, cache_uri)
|
||||||
|
|
||||||
if mode == "cache":
|
if mode == "cache" and manager_util.is_file_created_within_one_day(cache_uri):
|
||||||
if manager_util.is_file_created_within_one_day(cache_uri):
|
|
||||||
json_obj = await manager_util.get_data(cache_uri)
|
json_obj = await manager_util.get_data(cache_uri)
|
||||||
else:
|
|
||||||
json_obj = await manager_util.get_data(uri)
|
|
||||||
with manager_util.cache_lock:
|
|
||||||
with open(cache_uri, "w", encoding='utf-8') as file:
|
|
||||||
json.dump(json_obj, file, indent=4, sort_keys=True)
|
|
||||||
else:
|
else:
|
||||||
json_obj = await manager_util.get_data(uri)
|
json_obj = await manager_util.get_data(uri)
|
||||||
with manager_util.cache_lock:
|
with manager_util.cache_lock:
|
||||||
@@ -2122,7 +2137,7 @@ def gitclone_fix(files, instant_execution=False, no_deps=False):
|
|||||||
|
|
||||||
|
|
||||||
def pip_install(packages):
|
def pip_install(packages):
|
||||||
install_cmd = ['#FORCE', sys.executable, "-m", "pip", "install", '-U'] + packages
|
install_cmd = ['#FORCE'] + manager_util.make_pip_cmd(["install", '-U']) + packages
|
||||||
try_install_script('pip install via manager', '..', install_cmd)
|
try_install_script('pip install via manager', '..', install_cmd)
|
||||||
|
|
||||||
|
|
||||||
@@ -2419,7 +2434,8 @@ def check_state_of_git_node_pack_single(item, do_fetch=False, do_update_check=Tr
|
|||||||
|
|
||||||
def get_installed_pip_packages():
|
def get_installed_pip_packages():
|
||||||
# extract pip package infos
|
# extract pip package infos
|
||||||
pips = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'], text=True).split('\n')
|
cmd = manager_util.make_pip_cmd(['freeze'])
|
||||||
|
pips = subprocess.check_output(cmd, text=True).split('\n')
|
||||||
|
|
||||||
res = {}
|
res = {}
|
||||||
for x in pips:
|
for x in pips:
|
||||||
@@ -2835,15 +2851,18 @@ async def get_unified_total_nodes(channel, mode, regsitry_cache_mode='cache'):
|
|||||||
|
|
||||||
def populate_github_stats(node_packs, json_obj_github):
|
def populate_github_stats(node_packs, json_obj_github):
|
||||||
for k, v in node_packs.items():
|
for k, v in node_packs.items():
|
||||||
url = v['reference']
|
try:
|
||||||
if url in json_obj_github:
|
url = v['reference']
|
||||||
v['stars'] = json_obj_github[url]['stars']
|
if url in json_obj_github:
|
||||||
v['last_update'] = json_obj_github[url]['last_update']
|
v['stars'] = json_obj_github[url]['stars']
|
||||||
v['trust'] = json_obj_github[url]['author_account_age_days'] > 600
|
v['last_update'] = json_obj_github[url]['last_update']
|
||||||
else:
|
v['trust'] = json_obj_github[url]['author_account_age_days'] > 600
|
||||||
v['stars'] = -1
|
else:
|
||||||
v['last_update'] = -1
|
v['stars'] = -1
|
||||||
v['trust'] = False
|
v['last_update'] = -1
|
||||||
|
v['trust'] = False
|
||||||
|
except:
|
||||||
|
logging.error(f"[ComfyUI-Manager] DB item is broken:\n{v}")
|
||||||
|
|
||||||
|
|
||||||
def populate_favorites(node_packs, json_obj_extras):
|
def populate_favorites(node_packs, json_obj_extras):
|
||||||
|
|||||||
@@ -175,10 +175,6 @@ def set_preview_method(method):
|
|||||||
set_preview_method(core.get_config()['preview_method'])
|
set_preview_method(core.get_config()['preview_method'])
|
||||||
|
|
||||||
|
|
||||||
def set_default_ui_mode(mode):
|
|
||||||
core.get_config()['default_ui'] = mode
|
|
||||||
|
|
||||||
|
|
||||||
def set_component_policy(mode):
|
def set_component_policy(mode):
|
||||||
core.get_config()['component_policy'] = mode
|
core.get_config()['component_policy'] = mode
|
||||||
|
|
||||||
@@ -1374,17 +1370,6 @@ async def preview_method(request):
|
|||||||
return web.Response(status=200)
|
return web.Response(status=200)
|
||||||
|
|
||||||
|
|
||||||
@routes.get("/manager/default_ui")
|
|
||||||
async def default_ui_mode(request):
|
|
||||||
if "value" in request.rel_url.query:
|
|
||||||
set_default_ui_mode(request.rel_url.query['value'])
|
|
||||||
core.write_config()
|
|
||||||
else:
|
|
||||||
return web.Response(text=core.get_config()['default_ui'], status=200)
|
|
||||||
|
|
||||||
return web.Response(status=200)
|
|
||||||
|
|
||||||
|
|
||||||
@routes.get("/manager/component/policy")
|
@routes.get("/manager/component/policy")
|
||||||
async def component_policy(request):
|
async def component_policy(request):
|
||||||
if "value" in request.rel_url.query:
|
if "value" in request.rel_url.query:
|
||||||
@@ -1591,8 +1576,13 @@ cm_global.register_api('cm.try-install-custom-node', confirm_try_install)
|
|||||||
|
|
||||||
|
|
||||||
async def default_cache_update():
|
async def default_cache_update():
|
||||||
|
channel_url = core.get_config()['channel_url']
|
||||||
async def get_cache(filename):
|
async def get_cache(filename):
|
||||||
uri = f"{core.DEFAULT_CHANNEL}/{filename}"
|
if core.get_config()['default_cache_as_channel_url']:
|
||||||
|
uri = f"{channel_url}/{filename}"
|
||||||
|
else:
|
||||||
|
uri = f"{core.DEFAULT_CHANNEL}/{filename}"
|
||||||
|
|
||||||
cache_uri = str(manager_util.simple_hash(uri)) + '_' + filename
|
cache_uri = str(manager_util.simple_hash(uri)) + '_' + filename
|
||||||
cache_uri = os.path.join(manager_util.cache_dir, cache_uri)
|
cache_uri = os.path.join(manager_util.cache_dir, cache_uri)
|
||||||
|
|
||||||
@@ -1613,7 +1603,7 @@ async def default_cache_update():
|
|||||||
|
|
||||||
# load at least once
|
# load at least once
|
||||||
await core.unified_manager.reload('remote', dont_wait=False)
|
await core.unified_manager.reload('remote', dont_wait=False)
|
||||||
await core.unified_manager.get_custom_nodes('default', 'remote')
|
await core.unified_manager.get_custom_nodes(channel_url, 'remote')
|
||||||
|
|
||||||
logging.info("[ComfyUI-Manager] All startup tasks have been completed.")
|
logging.info("[ComfyUI-Manager] All startup tasks have been completed.")
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,14 @@ cache_lock = threading.Lock()
|
|||||||
comfyui_manager_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
|
comfyui_manager_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
|
||||||
cache_dir = os.path.join(comfyui_manager_path, '.cache') # This path is also updated together in **manager_core.update_user_directory**.
|
cache_dir = os.path.join(comfyui_manager_path, '.cache') # This path is also updated together in **manager_core.update_user_directory**.
|
||||||
|
|
||||||
|
use_uv = False
|
||||||
|
|
||||||
|
def make_pip_cmd(cmd):
|
||||||
|
if use_uv:
|
||||||
|
return [sys.executable, '-m', 'uv', 'pip'] + cmd
|
||||||
|
else:
|
||||||
|
return [sys.executable, '-m', 'pip'] + cmd
|
||||||
|
|
||||||
|
|
||||||
# DON'T USE StrictVersion - cannot handle pre_release version
|
# DON'T USE StrictVersion - cannot handle pre_release version
|
||||||
# try:
|
# try:
|
||||||
@@ -122,7 +130,12 @@ async def get_data(uri, silent=False):
|
|||||||
with open(uri, "r", encoding="utf-8") as f:
|
with open(uri, "r", encoding="utf-8") as f:
|
||||||
json_text = f.read()
|
json_text = f.read()
|
||||||
|
|
||||||
json_obj = json.loads(json_text)
|
try:
|
||||||
|
json_obj = json.loads(json_text)
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"[ComfyUI-Manager] An error occurred while fetching '{uri}': {e}")
|
||||||
|
|
||||||
|
return {}
|
||||||
|
|
||||||
if not silent:
|
if not silent:
|
||||||
print(" [DONE]")
|
print(" [DONE]")
|
||||||
@@ -209,7 +222,7 @@ def get_installed_packages(renew=False):
|
|||||||
|
|
||||||
if renew or pip_map is None:
|
if renew or pip_map is None:
|
||||||
try:
|
try:
|
||||||
result = subprocess.check_output([sys.executable, '-m', 'pip', 'list'], universal_newlines=True)
|
result = subprocess.check_output(make_pip_cmd(['list']), universal_newlines=True)
|
||||||
|
|
||||||
pip_map = {}
|
pip_map = {}
|
||||||
for line in result.split('\n'):
|
for line in result.split('\n'):
|
||||||
@@ -260,7 +273,7 @@ class PIPFixer:
|
|||||||
if len(spec) > 0:
|
if len(spec) > 0:
|
||||||
platform = spec[1]
|
platform = spec[1]
|
||||||
else:
|
else:
|
||||||
cmd = [sys.executable, '-m', 'pip', 'install', '--force', 'torch', 'torchvision', 'torchaudio']
|
cmd = make_pip_cmd(['install', '--force', 'torch', 'torchvision', 'torchaudio'])
|
||||||
subprocess.check_output(cmd, universal_newlines=True)
|
subprocess.check_output(cmd, universal_newlines=True)
|
||||||
logging.error(cmd)
|
logging.error(cmd)
|
||||||
return
|
return
|
||||||
@@ -270,15 +283,13 @@ class PIPFixer:
|
|||||||
torch_torchvision_torchaudio_ver = torch_torchvision_torchaudio_version_map.get(torch_ver)
|
torch_torchvision_torchaudio_ver = torch_torchvision_torchaudio_version_map.get(torch_ver)
|
||||||
|
|
||||||
if torch_torchvision_torchaudio_ver is None:
|
if torch_torchvision_torchaudio_ver is None:
|
||||||
cmd = [sys.executable, '-m', 'pip', 'install', '--pre',
|
cmd = make_pip_cmd(['install', '--pre', 'torch', 'torchvision', 'torchaudio',
|
||||||
'torch', 'torchvision', 'torchaudio',
|
'--index-url', f"https://download.pytorch.org/whl/nightly/{platform}"])
|
||||||
'--index-url', f"https://download.pytorch.org/whl/nightly/{platform}"]
|
|
||||||
logging.info("[ComfyUI-Manager] restore PyTorch to nightly version")
|
logging.info("[ComfyUI-Manager] restore PyTorch to nightly version")
|
||||||
else:
|
else:
|
||||||
torchvision_ver, torchaudio_ver = torch_torchvision_torchaudio_ver
|
torchvision_ver, torchaudio_ver = torch_torchvision_torchaudio_ver
|
||||||
cmd = [sys.executable, '-m', 'pip', 'install',
|
cmd = make_pip_cmd(['install', f'torch=={torch_ver}', f'torchvision=={torchvision_ver}', f"torchaudio=={torchaudio_ver}",
|
||||||
f'torch=={torch_ver}', f'torchvision=={torchvision_ver}', f"torchaudio=={torchaudio_ver}",
|
'--index-url', f"https://download.pytorch.org/whl/{platform}"])
|
||||||
'--index-url', f"https://download.pytorch.org/whl/{platform}"]
|
|
||||||
logging.info(f"[ComfyUI-Manager] restore PyTorch to {torch_ver}+{platform}")
|
logging.info(f"[ComfyUI-Manager] restore PyTorch to {torch_ver}+{platform}")
|
||||||
|
|
||||||
subprocess.check_output(cmd, universal_newlines=True)
|
subprocess.check_output(cmd, universal_newlines=True)
|
||||||
@@ -289,7 +300,7 @@ class PIPFixer:
|
|||||||
# remove `comfy` python package
|
# remove `comfy` python package
|
||||||
try:
|
try:
|
||||||
if 'comfy' in new_pip_versions:
|
if 'comfy' in new_pip_versions:
|
||||||
cmd = [sys.executable, '-m', 'pip', 'uninstall', 'comfy']
|
cmd = make_pip_cmd(['uninstall', 'comfy'])
|
||||||
subprocess.check_output(cmd, universal_newlines=True)
|
subprocess.check_output(cmd, universal_newlines=True)
|
||||||
|
|
||||||
logging.warning("[ComfyUI-Manager] 'comfy' python package is uninstalled.\nWARN: The 'comfy' package is completely unrelated to ComfyUI and should never be installed as it causes conflicts with ComfyUI.")
|
logging.warning("[ComfyUI-Manager] 'comfy' python package is uninstalled.\nWARN: The 'comfy' package is completely unrelated to ComfyUI and should never be installed as it causes conflicts with ComfyUI.")
|
||||||
@@ -335,7 +346,7 @@ class PIPFixer:
|
|||||||
|
|
||||||
if len(targets) > 0:
|
if len(targets) > 0:
|
||||||
for x in targets:
|
for x in targets:
|
||||||
cmd = [sys.executable, '-m', 'pip', 'install', f"{x}=={versions[0].version_string}"]
|
cmd = make_pip_cmd(['install', f"{x}=={versions[0].version_string}"])
|
||||||
subprocess.check_output(cmd, universal_newlines=True)
|
subprocess.check_output(cmd, universal_newlines=True)
|
||||||
|
|
||||||
logging.info(f"[ComfyUI-Manager] 'opencv' dependencies were fixed: {targets}")
|
logging.info(f"[ComfyUI-Manager] 'opencv' dependencies were fixed: {targets}")
|
||||||
@@ -348,7 +359,8 @@ class PIPFixer:
|
|||||||
np = new_pip_versions.get('numpy')
|
np = new_pip_versions.get('numpy')
|
||||||
if np is not None:
|
if np is not None:
|
||||||
if StrictVersion(np) >= StrictVersion('2'):
|
if StrictVersion(np) >= StrictVersion('2'):
|
||||||
subprocess.check_output([sys.executable, '-m', 'pip', 'install', "numpy<2"], universal_newlines=True)
|
cmd = make_pip_cmd(['install', "numpy<2"])
|
||||||
|
subprocess.check_output(cmd , universal_newlines=True)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error("[ComfyUI-Manager] Failed to restore numpy")
|
logging.error("[ComfyUI-Manager] Failed to restore numpy")
|
||||||
logging.error(e)
|
logging.error(e)
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ docStyle.innerHTML = `
|
|||||||
|
|
||||||
#cm-manager-dialog {
|
#cm-manager-dialog {
|
||||||
width: 1000px;
|
width: 1000px;
|
||||||
height: 520px;
|
height: 450px;
|
||||||
box-sizing: content-box;
|
box-sizing: content-box;
|
||||||
z-index: 1000;
|
z-index: 1000;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
@@ -137,7 +137,7 @@ docStyle.innerHTML = `
|
|||||||
|
|
||||||
.cm-notice-board {
|
.cm-notice-board {
|
||||||
width: 290px;
|
width: 290px;
|
||||||
height: 270px;
|
height: 210px;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
color: var(--input-text);
|
color: var(--input-text);
|
||||||
border: 1px solid var(--descrip-text);
|
border: 1px solid var(--descrip-text);
|
||||||
@@ -908,19 +908,6 @@ class ManagerMenuDialog extends ComfyDialog {
|
|||||||
switch_comfyui_button,
|
switch_comfyui_button,
|
||||||
fetch_updates_button,
|
fetch_updates_button,
|
||||||
|
|
||||||
$el("br", {}, []),
|
|
||||||
$el("button.cm-button", {
|
|
||||||
type: "button",
|
|
||||||
textContent: "Alternatives of A1111",
|
|
||||||
onclick:
|
|
||||||
() => {
|
|
||||||
if(!CustomNodesManager.instance) {
|
|
||||||
CustomNodesManager.instance = new CustomNodesManager(app, self);
|
|
||||||
}
|
|
||||||
CustomNodesManager.instance.show(CustomNodesManager.ShowMode.ALTERNATIVES);
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
|
|
||||||
$el("br", {}, []),
|
$el("br", {}, []),
|
||||||
$el("button.cm-button-red", {
|
$el("button.cm-button-red", {
|
||||||
type: "button",
|
type: "button",
|
||||||
@@ -1015,21 +1002,6 @@ class ManagerMenuDialog extends ComfyDialog {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// default ui state
|
|
||||||
let default_ui_combo = document.createElement("select");
|
|
||||||
default_ui_combo.setAttribute("title", "Set the default state to be displayed in the main menu when the browser starts.");
|
|
||||||
default_ui_combo.className = "cm-menu-combo";
|
|
||||||
default_ui_combo.appendChild($el('option', { value: 'none', text: 'Default UI: None' }, []));
|
|
||||||
default_ui_combo.appendChild($el('option', { value: 'history', text: 'Default UI: History' }, []));
|
|
||||||
default_ui_combo.appendChild($el('option', { value: 'queue', text: 'Default UI: Queue' }, []));
|
|
||||||
api.fetchApi('/manager/default_ui')
|
|
||||||
.then(response => response.text())
|
|
||||||
.then(data => { default_ui_combo.value = data; });
|
|
||||||
|
|
||||||
default_ui_combo.addEventListener('change', function (event) {
|
|
||||||
api.fetchApi(`/manager/default_ui?value=${event.target.value}`);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
// share
|
// share
|
||||||
let share_combo = document.createElement("select");
|
let share_combo = document.createElement("select");
|
||||||
@@ -1092,7 +1064,6 @@ class ManagerMenuDialog extends ComfyDialog {
|
|||||||
this.datasrc_combo,
|
this.datasrc_combo,
|
||||||
channel_combo,
|
channel_combo,
|
||||||
preview_combo,
|
preview_combo,
|
||||||
default_ui_combo,
|
|
||||||
share_combo,
|
share_combo,
|
||||||
component_policy_combo,
|
component_policy_combo,
|
||||||
$el("br", {}, []),
|
$el("br", {}, []),
|
||||||
@@ -1637,27 +1608,3 @@ app.registerExtension({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
async function set_default_ui()
|
|
||||||
{
|
|
||||||
let res = await api.fetchApi('/manager/default_ui');
|
|
||||||
if(res.status == 200) {
|
|
||||||
let mode = await res.text();
|
|
||||||
switch(mode) {
|
|
||||||
case 'history':
|
|
||||||
app.ui.queue.hide();
|
|
||||||
app.ui.history.show();
|
|
||||||
break;
|
|
||||||
case 'queue':
|
|
||||||
app.ui.queue.show();
|
|
||||||
app.ui.history.hide();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// do nothing
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
set_default_ui();
|
|
||||||
|
|||||||
@@ -400,6 +400,7 @@ export class CustomNodesManager {
|
|||||||
this.init();
|
this.init();
|
||||||
|
|
||||||
api.addEventListener("cm-queue-status", this.onQueueStatus);
|
api.addEventListener("cm-queue-status", this.onQueueStatus);
|
||||||
|
api.addEventListener('reconnected', this.onReconnected);
|
||||||
}
|
}
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
@@ -762,10 +763,9 @@ export class CustomNodesManager {
|
|||||||
|
|
||||||
".cn-manager-restart": {
|
".cn-manager-restart": {
|
||||||
click: () => {
|
click: () => {
|
||||||
if(rebootAPI()) {
|
this.close();
|
||||||
this.close();
|
this.manager_dialog.close();
|
||||||
this.manager_dialog.close();
|
rebootAPI();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -1385,19 +1385,14 @@ export class CustomNodesManager {
|
|||||||
|
|
||||||
this.install_context = {btn: btn, targets: target_items};
|
this.install_context = {btn: btn, targets: target_items};
|
||||||
|
|
||||||
for(let k in target_items) {
|
|
||||||
let item = this.install_context.targets[k];
|
|
||||||
this.grid.updateCell(item, "action");
|
|
||||||
}
|
|
||||||
|
|
||||||
if(errorMsg) {
|
if(errorMsg) {
|
||||||
this.showError(errorMsg);
|
this.showError(errorMsg);
|
||||||
show_message("Installation Error:\n"+errorMsg);
|
show_message("Installation Error:\n"+errorMsg);
|
||||||
|
|
||||||
// reset
|
// reset
|
||||||
for (const hash of list) {
|
for(let k in target_items) {
|
||||||
const item = this.grid.getRowItemBy("hash", hash);
|
let item = this.install_context.targets[k];
|
||||||
self.grid.updateCell(item, "action");
|
this.grid.updateCell(item, "action");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -1406,6 +1401,21 @@ export class CustomNodesManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async onReconnected(event) {
|
||||||
|
let self = CustomNodesManager.instance;
|
||||||
|
|
||||||
|
if(self.need_restart) {
|
||||||
|
self.need_restart = false;
|
||||||
|
|
||||||
|
const confirmed = await customConfirm("To apply the changes to the node pack's installation status, you need to refresh the browser. Would you like to refresh?");
|
||||||
|
if (!confirmed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
window.location.reload(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async onQueueStatus(event) {
|
async onQueueStatus(event) {
|
||||||
let self = CustomNodesManager.instance;
|
let self = CustomNodesManager.instance;
|
||||||
if(event.detail.status == 'in_progress' && event.detail.ui_target == 'nodepack_manager') {
|
if(event.detail.status == 'in_progress' && event.detail.ui_target == 'nodepack_manager') {
|
||||||
@@ -1446,7 +1456,7 @@ export class CustomNodesManager {
|
|||||||
let v = result[hash];
|
let v = result[hash];
|
||||||
|
|
||||||
if(v != 'success')
|
if(v != 'success')
|
||||||
errorMsg += v;
|
errorMsg += v+'\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
for(let k in self.install_context.targets) {
|
for(let k in self.install_context.targets) {
|
||||||
@@ -1879,6 +1889,7 @@ export class CustomNodesManager {
|
|||||||
|
|
||||||
showRestart() {
|
showRestart() {
|
||||||
this.element.querySelector(".cn-manager-restart").style.display = "block";
|
this.element.querySelector(".cn-manager-restart").style.display = "block";
|
||||||
|
this.need_restart = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
showStop() {
|
showStop() {
|
||||||
|
|||||||
@@ -738,7 +738,7 @@ export class ModelManager {
|
|||||||
let v = result[hash];
|
let v = result[hash];
|
||||||
|
|
||||||
if(v != 'success')
|
if(v != 'success')
|
||||||
errorMsg += v;
|
errorMsg += v + '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
for(let k in self.install_context.targets) {
|
for(let k in self.install_context.targets) {
|
||||||
|
|||||||
@@ -933,7 +933,8 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/IfnotFr/ComfyUI-Ifnot-Pack": [
|
"https://github.com/IfnotFr/ComfyUI-Ifnot-Pack": [
|
||||||
[
|
[
|
||||||
"Face Crop"
|
"Face Crop",
|
||||||
|
"Face Crop Mouth"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "ComfyUI-Ifnot-Pack"
|
"title_aux": "ComfyUI-Ifnot-Pack"
|
||||||
@@ -3515,6 +3516,7 @@
|
|||||||
"Hy3DSetMeshPBRAttributes",
|
"Hy3DSetMeshPBRAttributes",
|
||||||
"Hy3DSetMeshPBRTextures",
|
"Hy3DSetMeshPBRTextures",
|
||||||
"Hy3DTorchCompileSettings",
|
"Hy3DTorchCompileSettings",
|
||||||
|
"Hy3DUploadMesh",
|
||||||
"Hy3DVAEDecode"
|
"Hy3DVAEDecode"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
@@ -5003,6 +5005,7 @@
|
|||||||
"FixUTF8StringNode",
|
"FixUTF8StringNode",
|
||||||
"ImageResizeNode",
|
"ImageResizeNode",
|
||||||
"ImagesToVideoNode",
|
"ImagesToVideoNode",
|
||||||
|
"LoadImageFormURLNode",
|
||||||
"LoadImageFromFolderNode",
|
"LoadImageFromFolderNode",
|
||||||
"SaveImageToFolderNode",
|
"SaveImageToFolderNode",
|
||||||
"SaveImagesToFolderNode",
|
"SaveImagesToFolderNode",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -10,16 +10,17 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
"title": "A2V Multi Image Composite",
|
|
||||||
"author": "AiartvnTeam",
|
"author": "AiartvnTeam",
|
||||||
|
"title": "A2V Multi Image Composite",
|
||||||
"id": "Aiartvn",
|
"id": "Aiartvn",
|
||||||
"description": "Node for compositing multiple images with interactive preview and layer management",
|
"reference": "https://github.com/aiartvn/A2V_Multi_Image_Composite",
|
||||||
"repository": "https://github.com/aiartvn/A2V_Multi_Image_Composite",
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/aiartvn/A2V_Multi_Image_Composite"
|
"https://github.com/aiartvn/A2V_Multi_Image_Composite"
|
||||||
],
|
],
|
||||||
|
"description": "Node for compositing multiple images with interactive preview and layer management",
|
||||||
|
"install_type": "git-clone",
|
||||||
"tags": ["image", "composite", "layer", "blend", "transform"]
|
"tags": ["image", "composite", "layer", "blend", "transform"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -5854,6 +5854,7 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/MNeMoNiCuZ/ComfyUI-mnemic-nodes": [
|
"https://github.com/MNeMoNiCuZ/ComfyUI-mnemic-nodes": [
|
||||||
[
|
[
|
||||||
|
"LoraTagLoader",
|
||||||
"StringCleaning",
|
"StringCleaning",
|
||||||
"TiktokenTokenizer",
|
"TiktokenTokenizer",
|
||||||
"\u26d4 Generate Negative Prompt",
|
"\u26d4 Generate Negative Prompt",
|
||||||
@@ -5861,6 +5862,7 @@
|
|||||||
"\u2728\ud83d\udcac Groq LLM API",
|
"\u2728\ud83d\udcac Groq LLM API",
|
||||||
"\u2728\ud83d\udcdd Groq ALM API - Transcribe",
|
"\u2728\ud83d\udcdd Groq ALM API - Transcribe",
|
||||||
"\u2728\ud83d\udcf7 Groq VLM API",
|
"\u2728\ud83d\udcf7 Groq VLM API",
|
||||||
|
"\ud83c\udff7\ufe0f LoRA Loader Prompt Tags",
|
||||||
"\ud83d\udcbe Save Text File With Path",
|
"\ud83d\udcbe Save Text File With Path",
|
||||||
"\ud83d\udcc1 Get File Path",
|
"\ud83d\udcc1 Get File Path",
|
||||||
"\ud83d\udd20 Tiktoken Tokenizer Info",
|
"\ud83d\udd20 Tiktoken Tokenizer Info",
|
||||||
@@ -8478,6 +8480,7 @@
|
|||||||
"Star Face Loader",
|
"Star Face Loader",
|
||||||
"StarFiveWildcards",
|
"StarFiveWildcards",
|
||||||
"StarImageSwitch",
|
"StarImageSwitch",
|
||||||
|
"StarLatentSwitch",
|
||||||
"StarTextFilter",
|
"StarTextFilter",
|
||||||
"StarTextInput",
|
"StarTextInput",
|
||||||
"Starupscale"
|
"Starupscale"
|
||||||
@@ -20790,6 +20793,7 @@
|
|||||||
"Enhanced Random Light Source",
|
"Enhanced Random Light Source",
|
||||||
"Float Relay",
|
"Float Relay",
|
||||||
"HLFrequencyDetailRestore",
|
"HLFrequencyDetailRestore",
|
||||||
|
"Hex to Color",
|
||||||
"Image Add Alpha",
|
"Image Add Alpha",
|
||||||
"Image Frequency Analyzer",
|
"Image Frequency Analyzer",
|
||||||
"Image Relay",
|
"Image Relay",
|
||||||
|
|||||||
@@ -57,22 +57,6 @@ def is_import_failed_extension(name):
|
|||||||
return name in import_failed_extensions
|
return name in import_failed_extensions
|
||||||
|
|
||||||
|
|
||||||
def check_file_logging():
|
|
||||||
global enable_file_logging
|
|
||||||
try:
|
|
||||||
import configparser
|
|
||||||
config = configparser.ConfigParser()
|
|
||||||
config.read(manager_config_path)
|
|
||||||
default_conf = config['default']
|
|
||||||
|
|
||||||
if 'file_logging' in default_conf and default_conf['file_logging'].lower() == 'false':
|
|
||||||
enable_file_logging = False
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
check_file_logging()
|
|
||||||
|
|
||||||
comfy_path = os.environ.get('COMFYUI_PATH')
|
comfy_path = os.environ.get('COMFYUI_PATH')
|
||||||
comfy_base_path = os.environ.get('COMFYUI_FOLDERS_BASE_PATH')
|
comfy_base_path = os.environ.get('COMFYUI_FOLDERS_BASE_PATH')
|
||||||
|
|
||||||
@@ -103,6 +87,32 @@ manager_config_path = os.path.join(manager_files_path, 'config.ini')
|
|||||||
cm_cli_path = os.path.join(comfyui_manager_path, "cm-cli.py")
|
cm_cli_path = os.path.join(comfyui_manager_path, "cm-cli.py")
|
||||||
|
|
||||||
|
|
||||||
|
default_conf = {}
|
||||||
|
|
||||||
|
def read_config():
|
||||||
|
global default_conf
|
||||||
|
try:
|
||||||
|
import configparser
|
||||||
|
config = configparser.ConfigParser()
|
||||||
|
config.read(manager_config_path)
|
||||||
|
default_conf = config['default']
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def read_uv_mode():
|
||||||
|
if 'use_uv' in default_conf:
|
||||||
|
manager_util.use_uv = default_conf['use_uv'].lower() == 'true'
|
||||||
|
|
||||||
|
def check_file_logging():
|
||||||
|
global enable_file_logging
|
||||||
|
if 'file_logging' in default_conf and default_conf['file_logging'].lower() == 'false':
|
||||||
|
enable_file_logging = False
|
||||||
|
|
||||||
|
|
||||||
|
read_config()
|
||||||
|
read_uv_mode()
|
||||||
|
check_file_logging()
|
||||||
|
|
||||||
cm_global.pip_overrides = {'numpy': 'numpy<2', 'ultralytics': 'ultralytics==8.3.40'}
|
cm_global.pip_overrides = {'numpy': 'numpy<2', 'ultralytics': 'ultralytics==8.3.40'}
|
||||||
if os.path.exists(manager_pip_overrides_path):
|
if os.path.exists(manager_pip_overrides_path):
|
||||||
with open(manager_pip_overrides_path, 'r', encoding="UTF-8", errors="ignore") as json_file:
|
with open(manager_pip_overrides_path, 'r', encoding="UTF-8", errors="ignore") as json_file:
|
||||||
@@ -411,19 +421,20 @@ except Exception as e:
|
|||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import git # noqa: F401
|
import git # noqa: F401
|
||||||
import toml # noqa: F401
|
import toml # noqa: F401
|
||||||
|
import rich # noqa: F401
|
||||||
except ModuleNotFoundError:
|
except ModuleNotFoundError:
|
||||||
my_path = os.path.dirname(__file__)
|
my_path = os.path.dirname(__file__)
|
||||||
requirements_path = os.path.join(my_path, "requirements.txt")
|
requirements_path = os.path.join(my_path, "requirements.txt")
|
||||||
|
|
||||||
print("## ComfyUI-Manager: installing dependencies. (GitPython)")
|
print("## ComfyUI-Manager: installing dependencies. (GitPython)")
|
||||||
try:
|
try:
|
||||||
result = subprocess.check_output([sys.executable, '-s', '-m', 'pip', 'install', '-r', requirements_path])
|
result = subprocess.check_output(manager_util.make_pip_cmd(['install', '-r', requirements_path]))
|
||||||
except subprocess.CalledProcessError:
|
except subprocess.CalledProcessError:
|
||||||
print("## [ERROR] ComfyUI-Manager: Attempting to reinstall dependencies using an alternative method.")
|
print("## [ERROR] ComfyUI-Manager: Attempting to reinstall dependencies using an alternative method.")
|
||||||
try:
|
try:
|
||||||
result = subprocess.check_output([sys.executable, '-s', '-m', 'pip', 'install', '--user', '-r', requirements_path])
|
result = subprocess.check_output(manager_util.make_pip_cmd(['install', '--user', '-r', requirements_path]))
|
||||||
except subprocess.CalledProcessError:
|
except subprocess.CalledProcessError:
|
||||||
print("## [ERROR] ComfyUI-Manager: Failed to install the GitPython package in the correct Python environment. Please install it manually in the appropriate environment. (You can seek help at https://app.element.io/#/room/%23comfyui_space%3Amatrix.org)")
|
print("## [ERROR] ComfyUI-Manager: Failed to install the GitPython package in the correct Python environment. Please install it manually in the appropriate environment. (You can seek help at https://app.element.io/#/room/%23comfyui_space%3Amatrix.org)")
|
||||||
|
|
||||||
@@ -452,11 +463,6 @@ else:
|
|||||||
|
|
||||||
def read_downgrade_blacklist():
|
def read_downgrade_blacklist():
|
||||||
try:
|
try:
|
||||||
import configparser
|
|
||||||
config = configparser.ConfigParser()
|
|
||||||
config.read(manager_config_path)
|
|
||||||
default_conf = config['default']
|
|
||||||
|
|
||||||
if 'downgrade_blacklist' in default_conf:
|
if 'downgrade_blacklist' in default_conf:
|
||||||
items = default_conf['downgrade_blacklist'].split(',')
|
items = default_conf['downgrade_blacklist'].split(',')
|
||||||
items = [x.strip() for x in items if x != '']
|
items = [x.strip() for x in items if x != '']
|
||||||
@@ -471,19 +477,13 @@ read_downgrade_blacklist()
|
|||||||
|
|
||||||
def check_bypass_ssl():
|
def check_bypass_ssl():
|
||||||
try:
|
try:
|
||||||
import configparser
|
|
||||||
import ssl
|
import ssl
|
||||||
config = configparser.ConfigParser()
|
|
||||||
config.read(manager_config_path)
|
|
||||||
default_conf = config['default']
|
|
||||||
|
|
||||||
if 'bypass_ssl' in default_conf and default_conf['bypass_ssl'].lower() == 'true':
|
if 'bypass_ssl' in default_conf and default_conf['bypass_ssl'].lower() == 'true':
|
||||||
print(f"[ComfyUI-Manager] WARN: Unsafe - SSL verification bypass option is Enabled. (see {manager_config_path})")
|
print(f"[ComfyUI-Manager] WARN: Unsafe - SSL verification bypass option is Enabled. (see {manager_config_path})")
|
||||||
ssl._create_default_https_context = ssl._create_unverified_context # SSL certificate error fix.
|
ssl._create_default_https_context = ssl._create_unverified_context # SSL certificate error fix.
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
check_bypass_ssl()
|
check_bypass_ssl()
|
||||||
|
|
||||||
|
|
||||||
@@ -603,9 +603,9 @@ def execute_lazy_install_script(repo_path, executable):
|
|||||||
if package_name and not is_installed(package_name):
|
if package_name and not is_installed(package_name):
|
||||||
if '--index-url' in package_name:
|
if '--index-url' in package_name:
|
||||||
s = package_name.split('--index-url')
|
s = package_name.split('--index-url')
|
||||||
install_cmd = [sys.executable, "-m", "pip", "install", s[0].strip(), '--index-url', s[1].strip()]
|
install_cmd = manager_util.make_pip_cmd(["install", s[0].strip(), '--index-url', s[1].strip()])
|
||||||
else:
|
else:
|
||||||
install_cmd = [sys.executable, "-m", "pip", "install", package_name]
|
install_cmd = manager_util.make_pip_cmd(["install", package_name])
|
||||||
|
|
||||||
process_wrap(install_cmd, repo_path)
|
process_wrap(install_cmd, repo_path)
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "comfyui-manager"
|
name = "comfyui-manager"
|
||||||
description = "ComfyUI-Manager provides features to install and manage custom nodes for ComfyUI, as well as various functionalities to assist with ComfyUI."
|
description = "ComfyUI-Manager provides features to install and manage custom nodes for ComfyUI, as well as various functionalities to assist with ComfyUI."
|
||||||
version = "3.14"
|
version = "3.17.7"
|
||||||
license = { file = "LICENSE.txt" }
|
license = { file = "LICENSE.txt" }
|
||||||
dependencies = ["GitPython", "PyGithub", "matrix-client==0.4.0", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions"]
|
dependencies = ["GitPython", "PyGithub", "matrix-client==0.4.0", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions"]
|
||||||
|
|
||||||
|
|||||||
@@ -7,3 +7,4 @@ typer
|
|||||||
rich
|
rich
|
||||||
typing-extensions
|
typing-extensions
|
||||||
toml
|
toml
|
||||||
|
uv
|
||||||
|
|||||||
Reference in New Issue
Block a user