mirror of
https://github.com/Comfy-Org/ComfyUI-Manager.git
synced 2025-12-16 10:02:28 +08:00
fixed: robust initial caching
https://github.com/comfyanonymous/ComfyUI/issues/7003#issuecomment-2690687621 modified: store `db_mode` setting to `config.ini` https://github.com/ltdrdata/ComfyUI-Manager/issues/1582#issuecomment-2687332355 remove: fetch updates / skip updates - 'updates' filter will trigger fetching https://github.com/ltdrdata/ComfyUI-Manager/issues/1584 added: support for `disable_front` or `DISABLE_COMFYUI_MANAGER_FRONT`
This commit is contained in:
parent
0d487bc14f
commit
5a5a37dfee
@ -7,7 +7,10 @@ if not os.path.exists(cli_mode_flag):
|
|||||||
sys.path.append(os.path.join(os.path.dirname(__file__), "glob"))
|
sys.path.append(os.path.join(os.path.dirname(__file__), "glob"))
|
||||||
import manager_server # noqa: F401
|
import manager_server # noqa: F401
|
||||||
import share_3rdparty # noqa: F401
|
import share_3rdparty # noqa: F401
|
||||||
WEB_DIRECTORY = "js"
|
import cm_global
|
||||||
|
|
||||||
|
if not cm_global.disable_front and not 'DISABLE_COMFYUI_MANAGER_FRONT' in os.environ:
|
||||||
|
WEB_DIRECTORY = "js"
|
||||||
else:
|
else:
|
||||||
print("\n[ComfyUI-Manager] !! cli-only-mode is enabled !!\n")
|
print("\n[ComfyUI-Manager] !! cli-only-mode is enabled !!\n")
|
||||||
|
|
||||||
|
|||||||
@ -112,4 +112,6 @@ def add_on_revision_detected(k, f):
|
|||||||
variables['cm.on_revision_detected_handler'].append((k, f))
|
variables['cm.on_revision_detected_handler'].append((k, f))
|
||||||
|
|
||||||
|
|
||||||
error_dict = {}
|
error_dict = {}
|
||||||
|
|
||||||
|
disable_front = False
|
||||||
@ -42,7 +42,7 @@ import manager_downloader
|
|||||||
from node_package import InstalledNodePackage
|
from node_package import InstalledNodePackage
|
||||||
|
|
||||||
|
|
||||||
version_code = [3, 27, 2]
|
version_code = [3, 27, 3]
|
||||||
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 '')
|
||||||
|
|
||||||
|
|
||||||
@ -1614,7 +1614,8 @@ def write_config():
|
|||||||
'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'],
|
'always_lazy_install': get_config()['always_lazy_install'],
|
||||||
'network_mode': get_config()['network_mode']
|
'network_mode': get_config()['network_mode'],
|
||||||
|
'db_mode': get_config()['db_mode'],
|
||||||
}
|
}
|
||||||
|
|
||||||
directory = os.path.dirname(manager_config_path)
|
directory = os.path.dirname(manager_config_path)
|
||||||
@ -1654,6 +1655,7 @@ def read_config():
|
|||||||
'always_lazy_install': get_bool('always_lazy_install', False),
|
'always_lazy_install': get_bool('always_lazy_install', False),
|
||||||
'network_mode': default_conf.get('network_mode', 'public').lower(),
|
'network_mode': default_conf.get('network_mode', 'public').lower(),
|
||||||
'security_level': default_conf.get('security_level', 'normal').lower(),
|
'security_level': default_conf.get('security_level', 'normal').lower(),
|
||||||
|
'db_mode': default_conf.get('db_mode', 'cache').lower(),
|
||||||
}
|
}
|
||||||
|
|
||||||
except Exception:
|
except Exception:
|
||||||
@ -1677,6 +1679,7 @@ def read_config():
|
|||||||
'always_lazy_install': False,
|
'always_lazy_install': False,
|
||||||
'network_mode': 'public', # public | private | offline
|
'network_mode': 'public', # public | private | offline
|
||||||
'security_level': 'normal', # strong | normal | normal- | weak
|
'security_level': 'normal', # strong | normal | normal- | weak
|
||||||
|
'db_mode': 'cache', # local | cache | remote
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -190,6 +190,9 @@ def set_component_policy(mode):
|
|||||||
def set_update_policy(mode):
|
def set_update_policy(mode):
|
||||||
core.get_config()['update_policy'] = mode
|
core.get_config()['update_policy'] = mode
|
||||||
|
|
||||||
|
def set_db_mode(mode):
|
||||||
|
core.get_config()['db_mode'] = mode
|
||||||
|
|
||||||
def print_comfyui_version():
|
def print_comfyui_version():
|
||||||
global comfy_ui_hash
|
global comfy_ui_hash
|
||||||
global comfyui_tag
|
global comfyui_tag
|
||||||
@ -816,7 +819,7 @@ async def fetch_customnode_list(request):
|
|||||||
"""
|
"""
|
||||||
provide unified custom node list
|
provide unified custom node list
|
||||||
"""
|
"""
|
||||||
if "skip_update" in request.rel_url.query and request.rel_url.query["skip_update"] == "true":
|
if request.rel_url.query.get("skip_update", '').lower() == "true":
|
||||||
skip_update = True
|
skip_update = True
|
||||||
else:
|
else:
|
||||||
skip_update = False
|
skip_update = False
|
||||||
@ -833,7 +836,7 @@ async def fetch_customnode_list(request):
|
|||||||
core.populate_github_stats(node_packs, await json_obj_github)
|
core.populate_github_stats(node_packs, await json_obj_github)
|
||||||
core.populate_favorites(node_packs, await json_obj_extras)
|
core.populate_favorites(node_packs, await json_obj_extras)
|
||||||
|
|
||||||
check_state_of_git_node_pack(node_packs, False, do_update_check=not skip_update)
|
check_state_of_git_node_pack(node_packs, not skip_update, do_update_check=not skip_update)
|
||||||
|
|
||||||
for v in node_packs.values():
|
for v in node_packs.values():
|
||||||
populate_markdown(v)
|
populate_markdown(v)
|
||||||
@ -1455,6 +1458,18 @@ async def preview_method(request):
|
|||||||
return web.Response(status=200)
|
return web.Response(status=200)
|
||||||
|
|
||||||
|
|
||||||
|
@routes.get("/manager/db_mode")
|
||||||
|
async def db_mode(request):
|
||||||
|
if "value" in request.rel_url.query:
|
||||||
|
set_db_mode(request.rel_url.query['value'])
|
||||||
|
core.write_config()
|
||||||
|
else:
|
||||||
|
return web.Response(text=core.get_config()['db_mode'], status=200)
|
||||||
|
|
||||||
|
return web.Response(status=200)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@routes.get("/manager/policy/component")
|
@routes.get("/manager/policy/component")
|
||||||
async def component_policy(request):
|
async def component_policy(request):
|
||||||
if "value" in request.rel_url.query:
|
if "value" in request.rel_url.query:
|
||||||
@ -1681,20 +1696,23 @@ 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']
|
channel_url = core.get_config()['channel_url']
|
||||||
async def get_cache(filename):
|
async def get_cache(filename):
|
||||||
if core.get_config()['default_cache_as_channel_url']:
|
try:
|
||||||
uri = f"{channel_url}/{filename}"
|
if core.get_config()['default_cache_as_channel_url']:
|
||||||
else:
|
uri = f"{channel_url}/{filename}"
|
||||||
uri = f"{core.DEFAULT_CHANNEL}/{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)
|
||||||
|
|
||||||
json_obj = await manager_util.get_data(uri, True)
|
json_obj = await manager_util.get_data(uri, True)
|
||||||
|
|
||||||
with manager_util.cache_lock:
|
with manager_util.cache_lock:
|
||||||
with open(cache_uri, "w", encoding='utf-8') as file:
|
with open(cache_uri, "w", encoding='utf-8') as file:
|
||||||
json.dump(json_obj, file, indent=4, sort_keys=True)
|
json.dump(json_obj, file, indent=4, sort_keys=True)
|
||||||
logging.info(f"[ComfyUI-Manager] default cache updated: {uri}")
|
logging.info(f"[ComfyUI-Manager] default cache updated: {uri}")
|
||||||
|
except:
|
||||||
|
logging.error(f"[ComfyUI-Manager] Failed to initial fetching: {filename}")
|
||||||
|
|
||||||
if core.get_config()['network_mode'] != 'offline':
|
if core.get_config()['network_mode'] != 'offline':
|
||||||
a = get_cache("custom-node-list.json")
|
a = get_cache("custom-node-list.json")
|
||||||
|
|||||||
@ -227,7 +227,6 @@ document.head.appendChild(docStyle);
|
|||||||
|
|
||||||
var update_comfyui_button = null;
|
var update_comfyui_button = null;
|
||||||
var switch_comfyui_button = null;
|
var switch_comfyui_button = null;
|
||||||
var fetch_updates_button = null;
|
|
||||||
var update_all_button = null;
|
var update_all_button = null;
|
||||||
var restart_stop_button = null;
|
var restart_stop_button = null;
|
||||||
var update_policy_combo = null;
|
var update_policy_combo = null;
|
||||||
@ -653,57 +652,6 @@ async function switchComfyUI() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async function fetchUpdates(update_check_checkbox) {
|
|
||||||
let prev_text = fetch_updates_button.innerText;
|
|
||||||
fetch_updates_button.innerText = "Fetching updates...";
|
|
||||||
fetch_updates_button.disabled = true;
|
|
||||||
fetch_updates_button.style.backgroundColor = "gray";
|
|
||||||
|
|
||||||
try {
|
|
||||||
var mode = manager_instance.datasrc_combo.value;
|
|
||||||
|
|
||||||
const response = await api.fetchApi(`/customnode/fetch_updates?mode=${mode}`);
|
|
||||||
|
|
||||||
if (response.status != 200 && response.status != 201) {
|
|
||||||
show_message('Failed to fetch updates.');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (response.status == 201) {
|
|
||||||
show_message("There is an updated extension available.<BR><BR><P><B>NOTE:<BR>Fetch Updates is not an update.<BR>Please update from <button id='cm-install-customnodes-button'>Install Custom Nodes</button> </B></P>");
|
|
||||||
|
|
||||||
const button = document.getElementById('cm-install-customnodes-button');
|
|
||||||
button.addEventListener("click",
|
|
||||||
async function() {
|
|
||||||
app.ui.dialog.close();
|
|
||||||
|
|
||||||
if(!CustomNodesManager.instance) {
|
|
||||||
CustomNodesManager.instance = new CustomNodesManager(app, self);
|
|
||||||
}
|
|
||||||
await CustomNodesManager.instance.show(CustomNodesManager.ShowMode.UPDATE);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
update_check_checkbox.checked = false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
show_message('All extensions are already up-to-date with the latest versions.');
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (exception) {
|
|
||||||
show_message(`Failed to update custom nodes / ${exception}`);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
fetch_updates_button.disabled = false;
|
|
||||||
fetch_updates_button.innerText = prev_text;
|
|
||||||
fetch_updates_button.style.backgroundColor = "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function onQueueStatus(event) {
|
async function onQueueStatus(event) {
|
||||||
const isElectron = 'electronAPI' in window;
|
const isElectron = 'electronAPI' in window;
|
||||||
|
|
||||||
@ -816,8 +764,7 @@ async function onQueueStatus(event) {
|
|||||||
api.addEventListener("cm-queue-status", onQueueStatus);
|
api.addEventListener("cm-queue-status", onQueueStatus);
|
||||||
|
|
||||||
|
|
||||||
async function updateAll(update_comfyui, manager_dialog) {
|
async function updateAll(update_comfyui) {
|
||||||
let prev_text = update_all_button.innerText;
|
|
||||||
update_all_button.innerText = "Updating...";
|
update_all_button.innerText = "Updating...";
|
||||||
|
|
||||||
set_inprogress_mode();
|
set_inprogress_mode();
|
||||||
@ -900,14 +847,6 @@ class ManagerMenuDialog extends ComfyDialog {
|
|||||||
() => switchComfyUI()
|
() => switchComfyUI()
|
||||||
});
|
});
|
||||||
|
|
||||||
fetch_updates_button =
|
|
||||||
$el("button.cm-button", {
|
|
||||||
type: "button",
|
|
||||||
textContent: "Fetch Updates",
|
|
||||||
onclick:
|
|
||||||
() => fetchUpdates(this.update_check_checkbox)
|
|
||||||
});
|
|
||||||
|
|
||||||
restart_stop_button =
|
restart_stop_button =
|
||||||
$el("button.cm-button-red", {
|
$el("button.cm-button-red", {
|
||||||
type: "button",
|
type: "button",
|
||||||
@ -921,7 +860,7 @@ class ManagerMenuDialog extends ComfyDialog {
|
|||||||
type: "button",
|
type: "button",
|
||||||
textContent: "Update All Custom Nodes",
|
textContent: "Update All Custom Nodes",
|
||||||
onclick:
|
onclick:
|
||||||
() => updateAll(false, self)
|
() => updateAll(false)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -930,7 +869,7 @@ class ManagerMenuDialog extends ComfyDialog {
|
|||||||
type: "button",
|
type: "button",
|
||||||
textContent: "Update All",
|
textContent: "Update All",
|
||||||
onclick:
|
onclick:
|
||||||
() => updateAll(true, self)
|
() => updateAll(true)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1037,12 +976,6 @@ class ManagerMenuDialog extends ComfyDialog {
|
|||||||
|
|
||||||
let self = this;
|
let self = this;
|
||||||
|
|
||||||
this.update_check_checkbox = $el("input",{type:'checkbox', id:"skip_update_check"},[])
|
|
||||||
const uc_checkbox_text = $el("label",{for:"skip_update_check"},[" Skip update check"])
|
|
||||||
uc_checkbox_text.style.color = "var(--fg-color)";
|
|
||||||
uc_checkbox_text.style.cursor = "pointer";
|
|
||||||
this.update_check_checkbox.checked = true;
|
|
||||||
|
|
||||||
// db mode
|
// db mode
|
||||||
this.datasrc_combo = document.createElement("select");
|
this.datasrc_combo = document.createElement("select");
|
||||||
this.datasrc_combo.setAttribute("title", "Configure where to retrieve node/model information. If set to 'local,' the channel is ignored, and if set to 'channel (remote),' it fetches the latest information each time the list is opened.");
|
this.datasrc_combo.setAttribute("title", "Configure where to retrieve node/model information. If set to 'local,' the channel is ignored, and if set to 'channel (remote),' it fetches the latest information each time the list is opened.");
|
||||||
@ -1051,6 +984,14 @@ class ManagerMenuDialog extends ComfyDialog {
|
|||||||
this.datasrc_combo.appendChild($el('option', { value: 'local', text: 'DB: Local' }, []));
|
this.datasrc_combo.appendChild($el('option', { value: 'local', text: 'DB: Local' }, []));
|
||||||
this.datasrc_combo.appendChild($el('option', { value: 'remote', text: 'DB: Channel (remote)' }, []));
|
this.datasrc_combo.appendChild($el('option', { value: 'remote', text: 'DB: Channel (remote)' }, []));
|
||||||
|
|
||||||
|
api.fetchApi('/manager/db_mode')
|
||||||
|
.then(response => response.text())
|
||||||
|
.then(data => { this.datasrc_combo.value = data; });
|
||||||
|
|
||||||
|
this.datasrc_combo.addEventListener('change', function (event) {
|
||||||
|
api.fetchApi(`/manager/db_mode?value=${event.target.value}`);
|
||||||
|
});
|
||||||
|
|
||||||
// preview method
|
// preview method
|
||||||
let preview_combo = document.createElement("select");
|
let preview_combo = document.createElement("select");
|
||||||
preview_combo.setAttribute("title", "Configure how latent variables will be decoded during preview in the sampling process.");
|
preview_combo.setAttribute("title", "Configure how latent variables will be decoded during preview in the sampling process.");
|
||||||
@ -1170,7 +1111,6 @@ class ManagerMenuDialog extends ComfyDialog {
|
|||||||
});
|
});
|
||||||
|
|
||||||
return [
|
return [
|
||||||
$el("div", {}, [this.update_check_checkbox, uc_checkbox_text]),
|
|
||||||
$el("br", {}, []),
|
$el("br", {}, []),
|
||||||
this.datasrc_combo,
|
this.datasrc_combo,
|
||||||
channel_combo,
|
channel_combo,
|
||||||
|
|||||||
@ -676,7 +676,7 @@ export class CustomNodesManager {
|
|||||||
"invalid-installation": ["reinstall"],
|
"invalid-installation": ["reinstall"],
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!manager_instance.update_check_checkbox.checked) {
|
if (!installGroups.updatable) {
|
||||||
installGroups.enabled = installGroups.enabled.filter(it => it !== "try-update");
|
installGroups.enabled = installGroups.enabled.filter(it => it !== "try-update");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1809,11 +1809,16 @@ export class CustomNodesManager {
|
|||||||
this.showStatus(`Loading custom nodes (${mode}) ...`);
|
this.showStatus(`Loading custom nodes (${mode}) ...`);
|
||||||
|
|
||||||
const skip_update = this.show_mode === ShowMode.UPDATE ? "" : "&skip_update=true";
|
const skip_update = this.show_mode === ShowMode.UPDATE ? "" : "&skip_update=true";
|
||||||
|
|
||||||
|
if(this.show_mode === ShowMode.UPDATE) {
|
||||||
|
infoToast('Fetching updated information. This may take some time if many custom nodes are installed.');
|
||||||
|
}
|
||||||
|
|
||||||
const res = await fetchData(`/customnode/getlist?mode=${mode}${skip_update}`);
|
const res = await fetchData(`/customnode/getlist?mode=${mode}${skip_update}`);
|
||||||
if (res.error) {
|
if (res.error) {
|
||||||
this.showError("Failed to get custom node list.");
|
this.showError("Failed to get custom node list.");
|
||||||
this.hideLoading();
|
this.hideLoading();
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const { channel, node_packs } = res.data;
|
const { channel, node_packs } = res.data;
|
||||||
|
|||||||
@ -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.27.2"
|
version = "3.27.3"
|
||||||
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", "toml", "uv", "chardet"]
|
dependencies = ["GitPython", "PyGithub", "matrix-client==0.4.0", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions", "toml", "uv", "chardet"]
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user