From f60309e219e27fd32ed5914d529e77aa146c3924 Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Wed, 15 Apr 2026 10:01:24 +0530 Subject: [PATCH 01/19] Added additional settings for videoInference models --- clientlibs/utils.js | 6 ++++++ modules/threeDInference.py | 2 +- modules/videoModelSearch.py | 6 ++++++ modules/videoSettings.py | 8 ++++---- workflows/Runware_Video_Inference_Seedance_2.json | 1 + 5 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 workflows/Runware_Video_Inference_Seedance_2.json diff --git a/clientlibs/utils.js b/clientlibs/utils.js index 6a0e107..7dd3ecc 100644 --- a/clientlibs/utils.js +++ b/clientlibs/utils.js @@ -2571,6 +2571,8 @@ function videoModelSearchFilterHandler(videoModelSearchNode) { "bytedance:2@1 (Seedance 1.0 Pro)", "bytedance:1@1 (Seedance 1.0 Lite)", "bytedance:5@1 (OmniHuman 1)", "bytedance:5@2 (OmniHuman 1.5)", "bytedance:seedance@1.5-pro (Seedance 1.5 Pro)", + "bytedance:seedance@2.0-fast (Seedance 2.0 Fast)", + "bytedance:seedance@2.0 (Seedance 2.0)", ], "MiniMax": [ "minimax:1@1 (MiniMax 01 Base)", "minimax:2@1 (MiniMax 01 Director)", @@ -2681,6 +2683,8 @@ function videoModelSearchFilterHandler(videoModelSearchNode) { "bytedance:5@1": {"width": 1024, "height": 1024}, "bytedance:5@2": {"width": 1024, "height": 1024}, "bytedance:seedance@1.5-pro": {"width": 864, "height": 496}, + "bytedance:seedance@2.0-fast": {"width": 864, "height": 496}, + "bytedance:seedance@2.0": {"width": 864, "height": 496}, "minimax:1@1": {"width": 1366, "height": 768}, "minimax:2@1": {"width": 1366, "height": 768}, "minimax:2@3": {"width": 1366, "height": 768}, @@ -2770,6 +2774,8 @@ function videoModelSearchFilterHandler(videoModelSearchNode) { "bytedance:5@1": null, // No resolution support "bytedance:5@2": null, // No resolution support "bytedance:seedance@1.5-pro": "480p", + "bytedance:seedance@2.0-fast": "480p", + "bytedance:seedance@2.0": "480p", "minimax:1@1": "768p", "minimax:2@1": "768p", "minimax:2@3": "768p", diff --git a/modules/threeDInference.py b/modules/threeDInference.py index 22362c1..3a23d00 100644 --- a/modules/threeDInference.py +++ b/modules/threeDInference.py @@ -15,7 +15,7 @@ class threeDInference: } # Output formats - OUTPUT_FORMATS = ["GLB", "PLY"] + OUTPUT_FORMATS = ["GLB", "PLY", "FBX"] @classmethod def INPUT_TYPES(cls): diff --git a/modules/videoModelSearch.py b/modules/videoModelSearch.py index 6650b94..9853828 100644 --- a/modules/videoModelSearch.py +++ b/modules/videoModelSearch.py @@ -39,6 +39,8 @@ class videoModelSearch: "bytedance:5@1 (OmniHuman 1)", "bytedance:5@2 (OmniHuman 1.5)", "bytedance:seedance@1.5-pro (Seedance 1.5 Pro)", + "bytedance:seedance@2.0-fast (Seedance 2.0 Fast)", + "bytedance:seedance@2.0 (Seedance 2.0)", ], "MiniMax": [ "minimax:1@1 (MiniMax 01 Base)", @@ -171,6 +173,8 @@ class videoModelSearch: "bytedance:5@1": {"width": 1024, "height": 1024}, "bytedance:5@2": {"width": 1024, "height": 1024}, "bytedance:seedance@1.5-pro": {"width": 864, "height": 496}, + "bytedance:seedance@2.0-fast": {"width": 864, "height": 496}, + "bytedance:seedance@2.0": {"width": 864, "height": 496}, # MiniMax Models "minimax:1@1": {"width": 1366, "height": 768}, @@ -302,6 +306,8 @@ class videoModelSearch: "bytedance:5@1": None, # No resolution support (fixed 1024x1024) "bytedance:5@2": None, # No resolution support (fixed 1024x1024) "bytedance:seedance@1.5-pro": "480p", + "bytedance:seedance@2.0-fast": "480p", + "bytedance:seedance@2.0": "480p", # MiniMax Models (support both 768p and 720p, using 768p as primary) "minimax:1@1": "768p", diff --git a/modules/videoSettings.py b/modules/videoSettings.py index 60eeb28..1e8d3fa 100644 --- a/modules/videoSettings.py +++ b/modules/videoSettings.py @@ -26,21 +26,21 @@ class RunwareVideoSettings: }), "useAudio": ("BOOLEAN", { "tooltip": "Enable to include audio (save video with audio) in video inference settings.", - "default": True, + "default": False, }), "audio": ("BOOLEAN", { "tooltip": "Save the video with audio. Only used when 'Use Audio' is enabled.", - "default": True, + "default": False, "label_on": "Enabled", "label_off": "Disabled", }), "usePromptUpsampling": ("BOOLEAN", { "tooltip": "Enable to include promptUpsampling (enhance prompt automatically) in video inference settings.", - "default": True, + "default": False, }), "promptUpsampling": ("BOOLEAN", { "tooltip": "Enhance prompt automatically for better results. Only used when 'Use Prompt Upsampling' is enabled.", - "default": True, + "default": False, "label_on": "Enabled", "label_off": "Disabled", }), diff --git a/workflows/Runware_Video_Inference_Seedance_2.json b/workflows/Runware_Video_Inference_Seedance_2.json new file mode 100644 index 0000000..d959a77 --- /dev/null +++ b/workflows/Runware_Video_Inference_Seedance_2.json @@ -0,0 +1 @@ +{"id":"1cbc5d83-71d6-47e1-af45-3f88fe6bda01","revision":0,"last_node_id":7,"last_link_id":6,"nodes":[{"id":2,"type":"Runware Video Model Search","pos":[-164.64581298828125,-149.29281616210938],"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":[2]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ae704f0664e4f830893066819e080b3fa80de4db","Node name for S&R":"Runware Video Model Search"},"widgets_values":["","Bytedance","bytedance:seedance@2.0-fast (Seedance 2.0 Fast)",false,"Model Default",864,480,false,"1080p"],"bgcolor":"#5345bf"},{"id":5,"type":"Runware Video Inference Inputs","pos":[-97.2105712890625,175.69451904296875],"size":[320.0390625,354],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"Image","name":"Image","shape":7,"type":"IMAGE","link":null},{"localized_name":"Frame Images","name":"Frame Images","shape":7,"type":"RUNWAREVIDEOINPUTSFRAMEIMAGES","link":4},{"localized_name":"Audio Inputs","name":"Audio Inputs","shape":7,"type":"RUNWAREAUDIOINPUT","link":null},{"localized_name":"Speech Inputs","name":"Speech Inputs","shape":7,"type":"RUNWARESPEECHINPUT","link":null},{"localized_name":"Mask","name":"Mask","shape":7,"type":"IMAGE","link":null},{"localized_name":"Frame","name":"Frame","shape":7,"type":"IMAGE","link":null},{"localized_name":"Background","name":"Background","shape":7,"type":"IMAGE","link":null},{"localized_name":"References","name":"References","shape":7,"type":"RUNWAREVIDEOINPUTSREFERENCEIMAGES","link":null},{"localized_name":"Reference Videos","name":"Reference Videos","shape":7,"type":"RUNWAREREFERENCEVIDEOS","link":null},{"localized_name":"Reference Voices","name":"Reference Voices","shape":7,"type":"RUNWAREREFERENCEVOICES","link":null},{"localized_name":"Elements","name":"Elements","shape":7,"type":"RUNWAREVIDEOINFERENCEELEMENTS","link":null},{"localized_name":"Avatar","name":"Avatar","shape":7,"type":"STRING","widget":{"name":"Avatar"},"link":null},{"localized_name":"Audio","name":"Audio","shape":7,"type":"STRING","widget":{"name":"Audio"},"link":null},{"localized_name":"Video","name":"Video","shape":7,"type":"STRING","widget":{"name":"Video"},"link":null},{"localized_name":"draftId","name":"draftId","shape":7,"type":"STRING","widget":{"name":"draftId"},"link":null},{"localized_name":"videoId","name":"videoId","shape":7,"type":"STRING","widget":{"name":"videoId"},"link":null}],"outputs":[{"localized_name":"Video Inference Inputs","name":"Video Inference Inputs","type":"RUNWAREVIDEOINFERENCEINPUTS","links":[5]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ae704f0664e4f830893066819e080b3fa80de4db","Node name for S&R":"Runware Video Inference Inputs"},"widgets_values":["","","","",""],"bgcolor":"#5345bf"},{"id":6,"type":"LoadImage","pos":[-480.1459045410156,-187.5713348388672],"size":[274.080078125,314.0000305175781],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[3]},{"localized_name":"MASK","name":"MASK","type":"MASK","links":null}],"properties":{"cnr_id":"comfy-core","ver":"0.3.46","Node name for S&R":"LoadImage"},"widgets_values":["Van_Gogh_-_Starry_Night_-_Google_Art_Project.jpg","image"]},{"id":7,"type":"Runware Video Inputs Frame Images","pos":[-496.8704528808594,266.64013671875],"size":[331.5357360839844,190],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"image1","name":"image1","shape":7,"type":"IMAGE","link":3},{"localized_name":"image2","name":"image2","shape":7,"type":"IMAGE","link":null},{"localized_name":"image3","name":"image3","shape":7,"type":"IMAGE","link":null},{"localized_name":"image4","name":"image4","shape":7,"type":"IMAGE","link":null},{"localized_name":"frame1 position","name":"frame1 position","shape":7,"type":"STRING","widget":{"name":"frame1 position"},"link":null},{"localized_name":"frame2 position","name":"frame2 position","shape":7,"type":"STRING","widget":{"name":"frame2 position"},"link":null},{"localized_name":"frame3 position","name":"frame3 position","shape":7,"type":"STRING","widget":{"name":"frame3 position"},"link":null},{"localized_name":"frame4 position","name":"frame4 position","shape":7,"type":"STRING","widget":{"name":"frame4 position"},"link":null}],"outputs":[{"localized_name":"Video Inputs Frame Images","name":"Video Inputs Frame Images","type":"RUNWAREVIDEOINPUTSFRAMEIMAGES","links":[4]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ae704f0664e4f830893066819e080b3fa80de4db","Node name for S&R":"Runware Video Inputs Frame Images"},"widgets_values":["","","",""],"bgcolor":"#5345bf"},{"id":1,"type":"Runware Video Inference","pos":[299.4468078613281,-187.8292694091797],"size":[400,818],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"Model","name":"Model","type":"RUNWAREVIDEOMODEL","link":2},{"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":null},{"localized_name":"inputAudios","name":"inputAudios","shape":7,"type":"RUNWAREINPUTAUDIOS","link":null},{"localized_name":"referenceVideos","name":"referenceVideos","shape":7,"type":"RUNWAREREFERENCEVIDEOS","link":null},{"localized_name":"speech","name":"speech","shape":7,"type":"RUNWAREVIDEOINFERENCESPEECHINPUT","link":null},{"localized_name":"inputs","name":"inputs","shape":7,"type":"RUNWAREVIDEOINFERENCEINPUTS","link":5},{"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":"settings","name":"settings","shape":7,"type":"RUNWAREVIDEOSETTINGS","link":1},{"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}],"outputs":[{"localized_name":"VIDEO","name":"VIDEO","type":"VIDEO","links":[6]},{"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":"ae704f0664e4f830893066819e080b3fa80de4db","Node name for S&R":"Runware Video Inference"},"widgets_values":[false,"Disabled",true,5,false,24,"mp4",false,1018182910,"randomize",false,20,false,1,false,"euler",false,5,"none","Crow flying in the night sky!",""],"bgcolor":"#5345bf"},{"id":3,"type":"SaveVideo","pos":[742.50830078125,-187.757568359375],"size":[270,299.0638427734375],"flags":{},"order":6,"mode":0,"inputs":[{"localized_name":"video","name":"video","type":"VIDEO","link":6},{"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"]},{"id":4,"type":"Runware Video Inference Settings","pos":[1044.301513671875,-60.991512298583984],"size":[400,640],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"useDraft","name":"useDraft","shape":7,"type":"BOOLEAN","widget":{"name":"useDraft"},"link":null},{"localized_name":"draft","name":"draft","shape":7,"type":"BOOLEAN","widget":{"name":"draft"},"link":null},{"localized_name":"useAudio","name":"useAudio","shape":7,"type":"BOOLEAN","widget":{"name":"useAudio"},"link":null},{"localized_name":"audio","name":"audio","shape":7,"type":"BOOLEAN","widget":{"name":"audio"},"link":null},{"localized_name":"usePromptUpsampling","name":"usePromptUpsampling","shape":7,"type":"BOOLEAN","widget":{"name":"usePromptUpsampling"},"link":null},{"localized_name":"promptUpsampling","name":"promptUpsampling","shape":7,"type":"BOOLEAN","widget":{"name":"promptUpsampling"},"link":null},{"localized_name":"useBackgroundColor","name":"useBackgroundColor","shape":7,"type":"BOOLEAN","widget":{"name":"useBackgroundColor"},"link":null},{"localized_name":"backgroundColor","name":"backgroundColor","shape":7,"type":"STRING","widget":{"name":"backgroundColor"},"link":null},{"localized_name":"useRemoveBackground","name":"useRemoveBackground","shape":7,"type":"BOOLEAN","widget":{"name":"useRemoveBackground"},"link":null},{"localized_name":"removeBackground","name":"removeBackground","shape":7,"type":"BOOLEAN","widget":{"name":"removeBackground"},"link":null},{"localized_name":"useExpressiveness","name":"useExpressiveness","shape":7,"type":"BOOLEAN","widget":{"name":"useExpressiveness"},"link":null},{"localized_name":"expressiveness","name":"expressiveness","shape":7,"type":"COMBO","widget":{"name":"expressiveness"},"link":null},{"localized_name":"useVoiceDescription","name":"useVoiceDescription","shape":7,"type":"BOOLEAN","widget":{"name":"useVoiceDescription"},"link":null},{"localized_name":"voiceDescription","name":"voiceDescription","shape":7,"type":"STRING","widget":{"name":"voiceDescription"},"link":null},{"localized_name":"useStyle","name":"useStyle","shape":7,"type":"BOOLEAN","widget":{"name":"useStyle"},"link":null},{"localized_name":"style","name":"style","shape":7,"type":"COMBO","widget":{"name":"style"},"link":null},{"localized_name":"useThinking","name":"useThinking","shape":7,"type":"BOOLEAN","widget":{"name":"useThinking"},"link":null},{"localized_name":"thinking","name":"thinking","shape":7,"type":"COMBO","widget":{"name":"thinking"},"link":null},{"localized_name":"useMultiClip","name":"useMultiClip","shape":7,"type":"BOOLEAN","widget":{"name":"useMultiClip"},"link":null},{"localized_name":"multiClip","name":"multiClip","shape":7,"type":"BOOLEAN","widget":{"name":"multiClip"},"link":null},{"localized_name":"useShotType","name":"useShotType","shape":7,"type":"BOOLEAN","widget":{"name":"useShotType"},"link":null},{"localized_name":"shotType","name":"shotType","shape":7,"type":"COMBO","widget":{"name":"shotType"},"link":null},{"localized_name":"usePromptExtend","name":"usePromptExtend","shape":7,"type":"BOOLEAN","widget":{"name":"usePromptExtend"},"link":null},{"localized_name":"promptExtend","name":"promptExtend","shape":7,"type":"BOOLEAN","widget":{"name":"promptExtend"},"link":null}],"outputs":[{"localized_name":"settings","name":"settings","type":"RUNWAREVIDEOSETTINGS","links":[1]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ae704f0664e4f830893066819e080b3fa80de4db","Node name for S&R":"Runware Video Inference Settings"},"widgets_values":[false,false,false,true,false,true,false,"",false,false,false,"low",false,"",false,"anime",false,"auto",false,false,false,"single",false,false],"bgcolor":"#5345bf"}],"links":[[1,4,0,1,11,"RUNWAREVIDEOSETTINGS"],[2,2,0,1,0,"RUNWAREVIDEOMODEL"],[3,6,0,7,0,"IMAGE"],[4,7,0,5,1,"RUNWAREVIDEOINPUTSFRAMEIMAGES"],[5,5,0,1,7,"RUNWAREVIDEOINFERENCEINPUTS"],[6,1,0,3,0,"VIDEO"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6057126191083312,"offset":[730.1385408714618,287.3376744931152]}},"version":0.4} \ No newline at end of file From 376495e749d81f4672b6b87f43ab56823c34b4e1 Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Wed, 15 Apr 2026 10:10:09 +0530 Subject: [PATCH 02/19] Removed support for FBX --- modules/threeDInference.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/threeDInference.py b/modules/threeDInference.py index 3a23d00..22362c1 100644 --- a/modules/threeDInference.py +++ b/modules/threeDInference.py @@ -15,7 +15,7 @@ class threeDInference: } # Output formats - OUTPUT_FORMATS = ["GLB", "PLY", "FBX"] + OUTPUT_FORMATS = ["GLB", "PLY"] @classmethod def INPUT_TYPES(cls): From 6fe80557749811c2a9132ae64e68b88cb1cf9e1b Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Wed, 15 Apr 2026 10:12:16 +0530 Subject: [PATCH 03/19] Fixed kwargs for useAudio and usePromptUpsampling --- modules/videoSettings.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/videoSettings.py b/modules/videoSettings.py index 1e8d3fa..5da1d43 100644 --- a/modules/videoSettings.py +++ b/modules/videoSettings.py @@ -139,10 +139,10 @@ class RunwareVideoSettings: """Create settings dict for Video Inference API""" use_draft = kwargs.get("useDraft", False) draft = kwargs.get("draft", False) - use_audio = kwargs.get("useAudio", True) - audio = kwargs.get("audio", True) - use_prompt_upsampling = kwargs.get("usePromptUpsampling", True) - prompt_upsampling = kwargs.get("promptUpsampling", True) + use_audio = kwargs.get("useAudio", False) + audio = kwargs.get("audio", False) + use_prompt_upsampling = kwargs.get("usePromptUpsampling", False) + prompt_upsampling = kwargs.get("promptUpsampling", False) use_background_color = kwargs.get("useBackgroundColor", False) background_color = (kwargs.get("backgroundColor") or "").strip() use_remove_background = kwargs.get("useRemoveBackground", False) From 1c436881538b060d8e5196f96b66a03922630375 Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Wed, 15 Apr 2026 10:49:56 +0530 Subject: [PATCH 04/19] Added support for FBX --- modules/save3D.py | 6 +++--- modules/threeDInference.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/save3D.py b/modules/save3D.py index b7cce20..95ef30e 100644 --- a/modules/save3D.py +++ b/modules/save3D.py @@ -35,7 +35,7 @@ class RunwareSave3D: FUNCTION = "save_3d" OUTPUT_NODE = True CATEGORY = "Runware" - DESCRIPTION = "Save 3D model files (GLB/PLY) from Runware 3D Inference to the output folder." + DESCRIPTION = "Save 3D model files (GLB/PLY/FBX) from Runware 3D Inference to the output folder." def save_3d(self, filenamePrefix="ComfyUI", **kwargs): """Save 3D file from URL""" @@ -55,8 +55,8 @@ class RunwareSave3D: url_without_params = file_url.split('?')[0] extension = url_without_params.split('.')[-1].lower() - if extension not in ["glb", "ply"]: - raise Exception(f"Unsupported 3D file extension '{extension}' from URL. Expected .glb or .ply.") + if extension not in ["glb", "ply", "fbx"]: + raise Exception(f"Unsupported 3D file extension '{extension}' from URL. Expected .glb, .ply, or .fbx.") # Sanitize filenamePrefix to prevent path traversal or arbitrary subdir creation prefix_basename = os.path.basename( diff --git a/modules/threeDInference.py b/modules/threeDInference.py index 22362c1..3a23d00 100644 --- a/modules/threeDInference.py +++ b/modules/threeDInference.py @@ -15,7 +15,7 @@ class threeDInference: } # Output formats - OUTPUT_FORMATS = ["GLB", "PLY"] + OUTPUT_FORMATS = ["GLB", "PLY", "FBX"] @classmethod def INPUT_TYPES(cls): From 1c2c5be9225c1a091e9083b8008f4ce17ceb3742 Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Wed, 15 Apr 2026 10:57:59 +0530 Subject: [PATCH 05/19] Added workflow to test --- workflows/Runware_3D_Inference_Tripo_FBX_Output.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 workflows/Runware_3D_Inference_Tripo_FBX_Output.json diff --git a/workflows/Runware_3D_Inference_Tripo_FBX_Output.json b/workflows/Runware_3D_Inference_Tripo_FBX_Output.json new file mode 100644 index 0000000..1a984c3 --- /dev/null +++ b/workflows/Runware_3D_Inference_Tripo_FBX_Output.json @@ -0,0 +1 @@ +{"id":"92dc56db-c666-467b-8131-b6d0ffffc78f","revision":0,"last_node_id":7,"last_link_id":8,"nodes":[{"id":3,"type":"Runware Save 3D","pos":[703.1738891601562,594.8554077148438],"size":[270,106],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"3dObject","name":"3dObject","type":"STRING","widget":{"name":"3dObject"},"link":7},{"localized_name":"filenamePrefix","name":"filenamePrefix","type":"STRING","widget":{"name":"filenamePrefix"},"link":null},{"localized_name":"filepath","name":"filepath","shape":7,"type":"STRING","widget":{"name":"filepath"},"link":null}],"outputs":[{"localized_name":"filepath","name":"filepath","type":"STRING","links":null}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ede22eee5eec7908ce8998fb649c50db5b4f0b7b","Node name for S&R":"Runware Save 3D"},"widgets_values":["","ComfyUI","/Users/sirshenduganguly/Downloads/Runware-codebase/ComfyUI/output/3d_models/ComfyUI_20260415_105339.fbx"],"bgcolor":"#5345bf"},{"id":5,"type":"LoadImage","pos":[708.8355712890625,861.39111328125],"size":[274.080078125,314],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[3]},{"localized_name":"MASK","name":"MASK","type":"MASK","links":null}],"properties":{"cnr_id":"comfy-core","ver":"0.3.46","Node name for S&R":"LoadImage"},"widgets_values":["tripo_front_input.png","image"]},{"id":6,"type":"LoadImage","pos":[1112.3543701171875,802.2952270507812],"size":[274.080078125,314],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[5]},{"localized_name":"MASK","name":"MASK","type":"MASK","links":null}],"properties":{"cnr_id":"comfy-core","ver":"0.3.46","Node name for S&R":"LoadImage"},"widgets_values":["tripo_left_input.png","image"]},{"id":4,"type":"Runware 3D Inference Inputs","pos":[258.0862121582031,862.798828125],"size":[282.0025329589844,158],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"image","name":"image","shape":7,"type":"IMAGE","link":null},{"localized_name":"mask","name":"mask","shape":7,"type":"IMAGE","link":null},{"localized_name":"images_1","name":"images_1","shape":7,"type":"IMAGE","link":3},{"localized_name":"images_2","name":"images_2","shape":7,"type":"IMAGE","link":5},{"localized_name":"images_3","name":"images_3","shape":7,"type":"IMAGE","link":null},{"localized_name":"images_4","name":"images_4","shape":7,"type":"IMAGE","link":null},{"localized_name":"meshFile","name":"meshFile","shape":7,"type":"STRING","widget":{"name":"meshFile"},"link":null}],"outputs":[{"localized_name":"Inputs","name":"Inputs","type":"RUNWARE3DINFERENCEINPUTS","links":[8]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ede22eee5eec7908ce8998fb649c50db5b4f0b7b","Node name for S&R":"Runware 3D Inference Inputs"},"widgets_values":[""],"bgcolor":"#5345bf"},{"id":7,"type":"Runware 3D Inference","pos":[202.0921173095703,512.4961547851562],"size":[400,276],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"inputs","name":"inputs","shape":7,"type":"RUNWARE3DINFERENCEINPUTS","link":8},{"localized_name":"settings","name":"settings","shape":7,"type":"RUNWARE3DINFERENCESETTINGS","link":6},{"localized_name":"Model","name":"Model","type":"COMBO","widget":{"name":"Model"},"link":null},{"localized_name":"positivePrompt","name":"positivePrompt","type":"STRING","widget":{"name":"positivePrompt"},"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":"outputFormat","name":"outputFormat","type":"COMBO","widget":{"name":"outputFormat"},"link":null},{"localized_name":"useOutputQuality","name":"useOutputQuality","shape":7,"type":"BOOLEAN","widget":{"name":"useOutputQuality"},"link":null},{"localized_name":"outputQuality","name":"outputQuality","shape":7,"type":"INT","widget":{"name":"outputQuality"},"link":null}],"outputs":[{"localized_name":"3dObject","name":"3dObject","type":"STRING","links":[7]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"61dfd039455493e460fde11825222cf9eb4be58b","Node name for S&R":"Runware 3D Inference"},"widgets_values":["Tripo 3D v3.1","",false,296151133,"randomize","FBX",false,95],"bgcolor":"#5345bf"},{"id":2,"type":"Runware 3D Inference Settings","pos":[-187.21949768066406,510.6214904785156],"size":[294.4507751464844,1418],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"sparseStructure","name":"sparseStructure","shape":7,"type":"RUNWARE3DINFERENCESETTINGSLAT","link":null},{"localized_name":"shapeSlat","name":"shapeSlat","shape":7,"type":"RUNWARE3DINFERENCESETTINGSLAT","link":null},{"localized_name":"texSlat","name":"texSlat","shape":7,"type":"RUNWARE3DINFERENCESETTINGSLAT","link":null},{"localized_name":"useTextureSize","name":"useTextureSize","shape":7,"type":"BOOLEAN","widget":{"name":"useTextureSize"},"link":null},{"localized_name":"textureSize","name":"textureSize","shape":7,"type":"INT","widget":{"name":"textureSize"},"link":null},{"localized_name":"useDecimationTarget","name":"useDecimationTarget","shape":7,"type":"BOOLEAN","widget":{"name":"useDecimationTarget"},"link":null},{"localized_name":"decimationTarget","name":"decimationTarget","shape":7,"type":"INT","widget":{"name":"decimationTarget"},"link":null},{"localized_name":"useRemesh","name":"useRemesh","shape":7,"type":"BOOLEAN","widget":{"name":"useRemesh"},"link":null},{"localized_name":"remesh","name":"remesh","shape":7,"type":"BOOLEAN","widget":{"name":"remesh"},"link":null},{"localized_name":"useResolution","name":"useResolution","shape":7,"type":"BOOLEAN","widget":{"name":"useResolution"},"link":null},{"localized_name":"resolution","name":"resolution","shape":7,"type":"COMBO","widget":{"name":"resolution"},"link":null},{"localized_name":"useImageAutoFix","name":"useImageAutoFix","shape":7,"type":"BOOLEAN","widget":{"name":"useImageAutoFix"},"link":null},{"localized_name":"imageAutoFix","name":"imageAutoFix","shape":7,"type":"BOOLEAN","widget":{"name":"imageAutoFix"},"link":null},{"localized_name":"useFaceLimit","name":"useFaceLimit","shape":7,"type":"BOOLEAN","widget":{"name":"useFaceLimit"},"link":null},{"localized_name":"faceLimit","name":"faceLimit","shape":7,"type":"INT","widget":{"name":"faceLimit"},"link":null},{"localized_name":"useTexture","name":"useTexture","shape":7,"type":"BOOLEAN","widget":{"name":"useTexture"},"link":null},{"localized_name":"texture","name":"texture","shape":7,"type":"BOOLEAN","widget":{"name":"texture"},"link":null},{"localized_name":"usePbr","name":"usePbr","shape":7,"type":"BOOLEAN","widget":{"name":"usePbr"},"link":null},{"localized_name":"pbr","name":"pbr","shape":7,"type":"BOOLEAN","widget":{"name":"pbr"},"link":null},{"localized_name":"useTextureSeed","name":"useTextureSeed","shape":7,"type":"BOOLEAN","widget":{"name":"useTextureSeed"},"link":null},{"localized_name":"textureSeed","name":"textureSeed","shape":7,"type":"INT","widget":{"name":"textureSeed"},"link":null},{"localized_name":"useTextureAlignment","name":"useTextureAlignment","shape":7,"type":"BOOLEAN","widget":{"name":"useTextureAlignment"},"link":null},{"localized_name":"textureAlignment","name":"textureAlignment","shape":7,"type":"COMBO","widget":{"name":"textureAlignment"},"link":null},{"localized_name":"useTextureQuality","name":"useTextureQuality","shape":7,"type":"BOOLEAN","widget":{"name":"useTextureQuality"},"link":null},{"localized_name":"textureQuality","name":"textureQuality","shape":7,"type":"COMBO","widget":{"name":"textureQuality"},"link":null},{"localized_name":"useAutoSize","name":"useAutoSize","shape":7,"type":"BOOLEAN","widget":{"name":"useAutoSize"},"link":null},{"localized_name":"autoSize","name":"autoSize","shape":7,"type":"BOOLEAN","widget":{"name":"autoSize"},"link":null},{"localized_name":"useOrientation","name":"useOrientation","shape":7,"type":"BOOLEAN","widget":{"name":"useOrientation"},"link":null},{"localized_name":"orientation","name":"orientation","shape":7,"type":"COMBO","widget":{"name":"orientation"},"link":null},{"localized_name":"useQuad","name":"useQuad","shape":7,"type":"BOOLEAN","widget":{"name":"useQuad"},"link":null},{"localized_name":"quad","name":"quad","shape":7,"type":"BOOLEAN","widget":{"name":"quad"},"link":null},{"localized_name":"useCompress","name":"useCompress","shape":7,"type":"BOOLEAN","widget":{"name":"useCompress"},"link":null},{"localized_name":"compress","name":"compress","shape":7,"type":"COMBO","widget":{"name":"compress"},"link":null},{"localized_name":"useSmartLowPoly","name":"useSmartLowPoly","shape":7,"type":"BOOLEAN","widget":{"name":"useSmartLowPoly"},"link":null},{"localized_name":"smartLowPoly","name":"smartLowPoly","shape":7,"type":"BOOLEAN","widget":{"name":"smartLowPoly"},"link":null},{"localized_name":"useGenerateParts","name":"useGenerateParts","shape":7,"type":"BOOLEAN","widget":{"name":"useGenerateParts"},"link":null},{"localized_name":"generateParts","name":"generateParts","shape":7,"type":"BOOLEAN","widget":{"name":"generateParts"},"link":null},{"localized_name":"useExportUv","name":"useExportUv","shape":7,"type":"BOOLEAN","widget":{"name":"useExportUv"},"link":null},{"localized_name":"exportUv","name":"exportUv","shape":7,"type":"BOOLEAN","widget":{"name":"exportUv"},"link":null},{"localized_name":"useGeometryQuality","name":"useGeometryQuality","shape":7,"type":"BOOLEAN","widget":{"name":"useGeometryQuality"},"link":null},{"localized_name":"geometryQuality","name":"geometryQuality","shape":7,"type":"COMBO","widget":{"name":"geometryQuality"},"link":null},{"localized_name":"useOriginalAlpha","name":"useOriginalAlpha","shape":7,"type":"BOOLEAN","widget":{"name":"useOriginalAlpha"},"link":null},{"localized_name":"originalAlpha","name":"originalAlpha","shape":7,"type":"BOOLEAN","widget":{"name":"originalAlpha"},"link":null},{"localized_name":"useMaterial","name":"useMaterial","shape":7,"type":"BOOLEAN","widget":{"name":"useMaterial"},"link":null},{"localized_name":"material","name":"material","shape":7,"type":"COMBO","widget":{"name":"material"},"link":null},{"localized_name":"useQuality","name":"useQuality","shape":7,"type":"BOOLEAN","widget":{"name":"useQuality"},"link":null},{"localized_name":"quality","name":"quality","shape":7,"type":"COMBO","widget":{"name":"quality"},"link":null},{"localized_name":"usePolyCount","name":"usePolyCount","shape":7,"type":"BOOLEAN","widget":{"name":"usePolyCount"},"link":null},{"localized_name":"polyCount","name":"polyCount","shape":7,"type":"FLOAT","widget":{"name":"polyCount"},"link":null},{"localized_name":"useTaPose","name":"useTaPose","shape":7,"type":"BOOLEAN","widget":{"name":"useTaPose"},"link":null},{"localized_name":"taPose","name":"taPose","shape":7,"type":"BOOLEAN","widget":{"name":"taPose"},"link":null},{"localized_name":"useBoundingBox","name":"useBoundingBox","shape":7,"type":"BOOLEAN","widget":{"name":"useBoundingBox"},"link":null},{"localized_name":"boundingBox","name":"boundingBox","shape":7,"type":"STRING","widget":{"name":"boundingBox"},"link":null},{"localized_name":"useMeshMode","name":"useMeshMode","shape":7,"type":"BOOLEAN","widget":{"name":"useMeshMode"},"link":null},{"localized_name":"meshMode","name":"meshMode","shape":7,"type":"COMBO","widget":{"name":"meshMode"},"link":null},{"localized_name":"useAddons","name":"useAddons","shape":7,"type":"BOOLEAN","widget":{"name":"useAddons"},"link":null},{"localized_name":"addons","name":"addons","shape":7,"type":"STRING","widget":{"name":"addons"},"link":null},{"localized_name":"useHdTexture","name":"useHdTexture","shape":7,"type":"BOOLEAN","widget":{"name":"useHdTexture"},"link":null},{"localized_name":"hdTexture","name":"hdTexture","shape":7,"type":"BOOLEAN","widget":{"name":"hdTexture"},"link":null}],"outputs":[{"localized_name":"Settings","name":"Settings","type":"RUNWARE3DINFERENCESETTINGS","links":[6]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ede22eee5eec7908ce8998fb649c50db5b4f0b7b","Node name for S&R":"Runware 3D Inference Settings"},"widgets_values":[false,2048,false,500000,false,true,false,1024,false,false,false,10000,false,true,false,true,false,1,false,"original_image",false,"standard",false,false,false,"default",true,true,false,"meshopt",false,false,false,false,false,true,false,"standard",false,false,false,"PBR",false,"medium",false,18000,false,false,false,"",false,"Quad",false,"",false,false],"bgcolor":"#5345bf"}],"links":[[3,5,0,4,2,"IMAGE"],[5,6,0,4,3,"IMAGE"],[6,2,0,7,1,"RUNWARE3DINFERENCESETTINGS"],[7,7,0,3,0,"STRING"],[8,4,0,7,0,"RUNWARE3DINFERENCEINPUTS"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6271586751617864,"offset":[528.1600080529224,-515.5363284527646]}},"version":0.4} \ No newline at end of file From 21fb42b44da1b69fc6529d5c76fbc748dd6975b7 Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Wed, 15 Apr 2026 21:52:54 +0530 Subject: [PATCH 06/19] Added inputs-referenceAudios support --- __init__.py | 8 ++-- clientlibs/types.js | 11 +++-- modules/referenceAudios.py | 44 +++++++++++++++++++ modules/videoInferenceInputs.py | 11 ++++- modules/videoInputsReferences.py | 2 +- .../Runware_Video_Inference_Seedance_2.json | 2 +- 6 files changed, 68 insertions(+), 10 deletions(-) create mode 100644 modules/referenceAudios.py diff --git a/__init__.py b/__init__.py index 58d9eaa..f7086d2 100644 --- a/__init__.py +++ b/__init__.py @@ -63,6 +63,7 @@ from .modules.speechInput import RunwareSpeechInput from .modules.speechInputCombine import RunwareSpeechInputCombine from .modules.referenceVideos import referenceVideos from .modules.referenceVoices import referenceVoices +from .modules.referenceAudios import referenceAudios from .modules.videoInferenceInputs import videoInferenceInputs from .modules.videoInferenceElements import ( RunwareVideoInferenceElements, @@ -182,8 +183,9 @@ NODE_CLASS_MAPPINGS = { "Runware Video Audio Input": RunwareAudioInput, "Runware Video Speech Input": RunwareSpeechInput, "Runware Speech Inputs Combine": RunwareSpeechInputCombine, - "Runware Reference Videos": referenceVideos, - "Runware Reference Voices": referenceVoices, + "Runware Video Inference Inputs Reference Videos": referenceVideos, + "Runware Video Inference Inputs Reference Voices": referenceVoices, + "Runware Video Inference Inputs Reference Audios": referenceAudios, "Runware Video Inference Inputs": videoInferenceInputs, "Runware Video Inference Elements": RunwareVideoInferenceElements, "Runware Video Inference Elements Combine": RunwareVideoInferenceElementsCombine, @@ -212,7 +214,7 @@ NODE_CLASS_MAPPINGS = { "Runware Vectorize": vectorize, "Runware Video Background Removal": videoBgRemoval, "Runware Video Upscaler": videoUpscaler, - "Runware Video Inputs References": videoInputsReferences, + "Runware Video Inference Inputs Reference Images": videoInputsReferences, "Runware Video Inputs Frame Images": RunwareVideoInputsFrameImages, "Runware Safety Inputs": safetyInputs, "Runware Settings": RunwareSettings, diff --git a/clientlibs/types.js b/clientlibs/types.js index 2f35991..77a42ec 100644 --- a/clientlibs/types.js +++ b/clientlibs/types.js @@ -105,8 +105,9 @@ const RUNWARE_NODE_TYPES = { INPUTAUDIOS: "Runware Input Audios", AUDIOINPUT: "Runware Video Audio Input", SPEECHINPUT: "Runware Video Speech Input", - REFERENCEVIDEOS: "Runware Reference Videos", - REFERENCEVOICES: "Runware Reference Voices", + REFERENCEVIDEOS: "Runware Video Inference Inputs Reference Videos", + REFERENCEVOICES: "Runware Video Inference Inputs Reference Voices", + REFERENCEAUDIOS: "Runware Video Inference Inputs Reference Audios", VIDEOINFERENCEINPUTS: "Runware Video Inference Inputs", VIDEOINFERENCEELEMENTS: "Runware Video Inference Elements", VIDEOINFERENCEELEMENTSCOMBINE: "Runware Video Inference Elements Combine", @@ -134,7 +135,7 @@ const RUNWARE_NODE_TYPES = { VECTORIZE: "Runware Vectorize", VIDEOBGREMOVAL: "Runware Video Background Removal", VIDEOUPSCALER: "Runware Video Upscaler", - VIDEOINPUTSREFERENCES: "Runware Video Inputs References", + VIDEOINPUTSREFERENCES: "Runware Video Inference Inputs Reference Images", VIDEOINPUTSFRAMEIMAGES: "Runware Video Inputs Frame Images", ACCELERATOROPTIONS: "Runware Accelerator Options", VIDEOTRANSCRIPTION: "Runware Video Transcription", @@ -405,6 +406,10 @@ const RUNWARE_NODE_PROPS = { bgColor: DEFAULT_BGCOLOR, colorModeOnly: true, }, + [RUNWARE_NODE_TYPES.REFERENCEAUDIOS]: { + bgColor: DEFAULT_BGCOLOR, + colorModeOnly: true, + }, [RUNWARE_NODE_TYPES.VIDEOINFERENCEINPUTS]: { bgColor: DEFAULT_BGCOLOR, colorModeOnly: true, diff --git a/modules/referenceAudios.py b/modules/referenceAudios.py new file mode 100644 index 0000000..440d60e --- /dev/null +++ b/modules/referenceAudios.py @@ -0,0 +1,44 @@ +from typing import List + + +class referenceAudios: + """Reference Audios node for configuring reference audio inputs""" + + @classmethod + def INPUT_TYPES(cls): + return { + "required": {}, + "optional": { + "Audio1": ("STRING", { + "tooltip": "MediaUUID for the first reference audio from Runware Media Upload node.", + }), + "Audio2": ("STRING", { + "tooltip": "MediaUUID for the second reference audio from Runware Media Upload node.", + }), + "Audio3": ("STRING", { + "tooltip": "MediaUUID for the third reference audio from Runware Media Upload node.", + }), + "Audio4": ("STRING", { + "tooltip": "MediaUUID for the fourth reference audio from Runware Media Upload node.", + }), + } + } + + DESCRIPTION = "Configure multiple reference audios (mediaUUIDs) for video inference inputs." + FUNCTION = "createReferenceAudios" + RETURN_TYPES = ("RUNWAREINPUTAUDIOS",) + RETURN_NAMES = ("Reference Audios",) + CATEGORY = "Runware" + + def createReferenceAudios(self, **kwargs) -> tuple[List[str]]: + """Create list of reference audio UUIDs from provided parameters""" + audioList = [] + + for i in range(1, 5): + audioKey = f"Audio{i}" + audioUuid = kwargs.get(audioKey) + + if audioUuid and audioUuid.strip() != "": + audioList.append(audioUuid.strip()) + + return (audioList,) diff --git a/modules/videoInferenceInputs.py b/modules/videoInferenceInputs.py index b5edc1d..9e9cb43 100644 --- a/modules/videoInferenceInputs.py +++ b/modules/videoInferenceInputs.py @@ -41,12 +41,15 @@ class videoInferenceInputs: "Background": ("IMAGE", { "tooltip": "Background image for video generation. Connect a Load Image node to provide the background.", }), - "References": ("RUNWAREVIDEOINPUTSREFERENCEIMAGES", { + "References Images": ("RUNWAREVIDEOINPUTSREFERENCEIMAGES", { "tooltip": "Connect the Video Inputs References node to provide reference images." }), "Reference Videos": ("RUNWAREREFERENCEVIDEOS", { "tooltip": "Connect the Reference Videos node to provide reference video mediaUUIDs." }), + "Reference Audios": ("RUNWAREINPUTAUDIOS", { + "tooltip": "Connect the Runware Video Inference Inputs Reference Audios node to provide reference audio mediaUUIDs." + }), "Reference Voices": ("RUNWAREREFERENCEVOICES", { "tooltip": "Connect the Reference Voices node to provide reference voice URLs or mediaUUIDs." }), @@ -86,8 +89,9 @@ class videoInferenceInputs: frame = kwargs.get("Frame", None) background = kwargs.get("Background", None) frameImages = kwargs.get("Frame Images", None) - references = kwargs.get("References", None) + references = kwargs.get("References Images", None) referenceVideos = kwargs.get("Reference Videos", None) + referenceAudios = kwargs.get("Reference Audios", None) referenceVoices = kwargs.get("Reference Voices", None) draftId = kwargs.get("draftId", "") videoId = kwargs.get("videoId", "") @@ -143,6 +147,9 @@ class videoInferenceInputs: if referenceVideos is not None and len(referenceVideos) > 0: inputs["referenceVideos"] = referenceVideos + if referenceAudios is not None and len(referenceAudios) > 0: + inputs["referenceAudios"] = referenceAudios + if referenceVoices is not None and len(referenceVoices) > 0: inputs["referenceVoices"] = referenceVoices diff --git a/modules/videoInputsReferences.py b/modules/videoInputsReferences.py index ed32a8c..495d920 100644 --- a/modules/videoInputsReferences.py +++ b/modules/videoInputsReferences.py @@ -63,5 +63,5 @@ NODE_CLASS_MAPPINGS = { } NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareVideoInputsReferences": "Runware Video Inputs Reference Images", + "RunwareVideoInputsReferences": "Runware Video Inference Inputs Reference Images", } diff --git a/workflows/Runware_Video_Inference_Seedance_2.json b/workflows/Runware_Video_Inference_Seedance_2.json index d959a77..fe8da51 100644 --- a/workflows/Runware_Video_Inference_Seedance_2.json +++ b/workflows/Runware_Video_Inference_Seedance_2.json @@ -1 +1 @@ -{"id":"1cbc5d83-71d6-47e1-af45-3f88fe6bda01","revision":0,"last_node_id":7,"last_link_id":6,"nodes":[{"id":2,"type":"Runware Video Model Search","pos":[-164.64581298828125,-149.29281616210938],"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":[2]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ae704f0664e4f830893066819e080b3fa80de4db","Node name for S&R":"Runware Video Model Search"},"widgets_values":["","Bytedance","bytedance:seedance@2.0-fast (Seedance 2.0 Fast)",false,"Model Default",864,480,false,"1080p"],"bgcolor":"#5345bf"},{"id":5,"type":"Runware Video Inference Inputs","pos":[-97.2105712890625,175.69451904296875],"size":[320.0390625,354],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"Image","name":"Image","shape":7,"type":"IMAGE","link":null},{"localized_name":"Frame Images","name":"Frame Images","shape":7,"type":"RUNWAREVIDEOINPUTSFRAMEIMAGES","link":4},{"localized_name":"Audio Inputs","name":"Audio Inputs","shape":7,"type":"RUNWAREAUDIOINPUT","link":null},{"localized_name":"Speech Inputs","name":"Speech Inputs","shape":7,"type":"RUNWARESPEECHINPUT","link":null},{"localized_name":"Mask","name":"Mask","shape":7,"type":"IMAGE","link":null},{"localized_name":"Frame","name":"Frame","shape":7,"type":"IMAGE","link":null},{"localized_name":"Background","name":"Background","shape":7,"type":"IMAGE","link":null},{"localized_name":"References","name":"References","shape":7,"type":"RUNWAREVIDEOINPUTSREFERENCEIMAGES","link":null},{"localized_name":"Reference Videos","name":"Reference Videos","shape":7,"type":"RUNWAREREFERENCEVIDEOS","link":null},{"localized_name":"Reference Voices","name":"Reference Voices","shape":7,"type":"RUNWAREREFERENCEVOICES","link":null},{"localized_name":"Elements","name":"Elements","shape":7,"type":"RUNWAREVIDEOINFERENCEELEMENTS","link":null},{"localized_name":"Avatar","name":"Avatar","shape":7,"type":"STRING","widget":{"name":"Avatar"},"link":null},{"localized_name":"Audio","name":"Audio","shape":7,"type":"STRING","widget":{"name":"Audio"},"link":null},{"localized_name":"Video","name":"Video","shape":7,"type":"STRING","widget":{"name":"Video"},"link":null},{"localized_name":"draftId","name":"draftId","shape":7,"type":"STRING","widget":{"name":"draftId"},"link":null},{"localized_name":"videoId","name":"videoId","shape":7,"type":"STRING","widget":{"name":"videoId"},"link":null}],"outputs":[{"localized_name":"Video Inference Inputs","name":"Video Inference Inputs","type":"RUNWAREVIDEOINFERENCEINPUTS","links":[5]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ae704f0664e4f830893066819e080b3fa80de4db","Node name for S&R":"Runware Video Inference Inputs"},"widgets_values":["","","","",""],"bgcolor":"#5345bf"},{"id":6,"type":"LoadImage","pos":[-480.1459045410156,-187.5713348388672],"size":[274.080078125,314.0000305175781],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[3]},{"localized_name":"MASK","name":"MASK","type":"MASK","links":null}],"properties":{"cnr_id":"comfy-core","ver":"0.3.46","Node name for S&R":"LoadImage"},"widgets_values":["Van_Gogh_-_Starry_Night_-_Google_Art_Project.jpg","image"]},{"id":7,"type":"Runware Video Inputs Frame Images","pos":[-496.8704528808594,266.64013671875],"size":[331.5357360839844,190],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"image1","name":"image1","shape":7,"type":"IMAGE","link":3},{"localized_name":"image2","name":"image2","shape":7,"type":"IMAGE","link":null},{"localized_name":"image3","name":"image3","shape":7,"type":"IMAGE","link":null},{"localized_name":"image4","name":"image4","shape":7,"type":"IMAGE","link":null},{"localized_name":"frame1 position","name":"frame1 position","shape":7,"type":"STRING","widget":{"name":"frame1 position"},"link":null},{"localized_name":"frame2 position","name":"frame2 position","shape":7,"type":"STRING","widget":{"name":"frame2 position"},"link":null},{"localized_name":"frame3 position","name":"frame3 position","shape":7,"type":"STRING","widget":{"name":"frame3 position"},"link":null},{"localized_name":"frame4 position","name":"frame4 position","shape":7,"type":"STRING","widget":{"name":"frame4 position"},"link":null}],"outputs":[{"localized_name":"Video Inputs Frame Images","name":"Video Inputs Frame Images","type":"RUNWAREVIDEOINPUTSFRAMEIMAGES","links":[4]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ae704f0664e4f830893066819e080b3fa80de4db","Node name for S&R":"Runware Video Inputs Frame Images"},"widgets_values":["","","",""],"bgcolor":"#5345bf"},{"id":1,"type":"Runware Video Inference","pos":[299.4468078613281,-187.8292694091797],"size":[400,818],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"Model","name":"Model","type":"RUNWAREVIDEOMODEL","link":2},{"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":null},{"localized_name":"inputAudios","name":"inputAudios","shape":7,"type":"RUNWAREINPUTAUDIOS","link":null},{"localized_name":"referenceVideos","name":"referenceVideos","shape":7,"type":"RUNWAREREFERENCEVIDEOS","link":null},{"localized_name":"speech","name":"speech","shape":7,"type":"RUNWAREVIDEOINFERENCESPEECHINPUT","link":null},{"localized_name":"inputs","name":"inputs","shape":7,"type":"RUNWAREVIDEOINFERENCEINPUTS","link":5},{"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":"settings","name":"settings","shape":7,"type":"RUNWAREVIDEOSETTINGS","link":1},{"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}],"outputs":[{"localized_name":"VIDEO","name":"VIDEO","type":"VIDEO","links":[6]},{"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":"ae704f0664e4f830893066819e080b3fa80de4db","Node name for S&R":"Runware Video Inference"},"widgets_values":[false,"Disabled",true,5,false,24,"mp4",false,1018182910,"randomize",false,20,false,1,false,"euler",false,5,"none","Crow flying in the night sky!",""],"bgcolor":"#5345bf"},{"id":3,"type":"SaveVideo","pos":[742.50830078125,-187.757568359375],"size":[270,299.0638427734375],"flags":{},"order":6,"mode":0,"inputs":[{"localized_name":"video","name":"video","type":"VIDEO","link":6},{"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"]},{"id":4,"type":"Runware Video Inference Settings","pos":[1044.301513671875,-60.991512298583984],"size":[400,640],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"useDraft","name":"useDraft","shape":7,"type":"BOOLEAN","widget":{"name":"useDraft"},"link":null},{"localized_name":"draft","name":"draft","shape":7,"type":"BOOLEAN","widget":{"name":"draft"},"link":null},{"localized_name":"useAudio","name":"useAudio","shape":7,"type":"BOOLEAN","widget":{"name":"useAudio"},"link":null},{"localized_name":"audio","name":"audio","shape":7,"type":"BOOLEAN","widget":{"name":"audio"},"link":null},{"localized_name":"usePromptUpsampling","name":"usePromptUpsampling","shape":7,"type":"BOOLEAN","widget":{"name":"usePromptUpsampling"},"link":null},{"localized_name":"promptUpsampling","name":"promptUpsampling","shape":7,"type":"BOOLEAN","widget":{"name":"promptUpsampling"},"link":null},{"localized_name":"useBackgroundColor","name":"useBackgroundColor","shape":7,"type":"BOOLEAN","widget":{"name":"useBackgroundColor"},"link":null},{"localized_name":"backgroundColor","name":"backgroundColor","shape":7,"type":"STRING","widget":{"name":"backgroundColor"},"link":null},{"localized_name":"useRemoveBackground","name":"useRemoveBackground","shape":7,"type":"BOOLEAN","widget":{"name":"useRemoveBackground"},"link":null},{"localized_name":"removeBackground","name":"removeBackground","shape":7,"type":"BOOLEAN","widget":{"name":"removeBackground"},"link":null},{"localized_name":"useExpressiveness","name":"useExpressiveness","shape":7,"type":"BOOLEAN","widget":{"name":"useExpressiveness"},"link":null},{"localized_name":"expressiveness","name":"expressiveness","shape":7,"type":"COMBO","widget":{"name":"expressiveness"},"link":null},{"localized_name":"useVoiceDescription","name":"useVoiceDescription","shape":7,"type":"BOOLEAN","widget":{"name":"useVoiceDescription"},"link":null},{"localized_name":"voiceDescription","name":"voiceDescription","shape":7,"type":"STRING","widget":{"name":"voiceDescription"},"link":null},{"localized_name":"useStyle","name":"useStyle","shape":7,"type":"BOOLEAN","widget":{"name":"useStyle"},"link":null},{"localized_name":"style","name":"style","shape":7,"type":"COMBO","widget":{"name":"style"},"link":null},{"localized_name":"useThinking","name":"useThinking","shape":7,"type":"BOOLEAN","widget":{"name":"useThinking"},"link":null},{"localized_name":"thinking","name":"thinking","shape":7,"type":"COMBO","widget":{"name":"thinking"},"link":null},{"localized_name":"useMultiClip","name":"useMultiClip","shape":7,"type":"BOOLEAN","widget":{"name":"useMultiClip"},"link":null},{"localized_name":"multiClip","name":"multiClip","shape":7,"type":"BOOLEAN","widget":{"name":"multiClip"},"link":null},{"localized_name":"useShotType","name":"useShotType","shape":7,"type":"BOOLEAN","widget":{"name":"useShotType"},"link":null},{"localized_name":"shotType","name":"shotType","shape":7,"type":"COMBO","widget":{"name":"shotType"},"link":null},{"localized_name":"usePromptExtend","name":"usePromptExtend","shape":7,"type":"BOOLEAN","widget":{"name":"usePromptExtend"},"link":null},{"localized_name":"promptExtend","name":"promptExtend","shape":7,"type":"BOOLEAN","widget":{"name":"promptExtend"},"link":null}],"outputs":[{"localized_name":"settings","name":"settings","type":"RUNWAREVIDEOSETTINGS","links":[1]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ae704f0664e4f830893066819e080b3fa80de4db","Node name for S&R":"Runware Video Inference Settings"},"widgets_values":[false,false,false,true,false,true,false,"",false,false,false,"low",false,"",false,"anime",false,"auto",false,false,false,"single",false,false],"bgcolor":"#5345bf"}],"links":[[1,4,0,1,11,"RUNWAREVIDEOSETTINGS"],[2,2,0,1,0,"RUNWAREVIDEOMODEL"],[3,6,0,7,0,"IMAGE"],[4,7,0,5,1,"RUNWAREVIDEOINPUTSFRAMEIMAGES"],[5,5,0,1,7,"RUNWAREVIDEOINFERENCEINPUTS"],[6,1,0,3,0,"VIDEO"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6057126191083312,"offset":[730.1385408714618,287.3376744931152]}},"version":0.4} \ No newline at end of file +{"id":"1cbc5d83-71d6-47e1-af45-3f88fe6bda01","revision":0,"last_node_id":19,"last_link_id":15,"nodes":[{"id":2,"type":"Runware Video Model Search","pos":[-164.64581298828125,-149.29281616210938],"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":[2]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ae704f0664e4f830893066819e080b3fa80de4db","Node name for S&R":"Runware Video Model Search"},"widgets_values":["","Bytedance","bytedance:seedance@2.0-fast (Seedance 2.0 Fast)",false,"Model Default",864,480,false,"1080p"],"bgcolor":"#5345bf"},{"id":5,"type":"Runware Video Inference Inputs","pos":[-97.2105712890625,175.69451904296875],"size":[320.0390625,394],"flags":{},"order":9,"mode":0,"inputs":[{"localized_name":"Image","name":"Image","shape":7,"type":"IMAGE","link":null},{"localized_name":"Frame Images","name":"Frame Images","shape":7,"type":"RUNWAREVIDEOINPUTSFRAMEIMAGES","link":null},{"localized_name":"Audio Inputs","name":"Audio Inputs","shape":7,"type":"RUNWAREAUDIOINPUT","link":null},{"localized_name":"Speech Inputs","name":"Speech Inputs","shape":7,"type":"RUNWARESPEECHINPUT","link":null},{"localized_name":"Mask","name":"Mask","shape":7,"type":"IMAGE","link":null},{"localized_name":"Frame","name":"Frame","shape":7,"type":"IMAGE","link":null},{"localized_name":"Background","name":"Background","shape":7,"type":"IMAGE","link":null},{"localized_name":"References Images","name":"References Images","shape":7,"type":"RUNWAREVIDEOINPUTSREFERENCEIMAGES","link":15},{"localized_name":"Reference Videos","name":"Reference Videos","shape":7,"type":"RUNWAREREFERENCEVIDEOS","link":12},{"localized_name":"Reference Audios","name":"Reference Audios","shape":7,"type":"RUNWAREINPUTAUDIOS","link":13},{"localized_name":"Reference Voices","name":"Reference Voices","shape":7,"type":"RUNWAREREFERENCEVOICES","link":null},{"localized_name":"Elements","name":"Elements","shape":7,"type":"RUNWAREVIDEOINFERENCEELEMENTS","link":null},{"localized_name":"Avatar","name":"Avatar","shape":7,"type":"STRING","widget":{"name":"Avatar"},"link":null},{"localized_name":"Audio","name":"Audio","shape":7,"type":"STRING","widget":{"name":"Audio"},"link":null},{"localized_name":"Video","name":"Video","shape":7,"type":"STRING","widget":{"name":"Video"},"link":null},{"localized_name":"draftId","name":"draftId","shape":7,"type":"STRING","widget":{"name":"draftId"},"link":null},{"localized_name":"videoId","name":"videoId","shape":7,"type":"STRING","widget":{"name":"videoId"},"link":null},{"localized_name":"References","name":"References","shape":7,"type":"RUNWAREVIDEOINPUTSREFERENCEIMAGES","link":null}],"outputs":[{"localized_name":"Video Inference Inputs","name":"Video Inference Inputs","type":"RUNWAREVIDEOINFERENCEINPUTS","links":[5]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"ae704f0664e4f830893066819e080b3fa80de4db","Node name for S&R":"Runware Video Inference Inputs"},"widgets_values":["","","","",""],"bgcolor":"#5345bf"},{"id":3,"type":"SaveVideo","pos":[742.50830078125,-187.757568359375],"size":[270,299.0638427734375],"flags":{},"order":11,"mode":0,"inputs":[{"localized_name":"video","name":"video","type":"VIDEO","link":6},{"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"]},{"id":12,"type":"LoadAudio","pos":[-590.1805419921875,-150.2243194580078],"size":[274.080078125,136],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"audio","name":"audio","type":"COMBO","widget":{"name":"audio"},"link":null},{"localized_name":"audioUI","name":"audioUI","type":"AUDIO_UI","widget":{"name":"audioUI"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"AUDIOUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"AUDIO","name":"AUDIO","type":"AUDIO","links":[7]}],"properties":{"cnr_id":"comfy-core","ver":"0.3.46","Node name for S&R":"LoadAudio"},"widgets_values":["audio_10s.mp3",null,null]},{"id":13,"type":"Runware Media Upload","pos":[-577.60498046875,51.766048431396484],"size":[270,58],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"media","name":"media","shape":7,"type":"VIDEO,AUDIO","link":7},{"localized_name":"mediaUUID","name":"mediaUUID","shape":7,"type":"STRING","widget":{"name":"mediaUUID"},"link":null}],"outputs":[{"localized_name":"mediaUUID","name":"mediaUUID","type":"STRING","links":[9]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"6253871ef44d1820bf63a930e0c55da3941dded8","Node name for S&R":"Runware Media Upload"},"widgets_values":["e495ecea-9137-4528-9635-a5f1dcd438ad"],"bgcolor":"#5345bf"},{"id":11,"type":"Runware Video Inference Inputs Reference Audios","pos":[-583.78173828125,172.05462646484375],"size":[414.8384704589844,130],"flags":{},"order":7,"mode":0,"inputs":[{"localized_name":"Audio1","name":"Audio1","shape":7,"type":"STRING","widget":{"name":"Audio1"},"link":9},{"localized_name":"Audio2","name":"Audio2","shape":7,"type":"STRING","widget":{"name":"Audio2"},"link":null},{"localized_name":"Audio3","name":"Audio3","shape":7,"type":"STRING","widget":{"name":"Audio3"},"link":null},{"localized_name":"Audio4","name":"Audio4","shape":7,"type":"STRING","widget":{"name":"Audio4"},"link":null}],"outputs":[{"localized_name":"Reference Audios","name":"Reference Audios","type":"RUNWAREINPUTAUDIOS","links":[13]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"6253871ef44d1820bf63a930e0c55da3941dded8","Node name for S&R":"Runware Video Inference Inputs Reference Audios"},"widgets_values":["","","",""],"bgcolor":"#5345bf"},{"id":15,"type":"LoadVideo","pos":[-687.5318603515625,363.7621765136719],"size":[274.080078125,348.0801086425781],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"file","name":"file","type":"COMBO","widget":{"name":"file"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"VIDEO","name":"VIDEO","type":"VIDEO","links":[10]}],"properties":{"cnr_id":"comfy-core","ver":"0.3.46","Node name for S&R":"LoadVideo"},"widgets_values":["v1_14s.mp4","image"]},{"id":19,"type":"LoadImage","pos":[-385.07330322265625,363.9126281738281],"size":[274.080078125,314],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"image","name":"image","type":"COMBO","widget":{"name":"image"},"link":null},{"localized_name":"choose file to upload","name":"upload","type":"IMAGEUPLOAD","widget":{"name":"upload"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":[14]},{"localized_name":"MASK","name":"MASK","type":"MASK","links":null}],"properties":{"cnr_id":"comfy-core","ver":"0.3.46","Node name for S&R":"LoadImage"},"widgets_values":["image_1280_720.png","image"]},{"id":1,"type":"Runware Video Inference","pos":[299.4468078613281,-187.8292694091797],"size":[400,818],"flags":{},"order":10,"mode":0,"inputs":[{"localized_name":"Model","name":"Model","type":"RUNWAREVIDEOMODEL","link":2},{"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":null},{"localized_name":"inputAudios","name":"inputAudios","shape":7,"type":"RUNWAREINPUTAUDIOS","link":null},{"localized_name":"referenceVideos","name":"referenceVideos","shape":7,"type":"RUNWAREREFERENCEVIDEOS","link":null},{"localized_name":"speech","name":"speech","shape":7,"type":"RUNWAREVIDEOINFERENCESPEECHINPUT","link":null},{"localized_name":"inputs","name":"inputs","shape":7,"type":"RUNWAREVIDEOINFERENCEINPUTS","link":5},{"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":"settings","name":"settings","shape":7,"type":"RUNWAREVIDEOSETTINGS","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}],"outputs":[{"localized_name":"VIDEO","name":"VIDEO","type":"VIDEO","links":[6]},{"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":"ae704f0664e4f830893066819e080b3fa80de4db","Node name for S&R":"Runware Video Inference"},"widgets_values":[false,"Disabled",true,5,false,24,"mp4",false,1092188999,"randomize",false,20,false,1,false,"euler",false,5,"none","Create a nature documentary sequence inspired by Image 1's visual style and Video 1's camera movement. Apply the ambient soundscape from Audio 1 throughout. Smooth cinematic pans across a lush forest landscape, light filtering through the canopy.Do not use copyrighted music",""],"bgcolor":"#5345bf"},{"id":18,"type":"Runware Video Inference Inputs Reference Images","pos":[779.31787109375,185.6835479736328],"size":[417.9419860839844,190],"flags":{},"order":6,"mode":0,"inputs":[{"localized_name":"Image1","name":"Image1","shape":7,"type":"IMAGE","link":14},{"localized_name":"Image2","name":"Image2","shape":7,"type":"IMAGE","link":null},{"localized_name":"Image3","name":"Image3","shape":7,"type":"IMAGE","link":null},{"localized_name":"Image4","name":"Image4","shape":7,"type":"IMAGE","link":null},{"localized_name":"Type1","name":"Type1","shape":7,"type":"STRING","widget":{"name":"Type1"},"link":null},{"localized_name":"Type2","name":"Type2","shape":7,"type":"STRING","widget":{"name":"Type2"},"link":null},{"localized_name":"Type3","name":"Type3","shape":7,"type":"STRING","widget":{"name":"Type3"},"link":null},{"localized_name":"Type4","name":"Type4","shape":7,"type":"STRING","widget":{"name":"Type4"},"link":null}],"outputs":[{"localized_name":"Video Inputs Reference Images","name":"Video Inputs Reference Images","type":"RUNWAREVIDEOINPUTSREFERENCEIMAGES","links":[15]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"6253871ef44d1820bf63a930e0c55da3941dded8","Node name for S&R":"Runware Video Inference Inputs Reference Images"},"widgets_values":["","","",""],"bgcolor":"#5345bf"},{"id":14,"type":"Runware Video Inference Inputs Reference Videos","pos":[820.0543212890625,457.1798400878906],"size":[414.5855407714844,130],"flags":{},"order":8,"mode":0,"inputs":[{"localized_name":"Video1","name":"Video1","shape":7,"type":"STRING","widget":{"name":"Video1"},"link":11},{"localized_name":"Video2","name":"Video2","shape":7,"type":"STRING","widget":{"name":"Video2"},"link":null},{"localized_name":"Video3","name":"Video3","shape":7,"type":"STRING","widget":{"name":"Video3"},"link":null},{"localized_name":"Video4","name":"Video4","shape":7,"type":"STRING","widget":{"name":"Video4"},"link":null}],"outputs":[{"localized_name":"Reference Videos","name":"Reference Videos","type":"RUNWAREREFERENCEVIDEOS","links":[12]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"6253871ef44d1820bf63a930e0c55da3941dded8","Node name for S&R":"Runware Video Inference Inputs Reference Videos"},"widgets_values":["","","",""],"bgcolor":"#5345bf"},{"id":16,"type":"Runware Media Upload","pos":[-11.373903274536133,642.2811279296875],"size":[270,58],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"media","name":"media","shape":7,"type":"VIDEO,AUDIO","link":10},{"localized_name":"mediaUUID","name":"mediaUUID","shape":7,"type":"STRING","widget":{"name":"mediaUUID"},"link":null}],"outputs":[{"localized_name":"mediaUUID","name":"mediaUUID","type":"STRING","links":[11]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"6253871ef44d1820bf63a930e0c55da3941dded8","Node name for S&R":"Runware Media Upload"},"widgets_values":["298166e5-555e-459b-a492-3301d9a43db4"],"bgcolor":"#5345bf"}],"links":[[2,2,0,1,0,"RUNWAREVIDEOMODEL"],[5,5,0,1,7,"RUNWAREVIDEOINFERENCEINPUTS"],[6,1,0,3,0,"VIDEO"],[7,12,0,13,0,"VIDEO,AUDIO"],[9,13,0,11,0,"STRING"],[10,15,0,16,0,"VIDEO,AUDIO"],[11,16,0,14,0,"STRING"],[12,14,0,5,8,"RUNWAREREFERENCEVIDEOS"],[13,11,0,5,9,"RUNWAREINPUTAUDIOS"],[14,19,0,18,0,"IMAGE"],[15,18,0,5,7,"RUNWAREVIDEOINPUTSREFERENCEIMAGES"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.7329122691210809,"offset":[778.4138682648228,231.06056158176943]}},"version":0.4} \ No newline at end of file From 103708b318c11fe3dc6cfa8b4f96a41ab909dc77 Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Wed, 15 Apr 2026 22:47:55 +0530 Subject: [PATCH 07/19] Added support for 10 referenceImages --- __init__.py | 4 ++++ clientlibs/types.js | 15 +++++++++++++++ modules/videoInferenceInputs.py | 6 +++--- modules/videoInputsReferences.py | 2 +- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/__init__.py b/__init__.py index f7086d2..dabcb9a 100644 --- a/__init__.py +++ b/__init__.py @@ -183,6 +183,10 @@ NODE_CLASS_MAPPINGS = { "Runware Video Audio Input": RunwareAudioInput, "Runware Video Speech Input": RunwareSpeechInput, "Runware Speech Inputs Combine": RunwareSpeechInputCombine, + # Backward-compatible aliases for existing workflows + "Runware Reference Videos": referenceVideos, + "Runware Reference Voices": referenceVoices, + "Runware Video Inputs References": videoInputsReferences, "Runware Video Inference Inputs Reference Videos": referenceVideos, "Runware Video Inference Inputs Reference Voices": referenceVoices, "Runware Video Inference Inputs Reference Audios": referenceAudios, diff --git a/clientlibs/types.js b/clientlibs/types.js index 77a42ec..d454480 100644 --- a/clientlibs/types.js +++ b/clientlibs/types.js @@ -106,8 +106,11 @@ const RUNWARE_NODE_TYPES = { AUDIOINPUT: "Runware Video Audio Input", SPEECHINPUT: "Runware Video Speech Input", REFERENCEVIDEOS: "Runware Video Inference Inputs Reference Videos", + REFERENCEVIDEOS_LEGACY: "Runware Reference Videos", REFERENCEVOICES: "Runware Video Inference Inputs Reference Voices", + REFERENCEVOICES_LEGACY: "Runware Reference Voices", REFERENCEAUDIOS: "Runware Video Inference Inputs Reference Audios", + VIDEOINPUTSREFERENCES_LEGACY: "Runware Video Inputs References", VIDEOINFERENCEINPUTS: "Runware Video Inference Inputs", VIDEOINFERENCEELEMENTS: "Runware Video Inference Elements", VIDEOINFERENCEELEMENTSCOMBINE: "Runware Video Inference Elements Combine", @@ -402,10 +405,18 @@ const RUNWARE_NODE_PROPS = { bgColor: DEFAULT_BGCOLOR, colorModeOnly: true, }, + [RUNWARE_NODE_TYPES.REFERENCEVIDEOS_LEGACY]: { + bgColor: DEFAULT_BGCOLOR, + colorModeOnly: true, + }, [RUNWARE_NODE_TYPES.REFERENCEVOICES]: { bgColor: DEFAULT_BGCOLOR, colorModeOnly: true, }, + [RUNWARE_NODE_TYPES.REFERENCEVOICES_LEGACY]: { + bgColor: DEFAULT_BGCOLOR, + colorModeOnly: true, + }, [RUNWARE_NODE_TYPES.REFERENCEAUDIOS]: { bgColor: DEFAULT_BGCOLOR, colorModeOnly: true, @@ -510,6 +521,10 @@ const RUNWARE_NODE_PROPS = { bgColor: DEFAULT_BGCOLOR, colorModeOnly: true, }, + [RUNWARE_NODE_TYPES.VIDEOINPUTSREFERENCES_LEGACY]: { + bgColor: DEFAULT_BGCOLOR, + colorModeOnly: true, + }, [RUNWARE_NODE_TYPES.VIDEOINPUTSFRAMEIMAGES]: { bgColor: DEFAULT_BGCOLOR, colorModeOnly: true, diff --git a/modules/videoInferenceInputs.py b/modules/videoInferenceInputs.py index 9e9cb43..c05a771 100644 --- a/modules/videoInferenceInputs.py +++ b/modules/videoInferenceInputs.py @@ -42,16 +42,16 @@ class videoInferenceInputs: "tooltip": "Background image for video generation. Connect a Load Image node to provide the background.", }), "References Images": ("RUNWAREVIDEOINPUTSREFERENCEIMAGES", { - "tooltip": "Connect the Video Inputs References node to provide reference images." + "tooltip": "Connect the Runware Video Inference Inputs Reference Images node to provide reference images." }), "Reference Videos": ("RUNWAREREFERENCEVIDEOS", { - "tooltip": "Connect the Reference Videos node to provide reference video mediaUUIDs." + "tooltip": "Connect the Runware Video Inference Inputs Reference Videos node to provide reference video mediaUUIDs." }), "Reference Audios": ("RUNWAREINPUTAUDIOS", { "tooltip": "Connect the Runware Video Inference Inputs Reference Audios node to provide reference audio mediaUUIDs." }), "Reference Voices": ("RUNWAREREFERENCEVOICES", { - "tooltip": "Connect the Reference Voices node to provide reference voice URLs or mediaUUIDs." + "tooltip": "Connect the Runware Video Inference Inputs Reference Voices node to provide reference voice URLs or mediaUUIDs." }), "draftId": ("STRING", { "default": "", diff --git a/modules/videoInputsReferences.py b/modules/videoInputsReferences.py index 495d920..449697a 100644 --- a/modules/videoInputsReferences.py +++ b/modules/videoInputsReferences.py @@ -5,7 +5,7 @@ from typing import List, Dict, Any class videoInputsReferences: """Video Inputs References node for configuring reference images with types""" - MAX_REFERENCES = 4 + MAX_REFERENCES = 10 @classmethod def INPUT_TYPES(cls): From 424f8e9e95e466857c8a8b8bd721be23fe666f2f Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Wed, 15 Apr 2026 23:06:39 +0530 Subject: [PATCH 08/19] Added fixes for backward compatibilities --- modules/referenceAudios.py | 4 ++++ modules/videoInferenceInputs.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/referenceAudios.py b/modules/referenceAudios.py index 440d60e..0c028d6 100644 --- a/modules/referenceAudios.py +++ b/modules/referenceAudios.py @@ -10,15 +10,19 @@ class referenceAudios: "required": {}, "optional": { "Audio1": ("STRING", { + "default": "", "tooltip": "MediaUUID for the first reference audio from Runware Media Upload node.", }), "Audio2": ("STRING", { + "default": "", "tooltip": "MediaUUID for the second reference audio from Runware Media Upload node.", }), "Audio3": ("STRING", { + "default": "", "tooltip": "MediaUUID for the third reference audio from Runware Media Upload node.", }), "Audio4": ("STRING", { + "default": "", "tooltip": "MediaUUID for the fourth reference audio from Runware Media Upload node.", }), } diff --git a/modules/videoInferenceInputs.py b/modules/videoInferenceInputs.py index c05a771..72b07d3 100644 --- a/modules/videoInferenceInputs.py +++ b/modules/videoInferenceInputs.py @@ -89,7 +89,7 @@ class videoInferenceInputs: frame = kwargs.get("Frame", None) background = kwargs.get("Background", None) frameImages = kwargs.get("Frame Images", None) - references = kwargs.get("References Images", None) + references = kwargs.get("References Images", kwargs.get("References", None)) referenceVideos = kwargs.get("Reference Videos", None) referenceAudios = kwargs.get("Reference Audios", None) referenceVoices = kwargs.get("Reference Voices", None) From be547e2f037b3dfbce06ba7542a18f70661d3469 Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Thu, 16 Apr 2026 11:26:46 +0530 Subject: [PATCH 09/19] Fixed ordering to ensure backward compatibility --- modules/videoInferenceInputs.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/videoInferenceInputs.py b/modules/videoInferenceInputs.py index 72b07d3..79f8f31 100644 --- a/modules/videoInferenceInputs.py +++ b/modules/videoInferenceInputs.py @@ -47,9 +47,6 @@ class videoInferenceInputs: "Reference Videos": ("RUNWAREREFERENCEVIDEOS", { "tooltip": "Connect the Runware Video Inference Inputs Reference Videos node to provide reference video mediaUUIDs." }), - "Reference Audios": ("RUNWAREINPUTAUDIOS", { - "tooltip": "Connect the Runware Video Inference Inputs Reference Audios node to provide reference audio mediaUUIDs." - }), "Reference Voices": ("RUNWAREREFERENCEVOICES", { "tooltip": "Connect the Runware Video Inference Inputs Reference Voices node to provide reference voice URLs or mediaUUIDs." }), @@ -66,6 +63,9 @@ class videoInferenceInputs: "Elements": ("RUNWAREVIDEOINFERENCEELEMENTS", { "tooltip": "Connect Runware Video Inference Elements (one element) or Runware Video Inference Elements Combine (several) for inputs.elements (Kling, etc.).", }), + "Reference Audios": ("RUNWAREINPUTAUDIOS", { + "tooltip": "Connect the Runware Video Inference Inputs Reference Audios node to provide reference audio mediaUUIDs." + }), } } From 7f2b73fd4aade8ab5c9b19a101300d4c01be8429 Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Fri, 17 Apr 2026 17:08:27 +0530 Subject: [PATCH 10/19] Added new settings params for textInference --- clientlibs/utils.js | 20 ++- modules/textInferenceSettings.py | 163 +++++++++++++++--- modules/textModelSearch.py | 4 + modules/utils/runwareUtils.py | 2 +- workflows/Runware_Text_Inference_GLM_5_1.json | 1 + 5 files changed, 167 insertions(+), 23 deletions(-) create mode 100644 workflows/Runware_Text_Inference_GLM_5_1.json diff --git a/clientlibs/utils.js b/clientlibs/utils.js index 7dd3ecc..fe06b2d 100644 --- a/clientlibs/utils.js +++ b/clientlibs/utils.js @@ -1337,7 +1337,7 @@ function textInferenceSettingsToggleHandler(settingsNode) { if (!settingsNode?.widgets) return; const useSystemPromptWidget = settingsNode.widgets.find(w => w && w.name === "useSystemPrompt"); - const systemWidget = settingsNode.widgets.find(w => w && w.name === "system"); + const systemWidget = settingsNode.widgets.find(w => w && (w.name === "systemPrompt" || w.name === "system")); const useMaxTokensWidget = settingsNode.widgets.find(w => w && w.name === "useMaxTokens"); const maxTokensWidget = settingsNode.widgets.find(w => w && w.name === "maxTokens"); const useTemperatureWidget = settingsNode.widgets.find(w => w && w.name === "useTemperature"); @@ -1346,6 +1346,16 @@ function textInferenceSettingsToggleHandler(settingsNode) { const topPWidget = settingsNode.widgets.find(w => w && w.name === "topP"); const useTopKWidget = settingsNode.widgets.find(w => w && w.name === "useTopK"); const topKWidget = settingsNode.widgets.find(w => w && w.name === "topK"); + const useStopSequencesWidget = settingsNode.widgets.find(w => w && w.name === "useStopSequences"); + const stopSequencesWidget = settingsNode.widgets.find(w => w && w.name === "stopSequences"); + const usePresencePenaltyWidget = settingsNode.widgets.find(w => w && w.name === "usePresencePenalty"); + const presencePenaltyWidget = settingsNode.widgets.find(w => w && w.name === "presencePenalty"); + const useFrequencyPenaltyWidget = settingsNode.widgets.find(w => w && w.name === "useFrequencyPenalty"); + const frequencyPenaltyWidget = settingsNode.widgets.find(w => w && w.name === "frequencyPenalty"); + const useToolsWidget = settingsNode.widgets.find(w => w && w.name === "useTools"); + const toolsWidget = settingsNode.widgets.find(w => w && w.name === "tools"); + const useToolChoiceWidget = settingsNode.widgets.find(w => w && w.name === "useToolChoice"); + const toolChoiceWidget = settingsNode.widgets.find(w => w && w.name === "toolChoice"); function toggleWidgetState(useWidget, paramWidget) { if (!useWidget || !paramWidget) return; @@ -1368,6 +1378,11 @@ function textInferenceSettingsToggleHandler(settingsNode) { if (useTemperatureWidget && temperatureWidget) toggleWidgetState(useTemperatureWidget, temperatureWidget); if (useTopPWidget && topPWidget) toggleWidgetState(useTopPWidget, topPWidget); if (useTopKWidget && topKWidget) toggleWidgetState(useTopKWidget, topKWidget); + if (useStopSequencesWidget && stopSequencesWidget) toggleWidgetState(useStopSequencesWidget, stopSequencesWidget); + if (usePresencePenaltyWidget && presencePenaltyWidget) toggleWidgetState(usePresencePenaltyWidget, presencePenaltyWidget); + if (useFrequencyPenaltyWidget && frequencyPenaltyWidget) toggleWidgetState(useFrequencyPenaltyWidget, frequencyPenaltyWidget); + if (useToolsWidget && toolsWidget) toggleWidgetState(useToolsWidget, toolsWidget); + if (useToolChoiceWidget && toolChoiceWidget) toggleWidgetState(useToolChoiceWidget, toolChoiceWidget); } function videoSettingsToggleHandler(settingsNode) { @@ -3047,6 +3062,9 @@ function textModelSearchFilterHandler(textModelSearchNode) { "Google": [ "google:gemini@3-flash (Gemini 3 Flash)", ], + "Zai": [ + "zai-glm-5-1 (ZAI GLM 5.1)", + ], }; function filterModelList() { diff --git a/modules/textInferenceSettings.py b/modules/textInferenceSettings.py index 4725e5b..7cc977b 100644 --- a/modules/textInferenceSettings.py +++ b/modules/textInferenceSettings.py @@ -1,11 +1,15 @@ -from typing import Any, Dict, Tuple +import json +from typing import Any, Dict, List, Tuple class RunwareTextInferenceSettings: """Optional generation controls for Runware Text Inference (flat task.settings per API).""" _MAX_SYSTEM_CHARS = 200000 - _MAX_TOKENS_CAP = 196608 + _MAX_TOKENS_CAP = 131072 + _MAX_TOP_K = 100647 + _MAX_STOP_ITEMS = 5 + _MAX_STOP_ITEM_CHARS = 50 @classmethod def INPUT_TYPES(cls): @@ -16,17 +20,17 @@ class RunwareTextInferenceSettings: "default": False, "tooltip": "Include systemPrompt in settings.", }), - "system": ("STRING", { + "systemPrompt": ("STRING", { "multiline": True, "default": "", - "tooltip": "System instruction (max 200,000 characters). Sent as systemPrompt.", + "tooltip": "System instruction (max 200,000 chars).", }), "useMaxTokens": ("BOOLEAN", { "default": False, "tooltip": "Include maxTokens in settings.", }), "maxTokens": ("INT", { - "default": 32768, + "default": 4096, "min": 1, "max": cls._MAX_TOKENS_CAP, "step": 1, @@ -38,21 +42,21 @@ class RunwareTextInferenceSettings: }), "temperature": ("FLOAT", { "default": 1.0, - "min": 0.01, + "min": 0.0, "max": 1.0, "step": 0.01, - "tooltip": "Sampling temperature on (0, 1].", + "tooltip": "Sampling temperature (0.0–1.0).", }), "useTopP": ("BOOLEAN", { "default": False, "tooltip": "Include topP in settings.", }), "topP": ("FLOAT", { - "default": 0.95, - "min": 0.0, + "default": 1.0, + "min": 0.01, "max": 1.0, "step": 0.01, - "tooltip": "Nucleus sampling (0.0–1.0).", + "tooltip": "Nucleus sampling (0.01–1.0).", }), "useTopK": ("BOOLEAN", { "default": False, @@ -61,13 +65,62 @@ class RunwareTextInferenceSettings: "topK": ("INT", { "default": 40, "min": 1, - "max": 128, + "max": cls._MAX_TOP_K, "step": 1, - "tooltip": "Top-k sampling (1–128).", + "tooltip": f"Top-k sampling (1–{cls._MAX_TOP_K}).", }), - "thinkingLevel": (["off", "minimal", "low", "medium", "high"], { - "default": "off", - "tooltip": "thinkingLevel in settings (omit when off).", + "useStopSequences": ("BOOLEAN", { + "default": False, + "tooltip": "Include stopSequences in settings.", + }), + "stopSequences": ("STRING", { + "multiline": True, + "default": "", + "tooltip": "Stop sequences: one per line (max 5 items, 50 chars each).", + }), + "usePresencePenalty": ("BOOLEAN", { + "default": False, + "tooltip": "Include presencePenalty in settings.", + }), + "presencePenalty": ("FLOAT", { + "default": 0.0, + "min": -2.0, + "max": 2.0, + "step": 0.01, + "tooltip": "Presence penalty (-2.0 to 2.0).", + }), + "useFrequencyPenalty": ("BOOLEAN", { + "default": False, + "tooltip": "Include frequencyPenalty in settings.", + }), + "frequencyPenalty": ("FLOAT", { + "default": 0.0, + "min": -2.0, + "max": 2.0, + "step": 0.01, + "tooltip": "Frequency penalty (-2.0 to 2.0).", + }), + "useTools": ("BOOLEAN", { + "default": False, + "tooltip": "Include tools in settings.", + }), + "tools": ("STRING", { + "multiline": True, + "default": "[]", + "tooltip": "JSON array for tools.", + }), + "useToolChoice": ("BOOLEAN", { + "default": False, + "tooltip": "Include toolChoice in settings.", + }), + "toolChoice": ("STRING", { + "multiline": True, + "default": "{}", + "tooltip": "JSON object for toolChoice.", + }), + "thinkingLevel": (["none", "low", "medium", "high"], { + "default": "none", + "tooltip": "Extended reasoning level: none, low, medium, high.", }), }, } @@ -77,34 +130,102 @@ class RunwareTextInferenceSettings: FUNCTION = "create_settings" CATEGORY = "Runware/Text" DESCRIPTION = ( - "Optional text inference settings (flat: systemPrompt, maxTokens, temperature, topP, topK, thinkingLevel). " + "Optional text inference settings (systemPrompt, maxTokens, temperature, topP, topK, " + "stopSequences, presencePenalty, frequencyPenalty, tools, toolChoice, thinkingLevel). " "Connect to Runware Text Inference." ) + @staticmethod + def _parse_json_setting(raw: Any, expected_type: type, field_name: str) -> Any: + if isinstance(raw, expected_type): + return raw + if raw is None: + return expected_type() + + text = str(raw).strip() + if not text: + return expected_type() + + try: + parsed = json.loads(text) + except Exception as exc: + raise Exception(f"{field_name} must be valid JSON.") from exc + + if not isinstance(parsed, expected_type): + expected = "array" if expected_type is list else "object" + raise Exception(f"{field_name} must be a JSON {expected}.") + return parsed + + def _parse_stop_sequences(self, raw: Any) -> List[str]: + if raw is None: + return [] + + items: List[str] = [] + if isinstance(raw, (list, tuple)): + for item in raw: + text = str(item).strip() + if text: + items.append(text) + else: + text = str(raw).strip() + if text: + normalized = text.replace("\r\n", "\n").replace(",", "\n") + items = [segment.strip() for segment in normalized.split("\n") if segment.strip()] + + if len(items) > self._MAX_STOP_ITEMS: + raise Exception(f"stopSequences supports up to {self._MAX_STOP_ITEMS} items.") + for idx, item in enumerate(items, start=1): + if len(item) > self._MAX_STOP_ITEM_CHARS: + raise Exception( + f"stopSequences item {idx} exceeds {self._MAX_STOP_ITEM_CHARS} characters." + ) + return items + def create_settings(self, **kwargs) -> Tuple[Dict[str, Any], ...]: out: Dict[str, Any] = {} if kwargs.get("useSystemPrompt", False): - sys_text = (kwargs.get("system") or "").strip() + sys_text = (kwargs.get("systemPrompt") or kwargs.get("system") or "").strip() if sys_text: if len(sys_text) > self._MAX_SYSTEM_CHARS: sys_text = sys_text[: self._MAX_SYSTEM_CHARS] out["systemPrompt"] = sys_text if kwargs.get("useMaxTokens", False): - out["maxTokens"] = int(kwargs.get("maxTokens", 32768)) + out["maxTokens"] = int(kwargs.get("maxTokens", 4096)) if kwargs.get("useTemperature", False): out["temperature"] = float(kwargs.get("temperature", 1.0)) if kwargs.get("useTopP", False): - out["topP"] = float(kwargs.get("topP", 0.95)) + out["topP"] = float(kwargs.get("topP", 1.0)) if kwargs.get("useTopK", False): out["topK"] = int(kwargs.get("topK", 40)) - tl = kwargs.get("thinkingLevel", "off") - if tl != "off": + if kwargs.get("useStopSequences", False): + parsed_stop = self._parse_stop_sequences(kwargs.get("stopSequences", "")) + if parsed_stop: + out["stopSequences"] = parsed_stop + + if kwargs.get("usePresencePenalty", False): + out["presencePenalty"] = float(kwargs.get("presencePenalty", 0.0)) + + if kwargs.get("useFrequencyPenalty", False): + out["frequencyPenalty"] = float(kwargs.get("frequencyPenalty", 0.0)) + + if kwargs.get("useTools", False): + parsed_tools = self._parse_json_setting(kwargs.get("tools"), list, "tools") + if parsed_tools: + out["tools"] = parsed_tools + + if kwargs.get("useToolChoice", False): + parsed_choice = self._parse_json_setting(kwargs.get("toolChoice"), dict, "toolChoice") + if parsed_choice: + out["toolChoice"] = parsed_choice + + tl = kwargs.get("thinkingLevel", "none") + if tl != "none": out["thinkingLevel"] = tl if not out: diff --git a/modules/textModelSearch.py b/modules/textModelSearch.py index 46c6e93..d81e7ed 100644 --- a/modules/textModelSearch.py +++ b/modules/textModelSearch.py @@ -16,6 +16,9 @@ class RunwareTextModelSearch: "Google": [ "google:gemini@3-flash (Gemini 3 Flash)", ], + "Zai": [ + "zai-glm-5-1 (ZAI GLM 5.1)", + ], } MODEL_PROVIDERS = [ @@ -23,6 +26,7 @@ class RunwareTextModelSearch: "Google", "MiniMax", "OpenAI", + "Zai", ] @classmethod diff --git a/modules/utils/runwareUtils.py b/modules/utils/runwareUtils.py index 0c97b0f..75ba920 100644 --- a/modules/utils/runwareUtils.py +++ b/modules/utils/runwareUtils.py @@ -158,7 +158,7 @@ def getCustomEndpoint(): custom_endpoint = os.getenv("RUNWARE_CUSTOM_ENDPOINT") if custom_endpoint and isinstance(custom_endpoint, str): return custom_endpoint - return "https://api.runware.ai/v1" + return "https://api.runware.dev/v1" SESSION_TIMEOUT = getTimeout() RUNWARE_API_KEY = getAPIKey() diff --git a/workflows/Runware_Text_Inference_GLM_5_1.json b/workflows/Runware_Text_Inference_GLM_5_1.json new file mode 100644 index 0000000..893030b --- /dev/null +++ b/workflows/Runware_Text_Inference_GLM_5_1.json @@ -0,0 +1 @@ +{"id":"f1dab8a9-11a7-4fa3-9a3b-35351c84a964","revision":0,"last_node_id":10,"last_link_id":6,"nodes":[{"id":1,"type":"Runware Text Inference","pos":[497.6562194824219,734.759521484375],"size":[270,122],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"model","name":"model","type":"RUNWARETEXTMODEL","link":1},{"localized_name":"messages","name":"messages","type":"RUNWARETEXTINFERENCEMESSAGES","link":4},{"localized_name":"settings","name":"settings","shape":7,"type":"RUNWARETEXTINFERENCESETTINGS","link":6},{"localized_name":"providerSettings","name":"providerSettings","shape":7,"type":"RUNWAREPROVIDERSETTINGS","link":null}],"outputs":[{"localized_name":"text","name":"text","type":"STRING","links":[2]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"6d47a67b859745d5a86f463d8edfd7da0d1cfa6b","Node name for S&R":"Runware Text Inference"},"widgets_values":[],"bgcolor":"#5345bf"},{"id":5,"type":"Runware Text Inference Messages","pos":[503.0782165527344,919.4880981445312],"size":[255.45077514648438,166],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"Message Segment 1","name":"Message Segment 1","type":"RUNWARETEXTINFERENCEMESSAGE","link":5},{"localized_name":"Message Segment 2","name":"Message Segment 2","shape":7,"type":"RUNWARETEXTINFERENCEMESSAGE","link":null},{"localized_name":"Message Segment 3","name":"Message Segment 3","shape":7,"type":"RUNWARETEXTINFERENCEMESSAGE","link":null},{"localized_name":"Message Segment 4","name":"Message Segment 4","shape":7,"type":"RUNWARETEXTINFERENCEMESSAGE","link":null},{"localized_name":"Message Segment 5","name":"Message Segment 5","shape":7,"type":"RUNWARETEXTINFERENCEMESSAGE","link":null},{"localized_name":"Message Segment 6","name":"Message Segment 6","shape":7,"type":"RUNWARETEXTINFERENCEMESSAGE","link":null},{"localized_name":"Message Segment 7","name":"Message Segment 7","shape":7,"type":"RUNWARETEXTINFERENCEMESSAGE","link":null},{"localized_name":"Message Segment 8","name":"Message Segment 8","shape":7,"type":"RUNWARETEXTINFERENCEMESSAGE","link":null}],"outputs":[{"localized_name":"messages","name":"messages","type":"RUNWARETEXTINFERENCEMESSAGES","links":[4]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"6d47a67b859745d5a86f463d8edfd7da0d1cfa6b","Node name for S&R":"Runware Text Inference Messages"},"widgets_values":[],"bgcolor":"#5345bf"},{"id":9,"type":"Runware Text Inference Settings","pos":[-6.560511112213135,948.0151977539062],"size":[400,658],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"useSystemPrompt","name":"useSystemPrompt","shape":7,"type":"BOOLEAN","widget":{"name":"useSystemPrompt"},"link":null},{"localized_name":"systemPrompt","name":"systemPrompt","shape":7,"type":"STRING","widget":{"name":"systemPrompt"},"link":null},{"localized_name":"useMaxTokens","name":"useMaxTokens","shape":7,"type":"BOOLEAN","widget":{"name":"useMaxTokens"},"link":null},{"localized_name":"maxTokens","name":"maxTokens","shape":7,"type":"INT","widget":{"name":"maxTokens"},"link":null},{"localized_name":"useTemperature","name":"useTemperature","shape":7,"type":"BOOLEAN","widget":{"name":"useTemperature"},"link":null},{"localized_name":"temperature","name":"temperature","shape":7,"type":"FLOAT","widget":{"name":"temperature"},"link":null},{"localized_name":"useTopP","name":"useTopP","shape":7,"type":"BOOLEAN","widget":{"name":"useTopP"},"link":null},{"localized_name":"topP","name":"topP","shape":7,"type":"FLOAT","widget":{"name":"topP"},"link":null},{"localized_name":"useTopK","name":"useTopK","shape":7,"type":"BOOLEAN","widget":{"name":"useTopK"},"link":null},{"localized_name":"topK","name":"topK","shape":7,"type":"INT","widget":{"name":"topK"},"link":null},{"localized_name":"useStopSequences","name":"useStopSequences","shape":7,"type":"BOOLEAN","widget":{"name":"useStopSequences"},"link":null},{"localized_name":"stopSequences","name":"stopSequences","shape":7,"type":"STRING","widget":{"name":"stopSequences"},"link":null},{"localized_name":"usePresencePenalty","name":"usePresencePenalty","shape":7,"type":"BOOLEAN","widget":{"name":"usePresencePenalty"},"link":null},{"localized_name":"presencePenalty","name":"presencePenalty","shape":7,"type":"FLOAT","widget":{"name":"presencePenalty"},"link":null},{"localized_name":"useFrequencyPenalty","name":"useFrequencyPenalty","shape":7,"type":"BOOLEAN","widget":{"name":"useFrequencyPenalty"},"link":null},{"localized_name":"frequencyPenalty","name":"frequencyPenalty","shape":7,"type":"FLOAT","widget":{"name":"frequencyPenalty"},"link":null},{"localized_name":"useTools","name":"useTools","shape":7,"type":"BOOLEAN","widget":{"name":"useTools"},"link":null},{"localized_name":"tools","name":"tools","shape":7,"type":"STRING","widget":{"name":"tools"},"link":null},{"localized_name":"useToolChoice","name":"useToolChoice","shape":7,"type":"BOOLEAN","widget":{"name":"useToolChoice"},"link":null},{"localized_name":"toolChoice","name":"toolChoice","shape":7,"type":"STRING","widget":{"name":"toolChoice"},"link":null},{"localized_name":"thinkingLevel","name":"thinkingLevel","shape":7,"type":"COMBO","widget":{"name":"thinkingLevel"},"link":null}],"outputs":[{"localized_name":"settings","name":"settings","type":"RUNWARETEXTINFERENCESETTINGS","links":[6]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"6d47a67b859745d5a86f463d8edfd7da0d1cfa6b","Node name for S&R":"Runware Text Inference Settings"},"widgets_values":[false,"",false,32768,false,1,true,0.95,false,40,"high","",false,0,false,0,false,"[]",false,"{}","none"],"bgcolor":"#5345bf"},{"id":3,"type":"Runware Text Model Search","pos":[81.07406616210938,741.3767700195312],"size":[270,130],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"Model Search","name":"Model Search","type":"STRING","widget":{"name":"Model Search"},"link":null},{"localized_name":"Model Provider","name":"Model Provider","type":"COMBO","widget":{"name":"Model Provider"},"link":null},{"localized_name":"TextList","name":"TextList","type":"COMBO","widget":{"name":"TextList"},"link":null},{"localized_name":"Use Search Value","name":"Use Search Value","type":"BOOLEAN","widget":{"name":"Use Search Value"},"link":null}],"outputs":[{"localized_name":"model","name":"model","type":"RUNWARETEXTMODEL","links":[1]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"6d47a67b859745d5a86f463d8edfd7da0d1cfa6b","Node name for S&R":"Runware Text Model Search"},"widgets_values":["","Zai","zai-glm-5-1 (ZAI GLM 5.1)",false],"bgcolor":"#5345bf"},{"id":8,"type":"Runware Text Inference Message","pos":[457.5366516113281,1134.87060546875],"size":[400,200],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"role","name":"role","type":"COMBO","widget":{"name":"role"},"link":null},{"localized_name":"content","name":"content","type":"STRING","widget":{"name":"content"},"link":null}],"outputs":[{"localized_name":"message","name":"message","type":"RUNWARETEXTINFERENCEMESSAGE","links":[5]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"6d47a67b859745d5a86f463d8edfd7da0d1cfa6b","Node name for S&R":"Runware Text Inference Message"},"widgets_values":["user","Outline a 5-step plan to buy beta fish from a pet store"],"bgcolor":"#5345bf"},{"id":4,"type":"Runware Save Text","pos":[950.5037841796875,745.9119262695312],"size":[621.9185791015625,757.6689453125],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"text","name":"text","type":"STRING","widget":{"name":"text"},"link":2}],"outputs":[{"localized_name":"text","name":"text","type":"STRING","links":null}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"6d47a67b859745d5a86f463d8edfd7da0d1cfa6b","Node name for S&R":"Runware Save Text"},"widgets_values":["Here is a 5-step plan to successfully buy a healthy betta fish from a pet store:\n\n**Step 1: Set Up the Tank First (The \"Cycle Before You Buy\" Rule)**\nNever buy the fish and the tank on the same day. A betta needs a properly cycled tank to survive, which means building up beneficial bacteria that break down toxic fish waste. \n* **Buy the essentials:** A tank (5 gallons minimum is highly recommended), a gentle filter, an adjustable heater (bettas need 78-80°F water), substrate, hiding spots, and a lid (bettas are jumpers). \n* **Start the Nitrogen Cycle:** Set up the tank, turn on the filter and heater, and add a water conditioner and beneficial bacteria starter. This cycling process takes 2 to 6 weeks. Only move to Step 2 once the tank can process ammonia and nitrite down to 0 ppm.\n\n**Step 2: Choose a Reputable Store**\nNot all pet stores care for their fish equally. Scout out a few stores in your area before committing to buying.\n* **Inspect the store:** Look at the overall cleanliness of the fish area. Are the aisles tidy? Do the tanks look well-maintained?\n* **Look at the other fish:** Are the tanks overcrowded? Are there dead fish in the tanks? If a store has multiple dead or visibly sick fish, walk away.\n\n**Step 3: Inspect and Select a Healthy Betta**\nBettas are often kept in small cups, which makes them vulnerable to illness. You need to observe the fish closely before choosing one.\n* **Look at the water:** A little discoloration is normal, but if the water is thick, foul-smelling, or filled with floating debris, the fish is likely stressed.\n* **Observe the fish's body:** Look for clear, bright eyes, intact fins (no ragged, black, or white-edged tears), and smooth scales. Avoid fish with white fuzzy patches (fungus), white spots (ich), or bloated stomachs.\n* **Observe the fish's behavior:** A healthy betta is alert. Gently tap the cup or wave your hand near it. The fish should respond by flaring its gills, swimming actively, or looking at you. Avoid fish that float listlessly at the top or sink to the bottom unresponsive.\n\n**Step 4: Purchase and Transport Safely**\nOnce you have chosen your fish, it is time to bring it home. Minimizing stress during transport is crucial.\n* **Buy the right food:** If you haven't already, purchase high-quality betta pellets (with fish meal or whole fish as the first ingredient) and maybe some freeze-dried bloodworms for treats.\n* **Transport smartly:** Pet stores usually give you a small plastic bag. If it is very cold or hot outside, place the bagged fish inside a paper bag to block out light (which reduces stress), and then inside a small cooler or insulated bag to regulate the temperature. Go straight home—do not run other errands.\n\n**Step 5: Acclimate to the New Tank**\nDo not simply pour the fish directly into its new tank. The water parameters (temperature, pH) from the store's cup are very different from your established tank. Sudden changes can send a fish into shock.\n* **Float the cup:** Gently pour the fish and the store water into a small, clean container (or keep it in the bag). Float this container in your prepared tank for 15–20 minutes so the temperatures equalize.\n* **Drip acclimate:** Over the next 20–30 minutes, add small amounts (about a tablespoon at a time) of your tank water into the container with the fish. This slowly adjusts the fish to your water's chemistry.\n* **Net and release:** Once the water volume in the container has roughly doubled with your tank water, use a soft net to gently scoop the fish out and place it into its new tank. **Do not** pour the water from the store into your tank, as it may contain parasites or diseases. Turn off the tank lights for the first few hours to let the fish decompress."],"bgcolor":"#5345bf"}],"links":[[1,3,0,1,0,"RUNWARETEXTMODEL"],[2,1,0,4,0,"STRING"],[4,5,0,1,1,"RUNWARETEXTINFERENCEMESSAGES"],[5,8,0,5,0,"RUNWARETEXTINFERENCEMESSAGE"],[6,9,0,1,2,"RUNWARETEXTINFERENCESETTINGS"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6830134553650705,"offset":[307.04397258867573,-505.9291598819246]}},"version":0.4} \ No newline at end of file From 6c0e1331985f638d6d579ddd4f7dbbadeba7faf1 Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Fri, 17 Apr 2026 19:09:25 +0530 Subject: [PATCH 11/19] Revert "Added new settings params for textInference" This reverts commit 7f2b73fd4aade8ab5c9b19a101300d4c01be8429. --- clientlibs/utils.js | 20 +-- modules/textInferenceSettings.py | 163 +++--------------- modules/textModelSearch.py | 4 - modules/utils/runwareUtils.py | 2 +- workflows/Runware_Text_Inference_GLM_5_1.json | 1 - 5 files changed, 23 insertions(+), 167 deletions(-) delete mode 100644 workflows/Runware_Text_Inference_GLM_5_1.json diff --git a/clientlibs/utils.js b/clientlibs/utils.js index fe06b2d..7dd3ecc 100644 --- a/clientlibs/utils.js +++ b/clientlibs/utils.js @@ -1337,7 +1337,7 @@ function textInferenceSettingsToggleHandler(settingsNode) { if (!settingsNode?.widgets) return; const useSystemPromptWidget = settingsNode.widgets.find(w => w && w.name === "useSystemPrompt"); - const systemWidget = settingsNode.widgets.find(w => w && (w.name === "systemPrompt" || w.name === "system")); + const systemWidget = settingsNode.widgets.find(w => w && w.name === "system"); const useMaxTokensWidget = settingsNode.widgets.find(w => w && w.name === "useMaxTokens"); const maxTokensWidget = settingsNode.widgets.find(w => w && w.name === "maxTokens"); const useTemperatureWidget = settingsNode.widgets.find(w => w && w.name === "useTemperature"); @@ -1346,16 +1346,6 @@ function textInferenceSettingsToggleHandler(settingsNode) { const topPWidget = settingsNode.widgets.find(w => w && w.name === "topP"); const useTopKWidget = settingsNode.widgets.find(w => w && w.name === "useTopK"); const topKWidget = settingsNode.widgets.find(w => w && w.name === "topK"); - const useStopSequencesWidget = settingsNode.widgets.find(w => w && w.name === "useStopSequences"); - const stopSequencesWidget = settingsNode.widgets.find(w => w && w.name === "stopSequences"); - const usePresencePenaltyWidget = settingsNode.widgets.find(w => w && w.name === "usePresencePenalty"); - const presencePenaltyWidget = settingsNode.widgets.find(w => w && w.name === "presencePenalty"); - const useFrequencyPenaltyWidget = settingsNode.widgets.find(w => w && w.name === "useFrequencyPenalty"); - const frequencyPenaltyWidget = settingsNode.widgets.find(w => w && w.name === "frequencyPenalty"); - const useToolsWidget = settingsNode.widgets.find(w => w && w.name === "useTools"); - const toolsWidget = settingsNode.widgets.find(w => w && w.name === "tools"); - const useToolChoiceWidget = settingsNode.widgets.find(w => w && w.name === "useToolChoice"); - const toolChoiceWidget = settingsNode.widgets.find(w => w && w.name === "toolChoice"); function toggleWidgetState(useWidget, paramWidget) { if (!useWidget || !paramWidget) return; @@ -1378,11 +1368,6 @@ function textInferenceSettingsToggleHandler(settingsNode) { if (useTemperatureWidget && temperatureWidget) toggleWidgetState(useTemperatureWidget, temperatureWidget); if (useTopPWidget && topPWidget) toggleWidgetState(useTopPWidget, topPWidget); if (useTopKWidget && topKWidget) toggleWidgetState(useTopKWidget, topKWidget); - if (useStopSequencesWidget && stopSequencesWidget) toggleWidgetState(useStopSequencesWidget, stopSequencesWidget); - if (usePresencePenaltyWidget && presencePenaltyWidget) toggleWidgetState(usePresencePenaltyWidget, presencePenaltyWidget); - if (useFrequencyPenaltyWidget && frequencyPenaltyWidget) toggleWidgetState(useFrequencyPenaltyWidget, frequencyPenaltyWidget); - if (useToolsWidget && toolsWidget) toggleWidgetState(useToolsWidget, toolsWidget); - if (useToolChoiceWidget && toolChoiceWidget) toggleWidgetState(useToolChoiceWidget, toolChoiceWidget); } function videoSettingsToggleHandler(settingsNode) { @@ -3062,9 +3047,6 @@ function textModelSearchFilterHandler(textModelSearchNode) { "Google": [ "google:gemini@3-flash (Gemini 3 Flash)", ], - "Zai": [ - "zai-glm-5-1 (ZAI GLM 5.1)", - ], }; function filterModelList() { diff --git a/modules/textInferenceSettings.py b/modules/textInferenceSettings.py index 7cc977b..4725e5b 100644 --- a/modules/textInferenceSettings.py +++ b/modules/textInferenceSettings.py @@ -1,15 +1,11 @@ -import json -from typing import Any, Dict, List, Tuple +from typing import Any, Dict, Tuple class RunwareTextInferenceSettings: """Optional generation controls for Runware Text Inference (flat task.settings per API).""" _MAX_SYSTEM_CHARS = 200000 - _MAX_TOKENS_CAP = 131072 - _MAX_TOP_K = 100647 - _MAX_STOP_ITEMS = 5 - _MAX_STOP_ITEM_CHARS = 50 + _MAX_TOKENS_CAP = 196608 @classmethod def INPUT_TYPES(cls): @@ -20,17 +16,17 @@ class RunwareTextInferenceSettings: "default": False, "tooltip": "Include systemPrompt in settings.", }), - "systemPrompt": ("STRING", { + "system": ("STRING", { "multiline": True, "default": "", - "tooltip": "System instruction (max 200,000 chars).", + "tooltip": "System instruction (max 200,000 characters). Sent as systemPrompt.", }), "useMaxTokens": ("BOOLEAN", { "default": False, "tooltip": "Include maxTokens in settings.", }), "maxTokens": ("INT", { - "default": 4096, + "default": 32768, "min": 1, "max": cls._MAX_TOKENS_CAP, "step": 1, @@ -42,21 +38,21 @@ class RunwareTextInferenceSettings: }), "temperature": ("FLOAT", { "default": 1.0, - "min": 0.0, + "min": 0.01, "max": 1.0, "step": 0.01, - "tooltip": "Sampling temperature (0.0–1.0).", + "tooltip": "Sampling temperature on (0, 1].", }), "useTopP": ("BOOLEAN", { "default": False, "tooltip": "Include topP in settings.", }), "topP": ("FLOAT", { - "default": 1.0, - "min": 0.01, + "default": 0.95, + "min": 0.0, "max": 1.0, "step": 0.01, - "tooltip": "Nucleus sampling (0.01–1.0).", + "tooltip": "Nucleus sampling (0.0–1.0).", }), "useTopK": ("BOOLEAN", { "default": False, @@ -65,62 +61,13 @@ class RunwareTextInferenceSettings: "topK": ("INT", { "default": 40, "min": 1, - "max": cls._MAX_TOP_K, + "max": 128, "step": 1, - "tooltip": f"Top-k sampling (1–{cls._MAX_TOP_K}).", + "tooltip": "Top-k sampling (1–128).", }), - "useStopSequences": ("BOOLEAN", { - "default": False, - "tooltip": "Include stopSequences in settings.", - }), - "stopSequences": ("STRING", { - "multiline": True, - "default": "", - "tooltip": "Stop sequences: one per line (max 5 items, 50 chars each).", - }), - "usePresencePenalty": ("BOOLEAN", { - "default": False, - "tooltip": "Include presencePenalty in settings.", - }), - "presencePenalty": ("FLOAT", { - "default": 0.0, - "min": -2.0, - "max": 2.0, - "step": 0.01, - "tooltip": "Presence penalty (-2.0 to 2.0).", - }), - "useFrequencyPenalty": ("BOOLEAN", { - "default": False, - "tooltip": "Include frequencyPenalty in settings.", - }), - "frequencyPenalty": ("FLOAT", { - "default": 0.0, - "min": -2.0, - "max": 2.0, - "step": 0.01, - "tooltip": "Frequency penalty (-2.0 to 2.0).", - }), - "useTools": ("BOOLEAN", { - "default": False, - "tooltip": "Include tools in settings.", - }), - "tools": ("STRING", { - "multiline": True, - "default": "[]", - "tooltip": "JSON array for tools.", - }), - "useToolChoice": ("BOOLEAN", { - "default": False, - "tooltip": "Include toolChoice in settings.", - }), - "toolChoice": ("STRING", { - "multiline": True, - "default": "{}", - "tooltip": "JSON object for toolChoice.", - }), - "thinkingLevel": (["none", "low", "medium", "high"], { - "default": "none", - "tooltip": "Extended reasoning level: none, low, medium, high.", + "thinkingLevel": (["off", "minimal", "low", "medium", "high"], { + "default": "off", + "tooltip": "thinkingLevel in settings (omit when off).", }), }, } @@ -130,102 +77,34 @@ class RunwareTextInferenceSettings: FUNCTION = "create_settings" CATEGORY = "Runware/Text" DESCRIPTION = ( - "Optional text inference settings (systemPrompt, maxTokens, temperature, topP, topK, " - "stopSequences, presencePenalty, frequencyPenalty, tools, toolChoice, thinkingLevel). " + "Optional text inference settings (flat: systemPrompt, maxTokens, temperature, topP, topK, thinkingLevel). " "Connect to Runware Text Inference." ) - @staticmethod - def _parse_json_setting(raw: Any, expected_type: type, field_name: str) -> Any: - if isinstance(raw, expected_type): - return raw - if raw is None: - return expected_type() - - text = str(raw).strip() - if not text: - return expected_type() - - try: - parsed = json.loads(text) - except Exception as exc: - raise Exception(f"{field_name} must be valid JSON.") from exc - - if not isinstance(parsed, expected_type): - expected = "array" if expected_type is list else "object" - raise Exception(f"{field_name} must be a JSON {expected}.") - return parsed - - def _parse_stop_sequences(self, raw: Any) -> List[str]: - if raw is None: - return [] - - items: List[str] = [] - if isinstance(raw, (list, tuple)): - for item in raw: - text = str(item).strip() - if text: - items.append(text) - else: - text = str(raw).strip() - if text: - normalized = text.replace("\r\n", "\n").replace(",", "\n") - items = [segment.strip() for segment in normalized.split("\n") if segment.strip()] - - if len(items) > self._MAX_STOP_ITEMS: - raise Exception(f"stopSequences supports up to {self._MAX_STOP_ITEMS} items.") - for idx, item in enumerate(items, start=1): - if len(item) > self._MAX_STOP_ITEM_CHARS: - raise Exception( - f"stopSequences item {idx} exceeds {self._MAX_STOP_ITEM_CHARS} characters." - ) - return items - def create_settings(self, **kwargs) -> Tuple[Dict[str, Any], ...]: out: Dict[str, Any] = {} if kwargs.get("useSystemPrompt", False): - sys_text = (kwargs.get("systemPrompt") or kwargs.get("system") or "").strip() + sys_text = (kwargs.get("system") or "").strip() if sys_text: if len(sys_text) > self._MAX_SYSTEM_CHARS: sys_text = sys_text[: self._MAX_SYSTEM_CHARS] out["systemPrompt"] = sys_text if kwargs.get("useMaxTokens", False): - out["maxTokens"] = int(kwargs.get("maxTokens", 4096)) + out["maxTokens"] = int(kwargs.get("maxTokens", 32768)) if kwargs.get("useTemperature", False): out["temperature"] = float(kwargs.get("temperature", 1.0)) if kwargs.get("useTopP", False): - out["topP"] = float(kwargs.get("topP", 1.0)) + out["topP"] = float(kwargs.get("topP", 0.95)) if kwargs.get("useTopK", False): out["topK"] = int(kwargs.get("topK", 40)) - if kwargs.get("useStopSequences", False): - parsed_stop = self._parse_stop_sequences(kwargs.get("stopSequences", "")) - if parsed_stop: - out["stopSequences"] = parsed_stop - - if kwargs.get("usePresencePenalty", False): - out["presencePenalty"] = float(kwargs.get("presencePenalty", 0.0)) - - if kwargs.get("useFrequencyPenalty", False): - out["frequencyPenalty"] = float(kwargs.get("frequencyPenalty", 0.0)) - - if kwargs.get("useTools", False): - parsed_tools = self._parse_json_setting(kwargs.get("tools"), list, "tools") - if parsed_tools: - out["tools"] = parsed_tools - - if kwargs.get("useToolChoice", False): - parsed_choice = self._parse_json_setting(kwargs.get("toolChoice"), dict, "toolChoice") - if parsed_choice: - out["toolChoice"] = parsed_choice - - tl = kwargs.get("thinkingLevel", "none") - if tl != "none": + tl = kwargs.get("thinkingLevel", "off") + if tl != "off": out["thinkingLevel"] = tl if not out: diff --git a/modules/textModelSearch.py b/modules/textModelSearch.py index d81e7ed..46c6e93 100644 --- a/modules/textModelSearch.py +++ b/modules/textModelSearch.py @@ -16,9 +16,6 @@ class RunwareTextModelSearch: "Google": [ "google:gemini@3-flash (Gemini 3 Flash)", ], - "Zai": [ - "zai-glm-5-1 (ZAI GLM 5.1)", - ], } MODEL_PROVIDERS = [ @@ -26,7 +23,6 @@ class RunwareTextModelSearch: "Google", "MiniMax", "OpenAI", - "Zai", ] @classmethod diff --git a/modules/utils/runwareUtils.py b/modules/utils/runwareUtils.py index 75ba920..0c97b0f 100644 --- a/modules/utils/runwareUtils.py +++ b/modules/utils/runwareUtils.py @@ -158,7 +158,7 @@ def getCustomEndpoint(): custom_endpoint = os.getenv("RUNWARE_CUSTOM_ENDPOINT") if custom_endpoint and isinstance(custom_endpoint, str): return custom_endpoint - return "https://api.runware.dev/v1" + return "https://api.runware.ai/v1" SESSION_TIMEOUT = getTimeout() RUNWARE_API_KEY = getAPIKey() diff --git a/workflows/Runware_Text_Inference_GLM_5_1.json b/workflows/Runware_Text_Inference_GLM_5_1.json deleted file mode 100644 index 893030b..0000000 --- a/workflows/Runware_Text_Inference_GLM_5_1.json +++ /dev/null @@ -1 +0,0 @@ -{"id":"f1dab8a9-11a7-4fa3-9a3b-35351c84a964","revision":0,"last_node_id":10,"last_link_id":6,"nodes":[{"id":1,"type":"Runware Text Inference","pos":[497.6562194824219,734.759521484375],"size":[270,122],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"model","name":"model","type":"RUNWARETEXTMODEL","link":1},{"localized_name":"messages","name":"messages","type":"RUNWARETEXTINFERENCEMESSAGES","link":4},{"localized_name":"settings","name":"settings","shape":7,"type":"RUNWARETEXTINFERENCESETTINGS","link":6},{"localized_name":"providerSettings","name":"providerSettings","shape":7,"type":"RUNWAREPROVIDERSETTINGS","link":null}],"outputs":[{"localized_name":"text","name":"text","type":"STRING","links":[2]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"6d47a67b859745d5a86f463d8edfd7da0d1cfa6b","Node name for S&R":"Runware Text Inference"},"widgets_values":[],"bgcolor":"#5345bf"},{"id":5,"type":"Runware Text Inference Messages","pos":[503.0782165527344,919.4880981445312],"size":[255.45077514648438,166],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"Message Segment 1","name":"Message Segment 1","type":"RUNWARETEXTINFERENCEMESSAGE","link":5},{"localized_name":"Message Segment 2","name":"Message Segment 2","shape":7,"type":"RUNWARETEXTINFERENCEMESSAGE","link":null},{"localized_name":"Message Segment 3","name":"Message Segment 3","shape":7,"type":"RUNWARETEXTINFERENCEMESSAGE","link":null},{"localized_name":"Message Segment 4","name":"Message Segment 4","shape":7,"type":"RUNWARETEXTINFERENCEMESSAGE","link":null},{"localized_name":"Message Segment 5","name":"Message Segment 5","shape":7,"type":"RUNWARETEXTINFERENCEMESSAGE","link":null},{"localized_name":"Message Segment 6","name":"Message Segment 6","shape":7,"type":"RUNWARETEXTINFERENCEMESSAGE","link":null},{"localized_name":"Message Segment 7","name":"Message Segment 7","shape":7,"type":"RUNWARETEXTINFERENCEMESSAGE","link":null},{"localized_name":"Message Segment 8","name":"Message Segment 8","shape":7,"type":"RUNWARETEXTINFERENCEMESSAGE","link":null}],"outputs":[{"localized_name":"messages","name":"messages","type":"RUNWARETEXTINFERENCEMESSAGES","links":[4]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"6d47a67b859745d5a86f463d8edfd7da0d1cfa6b","Node name for S&R":"Runware Text Inference Messages"},"widgets_values":[],"bgcolor":"#5345bf"},{"id":9,"type":"Runware Text Inference Settings","pos":[-6.560511112213135,948.0151977539062],"size":[400,658],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"useSystemPrompt","name":"useSystemPrompt","shape":7,"type":"BOOLEAN","widget":{"name":"useSystemPrompt"},"link":null},{"localized_name":"systemPrompt","name":"systemPrompt","shape":7,"type":"STRING","widget":{"name":"systemPrompt"},"link":null},{"localized_name":"useMaxTokens","name":"useMaxTokens","shape":7,"type":"BOOLEAN","widget":{"name":"useMaxTokens"},"link":null},{"localized_name":"maxTokens","name":"maxTokens","shape":7,"type":"INT","widget":{"name":"maxTokens"},"link":null},{"localized_name":"useTemperature","name":"useTemperature","shape":7,"type":"BOOLEAN","widget":{"name":"useTemperature"},"link":null},{"localized_name":"temperature","name":"temperature","shape":7,"type":"FLOAT","widget":{"name":"temperature"},"link":null},{"localized_name":"useTopP","name":"useTopP","shape":7,"type":"BOOLEAN","widget":{"name":"useTopP"},"link":null},{"localized_name":"topP","name":"topP","shape":7,"type":"FLOAT","widget":{"name":"topP"},"link":null},{"localized_name":"useTopK","name":"useTopK","shape":7,"type":"BOOLEAN","widget":{"name":"useTopK"},"link":null},{"localized_name":"topK","name":"topK","shape":7,"type":"INT","widget":{"name":"topK"},"link":null},{"localized_name":"useStopSequences","name":"useStopSequences","shape":7,"type":"BOOLEAN","widget":{"name":"useStopSequences"},"link":null},{"localized_name":"stopSequences","name":"stopSequences","shape":7,"type":"STRING","widget":{"name":"stopSequences"},"link":null},{"localized_name":"usePresencePenalty","name":"usePresencePenalty","shape":7,"type":"BOOLEAN","widget":{"name":"usePresencePenalty"},"link":null},{"localized_name":"presencePenalty","name":"presencePenalty","shape":7,"type":"FLOAT","widget":{"name":"presencePenalty"},"link":null},{"localized_name":"useFrequencyPenalty","name":"useFrequencyPenalty","shape":7,"type":"BOOLEAN","widget":{"name":"useFrequencyPenalty"},"link":null},{"localized_name":"frequencyPenalty","name":"frequencyPenalty","shape":7,"type":"FLOAT","widget":{"name":"frequencyPenalty"},"link":null},{"localized_name":"useTools","name":"useTools","shape":7,"type":"BOOLEAN","widget":{"name":"useTools"},"link":null},{"localized_name":"tools","name":"tools","shape":7,"type":"STRING","widget":{"name":"tools"},"link":null},{"localized_name":"useToolChoice","name":"useToolChoice","shape":7,"type":"BOOLEAN","widget":{"name":"useToolChoice"},"link":null},{"localized_name":"toolChoice","name":"toolChoice","shape":7,"type":"STRING","widget":{"name":"toolChoice"},"link":null},{"localized_name":"thinkingLevel","name":"thinkingLevel","shape":7,"type":"COMBO","widget":{"name":"thinkingLevel"},"link":null}],"outputs":[{"localized_name":"settings","name":"settings","type":"RUNWARETEXTINFERENCESETTINGS","links":[6]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"6d47a67b859745d5a86f463d8edfd7da0d1cfa6b","Node name for S&R":"Runware Text Inference Settings"},"widgets_values":[false,"",false,32768,false,1,true,0.95,false,40,"high","",false,0,false,0,false,"[]",false,"{}","none"],"bgcolor":"#5345bf"},{"id":3,"type":"Runware Text Model Search","pos":[81.07406616210938,741.3767700195312],"size":[270,130],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"Model Search","name":"Model Search","type":"STRING","widget":{"name":"Model Search"},"link":null},{"localized_name":"Model Provider","name":"Model Provider","type":"COMBO","widget":{"name":"Model Provider"},"link":null},{"localized_name":"TextList","name":"TextList","type":"COMBO","widget":{"name":"TextList"},"link":null},{"localized_name":"Use Search Value","name":"Use Search Value","type":"BOOLEAN","widget":{"name":"Use Search Value"},"link":null}],"outputs":[{"localized_name":"model","name":"model","type":"RUNWARETEXTMODEL","links":[1]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"6d47a67b859745d5a86f463d8edfd7da0d1cfa6b","Node name for S&R":"Runware Text Model Search"},"widgets_values":["","Zai","zai-glm-5-1 (ZAI GLM 5.1)",false],"bgcolor":"#5345bf"},{"id":8,"type":"Runware Text Inference Message","pos":[457.5366516113281,1134.87060546875],"size":[400,200],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"role","name":"role","type":"COMBO","widget":{"name":"role"},"link":null},{"localized_name":"content","name":"content","type":"STRING","widget":{"name":"content"},"link":null}],"outputs":[{"localized_name":"message","name":"message","type":"RUNWARETEXTINFERENCEMESSAGE","links":[5]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"6d47a67b859745d5a86f463d8edfd7da0d1cfa6b","Node name for S&R":"Runware Text Inference Message"},"widgets_values":["user","Outline a 5-step plan to buy beta fish from a pet store"],"bgcolor":"#5345bf"},{"id":4,"type":"Runware Save Text","pos":[950.5037841796875,745.9119262695312],"size":[621.9185791015625,757.6689453125],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"text","name":"text","type":"STRING","widget":{"name":"text"},"link":2}],"outputs":[{"localized_name":"text","name":"text","type":"STRING","links":null}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"6d47a67b859745d5a86f463d8edfd7da0d1cfa6b","Node name for S&R":"Runware Save Text"},"widgets_values":["Here is a 5-step plan to successfully buy a healthy betta fish from a pet store:\n\n**Step 1: Set Up the Tank First (The \"Cycle Before You Buy\" Rule)**\nNever buy the fish and the tank on the same day. A betta needs a properly cycled tank to survive, which means building up beneficial bacteria that break down toxic fish waste. \n* **Buy the essentials:** A tank (5 gallons minimum is highly recommended), a gentle filter, an adjustable heater (bettas need 78-80°F water), substrate, hiding spots, and a lid (bettas are jumpers). \n* **Start the Nitrogen Cycle:** Set up the tank, turn on the filter and heater, and add a water conditioner and beneficial bacteria starter. This cycling process takes 2 to 6 weeks. Only move to Step 2 once the tank can process ammonia and nitrite down to 0 ppm.\n\n**Step 2: Choose a Reputable Store**\nNot all pet stores care for their fish equally. Scout out a few stores in your area before committing to buying.\n* **Inspect the store:** Look at the overall cleanliness of the fish area. Are the aisles tidy? Do the tanks look well-maintained?\n* **Look at the other fish:** Are the tanks overcrowded? Are there dead fish in the tanks? If a store has multiple dead or visibly sick fish, walk away.\n\n**Step 3: Inspect and Select a Healthy Betta**\nBettas are often kept in small cups, which makes them vulnerable to illness. You need to observe the fish closely before choosing one.\n* **Look at the water:** A little discoloration is normal, but if the water is thick, foul-smelling, or filled with floating debris, the fish is likely stressed.\n* **Observe the fish's body:** Look for clear, bright eyes, intact fins (no ragged, black, or white-edged tears), and smooth scales. Avoid fish with white fuzzy patches (fungus), white spots (ich), or bloated stomachs.\n* **Observe the fish's behavior:** A healthy betta is alert. Gently tap the cup or wave your hand near it. The fish should respond by flaring its gills, swimming actively, or looking at you. Avoid fish that float listlessly at the top or sink to the bottom unresponsive.\n\n**Step 4: Purchase and Transport Safely**\nOnce you have chosen your fish, it is time to bring it home. Minimizing stress during transport is crucial.\n* **Buy the right food:** If you haven't already, purchase high-quality betta pellets (with fish meal or whole fish as the first ingredient) and maybe some freeze-dried bloodworms for treats.\n* **Transport smartly:** Pet stores usually give you a small plastic bag. If it is very cold or hot outside, place the bagged fish inside a paper bag to block out light (which reduces stress), and then inside a small cooler or insulated bag to regulate the temperature. Go straight home—do not run other errands.\n\n**Step 5: Acclimate to the New Tank**\nDo not simply pour the fish directly into its new tank. The water parameters (temperature, pH) from the store's cup are very different from your established tank. Sudden changes can send a fish into shock.\n* **Float the cup:** Gently pour the fish and the store water into a small, clean container (or keep it in the bag). Float this container in your prepared tank for 15–20 minutes so the temperatures equalize.\n* **Drip acclimate:** Over the next 20–30 minutes, add small amounts (about a tablespoon at a time) of your tank water into the container with the fish. This slowly adjusts the fish to your water's chemistry.\n* **Net and release:** Once the water volume in the container has roughly doubled with your tank water, use a soft net to gently scoop the fish out and place it into its new tank. **Do not** pour the water from the store into your tank, as it may contain parasites or diseases. Turn off the tank lights for the first few hours to let the fish decompress."],"bgcolor":"#5345bf"}],"links":[[1,3,0,1,0,"RUNWARETEXTMODEL"],[2,1,0,4,0,"STRING"],[4,5,0,1,1,"RUNWARETEXTINFERENCEMESSAGES"],[5,8,0,5,0,"RUNWARETEXTINFERENCEMESSAGE"],[6,9,0,1,2,"RUNWARETEXTINFERENCESETTINGS"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6830134553650705,"offset":[307.04397258867573,-505.9291598819246]}},"version":0.4} \ No newline at end of file From 085e0d73d1f1ff826302dd3521d977cd0d664058 Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Fri, 17 Apr 2026 19:11:28 +0530 Subject: [PATCH 12/19] Revert "Revert "Added new settings params for textInference"" This reverts commit 6c0e1331985f638d6d579ddd4f7dbbadeba7faf1. --- clientlibs/utils.js | 20 ++- modules/textInferenceSettings.py | 163 +++++++++++++++--- modules/textModelSearch.py | 4 + modules/utils/runwareUtils.py | 2 +- workflows/Runware_Text_Inference_GLM_5_1.json | 1 + 5 files changed, 167 insertions(+), 23 deletions(-) create mode 100644 workflows/Runware_Text_Inference_GLM_5_1.json diff --git a/clientlibs/utils.js b/clientlibs/utils.js index 7dd3ecc..fe06b2d 100644 --- a/clientlibs/utils.js +++ b/clientlibs/utils.js @@ -1337,7 +1337,7 @@ function textInferenceSettingsToggleHandler(settingsNode) { if (!settingsNode?.widgets) return; const useSystemPromptWidget = settingsNode.widgets.find(w => w && w.name === "useSystemPrompt"); - const systemWidget = settingsNode.widgets.find(w => w && w.name === "system"); + const systemWidget = settingsNode.widgets.find(w => w && (w.name === "systemPrompt" || w.name === "system")); const useMaxTokensWidget = settingsNode.widgets.find(w => w && w.name === "useMaxTokens"); const maxTokensWidget = settingsNode.widgets.find(w => w && w.name === "maxTokens"); const useTemperatureWidget = settingsNode.widgets.find(w => w && w.name === "useTemperature"); @@ -1346,6 +1346,16 @@ function textInferenceSettingsToggleHandler(settingsNode) { const topPWidget = settingsNode.widgets.find(w => w && w.name === "topP"); const useTopKWidget = settingsNode.widgets.find(w => w && w.name === "useTopK"); const topKWidget = settingsNode.widgets.find(w => w && w.name === "topK"); + const useStopSequencesWidget = settingsNode.widgets.find(w => w && w.name === "useStopSequences"); + const stopSequencesWidget = settingsNode.widgets.find(w => w && w.name === "stopSequences"); + const usePresencePenaltyWidget = settingsNode.widgets.find(w => w && w.name === "usePresencePenalty"); + const presencePenaltyWidget = settingsNode.widgets.find(w => w && w.name === "presencePenalty"); + const useFrequencyPenaltyWidget = settingsNode.widgets.find(w => w && w.name === "useFrequencyPenalty"); + const frequencyPenaltyWidget = settingsNode.widgets.find(w => w && w.name === "frequencyPenalty"); + const useToolsWidget = settingsNode.widgets.find(w => w && w.name === "useTools"); + const toolsWidget = settingsNode.widgets.find(w => w && w.name === "tools"); + const useToolChoiceWidget = settingsNode.widgets.find(w => w && w.name === "useToolChoice"); + const toolChoiceWidget = settingsNode.widgets.find(w => w && w.name === "toolChoice"); function toggleWidgetState(useWidget, paramWidget) { if (!useWidget || !paramWidget) return; @@ -1368,6 +1378,11 @@ function textInferenceSettingsToggleHandler(settingsNode) { if (useTemperatureWidget && temperatureWidget) toggleWidgetState(useTemperatureWidget, temperatureWidget); if (useTopPWidget && topPWidget) toggleWidgetState(useTopPWidget, topPWidget); if (useTopKWidget && topKWidget) toggleWidgetState(useTopKWidget, topKWidget); + if (useStopSequencesWidget && stopSequencesWidget) toggleWidgetState(useStopSequencesWidget, stopSequencesWidget); + if (usePresencePenaltyWidget && presencePenaltyWidget) toggleWidgetState(usePresencePenaltyWidget, presencePenaltyWidget); + if (useFrequencyPenaltyWidget && frequencyPenaltyWidget) toggleWidgetState(useFrequencyPenaltyWidget, frequencyPenaltyWidget); + if (useToolsWidget && toolsWidget) toggleWidgetState(useToolsWidget, toolsWidget); + if (useToolChoiceWidget && toolChoiceWidget) toggleWidgetState(useToolChoiceWidget, toolChoiceWidget); } function videoSettingsToggleHandler(settingsNode) { @@ -3047,6 +3062,9 @@ function textModelSearchFilterHandler(textModelSearchNode) { "Google": [ "google:gemini@3-flash (Gemini 3 Flash)", ], + "Zai": [ + "zai-glm-5-1 (ZAI GLM 5.1)", + ], }; function filterModelList() { diff --git a/modules/textInferenceSettings.py b/modules/textInferenceSettings.py index 4725e5b..7cc977b 100644 --- a/modules/textInferenceSettings.py +++ b/modules/textInferenceSettings.py @@ -1,11 +1,15 @@ -from typing import Any, Dict, Tuple +import json +from typing import Any, Dict, List, Tuple class RunwareTextInferenceSettings: """Optional generation controls for Runware Text Inference (flat task.settings per API).""" _MAX_SYSTEM_CHARS = 200000 - _MAX_TOKENS_CAP = 196608 + _MAX_TOKENS_CAP = 131072 + _MAX_TOP_K = 100647 + _MAX_STOP_ITEMS = 5 + _MAX_STOP_ITEM_CHARS = 50 @classmethod def INPUT_TYPES(cls): @@ -16,17 +20,17 @@ class RunwareTextInferenceSettings: "default": False, "tooltip": "Include systemPrompt in settings.", }), - "system": ("STRING", { + "systemPrompt": ("STRING", { "multiline": True, "default": "", - "tooltip": "System instruction (max 200,000 characters). Sent as systemPrompt.", + "tooltip": "System instruction (max 200,000 chars).", }), "useMaxTokens": ("BOOLEAN", { "default": False, "tooltip": "Include maxTokens in settings.", }), "maxTokens": ("INT", { - "default": 32768, + "default": 4096, "min": 1, "max": cls._MAX_TOKENS_CAP, "step": 1, @@ -38,21 +42,21 @@ class RunwareTextInferenceSettings: }), "temperature": ("FLOAT", { "default": 1.0, - "min": 0.01, + "min": 0.0, "max": 1.0, "step": 0.01, - "tooltip": "Sampling temperature on (0, 1].", + "tooltip": "Sampling temperature (0.0–1.0).", }), "useTopP": ("BOOLEAN", { "default": False, "tooltip": "Include topP in settings.", }), "topP": ("FLOAT", { - "default": 0.95, - "min": 0.0, + "default": 1.0, + "min": 0.01, "max": 1.0, "step": 0.01, - "tooltip": "Nucleus sampling (0.0–1.0).", + "tooltip": "Nucleus sampling (0.01–1.0).", }), "useTopK": ("BOOLEAN", { "default": False, @@ -61,13 +65,62 @@ class RunwareTextInferenceSettings: "topK": ("INT", { "default": 40, "min": 1, - "max": 128, + "max": cls._MAX_TOP_K, "step": 1, - "tooltip": "Top-k sampling (1–128).", + "tooltip": f"Top-k sampling (1–{cls._MAX_TOP_K}).", }), - "thinkingLevel": (["off", "minimal", "low", "medium", "high"], { - "default": "off", - "tooltip": "thinkingLevel in settings (omit when off).", + "useStopSequences": ("BOOLEAN", { + "default": False, + "tooltip": "Include stopSequences in settings.", + }), + "stopSequences": ("STRING", { + "multiline": True, + "default": "", + "tooltip": "Stop sequences: one per line (max 5 items, 50 chars each).", + }), + "usePresencePenalty": ("BOOLEAN", { + "default": False, + "tooltip": "Include presencePenalty in settings.", + }), + "presencePenalty": ("FLOAT", { + "default": 0.0, + "min": -2.0, + "max": 2.0, + "step": 0.01, + "tooltip": "Presence penalty (-2.0 to 2.0).", + }), + "useFrequencyPenalty": ("BOOLEAN", { + "default": False, + "tooltip": "Include frequencyPenalty in settings.", + }), + "frequencyPenalty": ("FLOAT", { + "default": 0.0, + "min": -2.0, + "max": 2.0, + "step": 0.01, + "tooltip": "Frequency penalty (-2.0 to 2.0).", + }), + "useTools": ("BOOLEAN", { + "default": False, + "tooltip": "Include tools in settings.", + }), + "tools": ("STRING", { + "multiline": True, + "default": "[]", + "tooltip": "JSON array for tools.", + }), + "useToolChoice": ("BOOLEAN", { + "default": False, + "tooltip": "Include toolChoice in settings.", + }), + "toolChoice": ("STRING", { + "multiline": True, + "default": "{}", + "tooltip": "JSON object for toolChoice.", + }), + "thinkingLevel": (["none", "low", "medium", "high"], { + "default": "none", + "tooltip": "Extended reasoning level: none, low, medium, high.", }), }, } @@ -77,34 +130,102 @@ class RunwareTextInferenceSettings: FUNCTION = "create_settings" CATEGORY = "Runware/Text" DESCRIPTION = ( - "Optional text inference settings (flat: systemPrompt, maxTokens, temperature, topP, topK, thinkingLevel). " + "Optional text inference settings (systemPrompt, maxTokens, temperature, topP, topK, " + "stopSequences, presencePenalty, frequencyPenalty, tools, toolChoice, thinkingLevel). " "Connect to Runware Text Inference." ) + @staticmethod + def _parse_json_setting(raw: Any, expected_type: type, field_name: str) -> Any: + if isinstance(raw, expected_type): + return raw + if raw is None: + return expected_type() + + text = str(raw).strip() + if not text: + return expected_type() + + try: + parsed = json.loads(text) + except Exception as exc: + raise Exception(f"{field_name} must be valid JSON.") from exc + + if not isinstance(parsed, expected_type): + expected = "array" if expected_type is list else "object" + raise Exception(f"{field_name} must be a JSON {expected}.") + return parsed + + def _parse_stop_sequences(self, raw: Any) -> List[str]: + if raw is None: + return [] + + items: List[str] = [] + if isinstance(raw, (list, tuple)): + for item in raw: + text = str(item).strip() + if text: + items.append(text) + else: + text = str(raw).strip() + if text: + normalized = text.replace("\r\n", "\n").replace(",", "\n") + items = [segment.strip() for segment in normalized.split("\n") if segment.strip()] + + if len(items) > self._MAX_STOP_ITEMS: + raise Exception(f"stopSequences supports up to {self._MAX_STOP_ITEMS} items.") + for idx, item in enumerate(items, start=1): + if len(item) > self._MAX_STOP_ITEM_CHARS: + raise Exception( + f"stopSequences item {idx} exceeds {self._MAX_STOP_ITEM_CHARS} characters." + ) + return items + def create_settings(self, **kwargs) -> Tuple[Dict[str, Any], ...]: out: Dict[str, Any] = {} if kwargs.get("useSystemPrompt", False): - sys_text = (kwargs.get("system") or "").strip() + sys_text = (kwargs.get("systemPrompt") or kwargs.get("system") or "").strip() if sys_text: if len(sys_text) > self._MAX_SYSTEM_CHARS: sys_text = sys_text[: self._MAX_SYSTEM_CHARS] out["systemPrompt"] = sys_text if kwargs.get("useMaxTokens", False): - out["maxTokens"] = int(kwargs.get("maxTokens", 32768)) + out["maxTokens"] = int(kwargs.get("maxTokens", 4096)) if kwargs.get("useTemperature", False): out["temperature"] = float(kwargs.get("temperature", 1.0)) if kwargs.get("useTopP", False): - out["topP"] = float(kwargs.get("topP", 0.95)) + out["topP"] = float(kwargs.get("topP", 1.0)) if kwargs.get("useTopK", False): out["topK"] = int(kwargs.get("topK", 40)) - tl = kwargs.get("thinkingLevel", "off") - if tl != "off": + if kwargs.get("useStopSequences", False): + parsed_stop = self._parse_stop_sequences(kwargs.get("stopSequences", "")) + if parsed_stop: + out["stopSequences"] = parsed_stop + + if kwargs.get("usePresencePenalty", False): + out["presencePenalty"] = float(kwargs.get("presencePenalty", 0.0)) + + if kwargs.get("useFrequencyPenalty", False): + out["frequencyPenalty"] = float(kwargs.get("frequencyPenalty", 0.0)) + + if kwargs.get("useTools", False): + parsed_tools = self._parse_json_setting(kwargs.get("tools"), list, "tools") + if parsed_tools: + out["tools"] = parsed_tools + + if kwargs.get("useToolChoice", False): + parsed_choice = self._parse_json_setting(kwargs.get("toolChoice"), dict, "toolChoice") + if parsed_choice: + out["toolChoice"] = parsed_choice + + tl = kwargs.get("thinkingLevel", "none") + if tl != "none": out["thinkingLevel"] = tl if not out: diff --git a/modules/textModelSearch.py b/modules/textModelSearch.py index 46c6e93..d81e7ed 100644 --- a/modules/textModelSearch.py +++ b/modules/textModelSearch.py @@ -16,6 +16,9 @@ class RunwareTextModelSearch: "Google": [ "google:gemini@3-flash (Gemini 3 Flash)", ], + "Zai": [ + "zai-glm-5-1 (ZAI GLM 5.1)", + ], } MODEL_PROVIDERS = [ @@ -23,6 +26,7 @@ class RunwareTextModelSearch: "Google", "MiniMax", "OpenAI", + "Zai", ] @classmethod diff --git a/modules/utils/runwareUtils.py b/modules/utils/runwareUtils.py index 0c97b0f..75ba920 100644 --- a/modules/utils/runwareUtils.py +++ b/modules/utils/runwareUtils.py @@ -158,7 +158,7 @@ def getCustomEndpoint(): custom_endpoint = os.getenv("RUNWARE_CUSTOM_ENDPOINT") if custom_endpoint and isinstance(custom_endpoint, str): return custom_endpoint - return "https://api.runware.ai/v1" + return "https://api.runware.dev/v1" SESSION_TIMEOUT = getTimeout() RUNWARE_API_KEY = getAPIKey() diff --git a/workflows/Runware_Text_Inference_GLM_5_1.json b/workflows/Runware_Text_Inference_GLM_5_1.json new file mode 100644 index 0000000..893030b --- /dev/null +++ b/workflows/Runware_Text_Inference_GLM_5_1.json @@ -0,0 +1 @@ +{"id":"f1dab8a9-11a7-4fa3-9a3b-35351c84a964","revision":0,"last_node_id":10,"last_link_id":6,"nodes":[{"id":1,"type":"Runware Text Inference","pos":[497.6562194824219,734.759521484375],"size":[270,122],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"model","name":"model","type":"RUNWARETEXTMODEL","link":1},{"localized_name":"messages","name":"messages","type":"RUNWARETEXTINFERENCEMESSAGES","link":4},{"localized_name":"settings","name":"settings","shape":7,"type":"RUNWARETEXTINFERENCESETTINGS","link":6},{"localized_name":"providerSettings","name":"providerSettings","shape":7,"type":"RUNWAREPROVIDERSETTINGS","link":null}],"outputs":[{"localized_name":"text","name":"text","type":"STRING","links":[2]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"6d47a67b859745d5a86f463d8edfd7da0d1cfa6b","Node name for S&R":"Runware Text Inference"},"widgets_values":[],"bgcolor":"#5345bf"},{"id":5,"type":"Runware Text Inference Messages","pos":[503.0782165527344,919.4880981445312],"size":[255.45077514648438,166],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"Message Segment 1","name":"Message Segment 1","type":"RUNWARETEXTINFERENCEMESSAGE","link":5},{"localized_name":"Message Segment 2","name":"Message Segment 2","shape":7,"type":"RUNWARETEXTINFERENCEMESSAGE","link":null},{"localized_name":"Message Segment 3","name":"Message Segment 3","shape":7,"type":"RUNWARETEXTINFERENCEMESSAGE","link":null},{"localized_name":"Message Segment 4","name":"Message Segment 4","shape":7,"type":"RUNWARETEXTINFERENCEMESSAGE","link":null},{"localized_name":"Message Segment 5","name":"Message Segment 5","shape":7,"type":"RUNWARETEXTINFERENCEMESSAGE","link":null},{"localized_name":"Message Segment 6","name":"Message Segment 6","shape":7,"type":"RUNWARETEXTINFERENCEMESSAGE","link":null},{"localized_name":"Message Segment 7","name":"Message Segment 7","shape":7,"type":"RUNWARETEXTINFERENCEMESSAGE","link":null},{"localized_name":"Message Segment 8","name":"Message Segment 8","shape":7,"type":"RUNWARETEXTINFERENCEMESSAGE","link":null}],"outputs":[{"localized_name":"messages","name":"messages","type":"RUNWARETEXTINFERENCEMESSAGES","links":[4]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"6d47a67b859745d5a86f463d8edfd7da0d1cfa6b","Node name for S&R":"Runware Text Inference Messages"},"widgets_values":[],"bgcolor":"#5345bf"},{"id":9,"type":"Runware Text Inference Settings","pos":[-6.560511112213135,948.0151977539062],"size":[400,658],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"useSystemPrompt","name":"useSystemPrompt","shape":7,"type":"BOOLEAN","widget":{"name":"useSystemPrompt"},"link":null},{"localized_name":"systemPrompt","name":"systemPrompt","shape":7,"type":"STRING","widget":{"name":"systemPrompt"},"link":null},{"localized_name":"useMaxTokens","name":"useMaxTokens","shape":7,"type":"BOOLEAN","widget":{"name":"useMaxTokens"},"link":null},{"localized_name":"maxTokens","name":"maxTokens","shape":7,"type":"INT","widget":{"name":"maxTokens"},"link":null},{"localized_name":"useTemperature","name":"useTemperature","shape":7,"type":"BOOLEAN","widget":{"name":"useTemperature"},"link":null},{"localized_name":"temperature","name":"temperature","shape":7,"type":"FLOAT","widget":{"name":"temperature"},"link":null},{"localized_name":"useTopP","name":"useTopP","shape":7,"type":"BOOLEAN","widget":{"name":"useTopP"},"link":null},{"localized_name":"topP","name":"topP","shape":7,"type":"FLOAT","widget":{"name":"topP"},"link":null},{"localized_name":"useTopK","name":"useTopK","shape":7,"type":"BOOLEAN","widget":{"name":"useTopK"},"link":null},{"localized_name":"topK","name":"topK","shape":7,"type":"INT","widget":{"name":"topK"},"link":null},{"localized_name":"useStopSequences","name":"useStopSequences","shape":7,"type":"BOOLEAN","widget":{"name":"useStopSequences"},"link":null},{"localized_name":"stopSequences","name":"stopSequences","shape":7,"type":"STRING","widget":{"name":"stopSequences"},"link":null},{"localized_name":"usePresencePenalty","name":"usePresencePenalty","shape":7,"type":"BOOLEAN","widget":{"name":"usePresencePenalty"},"link":null},{"localized_name":"presencePenalty","name":"presencePenalty","shape":7,"type":"FLOAT","widget":{"name":"presencePenalty"},"link":null},{"localized_name":"useFrequencyPenalty","name":"useFrequencyPenalty","shape":7,"type":"BOOLEAN","widget":{"name":"useFrequencyPenalty"},"link":null},{"localized_name":"frequencyPenalty","name":"frequencyPenalty","shape":7,"type":"FLOAT","widget":{"name":"frequencyPenalty"},"link":null},{"localized_name":"useTools","name":"useTools","shape":7,"type":"BOOLEAN","widget":{"name":"useTools"},"link":null},{"localized_name":"tools","name":"tools","shape":7,"type":"STRING","widget":{"name":"tools"},"link":null},{"localized_name":"useToolChoice","name":"useToolChoice","shape":7,"type":"BOOLEAN","widget":{"name":"useToolChoice"},"link":null},{"localized_name":"toolChoice","name":"toolChoice","shape":7,"type":"STRING","widget":{"name":"toolChoice"},"link":null},{"localized_name":"thinkingLevel","name":"thinkingLevel","shape":7,"type":"COMBO","widget":{"name":"thinkingLevel"},"link":null}],"outputs":[{"localized_name":"settings","name":"settings","type":"RUNWARETEXTINFERENCESETTINGS","links":[6]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"6d47a67b859745d5a86f463d8edfd7da0d1cfa6b","Node name for S&R":"Runware Text Inference Settings"},"widgets_values":[false,"",false,32768,false,1,true,0.95,false,40,"high","",false,0,false,0,false,"[]",false,"{}","none"],"bgcolor":"#5345bf"},{"id":3,"type":"Runware Text Model Search","pos":[81.07406616210938,741.3767700195312],"size":[270,130],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"Model Search","name":"Model Search","type":"STRING","widget":{"name":"Model Search"},"link":null},{"localized_name":"Model Provider","name":"Model Provider","type":"COMBO","widget":{"name":"Model Provider"},"link":null},{"localized_name":"TextList","name":"TextList","type":"COMBO","widget":{"name":"TextList"},"link":null},{"localized_name":"Use Search Value","name":"Use Search Value","type":"BOOLEAN","widget":{"name":"Use Search Value"},"link":null}],"outputs":[{"localized_name":"model","name":"model","type":"RUNWARETEXTMODEL","links":[1]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"6d47a67b859745d5a86f463d8edfd7da0d1cfa6b","Node name for S&R":"Runware Text Model Search"},"widgets_values":["","Zai","zai-glm-5-1 (ZAI GLM 5.1)",false],"bgcolor":"#5345bf"},{"id":8,"type":"Runware Text Inference Message","pos":[457.5366516113281,1134.87060546875],"size":[400,200],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"role","name":"role","type":"COMBO","widget":{"name":"role"},"link":null},{"localized_name":"content","name":"content","type":"STRING","widget":{"name":"content"},"link":null}],"outputs":[{"localized_name":"message","name":"message","type":"RUNWARETEXTINFERENCEMESSAGE","links":[5]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"6d47a67b859745d5a86f463d8edfd7da0d1cfa6b","Node name for S&R":"Runware Text Inference Message"},"widgets_values":["user","Outline a 5-step plan to buy beta fish from a pet store"],"bgcolor":"#5345bf"},{"id":4,"type":"Runware Save Text","pos":[950.5037841796875,745.9119262695312],"size":[621.9185791015625,757.6689453125],"flags":{},"order":5,"mode":0,"inputs":[{"localized_name":"text","name":"text","type":"STRING","widget":{"name":"text"},"link":2}],"outputs":[{"localized_name":"text","name":"text","type":"STRING","links":null}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"6d47a67b859745d5a86f463d8edfd7da0d1cfa6b","Node name for S&R":"Runware Save Text"},"widgets_values":["Here is a 5-step plan to successfully buy a healthy betta fish from a pet store:\n\n**Step 1: Set Up the Tank First (The \"Cycle Before You Buy\" Rule)**\nNever buy the fish and the tank on the same day. A betta needs a properly cycled tank to survive, which means building up beneficial bacteria that break down toxic fish waste. \n* **Buy the essentials:** A tank (5 gallons minimum is highly recommended), a gentle filter, an adjustable heater (bettas need 78-80°F water), substrate, hiding spots, and a lid (bettas are jumpers). \n* **Start the Nitrogen Cycle:** Set up the tank, turn on the filter and heater, and add a water conditioner and beneficial bacteria starter. This cycling process takes 2 to 6 weeks. Only move to Step 2 once the tank can process ammonia and nitrite down to 0 ppm.\n\n**Step 2: Choose a Reputable Store**\nNot all pet stores care for their fish equally. Scout out a few stores in your area before committing to buying.\n* **Inspect the store:** Look at the overall cleanliness of the fish area. Are the aisles tidy? Do the tanks look well-maintained?\n* **Look at the other fish:** Are the tanks overcrowded? Are there dead fish in the tanks? If a store has multiple dead or visibly sick fish, walk away.\n\n**Step 3: Inspect and Select a Healthy Betta**\nBettas are often kept in small cups, which makes them vulnerable to illness. You need to observe the fish closely before choosing one.\n* **Look at the water:** A little discoloration is normal, but if the water is thick, foul-smelling, or filled with floating debris, the fish is likely stressed.\n* **Observe the fish's body:** Look for clear, bright eyes, intact fins (no ragged, black, or white-edged tears), and smooth scales. Avoid fish with white fuzzy patches (fungus), white spots (ich), or bloated stomachs.\n* **Observe the fish's behavior:** A healthy betta is alert. Gently tap the cup or wave your hand near it. The fish should respond by flaring its gills, swimming actively, or looking at you. Avoid fish that float listlessly at the top or sink to the bottom unresponsive.\n\n**Step 4: Purchase and Transport Safely**\nOnce you have chosen your fish, it is time to bring it home. Minimizing stress during transport is crucial.\n* **Buy the right food:** If you haven't already, purchase high-quality betta pellets (with fish meal or whole fish as the first ingredient) and maybe some freeze-dried bloodworms for treats.\n* **Transport smartly:** Pet stores usually give you a small plastic bag. If it is very cold or hot outside, place the bagged fish inside a paper bag to block out light (which reduces stress), and then inside a small cooler or insulated bag to regulate the temperature. Go straight home—do not run other errands.\n\n**Step 5: Acclimate to the New Tank**\nDo not simply pour the fish directly into its new tank. The water parameters (temperature, pH) from the store's cup are very different from your established tank. Sudden changes can send a fish into shock.\n* **Float the cup:** Gently pour the fish and the store water into a small, clean container (or keep it in the bag). Float this container in your prepared tank for 15–20 minutes so the temperatures equalize.\n* **Drip acclimate:** Over the next 20–30 minutes, add small amounts (about a tablespoon at a time) of your tank water into the container with the fish. This slowly adjusts the fish to your water's chemistry.\n* **Net and release:** Once the water volume in the container has roughly doubled with your tank water, use a soft net to gently scoop the fish out and place it into its new tank. **Do not** pour the water from the store into your tank, as it may contain parasites or diseases. Turn off the tank lights for the first few hours to let the fish decompress."],"bgcolor":"#5345bf"}],"links":[[1,3,0,1,0,"RUNWARETEXTMODEL"],[2,1,0,4,0,"STRING"],[4,5,0,1,1,"RUNWARETEXTINFERENCEMESSAGES"],[5,8,0,5,0,"RUNWARETEXTINFERENCEMESSAGE"],[6,9,0,1,2,"RUNWARETEXTINFERENCESETTINGS"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6830134553650705,"offset":[307.04397258867573,-505.9291598819246]}},"version":0.4} \ No newline at end of file From 652b8a19463b1dbf9c22b4ee5d81d6dd2bcc75f0 Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Fri, 17 Apr 2026 19:14:18 +0530 Subject: [PATCH 13/19] Fixed base URL --- modules/utils/runwareUtils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/utils/runwareUtils.py b/modules/utils/runwareUtils.py index 75ba920..0c97b0f 100644 --- a/modules/utils/runwareUtils.py +++ b/modules/utils/runwareUtils.py @@ -158,7 +158,7 @@ def getCustomEndpoint(): custom_endpoint = os.getenv("RUNWARE_CUSTOM_ENDPOINT") if custom_endpoint and isinstance(custom_endpoint, str): return custom_endpoint - return "https://api.runware.dev/v1" + return "https://api.runware.ai/v1" SESSION_TIMEOUT = getTimeout() RUNWARE_API_KEY = getAPIKey() From cf7cb90c38483d4075fc188205abcff68a719d46 Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Fri, 17 Apr 2026 20:04:43 +0530 Subject: [PATCH 14/19] Fixed backward comp --- modules/textInferenceSettings.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/modules/textInferenceSettings.py b/modules/textInferenceSettings.py index 7cc977b..aed5a30 100644 --- a/modules/textInferenceSettings.py +++ b/modules/textInferenceSettings.py @@ -69,6 +69,11 @@ class RunwareTextInferenceSettings: "step": 1, "tooltip": f"Top-k sampling (1–{cls._MAX_TOP_K}).", }), + # Keep this in the original slot to avoid shifting legacy widgets_values. + "thinkingLevel": (["none", "low", "medium", "high"], { + "default": "none", + "tooltip": "Extended reasoning level: none, low, medium, high.", + }), "useStopSequences": ("BOOLEAN", { "default": False, "tooltip": "Include stopSequences in settings.", @@ -118,10 +123,6 @@ class RunwareTextInferenceSettings: "default": "{}", "tooltip": "JSON object for toolChoice.", }), - "thinkingLevel": (["none", "low", "medium", "high"], { - "default": "none", - "tooltip": "Extended reasoning level: none, low, medium, high.", - }), }, } @@ -181,6 +182,19 @@ class RunwareTextInferenceSettings: ) return items + @staticmethod + def _normalize_thinking_level(raw: Any) -> str: + value = str(raw or "none").strip().lower() + # Backward compatibility with older workflows. + aliases = { + "off": "none", + "minimal": "low", + } + value = aliases.get(value, value) + if value not in ("none", "low", "medium", "high"): + return "none" + return value + def create_settings(self, **kwargs) -> Tuple[Dict[str, Any], ...]: out: Dict[str, Any] = {} @@ -224,7 +238,7 @@ class RunwareTextInferenceSettings: if parsed_choice: out["toolChoice"] = parsed_choice - tl = kwargs.get("thinkingLevel", "none") + tl = self._normalize_thinking_level(kwargs.get("thinkingLevel", "none")) if tl != "none": out["thinkingLevel"] = tl From 523177e1fbbb94ef3ee2877b845f7e9634ca5476 Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Mon, 20 Apr 2026 14:28:19 +0530 Subject: [PATCH 15/19] Added additional outputFormat support --- modules/audioInference.py | 2 +- workflows/Runware_Audio_Inference_Qwen.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/audioInference.py b/modules/audioInference.py index 135cfd3..4d06d2a 100644 --- a/modules/audioInference.py +++ b/modules/audioInference.py @@ -78,7 +78,7 @@ class RunwareAudioInference: "default": "URL", "tooltip": "Output type for the generated audio" }), - "outputFormat": (["MP3", "MP4"], { + "outputFormat": (["MP3", "MP4", "WAV", "FLAC", "OGG"], { "default": "MP3", "tooltip": "Format of the output audio" }), diff --git a/workflows/Runware_Audio_Inference_Qwen.json b/workflows/Runware_Audio_Inference_Qwen.json index f3e6df9..cd5b356 100644 --- a/workflows/Runware_Audio_Inference_Qwen.json +++ b/workflows/Runware_Audio_Inference_Qwen.json @@ -1 +1 @@ -{"id":"4704fbfa-824d-41b8-b8f2-f3865b83828b","revision":0,"last_node_id":5,"last_link_id":4,"nodes":[{"id":5,"type":"Runware Audio Model Search","pos":[201.83511352539062,576.8184204101562],"size":[270,130],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"Model Search","name":"Model Search","type":"STRING","widget":{"name":"Model Search"},"link":null},{"localized_name":"Model Provider","name":"Model Provider","type":"COMBO","widget":{"name":"Model Provider"},"link":null},{"localized_name":"AudioList","name":"AudioList","type":"COMBO","widget":{"name":"AudioList"},"link":null},{"localized_name":"Use Search Value","name":"Use Search Value","type":"BOOLEAN","widget":{"name":"Use Search Value"},"link":null}],"outputs":[{"localized_name":"model","name":"model","type":"RUNWAREAUDIOMODEL","links":[4]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"480fd9769359e8e40203f928086427ab202b18d3","Node name for S&R":"Runware Audio Model Search"},"widgets_values":["","Alibaba","alibaba:qwen@3-tts-1.7b-voicedesign (Qwen3 TTS 1.7B Voice Design)",false],"bgcolor":"#5345bf"},{"id":4,"type":"SaveAudioMP3","pos":[1010.2057495117188,499.1061706542969],"size":[270,136],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"audio","name":"audio","type":"AUDIO","link":1},{"localized_name":"filename_prefix","name":"filename_prefix","type":"STRING","widget":{"name":"filename_prefix"},"link":null},{"localized_name":"quality","name":"quality","type":"COMBO","widget":{"name":"quality"},"link":null},{"localized_name":"audioUI","name":"audioUI","type":"AUDIO_UI","widget":{"name":"audioUI"},"link":null}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.46","Node name for S&R":"SaveAudioMP3"},"widgets_values":["audio/ComfyUI","V0"]},{"id":3,"type":"Runware Audio Inference Settings","pos":[1001.6655883789062,703.0296020507812],"size":[400,862],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"useTemperature","name":"useTemperature","shape":7,"type":"BOOLEAN","widget":{"name":"useTemperature"},"link":null},{"localized_name":"temperature","name":"temperature","shape":7,"type":"FLOAT","widget":{"name":"temperature"},"link":null},{"localized_name":"useLyrics","name":"useLyrics","shape":7,"type":"BOOLEAN","widget":{"name":"useLyrics"},"link":null},{"localized_name":"lyrics","name":"lyrics","shape":7,"type":"STRING","widget":{"name":"lyrics"},"link":null},{"localized_name":"useGuidanceType","name":"useGuidanceType","shape":7,"type":"BOOLEAN","widget":{"name":"useGuidanceType"},"link":null},{"localized_name":"guidanceType","name":"guidanceType","shape":7,"type":"COMBO","widget":{"name":"guidanceType"},"link":null},{"localized_name":"useLanguageBoost","name":"useLanguageBoost","shape":7,"type":"BOOLEAN","widget":{"name":"useLanguageBoost"},"link":null},{"localized_name":"languageBoost","name":"languageBoost","shape":7,"type":"COMBO","widget":{"name":"languageBoost"},"link":null},{"localized_name":"useTurbo","name":"useTurbo","shape":7,"type":"BOOLEAN","widget":{"name":"useTurbo"},"link":null},{"localized_name":"turbo","name":"turbo","shape":7,"type":"BOOLEAN","widget":{"name":"turbo"},"link":null},{"localized_name":"useTextNormalization","name":"useTextNormalization","shape":7,"type":"BOOLEAN","widget":{"name":"useTextNormalization"},"link":null},{"localized_name":"textNormalization","name":"textNormalization","shape":7,"type":"BOOLEAN","widget":{"name":"textNormalization"},"link":null},{"localized_name":"useBpm","name":"useBpm","shape":7,"type":"BOOLEAN","widget":{"name":"useBpm"},"link":null},{"localized_name":"bpm","name":"bpm","shape":7,"type":"INT","widget":{"name":"bpm"},"link":null},{"localized_name":"useKeyScale","name":"useKeyScale","shape":7,"type":"BOOLEAN","widget":{"name":"useKeyScale"},"link":null},{"localized_name":"keyScale","name":"keyScale","shape":7,"type":"STRING","widget":{"name":"keyScale"},"link":null},{"localized_name":"useTimeSignature","name":"useTimeSignature","shape":7,"type":"BOOLEAN","widget":{"name":"useTimeSignature"},"link":null},{"localized_name":"timeSignature","name":"timeSignature","shape":7,"type":"INT","widget":{"name":"timeSignature"},"link":null},{"localized_name":"useVocalLanguage","name":"useVocalLanguage","shape":7,"type":"BOOLEAN","widget":{"name":"useVocalLanguage"},"link":null},{"localized_name":"vocalLanguage","name":"vocalLanguage","shape":7,"type":"COMBO","widget":{"name":"vocalLanguage"},"link":null},{"localized_name":"useCoverConditioningScale","name":"useCoverConditioningScale","shape":7,"type":"BOOLEAN","widget":{"name":"useCoverConditioningScale"},"link":null},{"localized_name":"coverConditioningScale","name":"coverConditioningScale","shape":7,"type":"FLOAT","widget":{"name":"coverConditioningScale"},"link":null},{"localized_name":"useRepaintingStart","name":"useRepaintingStart","shape":7,"type":"BOOLEAN","widget":{"name":"useRepaintingStart"},"link":null},{"localized_name":"repaintingStart","name":"repaintingStart","shape":7,"type":"FLOAT","widget":{"name":"repaintingStart"},"link":null},{"localized_name":"useRepaintingEnd","name":"useRepaintingEnd","shape":7,"type":"BOOLEAN","widget":{"name":"useRepaintingEnd"},"link":null},{"localized_name":"repaintingEnd","name":"repaintingEnd","shape":7,"type":"FLOAT","widget":{"name":"repaintingEnd"},"link":null},{"localized_name":"useXVectorOnly","name":"useXVectorOnly","shape":7,"type":"BOOLEAN","widget":{"name":"useXVectorOnly"},"link":null},{"localized_name":"xVectorOnly","name":"xVectorOnly","shape":7,"type":"BOOLEAN","widget":{"name":"xVectorOnly"},"link":null},{"localized_name":"useMaxNewTokens","name":"useMaxNewTokens","shape":7,"type":"BOOLEAN","widget":{"name":"useMaxNewTokens"},"link":null},{"localized_name":"maxNewTokens","name":"maxNewTokens","shape":7,"type":"INT","widget":{"name":"maxNewTokens"},"link":null},{"localized_name":"useTranscript","name":"useTranscript","shape":7,"type":"BOOLEAN","widget":{"name":"useTranscript"},"link":null},{"localized_name":"transcript","name":"transcript","shape":7,"type":"STRING","widget":{"name":"transcript"},"link":null}],"outputs":[{"localized_name":"settings","name":"settings","type":"RUNWAREAUDIOSETTINGS","links":[2]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"480fd9769359e8e40203f928086427ab202b18d3","Node name for S&R":"Runware Audio Inference Settings"},"widgets_values":[false,1,false,"",false,"apg",false,"auto",false,false,false,true,false,120,false,"",false,4,false,"en",false,1,false,0,false,0,false,false,true,4096,false,""],"bgcolor":"#5345bf"},{"id":1,"type":"Runware Audio Inference","pos":[557.121337890625,508.376708984375],"size":[400,746],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"model","name":"model","type":"RUNWAREAUDIOMODEL","link":4},{"localized_name":"inputs","name":"inputs","shape":7,"type":"RUNWAREAUDIOINFERENCEINPUTS","link":null},{"localized_name":"settings","name":"settings","shape":7,"type":"RUNWAREAUDIOSETTINGS","link":2},{"localized_name":"speech","name":"speech","shape":7,"type":"RUNWARESPEECH","link":3},{"localized_name":"voiceModify","name":"voiceModify","shape":7,"type":"RUNWAREVOICEMODIFY","link":null},{"localized_name":"providerSettings","name":"providerSettings","shape":7,"type":"RUNWAREPROVIDERSETTINGS","link":null},{"localized_name":"usePositivePrompt","name":"usePositivePrompt","type":"BOOLEAN","widget":{"name":"usePositivePrompt"},"link":null},{"localized_name":"positivePrompt","name":"positivePrompt","type":"STRING","widget":{"name":"positivePrompt"},"link":null},{"localized_name":"negativePrompt","name":"negativePrompt","type":"STRING","widget":{"name":"negativePrompt"},"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":"useSampleRate","name":"useSampleRate","type":"BOOLEAN","widget":{"name":"useSampleRate"},"link":null},{"localized_name":"sampleRate","name":"sampleRate","type":"COMBO","widget":{"name":"sampleRate"},"link":null},{"localized_name":"useBitrate","name":"useBitrate","type":"BOOLEAN","widget":{"name":"useBitrate"},"link":null},{"localized_name":"bitrate","name":"bitrate","type":"COMBO","widget":{"name":"bitrate"},"link":null},{"localized_name":"useChannels","name":"useChannels","type":"BOOLEAN","widget":{"name":"useChannels"},"link":null},{"localized_name":"channels","name":"channels","type":"INT","widget":{"name":"channels"},"link":null},{"localized_name":"outputType","name":"outputType","type":"COMBO","widget":{"name":"outputType"},"link":null},{"localized_name":"outputFormat","name":"outputFormat","type":"COMBO","widget":{"name":"outputFormat"},"link":null},{"localized_name":"numberResults","name":"numberResults","type":"INT","widget":{"name":"numberResults"},"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":"useStrength","name":"useStrength","type":"BOOLEAN","widget":{"name":"useStrength"},"link":null},{"localized_name":"strength","name":"strength","type":"FLOAT","widget":{"name":"strength"},"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}],"outputs":[{"localized_name":"audio","name":"audio","type":"AUDIO","links":[1]},{"localized_name":"video","name":"video","type":"VIDEO","links":null}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"480fd9769359e8e40203f928086427ab202b18d3","Node name for S&R":"Runware Audio Inference"},"widgets_values":[true,"A warm, cheerful male voice with moderate pace and a slight British accen","",false,10,false,32000,false,128,false,2,"URL","MP3",1,false,400597415,"randomize",false,20,false,0.8,false,12],"bgcolor":"#5345bf"},{"id":2,"type":"Runware Audio Inference Speech","pos":[109.24061584472656,785.9152221679688],"size":[400,454],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"text","name":"text","type":"STRING","widget":{"name":"text"},"link":null},{"localized_name":"useVoice","name":"useVoice","shape":7,"type":"BOOLEAN","widget":{"name":"useVoice"},"link":null},{"localized_name":"voice","name":"voice","shape":7,"type":"STRING","widget":{"name":"voice"},"link":null},{"localized_name":"useSpeed","name":"useSpeed","shape":7,"type":"BOOLEAN","widget":{"name":"useSpeed"},"link":null},{"localized_name":"speed","name":"speed","shape":7,"type":"FLOAT","widget":{"name":"speed"},"link":null},{"localized_name":"useVolume","name":"useVolume","shape":7,"type":"BOOLEAN","widget":{"name":"useVolume"},"link":null},{"localized_name":"volume","name":"volume","shape":7,"type":"FLOAT","widget":{"name":"volume"},"link":null},{"localized_name":"usePitch","name":"usePitch","shape":7,"type":"BOOLEAN","widget":{"name":"usePitch"},"link":null},{"localized_name":"pitch","name":"pitch","shape":7,"type":"FLOAT","widget":{"name":"pitch"},"link":null},{"localized_name":"useEmotion","name":"useEmotion","shape":7,"type":"BOOLEAN","widget":{"name":"useEmotion"},"link":null},{"localized_name":"emotion","name":"emotion","shape":7,"type":"COMBO","widget":{"name":"emotion"},"link":null},{"localized_name":"useTone","name":"useTone","shape":7,"type":"BOOLEAN","widget":{"name":"useTone"},"link":null},{"localized_name":"tone","name":"tone","shape":7,"type":"STRING","widget":{"name":"tone"},"link":null},{"localized_name":"useLanguage","name":"useLanguage","shape":7,"type":"BOOLEAN","widget":{"name":"useLanguage"},"link":null},{"localized_name":"language","name":"language","shape":7,"type":"COMBO","widget":{"name":"language"},"link":null}],"outputs":[{"localized_name":"speech","name":"speech","type":"RUNWARESPEECH","links":[3]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"480fd9769359e8e40203f928086427ab202b18d3","Node name for S&R":"Runware Audio Inference Speech"},"widgets_values":["Hello, this is a test of the Qwen 3 TTS VoiceDesign model.",true,"placeholder",true,1,false,1,false,0,false,"calm",false,"",true,"English"],"bgcolor":"#5345bf"}],"links":[[1,1,0,4,0,"AUDIO"],[2,3,0,1,2,"RUNWAREAUDIOSETTINGS"],[3,2,0,1,3,"RUNWARESPEECH"],[4,5,0,1,0,"RUNWAREAUDIOMODEL"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6271586751617864,"offset":[366.33835426215654,-367.9205409415209]}},"version":0.4} \ No newline at end of file +{"id":"4704fbfa-824d-41b8-b8f2-f3865b83828b","revision":0,"last_node_id":7,"last_link_id":5,"nodes":[{"id":5,"type":"Runware Audio Model Search","pos":[201.83511352539062,576.8184204101562],"size":[270,130],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"Model Search","name":"Model Search","type":"STRING","widget":{"name":"Model Search"},"link":null},{"localized_name":"Model Provider","name":"Model Provider","type":"COMBO","widget":{"name":"Model Provider"},"link":null},{"localized_name":"AudioList","name":"AudioList","type":"COMBO","widget":{"name":"AudioList"},"link":null},{"localized_name":"Use Search Value","name":"Use Search Value","type":"BOOLEAN","widget":{"name":"Use Search Value"},"link":null}],"outputs":[{"localized_name":"model","name":"model","type":"RUNWAREAUDIOMODEL","links":[4]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"480fd9769359e8e40203f928086427ab202b18d3","Node name for S&R":"Runware Audio Model Search"},"widgets_values":["","Alibaba","alibaba:qwen@3-tts-1.7b-voicedesign (Qwen3 TTS 1.7B Voice Design)",false],"bgcolor":"#5345bf"},{"id":7,"type":"Runware Audio Inference Settings","pos":[1330.0762939453125,488.7880859375],"size":[400,1102],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"useTemperature","name":"useTemperature","shape":7,"type":"BOOLEAN","widget":{"name":"useTemperature"},"link":null},{"localized_name":"temperature","name":"temperature","shape":7,"type":"FLOAT","widget":{"name":"temperature"},"link":null},{"localized_name":"useAudioTemperature","name":"useAudioTemperature","shape":7,"type":"BOOLEAN","widget":{"name":"useAudioTemperature"},"link":null},{"localized_name":"audioTemperature","name":"audioTemperature","shape":7,"type":"FLOAT","widget":{"name":"audioTemperature"},"link":null},{"localized_name":"useTopK","name":"useTopK","shape":7,"type":"BOOLEAN","widget":{"name":"useTopK"},"link":null},{"localized_name":"topK","name":"topK","shape":7,"type":"INT","widget":{"name":"topK"},"link":null},{"localized_name":"useIncludePrefix","name":"useIncludePrefix","shape":7,"type":"BOOLEAN","widget":{"name":"useIncludePrefix"},"link":null},{"localized_name":"includePrefix","name":"includePrefix","shape":7,"type":"BOOLEAN","widget":{"name":"includePrefix"},"link":null},{"localized_name":"useLyrics","name":"useLyrics","shape":7,"type":"BOOLEAN","widget":{"name":"useLyrics"},"link":null},{"localized_name":"lyrics","name":"lyrics","shape":7,"type":"STRING","widget":{"name":"lyrics"},"link":null},{"localized_name":"useGuidanceType","name":"useGuidanceType","shape":7,"type":"BOOLEAN","widget":{"name":"useGuidanceType"},"link":null},{"localized_name":"guidanceType","name":"guidanceType","shape":7,"type":"COMBO","widget":{"name":"guidanceType"},"link":null},{"localized_name":"useLanguageBoost","name":"useLanguageBoost","shape":7,"type":"BOOLEAN","widget":{"name":"useLanguageBoost"},"link":null},{"localized_name":"languageBoost","name":"languageBoost","shape":7,"type":"COMBO","widget":{"name":"languageBoost"},"link":null},{"localized_name":"useTurbo","name":"useTurbo","shape":7,"type":"BOOLEAN","widget":{"name":"useTurbo"},"link":null},{"localized_name":"turbo","name":"turbo","shape":7,"type":"BOOLEAN","widget":{"name":"turbo"},"link":null},{"localized_name":"useTextNormalization","name":"useTextNormalization","shape":7,"type":"BOOLEAN","widget":{"name":"useTextNormalization"},"link":null},{"localized_name":"textNormalization","name":"textNormalization","shape":7,"type":"BOOLEAN","widget":{"name":"textNormalization"},"link":null},{"localized_name":"useBpm","name":"useBpm","shape":7,"type":"BOOLEAN","widget":{"name":"useBpm"},"link":null},{"localized_name":"bpm","name":"bpm","shape":7,"type":"INT","widget":{"name":"bpm"},"link":null},{"localized_name":"useKeyScale","name":"useKeyScale","shape":7,"type":"BOOLEAN","widget":{"name":"useKeyScale"},"link":null},{"localized_name":"keyScale","name":"keyScale","shape":7,"type":"STRING","widget":{"name":"keyScale"},"link":null},{"localized_name":"useTimeSignature","name":"useTimeSignature","shape":7,"type":"BOOLEAN","widget":{"name":"useTimeSignature"},"link":null},{"localized_name":"timeSignature","name":"timeSignature","shape":7,"type":"INT","widget":{"name":"timeSignature"},"link":null},{"localized_name":"useVocalLanguage","name":"useVocalLanguage","shape":7,"type":"BOOLEAN","widget":{"name":"useVocalLanguage"},"link":null},{"localized_name":"vocalLanguage","name":"vocalLanguage","shape":7,"type":"COMBO","widget":{"name":"vocalLanguage"},"link":null},{"localized_name":"useCoverConditioningScale","name":"useCoverConditioningScale","shape":7,"type":"BOOLEAN","widget":{"name":"useCoverConditioningScale"},"link":null},{"localized_name":"coverConditioningScale","name":"coverConditioningScale","shape":7,"type":"FLOAT","widget":{"name":"coverConditioningScale"},"link":null},{"localized_name":"useRepaintingStart","name":"useRepaintingStart","shape":7,"type":"BOOLEAN","widget":{"name":"useRepaintingStart"},"link":null},{"localized_name":"repaintingStart","name":"repaintingStart","shape":7,"type":"FLOAT","widget":{"name":"repaintingStart"},"link":null},{"localized_name":"useRepaintingEnd","name":"useRepaintingEnd","shape":7,"type":"BOOLEAN","widget":{"name":"useRepaintingEnd"},"link":null},{"localized_name":"repaintingEnd","name":"repaintingEnd","shape":7,"type":"FLOAT","widget":{"name":"repaintingEnd"},"link":null},{"localized_name":"useXVectorOnly","name":"useXVectorOnly","shape":7,"type":"BOOLEAN","widget":{"name":"useXVectorOnly"},"link":null},{"localized_name":"xVectorOnly","name":"xVectorOnly","shape":7,"type":"BOOLEAN","widget":{"name":"xVectorOnly"},"link":null},{"localized_name":"useMaxNewTokens","name":"useMaxNewTokens","shape":7,"type":"BOOLEAN","widget":{"name":"useMaxNewTokens"},"link":null},{"localized_name":"maxNewTokens","name":"maxNewTokens","shape":7,"type":"INT","widget":{"name":"maxNewTokens"},"link":null},{"localized_name":"useTranscript","name":"useTranscript","shape":7,"type":"BOOLEAN","widget":{"name":"useTranscript"},"link":null},{"localized_name":"transcript","name":"transcript","shape":7,"type":"STRING","widget":{"name":"transcript"},"link":null},{"localized_name":"useInstrumental","name":"useInstrumental","shape":7,"type":"BOOLEAN","widget":{"name":"useInstrumental"},"link":null},{"localized_name":"instrumental","name":"instrumental","shape":7,"type":"BOOLEAN","widget":{"name":"instrumental"},"link":null},{"localized_name":"useLyricsOptimizer","name":"useLyricsOptimizer","shape":7,"type":"BOOLEAN","widget":{"name":"useLyricsOptimizer"},"link":null},{"localized_name":"lyricsOptimizer","name":"lyricsOptimizer","shape":7,"type":"BOOLEAN","widget":{"name":"lyricsOptimizer"},"link":null}],"outputs":[{"localized_name":"settings","name":"settings","type":"RUNWAREAUDIOSETTINGS","links":[5]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"b29651c37f7abebe7069abf62c642bd0128f616b","Node name for S&R":"Runware Audio Inference Settings"},"widgets_values":[false,0.6,false,0.8,false,50,false,false,false,"",false,"apg",false,"auto",false,false,false,true,false,120,false,"",false,4,false,"en",false,1,false,0,false,0,false,false,true,4096,false,"",false,false,false,false],"bgcolor":"#5345bf"},{"id":2,"type":"Runware Audio Inference Speech","pos":[109.24061584472656,785.9152221679688],"size":[400,454],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"text","name":"text","type":"STRING","widget":{"name":"text"},"link":null},{"localized_name":"useVoice","name":"useVoice","shape":7,"type":"BOOLEAN","widget":{"name":"useVoice"},"link":null},{"localized_name":"voice","name":"voice","shape":7,"type":"STRING","widget":{"name":"voice"},"link":null},{"localized_name":"useSpeed","name":"useSpeed","shape":7,"type":"BOOLEAN","widget":{"name":"useSpeed"},"link":null},{"localized_name":"speed","name":"speed","shape":7,"type":"FLOAT","widget":{"name":"speed"},"link":null},{"localized_name":"useVolume","name":"useVolume","shape":7,"type":"BOOLEAN","widget":{"name":"useVolume"},"link":null},{"localized_name":"volume","name":"volume","shape":7,"type":"FLOAT","widget":{"name":"volume"},"link":null},{"localized_name":"usePitch","name":"usePitch","shape":7,"type":"BOOLEAN","widget":{"name":"usePitch"},"link":null},{"localized_name":"pitch","name":"pitch","shape":7,"type":"FLOAT","widget":{"name":"pitch"},"link":null},{"localized_name":"useEmotion","name":"useEmotion","shape":7,"type":"BOOLEAN","widget":{"name":"useEmotion"},"link":null},{"localized_name":"emotion","name":"emotion","shape":7,"type":"COMBO","widget":{"name":"emotion"},"link":null},{"localized_name":"useTone","name":"useTone","shape":7,"type":"BOOLEAN","widget":{"name":"useTone"},"link":null},{"localized_name":"tone","name":"tone","shape":7,"type":"STRING","widget":{"name":"tone"},"link":null},{"localized_name":"useLanguage","name":"useLanguage","shape":7,"type":"BOOLEAN","widget":{"name":"useLanguage"},"link":null},{"localized_name":"language","name":"language","shape":7,"type":"COMBO","widget":{"name":"language"},"link":null}],"outputs":[{"localized_name":"speech","name":"speech","type":"RUNWARESPEECH","links":[3]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"480fd9769359e8e40203f928086427ab202b18d3","Node name for S&R":"Runware Audio Inference Speech"},"widgets_values":["Hello this is a demo",true,"placeholder",true,1,false,1,false,0,false,"calm",false,"",true,"English"],"bgcolor":"#5345bf"},{"id":4,"type":"SaveAudioMP3","pos":[1010.2057495117188,499.1061706542969],"size":[270,136],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"audio","name":"audio","type":"AUDIO","link":1},{"localized_name":"filename_prefix","name":"filename_prefix","type":"STRING","widget":{"name":"filename_prefix"},"link":null},{"localized_name":"quality","name":"quality","type":"COMBO","widget":{"name":"quality"},"link":null},{"localized_name":"audioUI","name":"audioUI","type":"AUDIO_UI","widget":{"name":"audioUI"},"link":null}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.46","Node name for S&R":"SaveAudioMP3"},"widgets_values":["audio/ComfyUI","V0"]},{"id":1,"type":"Runware Audio Inference","pos":[557.121337890625,508.376708984375],"size":[400,746],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"model","name":"model","type":"RUNWAREAUDIOMODEL","link":4},{"localized_name":"inputs","name":"inputs","shape":7,"type":"RUNWAREAUDIOINFERENCEINPUTS","link":null},{"localized_name":"settings","name":"settings","shape":7,"type":"RUNWAREAUDIOSETTINGS","link":5},{"localized_name":"speech","name":"speech","shape":7,"type":"RUNWARESPEECH","link":3},{"localized_name":"voiceModify","name":"voiceModify","shape":7,"type":"RUNWAREVOICEMODIFY","link":null},{"localized_name":"providerSettings","name":"providerSettings","shape":7,"type":"RUNWAREPROVIDERSETTINGS","link":null},{"localized_name":"usePositivePrompt","name":"usePositivePrompt","type":"BOOLEAN","widget":{"name":"usePositivePrompt"},"link":null},{"localized_name":"positivePrompt","name":"positivePrompt","type":"STRING","widget":{"name":"positivePrompt"},"link":null},{"localized_name":"negativePrompt","name":"negativePrompt","type":"STRING","widget":{"name":"negativePrompt"},"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":"useSampleRate","name":"useSampleRate","type":"BOOLEAN","widget":{"name":"useSampleRate"},"link":null},{"localized_name":"sampleRate","name":"sampleRate","type":"COMBO","widget":{"name":"sampleRate"},"link":null},{"localized_name":"useBitrate","name":"useBitrate","type":"BOOLEAN","widget":{"name":"useBitrate"},"link":null},{"localized_name":"bitrate","name":"bitrate","type":"COMBO","widget":{"name":"bitrate"},"link":null},{"localized_name":"useChannels","name":"useChannels","type":"BOOLEAN","widget":{"name":"useChannels"},"link":null},{"localized_name":"channels","name":"channels","type":"INT","widget":{"name":"channels"},"link":null},{"localized_name":"outputType","name":"outputType","type":"COMBO","widget":{"name":"outputType"},"link":null},{"localized_name":"outputFormat","name":"outputFormat","type":"COMBO","widget":{"name":"outputFormat"},"link":null},{"localized_name":"numberResults","name":"numberResults","type":"INT","widget":{"name":"numberResults"},"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":"useStrength","name":"useStrength","type":"BOOLEAN","widget":{"name":"useStrength"},"link":null},{"localized_name":"strength","name":"strength","type":"FLOAT","widget":{"name":"strength"},"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}],"outputs":[{"localized_name":"audio","name":"audio","type":"AUDIO","links":[1]},{"localized_name":"video","name":"video","type":"VIDEO","links":null}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"480fd9769359e8e40203f928086427ab202b18d3","Node name for S&R":"Runware Audio Inference"},"widgets_values":[true,"A warm, cheerful male voice with moderate pace and a slight British accen","",false,10,false,32000,false,128,false,2,"URL","OGG",1,false,1649737204,"randomize",false,20,false,0.8,false,12],"bgcolor":"#5345bf"}],"links":[[1,1,0,4,0,"AUDIO"],[3,2,0,1,3,"RUNWARESPEECH"],[4,5,0,1,0,"RUNWAREAUDIOMODEL"],[5,7,0,1,2,"RUNWAREAUDIOSETTINGS"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6547164698733117,"offset":[177.52847782697697,-367.41248768211034]}},"version":0.4} \ No newline at end of file From 6dcd734c463d73cae153c543f8e1d7d58ea81ea8 Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Mon, 20 Apr 2026 16:10:35 +0530 Subject: [PATCH 16/19] Added support for Gemini TTS --- __init__.py | 2 + clientlibs/main.js | 4 +- clientlibs/types.js | 5 ++ clientlibs/utils.js | 62 +++++++++++++ modules/audioInferenceSpeech.py | 32 +++---- modules/audioInferenceSpeechVoices.py | 87 +++++++++++++++++++ modules/audioModelSearch.py | 4 + ...Audio_Inference_Google_Gemini_3_1_TTS.json | 1 + 8 files changed, 176 insertions(+), 21 deletions(-) create mode 100644 modules/audioInferenceSpeechVoices.py create mode 100644 workflows/Runware_Audio_Inference_Google_Gemini_3_1_TTS.json diff --git a/__init__.py b/__init__.py index dabcb9a..1ed41e6 100644 --- a/__init__.py +++ b/__init__.py @@ -42,6 +42,7 @@ from .modules.providerSettings.briaProviderSettings import RunwareBriaProviderSe from .modules.providerSettings.briaProviderMask import RunwareBriaProviderMask from .modules.audioInference import RunwareAudioInference from .modules.audioInferenceSpeech import RunwareAudioInferenceSpeech +from .modules.audioInferenceSpeechVoices import RunwareAudioInferenceSpeechVoices from .modules.audioModelSearch import RunwareAudioModelSearch from .modules.textModelSearch import RunwareTextModelSearch from .modules.textInferenceMessages import RunwareTextInferenceMessages @@ -164,6 +165,7 @@ NODE_CLASS_MAPPINGS = { "Runware Bria Provider Mask": RunwareBriaProviderMask, "Runware Audio Inference": RunwareAudioInference, "Runware Audio Inference Speech": RunwareAudioInferenceSpeech, + "Runware Audio Inference Speech Voices": RunwareAudioInferenceSpeechVoices, "Runware Audio Model Search": RunwareAudioModelSearch, "Runware Text Model Search": RunwareTextModelSearch, "Runware Text Inference Messages": RunwareTextInferenceMessages, diff --git a/clientlibs/main.js b/clientlibs/main.js index 1aa4c22..b137594 100644 --- a/clientlibs/main.js +++ b/clientlibs/main.js @@ -1,6 +1,6 @@ import { app } from "../../scripts/app.js"; import { api } from "../../scripts/api.js"; -import { promptEnhanceHandler, syncDimensionsNodeHandler, searchNodeHandler, APIKeyHandler, captionNodeHandler, saveTextHandler, mediaUUIDHandler, save3DFilepathHandler, videoTranscriptionHandler, videoOutputsHandler, handleCustomErrors, videoInferenceDimensionsHandler, videoModelSearchFilterHandler, audioModelSearchFilterHandler, textModelSearchFilterHandler, vectorizeModelSearchFilterHandler, vectorizeToggleHandler, useParameterToggleHandler, imageInferenceToggleHandler, imageInferenceAdvancedFeaturesToggleHandler, watermarkAdvancedFeatureToggleHandler, videoInferenceSpeechInputToggleHandler, regionalPromptingRegionsToggleHandler, upscalerToggleHandler, imageUpscalerSettingsToggleHandler, videoUpscalerToggleHandler, audioInferenceToggleHandler, audioInferenceSpeechToggleHandler, audioSettingsToggleHandler, textInferenceSettingsToggleHandler, videoSettingsToggleHandler, acceleratorOptionsToggleHandler, bytedanceProviderSettingsToggleHandler, xaiProviderSettingsToggleHandler, viduProviderSettingsToggleHandler, sourcefulProviderSettingsToggleHandler, sourcefulProviderSettingsFontsToggleHandler, threeDInferenceToggleHandler, threeDInferenceSettingsToggleHandler, threeDInferenceSettingsLatToggleHandler, ultralyticsProviderSettingsToggleHandler, openaiProviderSettingsToggleHandler, lightricksProviderSettingsToggleHandler, klingProviderSettingsToggleHandler, lumaProviderSettingsToggleHandler, briaProviderSettingsToggleHandler, pixverseProviderSettingsToggleHandler, alibabaProviderSettingsToggleHandler, mireloProviderSettingsToggleHandler, googleProviderSettingsToggleHandler, syncProviderSettingsToggleHandler, syncSegmentToggleHandler, settingsToggleHandler, safetyInputsToggleHandler, imageInferenceSettingsColorPaletteToggleHandler, audioInputToggleHandler, speechInputToggleHandler, briaProviderMaskToggleHandler, wanAnimateAdvancedFeatureSettingsToggleHandler, videoAdvancedFeatureInputsToggleHandler, audioInferenceInputsToggleHandler } from "./utils.js"; +import { promptEnhanceHandler, syncDimensionsNodeHandler, searchNodeHandler, APIKeyHandler, captionNodeHandler, saveTextHandler, mediaUUIDHandler, save3DFilepathHandler, videoTranscriptionHandler, videoOutputsHandler, handleCustomErrors, videoInferenceDimensionsHandler, videoModelSearchFilterHandler, audioModelSearchFilterHandler, textModelSearchFilterHandler, vectorizeModelSearchFilterHandler, vectorizeToggleHandler, useParameterToggleHandler, imageInferenceToggleHandler, imageInferenceAdvancedFeaturesToggleHandler, watermarkAdvancedFeatureToggleHandler, videoInferenceSpeechInputToggleHandler, regionalPromptingRegionsToggleHandler, upscalerToggleHandler, imageUpscalerSettingsToggleHandler, videoUpscalerToggleHandler, audioInferenceToggleHandler, audioInferenceSpeechToggleHandler, audioSettingsToggleHandler, textInferenceSettingsToggleHandler, videoSettingsToggleHandler, acceleratorOptionsToggleHandler, bytedanceProviderSettingsToggleHandler, xaiProviderSettingsToggleHandler, viduProviderSettingsToggleHandler, sourcefulProviderSettingsToggleHandler, sourcefulProviderSettingsFontsToggleHandler, threeDInferenceToggleHandler, threeDInferenceSettingsToggleHandler, threeDInferenceSettingsLatToggleHandler, ultralyticsProviderSettingsToggleHandler, openaiProviderSettingsToggleHandler, lightricksProviderSettingsToggleHandler, klingProviderSettingsToggleHandler, lumaProviderSettingsToggleHandler, briaProviderSettingsToggleHandler, pixverseProviderSettingsToggleHandler, alibabaProviderSettingsToggleHandler, mireloProviderSettingsToggleHandler, googleProviderSettingsToggleHandler, syncProviderSettingsToggleHandler, syncSegmentToggleHandler, settingsToggleHandler, safetyInputsToggleHandler, imageInferenceSettingsColorPaletteToggleHandler, audioInputToggleHandler, speechInputToggleHandler, briaProviderMaskToggleHandler, wanAnimateAdvancedFeatureSettingsToggleHandler, videoAdvancedFeatureInputsToggleHandler, audioInferenceInputsToggleHandler, audioInferenceSpeechVoicesToggleHandler } from "./utils.js"; import { RUNWARE_NODE_TYPES, RUNWARE_NODE_PROPS, SEARCH_TERMS } from "./types.js"; const nodeInitList = []; @@ -91,6 +91,8 @@ app.registerExtension({ regionalPromptingRegionsToggleHandler(node); } else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOINFERENCESPEECH) { audioInferenceSpeechToggleHandler(node); + } else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOINFERENCESPEECHVOICES) { + audioInferenceSpeechVoicesToggleHandler(node); } else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOSETTINGS) { audioSettingsToggleHandler(node); } else if(nodeClass === RUNWARE_NODE_TYPES.TEXTINFERENCESETTINGS) { diff --git a/clientlibs/types.js b/clientlibs/types.js index d454480..0787e41 100644 --- a/clientlibs/types.js +++ b/clientlibs/types.js @@ -82,6 +82,7 @@ const RUNWARE_NODE_TYPES = { FRAMEIMAGES: "Runware Frame Images", AUDIOINFERENCE: "Runware Audio Inference", AUDIOINFERENCESPEECH: "Runware Audio Inference Speech", + AUDIOINFERENCESPEECHVOICES: "Runware Audio Inference Speech Voices", AUDIOMODELSEARCH: "Runware Audio Model Search", TEXTMODELSEARCH: "Runware Text Model Search", TEXTINFERENCE: "Runware Text Inference", @@ -299,6 +300,10 @@ const RUNWARE_NODE_PROPS = { [RUNWARE_NODE_TYPES.AUDIOINFERENCESPEECH]: { bgColor: DEFAULT_BGCOLOR, }, + [RUNWARE_NODE_TYPES.AUDIOINFERENCESPEECHVOICES]: { + bgColor: DEFAULT_BGCOLOR, + colorModeOnly: true, + }, [RUNWARE_NODE_TYPES.AUDIOMODELSEARCH]: { bgColor: DEFAULT_BGCOLOR, liveSearch: true, diff --git a/clientlibs/utils.js b/clientlibs/utils.js index fe06b2d..6558f27 100644 --- a/clientlibs/utils.js +++ b/clientlibs/utils.js @@ -3137,6 +3137,9 @@ function audioModelSearchFilterHandler(audioModelSearchNode) { "inworld:tts@1.5-mini (Inworld TTS-1.5 Mini)", "inworld:tts@1.5-max (Inworld TTS-1.5 Max)", ], + "Google": [ + "google:gemini@3.1-flash-tts (Gemini 3.1 Flash TTS)", + ], }; function filterModelList() { @@ -4614,6 +4617,64 @@ function audioInferenceInputsToggleHandler(audioInputsNode) { } } +function audioInferenceSpeechVoicesToggleHandler(voicesNode) { + if (!voicesNode?.widgets) return; + + 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 = voicesNode.htmlElements?.widgetsContainer || voicesNode.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"; + } + } + } + } + + voicesNode.setDirtyCanvas(true); + } + + appendWidgetCB(useWidget, () => { + setTimeout(toggleEnabled, 50); + }); + + setTimeout(toggleEnabled, 100); + } + + for (let i = 1; i <= 4; i++) { + const useVoiceWidget = voicesNode.widgets.find((w) => w && w.name === `useVoice${i}`); + const speakerWidget = voicesNode.widgets.find((w) => w && w.name === `speaker${i}`); + const voiceWidget = voicesNode.widgets.find((w) => w && w.name === `voice${i}`); + + if (useVoiceWidget && speakerWidget) { + toggleWidgetState(useVoiceWidget, speakerWidget, `speaker${i}`); + } + if (useVoiceWidget && voiceWidget) { + toggleWidgetState(useVoiceWidget, voiceWidget, `voice${i}`); + } + } +} + export { notifyUser, promptEnhanceHandler, @@ -4677,6 +4738,7 @@ export { wanAnimateAdvancedFeatureSettingsToggleHandler, videoAdvancedFeatureInputsToggleHandler, audioInferenceInputsToggleHandler, + audioInferenceSpeechVoicesToggleHandler, }; function googleProviderSettingsToggleHandler(googleNode) { diff --git a/modules/audioInferenceSpeech.py b/modules/audioInferenceSpeech.py index 7805637..09f6362 100644 --- a/modules/audioInferenceSpeech.py +++ b/modules/audioInferenceSpeech.py @@ -14,20 +14,6 @@ class RunwareAudioInferenceSpeech: "calm", "fluent", "whisper", ] - SPEECH_LANGUAGES = [ - "Auto", - "Chinese", - "English", - "Japanese", - "Korean", - "German", - "French", - "Russian", - "Portuguese", - "Spanish", - "Italian", - ] - def __init__(self): pass @@ -50,7 +36,7 @@ class RunwareAudioInferenceSpeech: "default": "", "tooltip": "Voice identifier.", }), - "useSpeed": ("BOOLEAN", {"default": True, "tooltip": "Include speed (speech.speed)"}), + "useSpeed": ("BOOLEAN", {"default": False, "tooltip": "Include speed (speech.speed)"}), "speed": ("FLOAT", { "default": 1.0, "min": 0.5, @@ -58,7 +44,7 @@ class RunwareAudioInferenceSpeech: "step": 0.01, "tooltip": "Speech rate multiplier (speech.speed)", }), - "useVolume": ("BOOLEAN", {"default": True, "tooltip": "Include volume (speech.volume)"}), + "useVolume": ("BOOLEAN", {"default": False, "tooltip": "Include volume (speech.volume)"}), "volume": ("FLOAT", { "default": 1.0, "min": 1.0, @@ -87,9 +73,12 @@ class RunwareAudioInferenceSpeech: "default": False, "tooltip": "Enable to include language (speech.language).", }), - "language": (cls.SPEECH_LANGUAGES, { + "language": ("STRING", { "default": "Auto", - "tooltip": "Language of the input text. Options: Auto, Chinese, English, Japanese, Korean, German, French, Russian, Portuguese, Spanish, Italian. Applies to all variants. Only used when 'Use Language' is enabled.", + "tooltip": "Language of the input text (for example: en-US). Applies to all variants. Only used when 'Use Language' is enabled.", + }), + "voices": ("RUNWAREAUDIOINFERENCESPEECHVOICES", { + "tooltip": "Optional multi-speaker voices array (speech.voices[]). If provided, it takes precedence over speech.voice.", }), } } @@ -119,10 +108,13 @@ class RunwareAudioInferenceSpeech: use_tone = kwargs.get("useTone", False) tone_str = kwargs.get("tone", "") or "" use_language = kwargs.get("useLanguage", False) - language = kwargs.get("language", "Auto") + language = (kwargs.get("language") or "Auto").strip() + voices = kwargs.get("voices") speech: Dict[str, Any] = {"text": text} - if use_voice: + if isinstance(voices, list) and len(voices) > 0: + speech["voices"] = voices + elif use_voice: speech["voice"] = voice if use_speed: speech["speed"] = speed diff --git a/modules/audioInferenceSpeechVoices.py b/modules/audioInferenceSpeechVoices.py new file mode 100644 index 0000000..91f1714 --- /dev/null +++ b/modules/audioInferenceSpeechVoices.py @@ -0,0 +1,87 @@ +""" +Runware Audio Inference Speech Voices node: +Builds speech.voices[] for multi-speaker audio inference speech payloads. +""" + +import re +from typing import Any, Dict, List + + +class RunwareAudioInferenceSpeechVoices: + """Build speech.voices[] list for Runware Audio Inference.""" + + MAX_VOICES = 4 + _SPEAKER_ALIAS_PATTERN = re.compile(r"^[A-Za-z0-9]+$") + + @classmethod + def INPUT_TYPES(cls): + optional_inputs = {} + for i in range(1, cls.MAX_VOICES + 1): + optional_inputs[f"useVoice{i}"] = ("BOOLEAN", { + "default": i == 1, + "tooltip": f"Enable to include speaker/voice pair #{i} in speech.voices.", + }) + optional_inputs[f"speaker{i}"] = ("STRING", { + "default": f"Speaker{i}", + "tooltip": "Unique alphanumeric speaker alias (speech.voices[].speaker).", + }) + optional_inputs[f"voice{i}"] = ("STRING", { + "default": "", + "tooltip": "Voice name for this speaker (speech.voices[].voice).", + }) + + return { + "required": {}, + "optional": optional_inputs, + } + + RETURN_TYPES = ("RUNWAREAUDIOINFERENCESPEECHVOICES",) + RETURN_NAMES = ("voices",) + FUNCTION = "createVoices" + CATEGORY = "Runware/Audio" + DESCRIPTION = ( + "Build speech.voices[] for multi-speaker synthesis. " + "Each item contains speaker (unique alphanumeric alias) and voice name." + ) + + def createVoices(self, **kwargs) -> tuple[List[Dict[str, str]]]: + voices: List[Dict[str, str]] = [] + seen_speakers = set() + + for i in range(1, self.MAX_VOICES + 1): + use_voice = bool(kwargs.get(f"useVoice{i}", i == 1)) + if not use_voice: + continue + + speaker = (kwargs.get(f"speaker{i}") or "").strip() + voice = (kwargs.get(f"voice{i}") or "").strip() + + if not speaker or not voice: + raise Exception( + f"Voice #{i} is enabled, but speaker{i} and voice{i} must both be provided." + ) + if not self._SPEAKER_ALIAS_PATTERN.match(speaker): + raise Exception( + f"speaker{i} must be alphanumeric only (got: '{speaker}')." + ) + if speaker in seen_speakers: + raise Exception( + f"Duplicate speaker alias '{speaker}'. Each speaker must be unique." + ) + + seen_speakers.add(speaker) + voices.append({ + "speaker": speaker, + "voice": voice, + }) + + return (voices,) + + +NODE_CLASS_MAPPINGS = { + "RunwareAudioInferenceSpeechVoices": RunwareAudioInferenceSpeechVoices, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "RunwareAudioInferenceSpeechVoices": "Runware Audio Inference Speech Voices", +} diff --git a/modules/audioModelSearch.py b/modules/audioModelSearch.py index fe33336..5a18887 100644 --- a/modules/audioModelSearch.py +++ b/modules/audioModelSearch.py @@ -40,6 +40,9 @@ class RunwareAudioModelSearch: "inworld:tts@1.5-mini (Inworld TTS-1.5 Mini)", "inworld:tts@1.5-max (Inworld TTS-1.5 Max)", ], + "Google": [ + "google:gemini@3.1-flash-tts (Gemini 3.1 Flash TTS)", + ], } MODEL_PROVIDERS = [ @@ -53,6 +56,7 @@ class RunwareAudioModelSearch: "xAI", "MiniMax", "Inworld", + "Google", ] @classmethod diff --git a/workflows/Runware_Audio_Inference_Google_Gemini_3_1_TTS.json b/workflows/Runware_Audio_Inference_Google_Gemini_3_1_TTS.json new file mode 100644 index 0000000..a3bc575 --- /dev/null +++ b/workflows/Runware_Audio_Inference_Google_Gemini_3_1_TTS.json @@ -0,0 +1 @@ +{"id":"dccc59cb-49b6-4ea6-8414-590c2235bf3f","revision":0,"last_node_id":6,"last_link_id":4,"nodes":[{"id":3,"type":"SaveAudioMP3","pos":[1215.76708984375,670.1636352539062],"size":[270,136],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"audio","name":"audio","type":"AUDIO","link":1},{"localized_name":"filename_prefix","name":"filename_prefix","type":"STRING","widget":{"name":"filename_prefix"},"link":null},{"localized_name":"quality","name":"quality","type":"COMBO","widget":{"name":"quality"},"link":null},{"localized_name":"audioUI","name":"audioUI","type":"AUDIO_UI","widget":{"name":"audioUI"},"link":null}],"outputs":[],"properties":{"cnr_id":"comfy-core","ver":"0.3.46","Node name for S&R":"SaveAudioMP3"},"widgets_values":["audio/ComfyUI","V0"]},{"id":1,"type":"Runware Audio Model Search","pos":[243.41549682617188,652.7023315429688],"size":[270,130],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"Model Search","name":"Model Search","type":"STRING","widget":{"name":"Model Search"},"link":null},{"localized_name":"Model Provider","name":"Model Provider","type":"COMBO","widget":{"name":"Model Provider"},"link":null},{"localized_name":"AudioList","name":"AudioList","type":"COMBO","widget":{"name":"AudioList"},"link":null},{"localized_name":"Use Search Value","name":"Use Search Value","type":"BOOLEAN","widget":{"name":"Use Search Value"},"link":null}],"outputs":[{"localized_name":"model","name":"model","type":"RUNWAREAUDIOMODEL","links":[2]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"b4da68335d246b2c076a83640270d3fc9fe2cb5b","Node name for S&R":"Runware Audio Model Search"},"widgets_values":["","Google","google:gemini@3.1-flash-tts (Gemini 3.1 Flash TTS)",false],"bgcolor":"#5345bf"},{"id":5,"type":"Runware Audio Inference Speech Voices","pos":[1098.5885009765625,939.715576171875],"size":[354.3951110839844,322],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"useVoice1","name":"useVoice1","shape":7,"type":"BOOLEAN","widget":{"name":"useVoice1"},"link":null},{"localized_name":"speaker1","name":"speaker1","shape":7,"type":"STRING","widget":{"name":"speaker1"},"link":null},{"localized_name":"voice1","name":"voice1","shape":7,"type":"STRING","widget":{"name":"voice1"},"link":null},{"localized_name":"useVoice2","name":"useVoice2","shape":7,"type":"BOOLEAN","widget":{"name":"useVoice2"},"link":null},{"localized_name":"speaker2","name":"speaker2","shape":7,"type":"STRING","widget":{"name":"speaker2"},"link":null},{"localized_name":"voice2","name":"voice2","shape":7,"type":"STRING","widget":{"name":"voice2"},"link":null},{"localized_name":"useVoice3","name":"useVoice3","shape":7,"type":"BOOLEAN","widget":{"name":"useVoice3"},"link":null},{"localized_name":"speaker3","name":"speaker3","shape":7,"type":"STRING","widget":{"name":"speaker3"},"link":null},{"localized_name":"voice3","name":"voice3","shape":7,"type":"STRING","widget":{"name":"voice3"},"link":null},{"localized_name":"useVoice4","name":"useVoice4","shape":7,"type":"BOOLEAN","widget":{"name":"useVoice4"},"link":null},{"localized_name":"speaker4","name":"speaker4","shape":7,"type":"STRING","widget":{"name":"speaker4"},"link":null},{"localized_name":"voice4","name":"voice4","shape":7,"type":"STRING","widget":{"name":"voice4"},"link":null}],"outputs":[{"localized_name":"voices","name":"voices","type":"RUNWAREAUDIOINFERENCESPEECHVOICES","links":[3]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"b4da68335d246b2c076a83640270d3fc9fe2cb5b","Node name for S&R":"Runware Audio Inference Speech Voices"},"widgets_values":[true,"Sam","Aoede",true,"Bob","Algieba",false,"Speaker3","",false,"Speaker4",""],"bgcolor":"#5345bf"},{"id":2,"type":"Runware Audio Inference","pos":[605.2332153320312,597.2218627929688],"size":[400,746],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"model","name":"model","type":"RUNWAREAUDIOMODEL","link":2},{"localized_name":"inputs","name":"inputs","shape":7,"type":"RUNWAREAUDIOINFERENCEINPUTS","link":null},{"localized_name":"settings","name":"settings","shape":7,"type":"RUNWAREAUDIOSETTINGS","link":null},{"localized_name":"speech","name":"speech","shape":7,"type":"RUNWARESPEECH","link":4},{"localized_name":"voiceModify","name":"voiceModify","shape":7,"type":"RUNWAREVOICEMODIFY","link":null},{"localized_name":"providerSettings","name":"providerSettings","shape":7,"type":"RUNWAREPROVIDERSETTINGS","link":null},{"localized_name":"usePositivePrompt","name":"usePositivePrompt","type":"BOOLEAN","widget":{"name":"usePositivePrompt"},"link":null},{"localized_name":"positivePrompt","name":"positivePrompt","type":"STRING","widget":{"name":"positivePrompt"},"link":null},{"localized_name":"negativePrompt","name":"negativePrompt","type":"STRING","widget":{"name":"negativePrompt"},"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":"useSampleRate","name":"useSampleRate","type":"BOOLEAN","widget":{"name":"useSampleRate"},"link":null},{"localized_name":"sampleRate","name":"sampleRate","type":"COMBO","widget":{"name":"sampleRate"},"link":null},{"localized_name":"useBitrate","name":"useBitrate","type":"BOOLEAN","widget":{"name":"useBitrate"},"link":null},{"localized_name":"bitrate","name":"bitrate","type":"COMBO","widget":{"name":"bitrate"},"link":null},{"localized_name":"useChannels","name":"useChannels","type":"BOOLEAN","widget":{"name":"useChannels"},"link":null},{"localized_name":"channels","name":"channels","type":"INT","widget":{"name":"channels"},"link":null},{"localized_name":"outputType","name":"outputType","type":"COMBO","widget":{"name":"outputType"},"link":null},{"localized_name":"outputFormat","name":"outputFormat","type":"COMBO","widget":{"name":"outputFormat"},"link":null},{"localized_name":"numberResults","name":"numberResults","type":"INT","widget":{"name":"numberResults"},"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":"useStrength","name":"useStrength","type":"BOOLEAN","widget":{"name":"useStrength"},"link":null},{"localized_name":"strength","name":"strength","type":"FLOAT","widget":{"name":"strength"},"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}],"outputs":[{"localized_name":"audio","name":"audio","type":"AUDIO","links":[1]},{"localized_name":"video","name":"video","type":"VIDEO","links":null}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"b4da68335d246b2c076a83640270d3fc9fe2cb5b","Node name for S&R":"Runware Audio Inference"},"widgets_values":[false,"","",false,10,false,32000,false,128,false,2,"URL","MP3",1,false,885055810,"randomize",false,20,false,0.8,false,12],"bgcolor":"#5345bf"},{"id":4,"type":"Runware Audio Inference Speech","pos":[168.8231964111328,881.7427368164062],"size":[400,454],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"voices","name":"voices","shape":7,"type":"RUNWAREAUDIOINFERENCESPEECHVOICES","link":3},{"localized_name":"text","name":"text","type":"STRING","widget":{"name":"text"},"link":null},{"localized_name":"useVoice","name":"useVoice","shape":7,"type":"BOOLEAN","widget":{"name":"useVoice"},"link":null},{"localized_name":"voice","name":"voice","shape":7,"type":"STRING","widget":{"name":"voice"},"link":null},{"localized_name":"useSpeed","name":"useSpeed","shape":7,"type":"BOOLEAN","widget":{"name":"useSpeed"},"link":null},{"localized_name":"speed","name":"speed","shape":7,"type":"FLOAT","widget":{"name":"speed"},"link":null},{"localized_name":"useVolume","name":"useVolume","shape":7,"type":"BOOLEAN","widget":{"name":"useVolume"},"link":null},{"localized_name":"volume","name":"volume","shape":7,"type":"FLOAT","widget":{"name":"volume"},"link":null},{"localized_name":"usePitch","name":"usePitch","shape":7,"type":"BOOLEAN","widget":{"name":"usePitch"},"link":null},{"localized_name":"pitch","name":"pitch","shape":7,"type":"FLOAT","widget":{"name":"pitch"},"link":null},{"localized_name":"useEmotion","name":"useEmotion","shape":7,"type":"BOOLEAN","widget":{"name":"useEmotion"},"link":null},{"localized_name":"emotion","name":"emotion","shape":7,"type":"COMBO","widget":{"name":"emotion"},"link":null},{"localized_name":"useTone","name":"useTone","shape":7,"type":"BOOLEAN","widget":{"name":"useTone"},"link":null},{"localized_name":"tone","name":"tone","shape":7,"type":"STRING","widget":{"name":"tone"},"link":null},{"localized_name":"useLanguage","name":"useLanguage","shape":7,"type":"BOOLEAN","widget":{"name":"useLanguage"},"link":null},{"localized_name":"language","name":"language","shape":7,"type":"STRING","widget":{"name":"language"},"link":null}],"outputs":[{"localized_name":"speech","name":"speech","type":"RUNWARESPEECH","links":[4]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"b4da68335d246b2c076a83640270d3fc9fe2cb5b","Node name for S&R":"Runware Audio Inference Speech"},"widgets_values":["[Sam] Hey Bob, did you see the new model? [Bob] Yeah, [laughs] it sounds great!",false,"",false,1,false,1,false,0,false,"calm",false,"",true,"en-US"],"bgcolor":"#5345bf"}],"links":[[1,2,0,3,0,"AUDIO"],[2,1,0,2,0,"RUNWAREAUDIOMODEL"],[3,5,0,4,0,"RUNWAREAUDIOINFERENCESPEECHVOICES"],[4,4,0,2,3,"RUNWARESPEECH"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6547164698733117,"offset":[178.5958437076911,-431.7559729011467]}},"version":0.4} \ No newline at end of file From dc76f4b7cfff27712c8ee8cc17998734134b0feb Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Tue, 21 Apr 2026 10:04:11 +0530 Subject: [PATCH 17/19] Fixed types and imports --- modules/audioInferenceSpeech.py | 4 ++-- modules/audioInferenceSpeechVoices.py | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/audioInferenceSpeech.py b/modules/audioInferenceSpeech.py index 09f6362..87dda60 100644 --- a/modules/audioInferenceSpeech.py +++ b/modules/audioInferenceSpeech.py @@ -97,9 +97,9 @@ class RunwareAudioInferenceSpeech: text = (kwargs.get("text") or "").strip() voice = (kwargs.get("voice") or "").strip() use_voice = kwargs.get("useVoice", False) - use_speed = kwargs.get("useSpeed", True) + use_speed = kwargs.get("useSpeed", False) speed = float(kwargs.get("speed", 1.0)) - use_volume = kwargs.get("useVolume", True) + use_volume = kwargs.get("useVolume", False) volume = float(kwargs.get("volume", 1.0)) use_pitch = kwargs.get("usePitch", False) pitch = float(kwargs.get("pitch", 0.0)) diff --git a/modules/audioInferenceSpeechVoices.py b/modules/audioInferenceSpeechVoices.py index 91f1714..794749a 100644 --- a/modules/audioInferenceSpeechVoices.py +++ b/modules/audioInferenceSpeechVoices.py @@ -4,7 +4,7 @@ Builds speech.voices[] for multi-speaker audio inference speech payloads. """ import re -from typing import Any, Dict, List +from typing import Dict, List class RunwareAudioInferenceSpeechVoices: @@ -18,7 +18,7 @@ class RunwareAudioInferenceSpeechVoices: optional_inputs = {} for i in range(1, cls.MAX_VOICES + 1): optional_inputs[f"useVoice{i}"] = ("BOOLEAN", { - "default": i == 1, + "default": False, "tooltip": f"Enable to include speaker/voice pair #{i} in speech.voices.", }) optional_inputs[f"speaker{i}"] = ("STRING", { @@ -44,12 +44,12 @@ class RunwareAudioInferenceSpeechVoices: "Each item contains speaker (unique alphanumeric alias) and voice name." ) - def createVoices(self, **kwargs) -> tuple[List[Dict[str, str]]]: - voices: List[Dict[str, str]] = [] + def createVoices(self, **kwargs) -> tuple[list[dict[str, str]],]: + voices: list[dict[str, str]] = [] seen_speakers = set() for i in range(1, self.MAX_VOICES + 1): - use_voice = bool(kwargs.get(f"useVoice{i}", i == 1)) + use_voice = bool(kwargs.get(f"useVoice{i}", False)) if not use_voice: continue From 4c00ec38059f2b69750e24b47858970fe06efb61 Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Wed, 22 Apr 2026 19:42:27 +0530 Subject: [PATCH 18/19] Added background to imageInference settings --- clientlibs/utils.js | 5 +++++ modules/settings.py | 14 +++++++++++++- .../Runware_Image_Inference_Openai_GPT_2.json | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 workflows/Runware_Image_Inference_Openai_GPT_2.json diff --git a/clientlibs/utils.js b/clientlibs/utils.js index 6558f27..69465b8 100644 --- a/clientlibs/utils.js +++ b/clientlibs/utils.js @@ -4823,6 +4823,8 @@ function settingsToggleHandler(settingsNode) { const trueCFGScaleWidget = settingsNode.widgets.find(w => w.name === "trueCFGScale"); const useQualityWidget = settingsNode.widgets.find(w => w.name === "useQuality"); const qualityWidget = settingsNode.widgets.find(w => w.name === "quality"); + const useBackgroundWidget = settingsNode.widgets.find(w => w.name === "useBackground"); + const backgroundWidget = settingsNode.widgets.find(w => w.name === "background"); const usePromptExtendWidget = settingsNode.widgets.find(w => w.name === "usePromptExtend"); const promptExtendWidget = settingsNode.widgets.find(w => w.name === "promptExtend"); const useEditRegionsWidget = settingsNode.widgets.find(w => w.name === "useEditRegions"); @@ -4895,6 +4897,9 @@ function settingsToggleHandler(settingsNode) { if (useQualityWidget && qualityWidget) { toggleWidgetState(useQualityWidget, qualityWidget, "quality"); } + if (useBackgroundWidget && backgroundWidget) { + toggleWidgetState(useBackgroundWidget, backgroundWidget, "background"); + } if (usePromptExtendWidget && promptExtendWidget) { toggleWidgetState(usePromptExtendWidget, promptExtendWidget, "promptExtend"); } diff --git a/modules/settings.py b/modules/settings.py index 8af8866..fcb8e87 100644 --- a/modules/settings.py +++ b/modules/settings.py @@ -126,6 +126,14 @@ class RunwareSettings: "default": "high", "tooltip": "Reasoning level for visual understanding. Only used when 'Use Thinking Level' is enabled.", }), + "useBackground": ("BOOLEAN", { + "tooltip": "Enable to include background style in API request", + "default": False, + }), + "background": (["auto", "transparent", "opaque"], { + "default": "auto", + "tooltip": "Background style for the generated image. Only used when 'Use Background' is enabled.", + }), } } @@ -134,7 +142,7 @@ class RunwareSettings: FUNCTION = "createSettings" CATEGORY = "Runware" DESCRIPTION = ( - "Configure general settings for image generation: temperature, system prompt, top-p, layers, quality, " + "Configure general settings for image generation: temperature, system prompt, top-p, layers, quality, background, " "promptExtend, editRegions (JSON), thinking (boolean), thinkingLevel (high/medium/low), sequential, and optional colorPalette from the Color Palette node." ) @@ -148,6 +156,7 @@ class RunwareSettings: useLayers = kwargs.get("useLayers", False) useTrueCFGScale = kwargs.get("useTrueCFGScale", False) useQuality = kwargs.get("useQuality", False) + useBackground = kwargs.get("useBackground", False) usePromptExtend = kwargs.get("usePromptExtend", False) promptExtend = kwargs.get("promptExtend", False) useEditRegions = kwargs.get("useEditRegions", False) @@ -162,6 +171,7 @@ class RunwareSettings: layers = kwargs.get("layers") trueCFGScale = kwargs.get("trueCFGScale") quality = kwargs.get("quality", "medium") + background = kwargs.get("background", "auto") # Build settings dictionary - only include what is enabled settings: Dict[str, Any] = {} @@ -179,6 +189,8 @@ class RunwareSettings: settings["true_cfg_scale"] = float(trueCFGScale) if useQuality: settings["quality"] = quality + if useBackground: + settings["background"] = background if usePromptExtend: settings["promptExtend"] = bool(promptExtend) diff --git a/workflows/Runware_Image_Inference_Openai_GPT_2.json b/workflows/Runware_Image_Inference_Openai_GPT_2.json new file mode 100644 index 0000000..6bebb04 --- /dev/null +++ b/workflows/Runware_Image_Inference_Openai_GPT_2.json @@ -0,0 +1 @@ +{"id":"106e6901-ecec-4d3b-996e-c665dc6f2767","revision":0,"last_node_id":4,"last_link_id":3,"nodes":[{"id":3,"type":"Runware Save Image","pos":[471.0252380371094,-103.6495590209961],"size":[270,318],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"Images","name":"Images","type":"STRING","widget":{"name":"Images"},"link":2},{"localized_name":"filenamePrefix","name":"filenamePrefix","type":"STRING","widget":{"name":"filenamePrefix"},"link":null},{"localized_name":"saveImage","name":"saveImage","type":"BOOLEAN","widget":{"name":"saveImage"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"IMAGE","links":null}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"04bff0c88848b05554ae68895a136d49bc46752e","Node name for S&R":"Runware Save Image"},"widgets_values":["","ComfyUI",true],"bgcolor":"#5345bf"},{"id":4,"type":"Runware Model Search","pos":[-682.6438598632812,-68.08817291259766],"size":[270,154],"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":"ModelType","name":"ModelType","type":"COMBO","widget":{"name":"ModelType"},"link":null},{"localized_name":"ModelList","name":"ModelList","type":"COMBO","widget":{"name":"ModelList"},"link":null},{"localized_name":"Use Search Value","name":"Use Search Value","type":"BOOLEAN","widget":{"name":"Use Search Value"},"link":null}],"outputs":[{"localized_name":"Runware Model","name":"Runware Model","type":"RUNWAREMODEL","links":[3]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"04bff0c88848b05554ae68895a136d49bc46752e","Node name for S&R":"Runware Model Search"},"widgets_values":["openai:gpt-image@2","All","Base Model","openai:gpt-image@2.0 (GPT Image 2.0 2.0)",true],"bgcolor":"#5345bf"},{"id":2,"type":"Runware Settings","pos":[-384.5267028808594,-71.57030487060547],"size":[400,670],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"colorPalette","name":"colorPalette","shape":7,"type":"RUNWAREIMAGEINFERENCECOLORPALETTE","link":null},{"localized_name":"useTemperature","name":"useTemperature","shape":7,"type":"BOOLEAN","widget":{"name":"useTemperature"},"link":null},{"localized_name":"temperature","name":"temperature","shape":7,"type":"FLOAT","widget":{"name":"temperature"},"link":null},{"localized_name":"useSystemPrompt","name":"useSystemPrompt","shape":7,"type":"BOOLEAN","widget":{"name":"useSystemPrompt"},"link":null},{"localized_name":"systemPrompt","name":"systemPrompt","shape":7,"type":"STRING","widget":{"name":"systemPrompt"},"link":null},{"localized_name":"useTopP","name":"useTopP","shape":7,"type":"BOOLEAN","widget":{"name":"useTopP"},"link":null},{"localized_name":"topP","name":"topP","shape":7,"type":"FLOAT","widget":{"name":"topP"},"link":null},{"localized_name":"useLayers","name":"useLayers","shape":7,"type":"BOOLEAN","widget":{"name":"useLayers"},"link":null},{"localized_name":"layers","name":"layers","shape":7,"type":"INT","widget":{"name":"layers"},"link":null},{"localized_name":"useTrueCFGScale","name":"useTrueCFGScale","shape":7,"type":"BOOLEAN","widget":{"name":"useTrueCFGScale"},"link":null},{"localized_name":"trueCFGScale","name":"trueCFGScale","shape":7,"type":"FLOAT","widget":{"name":"trueCFGScale"},"link":null},{"localized_name":"useQuality","name":"useQuality","shape":7,"type":"BOOLEAN","widget":{"name":"useQuality"},"link":null},{"localized_name":"quality","name":"quality","shape":7,"type":"COMBO","widget":{"name":"quality"},"link":null},{"localized_name":"usePromptExtend","name":"usePromptExtend","shape":7,"type":"BOOLEAN","widget":{"name":"usePromptExtend"},"link":null},{"localized_name":"promptExtend","name":"promptExtend","shape":7,"type":"BOOLEAN","widget":{"name":"promptExtend"},"link":null},{"localized_name":"useEditRegions","name":"useEditRegions","shape":7,"type":"BOOLEAN","widget":{"name":"useEditRegions"},"link":null},{"localized_name":"editRegions","name":"editRegions","shape":7,"type":"STRING","widget":{"name":"editRegions"},"link":null},{"localized_name":"useThinking","name":"useThinking","shape":7,"type":"BOOLEAN","widget":{"name":"useThinking"},"link":null},{"localized_name":"thinking","name":"thinking","shape":7,"type":"BOOLEAN","widget":{"name":"thinking"},"link":null},{"localized_name":"useSequential","name":"useSequential","shape":7,"type":"BOOLEAN","widget":{"name":"useSequential"},"link":null},{"localized_name":"sequential","name":"sequential","shape":7,"type":"BOOLEAN","widget":{"name":"sequential"},"link":null},{"localized_name":"useThinkingLevel","name":"useThinkingLevel","shape":7,"type":"BOOLEAN","widget":{"name":"useThinkingLevel"},"link":null},{"localized_name":"thinkingLevel","name":"thinkingLevel","shape":7,"type":"COMBO","widget":{"name":"thinkingLevel"},"link":null},{"localized_name":"useBackground","name":"useBackground","shape":7,"type":"BOOLEAN","widget":{"name":"useBackground"},"link":null},{"localized_name":"background","name":"background","shape":7,"type":"COMBO","widget":{"name":"background"},"link":null}],"outputs":[{"localized_name":"Settings","name":"Settings","type":"RUNWARESETTINGS","links":[1]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"04bff0c88848b05554ae68895a136d49bc46752e","Node name for S&R":"Runware Settings"},"widgets_values":[false,1,false,"",false,1,false,4,false,1,true,"medium",false,false,false,"",false,false,false,false,false,"high",true,"opaque"],"bgcolor":"#5345bf"},{"id":1,"type":"Runware Image Inference","pos":[42.23963928222656,-106.49801635742188],"size":[400,1082],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"Model","name":"Model","type":"RUNWAREMODEL","link":3},{"localized_name":"Accelerator","name":"Accelerator","shape":7,"type":"RUNWAREACCELERATOR","link":null},{"localized_name":"Lora","name":"Lora","shape":7,"type":"RUNWARELORA","link":null},{"localized_name":"Outpainting","name":"Outpainting","shape":7,"type":"RUNWAREOUTPAINT","link":null},{"localized_name":"IPAdapters","name":"IPAdapters","shape":7,"type":"RUNWAREIPAdapter","link":null},{"localized_name":"ControlNet","name":"ControlNet","shape":7,"type":"RUNWARECONTROLNET","link":null},{"localized_name":"Refiner","name":"Refiner","shape":7,"type":"RUNWAREREFINER","link":null},{"localized_name":"seedImage","name":"seedImage","shape":7,"type":"IMAGE","link":null},{"localized_name":"maskImage","name":"maskImage","shape":7,"type":"MASK","link":null},{"localized_name":"Embeddings","name":"Embeddings","shape":7,"type":"RUNWAREEMBEDDING","link":null},{"localized_name":"VAE","name":"VAE","shape":7,"type":"RUNWAREVAE","link":null},{"localized_name":"referenceImages","name":"referenceImages","shape":7,"type":"RUNWAREREFERENCEIMAGES","link":null},{"localized_name":"inputs","name":"inputs","shape":7,"type":"RUNWAREIMAGEINFERENCEINPUTS","link":null},{"localized_name":"providerSettings","name":"providerSettings","shape":7,"type":"RUNWAREPROVIDERSETTINGS","link":null},{"localized_name":"safetyInputs","name":"safetyInputs","shape":7,"type":"RUNWARESAFETYINPUTS","link":null},{"localized_name":"settings","name":"settings","shape":7,"type":"RUNWARESETTINGS","link":1},{"localized_name":"ultralytics","name":"ultralytics","shape":7,"type":"RUNWAREULTRALYTICSINPUTS","link":null},{"localized_name":"advancedFeatures","name":"advancedFeatures","shape":7,"type":"RUNWAREIMAGEINFERENCEADVANCEDFEATURES","link":null},{"localized_name":"positivePrompt","name":"positivePrompt","type":"STRING","widget":{"name":"positivePrompt"},"link":null},{"localized_name":"negativePrompt","name":"negativePrompt","type":"STRING","widget":{"name":"negativePrompt"},"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":"dimensions","name":"dimensions","type":"COMBO","widget":{"name":"dimensions"},"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},{"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":"useScheduler","name":"useScheduler","type":"BOOLEAN","widget":{"name":"useScheduler"},"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":"useSeed","name":"useSeed","type":"BOOLEAN","widget":{"name":"useSeed"},"link":null},{"localized_name":"seed","name":"seed","type":"INT","widget":{"name":"seed"},"link":null},{"localized_name":"useClipSkip","name":"useClipSkip","type":"BOOLEAN","widget":{"name":"useClipSkip"},"link":null},{"localized_name":"clipSkip","name":"clipSkip","type":"INT","widget":{"name":"clipSkip"},"link":null},{"localized_name":"strength","name":"strength","type":"FLOAT","widget":{"name":"strength"},"link":null},{"localized_name":"Mask Margin","name":"Mask Margin","type":"BOOLEAN","widget":{"name":"Mask Margin"},"link":null},{"localized_name":"maskMargin","name":"maskMargin","type":"INT","widget":{"name":"maskMargin"},"link":null},{"localized_name":"outputFormat","name":"outputFormat","type":"COMBO","widget":{"name":"outputFormat"},"link":null},{"localized_name":"batchSize","name":"batchSize","type":"INT","widget":{"name":"batchSize"},"link":null},{"localized_name":"acceleration","name":"acceleration","type":"COMBO","widget":{"name":"acceleration"},"link":null},{"localized_name":"outputQuality","name":"outputQuality","type":"INT","widget":{"name":"outputQuality"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"STRING","links":[2]},{"localized_name":"RW-Task","name":"RW-Task","type":"RUNWARETASK","links":null}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"04bff0c88848b05554ae68895a136d49bc46752e","Node name for S&R":"Runware Image Inference"},"widgets_values":["A young man professional portrait","",false,"Disabled","Square HD (1024x1024)",1024,1024,false,"1k",false,4,false,"Default",false,6.5,false,806143629,"randomize",true,0,0.8,false,32,"WEBP",1,"none",95],"bgcolor":"#5345bf"}],"links":[[1,2,0,1,15,"RUNWARESETTINGS"],[2,1,0,3,0,"STRING"],[3,4,0,1,0,"RUNWAREMODEL"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.7329122691210809,"offset":[823.3853408839059,169.09908964119734]}},"version":0.4} \ No newline at end of file From 103ddcc9f92e999097b1020ea3c9dff52e06411d Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Thu, 23 Apr 2026 11:17:06 +0530 Subject: [PATCH 19/19] Fixed docstring --- modules/settings.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/settings.py b/modules/settings.py index fcb8e87..899666f 100644 --- a/modules/settings.py +++ b/modules/settings.py @@ -1,7 +1,9 @@ """ Runware Image Inference Settings (registered as Runware Settings for workflow compatibility). -Provides settings for image generation including temperature, systemPrompt, topP, -editRegions, thinking (boolean), thinkingLevel (high/medium/low), sequential, and colorPalette (from Runware Image Inference Settings Color Palette). +Provides settings for image generation including temperature, systemPrompt, topP, layers, +quality, background, promptExtend, editRegions, thinking (boolean), +thinkingLevel (high/medium/low), sequential, and colorPalette +(from Runware Image Inference Settings Color Palette). """ import json