98 lines
3.2 KiB
JavaScript
98 lines
3.2 KiB
JavaScript
import { app } from "../../../scripts/app.js";
|
|
|
|
const EXTENSION_NAME = "lls.ksampler.compat";
|
|
const TARGET_NODE_CLASS = "LLSSimpleKSampler";
|
|
const TARGET_NODE_DISPLAY_NAME = "LLS Simple KSampler";
|
|
const DENOISE_MODE_INDEX = 11;
|
|
const ADAPTER_MODE_INDEX = 12;
|
|
const FLUX_GUIDANCE_INDEX = 13;
|
|
const MODEL_FAMILY_INDEX = 14;
|
|
const DENOISE_MODES = new Set(["manual", "auto_from_repair"]);
|
|
const ADAPTER_MODES = new Set(["auto", "sd_classic", "flux", "sd3", "qwen", "zimage"]);
|
|
|
|
function normalizeText(value) {
|
|
if (typeof value === "string") {
|
|
return value.trim();
|
|
}
|
|
if (value === null || value === undefined) {
|
|
return "";
|
|
}
|
|
return String(value).trim();
|
|
}
|
|
|
|
function isNumericLike(value) {
|
|
if (typeof value === "number") {
|
|
return Number.isFinite(value);
|
|
}
|
|
const text = normalizeText(value);
|
|
if (!text) {
|
|
return false;
|
|
}
|
|
return Number.isFinite(Number(text));
|
|
}
|
|
|
|
function looksLikeShiftedWidgetOrder(values) {
|
|
if (!Array.isArray(values) || values.length <= MODEL_FAMILY_INDEX) {
|
|
return false;
|
|
}
|
|
|
|
const denoiseMode = normalizeText(values[DENOISE_MODE_INDEX]);
|
|
const adapterMode = normalizeText(values[ADAPTER_MODE_INDEX]).toLowerCase();
|
|
const fluxGuidance = normalizeText(values[FLUX_GUIDANCE_INDEX]);
|
|
const modelFamily = normalizeText(values[MODEL_FAMILY_INDEX]).toLowerCase();
|
|
|
|
return (
|
|
!DENOISE_MODES.has(denoiseMode) &&
|
|
DENOISE_MODES.has(fluxGuidance) &&
|
|
ADAPTER_MODES.has(modelFamily) &&
|
|
!ADAPTER_MODES.has(adapterMode) &&
|
|
(isNumericLike(values[DENOISE_MODE_INDEX]) || denoiseMode === "")
|
|
);
|
|
}
|
|
|
|
function migrateWidgetValues(values) {
|
|
if (!Array.isArray(values) || values.length <= MODEL_FAMILY_INDEX) {
|
|
return values;
|
|
}
|
|
|
|
const migrated = values.slice();
|
|
if (looksLikeShiftedWidgetOrder(migrated)) {
|
|
const shiftedDenoiseMode = migrated[DENOISE_MODE_INDEX];
|
|
const shiftedAdapterMode = migrated[ADAPTER_MODE_INDEX];
|
|
const shiftedFluxGuidance = migrated[FLUX_GUIDANCE_INDEX];
|
|
const shiftedModelFamily = migrated[MODEL_FAMILY_INDEX];
|
|
|
|
migrated[DENOISE_MODE_INDEX] = normalizeText(shiftedFluxGuidance) || "manual";
|
|
migrated[ADAPTER_MODE_INDEX] = normalizeText(shiftedModelFamily).toLowerCase() || "auto";
|
|
migrated[FLUX_GUIDANCE_INDEX] = shiftedDenoiseMode;
|
|
migrated[MODEL_FAMILY_INDEX] =
|
|
normalizeText(shiftedAdapterMode).toLowerCase() === "auto" ? "Auto" : shiftedAdapterMode;
|
|
return migrated;
|
|
}
|
|
|
|
if (normalizeText(migrated[ADAPTER_MODE_INDEX]) === "Auto") {
|
|
migrated[ADAPTER_MODE_INDEX] = "auto";
|
|
}
|
|
if (normalizeText(migrated[MODEL_FAMILY_INDEX]) === "auto") {
|
|
migrated[MODEL_FAMILY_INDEX] = "Auto";
|
|
}
|
|
return migrated;
|
|
}
|
|
|
|
app.registerExtension({
|
|
name: EXTENSION_NAME,
|
|
async beforeRegisterNodeDef(nodeType, nodeData) {
|
|
if (nodeData.name !== TARGET_NODE_CLASS && nodeData.display_name !== TARGET_NODE_DISPLAY_NAME) {
|
|
return;
|
|
}
|
|
|
|
const previousConfigure = nodeType.prototype.configure;
|
|
nodeType.prototype.configure = function configureLLSKSamplerCompat(info) {
|
|
if (info && Array.isArray(info.widgets_values)) {
|
|
info.widgets_values = migrateWidgetValues(info.widgets_values);
|
|
}
|
|
return previousConfigure?.apply(this, arguments);
|
|
};
|
|
},
|
|
});
|