feat: add LTX-2 retake model
This commit is contained in:
+3
-1
@@ -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) {
|
||||
|
||||
@@ -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,)
|
||||
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user