Merge pull request #89 from Runware/addViduModel

Add workflows, and Update Vidu Provider Settings
This commit is contained in:
Sirshendu Ganguly
2026-02-04 12:21:06 -05:00
committed by GitHub
8 changed files with 158 additions and 29 deletions
+3 -1
View File
@@ -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, acceleratorOptionsToggleHandler, bytedanceProviderSettingsToggleHandler, xaiProviderSettingsToggleHandler, 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, useParameterToggleHandler, imageInferenceToggleHandler, upscalerToggleHandler, videoUpscalerToggleHandler, audioInferenceToggleHandler, acceleratorOptionsToggleHandler, bytedanceProviderSettingsToggleHandler, xaiProviderSettingsToggleHandler, viduProviderSettingsToggleHandler, 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 = [];
@@ -108,6 +108,8 @@ app.registerExtension({
syncProviderSettingsToggleHandler(node);
} else if(nodeClass === RUNWARE_NODE_TYPES.SYNCSEGMENT) {
syncSegmentToggleHandler(node);
} else if(nodeClass === RUNWARE_NODE_TYPES.VIDUPROVIDERSETTINGS) {
viduProviderSettingsToggleHandler(node);
} else if(nodeClass === RUNWARE_NODE_TYPES.SETTINGS) {
settingsToggleHandler(node);
} else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOINPUT) {
+82
View File
@@ -1374,6 +1374,81 @@ function xaiProviderSettingsToggleHandler(xaiNode) {
}
}
function viduProviderSettingsToggleHandler(viduNode) {
const useAudioWidget = viduNode.widgets.find(w => w.name === "useAudio");
const audioWidget = viduNode.widgets.find(w => w.name === "audio");
const useBgmWidget = viduNode.widgets.find(w => w.name === "useBgm");
const bgmWidget = viduNode.widgets.find(w => w.name === "bgm");
const useStyleWidget = viduNode.widgets.find(w => w.name === "useStyle");
const styleWidget = viduNode.widgets.find(w => w.name === "style");
const useMovementAmplitudeWidget = viduNode.widgets.find(w => w.name === "useMovementAmplitude");
const movementAmplitudeWidget = viduNode.widgets.find(w => w.name === "movementAmplitude");
const useTemplateNameWidget = viduNode.widgets.find(w => w.name === "useTemplateName");
const templateNameWidget = viduNode.widgets.find(w => w.name === "templateName");
const useTemplateAreaWidget = viduNode.widgets.find(w => w.name === "useTemplateArea");
const templateAreaWidget = viduNode.widgets.find(w => w.name === "templateArea");
const useTemplateBeastWidget = viduNode.widgets.find(w => w.name === "useTemplateBeast");
const templateBeastWidget = viduNode.widgets.find(w => w.name === "templateBeast");
function toggleWidgetState(useWidget, paramWidget, paramName) {
if (!useWidget || !paramWidget) return;
function toggleEnabled() {
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";
paramWidget.inputEl.readOnly = !enabled;
}
paramWidget.disabled = !enabled;
if (!paramWidget.inputEl) {
const nodeElement = viduNode.htmlElements?.widgetsContainer || viduNode.htmlElements;
if (nodeElement) {
const input = nodeElement.querySelector(`input[name="${paramName}"], textarea[name="${paramName}"], select[name="${paramName}"]`);
if (input) {
input.disabled = !enabled;
input.style.opacity = enabled ? "1" : "0.5";
input.style.pointerEvents = enabled ? "auto" : "none";
}
}
}
viduNode.setDirtyCanvas(true);
}
appendWidgetCB(useWidget, () => {
setTimeout(toggleEnabled, 50);
});
setTimeout(toggleEnabled, 100);
}
if (useAudioWidget && audioWidget) {
toggleWidgetState(useAudioWidget, audioWidget, "audio");
}
if (useBgmWidget && bgmWidget) {
toggleWidgetState(useBgmWidget, bgmWidget, "bgm");
}
if (useStyleWidget && styleWidget) {
toggleWidgetState(useStyleWidget, styleWidget, "style");
}
if (useMovementAmplitudeWidget && movementAmplitudeWidget) {
toggleWidgetState(useMovementAmplitudeWidget, movementAmplitudeWidget, "movementAmplitude");
}
if (useTemplateNameWidget && templateNameWidget) {
toggleWidgetState(useTemplateNameWidget, templateNameWidget, "templateName");
}
if (useTemplateAreaWidget && templateAreaWidget) {
toggleWidgetState(useTemplateAreaWidget, templateAreaWidget, "templateArea");
}
if (useTemplateBeastWidget && templateBeastWidget) {
toggleWidgetState(useTemplateBeastWidget, templateBeastWidget, "templateBeast");
}
}
function openaiProviderSettingsToggleHandler(openaiNode) {
// Find all "use" parameter widgets for OpenAI Provider Settings (these are COMBO widgets)
const useBackgroundWidget = openaiNode.widgets.find(w => w.name === "useBackground");
@@ -1903,6 +1978,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
"Vidu": [
"vidu:1@0 (Vidu Q1 Classic)", "vidu:1@1 (Vidu Q1)",
"vidu:1@5 (Vidu 1.5)", "vidu:2@0 (Vidu 2.0)",
"vidu:4@1 (Vidu Q3)",
],
"Wan": [
"runware:200@1 (Wan 2.1 1.3B)", "runware:200@2 (Wan 2.1 14B)",
@@ -1924,6 +2000,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
"Runway": [
"runway:2@1 (Runway Aleph)",
"runway:1@1 (Runway Gen-4 Turbo)",
"runway:1@2 (Runway Gen-4.5)",
],
"Luma": [
"lumaai:1@1 (Luma Ray 1.6)",
@@ -1996,6 +2073,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
"vidu:1@1": {"width": 1920, "height": 1080},
"vidu:1@5": {"width": 1920, "height": 1080},
"vidu:2@0": {"width": 1920, "height": 1080},
"vidu:4@1": {"width": 1920, "height": 1080},
"runware:200@1": {"width": 853, "height": 480},
"runware:200@2": {"width": 853, "height": 480},
"runware:200@6": {"width": 1280, "height": 720},
@@ -2010,6 +2088,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
"runware:190@1": {"width": 0, "height": 0},
"runway:2@1": {"width": 1280, "height": 720},
"runway:1@1": {"width": 1280, "height": 720},
"runway:1@2": {"width": 1280, "height": 720},
"lumaai:1@1": {"width": 1080, "height": 720},
"lumaai:2@1": {"width": 1080, "height": 720},
"lumaai:2@2": {"width": 1080, "height": 720},
@@ -2067,6 +2146,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
"vidu:1@1": "1080p",
"vidu:1@5": "1080p",
"vidu:2@0": "1080p",
"vidu:4@1": "1080p",
"runware:200@1": "480p",
"runware:200@2": "480p",
"runware:200@6": "720p",
@@ -2081,6 +2161,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
"runware:190@1": null, // No resolution support
"runway:2@1": "720p",
"runway:1@1": "720p",
"runway:1@2": "720p",
"lumaai:1@1": "720p",
"lumaai:2@1": "720p",
"lumaai:2@2": "720p",
@@ -3358,6 +3439,7 @@ export {
acceleratorOptionsToggleHandler,
bytedanceProviderSettingsToggleHandler,
xaiProviderSettingsToggleHandler,
viduProviderSettingsToggleHandler,
ultralyticsProviderSettingsToggleHandler,
openaiProviderSettingsToggleHandler,
lightricksProviderSettingsToggleHandler,
@@ -6,35 +6,65 @@ class RunwareViduProviderSettings:
return {
"required": {},
"optional": {
# Audio parameter
"useAudio": ("BOOLEAN", {
"tooltip": "Enable to include audio parameter in API request",
"default": False,
}),
"audio": ("BOOLEAN", {
"tooltip": "Enable audio for video generation. Only used when 'Use Audio' is enabled.",
"default": True,
}),
# BGM parameter
"useBgm": ("BOOLEAN", {
"tooltip": "Enable to include bgm parameter in API request",
"default": False,
}),
"bgm": ("BOOLEAN", {
"tooltip": "Enable background music for video generation",
"tooltip": "Enable background music for video generation. Only used when 'Use BGM' is enabled.",
"default": False,
}),
# Style parameter
"useStyle": ("BOOLEAN", {
"tooltip": "Enable to include style parameter in API request",
"default": False,
}),
"style": ("STRING", {
"tooltip": "Video style configuration for Vidu models",
"tooltip": "Video style configuration for Vidu models. Only used when 'Use Style' is enabled.",
"default": "",
}),
# Movement amplitude parameter
"useMovementAmplitude": ("BOOLEAN", {
"tooltip": "Enable to include movementAmplitude parameter in API request",
"default": False,
}),
"movementAmplitude": ("STRING", {
"tooltip": "Controls the amplitude/intensity of movement in the generated video",
"tooltip": "Controls the amplitude/intensity of movement in the generated video. Only used when 'Use Movement Amplitude' is enabled.",
"default": "",
}),
# Template parameters
"useTemplateName": ("BOOLEAN", {
"tooltip": "Enable to include template name in API request",
"default": False,
}),
"templateName": ("STRING", {
"tooltip": "Template name for video generation",
"tooltip": "Template name for video generation. Only used when 'Use Template Name' is enabled.",
"default": "",
}),
"useTemplateArea": ("BOOLEAN", {
"tooltip": "Enable to include template area in API request",
"default": False,
}),
"templateArea": ("STRING", {
"tooltip": "Template area configuration",
"tooltip": "Template area configuration. Only used when 'Use Template Area' is enabled.",
"default": "",
}),
"useTemplateBeast": ("BOOLEAN", {
"tooltip": "Enable to include template beast in API request",
"default": False,
}),
"templateBeast": ("STRING", {
"tooltip": "Template beast configuration",
"tooltip": "Template beast configuration. Only used when 'Use Template Beast' is enabled.",
"default": "",
}),
},
@@ -48,34 +78,41 @@ class RunwareViduProviderSettings:
def viduProviderSettings(self, **kwargs):
# Get all optional parameters
bgm = kwargs.get("bgm")
useAudio = kwargs.get("useAudio", False)
audio = kwargs.get("audio", True)
useBgm = kwargs.get("useBgm", False)
bgm = kwargs.get("bgm", False)
useStyle = kwargs.get("useStyle", False)
style = kwargs.get("style", "")
useMovementAmplitude = kwargs.get("useMovementAmplitude", False)
movementAmplitude = kwargs.get("movementAmplitude", "")
useTemplateName = kwargs.get("useTemplateName", False)
templateName = kwargs.get("templateName", "")
useTemplateArea = kwargs.get("useTemplateArea", False)
templateArea = kwargs.get("templateArea", "")
useTemplateBeast = kwargs.get("useTemplateBeast", False)
templateBeast = kwargs.get("templateBeast", "")
# Build provider settings dictionary
providerSettings = {}
# Add basic parameters if specified
if bgm is not None:
if useAudio:
providerSettings["audio"] = audio
if useBgm:
providerSettings["bgm"] = bgm
if style:
providerSettings["style"] = style
if movementAmplitude:
providerSettings["movementAmplitude"] = movementAmplitude
if useStyle and style and style.strip():
providerSettings["style"] = style.strip()
if useMovementAmplitude and movementAmplitude and movementAmplitude.strip():
providerSettings["movementAmplitude"] = movementAmplitude.strip()
# Build template object if any template parameters are provided
# Build template object if any template parameters are enabled and provided
template = {}
if templateName:
template["name"] = templateName
if templateArea:
template["area"] = templateArea
if templateBeast:
template["beast"] = templateBeast
# Add template to provider settings if any template parameters were specified
if useTemplateName and templateName and templateName.strip():
template["name"] = templateName.strip()
if useTemplateArea and templateArea and templateArea.strip():
template["area"] = templateArea.strip()
if useTemplateBeast and templateBeast and templateBeast.strip():
template["beast"] = templateBeast.strip()
if template:
providerSettings["template"] = template
+7 -1
View File
@@ -55,6 +55,7 @@ class videoModelSearch:
"vidu:1@1 (Vidu Q1)",
"vidu:1@5 (Vidu 1.5)",
"vidu:2@0 (Vidu 2.0)",
"vidu:4@1 (Vidu Q3)",
],
"Wan": [
"runware:200@1 (Wan 2.1 1.3B)",
@@ -80,6 +81,7 @@ class videoModelSearch:
"Runway": [
"runway:2@1 (Runway Aleph)",
"runway:1@1 (Runway Gen-4 Turbo)",
"runway:1@2 (Runway Gen-4.5)",
],
"Luma": [
"lumaai:1@1 (Luma Ray 1.6)",
@@ -163,6 +165,7 @@ class videoModelSearch:
"vidu:1@1": {"width": 1920, "height": 1080},
"vidu:1@5": {"width": 1920, "height": 1080},
"vidu:2@0": {"width": 1920, "height": 1080},
"vidu:4@1": {"width": 1920, "height": 1080},
# Wan Models
"runware:200@1": {"width": 853, "height": 480},
@@ -188,6 +191,7 @@ class videoModelSearch:
# Runway Models
"runway:2@1": {"width": 1280, "height": 720},
"runway:1@1": {"width": 1280, "height": 720},
"runway:1@2": {"width": 1280, "height": 720},
# Luma Models
"lumaai:1@1": {"width": 1080, "height": 720},
@@ -270,6 +274,7 @@ class videoModelSearch:
"vidu:1@1": "1080p",
"vidu:1@5": "1080p",
"vidu:2@0": "1080p",
"vidu:4@1": "1080p",
# Wan Models
"runware:200@1": "480p",
@@ -295,6 +300,7 @@ class videoModelSearch:
# Runway Models
"runway:2@1": "720p",
"runway:1@1": "720p",
"runway:1@2": "720p",
# Luma Models
"lumaai:1@1": "720p",
@@ -319,7 +325,7 @@ class videoModelSearch:
# xAI Models
"xai:grok-imagine@video": "480p",
# VEED Models (480p or 720p)
# VEED Models
"veed:fabric@1.0": "720p",
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long