diff --git a/__init__.py b/__init__.py index e95ad5f..d924334 100644 --- a/__init__.py +++ b/__init__.py @@ -53,6 +53,8 @@ from .modules.videoInferenceInputs import videoInferenceInputs from .modules.providerSettings.lightricksProviderSettings import RunwareLightricksProviderSettings from .modules.providerSettings.minimaxProviderSettings import RunwareMiniMaxProviderSettings from .modules.providerSettings.klingProviderSettings import RunwareKlingProviderSettings +from .modules.providerSettings.klingMultiPromptSegment import RunwareKlingMultiPromptSegment +from .modules.providerSettings.klingProviderSettingsMultiPrompt import RunwareKlingProviderSettingsMultiPrompt from .modules.providerSettings.runwayProviderSettings import RunwareRunwayProviderSettings from .modules.providerSettings.lumaProviderSettings import RunwareLumaProviderSettings from .modules.providerSettings.midjourneyProviderSettings import RunwareMidjourneyProviderSettings @@ -153,6 +155,8 @@ NODE_CLASS_MAPPINGS = { "Runware MiniMax Provider Settings": RunwareMiniMaxProviderSettings, "Runware Luma Provider Settings": RunwareLumaProviderSettings, "Runware KlingAI Provider Settings": RunwareKlingProviderSettings, + "Runware Kling MultiPrompt Segment": RunwareKlingMultiPromptSegment, + "Runware Kling Provider Settings MultiPrompt": RunwareKlingProviderSettingsMultiPrompt, "Runware Runway Provider Settings": RunwareRunwayProviderSettings, "Runware Midjourney Provider Settings": RunwareMidjourneyProviderSettings, "Runware Mirelo Provider Settings": RunwareMireloProviderSettings, diff --git a/clientlibs/types.js b/clientlibs/types.js index 29ae2a1..6e8a0ed 100644 --- a/clientlibs/types.js +++ b/clientlibs/types.js @@ -100,6 +100,8 @@ const RUNWARE_NODE_TYPES = { VIDEOINFERENCEINPUTS: "Runware Video Inference Inputs", LIGHTRICKSPROVIDERSETTINGS: "Runware Lightricks Provider Settings", KLINGPROVIDERSETTINGS: "Runware KlingAI Provider Settings", + KLINGMULTIPROMPTSEGMENT: "Runware Kling MultiPrompt Segment", + KLINGPROVIDERSETTINGSMULTIPROMPT: "Runware Kling Provider Settings MultiPrompt", RUNWAYPROVIDERSETTINGS: "Runware Runway Provider Settings", LUMAPROVIDERSETTINGS: "Runware Luma Provider Settings", MIDJOURNEYPROVIDERSETTINGS: "Runware Midjourney Provider Settings", @@ -349,6 +351,14 @@ const RUNWARE_NODE_PROPS = { bgColor: DEFAULT_BGCOLOR, colorModeOnly: true, }, + [RUNWARE_NODE_TYPES.KLINGMULTIPROMPTSEGMENT]: { + bgColor: DEFAULT_BGCOLOR, + colorModeOnly: true, + }, + [RUNWARE_NODE_TYPES.KLINGPROVIDERSETTINGSMULTIPROMPT]: { + bgColor: DEFAULT_BGCOLOR, + colorModeOnly: true, + }, [RUNWARE_NODE_TYPES.RUNWAYPROVIDERSETTINGS]: { bgColor: DEFAULT_BGCOLOR, colorModeOnly: true, diff --git a/clientlibs/utils.js b/clientlibs/utils.js index 1361e9b..0f685c5 100644 --- a/clientlibs/utils.js +++ b/clientlibs/utils.js @@ -2127,6 +2127,8 @@ function videoModelSearchFilterHandler(videoModelSearchNode) { "klingai:7@1 (KlingAI Lip-Sync)", "klingai:kling@o1 (Kling VIDEO O1)", "klingai:kling-video@2.6-pro (Kling VIDEO 2.6 Pro)", + "klingai:kling-video@3-pro (Kling VIDEO 3.0 Pro)", + "klingai:kling-video@3-standard (Kling VIDEO 3.0 Standard)", "klingai:avatar@2.0-standard (KlingAI Avatar 2.0 Standard)", "klingai:avatar@2.0-pro (KlingAI Avatar 2.0 Pro)", ], @@ -2222,6 +2224,8 @@ function videoModelSearchFilterHandler(videoModelSearchNode) { "klingai:7@1": {"width": 0, "height": 0}, "klingai:kling@o1": {"width": 1440, "height": 1440}, "klingai:kling-video@2.6-pro": {"width": 1920, "height": 1080}, + "klingai:kling-video@3-pro": {"width": 1920, "height": 1080}, + "klingai:kling-video@3-standard": {"width": 1920, "height": 1080}, "klingai:avatar@2.0-standard": {"width": 0, "height": 0}, "klingai:avatar@2.0-pro": {"width": 0, "height": 0}, "google:2@0": {"width": 1280, "height": 720}, @@ -2297,6 +2301,8 @@ function videoModelSearchFilterHandler(videoModelSearchNode) { "klingai:7@1": null, // No resolution support "klingai:kling@o1": null, // No standard resolution "klingai:kling-video@2.6-pro": "1080p", + "klingai:kling-video@3-pro": "1080p", + "klingai:kling-video@3-standard": "1080p", "klingai:avatar@2.0-standard": null, // No resolution support "klingai:avatar@2.0-pro": null, // No resolution support "google:2@0": "720p", @@ -2616,6 +2622,7 @@ function klingProviderSettingsToggleHandler(klingNode) { const soundWidget = klingNode.widgets.find(w => w.name === "sound"); const useCharacterOrientationWidget = klingNode.widgets.find(w => w.name === "useCharacterOrientation"); const characterOrientationWidget = klingNode.widgets.find(w => w.name === "characterOrientation"); + const useMultipromptWidget = klingNode.widgets.find(w => w.name === "useMultiprompt"); // Helper function to toggle widget enabled state (EXACT same pattern as imageInferenceToggleHandler) // Callers guard with if (useX && xWidget) before invoking @@ -2698,6 +2705,25 @@ function klingProviderSettingsToggleHandler(klingNode) { if (useCharacterOrientationWidget && characterOrientationWidget) { toggleWidgetState(useCharacterOrientationWidget, characterOrientationWidget, "characterOrientation"); } + + // Toggle MultiPrompt Segment input slots when useMultiprompt changes + if (useMultipromptWidget) { + function toggleMultipromptInputs() { + const enabled = useMultipromptWidget.value === true; + klingNode.inputs?.forEach(inp => { + if (inp?.name?.startsWith("MultiPrompt Segment")) { + inp.disabled = !enabled; + if (inp.domElement) { + inp.domElement.style.opacity = enabled ? "1" : "0.4"; + inp.domElement.style.pointerEvents = enabled ? "auto" : "none"; + } + } + }); + klingNode.setDirtyCanvas(true); + } + appendWidgetCB(useMultipromptWidget, () => setTimeout(toggleMultipromptInputs, 50)); + setTimeout(toggleMultipromptInputs, 100); + } } function alibabaProviderSettingsToggleHandler(alibabaNode) { diff --git a/modules/providerSettings/klingMultiPromptSegment.py b/modules/providerSettings/klingMultiPromptSegment.py new file mode 100644 index 0000000..3298154 --- /dev/null +++ b/modules/providerSettings/klingMultiPromptSegment.py @@ -0,0 +1,47 @@ +""" +Runware Kling MultiPrompt Segment Node +Creates a single prompt/duration entry for Kling multiPrompt provider settings +""" + +from typing import Dict, Any + + +class RunwareKlingMultiPromptSegment: + """Runware Kling MultiPrompt Segment Node""" + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "prompt": ("STRING", { + "multiline": True, + "default": "", + "tooltip": "Prompt for this segment of the video", + }), + "duration": ("INT", { + "default": 4, + "min": 1, + "max": 30, + "step": 1, + "tooltip": "Duration in seconds for this segment", + }), + }, + } + + RETURN_TYPES = ("RUNWAREKLINGMULTIPROMPTSEGMENT",) + RETURN_NAMES = ("MultiPrompt Segment",) + FUNCTION = "createSegment" + CATEGORY = "Runware/Provider Settings" + DESCRIPTION = "Create a prompt/duration segment for Kling multiPrompt. Connect multiple segments to Runware Kling Provider Settings MultiPrompt." + + def createSegment(self, prompt: str, duration: int) -> tuple[Dict[str, Any]]: + return ({"prompt": prompt.strip(), "duration": int(duration)},) + + +NODE_CLASS_MAPPINGS = { + "RunwareKlingMultiPromptSegment": RunwareKlingMultiPromptSegment, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "RunwareKlingMultiPromptSegment": "Runware Kling MultiPrompt Segment", +} diff --git a/modules/providerSettings/klingProviderSettings.py b/modules/providerSettings/klingProviderSettings.py index c4e32d7..5a91f8d 100644 --- a/modules/providerSettings/klingProviderSettings.py +++ b/modules/providerSettings/klingProviderSettings.py @@ -3,7 +3,7 @@ Runware KlingAI Provider Settings Node Provides KlingAI-specific settings for video generation """ -from typing import Optional, Dict, Any +from typing import Optional, Dict, Any, List class RunwareKlingProviderSettings: @@ -98,6 +98,27 @@ class RunwareKlingProviderSettings: "tooltip": "Character orientation mode. 'image': has the same orientation as the person in the picture (reference video duration should not exceed 10 seconds). 'video': consistent with the orientation of the characters in the video (reference video duration should not exceed 30 seconds). Only used when 'Use Character Orientation' is enabled.", "default": "image", }), + "useMultiprompt": ("BOOLEAN", { + "tooltip": "Enable to include multiPrompt in provider settings. When enabled, connect Runware Kling MultiPrompt Segment nodes.", + "default": False, + "label_on": "Enabled", + "label_off": "Disabled", + }), + "MultiPrompt Segment 1": ("RUNWAREKLINGMULTIPROMPTSEGMENT", { + "tooltip": "Connect a Runware Kling MultiPrompt Segment. Only used when 'Use Multiprompt' is enabled.", + }), + "MultiPrompt Segment 2": ("RUNWAREKLINGMULTIPROMPTSEGMENT", { + "tooltip": "Connect a Runware Kling MultiPrompt Segment. Only used when 'Use Multiprompt' is enabled.", + }), + "MultiPrompt Segment 3": ("RUNWAREKLINGMULTIPROMPTSEGMENT", { + "tooltip": "Connect a Runware Kling MultiPrompt Segment. Only used when 'Use Multiprompt' is enabled.", + }), + "MultiPrompt Segment 4": ("RUNWAREKLINGMULTIPROMPTSEGMENT", { + "tooltip": "Connect a Runware Kling MultiPrompt Segment. Only used when 'Use Multiprompt' is enabled.", + }), + "MultiPrompt Segment 5": ("RUNWAREKLINGMULTIPROMPTSEGMENT", { + "tooltip": "Connect a Runware Kling MultiPrompt Segment. Only used when 'Use Multiprompt' is enabled.", + }), } } @@ -120,6 +141,7 @@ class RunwareKlingProviderSettings: useKeepOriginalSound = kwargs.get("useKeepOriginalSound", False) useSound = kwargs.get("useSound", False) useCharacterOrientation = kwargs.get("useCharacterOrientation", False) + useMultiprompt = kwargs.get("useMultiprompt", False) # Get value parameters cameraControl = kwargs.get("cameraControl", "none") @@ -171,6 +193,21 @@ class RunwareKlingProviderSettings: if useCharacterOrientation and characterOrientation: klingSettings["characterOrientation"] = characterOrientation + # Add multiPrompt only if useMultiprompt is enabled + if useMultiprompt: + segments: List[Dict[str, Any]] = [] + for i in range(1, 6): + segment = kwargs.get(f"MultiPrompt Segment {i}") + if segment is not None and isinstance(segment, dict): + prompt = segment.get("prompt", "").strip() + if prompt: + segments.append({ + "prompt": prompt, + "duration": int(segment.get("duration", 4)), + }) + if segments: + klingSettings["multiPrompt"] = segments + # Clean up None values klingSettings = {k: v for k, v in klingSettings.items() if v is not None} diff --git a/modules/providerSettings/klingProviderSettingsMultiPrompt.py b/modules/providerSettings/klingProviderSettingsMultiPrompt.py new file mode 100644 index 0000000..e3c1ac9 --- /dev/null +++ b/modules/providerSettings/klingProviderSettingsMultiPrompt.py @@ -0,0 +1,88 @@ +""" +Runware Kling Provider Settings MultiPrompt Node +Adds multiPrompt to Kling provider settings. Connects to Runware Kling Provider Settings +and outputs merged provider settings for Video Inference. +""" + +from typing import Dict, Any, List + + +class RunwareKlingProviderSettingsMultiPrompt: + """Runware Kling Provider Settings MultiPrompt Node""" + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "providerSettings": ("RUNWAREPROVIDERSETTINGS", { + "tooltip": "Connect Runware KlingAI Provider Settings to merge with multiPrompt", + }), + }, + "optional": { + "MultiPrompt Segment 1": ("RUNWAREKLINGMULTIPROMPTSEGMENT", { + "tooltip": "Connect a Runware Kling MultiPrompt Segment", + }), + "MultiPrompt Segment 2": ("RUNWAREKLINGMULTIPROMPTSEGMENT", { + "tooltip": "Connect a Runware Kling MultiPrompt Segment", + }), + "MultiPrompt Segment 3": ("RUNWAREKLINGMULTIPROMPTSEGMENT", { + "tooltip": "Connect a Runware Kling MultiPrompt Segment", + }), + "MultiPrompt Segment 4": ("RUNWAREKLINGMULTIPROMPTSEGMENT", { + "tooltip": "Connect a Runware Kling MultiPrompt Segment", + }), + "MultiPrompt Segment 5": ("RUNWAREKLINGMULTIPROMPTSEGMENT", { + "tooltip": "Connect a Runware Kling MultiPrompt Segment", + }), + } + } + + RETURN_TYPES = ("RUNWAREPROVIDERSETTINGS",) + RETURN_NAMES = ("Provider Settings",) + FUNCTION = "mergeProviderSettings" + CATEGORY = "Runware/Provider Settings" + DESCRIPTION = "Add multiPrompt to Kling provider settings. Connect Runware KlingAI Provider Settings and one or more Runware Kling MultiPrompt Segment nodes. Output connects to Runware Video Inference." + + def mergeProviderSettings(self, **kwargs) -> tuple[Dict[str, Any]]: + """Merge Kling provider settings with multiPrompt segments""" + + provider_settings = kwargs.get("providerSettings") + segments: List[Dict[str, Any]] = [] + + for i in range(1, 6): + segment = kwargs.get(f"MultiPrompt Segment {i}") + if segment is not None and isinstance(segment, dict): + prompt = segment.get("prompt", "").strip() + if prompt: + segments.append({ + "prompt": prompt, + "duration": int(segment.get("duration", 4)), + }) + + # Start with existing provider settings or empty dict + if isinstance(provider_settings, dict): + # May be flat (from Kling) or wrapped {"klingai": {...}} + if "klingai" in provider_settings: + kling_settings = dict(provider_settings["klingai"]) + else: + kling_settings = dict(provider_settings) + else: + kling_settings = {} + + if segments: + kling_settings["multiPrompt"] = segments + + if not kling_settings: + return ({},) + + # Output format expected by video inference: wrap with klingai if flat + return ({"klingai": kling_settings},) + + +NODE_CLASS_MAPPINGS = { + "RunwareKlingProviderSettingsMultiPrompt": RunwareKlingProviderSettingsMultiPrompt, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "RunwareKlingProviderSettingsMultiPrompt": "Runware Kling Provider Settings MultiPrompt", +} diff --git a/modules/videoModelSearch.py b/modules/videoModelSearch.py index 5075113..7e12bb4 100644 --- a/modules/videoModelSearch.py +++ b/modules/videoModelSearch.py @@ -18,6 +18,8 @@ class videoModelSearch: "klingai:7@1 (KlingAI Lip-Sync)", "klingai:kling@o1 (Kling VIDEO O1)", "klingai:kling-video@2.6-pro (Kling VIDEO 2.6 Pro)", + "klingai:kling-video@3-pro (Kling VIDEO 3.0 Pro)", + "klingai:kling-video@3-standard (Kling VIDEO 3.0 Standard)", ], "Veo": [ "google:2@0 (Veo 2.0)", @@ -132,6 +134,8 @@ class videoModelSearch: "klingai:7@1": {"width": 0, "height": 0}, "klingai:kling@o1": {"width": 1440, "height": 1440}, "klingai:kling-video@2.6-pro": {"width": 1920, "height": 1080}, + "klingai:kling-video@3-pro": {"width": 1920, "height": 1080}, + "klingai:kling-video@3-standard": {"width": 1920, "height": 1080}, # Veo Models "google:2@0": {"width": 1280, "height": 720}, @@ -245,6 +249,8 @@ class videoModelSearch: "klingai:7@1": None, # No resolution support "klingai:kling@o1": None, # No standard resolution (1440x1440) "klingai:kling-video@2.6-pro": "1080p", + "klingai:kling-video@3-pro": "1080p", + "klingai:kling-video@3-standard": "1080p", # Veo Models "google:2@0": "720p", diff --git a/workflows/Runware_Video_Inference_Kling_Multiprompt.json b/workflows/Runware_Video_Inference_Kling_Multiprompt.json new file mode 100644 index 0000000..58f1778 --- /dev/null +++ b/workflows/Runware_Video_Inference_Kling_Multiprompt.json @@ -0,0 +1 @@ +{"id":"62fd2431-54ee-45ea-ad42-ad0ad64150bc","revision":0,"last_node_id":9,"last_link_id":6,"nodes":[{"id":3,"type":"Runware Video Model Search","pos":[34.05699157714844,236.76271057128906],"size":[287.380859375,250],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"Model Search","name":"Model Search","type":"STRING","widget":{"name":"Model Search"},"link":null},{"localized_name":"Model Architecture","name":"Model Architecture","type":"COMBO","widget":{"name":"Model Architecture"},"link":null},{"localized_name":"VideoList","name":"VideoList","type":"COMBO","widget":{"name":"VideoList"},"link":null},{"localized_name":"Use Search Value","name":"Use Search Value","type":"BOOLEAN","widget":{"name":"Use Search Value"},"link":null},{"localized_name":"useCustomDimensions","name":"useCustomDimensions","type":"COMBO","widget":{"name":"useCustomDimensions"},"link":null},{"localized_name":"Width","name":"Width","type":"INT","widget":{"name":"Width"},"link":null},{"localized_name":"Height","name":"Height","type":"INT","widget":{"name":"Height"},"link":null},{"localized_name":"useResolution","name":"useResolution","type":"BOOLEAN","widget":{"name":"useResolution"},"link":null},{"localized_name":"resolution","name":"resolution","type":"COMBO","widget":{"name":"resolution"},"link":null}],"outputs":[{"localized_name":"Runware Video Model","name":"Runware Video Model","type":"RUNWAREVIDEOMODEL","links":[1]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"a4a26667a03e63511d48db870f7e1acc31b5105b","Node name for S&R":"Runware Video Model Search"},"widgets_values":["","KlingAI","klingai:kling-video@3-pro (Kling VIDEO 3.0 Pro)",false,"Model Default",1920,1080,false,"1080p"],"bgcolor":"#5345bf"},{"id":6,"type":"Runware Kling MultiPrompt Segment","pos":[1348.8873291015625,238.06365966796875],"size":[400,200],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"prompt","name":"prompt","type":"STRING","widget":{"name":"prompt"},"link":null},{"localized_name":"duration","name":"duration","type":"INT","widget":{"name":"duration"},"link":null}],"outputs":[{"localized_name":"MultiPrompt Segment","name":"MultiPrompt Segment","type":"RUNWAREKLINGMULTIPROMPTSEGMENT","links":[4]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"a4a26667a03e63511d48db870f7e1acc31b5105b","Node name for S&R":"Runware Kling MultiPrompt Segment"},"widgets_values":["A peaceful lake at sunrise",4],"bgcolor":"#5345bf"},{"id":8,"type":"Runware Kling MultiPrompt Segment","pos":[1352.1761474609375,509.6156005859375],"size":[400,200],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"prompt","name":"prompt","type":"STRING","widget":{"name":"prompt"},"link":null},{"localized_name":"duration","name":"duration","type":"INT","widget":{"name":"duration"},"link":null}],"outputs":[{"localized_name":"MultiPrompt Segment","name":"MultiPrompt Segment","type":"RUNWAREKLINGMULTIPROMPTSEGMENT","links":[5]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"a4a26667a03e63511d48db870f7e1acc31b5105b","Node name for S&R":"Runware Kling MultiPrompt Segment"},"widgets_values":[" Birds flying over the lake",4],"bgcolor":"#5345bf"},{"id":9,"type":"Runware Kling MultiPrompt Segment","pos":[1366.2164306640625,795.5298461914062],"size":[400,200],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"prompt","name":"prompt","type":"STRING","widget":{"name":"prompt"},"link":null},{"localized_name":"duration","name":"duration","type":"INT","widget":{"name":"duration"},"link":null}],"outputs":[{"localized_name":"MultiPrompt Segment","name":"MultiPrompt Segment","type":"RUNWAREKLINGMULTIPROMPTSEGMENT","links":[6]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"a4a26667a03e63511d48db870f7e1acc31b5105b","Node name for S&R":"Runware Kling MultiPrompt Segment"},"widgets_values":[" Sunset reflecting on water",4],"bgcolor":"#5345bf"},{"id":1,"type":"Runware Video Inference","pos":[386.22015380859375,243.1965789794922],"size":[400,856],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"Model","name":"Model","type":"RUNWAREVIDEOMODEL","link":1},{"localized_name":"frameImages","name":"frameImages","shape":7,"type":"RUNWAREFRAMEIMAGES","link":null},{"localized_name":"referenceImages","name":"referenceImages","shape":7,"type":"RUNWAREREFERENCEIMAGES","link":null},{"localized_name":"providerSettings","name":"providerSettings","shape":7,"type":"RUNWAREPROVIDERSETTINGS","link":3},{"localized_name":"inputAudios","name":"inputAudios","shape":7,"type":"RUNWAREINPUTAUDIOS","link":null},{"localized_name":"referenceVideos","name":"referenceVideos","shape":7,"type":"RUNWAREREFERENCEVIDEOS","link":null},{"localized_name":"inputs","name":"inputs","shape":7,"type":"RUNWAREVIDEOINFERENCEINPUTS","link":null},{"localized_name":"safetyInputs","name":"safetyInputs","shape":7,"type":"RUNWARESAFETYINPUTS","link":null},{"localized_name":"videoAdvancedFeatureInputs","name":"videoAdvancedFeatureInputs","shape":7,"type":"RUNWAREVIDEOADVANCEDFEATUREINPUTS","link":null},{"localized_name":"Accelerator","name":"Accelerator","shape":7,"type":"RUNWAREACCELERATOR","link":null},{"localized_name":"Multi Inference Mode","name":"Multi Inference Mode","type":"BOOLEAN","widget":{"name":"Multi Inference Mode"},"link":null},{"localized_name":"Prompt Weighting","name":"Prompt Weighting","type":"COMBO","widget":{"name":"Prompt Weighting"},"link":null},{"localized_name":"useDuration","name":"useDuration","type":"BOOLEAN","widget":{"name":"useDuration"},"link":null},{"localized_name":"duration","name":"duration","type":"INT","widget":{"name":"duration"},"link":null},{"localized_name":"useFps","name":"useFps","type":"BOOLEAN","widget":{"name":"useFps"},"link":null},{"localized_name":"fps","name":"fps","type":"INT","widget":{"name":"fps"},"link":null},{"localized_name":"outputFormat","name":"outputFormat","type":"COMBO","widget":{"name":"outputFormat"},"link":null},{"localized_name":"useSeed","name":"useSeed","type":"BOOLEAN","widget":{"name":"useSeed"},"link":null},{"localized_name":"seed","name":"seed","type":"INT","widget":{"name":"seed"},"link":null},{"localized_name":"useSteps","name":"useSteps","type":"BOOLEAN","widget":{"name":"useSteps"},"link":null},{"localized_name":"steps","name":"steps","type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"useBatchSize","name":"useBatchSize","type":"BOOLEAN","widget":{"name":"useBatchSize"},"link":null},{"localized_name":"batchSize","name":"batchSize","type":"INT","widget":{"name":"batchSize"},"link":null},{"localized_name":"useSchedulers","name":"useSchedulers","type":"BOOLEAN","widget":{"name":"useSchedulers"},"link":null},{"localized_name":"scheduler","name":"scheduler","type":"COMBO","widget":{"name":"scheduler"},"link":null},{"localized_name":"useCFGScale","name":"useCFGScale","type":"BOOLEAN","widget":{"name":"useCFGScale"},"link":null},{"localized_name":"cfgScale","name":"cfgScale","type":"FLOAT","widget":{"name":"cfgScale"},"link":null},{"localized_name":"acceleration","name":"acceleration","type":"COMBO","widget":{"name":"acceleration"},"link":null},{"localized_name":"positivePrompt","name":"positivePrompt","shape":7,"type":"STRING","widget":{"name":"positivePrompt"},"link":null},{"localized_name":"negativePrompt","name":"negativePrompt","shape":7,"type":"STRING","widget":{"name":"negativePrompt"},"link":null},{"localized_name":"speechVoice","name":"speechVoice","shape":7,"type":"STRING","widget":{"name":"speechVoice"},"link":null},{"localized_name":"speechText","name":"speechText","shape":7,"type":"STRING","widget":{"name":"speechText"},"link":null}],"outputs":[{"localized_name":"VIDEO","name":"VIDEO","type":"VIDEO","links":[2]},{"localized_name":"RW-Task","name":"RW-Task","type":"RUNWARETASK","links":null},{"localized_name":"OUTPUT","name":"OUTPUT","type":"RUNWARETASK","links":null}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"a4a26667a03e63511d48db870f7e1acc31b5105b","Node name for S&R":"Runware Video Inference"},"widgets_values":[false,"Disabled",true,12,false,24,"mp4",false,1275056785,"randomize",false,20,false,1,false,"euler",false,5,"none","","","",""],"bgcolor":"#5345bf"},{"id":5,"type":"Runware KlingAI Provider Settings","pos":[834.1646728515625,609.8651123046875],"size":[400,630],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"MultiPrompt Segment 1","name":"MultiPrompt Segment 1","shape":7,"type":"RUNWAREKLINGMULTIPROMPTSEGMENT","link":4},{"localized_name":"MultiPrompt Segment 2","name":"MultiPrompt Segment 2","shape":7,"type":"RUNWAREKLINGMULTIPROMPTSEGMENT","link":5},{"localized_name":"MultiPrompt Segment 3","name":"MultiPrompt Segment 3","shape":7,"type":"RUNWAREKLINGMULTIPROMPTSEGMENT","link":6},{"localized_name":"MultiPrompt Segment 4","name":"MultiPrompt Segment 4","shape":7,"type":"RUNWAREKLINGMULTIPROMPTSEGMENT","link":null},{"localized_name":"MultiPrompt Segment 5","name":"MultiPrompt Segment 5","shape":7,"type":"RUNWAREKLINGMULTIPROMPTSEGMENT","link":null},{"localized_name":"useCameraControl","name":"useCameraControl","shape":7,"type":"BOOLEAN","widget":{"name":"useCameraControl"},"link":null},{"localized_name":"cameraControl","name":"cameraControl","shape":7,"type":"COMBO","widget":{"name":"cameraControl"},"link":null},{"localized_name":"useSoundVolume","name":"useSoundVolume","shape":7,"type":"BOOLEAN","widget":{"name":"useSoundVolume"},"link":null},{"localized_name":"soundVolume","name":"soundVolume","shape":7,"type":"FLOAT","widget":{"name":"soundVolume"},"link":null},{"localized_name":"useOriginalAudioVolume","name":"useOriginalAudioVolume","shape":7,"type":"BOOLEAN","widget":{"name":"useOriginalAudioVolume"},"link":null},{"localized_name":"originalAudioVolume","name":"originalAudioVolume","shape":7,"type":"FLOAT","widget":{"name":"originalAudioVolume"},"link":null},{"localized_name":"useSoundEffectPrompt","name":"useSoundEffectPrompt","shape":7,"type":"BOOLEAN","widget":{"name":"useSoundEffectPrompt"},"link":null},{"localized_name":"soundEffectPrompt","name":"soundEffectPrompt","shape":7,"type":"STRING","widget":{"name":"soundEffectPrompt"},"link":null},{"localized_name":"useBgmPrompt","name":"useBgmPrompt","shape":7,"type":"BOOLEAN","widget":{"name":"useBgmPrompt"},"link":null},{"localized_name":"bgmPrompt","name":"bgmPrompt","shape":7,"type":"STRING","widget":{"name":"bgmPrompt"},"link":null},{"localized_name":"useAsmrMode","name":"useAsmrMode","shape":7,"type":"BOOLEAN","widget":{"name":"useAsmrMode"},"link":null},{"localized_name":"asmrMode","name":"asmrMode","shape":7,"type":"BOOLEAN","widget":{"name":"asmrMode"},"link":null},{"localized_name":"useKeepOriginalSound","name":"useKeepOriginalSound","shape":7,"type":"BOOLEAN","widget":{"name":"useKeepOriginalSound"},"link":null},{"localized_name":"keepOriginalSound","name":"keepOriginalSound","shape":7,"type":"BOOLEAN","widget":{"name":"keepOriginalSound"},"link":null},{"localized_name":"useSound","name":"useSound","shape":7,"type":"BOOLEAN","widget":{"name":"useSound"},"link":null},{"localized_name":"sound","name":"sound","shape":7,"type":"BOOLEAN","widget":{"name":"sound"},"link":null},{"localized_name":"useCharacterOrientation","name":"useCharacterOrientation","shape":7,"type":"BOOLEAN","widget":{"name":"useCharacterOrientation"},"link":null},{"localized_name":"characterOrientation","name":"characterOrientation","shape":7,"type":"COMBO","widget":{"name":"characterOrientation"},"link":null},{"localized_name":"useMultiprompt","name":"useMultiprompt","shape":7,"type":"BOOLEAN","widget":{"name":"useMultiprompt"},"link":null}],"outputs":[{"localized_name":"Provider Settings","name":"Provider Settings","type":"RUNWAREPROVIDERSETTINGS","links":[3]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"a4a26667a03e63511d48db870f7e1acc31b5105b","Node name for S&R":"Runware KlingAI Provider Settings"},"widgets_values":[false,"none",false,1,false,1,false,"",false,"",false,false,false,true,false,false,false,"image",true],"bgcolor":"#5345bf"},{"id":4,"type":"SaveVideo","pos":[850.6357421875,227.62628173828125],"size":[374,324.281005859375],"flags":{},"order":6,"mode":0,"inputs":[{"localized_name":"video","name":"video","type":"VIDEO","link":2},{"localized_name":"filename_prefix","name":"filename_prefix","type":"STRING","widget":{"name":"filename_prefix"},"link":null},{"localized_name":"format","name":"format","type":"COMBO","widget":{"name":"format"},"link":null},{"localized_name":"codec","name":"codec","type":"COMBO","widget":{"name":"codec"},"link":null}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.46","Node name for S&R":"SaveVideo"},"widgets_values":["video/ComfyUI","auto","auto"]}],"links":[[1,3,0,1,0,"RUNWAREVIDEOMODEL"],[2,1,0,4,0,"VIDEO"],[3,5,0,1,3,"RUNWAREPROVIDERSETTINGS"],[4,6,0,5,0,"RUNWAREKLINGMULTIPROMPTSEGMENT"],[5,8,0,5,1,"RUNWAREKLINGMULTIPROMPTSEGMENT"],[6,9,0,5,2,"RUNWAREKLINGMULTIPROMPTSEGMENT"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6830134553650705,"offset":[363.9236856746131,-36.26381474947803]}},"version":0.4} \ No newline at end of file