feat: add LTX-2 retake model

This commit is contained in:
Sirshendu Ganguly
2025-11-26 14:16:45 -05:00
parent e7b04341d9
commit dd479af27b
7 changed files with 140 additions and 5 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, videoTranscriptionHandler, handleCustomErrors, videoInferenceDimensionsHandler, videoModelSearchFilterHandler, audioModelSearchFilterHandler, useParameterToggleHandler, imageInferenceToggleHandler, upscalerToggleHandler, videoUpscalerToggleHandler, audioInferenceToggleHandler, acceleratorOptionsToggleHandler, bytedanceProviderSettingsToggleHandler, openaiProviderSettingsToggleHandler, klingProviderSettingsToggleHandler, lumaProviderSettingsToggleHandler, briaProviderSettingsToggleHandler } from "./utils.js";
import { promptEnhanceHandler, syncDimensionsNodeHandler, searchNodeHandler, APIKeyHandler, captionNodeHandler, mediaUUIDHandler, videoTranscriptionHandler, handleCustomErrors, videoInferenceDimensionsHandler, videoModelSearchFilterHandler, audioModelSearchFilterHandler, useParameterToggleHandler, imageInferenceToggleHandler, upscalerToggleHandler, videoUpscalerToggleHandler, audioInferenceToggleHandler, acceleratorOptionsToggleHandler, bytedanceProviderSettingsToggleHandler, openaiProviderSettingsToggleHandler, lightricksProviderSettingsToggleHandler, klingProviderSettingsToggleHandler, lumaProviderSettingsToggleHandler, briaProviderSettingsToggleHandler } from "./utils.js";
import { RUNWARE_NODE_TYPES, RUNWARE_NODE_PROPS, SEARCH_TERMS } from "./types.js";
const nodeInitList = [];
@@ -61,6 +61,8 @@ app.registerExtension({
bytedanceProviderSettingsToggleHandler(node);
} else if(nodeClass === RUNWARE_NODE_TYPES.OPENAIPROVIDERSETTINGS) {
openaiProviderSettingsToggleHandler(node);
} else if(nodeClass === RUNWARE_NODE_TYPES.LIGHTRICKSPROVIDERSETTINGS) {
lightricksProviderSettingsToggleHandler(node);
} else if(nodeClass === RUNWARE_NODE_TYPES.KLINGPROVIDERSETTINGS) {
klingProviderSettingsToggleHandler(node);
} else if(nodeClass === RUNWARE_NODE_TYPES.LUMAPROVIDERSETTINGS) {
+77
View File
@@ -1246,6 +1246,80 @@ function openaiProviderSettingsToggleHandler(openaiNode) {
}
}
function lightricksProviderSettingsToggleHandler(lightricksNode) {
const useStartTimeWidget = lightricksNode.widgets.find(w => w.name === "useStartTime");
const startTimeWidget = lightricksNode.widgets.find(w => w.name === "startTime");
const useDurationWidget = lightricksNode.widgets.find(w => w.name === "useDuration");
const durationWidget = lightricksNode.widgets.find(w => w.name === "duration");
const useModeWidget = lightricksNode.widgets.find(w => w.name === "useMode");
const modeWidget = lightricksNode.widgets.find(w => w.name === "mode");
const useGenerateAudioWidget = lightricksNode.widgets.find(w => w.name === "useGenerateAudio");
const generateAudioWidget = lightricksNode.widgets.find(w => w.name === "generateAudio");
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;
}
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";
}
paramWidget.disabled = !enabled;
if (!paramWidget.inputEl) {
const nodeElement = lightricksNode.htmlElements?.widgetsContainer || lightricksNode.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.cursor = enabled ? "text" : "not-allowed";
input.readOnly = !enabled;
if (input.tagName === "SELECT") {
input.style.pointerEvents = enabled ? "auto" : "none";
}
}
}
}
lightricksNode.setDirtyCanvas(true);
}
appendWidgetCB(useWidget, () => {
setTimeout(toggleEnabled, 50);
});
setTimeout(toggleEnabled, 100);
}
if (useStartTimeWidget && startTimeWidget) {
toggleWidgetState(useStartTimeWidget, startTimeWidget, "startTime");
}
if (useDurationWidget && durationWidget) {
toggleWidgetState(useDurationWidget, durationWidget, "duration");
}
if (useModeWidget && modeWidget) {
toggleWidgetState(useModeWidget, modeWidget, "mode");
}
if (useGenerateAudioWidget && generateAudioWidget) {
toggleWidgetState(useGenerateAudioWidget, generateAudioWidget, "generateAudio");
}
}
function imageInferenceToggleHandler(imageInferenceNode) {
// Find all "use" parameter widgets for Image Inference
const useStepsWidget = imageInferenceNode.widgets.find(w => w.name === "useSteps");
@@ -1458,6 +1532,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
],
"Lightricks": [
"lightricks:2@0 (LTX Fast)", "lightricks:2@1 (LTX Pro)",
"lightricks:3@1 (LTX-2 Retake)",
],
"Ovi": [
"runware:190@1 (Ovi)",
@@ -1516,6 +1591,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
"openai:3@0": {"width": 1280, "height": 720},
"lightricks:2@0": {"width": 1920, "height": 1080},
"lightricks:2@1": {"width": 1920, "height": 1080},
"lightricks:3@1": {"width": 0, "height": 0},
"runware:190@1": {"width": 0, "height": 0},
"runway:2@1": {"width": 1280, "height": 720},
"runway:1@1": {"width": 1280, "height": 720},
@@ -1964,6 +2040,7 @@ export {
acceleratorOptionsToggleHandler,
bytedanceProviderSettingsToggleHandler,
openaiProviderSettingsToggleHandler,
lightricksProviderSettingsToggleHandler,
klingProviderSettingsToggleHandler,
lumaProviderSettingsToggleHandler,
briaProviderSettingsToggleHandler,
@@ -13,10 +13,49 @@ class RunwareLightricksProviderSettings:
return {
"required": {},
"optional": {
"useGenerateAudio": ("BOOLEAN", {
"tooltip": "Enable to override the audio generation flag. Disable to keep the default behavior.",
"default": False,
"label_on": "Enabled",
"label_off": "Disabled",
}),
"generateAudio": ("BOOLEAN", {
"tooltip": "Enable to generate audio for the video. Disable to generate video without audio. Default: false.",
"default": False,
}),
"useStartTime": ("BOOLEAN", {
"tooltip": "Enable to include a custom start time for the replacement segment.",
"default": False,
"label_on": "Enabled",
"label_off": "Disabled",
}),
"startTime": ("INT", {
"tooltip": "Start time (seconds) where the replacement should begin.",
"default": 0,
"min": 0,
}),
"useDuration": ("BOOLEAN", {
"tooltip": "Enable to include a custom duration for the replacement segment.",
"default": False,
"label_on": "Enabled",
"label_off": "Disabled",
}),
"duration": ("INT", {
"tooltip": "Duration (seconds) for the replacement segment.",
"default": 5,
"min": 1,
}),
"useMode": ("BOOLEAN", {
"tooltip": "Enable to select what parts of the video should be replaced.",
"default": False,
"label_on": "Enabled",
"label_off": "Default",
}),
"mode": (["replace_audio", "replace_video", "replace_audio_and_video"], {
"tooltip": "Choose what to replace in the video task.",
"default": "replace_audio",
}),
}
}
@@ -30,12 +69,25 @@ class RunwareLightricksProviderSettings:
# Get value parameters
generateAudio = kwargs.get("generateAudio", False)
useStartTime = kwargs.get("useStartTime", False)
useDuration = kwargs.get("useDuration", False)
useMode = kwargs.get("useMode", False)
useGenerateAudio = kwargs.get("useGenerateAudio", False)
startTime = kwargs.get("startTime", 0)
duration = kwargs.get("duration", 5)
mode = kwargs.get("mode", "replace_audio")
# Build settings dictionary
# Always include generateAudio to ensure it's explicitly set
settings = {
"generateAudio": generateAudio
}
settings = {}
if useGenerateAudio:
settings["generateAudio"] = generateAudio
if useStartTime:
settings["startTime"] = startTime
if useDuration:
settings["duration"] = duration
if useMode:
settings["mode"] = mode
return (settings,)
+2
View File
@@ -62,6 +62,7 @@ class videoModelSearch:
"Lightricks": [
"lightricks:2@0 (LTX Fast)",
"lightricks:2@1 (LTX Pro)",
"lightricks:3@1 (LTX-2 Retake)",
],
"Ovi": [
"runware:190@1 (Ovi)",
@@ -138,6 +139,7 @@ class videoModelSearch:
# Lightricks Models
"lightricks:2@0": {"width": 1920, "height": 1080},
"lightricks:2@1": {"width": 1920, "height": 1080},
"lightricks:3@1": {"width": 0, "height": 0},
# Ovi Models
"runware:190@1": {"width": 0, "height": 0},
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