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:
@@ -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
@@ -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) {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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",
|
||||
}
|
||||
@@ -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
Reference in New Issue
Block a user