Merge pull request #87 from Runware/feature-BriaFiboEdit/viduQ3/GrokImagine

Adding Grok image and Fibo Edit image support and  HunyuanVideo-1.5 workflow
This commit is contained in:
Sirshendu Ganguly
2026-02-02 21:02:31 -05:00
committed by GitHub
11 changed files with 139 additions and 3 deletions
+2
View File
@@ -60,6 +60,7 @@ from .modules.providerSettings.mireloProviderSettings import RunwareMireloProvid
from .modules.providerSettings.alibabaProviderSettings import RunwareAlibabaProviderSettings
from .modules.providerSettings.googleProviderSettings import RunwareGoogleProviderSettings
from .modules.providerSettings.blackForestProviderSettings import RunwareBlackForestProviderSettings
from .modules.providerSettings.xaiProviderSettings import RunwareXAIProviderSettings
from .modules.providerSettings.syncSegment import RunwareSyncSegment
from .modules.providerSettings.syncProviderSettings import RunwareSyncProviderSettings
from .modules.vectorize import vectorize
@@ -150,6 +151,7 @@ NODE_CLASS_MAPPINGS = {
"Runware Alibaba Provider Settings": RunwareAlibabaProviderSettings,
"Runware Google Provider Settings": RunwareGoogleProviderSettings,
"Runware BlackForest Labs Provider Settings": RunwareBlackForestProviderSettings,
"Runware xAI Provider Settings": RunwareXAIProviderSettings,
"Runware Sync Segment": RunwareSyncSegment,
"Runware Sync Provider Settings": RunwareSyncProviderSettings,
"Runware Vectorize": vectorize,
+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, mediaUUIDHandler, save3DFilepathHandler, videoTranscriptionHandler, videoOutputsHandler, handleCustomErrors, videoInferenceDimensionsHandler, videoModelSearchFilterHandler, audioModelSearchFilterHandler, useParameterToggleHandler, imageInferenceToggleHandler, upscalerToggleHandler, videoUpscalerToggleHandler, audioInferenceToggleHandler, acceleratorOptionsToggleHandler, bytedanceProviderSettingsToggleHandler, 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, useParameterToggleHandler, imageInferenceToggleHandler, upscalerToggleHandler, videoUpscalerToggleHandler, audioInferenceToggleHandler, acceleratorOptionsToggleHandler, bytedanceProviderSettingsToggleHandler, xaiProviderSettingsToggleHandler, 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 = [];
@@ -82,6 +82,8 @@ app.registerExtension({
acceleratorOptionsToggleHandler(node);
} else if(nodeClass === RUNWARE_NODE_TYPES.BYTEDANCEPROVIDERSETTINGS) {
bytedanceProviderSettingsToggleHandler(node);
} else if(nodeClass === RUNWARE_NODE_TYPES.XAIPROVIDERSETTINGS) {
xaiProviderSettingsToggleHandler(node);
} else if(nodeClass === RUNWARE_NODE_TYPES.OPENAIPROVIDERSETTINGS) {
openaiProviderSettingsToggleHandler(node);
} else if(nodeClass === RUNWARE_NODE_TYPES.LIGHTRICKSPROVIDERSETTINGS) {
+5
View File
@@ -106,6 +106,7 @@ const RUNWARE_NODE_TYPES = {
MIRELOPROVIDERSETTINGS: "Runware Mirelo Provider Settings",
ALIBABAPROVIDERSETTINGS: "Runware Alibaba Provider Settings",
BLACKFORESTPROVIDERSETTINGS: "Runware BlackForest Labs Provider Settings",
XAIPROVIDERSETTINGS: "Runware xAI Provider Settings",
GOOGLEPROVIDERSETTINGS: "Runware Google Provider Settings",
SYNCSEGMENT: "Runware Sync Segment",
SYNCPROVIDERSETTINGS: "Runware Sync Provider Settings",
@@ -364,6 +365,10 @@ const RUNWARE_NODE_PROPS = {
bgColor: DEFAULT_BGCOLOR,
colorModeOnly: true,
},
[RUNWARE_NODE_TYPES.XAIPROVIDERSETTINGS]: {
bgColor: DEFAULT_BGCOLOR,
colorModeOnly: true,
},
[RUNWARE_NODE_TYPES.GOOGLEPROVIDERSETTINGS]: {
bgColor: DEFAULT_BGCOLOR,
colorModeOnly: true,
+54
View File
@@ -1260,6 +1260,57 @@ function bytedanceProviderSettingsToggleHandler(bytedanceNode) {
}
}
function xaiProviderSettingsToggleHandler(xaiNode) {
const useQualityWidget = xaiNode.widgets.find(w => w.name === "useQuality");
const qualityWidget = xaiNode.widgets.find(w => w.name === "quality");
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.options && paramWidget.options.element) {
paramWidget.options.element.disabled = !enabled;
paramWidget.options.element.style.opacity = enabled ? "1" : "0.5";
paramWidget.options.element.style.pointerEvents = enabled ? "auto" : "none";
}
if (!paramWidget.inputEl) {
const nodeElement = xaiNode.htmlElements?.widgetsContainer || xaiNode.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.pointerEvents = enabled ? "auto" : "none";
}
}
}
xaiNode.setDirtyCanvas(true);
}
appendWidgetCB(useWidget, () => {
setTimeout(toggleEnabled, 50);
});
setTimeout(toggleEnabled, 100);
}
if (useQualityWidget && qualityWidget) {
toggleWidgetState(useQualityWidget, qualityWidget, "quality");
}
}
function openaiProviderSettingsToggleHandler(openaiNode) {
// Find all "use" parameter widgets for OpenAI Provider Settings (these are COMBO widgets)
const useBackgroundWidget = openaiNode.widgets.find(w => w.name === "useBackground");
@@ -1900,6 +1951,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
"creatify:aurora@fast": {"width": 1280, "height": 720},
"creatify:aurora@0": {"width": 1280, "height": 720},
"runware:hunyuanvideo@1.5": {"width": 848, "height": 480},
"xai:1@1": {"width": 480, "height": 480},
};
const MODEL_RESOLUTIONS = {
@@ -1969,6 +2021,7 @@ function videoModelSearchFilterHandler(videoModelSearchNode) {
"creatify:aurora@fast": "720p",
"creatify:aurora@0": "720p",
"runware:hunyuanvideo@1.5": "480p",
"xai:1@1": "480p",
};
const DEFAULT_DIMENSIONS = {"width": 1024, "height": 576};
@@ -3234,6 +3287,7 @@ export {
audioInferenceToggleHandler,
acceleratorOptionsToggleHandler,
bytedanceProviderSettingsToggleHandler,
xaiProviderSettingsToggleHandler,
openaiProviderSettingsToggleHandler,
lightricksProviderSettingsToggleHandler,
klingProviderSettingsToggleHandler,
+1 -1
View File
@@ -374,7 +374,7 @@ class txt2img:
if isinstance(providerSettings, dict):
# Check if providerSettings already has a provider key (e.g., {"alibaba": {...}})
if any(key in providerSettings for key in ["alibaba", "bytedance", "klingai", "openai", "pixverse",
"bria", "lightricks", "luma", "minimax", "runway", "vidu", "elevenlabs", "bfl"]):
"bria", "lightricks", "luma", "minimax", "runway", "vidu", "elevenlabs", "bfl", "xai"]):
final_provider_settings = providerSettings
else:
# Otherwise, wrap with the extracted provider name
+6
View File
@@ -12,6 +12,9 @@ class imageInferenceInputs:
"image": ("IMAGE", {
"tooltip": "Specifies an image input for the inference process."
}),
"mask": ("IMAGE", {
"tooltip": "Optional mask image for the inference process."
}),
}
for i in range(1, cls.MAX_REFERENCE_IMAGES + 1):
@@ -38,11 +41,14 @@ class imageInferenceInputs:
def createInputs(self, **kwargs):
"""Create image inference inputs from provided parameters"""
image = kwargs.get("image", None)
mask = kwargs.get("mask", None)
inputs = {}
if image is not None:
inputs["image"] = rwUtils.convertTensor2IMG(image)
if mask is not None:
inputs["mask"] = rwUtils.convertTensor2IMG(mask)
references = self._collectReferences(kwargs)
if len(references) > 0:
@@ -0,0 +1,54 @@
"""
Runware xAI Provider Settings Node
Provides xAI-specific settings for image generation (providerSettings.xai.quality)
"""
from typing import Dict, Any
class RunwareXAIProviderSettings:
"""Runware xAI Provider Settings Node"""
@classmethod
def INPUT_TYPES(cls):
return {
"required": {},
"optional": {
"useQuality": ("BOOLEAN", {
"tooltip": "Enable to include quality parameter in API request.",
"default": False,
}),
"quality": (["low", "medium", "high"], {
"default": "medium",
"tooltip": "Quality of the output image. Can be low, medium, or high. Currently a no-op, reserved for future use.",
}),
}
}
DESCRIPTION = "Configure xAI-specific settings for image generation. providerSettings.xai.quality"
RETURN_TYPES = ("RUNWAREPROVIDERSETTINGS",)
RETURN_NAMES = ("providerSettings",)
FUNCTION = "create_provider_settings"
CATEGORY = "Runware/Provider Settings"
def create_provider_settings(self, **kwargs) -> tuple[Dict[str, Any]]:
"""Create xAI provider settings"""
useQuality = kwargs.get("useQuality", False)
quality = kwargs.get("quality", "medium")
settings = {}
if useQuality:
settings["quality"] = quality
return (settings,)
NODE_CLASS_MAPPINGS = {
"RunwareXAIProviderSettings": RunwareXAIProviderSettings,
}
NODE_DISPLAY_NAME_MAPPINGS = {
"RunwareXAIProviderSettings": "Runware xAI Provider Settings",
}
+11 -1
View File
@@ -101,6 +101,9 @@ class videoModelSearch:
"Hunyuan": [
"runware:hunyuanvideo@1.5 (HunyuanVideo-1.5)",
],
"xAI": [
"xai:1@1 (xAI Video 480p)",
],
}
# Model dimensions mapping
@@ -202,6 +205,9 @@ class videoModelSearch:
# Hunyuan Models
"runware:hunyuanvideo@1.5": {"width": 848, "height": 480},
# xAI Models
"xai:1@1": {"width": 480, "height": 480},
}
# Model resolutions mapping
@@ -303,6 +309,9 @@ class videoModelSearch:
# Hunyuan Models
"runware:hunyuanvideo@1.5": "480p",
# xAI Models
"xai:1@1": "480p",
}
MODEL_ARCHITECTURES = [
@@ -322,7 +331,8 @@ class videoModelSearch:
"Sync",
"Bria",
"Creatify",
"Hunyuan"
"Hunyuan",
"xAI"
]
DEFAULT_DIMENSIONS = {"width": 1024, "height": 576}
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