Merge pull request #117 from Runware/feature-updateVideoModels

Added additional videoInference settings params
This commit is contained in:
Sirshendu Ganguly
2026-04-05 10:42:07 +05:30
committed by GitHub
9 changed files with 133 additions and 11 deletions
+27 -1
View File
@@ -1359,6 +1359,18 @@ function videoSettingsToggleHandler(settingsNode) {
const removeBackgroundWidget = settingsNode.widgets.find(w => w && w.name === "removeBackground");
const useExpressivenessWidget = settingsNode.widgets.find(w => w && w.name === "useExpressiveness");
const expressivenessWidget = settingsNode.widgets.find(w => w && w.name === "expressiveness");
const useVoiceDescriptionWidget = settingsNode.widgets.find(w => w && w.name === "useVoiceDescription");
const voiceDescriptionWidget = settingsNode.widgets.find(w => w && w.name === "voiceDescription");
const useStyleWidget = settingsNode.widgets.find(w => w && w.name === "useStyle");
const styleWidget = settingsNode.widgets.find(w => w && w.name === "style");
const useThinkingWidget = settingsNode.widgets.find(w => w && w.name === "useThinking");
const thinkingWidget = settingsNode.widgets.find(w => w && w.name === "thinking");
const useMultiClipWidget = settingsNode.widgets.find(w => w && w.name === "useMultiClip");
const multiClipWidget = settingsNode.widgets.find(w => w && w.name === "multiClip");
const useShotTypeWidget = settingsNode.widgets.find(w => w && w.name === "useShotType");
const shotTypeWidget = settingsNode.widgets.find(w => w && w.name === "shotType");
const usePromptExtendWidget = settingsNode.widgets.find(w => w && w.name === "usePromptExtend");
const promptExtendWidget = settingsNode.widgets.find(w => w && w.name === "promptExtend");
function toggleWidgetState(useWidget, paramWidget, paramName) {
if (!useWidget || !paramWidget) return;
@@ -1382,6 +1394,12 @@ function videoSettingsToggleHandler(settingsNode) {
if (useBackgroundColorWidget && backgroundColorWidget) toggleWidgetState(useBackgroundColorWidget, backgroundColorWidget, "backgroundColor");
if (useRemoveBackgroundWidget && removeBackgroundWidget) toggleWidgetState(useRemoveBackgroundWidget, removeBackgroundWidget, "removeBackground");
if (useExpressivenessWidget && expressivenessWidget) toggleWidgetState(useExpressivenessWidget, expressivenessWidget, "expressiveness");
if (useVoiceDescriptionWidget && voiceDescriptionWidget) toggleWidgetState(useVoiceDescriptionWidget, voiceDescriptionWidget, "voiceDescription");
if (useStyleWidget && styleWidget) toggleWidgetState(useStyleWidget, styleWidget, "style");
if (useThinkingWidget && thinkingWidget) toggleWidgetState(useThinkingWidget, thinkingWidget, "thinking");
if (useMultiClipWidget && multiClipWidget) toggleWidgetState(useMultiClipWidget, multiClipWidget, "multiClip");
if (useShotTypeWidget && shotTypeWidget) toggleWidgetState(useShotTypeWidget, shotTypeWidget, "shotType");
if (usePromptExtendWidget && promptExtendWidget) toggleWidgetState(usePromptExtendWidget, promptExtendWidget, "promptExtend");
}
function audioInferenceSpeechToggleHandler(speechNode) {
@@ -2476,6 +2494,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
"Veo": [
"google:2@0 (Veo 2.0)", "google:3@0 (Veo 3.0)", "google:3@1 (Veo 3.0 Fast)",
"google:3@2 (Veo 3.1)", "google:3@3 (Veo 3.1 Fast)",
"google:veo@3.1-lite (Veo 3.1 Lite)",
],
"Bytedance": [
"bytedance:2@1 (Seedance 1.0 Pro)", "bytedance:1@1 (Seedance 1.0 Lite)",
@@ -2489,7 +2508,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
],
"PixVerse": [
"pixverse:1@1 (PixVerse v3.5)", "pixverse:1@2 (PixVerse v4)",
"pixverse:1@3 (PixVerse v4.5)", "pixverse:1@5-fast (PixVerse v5 Fast)", "pixverse:1@6 (PixVerse v5.5)", "pixverse:1@7 (PixVerse v5.6)", "pixverse:lipsync@1 (PixVerse LipSync)",
"pixverse:1@3 (PixVerse v4.5)", "pixverse:1@5-fast (PixVerse v5 Fast)", "pixverse:1@6 (PixVerse v5.5)", "pixverse:1@7 (PixVerse v5.6)", "pixverse:1@8 (PixVerse v6)", "pixverse:lipsync@1 (PixVerse LipSync)",
],
"Vidu": [
"vidu:1@0 (Vidu Q1 Classic)", "vidu:1@1 (Vidu Q1)",
@@ -2503,6 +2522,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
"runware:200@8 (Wan 2.2 A14B Animate)",
"alibaba:wan@2.6 (Wan 2.6)",
"alibaba:wan@2.6-flash (Wan 2.6 Flash)",
"alibaba:wan@2.7 (Wan 2.7)",
],
"OpenAI": [
"openai:3@1 (OpenAI Sora 3.1)", "openai:3@0 (OpenAI Sora 3.0)",
@@ -2584,6 +2604,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
"google:3@1": {"width": 1280, "height": 720},
"google:3@2": {"width": 1280, "height": 720},
"google:3@3": {"width": 1280, "height": 720},
"google:veo@3.1-lite": {"width": 1280, "height": 720},
"bytedance:2@1": {"width": 864, "height": 480},
"bytedance:1@1": {"width": 864, "height": 480},
"bytedance:5@1": {"width": 1024, "height": 1024},
@@ -2601,6 +2622,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
"pixverse:1@5-fast": {"width": 640, "height": 360},
"pixverse:1@6": {"width": 640, "height": 360},
"pixverse:1@7": {"width": 640, "height": 360},
"pixverse:1@8": {"width": 640, "height": 360},
"pixverse:lipsync@1": {"width": 640, "height": 360},
"vidu:1@0": {"width": 1920, "height": 1080},
"vidu:1@1": {"width": 1920, "height": 1080},
@@ -2614,6 +2636,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
"runware:200@8": {"width": 1104, "height": 832},
"alibaba:wan@2.6": {"width": 1280, "height": 720},
"alibaba:wan@2.6-flash": {"width": 1280, "height": 720},
"alibaba:wan@2.7": {"width": 1280, "height": 720},
"openai:3@1": {"width": 1280, "height": 720},
"openai:3@0": {"width": 1280, "height": 720},
"lightricks:2@0": {"width": 1920, "height": 1080},
@@ -2670,6 +2693,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
"google:3@1": "720p",
"google:3@2": "720p",
"google:3@3": "720p",
"google:veo@3.1-lite": "720p",
"bytedance:2@1": "480p",
"bytedance:1@1": "480p",
"bytedance:5@1": null, // No resolution support
@@ -2687,6 +2711,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
"pixverse:1@5-fast": "360p",
"pixverse:1@6": "360p",
"pixverse:1@7": "360p",
"pixverse:1@8": "360p",
"pixverse:lipsync@1": "360p",
"vidu:1@0": "1080p",
"vidu:1@1": "1080p",
@@ -2700,6 +2725,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
"runware:200@8": "720p",
"alibaba:wan@2.6": "720p",
"alibaba:wan@2.6-flash": "720p",
"alibaba:wan@2.7": "720p",
"openai:3@1": "720p",
"openai:3@0": "720p",
"lightricks:2@0": "1080p",
+2 -2
View File
@@ -141,7 +141,7 @@ class txt2vid:
"tooltip": "Connect a Runware Accelerator Options Node to configure caching and acceleration settings.",
}),
"settings": ("RUNWAREVIDEOSETTINGS", {
"tooltip": "Connect a Runware Video Inference Settings node to configure draft, audio, and promptUpsampling.",
"tooltip": "Connect a Runware Video Inference Settings node to configure draft, audio, promptUpsampling, voiceDescription, style, thinking, multiClip, shotType, promptExtend, etc.",
}),
}
}
@@ -347,7 +347,7 @@ class txt2vid:
if runwareAccelerator is not None and isinstance(runwareAccelerator, dict) and len(runwareAccelerator) > 0:
genConfig[0]["acceleratorOptions"] = runwareAccelerator
# Add settings if provided (draft, audio, promptUpsampling)
# Add settings if provided (draft, audio, promptUpsampling, voiceDescription, ...)
if settings is not None and isinstance(settings, dict) and len(settings) > 0:
genConfig[0]["settings"] = settings
+9 -6
View File
@@ -1,6 +1,6 @@
"""
Runware Video Inference Speech Input Node.
Provides voice and text for speech synthesis; connect to Runware Video Inference speech input.
Provides voice and text for speech synthesis; connect only to Runware Video Inference → speech (not Video Inference Inputs → Speech Inputs; that socket expects RUNWARESPEECHINPUT).
"""
from typing import Any, Dict, Tuple
@@ -28,7 +28,7 @@ class RunwareVideoInferenceSpeechInput:
}),
"text": ("STRING", {
"multiline": True,
"tooltip": "Text script for the avatar to speak. Requires voice. Mutually exclusive with audio-driven input. Only used when 'Use Text' is enabled.",
"tooltip": "Text script for the avatar to speak. Use with voice, or text-only when voice is described via settings.voiceDescription on Runware Video Inference Settings. Only used when 'Use Text' is enabled.",
"default": "",
}),
"useSpeed": ("BOOLEAN", {
@@ -69,13 +69,16 @@ class RunwareVideoInferenceSpeechInput:
FUNCTION = "createSpeech"
CATEGORY = "Runware"
DESCRIPTION = (
"Configure speech synthesis for Runware Video Inference. Connect to Runware Video Inference speech input. "
"Speech is only sent when both voice and text are enabled and non-empty; otherwise the node outputs nothing. "
"Configure speech synthesis for Runware Video Inference. Connect the output to Runware Video Inference → speech "
"(top-level task speech). For speech inside inputs (e.g. inputs.speech), use Runware Video Speech Input "
"(RUNWARESPEECHINPUT) into Video Inference Inputs → Speech Inputs. "
"Outputs speech when at least one of voice or text is included (non-empty with its toggle); "
"text-only is valid when voice is supplied via settings.voiceDescription. "
"Optional fields (speed, pitch, language) are added only when their toggles are on."
)
def createSpeech(self, **kwargs) -> tuple:
"""Build speech dict for genConfig[0]['speech']. Only include non-empty values; return None unless both voice and text are present."""
"""Build speech dict for the Runware Video Inference speech connection (top-level task speech). Returns None if neither voice nor text is set."""
speech: Dict[str, Any] = {}
voice = (kwargs.get("voice") or "").strip()
@@ -95,7 +98,7 @@ class RunwareVideoInferenceSpeechInput:
if lang:
speech["language"] = lang
if "voice" not in speech or "text" not in speech:
if "voice" not in speech and "text" not in speech:
return (None,)
return (speech,)
+9
View File
@@ -31,6 +31,7 @@ class videoModelSearch:
"google:3@1 (Veo 3.0 Fast)",
"google:3@2 (Veo 3.1)",
"google:3@3 (Veo 3.1 Fast)",
"google:veo@3.1-lite (Veo 3.1 Lite)",
],
"Bytedance": [
"bytedance:2@1 (Seedance 1.0 Pro)",
@@ -54,6 +55,7 @@ class videoModelSearch:
"pixverse:1@5-fast (PixVerse v5 Fast)",
"pixverse:1@6 (PixVerse v5.5)",
"pixverse:1@7 (PixVerse v5.6)",
"pixverse:1@8 (PixVerse v6)",
"pixverse:lipsync@1 (PixVerse LipSync)",
],
"Vidu": [
@@ -71,6 +73,7 @@ class videoModelSearch:
"runware:200@8 (Wan 2.2 A14B Animate)",
"alibaba:wan@2.6 (Wan 2.6)",
"alibaba:wan@2.6-flash (Wan 2.6 Flash)",
"alibaba:wan@2.7 (Wan 2.7)",
],
"OpenAI": [
"openai:3@1 (OpenAI Sora 3.1)",
@@ -160,6 +163,7 @@ class videoModelSearch:
"google:3@1": {"width": 1280, "height": 720},
"google:3@2": {"width": 1280, "height": 720},
"google:3@3": {"width": 1280, "height": 720},
"google:veo@3.1-lite": {"width": 1280, "height": 720},
# Bytedance Models
"bytedance:2@1": {"width": 864, "height": 480},
@@ -183,6 +187,7 @@ class videoModelSearch:
"pixverse:1@5-fast": {"width": 640, "height": 360},
"pixverse:1@6": {"width": 640, "height": 360},
"pixverse:1@7": {"width": 640, "height": 360},
"pixverse:1@8": {"width": 640, "height": 360},
"pixverse:lipsync@1": {"width": 640, "height": 360},
# Vidu Models
@@ -200,6 +205,7 @@ class videoModelSearch:
"runware:200@8": {"width": 1104, "height": 832},
"alibaba:wan@2.6": {"width": 1280, "height": 720},
"alibaba:wan@2.6-flash": {"width": 1280, "height": 720},
"alibaba:wan@2.7": {"width": 1280, "height": 720},
# OpenAI Models
"openai:3@1": {"width": 1280, "height": 720},
@@ -288,6 +294,7 @@ class videoModelSearch:
"google:3@1": "720p",
"google:3@2": "720p",
"google:3@3": "720p",
"google:veo@3.1-lite": "720p",
# Bytedance Models
"bytedance:2@1": "480p",
@@ -311,6 +318,7 @@ class videoModelSearch:
"pixverse:1@5-fast": "360p",
"pixverse:1@6": "360p",
"pixverse:1@7": "360p",
"pixverse:1@8": "360p",
"pixverse:lipsync@1": "360p",
# Vidu Models
@@ -328,6 +336,7 @@ class videoModelSearch:
"runware:200@8": "720p",
"alibaba:wan@2.6": "720p",
"alibaba:wan@2.6-flash": "720p",
"alibaba:wan@2.7": "720p",
# OpenAI Models
"openai:3@1": "720p",
+82 -2
View File
@@ -1,6 +1,6 @@
"""
Runware Video Inference Settings Node
Provides settings (draft, audio, promptUpsampling) for Runware Video Inference.
Provides settings (draft, audio, promptUpsampling, voiceDescription, style, thinking, multiClip, shotType, promptExtend, etc.) for Runware Video Inference.
"""
from typing import Dict, Any
@@ -70,6 +70,59 @@ class RunwareVideoSettings:
"tooltip": "Avatar expressiveness level. Applies to photo avatars only. Only used when 'Use Expressiveness' is enabled.",
"default": "low",
}),
"useVoiceDescription": ("BOOLEAN", {
"tooltip": "Enable to include voiceDescription in video inference settings.",
"default": False,
}),
"voiceDescription": ("STRING", {
"default": "",
"multiline": True,
"tooltip": "Voice description text (max 10000 characters). Not supported when inputs.audio is given.",
}),
"useStyle": ("BOOLEAN", {
"tooltip": "Enable to include style (visual style of the video) in video inference settings.",
"default": False,
}),
"style": (["anime", "3d_animation", "clay", "comic", "cyberpunk"], {
"tooltip": "Visual style of the video. Only used when 'Use Style' is enabled.",
"default": "anime",
}),
"useThinking": ("BOOLEAN", {
"tooltip": "Enable to include thinking in video inference settings.",
"default": False,
}),
"thinking": (["enabled", "disabled", "auto"], {
"tooltip": "Thinking mode. Only used when 'Use Thinking' is enabled.",
"default": "auto",
}),
"useMultiClip": ("BOOLEAN", {
"tooltip": "Enable to include multiClip (multi-clip generation with dynamic camera changes; transition endpoint).",
"default": False,
}),
"multiClip": ("BOOLEAN", {
"tooltip": "Multi-clip generation with dynamic camera changes. Available on transition endpoint. Only used when 'Use Multi Clip' is enabled.",
"default": False,
"label_on": "Enabled",
"label_off": "Disabled",
}),
"useShotType": ("BOOLEAN", {
"tooltip": "Enable to include shotType in video inference settings.",
"default": False,
}),
"shotType": (["single", "multi"], {
"tooltip": "Shot type: single (one continuous shot) or multi (multiple switching shots). Parameter priority: shot_type > prompt. Only used when 'Use Shot Type' is enabled.",
"default": "single",
}),
"usePromptExtend": ("BOOLEAN", {
"tooltip": "Enable to include promptExtend in video inference settings.",
"default": False,
}),
"promptExtend": ("BOOLEAN", {
"tooltip": "Prompt extend flag. Only used when 'Use Prompt Extend' is enabled.",
"default": False,
"label_on": "Enabled",
"label_off": "Disabled",
}),
}
}
@@ -77,7 +130,10 @@ class RunwareVideoSettings:
RETURN_NAMES = ("settings",)
FUNCTION = "createSettings"
CATEGORY = "Runware"
DESCRIPTION = "Configure video inference settings (draft, audio, promptUpsampling) for Runware Video Inference. Connect to Runware Video Inference node."
DESCRIPTION = (
"Configure video inference settings (draft, audio, promptUpsampling, voiceDescription, style, thinking, multiClip, shotType, promptExtend, etc.) for Runware Video Inference. "
"Connect to Runware Video Inference node."
)
def createSettings(self, **kwargs) -> tuple[Dict[str, Any]]:
"""Create settings dict for Video Inference API"""
@@ -93,6 +149,18 @@ class RunwareVideoSettings:
remove_background = kwargs.get("removeBackground", False)
use_expressiveness = kwargs.get("useExpressiveness", False)
expressiveness = kwargs.get("expressiveness", "low")
use_voice_description = kwargs.get("useVoiceDescription", False)
voice_description = (kwargs.get("voiceDescription") or "").strip()
use_style = kwargs.get("useStyle", False)
style = kwargs.get("style", "anime")
use_thinking = kwargs.get("useThinking", False)
thinking = kwargs.get("thinking", "auto")
use_multi_clip = kwargs.get("useMultiClip", False)
multi_clip = kwargs.get("multiClip", False)
use_shot_type = kwargs.get("useShotType", False)
shot_type = kwargs.get("shotType", "single")
use_prompt_extend = kwargs.get("usePromptExtend", False)
prompt_extend = kwargs.get("promptExtend", False)
settings: Dict[str, Any] = {}
@@ -108,6 +176,18 @@ class RunwareVideoSettings:
settings["removeBackground"] = bool(remove_background)
if use_expressiveness:
settings["expressiveness"] = expressiveness
if use_voice_description and voice_description:
settings["voiceDescription"] = voice_description
if use_style:
settings["style"] = style
if use_thinking:
settings["thinking"] = thinking
if use_multi_clip:
settings["multiClip"] = bool(multi_clip)
if use_shot_type:
settings["shotType"] = shot_type
if use_prompt_extend:
settings["promptExtend"] = bool(prompt_extend)
return (settings,)
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