Browse Source

feat: unload models

pull/294/head
dr.lt.data 11 months ago
parent
commit
c83fd0ed94
  1. 2
      __init__.py
  2. 13
      js/comfyui-manager.js
  3. 158
      js/common.js

2
__init__.py

@ -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})")

13
js/comfyui-manager.js vendored

@ -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 = [

158
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…
Cancel
Save