Merge pull request #148 from Runware/feature-FluxUpdate

Added support for Flux outpaint
This commit is contained in:
Sirshendu Ganguly
2026-05-21 22:11:39 +05:30
committed by GitHub
8 changed files with 131 additions and 26 deletions
+3 -1
View File
@@ -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, videoInferenceSettingsTtsToggleHandler, videoInferenceSettingsActiveSpeakerDetectionToggleHandler, videoInferenceSettingsActiveSpeakerBoundingBoxesToggleHandler, videoInferenceSettingsSegmentsToggleHandler, acceleratorOptionsToggleHandler, bytedanceProviderSettingsToggleHandler, xaiProviderSettingsToggleHandler, viduProviderSettingsToggleHandler, sourcefulProviderSettingsToggleHandler, sourcefulProviderSettingsFontsToggleHandler, threeDInferenceToggleHandler, threeDInferenceSettingsToggleHandler, threeDInferenceSettingsLatToggleHandler, ultralyticsProviderSettingsToggleHandler, openaiProviderSettingsToggleHandler, lightricksProviderSettingsToggleHandler, klingProviderSettingsToggleHandler, lumaProviderSettingsToggleHandler, briaProviderSettingsToggleHandler, pixverseProviderSettingsToggleHandler, alibabaProviderSettingsToggleHandler, mireloProviderSettingsToggleHandler, googleProviderSettingsToggleHandler, syncProviderSettingsToggleHandler, syncSegmentToggleHandler, settingsToggleHandler, safetyInputsToggleHandler, imageInferenceSettingsColorPaletteToggleHandler, audioInputToggleHandler, speechInputToggleHandler, briaProviderMaskToggleHandler, wanAnimateAdvancedFeatureSettingsToggleHandler, videoAdvancedFeatureInputsToggleHandler, audioInferenceInputsToggleHandler, audioInferenceSpeechVoicesToggleHandler, referenceVideosToggleHandler } 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, videoInferenceSettingsTtsToggleHandler, videoInferenceSettingsActiveSpeakerDetectionToggleHandler, videoInferenceSettingsActiveSpeakerBoundingBoxesToggleHandler, videoInferenceSettingsSegmentsToggleHandler, acceleratorOptionsToggleHandler, bytedanceProviderSettingsToggleHandler, xaiProviderSettingsToggleHandler, viduProviderSettingsToggleHandler, sourcefulProviderSettingsToggleHandler, sourcefulProviderSettingsFontsToggleHandler, threeDInferenceToggleHandler, threeDInferenceSettingsToggleHandler, threeDInferenceSettingsLatToggleHandler, ultralyticsProviderSettingsToggleHandler, openaiProviderSettingsToggleHandler, lightricksProviderSettingsToggleHandler, klingProviderSettingsToggleHandler, lumaProviderSettingsToggleHandler, briaProviderSettingsToggleHandler, pixverseProviderSettingsToggleHandler, alibabaProviderSettingsToggleHandler, mireloProviderSettingsToggleHandler, googleProviderSettingsToggleHandler, syncProviderSettingsToggleHandler, syncSegmentToggleHandler, settingsToggleHandler, outpaintSettingsToggleHandler, safetyInputsToggleHandler, imageInferenceSettingsColorPaletteToggleHandler, audioInputToggleHandler, speechInputToggleHandler, briaProviderMaskToggleHandler, wanAnimateAdvancedFeatureSettingsToggleHandler, videoAdvancedFeatureInputsToggleHandler, audioInferenceInputsToggleHandler, audioInferenceSpeechVoicesToggleHandler, referenceVideosToggleHandler } from "./utils.js";
import { RUNWARE_NODE_TYPES, RUNWARE_NODE_PROPS, SEARCH_TERMS } from "./types.js";
const nodeInitList = [];
@@ -145,6 +145,8 @@ app.registerExtension({
sourcefulProviderSettingsFontsToggleHandler(node);
} else if(nodeClass === RUNWARE_NODE_TYPES.SETTINGS) {
settingsToggleHandler(node);
} else if(nodeClass === RUNWARE_NODE_TYPES.OUTPAINT) {
outpaintSettingsToggleHandler(node);
} else if(nodeClass === RUNWARE_NODE_TYPES.SAFETYINPUTS) {
safetyInputsToggleHandler(node);
} else if(nodeClass === RUNWARE_NODE_TYPES.IMAGEINFERENCESETTINGSCOLORPALETTE) {
+68
View File
@@ -5042,6 +5042,7 @@ export {
syncProviderSettingsToggleHandler,
syncSegmentToggleHandler,
settingsToggleHandler,
outpaintSettingsToggleHandler,
safetyInputsToggleHandler,
imageInferenceSettingsColorPaletteToggleHandler,
audioInputToggleHandler,
@@ -5156,6 +5157,8 @@ function settingsToggleHandler(settingsNode) {
const renderingSpeedWidget = settingsNode.widgets.find(w => w.name === "renderingSpeed");
const useMagicPromptWidget = settingsNode.widgets.find(w => w.name === "useMagicPrompt");
const magicPromptWidget = settingsNode.widgets.find(w => w.name === "magicPrompt");
const useAutoCropWidget = settingsNode.widgets.find(w => w.name === "useAutoCrop");
const autoCropWidget = settingsNode.widgets.find(w => w.name === "autoCrop");
// Helper function to toggle widget enabled state
function toggleWidgetState(useWidget, paramWidget, paramName) {
@@ -5248,6 +5251,71 @@ function settingsToggleHandler(settingsNode) {
if (useMagicPromptWidget && magicPromptWidget) {
toggleWidgetState(useMagicPromptWidget, magicPromptWidget, "magicPrompt");
}
if (useAutoCropWidget && autoCropWidget) {
toggleWidgetState(useAutoCropWidget, autoCropWidget, "autoCrop");
}
}
function outpaintSettingsToggleHandler(settingsNode) {
if (!settingsNode?.widgets) return;
const useTopWidget = settingsNode.widgets.find(w => w && w.name === "useTop");
const topWidget = settingsNode.widgets.find(w => w && w.name === "Top");
const useRightWidget = settingsNode.widgets.find(w => w && w.name === "useRight");
const rightWidget = settingsNode.widgets.find(w => w && w.name === "Right");
const useBottomWidget = settingsNode.widgets.find(w => w && w.name === "useBottom");
const bottomWidget = settingsNode.widgets.find(w => w && w.name === "Bottom");
const useLeftWidget = settingsNode.widgets.find(w => w && w.name === "useLeft");
const leftWidget = settingsNode.widgets.find(w => w && w.name === "Left");
const useBlurWidget = settingsNode.widgets.find(w => w && w.name === "useBlur");
const blurWidget = settingsNode.widgets.find(w => w && w.name === "Blur");
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 = settingsNode.htmlElements?.widgetsContainer || settingsNode.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";
}
}
}
}
settingsNode.setDirtyCanvas(true);
}
appendWidgetCB(useWidget, () => {
setTimeout(toggleEnabled, 50);
});
setTimeout(toggleEnabled, 100);
}
if (useTopWidget && topWidget) toggleWidgetState(useTopWidget, topWidget, "Top");
if (useRightWidget && rightWidget) toggleWidgetState(useRightWidget, rightWidget, "Right");
if (useBottomWidget && bottomWidget) toggleWidgetState(useBottomWidget, bottomWidget, "Bottom");
if (useLeftWidget && leftWidget) toggleWidgetState(useLeftWidget, leftWidget, "Left");
if (useBlurWidget && blurWidget) toggleWidgetState(useBlurWidget, blurWidget, "Blur");
}
function safetyInputsToggleHandler(safetyNode) {
+1 -1
View File
@@ -351,7 +351,7 @@ class txt2img:
genConfig[0]["embeddings"] = runwareEmbedding
elif (isinstance(runwareEmbedding, dict)):
genConfig[0]["embeddings"] = [runwareEmbedding]
if (runwareOutpainting is not None):
if runwareOutpainting:
genConfig[0]["outpaint"] = runwareOutpainting
if (runwareVAE is not None):
genConfig[0]["vae"] = runwareVAE
+41 -22
View File
@@ -3,50 +3,70 @@ class outpaintSettings:
def INPUT_TYPES(cls):
return {
"required": {
"useTop": ("BOOLEAN", {
"tooltip": "Enable to include top extension in outpaint settings.",
"default": False,
}),
"Top": (
"INT",
{
"tooltip": "Number of pixels to extend at the top of the image. Must be a multiple of 64.",
"tooltip": "Number of pixels to extend at the top of the image. Only used when 'Use Top' is enabled.",
"default": 64,
"min": 0,
"max": 2048,
"step": 64,
"step": 1,
},
),
"useRight": ("BOOLEAN", {
"tooltip": "Enable to include right extension in outpaint settings.",
"default": False,
}),
"Right": (
"INT",
{
"tooltip": "Number of pixels to extend at the right of the image. Must be a multiple of 64.",
"tooltip": "Number of pixels to extend at the right of the image. Only used when 'Use Right' is enabled.",
"default": 64,
"min": 0,
"max": 2048,
"step": 64,
"step": 1,
},
),
"useBottom": ("BOOLEAN", {
"tooltip": "Enable to include bottom extension in outpaint settings.",
"default": False,
}),
"Bottom": (
"INT",
{
"tooltip": "Number of pixels to extend at the bottom of the image. Must be a multiple of 64.",
"tooltip": "Number of pixels to extend at the bottom of the image. Only used when 'Use Bottom' is enabled.",
"default": 64,
"min": 0,
"max": 2048,
"step": 64,
"step": 1,
},
),
"useLeft": ("BOOLEAN", {
"tooltip": "Enable to include left extension in outpaint settings.",
"default": False,
}),
"Left": (
"INT",
{
"tooltip": "Number of pixels to extend at the left of the image. Must be a multiple of 64.",
"tooltip": "Number of pixels to extend at the left of the image. Only used when 'Use Left' is enabled.",
"default": 64,
"min": 0,
"max": 2048,
"step": 64,
"step": 1,
},
),
"useBlur": ("BOOLEAN", {
"tooltip": "Enable to include blur in outpaint settings.",
"default": False,
}),
"Blur": (
"INT",
{
"tooltip": "The amount of blur to apply at the boundaries between the original image and the extended areas, measured in pixels.",
"tooltip": "The amount of blur to apply at the boundaries between the original image and the extended areas, measured in pixels. Only used when 'Use Blur' is enabled.",
"default": 0,
"min": 0,
"max": 32,
@@ -63,18 +83,17 @@ class outpaintSettings:
CATEGORY = "Runware"
def outpaintSettings(self, **kwargs):
top = kwargs.get("Top", 0)
right = kwargs.get("Right", 0)
bottom = kwargs.get("Bottom", 0)
left = kwargs.get("Left", 0)
blur = kwargs.get("Blur", 0)
outpaint = {}
outpaint = {
"top": top,
"right": right,
"bottom": bottom,
"left": left,
"blur": blur,
}
if kwargs.get("useTop", False):
outpaint["top"] = int(kwargs.get("Top", 0))
if kwargs.get("useRight", False):
outpaint["right"] = int(kwargs.get("Right", 0))
if kwargs.get("useBottom", False):
outpaint["bottom"] = int(kwargs.get("Bottom", 0))
if kwargs.get("useLeft", False):
outpaint["left"] = int(kwargs.get("Left", 0))
if kwargs.get("useBlur", False):
outpaint["blur"] = int(kwargs.get("Blur", 0))
return (outpaint,)
return (outpaint if outpaint else None,)
+15 -2
View File
@@ -3,7 +3,7 @@ Runware Image Inference Settings (registered as Runware Settings for workflow co
Provides settings for image generation including temperature, systemPrompt, topP, layers,
quality, background, style, search, promptExtend, editRegions, thinking (boolean),
thinkingLevel (high/medium/low), sequential, renderingSpeed (TURBO/DEFAULT/QUALITY),
magicPrompt (AUTO/ON/OFF), and colorPalette
magicPrompt (AUTO/ON/OFF), autoCrop, and colorPalette
(from Runware Image Inference Settings Color Palette).
"""
@@ -172,6 +172,16 @@ class RunwareSettings:
"default": "AUTO",
"tooltip": "Determine if MagicPrompt should be used. Only used when 'Use Magic Prompt' is enabled.",
}),
"useAutoCrop": ("BOOLEAN", {
"tooltip": "Enable to include autoCrop in settings.",
"default": False,
}),
"autoCrop": ("BOOLEAN", {
"tooltip": "If true, crop the reference image to the canvas bounds when it extends beyond the edges. Defaults to false. Only used when 'Use Auto Crop' is enabled.",
"default": False,
"label_on": "true",
"label_off": "false",
}),
}
}
@@ -182,7 +192,7 @@ class RunwareSettings:
DESCRIPTION = (
"Configure general settings for image generation: temperature, system prompt, top-p, layers, quality, background, style, search, "
"promptExtend, editRegions (JSON), thinking (boolean), thinkingLevel (high/medium/low), sequential, "
"renderingSpeed (TURBO/DEFAULT/QUALITY), magicPrompt (AUTO/ON/OFF), and optional colorPalette from the Color Palette node."
"renderingSpeed (TURBO/DEFAULT/QUALITY), magicPrompt (AUTO/ON/OFF), autoCrop, and optional colorPalette from the Color Palette node."
)
def createSettings(self, **kwargs) -> tuple[Dict[str, Any]]:
@@ -206,6 +216,7 @@ class RunwareSettings:
useSequential = kwargs.get("useSequential", False)
useRenderingSpeed = kwargs.get("useRenderingSpeed", False)
useMagicPrompt = kwargs.get("useMagicPrompt", False)
useAutoCrop = kwargs.get("useAutoCrop", False)
# Get value parameters
temperature = kwargs.get("temperature", 1.0)
@@ -272,6 +283,8 @@ class RunwareSettings:
settings["renderingSpeed"] = str(renderingSpeed)
if useMagicPrompt:
settings["magicPrompt"] = str(magicPrompt)
if useAutoCrop:
settings["autoCrop"] = bool(kwargs.get("autoCrop", False))
# Clean up None values
settings = {k: v for k, v in settings.items() if v is not None}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long