Merge pull request #148 from Runware/feature-FluxUpdate
Added support for Flux outpaint
This commit is contained in:
+3
-1
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
@@ -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
@@ -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
Reference in New Issue
Block a user