mirror of
https://github.com/Comfy-Org/ComfyUI-Manager.git
synced 2025-12-16 18:02:58 +08:00
feat: unload models
This commit is contained in:
parent
dc5b2f14af
commit
c83fd0ed94
@ -27,7 +27,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 = [1, 24]
|
version = [1, 25]
|
||||||
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})")
|
||||||
|
|
||||||
|
|||||||
@ -7,13 +7,13 @@ import { CustomNodesInstaller } from "./custom-nodes-downloader.js";
|
|||||||
import { AlternativesInstaller } from "./a1111-alter-downloader.js";
|
import { AlternativesInstaller } from "./a1111-alter-downloader.js";
|
||||||
import { SnapshotManager } from "./snapshot.js";
|
import { SnapshotManager } from "./snapshot.js";
|
||||||
import { ModelInstaller } from "./model-downloader.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');
|
var docStyle = document.createElement('style');
|
||||||
docStyle.innerHTML = `
|
docStyle.innerHTML = `
|
||||||
#cm-manager-dialog {
|
#cm-manager-dialog {
|
||||||
width: 1000px;
|
width: 1000px;
|
||||||
height: 450px;
|
height: 460px;
|
||||||
box-sizing: content-box;
|
box-sizing: content-box;
|
||||||
z-index: 10000;
|
z-index: 10000;
|
||||||
}
|
}
|
||||||
@ -66,7 +66,7 @@ docStyle.innerHTML = `
|
|||||||
.cm-notice-board {
|
.cm-notice-board {
|
||||||
width: 310px;
|
width: 310px;
|
||||||
padding: 0px !important;
|
padding: 0px !important;
|
||||||
height: 190px;
|
height: 250px;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
color: var(--input-text);
|
color: var(--input-text);
|
||||||
border: 1px solid var(--descrip-text);
|
border: 1px solid var(--descrip-text);
|
||||||
@ -812,10 +812,15 @@ class ManagerMenuDialog extends ComfyDialog {
|
|||||||
install_pip(url, self);
|
install_pip(url, self);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}),
|
||||||
|
$el("button.cm-experimental-button", {
|
||||||
|
type: "button",
|
||||||
|
textContent: "Unload models",
|
||||||
|
onclick: () => { free_models(); }
|
||||||
})
|
})
|
||||||
]),
|
]),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
createControlsRight() {
|
createControlsRight() {
|
||||||
const elts = [
|
const elts = [
|
||||||
|
|||||||
142
js/common.js
142
js/common.js
@ -2,7 +2,7 @@ import { app } from "../../scripts/app.js";
|
|||||||
import { api } from "../../scripts/api.js"
|
import { api } from "../../scripts/api.js"
|
||||||
|
|
||||||
export async function sleep(ms) {
|
export async function sleep(ms) {
|
||||||
return new Promise(resolve => setTimeout(resolve, ms));
|
return new Promise(resolve => setTimeout(resolve, ms));
|
||||||
}
|
}
|
||||||
|
|
||||||
export function rebootAPI() {
|
export function rebootAPI() {
|
||||||
@ -21,92 +21,92 @@ export function rebootAPI() {
|
|||||||
|
|
||||||
export async function install_checked_custom_node(grid_rows, target_i, caller, mode) {
|
export async function install_checked_custom_node(grid_rows, target_i, caller, mode) {
|
||||||
if(caller) {
|
if(caller) {
|
||||||
let failed = '';
|
let failed = '';
|
||||||
|
|
||||||
caller.disableButtons();
|
caller.disableButtons();
|
||||||
|
|
||||||
for(let i in grid_rows) {
|
for(let i in grid_rows) {
|
||||||
if(!grid_rows[i].checkbox.checked && i != target_i)
|
if(!grid_rows[i].checkbox.checked && i != target_i)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
var target;
|
var target;
|
||||||
|
|
||||||
if(grid_rows[i].data.custom_node) {
|
if(grid_rows[i].data.custom_node) {
|
||||||
target = grid_rows[i].data.custom_node;
|
target = grid_rows[i].data.custom_node;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
target = grid_rows[i].data;
|
target = grid_rows[i].data;
|
||||||
}
|
}
|
||||||
|
|
||||||
caller.startInstall(target);
|
caller.startInstall(target);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const response = await api.fetchApi(`/customnode/${mode}`, {
|
const response = await api.fetchApi(`/customnode/${mode}`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: { 'Content-Type': 'application/json' },
|
headers: { 'Content-Type': 'application/json' },
|
||||||
body: JSON.stringify(target)
|
body: JSON.stringify(target)
|
||||||
});
|
});
|
||||||
|
|
||||||
if(response.status == 400) {
|
if(response.status == 400) {
|
||||||
app.ui.dialog.show(`${mode} failed: ${target.title}`);
|
app.ui.dialog.show(`${mode} failed: ${target.title}`);
|
||||||
app.ui.dialog.element.style.zIndex = 10010;
|
app.ui.dialog.element.style.zIndex = 10010;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const status = await response.json();
|
const status = await response.json();
|
||||||
app.ui.dialog.close();
|
app.ui.dialog.close();
|
||||||
target.installed = 'True';
|
target.installed = 'True';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
catch(exception) {
|
catch(exception) {
|
||||||
failed += `<BR> ${target.title}`;
|
failed += `<BR> ${target.title}`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(failed != '') {
|
if(failed != '') {
|
||||||
app.ui.dialog.show(`${mode} failed: ${failed}`);
|
app.ui.dialog.show(`${mode} failed: ${failed}`);
|
||||||
app.ui.dialog.element.style.zIndex = 10010;
|
app.ui.dialog.element.style.zIndex = 10010;
|
||||||
}
|
}
|
||||||
|
|
||||||
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-button' class='cm-small-button'>RESTART</button> ComfyUI. And refresh browser.", 'cm-reboot-button');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export var manager_instance = null;
|
export var manager_instance = null;
|
||||||
|
|
||||||
export function setManagerInstance(obj) {
|
export function setManagerInstance(obj) {
|
||||||
manager_instance = obj;
|
manager_instance = obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
function isValidURL(url) {
|
function isValidURL(url) {
|
||||||
if(url.includes('&'))
|
if(url.includes('&'))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
const pattern = /^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$/;
|
const pattern = /^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$/;
|
||||||
return pattern.test(url);
|
return pattern.test(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function install_pip(packages) {
|
export async function install_pip(packages) {
|
||||||
if(packages.includes('&'))
|
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) {
|
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-button'><font size='3px'>RESTART</font></button> button in ComfyUI.`);
|
||||||
|
|
||||||
const rebootButton = document.getElementById('cm-reboot-button');
|
const rebootButton = document.getElementById('cm-reboot-button');
|
||||||
const self = this;
|
const self = this;
|
||||||
|
|
||||||
rebootButton.addEventListener("click", rebootAPI);
|
rebootButton.addEventListener("click", rebootAPI);
|
||||||
|
|
||||||
app.ui.dialog.element.style.zIndex = 10010;
|
app.ui.dialog.element.style.zIndex = 10010;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
app.ui.dialog.show(`Failed to install '${packages}'<BR>See terminal log.`);
|
app.ui.dialog.show(`Failed to install '${packages}'<BR>See terminal log.`);
|
||||||
app.ui.dialog.element.style.zIndex = 10010;
|
app.ui.dialog.element.style.zIndex = 10010;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function install_via_git_url(url, manager_dialog) {
|
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)) {
|
if(!isValidURL(url)) {
|
||||||
app.ui.dialog.show(`Invalid Git url '${url}'`);
|
app.ui.dialog.show(`Invalid Git url '${url}'`);
|
||||||
app.ui.dialog.element.style.zIndex = 10010;
|
app.ui.dialog.element.style.zIndex = 10010;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
app.ui.dialog.show(`Wait...<BR><BR>Installing '${url}'`);
|
app.ui.dialog.show(`Wait...<BR><BR>Installing '${url}'`);
|
||||||
app.ui.dialog.element.style.zIndex = 10010;
|
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) {
|
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-button'><font size='3px'>RESTART</font></button> ComfyUI.`);
|
||||||
|
|
||||||
const rebootButton = document.getElementById('cm-reboot-button');
|
const rebootButton = document.getElementById('cm-reboot-button');
|
||||||
const self = this;
|
const self = this;
|
||||||
@ -138,10 +138,26 @@ export async function install_via_git_url(url, manager_dialog) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
app.ui.dialog.element.style.zIndex = 10010;
|
app.ui.dialog.element.style.zIndex = 10010;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
app.ui.dialog.show(`Failed to install '${url}'<BR>See terminal log.`);
|
app.ui.dialog.show(`Failed to install '${url}'<BR>See terminal log.`);
|
||||||
app.ui.dialog.element.style.zIndex = 10010;
|
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.<BR><BR>Installed ComfyUI may be an outdated version.')
|
||||||
|
}
|
||||||
|
app.ui.dialog.element.style.zIndex = 10010;
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue
Block a user