Compare commits

...
7 Commits
14 changed files with 1448 additions and 1426 deletions
+1 -1
View File
@@ -256,7 +256,7 @@ The following settings are applied based on the section marked as `is_default`.
[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.>
channel_url = https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main
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.>
+1 -1
View File
@@ -5108,7 +5108,7 @@
"https://github.com/MNeMoNiCuZ/ComfyUI-mnemic-nodes"
],
"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",
+2
View File
@@ -5854,6 +5854,7 @@
],
"https://github.com/MNeMoNiCuZ/ComfyUI-mnemic-nodes": [
[
"LoraTagLoader",
"StringCleaning",
"TiktokenTokenizer",
"\u26d4 Generate Negative Prompt",
@@ -5861,6 +5862,7 @@
"\u2728\ud83d\udcac Groq LLM API",
"\u2728\ud83d\udcdd Groq ALM API - Transcribe",
"\u2728\ud83d\udcf7 Groq VLM API",
"\ud83c\udff7\ufe0f LoRA Loader Prompt Tags",
"\ud83d\udcbe Save Text File With Path",
"\ud83d\udcc1 Get File Path",
"\ud83d\udd20 Tiktoken Tokenizer Info",
+1155 -1155
View File
File diff suppressed because it is too large Load Diff
+4 -2
View File
@@ -42,7 +42,7 @@ import manager_downloader
from node_package import InstalledNodePackage
version_code = [3, 17]
version_code = [3, 17, 6]
version_str = f"V{version_code[0]}.{version_code[1]}" + (f'.{version_code[2]}' if len(version_code) > 2 else '')
@@ -1593,6 +1593,7 @@ def read_config():
'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,
'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',
'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,
@@ -1613,6 +1614,7 @@ def read_config():
'git_exe': '',
'use_uv': False,
'channel_url': DEFAULT_CHANNEL,
'default_cache_as_channel_url': False,
'share_option': 'all',
'bypass_ssl': False,
'file_logging': True,
@@ -2432,7 +2434,7 @@ def check_state_of_git_node_pack_single(item, do_fetch=False, do_update_check=Tr
def get_installed_pip_packages():
# extract pip package infos
cmd = manager_util.make_pip_cmd(['pip', 'freeze'])
cmd = manager_util.make_pip_cmd(['freeze'])
pips = subprocess.check_output(cmd, text=True).split('\n')
res = {}
+5 -1
View File
@@ -1578,7 +1578,11 @@ cm_global.register_api('cm.try-install-custom-node', confirm_try_install)
async def default_cache_update():
channel_url = core.get_config()['channel_url']
async def get_cache(filename):
uri = f"{channel_url}/{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 = os.path.join(manager_util.cache_dir, cache_uri)
+6 -1
View File
@@ -130,7 +130,12 @@ async def get_data(uri, silent=False):
with open(uri, "r", encoding="utf-8") as f:
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:
print(" [DONE]")
+23 -12
View File
@@ -400,6 +400,7 @@ export class CustomNodesManager {
this.init();
api.addEventListener("cm-queue-status", this.onQueueStatus);
api.addEventListener('reconnected', this.onReconnected);
}
init() {
@@ -762,10 +763,9 @@ export class CustomNodesManager {
".cn-manager-restart": {
click: () => {
if(rebootAPI()) {
this.close();
this.manager_dialog.close();
}
this.close();
this.manager_dialog.close();
rebootAPI();
}
},
@@ -1385,19 +1385,14 @@ export class CustomNodesManager {
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) {
this.showError(errorMsg);
show_message("Installation Error:\n"+errorMsg);
// reset
for (const hash of list) {
const item = this.grid.getRowItemBy("hash", hash);
self.grid.updateCell(item, "action");
for(let k in target_items) {
let item = this.install_context.targets[k];
this.grid.updateCell(item, "action");
}
}
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) {
let self = CustomNodesManager.instance;
if(event.detail.status == 'in_progress' && event.detail.ui_target == 'nodepack_manager') {
@@ -1879,6 +1889,7 @@ export class CustomNodesManager {
showRestart() {
this.element.querySelector(".cn-manager-restart").style.display = "block";
this.need_restart = true;
}
showStop() {
+3 -1
View File
@@ -933,7 +933,8 @@
],
"https://github.com/IfnotFr/ComfyUI-Ifnot-Pack": [
[
"Face Crop"
"Face Crop",
"Face Crop Mouth"
],
{
"title_aux": "ComfyUI-Ifnot-Pack"
@@ -3515,6 +3516,7 @@
"Hy3DSetMeshPBRAttributes",
"Hy3DSetMeshPBRTextures",
"Hy3DTorchCompileSettings",
"Hy3DUploadMesh",
"Hy3DVAEDecode"
],
{
File diff suppressed because it is too large Load Diff
+5 -4
View File
@@ -10,16 +10,17 @@
{
"title": "A2V Multi Image Composite",
"author": "AiartvnTeam",
"title": "A2V Multi Image Composite",
"id": "Aiartvn",
"description": "Node for compositing multiple images with interactive preview and layer management",
"repository": "https://github.com/aiartvn/A2V_Multi_Image_Composite",
"install_type": "git-clone",
"reference": "https://github.com/aiartvn/A2V_Multi_Image_Composite",
"files": [
"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"]
},
{
+2
View File
@@ -5854,6 +5854,7 @@
],
"https://github.com/MNeMoNiCuZ/ComfyUI-mnemic-nodes": [
[
"LoraTagLoader",
"StringCleaning",
"TiktokenTokenizer",
"\u26d4 Generate Negative Prompt",
@@ -5861,6 +5862,7 @@
"\u2728\ud83d\udcac Groq LLM API",
"\u2728\ud83d\udcdd Groq ALM API - Transcribe",
"\u2728\ud83d\udcf7 Groq VLM API",
"\ud83c\udff7\ufe0f LoRA Loader Prompt Tags",
"\ud83d\udcbe Save Text File With Path",
"\ud83d\udcc1 Get File Path",
"\ud83d\udd20 Tiktoken Tokenizer Info",
+15 -22
View File
@@ -57,22 +57,6 @@ def is_import_failed_extension(name):
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_base_path = os.environ.get('COMFYUI_FOLDERS_BASE_PATH')
@@ -107,19 +91,27 @@ default_conf = {}
def read_config():
global default_conf
import configparser
config = configparser.ConfigParser()
config.read(manager_config_path)
default_conf = config['default']
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']
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'}
if os.path.exists(manager_pip_overrides_path):
@@ -429,8 +421,9 @@ except Exception as e:
try:
import git # noqa: F401
import git # noqa: F401
import toml # noqa: F401
import rich # noqa: F401
except ModuleNotFoundError:
my_path = os.path.dirname(__file__)
requirements_path = os.path.join(my_path, "requirements.txt")
+1 -1
View File
@@ -1,7 +1,7 @@
[project]
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."
version = "3.17"
version = "3.17.6"
license = { file = "LICENSE.txt" }
dependencies = ["GitPython", "PyGithub", "matrix-client==0.4.0", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions"]