From 2ab6eccb4e5882be84b84130d5f70ffedf7ff0c0 Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Fri, 3 Apr 2026 01:41:42 +0530 Subject: [PATCH 1/3] Added Runware Image Inference Settings and Runware Image Upscaler Settings --- __init__.py | 6 + clientlibs/main.js | 6 +- clientlibs/types.js | 10 ++ clientlibs/utils.js | 130 ++++++++++++++++++ modules/imageInference.py | 2 +- modules/imageInferenceSettingsColorPalette.py | 66 +++++++++ modules/imageUpscalerSettings.py | 61 ++++++++ modules/settings.py | 82 +++++++++-- modules/upscaler.py | 53 +++++-- .../Runware-Image-Inference-Wan_2_7.json | 1 + ...Runware_Basic_Image_Upscaling_P_image.json | 1 + 11 files changed, 389 insertions(+), 29 deletions(-) create mode 100644 modules/imageInferenceSettingsColorPalette.py create mode 100644 modules/imageUpscalerSettings.py create mode 100644 workflows/Runware-Image-Inference-Wan_2_7.json create mode 100644 workflows/Runware_Basic_Image_Upscaling_P_image.json diff --git a/__init__.py b/__init__.py index 6141e5f..638bb9d 100644 --- a/__init__.py +++ b/__init__.py @@ -3,6 +3,7 @@ from .modules.outpaintSettings import outpaintSettings from .modules.bgremoval import bgremoval from .modules.photoMaker import photoMaker from .modules.upscaler import upscaler +from .modules.imageUpscalerSettings import RunwareImageUpscalerSettings from .modules.modelSearch import modelSearch from .modules.bridges import mainRoute from .modules.controlNet import controlNet @@ -90,6 +91,7 @@ from .modules.videoInputsReferences import videoInputsReferences from .modules.videoInputsFrame import RunwareVideoInputsFrameImages from .modules.safetyInputs import safetyInputs from .modules.settings import RunwareSettings +from .modules.imageInferenceSettingsColorPalette import RunwareImageInferenceSettingsColorPalette from .modules.videoAdvancedFeatureInputs import videoAdvancedFeatureInputs from .modules.advancedFeatureSettings.wanAnimateAdvancedFeatureSettings import RunwareWanAnimateAdvancedFeatureSettings from .modules.saveImage import RunwareSaveImage @@ -121,6 +123,7 @@ NODE_CLASS_MAPPINGS = { "Runware Background Removal": bgremoval, "Runware PhotoMaker V2": photoMaker, "Runware Image Upscaler": upscaler, + "Runware Image Upscaler Settings": RunwareImageUpscalerSettings, "Runware Model Search": modelSearch, "Runware Kontext Inference": runwareKontext, "Runware Imagen Inference": runwareImagen, @@ -207,6 +210,7 @@ NODE_CLASS_MAPPINGS = { "Runware Video Inputs Frame Images": RunwareVideoInputsFrameImages, "Runware Safety Inputs": safetyInputs, "Runware Settings": RunwareSettings, + "Runware Image Inference Settings Color Palette": RunwareImageInferenceSettingsColorPalette, "Runware Video Advanced Feature Inputs": videoAdvancedFeatureInputs, "Runware Wan Animate Advanced Feature Settings": RunwareWanAnimateAdvancedFeatureSettings, "Runware Save Image": RunwareSaveImage, @@ -223,6 +227,7 @@ NODE_CLASS_MAPPINGS = { } NODE_DISPLAY_NAME_MAPPINGS = { + "Runware Settings": "Runware Image Inference Settings", "Runware Model Search": "Runware Model", "Runware Lora Search": "Runware Lora", "Runware Embedding Search": "Runware Embedding", @@ -231,6 +236,7 @@ NODE_DISPLAY_NAME_MAPPINGS = { "Runware Video Model Search": "Runware Video Model", "Runware Audio Model Search": "Runware Audio Model", "Runware Text Model Search": "Runware Text Model", + "Runware Image Inference Settings Color Palette": "Runware Image Inference Color Palette", "Runware Video Transcription": "Runware Video Caption", } diff --git a/clientlibs/main.js b/clientlibs/main.js index 2e8e998..f29bca5 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, 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, 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, imageInferenceSettingsColorPaletteToggleHandler, audioInputToggleHandler, speechInputToggleHandler, briaProviderMaskToggleHandler, wanAnimateAdvancedFeatureSettingsToggleHandler, videoAdvancedFeatureInputsToggleHandler, audioInferenceInputsToggleHandler } from "./utils.js"; import { RUNWARE_NODE_TYPES, RUNWARE_NODE_PROPS, SEARCH_TERMS } from "./types.js"; const nodeInitList = []; @@ -75,6 +75,8 @@ app.registerExtension({ videoInferenceDimensionsHandler(node); } else if(nodeClass === RUNWARE_NODE_TYPES.UPSCALER) { upscalerToggleHandler(node); + } else if(nodeClass === RUNWARE_NODE_TYPES.IMAGEUPSCALERSETTINGS) { + imageUpscalerSettingsToggleHandler(node); } else if(nodeClass === RUNWARE_NODE_TYPES.VIDEOUPSCALER) { videoUpscalerToggleHandler(node); } else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOINFERENCE) { @@ -133,6 +135,8 @@ app.registerExtension({ sourcefulProviderSettingsFontsToggleHandler(node); } else if(nodeClass === RUNWARE_NODE_TYPES.SETTINGS) { settingsToggleHandler(node); + } else if(nodeClass === RUNWARE_NODE_TYPES.IMAGEINFERENCESETTINGSCOLORPALETTE) { + imageInferenceSettingsColorPaletteToggleHandler(node); } else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOINPUT) { audioInputToggleHandler(node); } else if(nodeClass === RUNWARE_NODE_TYPES.SPEECHINPUT) { diff --git a/clientlibs/types.js b/clientlibs/types.js index 28e309b..f0aa88d 100644 --- a/clientlibs/types.js +++ b/clientlibs/types.js @@ -61,6 +61,7 @@ const RUNWARE_NODE_TYPES = { CONTROLNET: "Runware ControlNet", BGREMOVAL: "Runware Background Removal", UPSCALER: "Runware Image Upscaler", + IMAGEUPSCALERSETTINGS: "Runware Image Upscaler Settings", REFINER: "Runware Refiner", LORACOMBINE: "Runware Lora Combine", CONTROLNETCOMBINE: "Runware ControlNet Combine", @@ -138,6 +139,7 @@ const RUNWARE_NODE_TYPES = { MINIMAXPROVIDERSETTINGS: "Runware MiniMax Provider Settings", SAFETYINPUTS: "Runware Safety Inputs", SETTINGS: "Runware Settings", + IMAGEINFERENCESETTINGSCOLORPALETTE: "Runware Image Inference Settings Color Palette", VIDEOADVANCEDFEATUREINPUTS: "Runware Video Advanced Feature Inputs", WANANIMATEADVANCEDFEATURESETTINGS: "Runware Wan Animate Advanced Feature Settings", SAVEIMAGE: "Runware Save Image", @@ -231,6 +233,10 @@ const RUNWARE_NODE_PROPS = { bgColor: DEFAULT_BGCOLOR, colorModeOnly: true, }, + [RUNWARE_NODE_TYPES.IMAGEUPSCALERSETTINGS]: { + bgColor: DEFAULT_BGCOLOR, + colorModeOnly: true, + }, [RUNWARE_NODE_TYPES.REFINER]: { bgColor: DEFAULT_BGCOLOR, colorModeOnly: true, @@ -526,6 +532,10 @@ const RUNWARE_NODE_PROPS = { bgColor: DEFAULT_BGCOLOR, colorModeOnly: true, }, + [RUNWARE_NODE_TYPES.IMAGEINFERENCESETTINGSCOLORPALETTE]: { + bgColor: DEFAULT_BGCOLOR, + colorModeOnly: true, + }, [RUNWARE_NODE_TYPES.VIDEOADVANCEDFEATUREINPUTS]: { bgColor: DEFAULT_BGCOLOR, colorModeOnly: true, diff --git a/clientlibs/utils.js b/clientlibs/utils.js index f134dae..8f59849 100644 --- a/clientlibs/utils.js +++ b/clientlibs/utils.js @@ -987,6 +987,8 @@ function useParameterToggleHandler(node) { function upscalerToggleHandler(upscalerNode) { // Find all "use" parameter widgets for Upscaler + const useUpscaleFactorWidget = upscalerNode.widgets.find(w => w.name === "useUpscaleFactor"); + const upscaleFactorWidget = upscalerNode.widgets.find(w => w.name === "upscaleFactor"); const useStepsWidget = upscalerNode.widgets.find(w => w.name === "useSteps"); const stepsWidget = upscalerNode.widgets.find(w => w.name === "steps"); const useSeedWidget = upscalerNode.widgets.find(w => w.name === "useSeed"); @@ -1054,6 +1056,10 @@ function upscalerToggleHandler(upscalerNode) { } // Set up all toggle handlers + if (useUpscaleFactorWidget && upscaleFactorWidget) { + toggleWidgetState(useUpscaleFactorWidget, [upscaleFactorWidget], ["upscaleFactor"]); + } + if (useStepsWidget && stepsWidget) { toggleWidgetState(useStepsWidget, [stepsWidget], ["steps"]); } @@ -1081,6 +1087,63 @@ function upscalerToggleHandler(upscalerNode) { if (useLatentParamsWidget && clipSkipWidget) { toggleWidgetState(useLatentParamsWidget, [clipSkipWidget], ["clipSkip"]); } + + const useTargetMegapixelsWidget = upscalerNode.widgets.find(w => w.name === "useTargetMegapixels"); + const targetMegapixelsWidget = upscalerNode.widgets.find(w => w.name === "targetMegapixels"); + if (useTargetMegapixelsWidget && targetMegapixelsWidget) { + toggleWidgetState(useTargetMegapixelsWidget, [targetMegapixelsWidget], ["targetMegapixels"]); + } +} + +function imageUpscalerSettingsToggleHandler(settingsNode) { + const useEnhanceDetailsWidget = settingsNode.widgets.find(w => w.name === "useEnhanceDetails"); + const enhanceDetailsWidget = settingsNode.widgets.find(w => w.name === "enhanceDetails"); + const useRealismWidget = settingsNode.widgets.find(w => w.name === "useRealism"); + const realismWidget = settingsNode.widgets.find(w => w.name === "realism"); + + 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 ? "pointer" : "not-allowed"; + } + paramWidget.disabled = !enabled; + + if (!paramWidget.inputEl) { + const nodeElement = settingsNode.htmlElements?.widgetsContainer || settingsNode.htmlElements; + if (nodeElement && paramName) { + 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 ? "pointer" : "not-allowed"; + } + } + } + + settingsNode.setDirtyCanvas(true); + } + + appendWidgetCB(useWidget, () => { + setTimeout(toggleEnabled, 50); + }); + + setTimeout(toggleEnabled, 100); + } + + if (useEnhanceDetailsWidget && enhanceDetailsWidget) { + toggleWidgetState(useEnhanceDetailsWidget, enhanceDetailsWidget, "enhanceDetails"); + } + if (useRealismWidget && realismWidget) { + toggleWidgetState(useRealismWidget, realismWidget, "realism"); + } } function audioInferenceToggleHandler(audioInferenceNode) { @@ -4394,6 +4457,7 @@ export { videoInferenceSpeechInputToggleHandler, regionalPromptingRegionsToggleHandler, upscalerToggleHandler, + imageUpscalerSettingsToggleHandler, videoUpscalerToggleHandler, audioInferenceToggleHandler, audioInferenceSpeechToggleHandler, @@ -4422,6 +4486,7 @@ export { syncProviderSettingsToggleHandler, syncSegmentToggleHandler, settingsToggleHandler, + imageInferenceSettingsColorPaletteToggleHandler, audioInputToggleHandler, speechInputToggleHandler, briaProviderMaskToggleHandler, @@ -4514,6 +4579,12 @@ function settingsToggleHandler(settingsNode) { const qualityWidget = settingsNode.widgets.find(w => w.name === "quality"); 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"); + const editRegionsWidget = settingsNode.widgets.find(w => w.name === "editRegions"); + const useThinkingWidget = settingsNode.widgets.find(w => w.name === "useThinking"); + const thinkingWidget = settingsNode.widgets.find(w => w.name === "thinking"); + const useSequentialWidget = settingsNode.widgets.find(w => w.name === "useSequential"); + const sequentialWidget = settingsNode.widgets.find(w => w.name === "sequential"); // Helper function to toggle widget enabled state function toggleWidgetState(useWidget, paramWidget, paramName) { @@ -4579,6 +4650,65 @@ function settingsToggleHandler(settingsNode) { if (usePromptExtendWidget && promptExtendWidget) { toggleWidgetState(usePromptExtendWidget, promptExtendWidget, "promptExtend"); } + if (useEditRegionsWidget && editRegionsWidget) { + toggleWidgetState(useEditRegionsWidget, editRegionsWidget, "editRegions"); + } + if (useThinkingWidget && thinkingWidget) { + toggleWidgetState(useThinkingWidget, thinkingWidget, "thinking"); + } + if (useSequentialWidget && sequentialWidget) { + toggleWidgetState(useSequentialWidget, sequentialWidget, "sequential"); + } +} + +function imageInferenceSettingsColorPaletteToggleHandler(paletteNode) { + function applyParamState(useWidget, paramWidget, paramName) { + if (!useWidget || !paramWidget) return; + 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 = paletteNode.htmlElements?.widgetsContainer || paletteNode.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; + } + } + } + } + + function bindSlot(i) { + const useW = paletteNode.widgets.find((w) => w.name === `use_${i}`); + const hexW = paletteNode.widgets.find((w) => w.name === `hex_${i}`); + const ratioW = paletteNode.widgets.find((w) => w.name === `ratio_${i}`); + if (!useW || !hexW || !ratioW) return; + + function toggleSlot() { + applyParamState(useW, hexW, `hex_${i}`); + applyParamState(useW, ratioW, `ratio_${i}`); + paletteNode.setDirtyCanvas(true); + } + + appendWidgetCB(useW, () => { + setTimeout(toggleSlot, 50); + }); + setTimeout(toggleSlot, 100); + } + + for (let i = 1; i <= 8; i++) { + bindSlot(i); + } } function syncProviderSettingsToggleHandler(syncNode) { diff --git a/modules/imageInference.py b/modules/imageInference.py index a53cc83..9d5f6f7 100644 --- a/modules/imageInference.py +++ b/modules/imageInference.py @@ -189,7 +189,7 @@ class txt2img: "tooltip": "Connect Runware Safety Inputs node to configure safety and content moderation settings.", }), "settings": ("RUNWARESETTINGS", { - "tooltip": "Connect Runware Settings node to configure temperature, systemPrompt, and topP parameters.", + "tooltip": "Connect Runware Image Inference Settings for temperature, systemPrompt, topP, layers, quality, promptExtend, editRegions (JSON), thinking, sequential, colorPalette (via Color Palette node), etc.", }), "ultralytics": ("RUNWAREULTRALYTICSINPUTS", { "tooltip": "Connect Runware Image Inference Ultralytics node to configure Ultralytics parameters (maskBlur, maskPadding, confidence, prompts, steps, CFGScale, strength).", diff --git a/modules/imageInferenceSettingsColorPalette.py b/modules/imageInferenceSettingsColorPalette.py new file mode 100644 index 0000000..927fc58 --- /dev/null +++ b/modules/imageInferenceSettingsColorPalette.py @@ -0,0 +1,66 @@ +""" +Runware Image Inference Settings Color Palette +Builds settings.colorPalette: list of { "hex": "#...", "ratio": "NN.NN%" } for Runware Image Inference Settings. +""" + +from typing import Any, Dict, List, Tuple + + +def _normalize_hex(raw: str) -> str: + h = raw.strip() + if not h: + return "" + return h if h.startswith("#") else f"#{h}" + + +class RunwareImageInferenceSettingsColorPalette: + """Up to 8 hex/ratio pairs; each slot is included only when use_{i} is enabled.""" + + _SLOTS = 8 + + @classmethod + def INPUT_TYPES(cls): + optional: Dict[str, tuple] = {} + for i in range(1, cls._SLOTS + 1): + optional[f"use_{i}"] = ("BOOLEAN", { + "default": False, + "label_on": "Enabled", + "label_off": "Disabled", + "tooltip": f"Include swatch {i} in the output colorPalette.", + }) + optional[f"hex_{i}"] = ("STRING", { + "default": "", + "tooltip": f"Swatch {i} hex, e.g. #C2D1E6. Required when use_{i} is enabled.", + }) + optional[f"ratio_{i}"] = ("STRING", { + "default": "", + "tooltip": f"Swatch {i} ratio, e.g. 23.51%%. Optional.", + }) + return {"required": {}, "optional": optional} + + RETURN_TYPES = ("RUNWAREIMAGEINFERENCECOLORPALETTE",) + RETURN_NAMES = ("colorPalette",) + FUNCTION = "build_palette" + CATEGORY = "Runware" + DESCRIPTION = ( + "Build a colorPalette list for image inference settings (hex + optional ratio per swatch). " + "Enable use_1…use_8 for each swatch to include; connect the output to Runware Image Inference Settings." + ) + + def build_palette(self, **kwargs) -> Tuple[List[Dict[str, Any]]]: + out: List[Dict[str, Any]] = [] + for i in range(1, self._SLOTS + 1): + if not kwargs.get(f"use_{i}", False): + continue + hx = _normalize_hex(str(kwargs.get(f"hex_{i}") or "")) + if not hx or hx == "#": + raise ValueError( + f"use_{i} is enabled but hex_{i} is empty or invalid. " + "Provide a hex color (e.g. #C2D1E6) or disable this swatch." + ) + ratio = str(kwargs.get(f"ratio_{i}") or "").strip() + entry: Dict[str, Any] = {"hex": hx} + if ratio: + entry["ratio"] = ratio + out.append(entry) + return (out,) diff --git a/modules/imageUpscalerSettings.py b/modules/imageUpscalerSettings.py new file mode 100644 index 0000000..4f27e60 --- /dev/null +++ b/modules/imageUpscalerSettings.py @@ -0,0 +1,61 @@ +""" +Runware Image Upscaler Settings — builds settings (enhanceDetails, realism). Connect to Runware Image Upscaler. +""" + +from typing import Any, Dict, Tuple + + +class RunwareImageUpscalerSettings: + @classmethod + def INPUT_TYPES(cls): + return { + "required": {}, + "optional": { + "useEnhanceDetails": ("BOOLEAN", { + "default": False, + "label_on": "Enabled", + "label_off": "Disabled", + "tooltip": "Include settings.enhanceDetails in the upscale request.", + }), + "enhanceDetails": ("BOOLEAN", { + "default": False, + "label_on": "true", + "label_off": "false", + "tooltip": "Enhance fine textures and small details. May increase contrast and introduce minor deviations from the original.", + }), + "useRealism": ("BOOLEAN", { + "default": False, + "label_on": "Enabled", + "label_off": "Disabled", + "tooltip": "Include settings.realism in the upscale request.", + }), + "realism": ("BOOLEAN", { + "default": True, + "label_on": "true", + "label_off": "false", + "tooltip": "Improve realism. May deviate more from the original. Recommended for AI-generated images.", + }), + }, + } + + RETURN_TYPES = ("RUNWAREIMAGEUPSCALERSETTINGS",) + RETURN_NAMES = ("Upscaler Settings",) + FUNCTION = "build_settings" + CATEGORY = "Runware" + DESCRIPTION = ( + "Optional settings.enhanceDetails and settings.realism for image upscale. " + "Connect to Runware Image Upscaler." + ) + + def build_settings(self, **kwargs) -> Tuple[Dict[str, Any]]: + out: Dict[str, Any] = {} + + settings: Dict[str, Any] = {} + if kwargs.get("useEnhanceDetails", False): + settings["enhanceDetails"] = bool(kwargs.get("enhanceDetails", False)) + if kwargs.get("useRealism", False): + settings["realism"] = bool(kwargs.get("realism", True)) + if settings: + out["settings"] = settings + + return (out,) diff --git a/modules/settings.py b/modules/settings.py index 1c56b31..9b2a866 100644 --- a/modules/settings.py +++ b/modules/settings.py @@ -1,13 +1,15 @@ """ -Runware Settings Node -Provides general settings for image generation including temperature, systemPrompt, and topP +Runware Image Inference Settings (registered as Runware Settings for workflow compatibility). +Provides settings for image generation including temperature, systemPrompt, topP, +editRegions, thinking, sequential, and colorPalette (from Runware Image Inference Settings Color Palette). """ -from typing import Optional, Dict, Any +import json +from typing import Any, Dict, List, Optional class RunwareSettings: - """Runware Settings Node""" + """Runware Image Inference Settings node (display name); API registration key remains Runware Settings.""" @classmethod def INPUT_TYPES(cls): @@ -84,6 +86,37 @@ class RunwareSettings: "label_on": "true", "label_off": "false", }), + "useEditRegions": ("BOOLEAN", { + "tooltip": "Enable to include editRegions in settings (per-input-image bounding boxes for edit flows).", + "default": False, + }), + "editRegions": ("STRING", { + "multiline": True, + "tooltip": "JSON array: one entry per input image; each entry is a list of boxes [x1,y1,x2,y2]. Example: [[[0,0,12,12],[25,25,100,100]],[],[[10,10,50,50]]]", + "default": "", + }), + "useThinking": ("BOOLEAN", { + "tooltip": "Enable to include thinking (string) in settings.", + "default": False, + }), + "thinking": ("STRING", { + "multiline": True, + "tooltip": "Thinking / reasoning string passed in settings. Only used when 'Use Thinking' is enabled.", + "default": "", + }), + "useSequential": ("BOOLEAN", { + "tooltip": "Enable to include sequential (boolean) in settings.", + "default": False, + }), + "sequential": ("BOOLEAN", { + "tooltip": "Sequential / image-set mode flag. Only used when 'Use Sequential' is enabled.", + "default": False, + "label_on": "true", + "label_off": "false", + }), + "colorPalette": ("RUNWAREIMAGEINFERENCECOLORPALETTE", { + "tooltip": "Connect Runware Image Inference Color Palette. When the palette node outputs at least one swatch, it is merged into settings.colorPalette.", + }), } } @@ -91,7 +124,10 @@ class RunwareSettings: RETURN_NAMES = ("Settings",) FUNCTION = "createSettings" CATEGORY = "Runware" - DESCRIPTION = "Configure general settings for image generation including temperature, system prompt, and top-p sampling." + DESCRIPTION = ( + "Configure general settings for image generation: temperature, system prompt, top-p, layers, quality, " + "promptExtend, editRegions (JSON), thinking, sequential, and optional colorPalette from the Color Palette node." + ) def createSettings(self, **kwargs) -> tuple[Dict[str, Any]]: """Create settings configuration""" @@ -105,6 +141,9 @@ class RunwareSettings: useQuality = kwargs.get("useQuality", False) usePromptExtend = kwargs.get("usePromptExtend", True) promptExtend = kwargs.get("promptExtend", True) + useEditRegions = kwargs.get("useEditRegions", False) + useThinking = kwargs.get("useThinking", False) + useSequential = kwargs.get("useSequential", False) # Get value parameters temperature = kwargs.get("temperature", 1.0) @@ -133,18 +172,31 @@ class RunwareSettings: if usePromptExtend: settings["promptExtend"] = bool(promptExtend) + if useEditRegions: + raw_er = (kwargs.get("editRegions") or "").strip() + if raw_er: + try: + parsed = json.loads(raw_er) + except json.JSONDecodeError as e: + raise ValueError(f"editRegions must be valid JSON: {e}") from e + if not isinstance(parsed, list): + raise ValueError("editRegions JSON must be an array (one element per input image).") + settings["editRegions"] = parsed + + if useThinking: + th = (kwargs.get("thinking") or "").strip() + if th: + settings["thinking"] = th + + if useSequential: + settings["sequential"] = bool(kwargs.get("sequential", False)) + + palette: Optional[List[Dict[str, Any]]] = kwargs.get("colorPalette") + if palette is not None and isinstance(palette, list) and len(palette) > 0: + settings["colorPalette"] = palette + # Clean up None values settings = {k: v for k, v in settings.items() if v is not None} return (settings,) - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareSettings": RunwareSettings, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareSettings": "Runware Settings", -} - diff --git a/modules/upscaler.py b/modules/upscaler.py index 5caa6b9..ee58f98 100644 --- a/modules/upscaler.py +++ b/modules/upscaler.py @@ -8,13 +8,32 @@ class upscaler: "Image": ("IMAGE", { "tooltip": "Specifies the input image to be upscaled." }), + "useUpscaleFactor": ("BOOLEAN", { + "tooltip": "Include upscaleFactor in the upscale request.", + "default": True, + "label_on": "Enabled", + "label_off": "Disabled", + }), "upscaleFactor": ("INT", { - "tooltip": "Each level will increase the size of the image by the corresponding factor.", + "tooltip": "Each level will increase the size of the image by the corresponding factor. Only used when 'Use Upscale Factor' is enabled.", "default": 2, "min": 1, "max": 8, "step": 1, }), + "useTargetMegapixels": ("BOOLEAN", { + "tooltip": "Enable targetMegapixels (root-level) on the upscale request.", + "default": False, + "label_on": "Enabled", + "label_off": "Disabled", + }), + "targetMegapixels": ("INT", { + "tooltip": "Target resolution in megapixels (1–8). Only used when 'Use Target Megapixels' is enabled.", + "default": 4, + "min": 1, + "max": 8, + "step": 1, + }), }, "optional": { "model": ("STRING", { @@ -113,15 +132,15 @@ class upscaler: "min": 0, "max": 2, }), - "safetyInputs": ("RUNWARESAFETYINPUTS", { - "tooltip": "Connect Runware Safety Inputs node to configure safety and content moderation settings.", - }), "Accelerator": ("RUNWAREACCELERATOR", { "tooltip": "Connect a Runware Accelerator Options Node to configure caching and acceleration settings.", }), "providerSettings": ("RUNWAREPROVIDERSETTINGS", { "tooltip": "Connect a Runware Provider Settings node to configure provider-specific parameters.", }), + "imageUpscalerSettings": ("RUNWAREIMAGEUPSCALERSETTINGS", { + "tooltip": "Connect Runware Image Upscaler Settings for settings.enhanceDetails and settings.realism.", + }), }, } @@ -133,8 +152,8 @@ class upscaler: def upscale(self, **kwargs): image = kwargs.get("Image") - upscaleFactor = int(kwargs.get("upscaleFactor", 2)) - + useUpscaleFactor = kwargs.get("useUpscaleFactor", True) + # Get toggle parameters useSteps = kwargs.get("useSteps", False) useSeed = kwargs.get("useSeed", False) @@ -157,24 +176,30 @@ class upscaler: colorFix = kwargs.get("colorFix", False) tileDiffusion = kwargs.get("tileDiffusion", False) clipSkip = kwargs.get("clipSkip", 0) - safetyInputs = kwargs.get("safetyInputs", None) runwareAccelerator = kwargs.get("Accelerator", None) providerSettings = kwargs.get("providerSettings", None) + imageUpscalerSettingsBundle = kwargs.get("imageUpscalerSettings", None) + useTargetMegapixels = kwargs.get("useTargetMegapixels", False) # Build the base configuration genConfig = { "taskType": "imageUpscale", "taskUUID": rwUtils.genRandUUID(), "inputImage": rwUtils.convertTensor2IMG(image), - "upscaleFactor": int(upscaleFactor), "outputFormat": rwUtils.OUTPUT_FORMAT, "outputQuality": rwUtils.OUTPUT_QUALITY, "outputType": "URL", } + + if useUpscaleFactor: + genConfig["upscaleFactor"] = int(kwargs.get("upscaleFactor", 2)) # Add model if specified if model: genConfig["model"] = model + + if useTargetMegapixels: + genConfig["targetMegapixels"] = int(kwargs.get("targetMegapixels", 4)) # Add common parameters at top level - only add if their toggle is enabled if useSteps: @@ -206,15 +231,19 @@ class upscaler: # Latent upscaler specific parameters if useLatentParams: settings["clipSkip"] = clipSkip + + if ( + imageUpscalerSettingsBundle is not None + and isinstance(imageUpscalerSettingsBundle, dict) + and "settings" in imageUpscalerSettingsBundle + and isinstance(imageUpscalerSettingsBundle["settings"], dict) + ): + settings.update(imageUpscalerSettingsBundle["settings"]) # Add settings to config if any settings were specified if settings: genConfig["settings"] = settings - # Add safety inputs if provided - if safetyInputs is not None and isinstance(safetyInputs, dict) and len(safetyInputs) > 0: - genConfig["safety"] = safetyInputs - # Add accelerator options if provided if runwareAccelerator is not None and isinstance(runwareAccelerator, dict) and len(runwareAccelerator) > 0: genConfig["acceleratorOptions"] = runwareAccelerator diff --git a/workflows/Runware-Image-Inference-Wan_2_7.json b/workflows/Runware-Image-Inference-Wan_2_7.json new file mode 100644 index 0000000..140f705 --- /dev/null +++ b/workflows/Runware-Image-Inference-Wan_2_7.json @@ -0,0 +1 @@ +{"id":"691afc28-c82b-40dd-859a-c55f39f6bcca","revision":0,"last_node_id":6,"last_link_id":4,"nodes":[{"id":4,"type":"Runware Save Image","pos":[906.2258911132812,685.7180786132812],"size":[270,318],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"Images","name":"Images","type":"STRING","widget":{"name":"Images"},"link":1},{"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":"d71fdad61b55ce88c15d1259ecd9407d99040f6d","Node name for S&R":"Runware Save Image"},"widgets_values":["","ComfyUI",true],"bgcolor":"#5345bf"},{"id":6,"type":"Runware Model Search","pos":[2.573117256164551,851.6474609375],"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":"d71fdad61b55ce88c15d1259ecd9407d99040f6d","Node name for S&R":"Runware Model Search"},"widgets_values":["alibaba:wan@2.7-image-pro","All","Base Model","alibaba:wan@2.7-image-pro (Wan2.7 Image Pro 2.7)",false],"bgcolor":"#5345bf"},{"id":2,"type":"Runware Image Inference","pos":[394.36859130859375,672.9642944335938],"size":[400,1058],"flags":{},"order":3,"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":4},{"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}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"STRING","links":[1]},{"localized_name":"RW-Task","name":"RW-Task","type":"RUNWARETASK","links":null}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"d71fdad61b55ce88c15d1259ecd9407d99040f6d","Node name for S&R":"Runware Image Inference"},"widgets_values":["A luxury perfume bottle on a marble surface with soft studio lighting.","",false,"Disabled","Square HD (1024x1024)",1024,1024,false,"1k",false,4,false,"Default",false,6.5,true,1176363633,"randomize",false,0,0.8,false,32,"WEBP",1,"none"],"bgcolor":"#5345bf"},{"id":5,"type":"Runware Image Inference Settings Color Palette","pos":[934.093994140625,1111.9110107421875],"size":[345.8091735839844,610],"flags":{},"order":1,"mode":0,"inputs":[{"localized_name":"use_1","name":"use_1","shape":7,"type":"BOOLEAN","widget":{"name":"use_1"},"link":null},{"localized_name":"hex_1","name":"hex_1","shape":7,"type":"STRING","widget":{"name":"hex_1"},"link":null},{"localized_name":"ratio_1","name":"ratio_1","shape":7,"type":"STRING","widget":{"name":"ratio_1"},"link":null},{"localized_name":"use_2","name":"use_2","shape":7,"type":"BOOLEAN","widget":{"name":"use_2"},"link":null},{"localized_name":"hex_2","name":"hex_2","shape":7,"type":"STRING","widget":{"name":"hex_2"},"link":null},{"localized_name":"ratio_2","name":"ratio_2","shape":7,"type":"STRING","widget":{"name":"ratio_2"},"link":null},{"localized_name":"use_3","name":"use_3","shape":7,"type":"BOOLEAN","widget":{"name":"use_3"},"link":null},{"localized_name":"hex_3","name":"hex_3","shape":7,"type":"STRING","widget":{"name":"hex_3"},"link":null},{"localized_name":"ratio_3","name":"ratio_3","shape":7,"type":"STRING","widget":{"name":"ratio_3"},"link":null},{"localized_name":"use_4","name":"use_4","shape":7,"type":"BOOLEAN","widget":{"name":"use_4"},"link":null},{"localized_name":"hex_4","name":"hex_4","shape":7,"type":"STRING","widget":{"name":"hex_4"},"link":null},{"localized_name":"ratio_4","name":"ratio_4","shape":7,"type":"STRING","widget":{"name":"ratio_4"},"link":null},{"localized_name":"use_5","name":"use_5","shape":7,"type":"BOOLEAN","widget":{"name":"use_5"},"link":null},{"localized_name":"hex_5","name":"hex_5","shape":7,"type":"STRING","widget":{"name":"hex_5"},"link":null},{"localized_name":"ratio_5","name":"ratio_5","shape":7,"type":"STRING","widget":{"name":"ratio_5"},"link":null},{"localized_name":"use_6","name":"use_6","shape":7,"type":"BOOLEAN","widget":{"name":"use_6"},"link":null},{"localized_name":"hex_6","name":"hex_6","shape":7,"type":"STRING","widget":{"name":"hex_6"},"link":null},{"localized_name":"ratio_6","name":"ratio_6","shape":7,"type":"STRING","widget":{"name":"ratio_6"},"link":null},{"localized_name":"use_7","name":"use_7","shape":7,"type":"BOOLEAN","widget":{"name":"use_7"},"link":null},{"localized_name":"hex_7","name":"hex_7","shape":7,"type":"STRING","widget":{"name":"hex_7"},"link":null},{"localized_name":"ratio_7","name":"ratio_7","shape":7,"type":"STRING","widget":{"name":"ratio_7"},"link":null},{"localized_name":"use_8","name":"use_8","shape":7,"type":"BOOLEAN","widget":{"name":"use_8"},"link":null},{"localized_name":"hex_8","name":"hex_8","shape":7,"type":"STRING","widget":{"name":"hex_8"},"link":null},{"localized_name":"ratio_8","name":"ratio_8","shape":7,"type":"STRING","widget":{"name":"ratio_8"},"link":null}],"outputs":[{"localized_name":"colorPalette","name":"colorPalette","type":"RUNWAREIMAGEINFERENCECOLORPALETTE","links":[2]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"d71fdad61b55ce88c15d1259ecd9407d99040f6d","Node name for S&R":"Runware Image Inference Settings Color Palette"},"widgets_values":[true,"#C2D1E6","25%",true,"#CDD8E9","25%",true,"#B5C8DB","25%",true,"#F0EDE8","25%","","","","","","",false,"","",false,"",""],"bgcolor":"#5345bf"},{"id":3,"type":"Runware Settings","pos":[-52.614952087402344,1082.5836181640625],"size":[400,628],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"colorPalette","name":"colorPalette","shape":7,"type":"RUNWAREIMAGEINFERENCECOLORPALETTE","link":2},{"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":"STRING","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}],"outputs":[{"localized_name":"Settings","name":"Settings","type":"RUNWARESETTINGS","links":[4]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"d71fdad61b55ce88c15d1259ecd9407d99040f6d","Node name for S&R":"Runware Settings"},"widgets_values":[false,1,false,"",false,1,false,4,false,1,false,"medium",false,false,false,"",false,"",false,false],"bgcolor":"#5345bf"}],"links":[[1,2,0,4,0,"STRING"],[2,5,0,3,0,"RUNWAREIMAGEINFERENCECOLORPALETTE"],[3,6,0,2,0,"RUNWAREMODEL"],[4,3,0,2,15,"RUNWARESETTINGS"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6830134553650705,"offset":[267.9136124324258,-559.0247231479157]}},"version":0.4} \ No newline at end of file diff --git a/workflows/Runware_Basic_Image_Upscaling_P_image.json b/workflows/Runware_Basic_Image_Upscaling_P_image.json new file mode 100644 index 0000000..77febf6 --- /dev/null +++ b/workflows/Runware_Basic_Image_Upscaling_P_image.json @@ -0,0 +1 @@ +{"id":"99bb8e7d-3e8e-42a4-90cc-c383ca9ecc3b","revision":0,"last_node_id":16,"last_link_id":21,"nodes":[{"id":16,"type":"Runware Image Upscaler Settings","pos":[-632.2396240234375,165.25344848632812],"size":[312.3335876464844,130],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"useEnhanceDetails","name":"useEnhanceDetails","shape":7,"type":"BOOLEAN","widget":{"name":"useEnhanceDetails"},"link":null},{"localized_name":"enhanceDetails","name":"enhanceDetails","shape":7,"type":"BOOLEAN","widget":{"name":"enhanceDetails"},"link":null},{"localized_name":"useRealism","name":"useRealism","shape":7,"type":"BOOLEAN","widget":{"name":"useRealism"},"link":null},{"localized_name":"realism","name":"realism","shape":7,"type":"BOOLEAN","widget":{"name":"realism"},"link":null}],"outputs":[{"localized_name":"Upscaler Settings","name":"Upscaler Settings","type":"RUNWAREIMAGEUPSCALERSETTINGS","links":[20]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"d71fdad61b55ce88c15d1259ecd9407d99040f6d","Node name for S&R":"Runware Image Upscaler Settings"},"widgets_values":[true,false,true,true],"bgcolor":"#5345bf"},{"id":15,"type":"Runware Image Upscaler","pos":[-153.0272216796875,-287.3848876953125],"size":[400,730],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"Image","name":"Image","type":"IMAGE","link":19},{"localized_name":"Accelerator","name":"Accelerator","shape":7,"type":"RUNWAREACCELERATOR","link":null},{"localized_name":"providerSettings","name":"providerSettings","shape":7,"type":"RUNWAREPROVIDERSETTINGS","link":null},{"localized_name":"imageUpscalerSettings","name":"imageUpscalerSettings","shape":7,"type":"RUNWAREIMAGEUPSCALERSETTINGS","link":20},{"localized_name":"useUpscaleFactor","name":"useUpscaleFactor","type":"BOOLEAN","widget":{"name":"useUpscaleFactor"},"link":null},{"localized_name":"upscaleFactor","name":"upscaleFactor","type":"INT","widget":{"name":"upscaleFactor"},"link":null},{"localized_name":"useTargetMegapixels","name":"useTargetMegapixels","type":"BOOLEAN","widget":{"name":"useTargetMegapixels"},"link":null},{"localized_name":"targetMegapixels","name":"targetMegapixels","type":"INT","widget":{"name":"targetMegapixels"},"link":null},{"localized_name":"model","name":"model","shape":7,"type":"STRING","widget":{"name":"model"},"link":null},{"localized_name":"useSteps","name":"useSteps","shape":7,"type":"BOOLEAN","widget":{"name":"useSteps"},"link":null},{"localized_name":"steps","name":"steps","shape":7,"type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"useSeed","name":"useSeed","shape":7,"type":"BOOLEAN","widget":{"name":"useSeed"},"link":null},{"localized_name":"seed","name":"seed","shape":7,"type":"INT","widget":{"name":"seed"},"link":null},{"localized_name":"useCFGScale","name":"useCFGScale","shape":7,"type":"BOOLEAN","widget":{"name":"useCFGScale"},"link":null},{"localized_name":"CFGScale","name":"CFGScale","shape":7,"type":"FLOAT","widget":{"name":"CFGScale"},"link":null},{"localized_name":"usePrompts","name":"usePrompts","shape":7,"type":"BOOLEAN","widget":{"name":"usePrompts"},"link":null},{"localized_name":"positivePrompt","name":"positivePrompt","shape":7,"type":"STRING","widget":{"name":"positivePrompt"},"link":null},{"localized_name":"negativePrompt","name":"negativePrompt","shape":7,"type":"STRING","widget":{"name":"negativePrompt"},"link":null},{"localized_name":"useClarityParams","name":"useClarityParams","shape":7,"type":"BOOLEAN","widget":{"name":"useClarityParams"},"link":null},{"localized_name":"controlNetWeight","name":"controlNetWeight","shape":7,"type":"FLOAT","widget":{"name":"controlNetWeight"},"link":null},{"localized_name":"strength","name":"strength","shape":7,"type":"FLOAT","widget":{"name":"strength"},"link":null},{"localized_name":"scheduler","name":"scheduler","shape":7,"type":"STRING","widget":{"name":"scheduler"},"link":null},{"localized_name":"useCCSRParams","name":"useCCSRParams","shape":7,"type":"BOOLEAN","widget":{"name":"useCCSRParams"},"link":null},{"localized_name":"colorFix","name":"colorFix","shape":7,"type":"BOOLEAN","widget":{"name":"colorFix"},"link":null},{"localized_name":"tileDiffusion","name":"tileDiffusion","shape":7,"type":"BOOLEAN","widget":{"name":"tileDiffusion"},"link":null},{"localized_name":"useLatentParams","name":"useLatentParams","shape":7,"type":"BOOLEAN","widget":{"name":"useLatentParams"},"link":null},{"localized_name":"clipSkip","name":"clipSkip","shape":7,"type":"INT","widget":{"name":"clipSkip"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"STRING","links":[21]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"d71fdad61b55ce88c15d1259ecd9407d99040f6d","Node name for S&R":"Runware Image Upscaler"},"widgets_values":[false,2,true,4,"prunaai:p-image@upscale",false,20,false,625,"randomize",false,7,false,"","",false,0.5,0.5,"DPM++ 2M Karras",false,false,false,false,0],"bgcolor":"#5345bf"},{"id":5,"type":"LoadImage","pos":[-657.9480590820312,-359.2391052246094],"size":[320.84613037109375,411.43585205078125],"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","slot_index":0,"links":[19]},{"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":["991178bc-54b4-42e2-8b54-ed14d89a2f8e.jpg","image"]},{"id":12,"type":"Runware Save Image","pos":[451.3610534667969,-266.9140319824219],"size":[494.4888916015625,625.6743774414062],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"Images","name":"Images","type":"STRING","widget":{"name":"Images"},"link":21},{"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":"91646ada844167e36188b535ff60063735d10ca3","Node name for S&R":"Runware Save Image"},"widgets_values":["","ComfyUI",true],"bgcolor":"#5345bf"}],"links":[[19,5,0,15,0,"IMAGE"],[20,16,0,15,3,"RUNWAREIMAGEUPSCALERSETTINGS"],[21,15,0,12,0,"STRING"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6936329553748826,"offset":[1166.4442641469568,491.38887719446996]}},"version":0.4} \ No newline at end of file From f5a07fe7a9e149acb549812a595ce650946815ec Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Fri, 3 Apr 2026 13:18:35 +0530 Subject: [PATCH 2/3] Added Saftey Inputs back --- clientlibs/main.js | 4 +- clientlibs/utils.js | 66 +++++++++++++++++++ modules/safetyInputs.py | 34 ++++++++-- modules/settings.py | 4 +- modules/upscaler.py | 8 +++ ...Runware_Basic_Image_Upscaling_P_image.json | 2 +- 6 files changed, 107 insertions(+), 11 deletions(-) diff --git a/clientlibs/main.js b/clientlibs/main.js index f29bca5..1aa4c22 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, 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 } from "./utils.js"; import { RUNWARE_NODE_TYPES, RUNWARE_NODE_PROPS, SEARCH_TERMS } from "./types.js"; const nodeInitList = []; @@ -135,6 +135,8 @@ app.registerExtension({ sourcefulProviderSettingsFontsToggleHandler(node); } else if(nodeClass === RUNWARE_NODE_TYPES.SETTINGS) { settingsToggleHandler(node); + } else if(nodeClass === RUNWARE_NODE_TYPES.SAFETYINPUTS) { + safetyInputsToggleHandler(node); } else if(nodeClass === RUNWARE_NODE_TYPES.IMAGEINFERENCESETTINGSCOLORPALETTE) { imageInferenceSettingsColorPaletteToggleHandler(node); } else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOINPUT) { diff --git a/clientlibs/utils.js b/clientlibs/utils.js index 8f59849..8bdeb18 100644 --- a/clientlibs/utils.js +++ b/clientlibs/utils.js @@ -4486,6 +4486,7 @@ export { syncProviderSettingsToggleHandler, syncSegmentToggleHandler, settingsToggleHandler, + safetyInputsToggleHandler, imageInferenceSettingsColorPaletteToggleHandler, audioInputToggleHandler, speechInputToggleHandler, @@ -4661,6 +4662,71 @@ function settingsToggleHandler(settingsNode) { } } +function safetyInputsToggleHandler(safetyNode) { + const useModeWidget = safetyNode.widgets.find(w => w.name === "useMode"); + const modeWidget = safetyNode.widgets.find(w => w.name === "mode"); + const useToleranceWidget = safetyNode.widgets.find(w => w.name === "useTolerance"); + const toleranceWidget = safetyNode.widgets.find(w => w.name === "tolerance"); + const useCheckInputsWidget = safetyNode.widgets.find(w => w.name === "useCheckInputs"); + const checkInputsWidget = safetyNode.widgets.find(w => w.name === "checkInputs"); + const useCheckContentWidget = safetyNode.widgets.find(w => w.name === "useCheckContent"); + const checkContentWidget = safetyNode.widgets.find(w => w.name === "checkContent"); + + 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 = safetyNode.htmlElements?.widgetsContainer || safetyNode.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"; + } + } + } + } + + safetyNode.setDirtyCanvas(true); + } + + appendWidgetCB(useWidget, () => { + setTimeout(toggleEnabled, 50); + }); + + setTimeout(toggleEnabled, 100); + } + + if (useModeWidget && modeWidget) { + toggleWidgetState(useModeWidget, modeWidget, "mode"); + } + if (useToleranceWidget && toleranceWidget) { + toggleWidgetState(useToleranceWidget, toleranceWidget, "tolerance"); + } + if (useCheckInputsWidget && checkInputsWidget) { + toggleWidgetState(useCheckInputsWidget, checkInputsWidget, "checkInputs"); + } + if (useCheckContentWidget && checkContentWidget) { + toggleWidgetState(useCheckContentWidget, checkContentWidget, "checkContent"); + } +} + function imageInferenceSettingsColorPaletteToggleHandler(paletteNode) { function applyParamState(useWidget, paramWidget, paramName) { if (!useWidget || !paramWidget) return; diff --git a/modules/safetyInputs.py b/modules/safetyInputs.py index fb2b303..5e9c54a 100644 --- a/modules/safetyInputs.py +++ b/modules/safetyInputs.py @@ -9,25 +9,41 @@ class safetyInputs: return { "required": {}, "optional": { + "useMode": ("BOOLEAN", { + "tooltip": "Enable to include mode in payload.", + "default": False, + }), "mode": (["none", "fast", "full"], { "tooltip": "Safety moderation mode: none (disable), fast (quick check), or full (comprehensive check).", "default": "none", }), + "useTolerance": ("BOOLEAN", { + "tooltip": "Enable to include tolerance in payload.", + "default": False, + }), "tolerance": ("BOOLEAN", { "tooltip": "Safety tolerance setting for content moderation.", - "default": None, + "default": False, "label_on": "Enabled", "label_off": "Disabled", }), + "useCheckInputs": ("BOOLEAN", { + "tooltip": "Enable to include checkInputs in payload.", + "default": False, + }), "checkInputs": ("BOOLEAN", { "tooltip": "Enable checking of input content for safety violations.", - "default": None, + "default": False, "label_on": "Enabled", "label_off": "Disabled", }), + "useCheckContent": ("BOOLEAN", { + "tooltip": "Enable to include checkContent in payload.", + "default": False, + }), "checkContent": ("BOOLEAN", { "tooltip": "Enable checking of generated content for safety violations.", - "default": None, + "default": False, "label_on": "Enabled", "label_off": "Disabled", }), @@ -42,20 +58,24 @@ class safetyInputs: def createSafetyInputs(self, **kwargs) -> tuple[Dict[str, Any]]: """Create safety inputs dictionary""" + useMode = kwargs.get("useMode", False) mode = kwargs.get("mode", None) + useTolerance = kwargs.get("useTolerance", False) tolerance = kwargs.get("tolerance", None) + useCheckInputs = kwargs.get("useCheckInputs", False) checkInputs = kwargs.get("checkInputs", None) + useCheckContent = kwargs.get("useCheckContent", False) checkContent = kwargs.get("checkContent", None) safetyInputs = {} - if mode is not None: + if useMode and mode is not None: safetyInputs["mode"] = mode - if tolerance is not None: + if useTolerance and tolerance is not None: safetyInputs["tolerance"] = tolerance - if checkInputs is not None: + if useCheckInputs and checkInputs is not None: safetyInputs["checkInputs"] = checkInputs - if checkContent is not None: + if useCheckContent and checkContent is not None: safetyInputs["checkContent"] = checkContent return (safetyInputs,) diff --git a/modules/settings.py b/modules/settings.py index 9b2a866..e086aab 100644 --- a/modules/settings.py +++ b/modules/settings.py @@ -139,8 +139,8 @@ class RunwareSettings: useLayers = kwargs.get("useLayers", False) useTrueCFGScale = kwargs.get("useTrueCFGScale", False) useQuality = kwargs.get("useQuality", False) - usePromptExtend = kwargs.get("usePromptExtend", True) - promptExtend = kwargs.get("promptExtend", True) + usePromptExtend = kwargs.get("usePromptExtend", False) + promptExtend = kwargs.get("promptExtend", False) useEditRegions = kwargs.get("useEditRegions", False) useThinking = kwargs.get("useThinking", False) useSequential = kwargs.get("useSequential", False) diff --git a/modules/upscaler.py b/modules/upscaler.py index ee58f98..c288b5d 100644 --- a/modules/upscaler.py +++ b/modules/upscaler.py @@ -132,6 +132,9 @@ class upscaler: "min": 0, "max": 2, }), + "safetyInputs": ("RUNWARESAFETYINPUTS", { + "tooltip": "Deprecated compatibility socket. Accepted for old workflows but ignored by this node.", + }), "Accelerator": ("RUNWAREACCELERATOR", { "tooltip": "Connect a Runware Accelerator Options Node to configure caching and acceleration settings.", }), @@ -176,6 +179,7 @@ class upscaler: colorFix = kwargs.get("colorFix", False) tileDiffusion = kwargs.get("tileDiffusion", False) clipSkip = kwargs.get("clipSkip", 0) + safetyInputs = kwargs.get("safetyInputs", None) runwareAccelerator = kwargs.get("Accelerator", None) providerSettings = kwargs.get("providerSettings", None) imageUpscalerSettingsBundle = kwargs.get("imageUpscalerSettings", None) @@ -243,6 +247,10 @@ class upscaler: # Add settings to config if any settings were specified if settings: genConfig["settings"] = settings + + # Add safety inputs if provided + if safetyInputs is not None and isinstance(safetyInputs, dict) and len(safetyInputs) > 0: + genConfig["safety"] = safetyInputs # Add accelerator options if provided if runwareAccelerator is not None and isinstance(runwareAccelerator, dict) and len(runwareAccelerator) > 0: diff --git a/workflows/Runware_Basic_Image_Upscaling_P_image.json b/workflows/Runware_Basic_Image_Upscaling_P_image.json index 77febf6..9cb9e74 100644 --- a/workflows/Runware_Basic_Image_Upscaling_P_image.json +++ b/workflows/Runware_Basic_Image_Upscaling_P_image.json @@ -1 +1 @@ -{"id":"99bb8e7d-3e8e-42a4-90cc-c383ca9ecc3b","revision":0,"last_node_id":16,"last_link_id":21,"nodes":[{"id":16,"type":"Runware Image Upscaler Settings","pos":[-632.2396240234375,165.25344848632812],"size":[312.3335876464844,130],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"useEnhanceDetails","name":"useEnhanceDetails","shape":7,"type":"BOOLEAN","widget":{"name":"useEnhanceDetails"},"link":null},{"localized_name":"enhanceDetails","name":"enhanceDetails","shape":7,"type":"BOOLEAN","widget":{"name":"enhanceDetails"},"link":null},{"localized_name":"useRealism","name":"useRealism","shape":7,"type":"BOOLEAN","widget":{"name":"useRealism"},"link":null},{"localized_name":"realism","name":"realism","shape":7,"type":"BOOLEAN","widget":{"name":"realism"},"link":null}],"outputs":[{"localized_name":"Upscaler Settings","name":"Upscaler Settings","type":"RUNWAREIMAGEUPSCALERSETTINGS","links":[20]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"d71fdad61b55ce88c15d1259ecd9407d99040f6d","Node name for S&R":"Runware Image Upscaler Settings"},"widgets_values":[true,false,true,true],"bgcolor":"#5345bf"},{"id":15,"type":"Runware Image Upscaler","pos":[-153.0272216796875,-287.3848876953125],"size":[400,730],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"Image","name":"Image","type":"IMAGE","link":19},{"localized_name":"Accelerator","name":"Accelerator","shape":7,"type":"RUNWAREACCELERATOR","link":null},{"localized_name":"providerSettings","name":"providerSettings","shape":7,"type":"RUNWAREPROVIDERSETTINGS","link":null},{"localized_name":"imageUpscalerSettings","name":"imageUpscalerSettings","shape":7,"type":"RUNWAREIMAGEUPSCALERSETTINGS","link":20},{"localized_name":"useUpscaleFactor","name":"useUpscaleFactor","type":"BOOLEAN","widget":{"name":"useUpscaleFactor"},"link":null},{"localized_name":"upscaleFactor","name":"upscaleFactor","type":"INT","widget":{"name":"upscaleFactor"},"link":null},{"localized_name":"useTargetMegapixels","name":"useTargetMegapixels","type":"BOOLEAN","widget":{"name":"useTargetMegapixels"},"link":null},{"localized_name":"targetMegapixels","name":"targetMegapixels","type":"INT","widget":{"name":"targetMegapixels"},"link":null},{"localized_name":"model","name":"model","shape":7,"type":"STRING","widget":{"name":"model"},"link":null},{"localized_name":"useSteps","name":"useSteps","shape":7,"type":"BOOLEAN","widget":{"name":"useSteps"},"link":null},{"localized_name":"steps","name":"steps","shape":7,"type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"useSeed","name":"useSeed","shape":7,"type":"BOOLEAN","widget":{"name":"useSeed"},"link":null},{"localized_name":"seed","name":"seed","shape":7,"type":"INT","widget":{"name":"seed"},"link":null},{"localized_name":"useCFGScale","name":"useCFGScale","shape":7,"type":"BOOLEAN","widget":{"name":"useCFGScale"},"link":null},{"localized_name":"CFGScale","name":"CFGScale","shape":7,"type":"FLOAT","widget":{"name":"CFGScale"},"link":null},{"localized_name":"usePrompts","name":"usePrompts","shape":7,"type":"BOOLEAN","widget":{"name":"usePrompts"},"link":null},{"localized_name":"positivePrompt","name":"positivePrompt","shape":7,"type":"STRING","widget":{"name":"positivePrompt"},"link":null},{"localized_name":"negativePrompt","name":"negativePrompt","shape":7,"type":"STRING","widget":{"name":"negativePrompt"},"link":null},{"localized_name":"useClarityParams","name":"useClarityParams","shape":7,"type":"BOOLEAN","widget":{"name":"useClarityParams"},"link":null},{"localized_name":"controlNetWeight","name":"controlNetWeight","shape":7,"type":"FLOAT","widget":{"name":"controlNetWeight"},"link":null},{"localized_name":"strength","name":"strength","shape":7,"type":"FLOAT","widget":{"name":"strength"},"link":null},{"localized_name":"scheduler","name":"scheduler","shape":7,"type":"STRING","widget":{"name":"scheduler"},"link":null},{"localized_name":"useCCSRParams","name":"useCCSRParams","shape":7,"type":"BOOLEAN","widget":{"name":"useCCSRParams"},"link":null},{"localized_name":"colorFix","name":"colorFix","shape":7,"type":"BOOLEAN","widget":{"name":"colorFix"},"link":null},{"localized_name":"tileDiffusion","name":"tileDiffusion","shape":7,"type":"BOOLEAN","widget":{"name":"tileDiffusion"},"link":null},{"localized_name":"useLatentParams","name":"useLatentParams","shape":7,"type":"BOOLEAN","widget":{"name":"useLatentParams"},"link":null},{"localized_name":"clipSkip","name":"clipSkip","shape":7,"type":"INT","widget":{"name":"clipSkip"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"STRING","links":[21]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"d71fdad61b55ce88c15d1259ecd9407d99040f6d","Node name for S&R":"Runware Image Upscaler"},"widgets_values":[false,2,true,4,"prunaai:p-image@upscale",false,20,false,625,"randomize",false,7,false,"","",false,0.5,0.5,"DPM++ 2M Karras",false,false,false,false,0],"bgcolor":"#5345bf"},{"id":5,"type":"LoadImage","pos":[-657.9480590820312,-359.2391052246094],"size":[320.84613037109375,411.43585205078125],"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","slot_index":0,"links":[19]},{"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":["991178bc-54b4-42e2-8b54-ed14d89a2f8e.jpg","image"]},{"id":12,"type":"Runware Save Image","pos":[451.3610534667969,-266.9140319824219],"size":[494.4888916015625,625.6743774414062],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"Images","name":"Images","type":"STRING","widget":{"name":"Images"},"link":21},{"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":"91646ada844167e36188b535ff60063735d10ca3","Node name for S&R":"Runware Save Image"},"widgets_values":["","ComfyUI",true],"bgcolor":"#5345bf"}],"links":[[19,5,0,15,0,"IMAGE"],[20,16,0,15,3,"RUNWAREIMAGEUPSCALERSETTINGS"],[21,15,0,12,0,"STRING"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6936329553748826,"offset":[1166.4442641469568,491.38887719446996]}},"version":0.4} \ No newline at end of file +{"id":"99bb8e7d-3e8e-42a4-90cc-c383ca9ecc3b","revision":0,"last_node_id":17,"last_link_id":22,"nodes":[{"id":16,"type":"Runware Image Upscaler Settings","pos":[-632.2396240234375,165.25344848632812],"size":[312.3335876464844,130],"flags":{},"order":0,"mode":0,"inputs":[{"localized_name":"useEnhanceDetails","name":"useEnhanceDetails","shape":7,"type":"BOOLEAN","widget":{"name":"useEnhanceDetails"},"link":null},{"localized_name":"enhanceDetails","name":"enhanceDetails","shape":7,"type":"BOOLEAN","widget":{"name":"enhanceDetails"},"link":null},{"localized_name":"useRealism","name":"useRealism","shape":7,"type":"BOOLEAN","widget":{"name":"useRealism"},"link":null},{"localized_name":"realism","name":"realism","shape":7,"type":"BOOLEAN","widget":{"name":"realism"},"link":null}],"outputs":[{"localized_name":"Upscaler Settings","name":"Upscaler Settings","type":"RUNWAREIMAGEUPSCALERSETTINGS","links":[20]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"d71fdad61b55ce88c15d1259ecd9407d99040f6d","Node name for S&R":"Runware Image Upscaler Settings"},"widgets_values":[true,false,true,true],"bgcolor":"#5345bf"},{"id":15,"type":"Runware Image Upscaler","pos":[-153.0272216796875,-287.3848876953125],"size":[400,750],"flags":{},"order":3,"mode":0,"inputs":[{"localized_name":"Image","name":"Image","type":"IMAGE","link":19},{"localized_name":"safetyInputs","name":"safetyInputs","shape":7,"type":"RUNWARESAFETYINPUTS","link":22},{"localized_name":"Accelerator","name":"Accelerator","shape":7,"type":"RUNWAREACCELERATOR","link":null},{"localized_name":"providerSettings","name":"providerSettings","shape":7,"type":"RUNWAREPROVIDERSETTINGS","link":null},{"localized_name":"imageUpscalerSettings","name":"imageUpscalerSettings","shape":7,"type":"RUNWAREIMAGEUPSCALERSETTINGS","link":20},{"localized_name":"useUpscaleFactor","name":"useUpscaleFactor","type":"BOOLEAN","widget":{"name":"useUpscaleFactor"},"link":null},{"localized_name":"upscaleFactor","name":"upscaleFactor","type":"INT","widget":{"name":"upscaleFactor"},"link":null},{"localized_name":"useTargetMegapixels","name":"useTargetMegapixels","type":"BOOLEAN","widget":{"name":"useTargetMegapixels"},"link":null},{"localized_name":"targetMegapixels","name":"targetMegapixels","type":"INT","widget":{"name":"targetMegapixels"},"link":null},{"localized_name":"model","name":"model","shape":7,"type":"STRING","widget":{"name":"model"},"link":null},{"localized_name":"useSteps","name":"useSteps","shape":7,"type":"BOOLEAN","widget":{"name":"useSteps"},"link":null},{"localized_name":"steps","name":"steps","shape":7,"type":"INT","widget":{"name":"steps"},"link":null},{"localized_name":"useSeed","name":"useSeed","shape":7,"type":"BOOLEAN","widget":{"name":"useSeed"},"link":null},{"localized_name":"seed","name":"seed","shape":7,"type":"INT","widget":{"name":"seed"},"link":null},{"localized_name":"useCFGScale","name":"useCFGScale","shape":7,"type":"BOOLEAN","widget":{"name":"useCFGScale"},"link":null},{"localized_name":"CFGScale","name":"CFGScale","shape":7,"type":"FLOAT","widget":{"name":"CFGScale"},"link":null},{"localized_name":"usePrompts","name":"usePrompts","shape":7,"type":"BOOLEAN","widget":{"name":"usePrompts"},"link":null},{"localized_name":"positivePrompt","name":"positivePrompt","shape":7,"type":"STRING","widget":{"name":"positivePrompt"},"link":null},{"localized_name":"negativePrompt","name":"negativePrompt","shape":7,"type":"STRING","widget":{"name":"negativePrompt"},"link":null},{"localized_name":"useClarityParams","name":"useClarityParams","shape":7,"type":"BOOLEAN","widget":{"name":"useClarityParams"},"link":null},{"localized_name":"controlNetWeight","name":"controlNetWeight","shape":7,"type":"FLOAT","widget":{"name":"controlNetWeight"},"link":null},{"localized_name":"strength","name":"strength","shape":7,"type":"FLOAT","widget":{"name":"strength"},"link":null},{"localized_name":"scheduler","name":"scheduler","shape":7,"type":"STRING","widget":{"name":"scheduler"},"link":null},{"localized_name":"useCCSRParams","name":"useCCSRParams","shape":7,"type":"BOOLEAN","widget":{"name":"useCCSRParams"},"link":null},{"localized_name":"colorFix","name":"colorFix","shape":7,"type":"BOOLEAN","widget":{"name":"colorFix"},"link":null},{"localized_name":"tileDiffusion","name":"tileDiffusion","shape":7,"type":"BOOLEAN","widget":{"name":"tileDiffusion"},"link":null},{"localized_name":"useLatentParams","name":"useLatentParams","shape":7,"type":"BOOLEAN","widget":{"name":"useLatentParams"},"link":null},{"localized_name":"clipSkip","name":"clipSkip","shape":7,"type":"INT","widget":{"name":"clipSkip"},"link":null}],"outputs":[{"localized_name":"IMAGE","name":"IMAGE","type":"STRING","links":[21]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"d71fdad61b55ce88c15d1259ecd9407d99040f6d","Node name for S&R":"Runware Image Upscaler"},"widgets_values":[false,2,true,4,"prunaai:p-image@upscale",false,20,false,1330,"randomize",false,7,false,"","",false,0.5,0.5,"DPM++ 2M Karras",false,false,false,false,0],"bgcolor":"#5345bf"},{"id":5,"type":"LoadImage","pos":[-657.9480590820312,-359.2391052246094],"size":[320.84613037109375,411.43585205078125],"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","slot_index":0,"links":[19]},{"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":["991178bc-54b4-42e2-8b54-ed14d89a2f8e.jpg","image"]},{"id":12,"type":"Runware Save Image","pos":[451.3610534667969,-266.9140319824219],"size":[494.4888916015625,625.6743774414062],"flags":{},"order":4,"mode":0,"inputs":[{"localized_name":"Images","name":"Images","type":"STRING","widget":{"name":"Images"},"link":21},{"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":"91646ada844167e36188b535ff60063735d10ca3","Node name for S&R":"Runware Save Image"},"widgets_values":["","ComfyUI",true],"bgcolor":"#5345bf"},{"id":17,"type":"Runware Safety Inputs","pos":[-589.0030517578125,376.23358154296875],"size":[270,226],"flags":{},"order":2,"mode":0,"inputs":[{"localized_name":"useMode","name":"useMode","shape":7,"type":"BOOLEAN","widget":{"name":"useMode"},"link":null},{"localized_name":"mode","name":"mode","shape":7,"type":"COMBO","widget":{"name":"mode"},"link":null},{"localized_name":"useTolerance","name":"useTolerance","shape":7,"type":"BOOLEAN","widget":{"name":"useTolerance"},"link":null},{"localized_name":"tolerance","name":"tolerance","shape":7,"type":"BOOLEAN","widget":{"name":"tolerance"},"link":null},{"localized_name":"useCheckInputs","name":"useCheckInputs","shape":7,"type":"BOOLEAN","widget":{"name":"useCheckInputs"},"link":null},{"localized_name":"checkInputs","name":"checkInputs","shape":7,"type":"BOOLEAN","widget":{"name":"checkInputs"},"link":null},{"localized_name":"useCheckContent","name":"useCheckContent","shape":7,"type":"BOOLEAN","widget":{"name":"useCheckContent"},"link":null},{"localized_name":"checkContent","name":"checkContent","shape":7,"type":"BOOLEAN","widget":{"name":"checkContent"},"link":null}],"outputs":[{"localized_name":"Safety Inputs","name":"Safety Inputs","type":"RUNWARESAFETYINPUTS","links":[22]}],"properties":{"cnr_id":"ComfyUI-Runware","ver":"2ab6eccb4e5882be84b84130d5f70ffedf7ff0c0","Node name for S&R":"Runware Safety Inputs"},"widgets_values":[false,"none",false,true,false,false,true,true],"bgcolor":"#5345bf"}],"links":[[19,5,0,15,0,"IMAGE"],[20,16,0,15,4,"RUNWAREIMAGEUPSCALERSETTINGS"],[21,15,0,12,0,"STRING"],[22,17,0,15,1,"RUNWARESAFETYINPUTS"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6936329553748826,"offset":[1166.2260403928415,491.38887719446996]}},"version":0.4} \ No newline at end of file From bf832e4cde775b5d350070d2a4fb76b08826c8eb Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Fri, 3 Apr 2026 13:57:24 +0530 Subject: [PATCH 3/3] Removed unwaneted funcs --- modules/imageInferenceSettingsColorPalette.py | 11 ++--------- modules/upscaler.py | 2 +- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/modules/imageInferenceSettingsColorPalette.py b/modules/imageInferenceSettingsColorPalette.py index 927fc58..753c3ef 100644 --- a/modules/imageInferenceSettingsColorPalette.py +++ b/modules/imageInferenceSettingsColorPalette.py @@ -6,13 +6,6 @@ Builds settings.colorPalette: list of { "hex": "#...", "ratio": "NN.NN%" } for R from typing import Any, Dict, List, Tuple -def _normalize_hex(raw: str) -> str: - h = raw.strip() - if not h: - return "" - return h if h.startswith("#") else f"#{h}" - - class RunwareImageInferenceSettingsColorPalette: """Up to 8 hex/ratio pairs; each slot is included only when use_{i} is enabled.""" @@ -52,8 +45,8 @@ class RunwareImageInferenceSettingsColorPalette: for i in range(1, self._SLOTS + 1): if not kwargs.get(f"use_{i}", False): continue - hx = _normalize_hex(str(kwargs.get(f"hex_{i}") or "")) - if not hx or hx == "#": + hx = str(kwargs.get(f"hex_{i}") or "").strip() + if not hx: raise ValueError( f"use_{i} is enabled but hex_{i} is empty or invalid. " "Provide a hex color (e.g. #C2D1E6) or disable this swatch." diff --git a/modules/upscaler.py b/modules/upscaler.py index c288b5d..ca23b47 100644 --- a/modules/upscaler.py +++ b/modules/upscaler.py @@ -133,7 +133,7 @@ class upscaler: "max": 2, }), "safetyInputs": ("RUNWARESAFETYINPUTS", { - "tooltip": "Deprecated compatibility socket. Accepted for old workflows but ignored by this node.", + "tooltip": "Connect Runware Safety Inputs node to include safety settings in the upscale request.", }), "Accelerator": ("RUNWAREACCELERATOR", { "tooltip": "Connect a Runware Accelerator Options Node to configure caching and acceleration settings.",