diff --git a/__init__.py b/__init__.py
index 31d39d1..b4ff868 100644
--- a/__init__.py
+++ b/__init__.py
@@ -27,7 +27,7 @@ except:
print(f"[WARN] ComfyUI-Manager: Your ComfyUI version is outdated. Please update to the latest version.")
-version = [1, 24]
+version = [1, 25]
version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '')
print(f"### Loading: ComfyUI-Manager ({version_str})")
diff --git a/js/comfyui-manager.js b/js/comfyui-manager.js
index 20ee133..aa4c4e4 100644
--- a/js/comfyui-manager.js
+++ b/js/comfyui-manager.js
@@ -7,13 +7,13 @@ import { CustomNodesInstaller } from "./custom-nodes-downloader.js";
import { AlternativesInstaller } from "./a1111-alter-downloader.js";
import { SnapshotManager } from "./snapshot.js";
import { ModelInstaller } from "./model-downloader.js";
-import { manager_instance, setManagerInstance, install_via_git_url, install_pip, rebootAPI } from "./common.js";
+import { manager_instance, setManagerInstance, install_via_git_url, install_pip, rebootAPI, free_models } from "./common.js";
var docStyle = document.createElement('style');
docStyle.innerHTML = `
#cm-manager-dialog {
width: 1000px;
- height: 450px;
+ height: 460px;
box-sizing: content-box;
z-index: 10000;
}
@@ -66,7 +66,7 @@ docStyle.innerHTML = `
.cm-notice-board {
width: 310px;
padding: 0px !important;
- height: 190px;
+ height: 250px;
overflow: auto;
color: var(--input-text);
border: 1px solid var(--descrip-text);
@@ -812,10 +812,15 @@ class ManagerMenuDialog extends ComfyDialog {
install_pip(url, self);
}
}
+ }),
+ $el("button.cm-experimental-button", {
+ type: "button",
+ textContent: "Unload models",
+ onclick: () => { free_models(); }
})
]),
];
- }
+}
createControlsRight() {
const elts = [
diff --git a/js/common.js b/js/common.js
index 4719517..f118e14 100644
--- a/js/common.js
+++ b/js/common.js
@@ -2,7 +2,7 @@ import { app } from "../../scripts/app.js";
import { api } from "../../scripts/api.js"
export async function sleep(ms) {
- return new Promise(resolve => setTimeout(resolve, ms));
+ return new Promise(resolve => setTimeout(resolve, ms));
}
export function rebootAPI() {
@@ -21,92 +21,92 @@ export function rebootAPI() {
export async function install_checked_custom_node(grid_rows, target_i, caller, mode) {
if(caller) {
- let failed = '';
-
- caller.disableButtons();
-
- for(let i in grid_rows) {
- if(!grid_rows[i].checkbox.checked && i != target_i)
- continue;
-
- var target;
-
- if(grid_rows[i].data.custom_node) {
- target = grid_rows[i].data.custom_node;
- }
- else {
- target = grid_rows[i].data;
- }
-
- caller.startInstall(target);
-
- try {
- const response = await api.fetchApi(`/customnode/${mode}`, {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify(target)
- });
-
- if(response.status == 400) {
- app.ui.dialog.show(`${mode} failed: ${target.title}`);
- app.ui.dialog.element.style.zIndex = 10010;
- continue;
- }
-
- const status = await response.json();
- app.ui.dialog.close();
- target.installed = 'True';
- continue;
- }
- catch(exception) {
- failed += `
${target.title}`;
- }
+ let failed = '';
+
+ caller.disableButtons();
+
+ for(let i in grid_rows) {
+ if(!grid_rows[i].checkbox.checked && i != target_i)
+ continue;
+
+ var target;
+
+ if(grid_rows[i].data.custom_node) {
+ target = grid_rows[i].data.custom_node;
+ }
+ else {
+ target = grid_rows[i].data;
+ }
+
+ caller.startInstall(target);
+
+ try {
+ const response = await api.fetchApi(`/customnode/${mode}`, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify(target)
+ });
+
+ if(response.status == 400) {
+ app.ui.dialog.show(`${mode} failed: ${target.title}`);
+ app.ui.dialog.element.style.zIndex = 10010;
+ continue;
+ }
+
+ const status = await response.json();
+ app.ui.dialog.close();
+ target.installed = 'True';
+ continue;
+ }
+ catch(exception) {
+ failed += `
${target.title}`;
+ }
}
if(failed != '') {
- app.ui.dialog.show(`${mode} failed: ${failed}`);
- app.ui.dialog.element.style.zIndex = 10010;
+ app.ui.dialog.show(`${mode} failed: ${failed}`);
+ app.ui.dialog.element.style.zIndex = 10010;
}
- await caller.invalidateControl();
- caller.updateMessage("
To apply the installed/updated/disabled/enabled custom node, please ComfyUI. And refresh browser.", 'cm-reboot-button');
+ await caller.invalidateControl();
+ caller.updateMessage("
To apply the installed/updated/disabled/enabled custom node, please ComfyUI. And refresh browser.", 'cm-reboot-button');
}
};
export var manager_instance = null;
export function setManagerInstance(obj) {
- manager_instance = obj;
+ manager_instance = obj;
}
function isValidURL(url) {
if(url.includes('&'))
return false;
- const pattern = /^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$/;
- return pattern.test(url);
+ const pattern = /^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$/;
+ return pattern.test(url);
}
export async function install_pip(packages) {
if(packages.includes('&'))
- app.ui.dialog.show(`Invalid PIP package enumeration: '${packages}'`);
+ app.ui.dialog.show(`Invalid PIP package enumeration: '${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) {
- app.ui.dialog.show(`PIP package installation is processed.
To apply the pip packages, please click the button in ComfyUI.`);
+ if(res.status == 200) {
+ app.ui.dialog.show(`PIP package installation is processed.
To apply the pip packages, please click the button in ComfyUI.`);
const rebootButton = document.getElementById('cm-reboot-button');
const self = this;
rebootButton.addEventListener("click", rebootAPI);
- app.ui.dialog.element.style.zIndex = 10010;
- }
- else {
- app.ui.dialog.show(`Failed to install '${packages}'
See terminal log.`);
- app.ui.dialog.element.style.zIndex = 10010;
- }
+ app.ui.dialog.element.style.zIndex = 10010;
+ }
+ else {
+ app.ui.dialog.show(`Failed to install '${packages}'
See terminal log.`);
+ app.ui.dialog.element.style.zIndex = 10010;
+ }
}
export async function install_via_git_url(url, manager_dialog) {
@@ -115,18 +115,18 @@ export async function install_via_git_url(url, manager_dialog) {
}
if(!isValidURL(url)) {
- app.ui.dialog.show(`Invalid Git url '${url}'`);
- app.ui.dialog.element.style.zIndex = 10010;
+ app.ui.dialog.show(`Invalid Git url '${url}'`);
+ app.ui.dialog.element.style.zIndex = 10010;
return;
}
- app.ui.dialog.show(`Wait...
Installing '${url}'`);
- app.ui.dialog.element.style.zIndex = 10010;
+ app.ui.dialog.show(`Wait...
Installing '${url}'`);
+ app.ui.dialog.element.style.zIndex = 10010;
- 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) {
- app.ui.dialog.show(`'${url}' is installed
To apply the installed custom node, please ComfyUI.`);
+ if(res.status == 200) {
+ app.ui.dialog.show(`'${url}' is installed
To apply the installed custom node, please ComfyUI.`);
const rebootButton = document.getElementById('cm-reboot-button');
const self = this;
@@ -138,10 +138,26 @@ export async function install_via_git_url(url, manager_dialog) {
}
});
- app.ui.dialog.element.style.zIndex = 10010;
- }
- else {
- app.ui.dialog.show(`Failed to install '${url}'
See terminal log.`);
- app.ui.dialog.element.style.zIndex = 10010;
- }
+ app.ui.dialog.element.style.zIndex = 10010;
+ }
+ else {
+ app.ui.dialog.show(`Failed to install '${url}'
See terminal log.`);
+ app.ui.dialog.element.style.zIndex = 10010;
+ }
+}
+
+export async function free_models() {
+ let res = await api.fetchApi(`/free`, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: '{}'
+ });
+
+ if(res.status == 200) {
+ app.ui.dialog.show('Models have been unloaded.')
+ }
+ else {
+ app.ui.dialog.show('Unloading of models failed.
Installed ComfyUI may be an outdated version.')
+ }
+ app.ui.dialog.element.style.zIndex = 10010;
}
\ No newline at end of file