From c17d46d70b6d526301a3e03f87e3970994c6e4d9 Mon Sep 17 00:00:00 2001 From: Sirshendu Ganguly Date: Wed, 11 Mar 2026 21:11:52 -0400 Subject: [PATCH] Added hiresfix and layerDiffuse --- __init__.py | 2 + clientlibs/main.js | 4 +- clientlibs/types.js | 5 ++ clientlibs/utils.js | 37 ++++++++++++ modules/imageInference.py | 8 +++ modules/imageInferenceAdvancedFeatures.py | 69 +++++++++++++++++++++++ 6 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 modules/imageInferenceAdvancedFeatures.py diff --git a/__init__.py b/__init__.py index 2ba9aac..f4f65d0 100644 --- a/__init__.py +++ b/__init__.py @@ -25,6 +25,7 @@ from .modules.ipAdapterCombine import ipAdapterCombine from .modules.vaeSearch import vaeSearch from .modules.referenceImages import referenceImages from .modules.imageInferenceInputs import imageInferenceInputs +from .modules.imageInferenceAdvancedFeatures import RunwareImageInferenceAdvancedFeatures from .modules.videoInference import txt2vid from .modules.videoModelSearch import videoModelSearch from .modules.videoSettings import RunwareVideoSettings @@ -132,6 +133,7 @@ NODE_CLASS_MAPPINGS = { "Runware IPAdapters Combine": ipAdapterCombine, "Runware Reference Images": referenceImages, "Runware Image Inference Inputs": imageInferenceInputs, + "Runware Image Inference Advanced Features": RunwareImageInferenceAdvancedFeatures, "Runware Video Inference": txt2vid, "Runware Video Model Search": videoModelSearch, "Runware Frame Images": RunwareFrameImages, diff --git a/clientlibs/main.js b/clientlibs/main.js index 6a8d6a1..a2480f5 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, mediaUUIDHandler, save3DFilepathHandler, videoTranscriptionHandler, videoOutputsHandler, handleCustomErrors, videoInferenceDimensionsHandler, videoModelSearchFilterHandler, audioModelSearchFilterHandler, vectorizeModelSearchFilterHandler, vectorizeToggleHandler, useParameterToggleHandler, imageInferenceToggleHandler, upscalerToggleHandler, videoUpscalerToggleHandler, audioInferenceToggleHandler, audioInferenceSpeechToggleHandler, audioSettingsToggleHandler, 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, mediaUUIDHandler, save3DFilepathHandler, videoTranscriptionHandler, videoOutputsHandler, handleCustomErrors, videoInferenceDimensionsHandler, videoModelSearchFilterHandler, audioModelSearchFilterHandler, vectorizeModelSearchFilterHandler, vectorizeToggleHandler, useParameterToggleHandler, imageInferenceToggleHandler, imageInferenceAdvancedFeaturesToggleHandler, upscalerToggleHandler, videoUpscalerToggleHandler, audioInferenceToggleHandler, audioInferenceSpeechToggleHandler, audioSettingsToggleHandler, 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 { RUNWARE_NODE_TYPES, RUNWARE_NODE_PROPS, SEARCH_TERMS } from "./types.js"; const nodeInitList = []; @@ -78,6 +78,8 @@ app.registerExtension({ videoUpscalerToggleHandler(node); } else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOINFERENCE) { audioInferenceToggleHandler(node); + } else if(nodeClass === RUNWARE_NODE_TYPES.IMAGEINFERENCEADVANCEDFEATURES) { + imageInferenceAdvancedFeaturesToggleHandler(node); } else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOINFERENCESPEECH) { audioInferenceSpeechToggleHandler(node); } else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOSETTINGS) { diff --git a/clientlibs/types.js b/clientlibs/types.js index c31fb86..7c5c2d8 100644 --- a/clientlibs/types.js +++ b/clientlibs/types.js @@ -75,6 +75,7 @@ const RUNWARE_NODE_TYPES = { VAE: "Runware VAE Search", REFERENCEIMAGES: "Runware Reference Images", IMAGEINFERENCEINPUTS: "Runware Image Inference Inputs", + IMAGEINFERENCEADVANCEDFEATURES: "Runware Image Inference Advanced Features", VIDEOINFERENCE: "Runware Video Inference", VIDEOMODELSEARCH: "Runware Video Model Search", FRAMEIMAGES: "Runware Frame Images", @@ -288,6 +289,10 @@ const RUNWARE_NODE_PROPS = { bgColor: DEFAULT_BGCOLOR, colorModeOnly: true, }, + [RUNWARE_NODE_TYPES.IMAGEINFERENCEADVANCEDFEATURES]: { + bgColor: DEFAULT_BGCOLOR, + colorModeOnly: true, + }, [RUNWARE_NODE_TYPES.PIXVERSEPROVIDERSETTINGS]: { bgColor: DEFAULT_BGCOLOR, colorModeOnly: true, diff --git a/clientlibs/utils.js b/clientlibs/utils.js index de4d09a..d4428e2 100644 --- a/clientlibs/utils.js +++ b/clientlibs/utils.js @@ -3835,6 +3835,42 @@ function videoAdvancedFeatureInputsToggleHandler(advancedFeatureNode) { } } +function imageInferenceAdvancedFeaturesToggleHandler(advancedFeaturesNode) { + 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 && paramName) { + const nodeElement = advancedFeaturesNode.htmlElements?.widgetsContainer || advancedFeaturesNode.htmlElements; + if (nodeElement) { + const input = nodeElement.querySelector(`input[name="${paramName}"], select[name="${paramName}"]`); + if (input) { + input.disabled = !enabled; + input.style.opacity = enabled ? "1" : "0.5"; + input.style.cursor = enabled ? "text" : "not-allowed"; + } + } + } + advancedFeaturesNode.setDirtyCanvas(true); + } + appendWidgetCB(useWidget, () => setTimeout(toggleEnabled, 50)); + setTimeout(toggleEnabled, 100); + } + const useLayerDiffuseWidget = advancedFeaturesNode.widgets.find(w => w.name === "useLayerDiffuse"); + const layerDiffuseWidget = advancedFeaturesNode.widgets.find(w => w.name === "layerDiffuse"); + if (useLayerDiffuseWidget && layerDiffuseWidget) toggleWidgetState(useLayerDiffuseWidget, layerDiffuseWidget, "layerDiffuse"); + const useHiresFixWidget = advancedFeaturesNode.widgets.find(w => w.name === "useHiresFix"); + const hiresFixWidget = advancedFeaturesNode.widgets.find(w => w.name === "hiresFix"); + if (useHiresFixWidget && hiresFixWidget) toggleWidgetState(useHiresFixWidget, hiresFixWidget, "hiresFix"); +} + function audioInferenceInputsToggleHandler(audioInputsNode) { // Find widgets const useVideoWidget = audioInputsNode.widgets.find(w => w.name === "useVideo"); @@ -3953,6 +3989,7 @@ export { vectorizeToggleHandler, useParameterToggleHandler, imageInferenceToggleHandler, + imageInferenceAdvancedFeaturesToggleHandler, upscalerToggleHandler, videoUpscalerToggleHandler, audioInferenceToggleHandler, diff --git a/modules/imageInference.py b/modules/imageInference.py index 72f9303..117d9fe 100644 --- a/modules/imageInference.py +++ b/modules/imageInference.py @@ -194,6 +194,9 @@ class txt2img: "ultralytics": ("RUNWAREULTRALYTICSINPUTS", { "tooltip": "Connect Runware Image Inference Ultralytics node to configure Ultralytics parameters (maskBlur, maskPadding, confidence, prompts, steps, CFGScale, strength).", }), + "advancedFeatures": ("RUNWAREIMAGEINFERENCEADVANCEDFEATURES", { + "tooltip": "Connect Runware Image Inference Advanced Features for layerDiffuse (transparency) and hiresFix (two-stage high-res).", + }), } } @@ -237,6 +240,7 @@ class txt2img: safetyInputs = kwargs.get("safetyInputs", None) settings = kwargs.get("settings", None) ultralytics = kwargs.get("ultralytics", None) + advanced_features = kwargs.get("advancedFeatures", None) seedImage = kwargs.get("seedImage", None) seedImageStrength = kwargs.get("strength", 0.8) maskImage = kwargs.get("maskImage", None) @@ -402,6 +406,10 @@ class txt2img: if ultralytics is not None and isinstance(ultralytics, dict) and len(ultralytics) > 0: genConfig[0]["ultralytics"] = ultralytics + # Add advancedFeatures if provided (layerDiffuse, hiresFix, etc.) + if advanced_features is not None and isinstance(advanced_features, dict) and len(advanced_features) > 0: + genConfig[0]["advancedFeatures"] = advanced_features + if (multiInferenceMode): return (None, genConfig) else: diff --git a/modules/imageInferenceAdvancedFeatures.py b/modules/imageInferenceAdvancedFeatures.py new file mode 100644 index 0000000..fd81ba5 --- /dev/null +++ b/modules/imageInferenceAdvancedFeatures.py @@ -0,0 +1,69 @@ +""" +Runware Image Inference Advanced Features Node +Provides advancedFeatures (layerDiffuse, hiresFix) for Runware Image Inference. +""" + +from typing import Dict, Any + + +class RunwareImageInferenceAdvancedFeatures: + """Runware Image Inference Advanced Features Node""" + + @classmethod + def INPUT_TYPES(cls): + return { + "required": {}, + "optional": { + "useLayerDiffuse": ("BOOLEAN", { + "tooltip": "Enable to include layerDiffuse in advancedFeatures. When enabled, LayerDiffuse generates images with transparency (alpha) without post-processing background removal.", + "default": False, + }), + "layerDiffuse": ("BOOLEAN", { + "tooltip": "Enable LayerDiffuse technology for direct generation of images with transparency (alpha channels). Only used when 'Use Layer Diffuse' is enabled.", + "default": False, + "label_on": "true", + "label_off": "false", + }), + "useHiresFix": ("BOOLEAN", { + "tooltip": "Enable to include hiresFix in advancedFeatures. When enabled, uses a two-stage process for higher-resolution, higher-detail images.", + "default": False, + }), + "hiresFix": ("BOOLEAN", { + "tooltip": "Enable a two-stage generation: first at native resolution, then upscale and refine in a second pass. Only used when 'Use Hires Fix' is enabled.", + "default": False, + "label_on": "true", + "label_off": "false", + }), + } + } + + RETURN_TYPES = ("RUNWAREIMAGEINFERENCEADVANCEDFEATURES",) + RETURN_NAMES = ("advancedFeatures",) + FUNCTION = "createAdvancedFeatures" + CATEGORY = "Runware" + DESCRIPTION = "Configure advanced features for Runware Image Inference (layerDiffuse for transparency, hiresFix for two-stage high-res generation). Connect to Runware Image Inference advancedFeatures input." + + def createAdvancedFeatures(self, **kwargs) -> tuple: + """Build advancedFeatures dict for the API.""" + use_layer_diffuse = kwargs.get("useLayerDiffuse", False) + layer_diffuse = kwargs.get("layerDiffuse", False) + use_hires_fix = kwargs.get("useHiresFix", False) + hires_fix = kwargs.get("hiresFix", False) + + advanced_features: Dict[str, Any] = {} + + if use_layer_diffuse: + advanced_features["layerDiffuse"] = bool(layer_diffuse) + if use_hires_fix: + advanced_features["hiresFix"] = bool(hires_fix) + + return (advanced_features,) + + +NODE_CLASS_MAPPINGS = { + "RunwareImageInferenceAdvancedFeatures": RunwareImageInferenceAdvancedFeatures, +} + +NODE_DISPLAY_NAME_MAPPINGS = { + "RunwareImageInferenceAdvancedFeatures": "Runware Image Inference Advanced Features", +}