add workflows, etc
This commit is contained in:
+6
-1
@@ -1,6 +1,6 @@
|
||||
import { app } from "../../scripts/app.js";
|
||||
import { api } from "../../scripts/api.js";
|
||||
import { promptEnhanceHandler, syncDimensionsNodeHandler, searchNodeHandler, APIKeyHandler, captionNodeHandler, mediaUUIDHandler, save3DFilepathHandler, videoTranscriptionHandler, videoOutputsHandler, handleCustomErrors, videoInferenceDimensionsHandler, videoModelSearchFilterHandler, audioModelSearchFilterHandler, useParameterToggleHandler, imageInferenceToggleHandler, upscalerToggleHandler, videoUpscalerToggleHandler, audioInferenceToggleHandler, audioInferenceSpeechToggleHandler, audioSettingsToggleHandler, acceleratorOptionsToggleHandler, bytedanceProviderSettingsToggleHandler, xaiProviderSettingsToggleHandler, viduProviderSettingsToggleHandler, sourcefulProviderSettingsToggleHandler, sourcefulProviderSettingsFontsToggleHandler, threeDInferenceToggleHandler, threeDInferenceSettingsToggleHandler, threeDInferenceSettingsLatToggleHandler, ultralyticsProviderSettingsToggleHandler, openaiProviderSettingsToggleHandler, lightricksProviderSettingsToggleHandler, klingProviderSettingsToggleHandler, lumaProviderSettingsToggleHandler, briaProviderSettingsToggleHandler, pixverseProviderSettingsToggleHandler, alibabaProviderSettingsToggleHandler, mireloProviderSettingsToggleHandler, googleProviderSettingsToggleHandler, syncProviderSettingsToggleHandler, syncSegmentToggleHandler, settingsToggleHandler, audioInputToggleHandler, speechInputToggleHandler, briaProviderMaskToggleHandler, wanAnimateAdvancedFeatureSettingsToggleHandler, videoAdvancedFeatureInputsToggleHandler, audioInferenceInputsToggleHandler } from "./utils.js";
|
||||
import { promptEnhanceHandler, syncDimensionsNodeHandler, searchNodeHandler, APIKeyHandler, captionNodeHandler, mediaUUIDHandler, save3DFilepathHandler, videoTranscriptionHandler, videoOutputsHandler, handleCustomErrors, videoInferenceDimensionsHandler, videoModelSearchFilterHandler, audioModelSearchFilterHandler, vectorizeModelSearchFilterHandler, vectorizeToggleHandler, useParameterToggleHandler, imageInferenceToggleHandler, upscalerToggleHandler, videoUpscalerToggleHandler, audioInferenceToggleHandler, audioInferenceSpeechToggleHandler, audioSettingsToggleHandler, videoSettingsToggleHandler, acceleratorOptionsToggleHandler, bytedanceProviderSettingsToggleHandler, xaiProviderSettingsToggleHandler, viduProviderSettingsToggleHandler, sourcefulProviderSettingsToggleHandler, sourcefulProviderSettingsFontsToggleHandler, threeDInferenceToggleHandler, threeDInferenceSettingsToggleHandler, threeDInferenceSettingsLatToggleHandler, ultralyticsProviderSettingsToggleHandler, openaiProviderSettingsToggleHandler, lightricksProviderSettingsToggleHandler, klingProviderSettingsToggleHandler, lumaProviderSettingsToggleHandler, briaProviderSettingsToggleHandler, pixverseProviderSettingsToggleHandler, alibabaProviderSettingsToggleHandler, mireloProviderSettingsToggleHandler, googleProviderSettingsToggleHandler, syncProviderSettingsToggleHandler, syncSegmentToggleHandler, settingsToggleHandler, audioInputToggleHandler, speechInputToggleHandler, briaProviderMaskToggleHandler, wanAnimateAdvancedFeatureSettingsToggleHandler, videoAdvancedFeatureInputsToggleHandler, audioInferenceInputsToggleHandler } from "./utils.js";
|
||||
import { RUNWARE_NODE_TYPES, RUNWARE_NODE_PROPS, SEARCH_TERMS } from "./types.js";
|
||||
|
||||
const nodeInitList = [];
|
||||
@@ -82,6 +82,8 @@ app.registerExtension({
|
||||
audioInferenceSpeechToggleHandler(node);
|
||||
} else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOSETTINGS) {
|
||||
audioSettingsToggleHandler(node);
|
||||
} else if(nodeClass === RUNWARE_NODE_TYPES.VIDEOSETTINGS) {
|
||||
videoSettingsToggleHandler(node);
|
||||
} else if(nodeClass === RUNWARE_NODE_TYPES.ACCELERATOROPTIONS) {
|
||||
acceleratorOptionsToggleHandler(node);
|
||||
} else if(nodeClass === RUNWARE_NODE_TYPES.BYTEDANCEPROVIDERSETTINGS) {
|
||||
@@ -149,6 +151,9 @@ app.registerExtension({
|
||||
videoModelSearchFilterHandler(node);
|
||||
} else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOMODELSEARCH) {
|
||||
audioModelSearchFilterHandler(node);
|
||||
} else if(nodeClass === RUNWARE_NODE_TYPES.VECTORIZE) {
|
||||
vectorizeModelSearchFilterHandler(node);
|
||||
vectorizeToggleHandler(node);
|
||||
}
|
||||
|
||||
for(const nodeWidget of nodeWidgets) {
|
||||
|
||||
@@ -101,6 +101,7 @@ const RUNWARE_NODE_TYPES = {
|
||||
REFERENCEVIDEOS: "Runware Reference Videos",
|
||||
REFERENCEVOICES: "Runware Reference Voices",
|
||||
VIDEOINFERENCEINPUTS: "Runware Video Inference Inputs",
|
||||
VIDEOSETTINGS: "Runware Video Inference Settings",
|
||||
LIGHTRICKSPROVIDERSETTINGS: "Runware Lightricks Provider Settings",
|
||||
KLINGPROVIDERSETTINGS: "Runware KlingAI Provider Settings",
|
||||
KLINGMULTIPROMPTSEGMENT: "Runware Kling MultiPrompt Segment",
|
||||
@@ -427,6 +428,7 @@ const RUNWARE_NODE_PROPS = {
|
||||
},
|
||||
[RUNWARE_NODE_TYPES.VECTORIZE]: {
|
||||
bgColor: DEFAULT_BGCOLOR,
|
||||
liveDimensions: true,
|
||||
},
|
||||
[RUNWARE_NODE_TYPES.VIDEOBGREMOVAL]: {
|
||||
bgColor: DEFAULT_BGCOLOR,
|
||||
@@ -452,6 +454,9 @@ const RUNWARE_NODE_PROPS = {
|
||||
[RUNWARE_NODE_TYPES.AUDIOSETTINGSVOICEMODIFY]: {
|
||||
bgColor: DEFAULT_BGCOLOR,
|
||||
},
|
||||
[RUNWARE_NODE_TYPES.VIDEOSETTINGS]: {
|
||||
bgColor: DEFAULT_BGCOLOR,
|
||||
},
|
||||
[RUNWARE_NODE_TYPES.ACCELERATOROPTIONS]: {
|
||||
bgColor: DEFAULT_BGCOLOR,
|
||||
colorModeOnly: true,
|
||||
|
||||
+140
-1
@@ -419,8 +419,9 @@ async function syncDimensionsNodeHandler(node, dimensionsWidget) {
|
||||
|
||||
appendWidgetCB(dimensionsWidget, function(...args) {
|
||||
const chosenDimension = args[0];
|
||||
if(chosenDimension === "Custom") return;
|
||||
if(chosenDimension === "Custom" || chosenDimension === "None") return;
|
||||
const dimensionValue = DEFAULT_DIMENSIONS_LIST[chosenDimension];
|
||||
if(!dimensionValue) return;
|
||||
const [width, height] = dimensionValue.split("x");
|
||||
widthWidget.callback(width, "customSetOperation");
|
||||
heightWidget.callback(height, "customSetOperation");
|
||||
@@ -1162,6 +1163,37 @@ function audioSettingsToggleHandler(settingsNode) {
|
||||
if (useTurboWidget && turboWidget) toggleWidgetState(useTurboWidget, turboWidget, "turbo");
|
||||
}
|
||||
|
||||
function videoSettingsToggleHandler(settingsNode) {
|
||||
if (!settingsNode?.widgets) return;
|
||||
|
||||
const useDraftWidget = settingsNode.widgets.find(w => w && w.name === "useDraft");
|
||||
const draftWidget = settingsNode.widgets.find(w => w && w.name === "draft");
|
||||
const useAudioWidget = settingsNode.widgets.find(w => w && w.name === "useAudio");
|
||||
const audioWidget = settingsNode.widgets.find(w => w && w.name === "audio");
|
||||
const usePromptUpsamplingWidget = settingsNode.widgets.find(w => w && w.name === "usePromptUpsampling");
|
||||
const promptUpsamplingWidget = settingsNode.widgets.find(w => w && w.name === "promptUpsampling");
|
||||
|
||||
function toggleWidgetState(useWidget, paramWidget, paramName) {
|
||||
if (!useWidget || !paramWidget) return;
|
||||
function applyState() {
|
||||
const enabled = useWidget.value === true;
|
||||
toggleWidgetEnabled(paramWidget, enabled, settingsNode);
|
||||
if (paramWidget.options && paramWidget.options.element) {
|
||||
paramWidget.options.element.disabled = !enabled;
|
||||
paramWidget.options.element.style.opacity = enabled ? "1" : "0.5";
|
||||
paramWidget.options.element.style.pointerEvents = enabled ? "auto" : "none";
|
||||
}
|
||||
settingsNode.setDirtyCanvas(true);
|
||||
}
|
||||
setTimeout(applyState, 100);
|
||||
appendWidgetCB(useWidget, () => setTimeout(applyState, 50));
|
||||
}
|
||||
|
||||
if (useDraftWidget && draftWidget) toggleWidgetState(useDraftWidget, draftWidget, "draft");
|
||||
if (useAudioWidget && audioWidget) toggleWidgetState(useAudioWidget, audioWidget, "audio");
|
||||
if (usePromptUpsamplingWidget && promptUpsamplingWidget) toggleWidgetState(usePromptUpsamplingWidget, promptUpsamplingWidget, "promptUpsampling");
|
||||
}
|
||||
|
||||
function audioInferenceSpeechToggleHandler(speechNode) {
|
||||
if (!speechNode?.widgets) return;
|
||||
|
||||
@@ -2323,6 +2355,9 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
|
||||
"VEED": [
|
||||
"veed:fabric@1.0 (VEED Fabric 1.0)",
|
||||
],
|
||||
"Pruna": [
|
||||
"prunaai:p-video@0 (P-Video)",
|
||||
],
|
||||
};
|
||||
|
||||
const MODEL_DIMENSIONS = {
|
||||
@@ -2402,6 +2437,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
|
||||
"runware:210@1": {"width": 512, "height": 512},
|
||||
"xai:grok-imagine@video": {"width": 480, "height": 480},
|
||||
"veed:fabric@1.0": {"width": 1280, "height": 720},
|
||||
"prunaai:p-video@0": {"width": 1280, "height": 720},
|
||||
};
|
||||
|
||||
const MODEL_RESOLUTIONS = {
|
||||
@@ -2481,6 +2517,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
|
||||
"runware:210@1": null, // No resolution support (fixed 512x512)
|
||||
"xai:grok-imagine@video": "480p",
|
||||
"veed:fabric@1.0": "720p",
|
||||
"prunaai:p-video@0": "720p",
|
||||
};
|
||||
|
||||
const DEFAULT_DIMENSIONS = {"width": 1024, "height": 576};
|
||||
@@ -2728,6 +2765,105 @@ function audioModelSearchFilterHandler(audioModelSearchNode) {
|
||||
filterModelList();
|
||||
}
|
||||
|
||||
function vectorizeModelSearchFilterHandler(vectorizeNode) {
|
||||
const modelArchWidget = vectorizeNode.widgets.find(w => w.name === "Model Architecture");
|
||||
const vectorListWidget = vectorizeNode.widgets.find(w => w.name === "Vector Model List");
|
||||
|
||||
if (!modelArchWidget || !vectorListWidget) return;
|
||||
|
||||
const VECTORIZE_MODELS = {
|
||||
"Recraft": [
|
||||
"recraft:1@1 (Recraft 1)",
|
||||
"recraft:v4-pro@vector (Recraft V4 Pro Vector)",
|
||||
"recraft:v4@vector (Recraft V4 Vector)",
|
||||
],
|
||||
"Picsart": [
|
||||
"picsart:1@1 (Picsart 1)",
|
||||
],
|
||||
};
|
||||
|
||||
function filterModelList() {
|
||||
const selectedArch = modelArchWidget.value;
|
||||
let filteredModels = [];
|
||||
|
||||
if (selectedArch === "All") {
|
||||
Object.values(VECTORIZE_MODELS).forEach(models => filteredModels.push(...models));
|
||||
} else if (VECTORIZE_MODELS[selectedArch]) {
|
||||
filteredModels = VECTORIZE_MODELS[selectedArch];
|
||||
}
|
||||
|
||||
if (filteredModels.length > 0) {
|
||||
const currentValue = vectorListWidget.value;
|
||||
vectorListWidget.options.values = filteredModels;
|
||||
|
||||
if (!filteredModels.includes(currentValue)) {
|
||||
vectorListWidget.value = filteredModels[0];
|
||||
}
|
||||
|
||||
vectorizeNode.setDirtyCanvas(true);
|
||||
}
|
||||
}
|
||||
|
||||
appendWidgetCB(modelArchWidget, filterModelList);
|
||||
filterModelList();
|
||||
}
|
||||
|
||||
function vectorizeToggleHandler(vectorizeNode) {
|
||||
const usePositivePromptWidget = vectorizeNode.widgets.find(w => w.name === "Use Positive Prompt");
|
||||
const positivePromptWidget = vectorizeNode.widgets.find(w => w.name === "positivePrompt");
|
||||
const dimensionsWidget = vectorizeNode.widgets.find(w => w.name === "dimensions");
|
||||
const widthWidget = vectorizeNode.widgets.find(w => w.name === "width");
|
||||
const heightWidget = vectorizeNode.widgets.find(w => w.name === "height");
|
||||
|
||||
function toggleWidgetState(useWidget, paramWidget, paramName) {
|
||||
if (!useWidget || !paramWidget) return;
|
||||
function applyState() {
|
||||
const enabled = useWidget.value === true;
|
||||
if (paramWidget.inputEl) {
|
||||
paramWidget.inputEl.disabled = !enabled;
|
||||
paramWidget.inputEl.style.opacity = enabled ? "1" : "0.5";
|
||||
paramWidget.inputEl.style.cursor = enabled ? "text" : "not-allowed";
|
||||
}
|
||||
}
|
||||
applyState();
|
||||
appendWidgetCB(useWidget, applyState);
|
||||
}
|
||||
|
||||
if (usePositivePromptWidget && positivePromptWidget) {
|
||||
toggleWidgetState(usePositivePromptWidget, positivePromptWidget, "positivePrompt");
|
||||
}
|
||||
|
||||
// Disable width/height when dimensions is "None" (same as image inference)
|
||||
if (dimensionsWidget && widthWidget && heightWidget) {
|
||||
function toggleDimensionsState() {
|
||||
const dimensionsValue = dimensionsWidget.value;
|
||||
const enabled = dimensionsValue !== "None";
|
||||
|
||||
if (widthWidget.inputEl) {
|
||||
widthWidget.inputEl.disabled = !enabled;
|
||||
widthWidget.inputEl.style.opacity = enabled ? "1" : "0.5";
|
||||
widthWidget.inputEl.style.cursor = enabled ? "text" : "not-allowed";
|
||||
widthWidget.inputEl.readOnly = !enabled;
|
||||
}
|
||||
widthWidget.disabled = !enabled;
|
||||
|
||||
if (heightWidget.inputEl) {
|
||||
heightWidget.inputEl.disabled = !enabled;
|
||||
heightWidget.inputEl.style.opacity = enabled ? "1" : "0.5";
|
||||
heightWidget.inputEl.style.cursor = enabled ? "text" : "not-allowed";
|
||||
heightWidget.inputEl.readOnly = !enabled;
|
||||
}
|
||||
heightWidget.disabled = !enabled;
|
||||
|
||||
vectorizeNode.setDirtyCanvas(true);
|
||||
}
|
||||
appendWidgetCB(dimensionsWidget, () => {
|
||||
setTimeout(toggleDimensionsState, 50);
|
||||
});
|
||||
setTimeout(toggleDimensionsState, 100);
|
||||
}
|
||||
}
|
||||
|
||||
function klingProviderSettingsToggleHandler(klingNode) {
|
||||
// Find all "use" parameter widgets for KlingAI Provider Settings (EXACT same pattern as imageInferenceToggleHandler)
|
||||
const useCameraControlWidget = klingNode.widgets.find(w => w.name === "useCameraControl");
|
||||
@@ -3794,6 +3930,8 @@ export {
|
||||
videoInferenceDimensionsHandler,
|
||||
videoModelSearchFilterHandler,
|
||||
audioModelSearchFilterHandler,
|
||||
vectorizeModelSearchFilterHandler,
|
||||
vectorizeToggleHandler,
|
||||
useParameterToggleHandler,
|
||||
imageInferenceToggleHandler,
|
||||
upscalerToggleHandler,
|
||||
@@ -3801,6 +3939,7 @@ export {
|
||||
audioInferenceToggleHandler,
|
||||
audioInferenceSpeechToggleHandler,
|
||||
audioSettingsToggleHandler,
|
||||
videoSettingsToggleHandler,
|
||||
acceleratorOptionsToggleHandler,
|
||||
bytedanceProviderSettingsToggleHandler,
|
||||
xaiProviderSettingsToggleHandler,
|
||||
|
||||
Reference in New Issue
Block a user