Files
ycyy-ComfyUI-YCYY-API/web/js/modelscope_image.js
T

61 lines
2.6 KiB
JavaScript

import { app } from "../../scripts/app.js";
import { api } from "../../scripts/api.js";
const NODE_CLASS = "YCYY_ModelScope_Image_API";
let apiMap = new Map();
async function loadApis() {
try {
const response = await api.fetchApi("/ycyy/modelscope-image/apis/all");
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const data = await response.json();
apiMap = new Map((Array.isArray(data) ? data : []).map(item => [item["api-name"], item]));
} catch (error) {
console.error("[YCYY] Failed to load ModelScope Image API list:", error);
}
}
function applyModels(node, apiName, keepModel = false) {
const selected = apiMap.get(apiName);
const modelWidget = node.widgets?.find(widget => widget.name === "model");
if (!selected || !modelWidget) return;
const models = Array.isArray(selected.models) ? selected.models : [];
modelWidget.options.values = models;
if (!keepModel || !models.includes(modelWidget.value)) modelWidget.value = models[0] ?? "";
app.canvas?.draw(true, true);
}
app.registerExtension({
name: "YCYY.ModelScope.Image",
async setup() { await loadApis(); },
async beforeRegisterNodeDef(nodeType) {
if (nodeType.comfyClass !== NODE_CLASS) return;
const originalCreated = nodeType.prototype.onNodeCreated;
nodeType.prototype.onNodeCreated = function () {
const result = originalCreated?.apply(this, arguments);
const apiWidget = this.widgets?.find(widget => widget.name === "api_name");
if (apiWidget) {
const originalCallback = apiWidget.callback;
apiWidget.callback = value => {
applyModels(this, value);
originalCallback?.call(this, value);
};
setTimeout(() => applyModels(this, apiWidget.value, true), 0);
}
return result;
};
const originalConfigure = nodeType.prototype.onConfigure;
nodeType.prototype.onConfigure = function () {
const result = originalConfigure?.apply(this, arguments);
const apiWidget = this.widgets?.find(widget => widget.name === "api_name");
if (apiWidget && apiMap.size && !apiMap.has(apiWidget.value)) {
const fallback = apiMap.keys().next().value;
console.warn(`[YCYY] ModelScope Image API "${apiWidget.value}" no longer exists; using "${fallback}"`);
apiWidget.value = fallback;
}
if (apiWidget) applyModels(this, apiWidget.value, true);
return result;
};
},
});