diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..facb594 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,24 @@ +name: Publish to Comfy Registry + +# Publishes to the ComfyUI Registry whenever the version in pyproject.toml changes on main. +# Requires a REGISTRY_ACCESS_TOKEN repo secret (create at https://registry.comfy.org). +on: + push: + branches: [main] + paths: + - "pyproject.toml" + +permissions: + contents: read + +jobs: + publish-node: + name: Publish custom node + runs-on: ubuntu-latest + if: ${{ github.repository_owner == 'Runware' }} + steps: + - uses: actions/checkout@v4 + - name: Publish to Comfy Registry + uses: Comfy-Org/publish-node-action@v1 + with: + personal_access_token: ${{ secrets.REGISTRY_ACCESS_TOKEN }} diff --git a/.gitignore b/.gitignore index a743444..23798ea 100644 --- a/.gitignore +++ b/.gitignore @@ -1,16 +1,4 @@ -__pycache__/ -*.py[cod] -*$py.class -imagesCache.json - -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -cython_debug/ -.pyre/ -.DS_Store +__pycache__/ +*.pyc +.pytest_cache/ +schema-map.json diff --git a/README.md b/README.md index 42221d2..f26f3a2 100644 --- a/README.md +++ b/README.md @@ -1,168 +1,82 @@ -# ComfyUI-Runware Integration 🚀 +# ComfyUI-Runware -Welcome to **ComfyUI-Runware**! 🌟 This is the official integration for **[Runware](https://runware.ai/?utm_source=github&utm_medium=referral&utm_campaign=comfyui)**, bringing you the power of **inference-as-a-service** directly into **ComfyUI**! +Every Runware model as a ComfyUI node — image, video, audio, 3D, and text. The +whole catalog stays current as new models launch, and each node's parameters +match the live model exactly. -## 🌟 What is ComfyUI-Runware? +## Install -Imagine creating stunning images or videos, refining details, or even removing backgrounds—all without needing a powerful GPU. With **Runware**, all the heavy lifting happens on our servers. No GPU? No problem! 🖥️💨 +**ComfyUI Manager** (recommended): search **Runware** and install. -This integration adds a suite of custom nodes to ComfyUI, allowing you to: -- Perform advanced image inference tasks, including image generation and editing with powerful models. -- Utilize PhotoMaker V2 pipelines -- Leverage cutting-edge image models like **Flux .1 Kontext Pro**, **Flux .1 Kontext Max**, **Nano Banana**, **Seedream**, and more for superior image generation and editing. -- Upscale images -- Remove backgrounds -- Generate videos from text prompts and/or images with video inference -- Generate audio from text -- Upscale videos -- Generate video captions -- Remove video backgrounds -- Leverage specialized models and LoRAs -- Use your custom uploaded models and LoRAs - -... and so much more! Let’s make your workflows seamless and efficient with **Runware**. 🖌️✨ - ---- - -## 📖 Table of Contents - -1. [Introduction](#-what-is-comfyui-runware) -2. [Workflows](#-workflows) -3. [Installation](#-installation) -4. [Node Features](#-node-features) -5. [Support & Community](#-support--community) - ---- - -## 🎬 Workflows - -Here are some example workflows showcasing the power of ComfyUI-Runware: - -### Image Workflows -![Image Inference Workflow](assets/image-inference.png) - -### Video Workflows -![Video Inference Workflow](assets/video-inference.png) - ---- - -## 🔧 Installation - -### Step 1: Install ComfyUI - -First, ensure you have ComfyUI installed. You can follow the [pre-built package guide](https://docs.comfy.org/get_started/pre_package) or the [manual installation guide](https://docs.comfy.org/get_started/manual_install). - -Make sure your system meets these requirements: -- **Python 3.10+** -- **ComfyUI installed** - -### Step 2: Install ComfyUI-Runware - -You have two options to install this integration: - -#### Option 1: Using ComfyUI Manager (Recommended) -First, ensure you have the `ComfyUI-Manager` custom node installed. If you don't have it or are using the beta ComfyUI desktop version, follow the instructions on this [GitHub Repo](https://github.com/ltdrdata/ComfyUI-Manager?tab=readme-ov-file#installation). - -After installing ComfyUI-Manager, open it and click on "Custom Nodes Manager". Search for "Runware" or **"Runware.ai"** and then click on install or update. Finally, restart your ComfyUI. ✨ - -#### Option 2: Manual Installation - -1. Navigate to the custom nodes directory: - ```bash - cd custom_nodes - ``` - -2. Clone the repository: - ```bash - git clone https://github.com/Runware/ComfyUI-Runware.git - ``` - -3. Navigate to the repository folder: - ```bash - cd ComfyUI-Runware - ``` - -4. Install dependencies: - ```bash - pip install -r requirements.txt - ``` - -### Step 3: Run ComfyUI - -Install latest ComfyUI frontend package +**Manual:** ```bash -pip install -U comfyui-frontend-package -```` - -Start ComfyUI with the following command: -```bash -python main.py +cd ComfyUI/custom_nodes +git clone https://github.com/Runware/ComfyUI-Runware +pip install -r ComfyUI-Runware/requirements.txt ``` +Restart ComfyUI. -#### Optional: CPU-Only Mode -If you want to run ComfyUI without a GPU, add the `--cpu` flag: -```bash -python main.py --cpu -``` +## API key -### Step 4: Explore Workflows -Inside the `ComfyUI-Runware` custom node folder, you’ll find a `workflows` folder with pre-made workflows to get you started! 🚀 +Use any of these (the environment variable wins if more than one is set): ---- +- **ComfyUI Settings → Runware API key** — paste your key in the UI, no terminal needed. +- **`RUNWARE_API_KEY`** in the environment ComfyUI runs in. +- **[Runware CLI](https://runware.ai/docs/platform/cli)** — run `runware auth login` + once and the nodes reuse the stored key. -## 🧩 Node Features +## Use -Here's a breakdown of the amazing nodes included in this integration: +Search the node menu for **Runware** — one node per model, grouped +`Runware//`. Set the parameters, wire the output, and queue: -- **Runware API Manager**: Set or change your API keys, adjust the max connection timeout, adjust the image output quality and format, and enable or disable image caching directly in ComfyUI—no need to edit config files manually! 🔑 -- **Runware Image Inference**: Perform advanced tasks like inpainting, outpainting, and more 🎨 -- **Runware PhotoMakerV2**: Create consistent identities with our photomaker pipeline. 🖼️ -- **Runware Image Upscale**: Upscale your images up to 4x. 🔍 -- **Runware Background Removal**: Effortlessly remove image backgrounds. 🧹 -- **Runware LoRA**: Search and select LoRAs to enhance your workflow. 📂 -- **Runware Model**: Choose specific models to connect with image inference. 🤖 -- **Runware ControlNet**: Guide your image generation with ControlNet and guide images. 🗺️ -- **Runware Refiner**: Refine your images with advanced tools. ✨ -- **Runware LoRA Combine**: Combine up to 3 LoRAs together. 🔗 -- **Runware ControlNet Combine**: Combine multiple ControlNets for complex workflows. 🧩 -- **Runware Image Masking**: Automatically mask elements like faces, hands, and more. 🖌️ -- **Runware ControlNet Preprocessor**: Preprocess images before using them as guide images in ControlNet. 🔄 -- **Runware VAE**: Search and connect a VAE to Image inference. 🖼️ -- **Runware Embedding**: Search and connect Embedding to image inference. 🧩 -- **Runware Embedding Combine**: Combine multiple embeddings together. 🔗 -- **Runware Image Caption**: Generate descriptive text from images for further workflow integration. 🖼️ -- **Runware IPAdapter**: Use reference images to guide the style and content of generated images. 🖌️ -- **Runware IPAdapters Combine**: Combine multiple IP-Adapter inputs for sophisticated image conditioning. 🔗 -- **Runware Video Inference**: Generate videos from text prompts using advanced AI models with support for frame images and reference images. 🎬 +- **Image** models output a native ComfyUI IMAGE. +- **Audio / video** models output native ComfyUI AUDIO / VIDEO (chain them straight + into preview or save nodes); **3D** and other files download to your output folder + and return a path. +- **Reference / seed images** are IMAGE inputs and **inpainting masks** are MASK + inputs; audio/video inputs take a URL or path. +- **Builder nodes keep model nodes clean** (`Runware/Params`). Stackable features + live in their own nodes instead of crowding every model node: `LoRA`, `ControlNet`, + `IP-Adapter`, `Embeddings`, `Refiner`, feature blocks (`PuLID`, `PhotoMaker`, + `Watermark`, `Ultralytics`, `Accelerator Options`), and reference inputs. Each feature is a distinct socket + type, so you wire a builder into the model's matching typed socket (`lora`, + `controlNet`, ...) and chain the stackable ones to combine them. The model node only + shows the features a generation actually uses. LoRA, Embeddings, and Refiner have an + editable **model** field plus a **search catalog** button beneath it that opens a live + catalog search to fill the AIR. ControlNet and IP-Adapter instead scope their **model** + field to the model/architecture node you wire them into (chaining through any other same + builders): it becomes a dropdown of exactly the models that node accepts, or a free AIR + field until it reaches one. The Speech, reference, Accelerator Options, and Outpaint + builders scope their **fields** the same way: wired into a model, each shows only what that + model supports and hides the rest (Speech's `voice`/`language` become that model's own + lists, Accelerator Options shows only its caching strategies, Outpaint drops `blur` where + unsupported). +- **Model-specific config flattens onto the model node** as dotted fields under a + **Settings** section: `safety.checkContent`, `providerSettings.google.webSearch` + (only your model's provider is shown). +- **Widgets are grouped into sections** (inputs, core, settings, output). Where a model + has no fixed default for a setting, the node leaves it to the model rather than guess: + a number like `steps` or `CFGScale` shows a **set** toggle that reveals its field only + when you opt in, and a dropdown like `scheduler` carries a `(default)` option. Leave + these to use the model's own default, or set them to take control. Dimensions and + `seed` always show a value. A cohesive settings group reveals behind one toggle too: + `safety`, `toolChoice`, and `advancedFeatures` each hide their fields (e.g. + `safety.checkContent` / `safety.mode`) until you enable the group. +- Niche per-model params (and anything not auto-typed) go into the raw + `advanced_json` input. +- **Runware Upload Image** / **Runware Load Image (URL)** — upload an image once for + a reusable UUID, or pull any image URL (including a Runware result) into the graph + as an IMAGE. +- After a run, each model, architecture, and custom node shows its cost and, when the + model ran a content check, the NSFW result along its title bar (e.g. `$0.00078 · NSFW: no`). +- **Runware (custom)** — a generic node for any model AIR + taskType, for models + newer than your installed version. It makes no assumption about modality: you give + it the request as JSON (`request_json`) and it returns the raw response as + `result_json`. Feed media in as UUIDs/URLs (see **Runware Upload Image**). +- **Runware Get** — pulls a field out of a `result_json` by dot-path (e.g. + `0.imageURL`, `0.videoURL`, `0.outputs.files.0.url`; leave it empty to grab the + first URL). The `STRING` it outputs goes to **Runware Load Image (URL)** to preview + an image, or to a Save/Preview node for any other result. -- **Runware Frame Images**: Configure keyframe images with precise positioning control for video generation. 🖼️➡️🎥 -- **Runware Reference Images**: Provide reference images for overall visual guidance in video generation. 🖼️ - -### Provider Settings - -Configure provider-specific settings for various services: -- **Runware Alibaba Provider Settings**: Configure Alibaba-specific settings. ☁️ -- **Runware BRIA Image Provider Settings**: Configure BRIA Image-specific settings. 🖼️ -- **Runware ByteDance Provider Settings**: Configure ByteDance-specific settings. 🎬 -- **Runware ElevenLabs Provider Settings**: Configure ElevenLabs-specific settings for audio generation. 🎤 -- **Runware Kling Provider Settings**: Configure Kling-specific settings. 🎥 -- **Runware Lightricks Provider Settings**: Configure Lightricks-specific settings. ✨ -- **Runware Luma Provider Settings**: Configure Luma-specific settings. 🎬 -- **Runware Midjourney Provider Settings**: Configure Midjourney-specific settings. 🎨 -- **Runware MiniMax Provider Settings**: Configure MiniMax-specific settings. 🤖 -- **Runware OpenAI Provider Settings**: Configure OpenAI-specific settings with quality, background, and style options. 🤖 -- **Runware Pixverse Provider Settings**: Configure Pixverse-specific settings with effect, style, motion, and sound options. 🎬 -- **Runware Runway Provider Settings**: Configure Runway-specific settings. 🎥 -- **Runware Vidu Provider Settings**: Configure Vidu-specific settings. 🎬 - ---- - -## 🤝 Support & Community - -This is the **official Runware integration**, maintained by **Runware Inc**. We’re here to help you every step of the way! 💬 - -Join our community on Discord for support, updates, and to connect with fellow creators: [Runware Discord](https://discord.com/invite/aJ4UzvBqNU) 🎉 - ---- - -Thank you for using **ComfyUI-Runware**! Let’s create something amazing together. 🌟 +Browse models and get an API key at [runware.ai](https://runware.ai/docs). diff --git a/__init__.py b/__init__.py index c3aa692..0180966 100644 --- a/__init__.py +++ b/__init__.py @@ -1,318 +1,9 @@ -from .modules.imageInference import txt2img -from .modules.outpaintSettings import outpaintSettings -from .modules.bgremoval import bgremoval -from .modules.photoMaker import photoMaker -from .modules.upscaler import upscaler -from .modules.imageUpscalerSettings import RunwareImageUpscalerSettings -from .modules.modelSearch import modelSearch -from .modules.bridges import mainRoute -from .modules.controlNet import controlNet -from .modules.multiInference import multiInference -from .modules.runwareBFL import runwareKontext -from .modules.runwareImagen import runwareImagen -from .modules.loraSearch import loraSearch -from .modules.loraCombine import loraCombine -from .modules.refiner import refiner -from .modules.imageMasking import imageMasking -from .modules.controlNetPreprocessor import controlNetPreprocessor -from .modules.apiManager import apiManager -from .modules.imageCaptioning import imageCaptioning -from .modules.videoTranscription import videoTranscription -from .modules.controlNetCombine import controlNetCombine -from .modules.embeddingSearch import embeddingSearch -from .modules.embeddingsCombine import embeddingsCombine -from .modules.ipAdapter import ipAdapter -from .modules.ipAdapterCombine import ipAdapterCombine -from .modules.vaeSearch import vaeSearch -from .modules.referenceImages import referenceImages -from .modules.imageInferenceInputs import imageInferenceInputs -from .modules.imageInferenceInputsFonts import RunwareImageInferenceInputsFonts -from .modules.imageInferenceAdvancedFeatures import RunwareImageInferenceAdvancedFeatures -from .modules.imageWatermarkAdvancedFeature import RunwareWatermarkAdvancedFeature -from .modules.imageRegionalPromptingAdvancedFeature import RunwareRegionalPromptingAdvancedFeature -from .modules.imageRegionalPromptingAdvancedFeatureRegions import RunwareRegionalPromptingAdvancedFeatureRegions -from .modules.videoInference import txt2vid -from .modules.videoInferenceSpeechInput import RunwareVideoInferenceSpeechInput -from .modules.videoInferenceLora import RunwareVideoInferenceLora -from .modules.videoModelSearch import videoModelSearch -from .modules.videoSettings import RunwareVideoSettings -from .modules.videoInferenceSettingsTts import RunwareVideoInferenceSettingsTts -from .modules.videoInferenceSettingsActiveSpeakerDetection import RunwareVideoInferenceSettingsActiveSpeakerDetection -from .modules.videoInferenceSettingsActiveSpeakerBoundingBoxes import RunwareVideoInferenceSettingsActiveSpeakerBoundingBoxes -from .modules.videoInferenceSettingsSegments import RunwareVideoInferenceSettingsSegments -from .modules.videoInferenceSettingsControl import RunwareVideoInferenceSettingsControl -from .modules.videoInferenceSettingsSourcePosition import RunwareVideoInferenceSettingsSourcePosition -from .modules.frameImages import RunwareFrameImages -from .modules.providerSettings.pixverseProviderSettings import RunwarePixverseProviderSettings -from .modules.providerSettings.openaiProviderSettings import RunwareOpenAIProviderSettings -from .modules.providerSettings.bytedanceProviderSettings import RunwareBytedanceProviderSettings -from .modules.providerSettings.briaProviderSettings import RunwareBriaProviderSettings -from .modules.providerSettings.briaProviderMask import RunwareBriaProviderMask -from .modules.audioInference import RunwareAudioInference -from .modules.audioInferenceSpeech import RunwareAudioInferenceSpeech -from .modules.audioInferenceSpeechVoices import RunwareAudioInferenceSpeechVoices -from .modules.audioModelSearch import RunwareAudioModelSearch -from .modules.textModelSearch import RunwareTextModelSearch -from .modules.textInferenceMessages import RunwareTextInferenceMessages -from .modules.textInferenceMessage import RunwareTextInferenceMessage -from .modules.textInference import RunwareTextInference -from .modules.textInferenceSettings import RunwareTextInferenceSettings -from .modules.textInferenceToolChoice import RunwareTextInferenceToolChoice -from .modules.textInferenceSettingsCache import RunwareTextInferenceSettingsCache -from .modules.textInferenceInputs import RunwareTextInferenceInputs -from .modules.textInferenceInputsImages import RunwareTextInferenceInputsImages -from .modules.textInferenceInputsVideos import RunwareTextInferenceInputsVideos -from .modules.audioSections import RunwareAudioSections -from .modules.audioInferenceInputs import audioInferenceInputs -from .modules.audioInferenceReferenceVoices import RunwareAudioInferenceReferenceVoices -from .modules.audioSettings import RunwareAudioSettings -from .modules.audioSettingsVoiceModify import RunwareAudioSettingsVoiceModify -from .modules.providerSettings.elevenlabsProviderSettings import RunwareElevenLabsProviderSettings -from .modules.providerSettings.elevenlabsProviderSettingsSections import RunwareElevenLabsProviderSettingsSections -from .modules.acceleratorOptions import acceleratorOptions -from .modules.providerSettings.viduProviderSettings import RunwareViduProviderSettings -from .modules.mediaUpload import runwareMediaUpload -from .modules.inputAudios import inputAudios -from .modules.audioInput import RunwareAudioInput -from .modules.speechInput import RunwareSpeechInput -from .modules.speechInputCombine import RunwareSpeechInputCombine -from .modules.referenceVideos import referenceVideos -from .modules.referenceVoices import referenceVoices -from .modules.referenceAudios import referenceAudios -from .modules.videoInferenceInputs import videoInferenceInputs -from .modules.videoInferenceElements import ( - RunwareVideoInferenceElements, - RunwareVideoInferenceElementsCombine, -) -from .modules.providerSettings.lightricksProviderSettings import RunwareLightricksProviderSettings -from .modules.providerSettings.minimaxProviderSettings import RunwareMiniMaxProviderSettings -from .modules.providerSettings.klingProviderSettings import RunwareKlingProviderSettings -from .modules.providerSettings.klingMultiPromptSegment import RunwareKlingMultiPromptSegment -from .modules.providerSettings.klingProviderSettingsMultiPrompt import RunwareKlingProviderSettingsMultiPrompt -from .modules.providerSettings.runwayProviderSettings import RunwareRunwayProviderSettings -from .modules.providerSettings.lumaProviderSettings import RunwareLumaProviderSettings -from .modules.providerSettings.midjourneyProviderSettings import RunwareMidjourneyProviderSettings -from .modules.providerSettings.mireloProviderSettings import RunwareMireloProviderSettings -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.recraftProviderSettings import RunwareRecraftProviderSettings -from .modules.providerSettings.recraftProviderSettingsColor import RunwareRecraftColor -from .modules.providerSettings.sourcefulProviderSettings import RunwareSourcefulProviderSettings -from .modules.providerSettings.sourcefulProviderSettingsFonts import RunwareSourcefulProviderSettingsFonts -from .modules.ultralyticsInputs import RunwareUltralyticsInputs -from .modules.providerSettings.syncSegment import RunwareSyncSegment -from .modules.providerSettings.syncProviderSettings import RunwareSyncProviderSettings -from .modules.vectorize import vectorize -from .modules.videoBgRemoval import videoBgRemoval -from .modules.videoUpscaler import videoUpscaler -from .modules.videoInputsReferences import videoInputsReferences -from .modules.videoInputsReferenceImagesMultipleImagesConnector import RunwareVideoInputsReferenceImagesMultipleImagesConnector -from .modules.videoInputsFrame import RunwareVideoInputsFrameImages -from .modules.safetyInputs import safetyInputs -from .modules.settings import RunwareSettings -from .modules.imageInferenceSettingsColorPalette import RunwareImageInferenceSettingsColorPalette -from .modules.imageInferenceSettingsMoodboards import RunwareImageInferenceSettingsMoodboards -from .modules.imageInferenceSettingsStructuredPrompt import RunwareImageInferenceSettingsStructuredPrompt -from .modules.imageInferenceSettingsPromptEnhance import RunwareImageInferenceSettingsPromptEnhance -from .modules.imageInferenceSettingsScoringRubric import ( - RunwareImageInferenceSettingsScoringRubric, - RunwareImageInferenceSettingsScoringRubricCombine, -) -from .modules.videoAdvancedFeatureInputs import videoAdvancedFeatureInputs -from .modules.advancedFeatureSettings.wanAnimateAdvancedFeatureSettings import RunwareWanAnimateAdvancedFeatureSettings -from .modules.saveImage import RunwareSaveImage -from .modules.videoOutputs import RunwareVideoInferenceOutputs -from .modules.threeDInference import threeDInference -from .modules.threeDModelSearch import Runware3DModelSearch -from .modules.threeDInferenceInputs import threeDInferenceInputs -from .modules.threeDInferenceSettings import Runware3DInferenceSettings -from .modules.threeDInferenceSettingsSparseStructure import Runware3DInferenceSettingsSparseStructure -from .modules.threeDInferenceSettingsShapeSlat import Runware3DInferenceSettingsShapeSlat -from .modules.threeDInferenceSettingsTexSlat import Runware3DInferenceSettingsTexSlat -from .modules.threeDInferenceSettingsMeshCluster import Runware3DInferenceSettingsMeshCluster -from .modules.threeDInferenceSettingsDracoCompression import Runware3DInferenceSettingsDracoCompression -from .modules.save3D import RunwareSave3D -from .modules.saveText import RunwareSaveText -from .modules.loadMesh import RunwareLoadMesh +"""ComfyUI entry point — exposes the generated Runware nodes.""" -RUNWARE_COMFYUI_VERSION = "1.4.0 Beta" +try: # package import under ComfyUI + from .runware_nodes import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS +except ImportError: # flat import (tests, tooling) + from runware_nodes import NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS -RESET_COLOR = "\033[0m" -BLUE_COLOR = "\033[94m" -GREEN_COLOR = "\033[92m" -print(BLUE_COLOR + "##############################################################" + RESET_COLOR) -print(GREEN_COLOR + " Runware ComfyUI Inference Services Are Loaded Successfully" + RESET_COLOR) -print(GREEN_COLOR + " Version: " + RUNWARE_COMFYUI_VERSION + " | Maintained by: Runware Inc" + RESET_COLOR) -print(GREEN_COLOR + " Official Website: https://my.runware.ai" + RESET_COLOR) -print(BLUE_COLOR + "##############################################################" + RESET_COLOR) - -NODE_CLASS_MAPPINGS = { - "Runware Image Inference": txt2img, - "Runware Outpaint": outpaintSettings, - "Runware Background Removal": bgremoval, - "Runware PhotoMaker V2": photoMaker, - "Runware Image Upscaler": upscaler, - "Runware Image Upscaler Settings": RunwareImageUpscalerSettings, - "Runware Model Search": modelSearch, - "Runware Kontext Inference": runwareKontext, - "Runware Imagen Inference": runwareImagen, - "Runware Multi Inference": multiInference, - "Runware Lora Search": loraSearch, - "Runware Embedding Search": embeddingSearch, - "Runware VAE Search": vaeSearch, - "Runware Embeddings Combine": embeddingsCombine, - "Runware ControlNet": controlNet, - "Runware Lora Combine": loraCombine, - "Runware Refiner": refiner, - "Runware Image Masking": imageMasking, - "Runware ControlNet PreProcessor": controlNetPreprocessor, - "Runware API Manager": apiManager, - "Runware Image Caption": imageCaptioning, - "Runware Video Transcription": videoTranscription, - "Runware ControlNet Combine": controlNetCombine, - "Runware IPAdapter": ipAdapter, - "Runware IPAdapters Combine": ipAdapterCombine, - "Runware Reference Images": referenceImages, - "Runware Image Inference Inputs": imageInferenceInputs, - "Runware Image Inference Inputs Fonts": RunwareImageInferenceInputsFonts, - "Runware Image Advanced Feature Input": RunwareImageInferenceAdvancedFeatures, - "Runware Watermark Advanced Feature": RunwareWatermarkAdvancedFeature, - "Runware Regional Prompting Advanced Feature": RunwareRegionalPromptingAdvancedFeature, - "Runware Regional Prompting Advanced Feature Regions": RunwareRegionalPromptingAdvancedFeatureRegions, - "Runware Video Inference": txt2vid, - "Runware Video Model Search": videoModelSearch, - "Runware Frame Images": RunwareFrameImages, - "Runware Pixverse Provider Settings": RunwarePixverseProviderSettings, - "Runware OpenAI Provider Settings": RunwareOpenAIProviderSettings, - "Runware Bytedance Provider Settings": RunwareBytedanceProviderSettings, - "Runware Bria Provider Settings": RunwareBriaProviderSettings, - "Runware Bria Provider Mask": RunwareBriaProviderMask, - "Runware Audio Inference": RunwareAudioInference, - "Runware Audio Inference Speech": RunwareAudioInferenceSpeech, - "Runware Audio Inference Speech Voices": RunwareAudioInferenceSpeechVoices, - "Runware Audio Model Search": RunwareAudioModelSearch, - "Runware Text Model Search": RunwareTextModelSearch, - "Runware Text Inference Messages": RunwareTextInferenceMessages, - "Runware Text Inference Message": RunwareTextInferenceMessage, - "Runware Text Inference": RunwareTextInference, - "Runware Text Inference Settings": RunwareTextInferenceSettings, - "Runware Text Inference Tool Choice": RunwareTextInferenceToolChoice, - "Runware Text Inference Settings Cache": RunwareTextInferenceSettingsCache, - "Runware Text Inference Inputs": RunwareTextInferenceInputs, - "Runware Text Inference Inputs Images": RunwareTextInferenceInputsImages, - "Runware Text Inference Inputs Videos": RunwareTextInferenceInputsVideos, - "Runware Audio Sections": RunwareAudioSections, - "Runware Audio Inference Inputs": audioInferenceInputs, - "Runware Audio Inference Inputs Reference Audio": RunwareAudioInferenceReferenceVoices, - "Runware Audio Inference Settings": RunwareAudioSettings, - "Runware Audio Inference Settings Voice Modify": RunwareAudioSettingsVoiceModify, - "Runware ElevenLabs Provider Settings": RunwareElevenLabsProviderSettings, - "Runware ElevenLabs Provider Settings Sections": RunwareElevenLabsProviderSettingsSections, - "Runware Accelerator Options": acceleratorOptions, - "Runware Vidu Provider Settings": RunwareViduProviderSettings, - "Runware Media Upload": runwareMediaUpload, - "Runware Input Audios": inputAudios, - "Runware Video Audio Input": RunwareAudioInput, - "Runware Video Speech Input": RunwareSpeechInput, - "Runware Speech Inputs Combine": RunwareSpeechInputCombine, - # Backward-compatible aliases for existing workflows - "Runware Reference Videos": referenceVideos, - "Runware Reference Voices": referenceVoices, - "Runware Video Inputs References": videoInputsReferences, - "Runware Video Inference Inputs Reference Videos": referenceVideos, - "Runware Video Inference Inputs Reference Voices": referenceVoices, - "Runware Video Inference Inputs Reference Audios": referenceAudios, - "Runware Video Inference Inputs": videoInferenceInputs, - "Runware Video Inference Elements": RunwareVideoInferenceElements, - "Runware Video Inference Elements Combine": RunwareVideoInferenceElementsCombine, - "Runware Video Inference Speech Input": RunwareVideoInferenceSpeechInput, - "Runware Video Inference Lora": RunwareVideoInferenceLora, - "Runware Video Inference Settings": RunwareVideoSettings, - "Runware Video Inference Settings TTS": RunwareVideoInferenceSettingsTts, - "Runware Video Inference Settings Active Speaker Detection": RunwareVideoInferenceSettingsActiveSpeakerDetection, - "Runware Video Inference Settings Active Speaker Bounding Boxes": RunwareVideoInferenceSettingsActiveSpeakerBoundingBoxes, - "Runware Video Inference Settings Segments": RunwareVideoInferenceSettingsSegments, - "Runware Video Inference Settings Edit": RunwareVideoInferenceSettingsControl, - "Runware Video Inference Settings Source Position": RunwareVideoInferenceSettingsSourcePosition, - "Runware Lightricks Provider Settings": RunwareLightricksProviderSettings, - "Runware MiniMax Provider Settings": RunwareMiniMaxProviderSettings, - "Runware Luma Provider Settings": RunwareLumaProviderSettings, - "Runware KlingAI Provider Settings": RunwareKlingProviderSettings, - "Runware Kling MultiPrompt Segment": RunwareKlingMultiPromptSegment, - "Runware Kling Provider Settings MultiPrompt": RunwareKlingProviderSettingsMultiPrompt, - "Runware Runway Provider Settings": RunwareRunwayProviderSettings, - "Runware Midjourney Provider Settings": RunwareMidjourneyProviderSettings, - "Runware Mirelo Provider Settings": RunwareMireloProviderSettings, - "Runware Alibaba Provider Settings": RunwareAlibabaProviderSettings, - "Runware Google Provider Settings": RunwareGoogleProviderSettings, - "Runware BlackForest Labs Provider Settings": RunwareBlackForestProviderSettings, - "Runware xAI Provider Settings": RunwareXAIProviderSettings, - "Runware Recraft Provider Settings": RunwareRecraftProviderSettings, - "Runware Provider Settings Recraft Color": RunwareRecraftColor, - "Runware Sourceful Provider Settings": RunwareSourcefulProviderSettings, - "Runware Sourceful Provider Settings Fonts": RunwareSourcefulProviderSettingsFonts, - "Runware Image Inference Ultralytics": RunwareUltralyticsInputs, - "Runware Sync Segment": RunwareSyncSegment, - "Runware Sync Provider Settings": RunwareSyncProviderSettings, - "Runware Vectorize": vectorize, - "Runware Video Background Removal": videoBgRemoval, - "Runware Video Upscaler": videoUpscaler, - "Runware Video Inference Inputs Reference Images": videoInputsReferences, - "Runware Video Inference Inputs Reference Images Multiple Images Connector": RunwareVideoInputsReferenceImagesMultipleImagesConnector, - "Runware Video Inputs Frame Images": RunwareVideoInputsFrameImages, - "Runware Safety Inputs": safetyInputs, - "Runware Settings": RunwareSettings, - "Runware Image Inference Settings Color Palette": RunwareImageInferenceSettingsColorPalette, - "Runware Image Inference Settings Moodboards": RunwareImageInferenceSettingsMoodboards, - "Runware Image Inference Settings Structured Prompt": RunwareImageInferenceSettingsStructuredPrompt, - "Runware Image Inference Settings Prompt Enhance": RunwareImageInferenceSettingsPromptEnhance, - "Runware Image Inference Settings Scoring Rubric": RunwareImageInferenceSettingsScoringRubric, - "Runware Image Inference Settings Scoring Rubric Combine": RunwareImageInferenceSettingsScoringRubricCombine, - "Runware Video Advanced Feature Inputs": videoAdvancedFeatureInputs, - "Runware Wan Animate Advanced Feature Settings": RunwareWanAnimateAdvancedFeatureSettings, - "Runware Save Image": RunwareSaveImage, - "Runware Video Inference Outputs": RunwareVideoInferenceOutputs, - "Runware 3D Inference": threeDInference, - "Runware 3D Model Search": Runware3DModelSearch, - "Runware 3D Inference Inputs": threeDInferenceInputs, - "Runware 3D Inference Settings": Runware3DInferenceSettings, - "Runware 3D Inference Settings Sparse Structure": Runware3DInferenceSettingsSparseStructure, - "Runware 3D Inference Settings Shape Slat": Runware3DInferenceSettingsShapeSlat, - "Runware 3D Inference Settings Tex Slat": Runware3DInferenceSettingsTexSlat, - "Runware 3D Inference Settings Mesh Cluster": Runware3DInferenceSettingsMeshCluster, - "Runware 3D Inference Settings Draco Compression": Runware3DInferenceSettingsDracoCompression, - "Runware Save 3D": RunwareSave3D, - "Runware Save Text": RunwareSaveText, - "Runware Load Mesh": RunwareLoadMesh, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "Runware Settings": "Runware Image Inference Settings", - "Runware Model Search": "Runware Model", - "Runware Lora Search": "Runware Lora", - "Runware Embedding Search": "Runware Embedding", - "Runware VAE Search": "Runware VAE", - "Runware Multi Inference": "Runware Multi Inference [BETA]", - "Runware Video Model Search": "Runware Video Model", - "Runware 3D Model Search": "Runware 3D Model", - "Runware Audio Model Search": "Runware Audio Model", - "Runware Text Model Search": "Runware Text Model", - "Runware Image Inference Settings Color Palette": "Runware Image Inference Color Palette", - "Runware Image Inference Settings Structured Prompt": "Runware Image Inference Structured Prompt", - "Runware Image Inference Settings Prompt Enhance": "Runware Image Inference Settings Prompt Enhance", - "Runware Video Transcription": "Runware Video Caption", - "Runware Video Inputs References": "Runware Video Inference Inputs Reference Images", - "Runware Video Inference Inputs Reference Images": "Runware Video Inference Inputs Reference Images", - "Runware Reference Voices": "Runware Video Inference Inputs Reference Voices", - "Runware Video Inference Inputs Reference Voices": "Runware Video Inference Inputs Reference Voices", - "Runware Reference Videos": "Runware Video Inference Inputs Reference Videos", - "Runware Video Inference Inputs Reference Videos": "Runware Video Inference Inputs Reference Videos", - "Runware Reference Audios": "Runware Video Inference Inputs Reference Audios", - "Runware Video Inference Inputs Reference Audios": "Runware Video Inference Inputs Reference Audios", - "Runware Video Inference Inputs Reference Images Multiple Images Connector": "Runware Video Inference Inputs Reference Images Multiple Images Connector", -} - -WEB_DIRECTORY = "./clientlibs" -__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS", "WEB_DIRECTORY"] \ No newline at end of file +WEB_DIRECTORY = "./web" +__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS", "WEB_DIRECTORY"] diff --git a/assets/image-inference.png b/assets/image-inference.png deleted file mode 100644 index d83f743..0000000 Binary files a/assets/image-inference.png and /dev/null differ diff --git a/assets/video-inference.png b/assets/video-inference.png deleted file mode 100644 index 3948f0b..0000000 Binary files a/assets/video-inference.png and /dev/null differ diff --git a/clientlibs/main.js b/clientlibs/main.js deleted file mode 100644 index 1abdb5d..0000000 --- a/clientlibs/main.js +++ /dev/null @@ -1,237 +0,0 @@ -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, threeDModelSearchFilterHandler, audioModelSearchFilterHandler, textModelSearchFilterHandler, vectorizeModelSearchFilterHandler, vectorizeToggleHandler, useParameterToggleHandler, imageInferenceToggleHandler, imageInferenceAdvancedFeaturesToggleHandler, watermarkAdvancedFeatureToggleHandler, videoInferenceSpeechInputToggleHandler, regionalPromptingRegionsToggleHandler, upscalerToggleHandler, imageUpscalerSettingsToggleHandler, videoUpscalerToggleHandler, audioInferenceToggleHandler, audioInferenceSpeechToggleHandler, audioSettingsToggleHandler, textInferenceSettingsToggleHandler, videoSettingsToggleHandler, videoInferenceSettingsTtsToggleHandler, videoInferenceSettingsActiveSpeakerDetectionToggleHandler, videoInferenceSettingsActiveSpeakerBoundingBoxesToggleHandler, videoInferenceSettingsSegmentsToggleHandler, videoInferenceSettingsControlToggleHandler, acceleratorOptionsToggleHandler, bytedanceProviderSettingsToggleHandler, xaiProviderSettingsToggleHandler, viduProviderSettingsToggleHandler, sourcefulProviderSettingsToggleHandler, sourcefulProviderSettingsFontsToggleHandler, threeDInferenceToggleHandler, threeDInferenceSettingsToggleHandler, threeDInferenceSettingsLatToggleHandler, threeDInferenceSettingsMeshClusterToggleHandler, threeDInferenceSettingsDracoCompressionToggleHandler, ultralyticsProviderSettingsToggleHandler, openaiProviderSettingsToggleHandler, lightricksProviderSettingsToggleHandler, klingProviderSettingsToggleHandler, lumaProviderSettingsToggleHandler, briaProviderSettingsToggleHandler, pixverseProviderSettingsToggleHandler, alibabaProviderSettingsToggleHandler, mireloProviderSettingsToggleHandler, googleProviderSettingsToggleHandler, syncProviderSettingsToggleHandler, syncSegmentToggleHandler, settingsToggleHandler, outpaintSettingsToggleHandler, safetyInputsToggleHandler, imageInferenceSettingsColorPaletteToggleHandler, imageInferenceSettingsMoodboardsToggleHandler, imageInferenceSettingsStructuredPromptToggleHandler, imageInferenceSettingsPromptEnhanceToggleHandler, imageInferenceSettingsScoringRubricToggleHandler, audioInputToggleHandler, speechInputToggleHandler, briaProviderMaskToggleHandler, wanAnimateAdvancedFeatureSettingsToggleHandler, videoAdvancedFeatureInputsToggleHandler, audioInferenceInputsToggleHandler, audioInferenceReferenceVoiceToggleHandler, audioInferenceSpeechVoicesToggleHandler, videoInputsFrameToggleHandler, referenceVideosToggleHandler } from "./utils.js"; -import { RUNWARE_NODE_TYPES, RUNWARE_NODE_PROPS, SEARCH_TERMS } from "./types.js"; - -const nodeInitList = []; -app.registerExtension({ - name: "runware.ai", - async setup() { - api.addEventListener('runwareError', handleCustomErrors); - api.addEventListener('runwareImageCaption', captionNodeHandler); - api.addEventListener('runwareSaveText', saveTextHandler); - api.addEventListener('runwareMediaUUID', mediaUUIDHandler); - api.addEventListener('runwareSave3DFilepath', save3DFilepathHandler); - api.addEventListener('runwareVideoTranscription', videoTranscriptionHandler); - api.addEventListener('runwareVideoOutputs', videoOutputsHandler); - }, - - async nodeCreated(node) { - const nodeClass = node.comfyClass; - let crNodeProps = false; - if(typeof nodeClass === "string" && Object.values(RUNWARE_NODE_TYPES).includes(nodeClass)) { - crNodeProps = RUNWARE_NODE_PROPS[nodeClass]; - } else { - return; - } - - node.bgcolor = crNodeProps.bgColor; - if(nodeClass === RUNWARE_NODE_TYPES.APIMANAGER) { - APIKeyHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.IMAGECAPTION) { - const captionInput = node.widgets[1].inputEl; - captionInput.style.outline = "none"; - captionInput.readOnly = true; - return; - } else if(nodeClass === RUNWARE_NODE_TYPES.MEDIAUPLOAD) { - // Style the mediaUUID widget to show full UUID - const mediaUUIDWidget = node.widgets.find(widget => widget.name === "mediaUUID"); - if(mediaUUIDWidget && mediaUUIDWidget.inputEl) { - mediaUUIDWidget.inputEl.style.width = "100%"; - mediaUUIDWidget.inputEl.style.minWidth = "300px"; - mediaUUIDWidget.inputEl.style.fontSize = "11px"; - mediaUUIDWidget.inputEl.style.fontFamily = "monospace"; - } - } else if(nodeClass === RUNWARE_NODE_TYPES.VIDEOINFERENCEOUTPUTS) { - // Style draftId and videoId widgets to show full IDs (like Media Upload) - const draftIdWidget = node.widgets.find(widget => widget.name === "draftId"); - const videoIdWidget = node.widgets.find(widget => widget.name === "videoId"); - for(const w of [draftIdWidget, videoIdWidget]) { - if(w && w.inputEl) { - w.inputEl.style.width = "100%"; - w.inputEl.style.minWidth = "300px"; - w.inputEl.style.fontSize = "11px"; - w.inputEl.style.fontFamily = "monospace"; - } - } - } else if(nodeClass === RUNWARE_NODE_TYPES.SAVE3D) { - // Style the filepath widget to show full path (like Media Upload mediaUUID) - const filepathWidget = node.widgets.find(widget => widget.name === "filepath"); - if(filepathWidget && filepathWidget.inputEl) { - filepathWidget.inputEl.style.width = "100%"; - filepathWidget.inputEl.style.minWidth = "300px"; - filepathWidget.inputEl.style.fontSize = "11px"; - filepathWidget.inputEl.style.fontFamily = "monospace"; - } - } - - const nodeWidgets = node.widgets; - - // Handle node-specific handlers first - each node has its own dedicated handler - // These must be called BEFORE the colorModeOnly check - if(nodeClass === RUNWARE_NODE_TYPES.IMAGEINFERENCE) { - imageInferenceToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.VIDEOINFERENCE) { - videoInferenceDimensionsHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.UPSCALER) { - upscalerToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.IMAGEUPSCALERSETTINGS) { - imageUpscalerSettingsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.VIDEOUPSCALER) { - 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.WATERMARKADVANCEDFEATURE) { - watermarkAdvancedFeatureToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.VIDEOINFERENCESPEECHINPUT) { - videoInferenceSpeechInputToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.REGIONALPROMPTINGADVFEATUREREGIONS) { - regionalPromptingRegionsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOINFERENCESPEECH) { - audioInferenceSpeechToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOINFERENCESPEECHVOICES) { - audioInferenceSpeechVoicesToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOSETTINGS) { - audioSettingsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.TEXTINFERENCESETTINGS) { - textInferenceSettingsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.VIDEOSETTINGS) { - videoSettingsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.VIDEOINFERENCESETTINGSTTS) { - videoInferenceSettingsTtsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.VIDEOINFERENCESETTINGSACTIVESPEAKERDETECTION) { - videoInferenceSettingsActiveSpeakerDetectionToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.VIDEOINFERENCESETTINGSACTIVESPEAKERBOUNDINGBOXES) { - videoInferenceSettingsActiveSpeakerBoundingBoxesToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.VIDEOINFERENCESETTINGSSEGMENTS) { - videoInferenceSettingsSegmentsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.VIDEOINFERENCESETTINGSEDIT) { - videoInferenceSettingsControlToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.ACCELERATOROPTIONS) { - 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.ULTRALYTICSINPUTS) { - ultralyticsProviderSettingsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.OPENAIPROVIDERSETTINGS) { - openaiProviderSettingsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.LIGHTRICKSPROVIDERSETTINGS) { - lightricksProviderSettingsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.KLINGPROVIDERSETTINGS) { - klingProviderSettingsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.LUMAPROVIDERSETTINGS) { - lumaProviderSettingsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.BRIAPROVIDERSETTINGS) { - briaProviderSettingsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.PIXVERSEPROVIDERSETTINGS) { - pixverseProviderSettingsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.ALIBABAPROVIDERSETTINGS) { - alibabaProviderSettingsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.MIRELOPROVIDERSETTINGS) { - mireloProviderSettingsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.GOOGLEPROVIDERSETTINGS) { - googleProviderSettingsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.SYNCPROVIDERSETTINGS) { - syncProviderSettingsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.SYNCSEGMENT) { - syncSegmentToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.VIDUPROVIDERSETTINGS) { - viduProviderSettingsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.SOURCEFULPROVIDERSETTINGS) { - sourcefulProviderSettingsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.SOURCEFULPROVIDERSETTINGSFONTS) { - 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) { - imageInferenceSettingsColorPaletteToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.IMAGEINFERENCESETTINGSMOODBOARDS) { - imageInferenceSettingsMoodboardsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.IMAGEINFERENCESETTINGSSTRUCTUREDPROMPT) { - imageInferenceSettingsStructuredPromptToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.IMAGEINFERENCESETTINGSPROMPTENHANCE) { - imageInferenceSettingsPromptEnhanceToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.IMAGEINFERENCESETTINGSSCORINGRUBRIC) { - imageInferenceSettingsScoringRubricToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOINPUT) { - audioInputToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.SPEECHINPUT) { - speechInputToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.BRIAPROVIDERMASK) { - briaProviderMaskToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.WANANIMATEADVANCEDFEATURESETTINGS) { - wanAnimateAdvancedFeatureSettingsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.VIDEOADVANCEDFEATUREINPUTS) { - videoAdvancedFeatureInputsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOINFERENCEINPUTS) { - audioInferenceInputsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOINFERENCEINPUTSREFERENCEAUDIO) { - audioInferenceReferenceVoiceToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.VIDEOINPUTSFRAMEIMAGES) { - videoInputsFrameToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.REFERENCEVIDEOS || - nodeClass === RUNWARE_NODE_TYPES.REFERENCEVIDEOS_LEGACY) { - referenceVideosToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.THREEDINFERENCE) { - threeDInferenceToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.THREEDINFERENCESETTINGS) { - threeDInferenceSettingsToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.THREEDINFERENCESETTINGSSPARSESTRUCTURE || - nodeClass === RUNWARE_NODE_TYPES.THREEDINFERENCESETTINGSSHAPESLAT || - nodeClass === RUNWARE_NODE_TYPES.THREEDINFERENCESETTINGSTEXSLAT) { - threeDInferenceSettingsLatToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.THREEDINFERENCESETTINGSMESHCLUSTER) { - threeDInferenceSettingsMeshClusterToggleHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.THREEDINFERENCESETTINGSDRACOCOMPRESSION) { - threeDInferenceSettingsDracoCompressionToggleHandler(node); - } - - if(crNodeProps.colorModeOnly === true) return; - if(nodeWidgets.length <= 0) return; - - if(nodeClass === RUNWARE_NODE_TYPES.VIDEOMODELSEARCH) { - videoModelSearchFilterHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.THREEDMODELSEARCH) { - threeDModelSearchFilterHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.AUDIOMODELSEARCH) { - audioModelSearchFilterHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.TEXTMODELSEARCH) { - textModelSearchFilterHandler(node); - } else if(nodeClass === RUNWARE_NODE_TYPES.VECTORIZE) { - vectorizeModelSearchFilterHandler(node); - vectorizeToggleHandler(node); - } - - for(const nodeWidget of nodeWidgets) { - const widgetName = nodeWidget.name; - const widgetType = nodeWidget.type; - - if(crNodeProps.promptEnhancer === true && widgetType === "customtext") { - if (widgetName === "positivePrompt" || widgetName === "negativePrompt") { - nodeWidget.inputEl.addEventListener('keydown', promptEnhanceHandler); - } - } else if(crNodeProps.liveDimensions === true && widgetType === "combo" && widgetName === "dimensions") { - syncDimensionsNodeHandler(node, nodeWidget); - } - - if(crNodeProps.liveSearch === true) { - if(widgetType === "text" && SEARCH_TERMS.includes(widgetName)) { - node.callback = function(){}; - searchNodeHandler(node, nodeWidget); - nodeInitList.push(node); - } - } - } - }, - loadedGraphNode(node) { - if(nodeInitList.includes(node)) node.callback(); - } -}) \ No newline at end of file diff --git a/clientlibs/types.js b/clientlibs/types.js deleted file mode 100644 index 307e896..0000000 --- a/clientlibs/types.js +++ /dev/null @@ -1,754 +0,0 @@ -const DEFAULT_BGCOLOR = "#5345bf"; - -const DEFAULT_DIMENSIONS_LIST = { - "Square (512x512)": "512x512", - "Square HD (1024x1024)": "1024x1024", - "Square 2K (2048x2048)": "2048x2048", - "Portrait 3:4 (768x1024)": "768x1024", - "Portrait 9:16 (576x1024)": "576x1024", - "Landscape 4:3 (1024x768)": "1024x768", - "Landscape 16:9 (1024x576)": "1024x576" -}; - -const DEFAULT_MODELS_ARCH_LIST = { - "All": "all", - "FLUX.1-Schnell": "flux1s", - "FLUX.1-Dev": "flux1d", - "FLUX.1-Krea": "flux1d", - "Pony": "pony", - "SD 1.5": "sd1x", - "SD 1.5 Hyper": "sdhyper", - "SD 1.5 LCM": "sd1xlcm", - "SD 3": "sd3", - "SDXL 1.0": "sdxl", - "SDXL 1.0 LCM": "sdxllcm", - "SDXL Distilled": "sdxldistilled", - "SDXL Hyper": "sdxlhyper", - "SDXL Lightning": "sdxllightning", - "SDXL Turbo": "sdxlturbo", -}; - -const DEFAULT_CONTROLNET_CONDITIONING_LIST = { - "All": "all", - "Canny": "canny", - "Depth": "depth", - "MLSD": "mlsd", - "Normal BAE": "normalbae", - "Open Pose": "openpose", - "Tile": "tile", - "Seg": "seg", - "Line Art": "lineart", - "Line Art Anime": "lineart_anime", - "Shuffle": "shuffle", - "Scribble": "scribble", - "Soft Edge": "softedge", -}; - -const SEARCH_TERMS = ["Model Search", "Lora Search", "ControlNet Search", "Embedding Search", "VAE Search"]; -const MODEL_TYPES_TERMS = ["ModelType", "LoraType", "ControlNetType"]; -const MODEL_LIST_TERMS = ["ModelList", "LoraList", "ControlNetList", "EmbeddingList", "VAEList"]; - -const RUNWARE_NODE_TYPES = { - IMAGEINFERENCE: "Runware Image Inference", - KONTEXTINFERENCE: "Runware Kontext Inference", - IMAGENINFERENCE: "Runware Imagen Inference", - OUTPAINT: "Runware Outpaint", - PHOTOMAKER: "Runware PhotoMaker V2", - MODELSEARCH: "Runware Model Search", - MULTIINFERENCE: "Runware Multi Inference", - TEACACHE: "Runware TeaCache", - DEEPCACHE: "Runware DeepCache", - LORASEARCH: "Runware Lora Search", - CONTROLNET: "Runware ControlNet", - BGREMOVAL: "Runware Background Removal", - UPSCALER: "Runware Image Upscaler", - IMAGEUPSCALERSETTINGS: "Runware Image Upscaler Settings", - REFINER: "Runware Refiner", - LORACOMBINE: "Runware Lora Combine", - CONTROLNETCOMBINE: "Runware ControlNet Combine", - IPADAPTER: "Runware IPAdapter", - IPADAPTERSCOMBINE: "Runware IPAdapters Combine", - IMAGEMASKING: "Runware Image Masking", - CONTROLNETPREPROCESSING: "Runware ControlNet PreProcessor", - APIMANAGER: "Runware API Manager", - IMAGECAPTION: "Runware Image Caption", - EMBEDDING: "Runware Embedding Search", - EMBEDDINGCOMBINE: "Runware Embedding Combine", - VAE: "Runware VAE Search", - REFERENCEIMAGES: "Runware Reference Images", - IMAGEINFERENCEINPUTS: "Runware Image Inference Inputs", - IMAGEINFERENCEINPUTSFONTS: "Runware Image Inference Inputs Fonts", - IMAGEINFERENCEADVANCEDFEATURES: "Runware Image Advanced Feature Input", - VIDEOINFERENCE: "Runware Video Inference", - VIDEOMODELSEARCH: "Runware Video Model Search", - FRAMEIMAGES: "Runware Frame Images", - AUDIOINFERENCE: "Runware Audio Inference", - AUDIOINFERENCESPEECH: "Runware Audio Inference Speech", - AUDIOINFERENCESPEECHVOICES: "Runware Audio Inference Speech Voices", - AUDIOMODELSEARCH: "Runware Audio Model Search", - TEXTMODELSEARCH: "Runware Text Model Search", - TEXTINFERENCE: "Runware Text Inference", - TEXTINFERENCEMESSAGES: "Runware Text Inference Messages", - TEXTINFERENCEMESSAGE: "Runware Text Inference Message", - TEXTINFERENCESETTINGS: "Runware Text Inference Settings", - TEXTINFERENCETOOLCHOICE: "Runware Text Inference Tool Choice", - TEXTINFERENCESETTINGSCACHE: "Runware Text Inference Settings Cache", - TEXTINFERENCEINPUTS: "Runware Text Inference Inputs", - TEXTINFERENCEINPUTSIMAGES: "Runware Text Inference Inputs Images", - TEXTINFERENCEINPUTSVIDEOS: "Runware Text Inference Inputs Videos", - AUDIOSECTIONS: "Runware Audio Sections", - AUDIOINFERENCEINPUTS: "Runware Audio Inference Inputs", - AUDIOINFERENCEINPUTSREFERENCEAUDIO: "Runware Audio Inference Inputs Reference Audio", - AUDIOSETTINGS: "Runware Audio Inference Settings", - AUDIOSETTINGSVOICEMODIFY: "Runware Audio Inference Settings Voice Modify", - PIXVERSEPROVIDERSETTINGS: "Runware Pixverse Provider Settings", - OPENAIPROVIDERSETTINGS: "Runware OpenAI Provider Settings", - BYTEDANCEPROVIDERSETTINGS: "Runware Bytedance Provider Settings", - BRIAPROVIDERSETTINGS: "Runware Bria Provider Settings", - BRIAPROVIDERMASK: "Runware Bria Provider Mask", - ELEVENLABSPROVIDERSETTINGS: "Runware ElevenLabs Provider Settings", - ELEVENLABSPROVIDERSETTINGSSECTIONS: "Runware ElevenLabs Provider Settings Sections", - VIDUPROVIDERSETTINGS: "Runware Vidu Provider Settings", - LORAMIX: "Runware Lora Mix", - MEDIAUPLOAD: "Runware Media Upload", - INPUTAUDIOS: "Runware Input Audios", - AUDIOINPUT: "Runware Video Audio Input", - SPEECHINPUT: "Runware Video Speech Input", - REFERENCEVIDEOS: "Runware Video Inference Inputs Reference Videos", - REFERENCEVIDEOS_LEGACY: "Runware Reference Videos", - REFERENCEVOICES: "Runware Video Inference Inputs Reference Voices", - REFERENCEVOICES_LEGACY: "Runware Reference Voices", - REFERENCEAUDIOS: "Runware Video Inference Inputs Reference Audios", - VIDEOINPUTSREFERENCES_LEGACY: "Runware Video Inputs References", - VIDEOINPUTSREFERENCEMULTIIMAGES: "Runware Video Inference Inputs Reference Images Multiple Images Connector", - VIDEOINFERENCEINPUTS: "Runware Video Inference Inputs", - VIDEOINFERENCEELEMENTS: "Runware Video Inference Elements", - VIDEOINFERENCEELEMENTSCOMBINE: "Runware Video Inference Elements Combine", - VIDEOINFERENCESPEECHINPUT: "Runware Video Inference Speech Input", - VIDEOINFERENCELORA: "Runware Video Inference Lora", - VIDEOSETTINGS: "Runware Video Inference Settings", - VIDEOINFERENCESETTINGSTTS: "Runware Video Inference Settings TTS", - VIDEOINFERENCESETTINGSACTIVESPEAKERDETECTION: "Runware Video Inference Settings Active Speaker Detection", - VIDEOINFERENCESETTINGSACTIVESPEAKERBOUNDINGBOXES: "Runware Video Inference Settings Active Speaker Bounding Boxes", - VIDEOINFERENCESETTINGSSEGMENTS: "Runware Video Inference Settings Segments", - VIDEOINFERENCESETTINGSEDIT: "Runware Video Inference Settings Edit", - VIDEOINFERENCESETTINGSSOURCEPOSITION: "Runware Video Inference Settings Source Position", - LIGHTRICKSPROVIDERSETTINGS: "Runware Lightricks Provider Settings", - KLINGPROVIDERSETTINGS: "Runware KlingAI Provider Settings", - KLINGMULTIPROMPTSEGMENT: "Runware Kling MultiPrompt Segment", - KLINGPROVIDERSETTINGSMULTIPROMPT: "Runware Kling Provider Settings MultiPrompt", - RUNWAYPROVIDERSETTINGS: "Runware Runway Provider Settings", - LUMAPROVIDERSETTINGS: "Runware Luma Provider Settings", - MIDJOURNEYPROVIDERSETTINGS: "Runware Midjourney Provider Settings", - MIRELOPROVIDERSETTINGS: "Runware Mirelo Provider Settings", - ALIBABAPROVIDERSETTINGS: "Runware Alibaba Provider Settings", - BLACKFORESTPROVIDERSETTINGS: "Runware BlackForest Labs Provider Settings", - XAIPROVIDERSETTINGS: "Runware xAI Provider Settings", - RECRAFTPROVIDERSETTINGS: "Runware Recraft Provider Settings", - RECRAFTCOLOR: "Runware Provider Settings Recraft Color", - SOURCEFULPROVIDERSETTINGS: "Runware Sourceful Provider Settings", - SOURCEFULPROVIDERSETTINGSFONTS: "Runware Sourceful Provider Settings Fonts", - ULTRALYTICSINPUTS: "Runware Image Inference Ultralytics", - GOOGLEPROVIDERSETTINGS: "Runware Google Provider Settings", - SYNCSEGMENT: "Runware Sync Segment", - SYNCPROVIDERSETTINGS: "Runware Sync Provider Settings", - VECTORIZE: "Runware Vectorize", - VIDEOBGREMOVAL: "Runware Video Background Removal", - VIDEOUPSCALER: "Runware Video Upscaler", - VIDEOINPUTSREFERENCES: "Runware Video Inference Inputs Reference Images", - VIDEOINPUTSFRAMEIMAGES: "Runware Video Inputs Frame Images", - ACCELERATOROPTIONS: "Runware Accelerator Options", - VIDEOTRANSCRIPTION: "Runware Video Transcription", - MINIMAXPROVIDERSETTINGS: "Runware MiniMax Provider Settings", - SAFETYINPUTS: "Runware Safety Inputs", - SETTINGS: "Runware Settings", - IMAGEINFERENCESETTINGSCOLORPALETTE: "Runware Image Inference Settings Color Palette", - IMAGEINFERENCESETTINGSMOODBOARDS: "Runware Image Inference Settings Moodboards", - IMAGEINFERENCESETTINGSSTRUCTUREDPROMPT: "Runware Image Inference Settings Structured Prompt", - IMAGEINFERENCESETTINGSPROMPTENHANCE: "Runware Image Inference Settings Prompt Enhance", - IMAGEINFERENCESETTINGSSCORINGRUBRIC: "Runware Image Inference Settings Scoring Rubric", - IMAGEINFERENCESETTINGSSCORINGRUBRICCOMBINE: "Runware Image Inference Settings Scoring Rubric Combine", - VIDEOADVANCEDFEATUREINPUTS: "Runware Video Advanced Feature Inputs", - WANANIMATEADVANCEDFEATURESETTINGS: "Runware Wan Animate Advanced Feature Settings", - SAVEIMAGE: "Runware Save Image", - SAVETEXT: "Runware Save Text", - VIDEOINFERENCEOUTPUTS: "Runware Video Inference Outputs", - THREEDINFERENCE: "Runware 3D Inference", - THREEDMODELSEARCH: "Runware 3D Model Search", - THREEDINFERENCEINPUTS: "Runware 3D Inference Inputs", - THREEDINFERENCESETTINGS: "Runware 3D Inference Settings", - THREEDINFERENCESETTINGSSPARSESTRUCTURE: "Runware 3D Inference Settings Sparse Structure", - THREEDINFERENCESETTINGSSHAPESLAT: "Runware 3D Inference Settings Shape Slat", - THREEDINFERENCESETTINGSTEXSLAT: "Runware 3D Inference Settings Tex Slat", - THREEDINFERENCESETTINGSMESHCLUSTER: "Runware 3D Inference Settings Mesh Cluster", - THREEDINFERENCESETTINGSDRACOCOMPRESSION: "Runware 3D Inference Settings Draco Compression", - SAVE3D: "Runware Save 3D", - LOADMESH: "Runware Load Mesh", - WATERMARKADVANCEDFEATURE: "Runware Watermark Advanced Feature", - REGIONALPROMPTINGADVFEATURE: "Runware Regional Prompting Advanced Feature", - REGIONALPROMPTINGADVFEATUREREGIONS: "Runware Regional Prompting Advanced Feature Regions", -}; - -const RUNWARE_NODE_PROPS = { - [RUNWARE_NODE_TYPES.IMAGEINFERENCE]: { - bgColor: DEFAULT_BGCOLOR, - liveDimensions: true, - promptEnhancer: true, - }, - [RUNWARE_NODE_TYPES.KONTEXTINFERENCE]: { - bgColor: DEFAULT_BGCOLOR, - promptEnhancer: true, - }, - [RUNWARE_NODE_TYPES.IMAGENINFERENCE]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.REFERENCEIMAGES]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.OUTPAINT]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.PHOTOMAKER]: { - bgColor: DEFAULT_BGCOLOR, - liveDimensions: true, - promptEnhancer: true, - }, - [RUNWARE_NODE_TYPES.MODELSEARCH]: { - bgColor: DEFAULT_BGCOLOR, - liveSearch: true, - }, - [RUNWARE_NODE_TYPES.MULTIINFERENCE]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.TEACACHE]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.DEEPCACHE]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.LORASEARCH]: { - bgColor: DEFAULT_BGCOLOR, - liveSearch: true, - }, - [RUNWARE_NODE_TYPES.EMBEDDING]: { - bgColor: DEFAULT_BGCOLOR, - liveSearch: true, - }, - [RUNWARE_NODE_TYPES.CONTROLNET]: { - bgColor: DEFAULT_BGCOLOR, - liveSearch: true, - }, - [RUNWARE_NODE_TYPES.VAE]: { - bgColor: DEFAULT_BGCOLOR, - liveSearch: true, - }, - [RUNWARE_NODE_TYPES.EMBEDDINGCOMBINE]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.CONTROLNETCONDITIONING]: { - bgColor: DEFAULT_BGCOLOR, - liveSearch: true, - }, - [RUNWARE_NODE_TYPES.BGREMOVAL]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.UPSCALER]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.IMAGEUPSCALERSETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.REFINER]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.LORACOMBINE]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.IPADAPTER]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.IPADAPTERSCOMBINE]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.CONTROLNETCOMBINE]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.IMAGEMASKING]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.CONTROLNETPREPROCESSING]: { - bgColor: DEFAULT_BGCOLOR, - liveDimensions: true, - }, - [RUNWARE_NODE_TYPES.APIMANAGER]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.IMAGECAPTION]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.VIDEOINFERENCE]: { - bgColor: DEFAULT_BGCOLOR, - liveDimensions: true, - promptEnhancer: true, - }, - [RUNWARE_NODE_TYPES.VIDEOMODELSEARCH]: { - bgColor: DEFAULT_BGCOLOR, - liveSearch: true, - }, - [RUNWARE_NODE_TYPES.FRAMEIMAGES]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.AUDIOINFERENCE]: { - bgColor: DEFAULT_BGCOLOR, - promptEnhancer: true, - }, - [RUNWARE_NODE_TYPES.AUDIOINFERENCESPEECH]: { - bgColor: DEFAULT_BGCOLOR, - }, - [RUNWARE_NODE_TYPES.AUDIOINFERENCESPEECHVOICES]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.AUDIOMODELSEARCH]: { - bgColor: DEFAULT_BGCOLOR, - liveSearch: true, - }, - [RUNWARE_NODE_TYPES.TEXTMODELSEARCH]: { - bgColor: DEFAULT_BGCOLOR, - liveSearch: false, - }, - [RUNWARE_NODE_TYPES.TEXTINFERENCE]: { - bgColor: DEFAULT_BGCOLOR, - }, - [RUNWARE_NODE_TYPES.TEXTINFERENCEMESSAGES]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.TEXTINFERENCEMESSAGE]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.TEXTINFERENCETOOLCHOICE]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.TEXTINFERENCESETTINGSCACHE]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.TEXTINFERENCEINPUTSIMAGES]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.TEXTINFERENCEINPUTSVIDEOS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.TEXTINFERENCEINPUTS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.TEXTINFERENCESETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.AUDIOSECTIONS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.IMAGEINFERENCEINPUTS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.IMAGEINFERENCEINPUTSFONTS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.IMAGEINFERENCEADVANCEDFEATURES]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.WATERMARKADVANCEDFEATURE]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.VIDEOINFERENCESPEECHINPUT]: { - bgColor: DEFAULT_BGCOLOR, - }, - [RUNWARE_NODE_TYPES.VIDEOINFERENCELORA]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.REGIONALPROMPTINGADVFEATURE]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.REGIONALPROMPTINGADVFEATUREREGIONS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.PIXVERSEPROVIDERSETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.OPENAIPROVIDERSETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.BYTEDANCEPROVIDERSETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.BRIAPROVIDERSETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.BRIAPROVIDERMASK]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.ELEVENLABSPROVIDERSETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.ELEVENLABSPROVIDERSETTINGSSECTIONS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.VIDUPROVIDERSETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.LORAMIX]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.MEDIAUPLOAD]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.INPUTAUDIOS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.AUDIOINPUT]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.SPEECHINPUT]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.REFERENCEVIDEOS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.REFERENCEVIDEOS_LEGACY]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.REFERENCEVOICES]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.REFERENCEVOICES_LEGACY]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.REFERENCEAUDIOS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.VIDEOINFERENCEINPUTS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.VIDEOINPUTSREFERENCEMULTIIMAGES]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.VIDEOINFERENCEELEMENTS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.VIDEOINFERENCEELEMENTSCOMBINE]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.LIGHTRICKSPROVIDERSETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.KLINGPROVIDERSETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.KLINGMULTIPROMPTSEGMENT]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.KLINGPROVIDERSETTINGSMULTIPROMPT]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.RUNWAYPROVIDERSETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.LUMAPROVIDERSETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.MIDJOURNEYPROVIDERSETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.MIRELOPROVIDERSETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.ALIBABAPROVIDERSETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.BLACKFORESTPROVIDERSETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.XAIPROVIDERSETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.RECRAFTPROVIDERSETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - }, - [RUNWARE_NODE_TYPES.RECRAFTCOLOR]: { - bgColor: DEFAULT_BGCOLOR, - }, - [RUNWARE_NODE_TYPES.SOURCEFULPROVIDERSETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.SOURCEFULPROVIDERSETTINGSFONTS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.ULTRALYTICSINPUTS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.GOOGLEPROVIDERSETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.SYNCSEGMENT]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.SYNCPROVIDERSETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.VECTORIZE]: { - bgColor: DEFAULT_BGCOLOR, - liveDimensions: true, - }, - [RUNWARE_NODE_TYPES.VIDEOBGREMOVAL]: { - bgColor: DEFAULT_BGCOLOR, - }, - [RUNWARE_NODE_TYPES.VIDEOUPSCALER]: { - bgColor: DEFAULT_BGCOLOR, - }, - [RUNWARE_NODE_TYPES.VIDEOINPUTSREFERENCES]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.VIDEOINPUTSREFERENCES_LEGACY]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.VIDEOINPUTSFRAMEIMAGES]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.AUDIOINFERENCEINPUTS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.AUDIOINFERENCEINPUTSREFERENCEAUDIO]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.AUDIOSETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - }, - [RUNWARE_NODE_TYPES.AUDIOSETTINGSVOICEMODIFY]: { - bgColor: DEFAULT_BGCOLOR, - }, - [RUNWARE_NODE_TYPES.VIDEOSETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - }, - [RUNWARE_NODE_TYPES.VIDEOINFERENCESETTINGSTTS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.VIDEOINFERENCESETTINGSACTIVESPEAKERDETECTION]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.VIDEOINFERENCESETTINGSACTIVESPEAKERBOUNDINGBOXES]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.VIDEOINFERENCESETTINGSSEGMENTS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.VIDEOINFERENCESETTINGSEDIT]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.VIDEOINFERENCESETTINGSSOURCEPOSITION]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.ACCELERATOROPTIONS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.VIDEOTRANSCRIPTION]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.MINIMAXPROVIDERSETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.SAFETYINPUTS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.SETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.IMAGEINFERENCESETTINGSCOLORPALETTE]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.IMAGEINFERENCESETTINGSMOODBOARDS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.IMAGEINFERENCESETTINGSSTRUCTUREDPROMPT]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.IMAGEINFERENCESETTINGSPROMPTENHANCE]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.IMAGEINFERENCESETTINGSSCORINGRUBRIC]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.IMAGEINFERENCESETTINGSSCORINGRUBRICCOMBINE]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.VIDEOADVANCEDFEATUREINPUTS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.WANANIMATEADVANCEDFEATURESETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.SAVEIMAGE]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.SAVETEXT]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.VIDEOINFERENCEOUTPUTS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.THREEDINFERENCE]: { - bgColor: DEFAULT_BGCOLOR, - promptEnhancer: true, - }, - [RUNWARE_NODE_TYPES.THREEDMODELSEARCH]: { - bgColor: DEFAULT_BGCOLOR, - liveSearch: false, - }, - [RUNWARE_NODE_TYPES.THREEDINFERENCEINPUTS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.THREEDINFERENCESETTINGS]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.THREEDINFERENCESETTINGSSPARSESTRUCTURE]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.THREEDINFERENCESETTINGSSHAPESLAT]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.THREEDINFERENCESETTINGSTEXSLAT]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.THREEDINFERENCESETTINGSMESHCLUSTER]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.THREEDINFERENCESETTINGSDRACOCOMPRESSION]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.SAVE3D]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, - [RUNWARE_NODE_TYPES.LOADMESH]: { - bgColor: DEFAULT_BGCOLOR, - colorModeOnly: true, - }, -}; - -export { - DEFAULT_BGCOLOR, - DEFAULT_DIMENSIONS_LIST, - DEFAULT_MODELS_ARCH_LIST, - DEFAULT_CONTROLNET_CONDITIONING_LIST, - SEARCH_TERMS, - MODEL_TYPES_TERMS, - MODEL_LIST_TERMS, - RUNWARE_NODE_TYPES, - RUNWARE_NODE_PROPS -} \ No newline at end of file diff --git a/clientlibs/utils.js b/clientlibs/utils.js deleted file mode 100644 index f362bb9..0000000 --- a/clientlibs/utils.js +++ /dev/null @@ -1,6243 +0,0 @@ -import { app } from "../../scripts/app.js"; -import { api } from "../../scripts/api.js"; -import { DEFAULT_DIMENSIONS_LIST, DEFAULT_MODELS_ARCH_LIST, DEFAULT_CONTROLNET_CONDITIONING_LIST, - RUNWARE_NODE_TYPES, MODEL_TYPES_TERMS, MODEL_LIST_TERMS -} from "./types.js"; - -const TIMEOUT_RANGE = { min: 5, default: 90, max: 99 }; -const OUTPUT_QUALITY_RANGE = { min: 20, default: 95, max: 99 }; -const CACHE_SIZE_RANGE = { min: 30, default: 150, max: 4096 }; - -/** Must match `audioInferenceInputs.MAX_VIDEOS` in modules/audioInferenceInputs.py */ -const AUDIO_INFERENCE_INPUTS_MAX_VIDEOS = 4; -/** Must match `audioInferenceInputs.MAX_AUDIOS` in modules/audioInferenceInputs.py */ -const AUDIO_INFERENCE_INPUTS_MAX_AUDIOS = 4; - -let openDialog = false; -let lastTimeout = false; -let lastOutputFormat = false; -let lastOutputQuality = false; -let lastEnableImagesCaching = null; -let lastMinImageCacheSize = false; - -async function queryLocalAPI(endpoint, data) { - try { - const resp = await api.fetchApi(`/${endpoint}`, { - method: "POST", - headers: {'Content-Type': 'application/json'}, - body: JSON.stringify(data) - }); - return await resp.json(); - } catch (err) { - return false; - } -} - -const runwareLocalAPI = { - enhancePrompt: (userPrompt) => queryLocalAPI('promptEnhance', { userPrompt }), - setAPIKey: (apiKey) => queryLocalAPI('setAPIKey', { apiKey }), - setTimeout: (maxTimeout) => queryLocalAPI('setMaxTimeout', { maxTimeout }), - setOutputFormat: (outputFormat) => queryLocalAPI('setOutputFormat', { outputFormat }), - setOutputQuality: (outputQuality) => queryLocalAPI('setOutputQuality', { outputQuality }), - setEnableImagesCaching: (enableCaching) => queryLocalAPI('setEnableImagesCaching', { enableCaching }), - setMinImageCacheSize: (minCacheSize) => queryLocalAPI('setMinImageCacheSize', { minCacheSize }), - modelSearch: (modelQuery = "", modelArch = "all", modelType = "base", modelCat = "checkpoint", condtioning = "") => - queryLocalAPI('modelSearch', { modelQuery, modelArch, modelType, modelCat, condtioning }) -}; - -function mediaUUIDHandler(msgEvent) { - const mediaData = msgEvent.detail; - const mediaUUID = mediaData.mediaUUID; - const mediaNodeID = parseInt(mediaData.nodeID); - - if(mediaData.success) { - const mediaNode = app.graph.getNodeById(mediaNodeID); - - if(mediaNode !== null && mediaNode !== undefined) { - // Find the mediaUUID widget specifically - const mediaUUIDWidget = mediaNode.widgets.find(widget => widget.name === "mediaUUID"); - - if(mediaUUIDWidget) { - // Update both widget.value and inputEl.value for STRING widgets - if(mediaUUIDWidget.value !== undefined) { - mediaUUIDWidget.value = mediaUUID; - } - - if(mediaUUIDWidget.inputEl) { - mediaUUIDWidget.inputEl.value = mediaUUID; - // Trigger change events to update the UI - mediaUUIDWidget.inputEl.dispatchEvent(new Event('input', { bubbles: true })); - mediaUUIDWidget.inputEl.dispatchEvent(new Event('change', { bubbles: true })); - } - } - } - } - return false; -} - -function save3DFilepathHandler(msgEvent) { - const data = msgEvent.detail; - const filepath = data.filepath; - const nodeID = parseInt(data.nodeID, 10); - if (Number.isNaN(nodeID)) return false; - - if(data.success && filepath) { - const node = app.graph.getNodeById(nodeID); - if(node !== null && node !== undefined) { - const filepathWidget = node.widgets.find(widget => widget.name === "filepath"); - if(filepathWidget) { - if(filepathWidget.value !== undefined) { - filepathWidget.value = filepath; - } - if(filepathWidget.inputEl) { - filepathWidget.inputEl.value = filepath; - filepathWidget.inputEl.dispatchEvent(new Event('input', { bubbles: true })); - filepathWidget.inputEl.dispatchEvent(new Event('change', { bubbles: true })); - } - } - } - } - return false; -} - -function captionNodeHandler(msgEvent) { - const captionData = msgEvent.detail; - const captionText = captionData.captionText; - const captionNodeID = parseInt(captionData.nodeID); - - if(captionData.success) { - const captionNode = app.graph.getNodeById(captionNodeID); - if(captionNode !== null && captionNode !== undefined) { - // Find the imageCaption widget specifically - const imageCaptionWidget = captionNode.widgets.find(widget => widget.name === "imageCaption"); - if(imageCaptionWidget && imageCaptionWidget.inputEl) { - imageCaptionWidget.inputEl.value = captionText; - } - } - } - return false; -} - -function saveTextHandler(msgEvent) { - const data = msgEvent.detail; - const displayText = data.text; - const nodeID = parseInt(data.nodeID, 10); - if (!data.success || Number.isNaN(nodeID)) return false; - const node = app.graph.getNodeById(nodeID); - if (node === null || node === undefined) return false; - const widgetName = data.widgetName || "text"; - const textWidget = node.widgets.find((w) => w.name === widgetName); - if (textWidget) { - if (textWidget.value !== undefined) { - textWidget.value = displayText; - } - if (textWidget.inputEl) { - textWidget.inputEl.value = displayText; - textWidget.inputEl.dispatchEvent(new Event("input", { bubbles: true })); - textWidget.inputEl.dispatchEvent(new Event("change", { bubbles: true })); - } - } - return false; -} - -function videoTranscriptionHandler(msgEvent) { - const transcriptionData = msgEvent.detail; - const transcriptionText = transcriptionData.transcriptionText; - const transcriptionNodeID = parseInt(transcriptionData.nodeID); - - if(transcriptionData.success) { - const transcriptionNode = app.graph.getNodeById(transcriptionNodeID); - if(transcriptionNode !== null && transcriptionNode !== undefined) { - // Find the prompt widget (where transcription is displayed) - const promptWidget = transcriptionNode.widgets.find(widget => widget.name === "prompt"); - if(promptWidget && promptWidget.inputEl) { - promptWidget.inputEl.value = transcriptionText; - } - } - } - return false; -} - -function videoOutputsHandler(msgEvent) { - const outputData = msgEvent.detail; - const draftId = outputData.draftId || ""; - const videoId = outputData.videoId || ""; - const nodeID = outputData.nodeID; - - if(outputData.success && nodeID !== undefined && nodeID !== null) { - const nodeIdInt = typeof nodeID === 'string' ? parseInt(nodeID) : nodeID; - const outputNode = app.graph.getNodeById(nodeIdInt); - - if(outputNode !== null && outputNode !== undefined) { - const draftIdWidget = outputNode.widgets.find(widget => widget.name === "draftId"); - const videoIdWidget = outputNode.widgets.find(widget => widget.name === "videoId"); - - if(draftIdWidget) { - if(draftIdWidget.value !== undefined) draftIdWidget.value = draftId; - if(draftIdWidget.inputEl) { - draftIdWidget.inputEl.value = draftId; - draftIdWidget.inputEl.dispatchEvent(new Event('input', { bubbles: true })); - draftIdWidget.inputEl.dispatchEvent(new Event('change', { bubbles: true })); - } - } - - if(videoIdWidget) { - if(videoIdWidget.value !== undefined) videoIdWidget.value = videoId; - if(videoIdWidget.inputEl) { - videoIdWidget.inputEl.value = videoId; - videoIdWidget.inputEl.dispatchEvent(new Event('input', { bubbles: true })); - videoIdWidget.inputEl.dispatchEvent(new Event('change', { bubbles: true })); - } - } - - outputNode.setDirtyCanvas(true); - } - } - return false; -} - -function notifyUser(message, type="info", title = "Runware", life = 4.5) { - app.extensionManager.toast.add({ - severity: type, // 'info', 'success', 'warn', 'error' \\ - summary: title, - detail: message, - life: Math.floor(life * 1000) - }); -} - -async function promptEnhanceHandler(e) { - if(e.ctrlKey && e.altKey && e.key.toLowerCase() === 'e') { - const userPrompt = e.target.value.trim(); - if(userPrompt.length <= 1) { - notifyUser("Prompt Is Too Short!", "error", "Runware Prompt Enhancer"); - return; - } else if(userPrompt.length > 300) { - notifyUser("Prompt Must Not Exceed 300 Characters!", "error", "Runware Prompt Enhancer"); - return; - } - const enhanceResults = await runwareLocalAPI.enhancePrompt(userPrompt); - if(enhanceResults.success) { - e.target.value = enhanceResults.enhancedPrompt; - } else { - notifyUser(enhanceResults.error, "error", "Runware Prompt Enhancer"); - } - } -} - -function remNode(node) { - app.graph.remove(node); - app.graph.setDirtyCanvas(true,true); -} - -async function APIKeyHandler(apiManagerNode) { - const widgets = apiManagerNode.widgets; - for(const widget of widgets) { - if(widget.name === "API Key") { - appendWidgetCB(widget, async function(...args) { - if(openDialog) return; - const apiKey = args[0].trim(); - if(apiKey.length < 30) { - notifyUser("Invalid API Key Set, Please Try Again!", "error", "Runware API Manager"); - return; - } - const setAPIKeyResults = await runwareLocalAPI.setAPIKey(apiKey); - if(setAPIKeyResults.success) { - remNode(apiManagerNode); - notifyUser("API Key Set Successfully!", "success", "Runware API Manager"); - } else { - notifyUser(setAPIKeyResults.error, "error", "Runware API Manager"); - } - }); - } else if(widget.name === "Max Timeout") { - if(lastTimeout) widget.value = lastTimeout; - appendWidgetCB(widget, async function(...args) { - const maxTimeout = parseInt(args[0]); - if(isNaN(maxTimeout) || maxTimeout < TIMEOUT_RANGE.min || maxTimeout > TIMEOUT_RANGE.max) { - notifyUser(`Invalid Timeout Value! Must be between ${TIMEOUT_RANGE.min} and ${TIMEOUT_RANGE.max} seconds.`, "error", "Runware API Manager"); - widget.value = lastTimeout || TIMEOUT_RANGE.default; - return; - } - const setTimeoutResults = await runwareLocalAPI.setTimeout(maxTimeout); - if(setTimeoutResults.success) { - notifyUser("Timeout Set Successfully!", "success", "Runware API Manager"); - lastTimeout = maxTimeout; - } else { - widget.value = lastTimeout || TIMEOUT_RANGE.default; - notifyUser(setTimeoutResults.error, "error", "Runware API Manager"); - } - }); - } else if(widget.name === "Image Output Format") { - if(lastOutputFormat) widget.value = lastOutputFormat; - appendWidgetCB(widget, async function(...args) { - const outputFormat = args[0].trim().toUpperCase(); - const setFormatResults = await runwareLocalAPI.setOutputFormat(outputFormat); - if(setFormatResults.success) { - notifyUser("Default Image Output Format Set Successfully!", "success", "Runware API Manager"); - lastOutputFormat = outputFormat; - } else { - notifyUser(setFormatResults.error, "error", "Runware API Manager"); - } - }); - } else if(widget.name === "Image Output Quality") { - if(lastOutputQuality) widget.value = lastOutputQuality; - appendWidgetCB(widget, async function(...args) { - const outputQuality = parseInt(args[0]); - if(isNaN(outputQuality) || outputQuality < OUTPUT_QUALITY_RANGE.min || outputQuality > OUTPUT_QUALITY_RANGE.max) { - notifyUser(`Invalid Quality Value! Must be between ${OUTPUT_QUALITY_RANGE.min} and ${OUTPUT_QUALITY_RANGE.max}.`, "error", "Runware API Manager"); - widget.value = lastOutputQuality || OUTPUT_QUALITY_RANGE.default; - return; - } - const setQualityResults = await runwareLocalAPI.setOutputQuality(outputQuality); - if(setQualityResults.success) { - notifyUser("Default Image Output Quality Set Successfully!", "success", "Runware API Manager"); - lastOutputQuality = outputQuality; - } else { - widget.value = lastOutputQuality || OUTPUT_QUALITY_RANGE.default; - notifyUser(setQualityResults.error, "error", "Runware API Manager"); - } - }); - } else if(widget.name === "Enable Images Caching") { - if(lastEnableImagesCaching !== null) widget.value = lastEnableImagesCaching; - appendWidgetCB(widget, async function(...args) { - const enableCaching = args[0]; - const setCachingResults = await runwareLocalAPI.setEnableImagesCaching(enableCaching); - if(setCachingResults.success) { - notifyUser("Image Caching Setting Updated Successfully!", "success", "Runware API Manager"); - lastEnableImagesCaching = enableCaching; - } else { - widget.value = lastEnableImagesCaching; - notifyUser(setCachingResults.error, "error", "Runware API Manager"); - } - }); - } else if(widget.name === "Min Image Cache Size") { - if(lastMinImageCacheSize !== false) widget.value = lastMinImageCacheSize; - appendWidgetCB(widget, async function(...args) { - const minCacheSize = parseFloat(args[0]); - if(isNaN(minCacheSize) || minCacheSize < CACHE_SIZE_RANGE.min || minCacheSize > CACHE_SIZE_RANGE.max) { - notifyUser(`Invalid cache size! Must be between ${CACHE_SIZE_RANGE.min} KB and ${CACHE_SIZE_RANGE.max} KB.`, "error", "Runware API Manager"); - widget.value = lastMinImageCacheSize || CACHE_SIZE_RANGE.default; - return; - } - const setCacheSizeResults = await runwareLocalAPI.setMinImageCacheSize(minCacheSize); - if(setCacheSizeResults.success) { - notifyUser("Minimum Image Cache Size Updated Successfully!", "success", "Runware API Manager"); - lastMinImageCacheSize = minCacheSize; - } else { - widget.value = lastMinImageCacheSize || CACHE_SIZE_RANGE.default; - notifyUser(setCacheSizeResults.error, "error", "Runware API Manager"); - } - }); - } - } -} - -function addTriggerWords(prompt, triggerWords) { - if (!triggerWords?.trim()) return prompt; - const cleanedTriggerWords = triggerWords - .trim() - .replace(/,\s*$/, '') - .split(',') - .map(word => word.trim()) - .filter(word => word.length); - if (!prompt?.trim()) return cleanedTriggerWords.join(', '); - const wordsToAdd = cleanedTriggerWords.filter(word => - !new RegExp(`\\b${word}\\b`, 'i').test(prompt) - ); - return wordsToAdd.length - ? `${prompt}${prompt.endsWith(',') ? ' ' : ', '}${wordsToAdd.join(', ')}` - : prompt; -} - -function handleCustomErrors(errObj) { - const errData = errObj.detail; - const errCode = errData.errorCode; - if(errCode === 401 && !openDialog) { - const dialog = new comfyAPI.asyncDialog.ComfyAsyncDialog(); - const htmlContent = ` -
-
-

Runware Inference Error

-

Your API Key is Invalid Or Undefined. You Need To Update It.

-
- - -
- - -
-
-
-
- `; - dialog.showModal(htmlContent).then(() => { - openDialog = false; - }); - openDialog = true; - dialog.element.addEventListener('close', () => { - openDialog = false; - }); - - const runwareAPIForm = document.getElementById("runwareAPIKey"); - const apiKeyInput = document.getElementById("apiKey"); - const getAPIKeyBTN = document.getElementById("getAPIKeyBTN"); - const setAPIKeyBTN = document.getElementById("setAPIKeyBTN"); - - getAPIKeyBTN.onclick = (e) => { - e.preventDefault(); - window.open("https://my.runware.ai/keys?utm_source=comfyui&utm_medium=referral&utm_campaign=comfyui_api_key_creation", "_blank"); - }; - - async function authUser(e) { - e.preventDefault(); - e.stopPropagation(); - const apiKey = apiKeyInput.value.trim(); - if(apiKey.length < 30) { - runwareAPIForm.reportValidity(); - return; - // notifyUser("Invalid API Key Set, Please Try Again!", "error", "Runware API Manager"); - // return; - } else { - const setAPIKeyResults = await runwareLocalAPI.setAPIKey(apiKey); - if(setAPIKeyResults.success) { - dialog.close(); - openDialog = false; - notifyUser("API Key Set Successfully!", "success", "Runware API Manager"); - } else { - notifyUser(setAPIKeyResults.error, "error", "Runware API Manager"); - } - } - }; - - setAPIKeyBTN.onclick = async (e) => { - authUser(e); - }; - - runwareAPIForm.onsubmit = async (e) => { - authUser(e); - }; - } -} - -function appendWidgetCB(node, newCB) { - const oldNodeCB = node.callback; - if(typeof oldNodeCB === "function") { - node.callback = function(...args) { - oldNodeCB?.apply(this, args); - newCB?.apply(this, args); - } - } else { - node.callback = newCB; - } -} - -async function syncDimensionsNodeHandler(node, dimensionsWidget) { - const nodeWidgets = node.widgets; - let widthWidget = false, heightWidget = false; - for(const nodeWidget of nodeWidgets) { - const widgetName = nodeWidget.name; - const widgetType = nodeWidget.type; - if(widgetName === "width" && widgetType === "number") widthWidget = nodeWidget; - if(widgetName === "height" && widgetType === "number") heightWidget = nodeWidget; - } - - appendWidgetCB(dimensionsWidget, function(...args) { - const chosenDimension = args[0]; - if(chosenDimension === "Custom" || chosenDimension === "None") return; - const dimensionValue = DEFAULT_DIMENSIONS_LIST[chosenDimension]; - if(!dimensionValue) return; - const [width, height] = dimensionValue.split("x"); - widthWidget.callback(width, "customSetOperation"); - heightWidget.callback(height, "customSetOperation"); - }); - - if(widthWidget !== false) { - appendWidgetCB(widthWidget, function(...args) { - if(args[1] === "customSetOperation") return; - dimensionsWidget.value = "Custom"; - }); - } - - if(heightWidget !== false) { - appendWidgetCB(heightWidget, function(...args) { - if(args[1] === "customSetOperation") return; - dimensionsWidget.value = "Custom"; - }); - } -} - -const shortenAirCode = input => !input || !input.startsWith('urn:air:') ? input : input.match(/urn:air:.*?:.*?(civitai:\d+@\d+)$/)?.[1] || input; - -async function searchNodeHandler(searchNode, searchInputWidget) { - const searchNodeWidgets = searchNode.widgets; - let modelArchWidget = false, modelTypeWidget = false, modelListWidget = false, - defaultWidgetValues = {}, triggerWordsList = { - "civitai:58390@62833": "", "civitai:82098@87153": "", "civitai:122359@135867": "", - "civitai:14171@16677": "mix4", "civitai:13941@16576": "", "civitai:25995@32988": "full body, chibi" - }, embeddingTriggerWordsList = { - "civitai:7808@9208": "easynegative", "civitai:4629@5637": "ng_deepnegative_v1_75t", - "civitai:56519@60938": "negative_hand", "civitai:72437@77169": "BadDream", - "civitai:11772@25820": "verybadimagenegative_v1.3", "civitai:71961@94057": "FastNegativeV2", - }; - let isLora = false, isControlNet = false, isEmbedding = false, isVAE = false, modelTypeValue = false; - if(searchNode.comfyClass === RUNWARE_NODE_TYPES.LORASEARCH) isLora = true; - if(searchNode.comfyClass === RUNWARE_NODE_TYPES.CONTROLNET) isControlNet = true; - if(searchNode.comfyClass === RUNWARE_NODE_TYPES.EMBEDDING) isEmbedding = true; - if(searchNode.comfyClass === RUNWARE_NODE_TYPES.VAE) isVAE = true; - - for(const searchWidget of searchNodeWidgets) { - const widgetName = searchWidget.name; - const widgetType = searchWidget.type; - if(widgetName === "Model Architecture" && widgetType === "combo") { - modelArchWidget = searchWidget; - defaultWidgetValues["modelArch"] = searchWidget.options.values; - } - if(MODEL_TYPES_TERMS.includes(widgetName) && widgetType === "combo") { - modelTypeWidget = searchWidget; - defaultWidgetValues["modelType"] = searchWidget.options.values; - } - if(MODEL_LIST_TERMS.includes(widgetName) && widgetType === "combo") { - modelListWidget = searchWidget; - defaultWidgetValues["modelList"] = searchWidget.options.values; - } - } - - function resetValues() { - if(modelArchWidget) { - modelArchWidget.options.values = defaultWidgetValues["modelArch"]; - modelArchWidget.value = defaultWidgetValues["modelArch"][0]; - } - if(modelTypeWidget) { - modelTypeWidget.options.values = defaultWidgetValues["modelType"]; - modelTypeWidget.value = defaultWidgetValues["modelType"][0]; - } - if(modelListWidget) { - modelListWidget.options.values = defaultWidgetValues["modelList"]; - modelListWidget.value = defaultWidgetValues["modelList"][0]; - } - } - - async function searchModels(exactQuery = null, returnOutput = false) { - let searchQuery; - if(exactQuery) { - searchQuery = exactQuery; - } else { - searchQuery = searchInputWidget.value.trim(); - } - searchQuery = shortenAirCode(searchQuery); - const modelArchValue = DEFAULT_MODELS_ARCH_LIST[modelArchWidget.value]; - if(isControlNet) { - modelTypeValue = DEFAULT_CONTROLNET_CONDITIONING_LIST[modelTypeWidget.value]; - } else { - if(isEmbedding) { - modelTypeValue = "embeddings"; - } else if(isVAE) { - modelTypeValue = "vae"; - } else { - modelTypeValue = modelTypeWidget.value.toLowerCase().replace("model", "").trim(); - } - } - - let modelSearchResults = null; - if(isControlNet) { - modelSearchResults = await runwareLocalAPI.modelSearch(searchQuery, modelArchValue, "", "controlnet", modelTypeValue); - } else if(isLora || isEmbedding || isVAE) { - modelSearchResults = await runwareLocalAPI.modelSearch(searchQuery, modelArchValue, "", modelTypeValue); - } else { - modelSearchResults = await runwareLocalAPI.modelSearch(searchQuery, modelArchValue, modelTypeValue); - } - - if(modelSearchResults.success) { - const modelListArray = []; - modelSearchResults.modelList.forEach(modelObj => { - if(isLora) triggerWordsList[modelObj.air] = modelObj.positiveTriggerWords?.trim() || false; - if(isEmbedding) embeddingTriggerWordsList[modelObj.air] = modelObj.positiveTriggerWords?.trim() || false; - modelListArray.push(`${modelObj.air} (${modelObj.name} ${modelObj.version})`); - }); - - if(exactQuery) { - const extraSearch = await searchModels(null, true); - if(extraSearch) { - const newModelList = [...new Set([...modelListArray, ...extraSearch])]; - modelListWidget.options.values = newModelList; - return; - } - } - - if(returnOutput) return modelListArray; - modelListWidget.options.values = modelListArray; - modelListWidget.value = modelListArray[0]; - } else { - if(returnOutput) return false; - if(exactQuery) { - notifyUser("Failed To Load Workflow's Model List Value!", "error", "Runware Search"); - return; - } - notifyUser(modelSearchResults.error, "error", "Runware Search"); - } - } - - function findTargetWidget(currentNode, targetWidgetName, depth = 1) { - try { - if(depth < 0) return false; - const nodeOutputs = currentNode.outputs; - if(nodeOutputs.length === 0) return false; - const outputLinks = nodeOutputs[0].links; - if(outputLinks.length === 0) return false; - for(const linkID of outputLinks) { - const linkInfo = app.graph.links[linkID]; - const linkNodeID = linkInfo.target_id; - if(!linkNodeID) continue; - const targetNode = app.graph.getNodeById(linkNodeID); - let widgetFound = false; - if(targetNode.widgets !== undefined && targetNode.widgets.length > 0){ - widgetFound = targetNode.widgets.find(widget => widget.name === targetWidgetName) || false; - } - if(widgetFound) { - return widgetFound; - } else { - return findTargetWidget(targetNode, targetWidgetName, depth - 1); - } - } - } catch(e) { - return false; - } - return false; - } - - if(isLora) { - const runwareButton = document.createElement("button"); - runwareButton.textContent = "Add Lora To Prompt"; - runwareButton.style = "max-height: 50px; background-color: #333; color: #ccc;"; - searchNode.addDOMWidget("addLora", "custom", runwareButton, { - selectOn: ['focus', 'click'], - }); - - runwareButton.addEventListener("click", async () => { - const chosenLora = modelListWidget.value.split(" ")[0]; - if(!triggerWordsList.hasOwnProperty(chosenLora)) return; - const triggerWords = triggerWordsList[chosenLora]; - if(triggerWords.length > 0) { - const positivePromptWidget = findTargetWidget(searchNode, "positivePrompt"); - if(!positivePromptWidget) { - notifyUser("Lora Node Is Not Linked To Any Runware Inference Node!", "error", "Runware Lora Connector"); - return; - } - const positivePromptWithTrigger = addTriggerWords(positivePromptWidget.value, triggerWords); - if(positivePromptWidget.value === positivePromptWithTrigger) { - notifyUser("Trigger Words Already Exists", "info", "Runware Lora Connector"); - return; - } - positivePromptWidget.value = positivePromptWithTrigger; - notifyUser("Trigger Words Added Successfully!", "success", "Runware Lora Connector"); - } else { - notifyUser("No Trigger Words Found For This Lora!", "warn", "Runware Lora Connector"); - } - }); - } else if(isEmbedding) { - const runwareButton = document.createElement("button"); - runwareButton.textContent = "Add Embedding To Negative Prompt"; - runwareButton.style = "max-height: 50px; background-color: #333; color: #ccc;"; - searchNode.addDOMWidget("addEmbedding", "custom", runwareButton, { - selectOn: ['focus', 'click'], - }); - - runwareButton.addEventListener("click", async () => { - const chosenEmbedding = modelListWidget.value.split(" ")[0]; - if (!embeddingTriggerWordsList.hasOwnProperty(chosenEmbedding)) return; - const triggerWords = embeddingTriggerWordsList[chosenEmbedding]; - if(triggerWords.length > 0) { - const negativePromptWidget = findTargetWidget(searchNode, "negativePrompt"); - if(!negativePromptWidget) { - notifyUser("Embedding Node Is Not Linked To Any Runware Inference Node!", "error", "Runware Embedding Connector"); - return; - } - const negativePromptWithTrigger = addTriggerWords(negativePromptWidget.value, triggerWords); - if(negativePromptWidget.value === negativePromptWithTrigger) { - notifyUser("Trigger Words Already Exists", "info", "Runware Embedding Connector"); - return; - } - negativePromptWidget.value = negativePromptWithTrigger; - notifyUser("Trigger Words Added Successfully!", "success", "Runware Embedding Connector"); - } else { - notifyUser("No Trigger Words Found For This Embedding!", "warn", "Runware Embedding Connector"); - } - }); - } - - appendWidgetCB(searchInputWidget, async function(...args) { - let searchQuery = args[0].trim(); - const shortenSearchQuery = shortenAirCode(searchQuery); - if(searchQuery !== shortenSearchQuery) { - searchQuery = shortenSearchQuery; - searchInputWidget.value = searchQuery; - } - if(searchQuery.length === 0) { - resetValues(); - } else if(searchQuery.length < 2) { - notifyUser("Invalid Search Value, Search Query must be at least 2 characters!", "error", "Runware Search"); - return; - } else { - await searchModels(); - } - }); - - appendWidgetCB(modelArchWidget, async function(...args) { - await searchModels(); - }); - - if(!isVAE && !isEmbedding) { - appendWidgetCB(modelTypeWidget, async function(...args) { - await searchModels(); - }); - } - - appendWidgetCB(searchNode, async function(...args) { - try { - let modelListValues = modelListWidget.options.values; - if(modelListValues.length <= 0) return; - modelListValues = modelListValues.map(model => model.split(" ")[0]); - const modelListCRValue = modelListWidget.value.split(" ")[0]; - if(!modelListValues.includes(modelListCRValue)) { - searchModels(modelListCRValue); - } - } catch(e) {} - }); -} - -function toggleWidgetEnabled(widget, enabled, node) { - if (!widget || !widget.name) return; - - // Use the same simple approach as videoInferenceDimensionsHandler - // Set widget disabled property - widget.disabled = !enabled; - - // Disable/enable widgets using inputEl if available (same pattern as videoInferenceDimensionsHandler) - if (widget.inputEl) { - widget.inputEl.disabled = !enabled; - widget.inputEl.style.opacity = enabled ? "1" : "0.5"; - widget.inputEl.style.cursor = enabled ? "text" : "not-allowed"; - widget.inputEl.readOnly = !enabled; - } - - // For combo/dropdown widgets, also try to disable the options element - if (widget.options && widget.options.element) { - widget.options.element.disabled = !enabled; - widget.options.element.style.opacity = enabled ? "1" : "0.5"; - widget.options.element.style.pointerEvents = enabled ? "auto" : "none"; - } - - // Fallback: try to find inputs via DOM if inputEl is not available (same as videoInferenceDimensionsHandler) - if (!widget.inputEl && node) { - const nodeElement = node.htmlElements?.widgetsContainer || node.htmlElements; - if (nodeElement) { - const input = nodeElement.querySelector(`input[name="${widget.name}"], textarea[name="${widget.name}"], select[name="${widget.name}"]`); - 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"; - } - } - } - } -} - -function videoUpscalerToggleHandler(videoUpscalerNode) { - if (!videoUpscalerNode?.widgets) return; - - const useUpscaleFactorWidget = videoUpscalerNode.widgets.find(w => w && w.name === "useUpscaleFactor"); - const upscaleFactorWidget = videoUpscalerNode.widgets.find(w => w && w.name === "upscaleFactor"); - const useFpsWidget = videoUpscalerNode.widgets.find(w => w && w.name === "useFps"); - const fpsWidget = videoUpscalerNode.widgets.find(w => w && w.name === "fps"); - const useDimensionWidget = videoUpscalerNode.widgets.find(w => w && w.name === "useDimension"); - const widthWidget = videoUpscalerNode.widgets.find(w => w && w.name === "width"); - const heightWidget = videoUpscalerNode.widgets.find(w => w && w.name === "height"); - - function applyToggleState() { - if (useUpscaleFactorWidget && upscaleFactorWidget) { - const enabled = useUpscaleFactorWidget.value === true; - toggleWidgetEnabled(upscaleFactorWidget, enabled, videoUpscalerNode); - } - - if (useFpsWidget && fpsWidget) { - const enabled = useFpsWidget.value === true; - toggleWidgetEnabled(fpsWidget, enabled, videoUpscalerNode); - } - - if (useDimensionWidget && widthWidget && heightWidget) { - const enabled = useDimensionWidget.value === "custom"; - toggleWidgetEnabled(widthWidget, enabled, videoUpscalerNode); - toggleWidgetEnabled(heightWidget, enabled, videoUpscalerNode); - } - - videoUpscalerNode.setDirtyCanvas(true); - } - - // Initialize state once widgets are rendered - setTimeout(applyToggleState, 100); - - if (useUpscaleFactorWidget) { - appendWidgetCB(useUpscaleFactorWidget, () => { - setTimeout(applyToggleState, 50); - }); - } - if (useFpsWidget) { - appendWidgetCB(useFpsWidget, () => { - setTimeout(applyToggleState, 50); - }); - } - if (useDimensionWidget) { - appendWidgetCB(useDimensionWidget, () => { - setTimeout(applyToggleState, 50); - }); - } -} - -function useParameterToggleHandler(node) { - // Prevent double registration - if (node._useParameterToggleHandlerRegistered) return; - node._useParameterToggleHandlerRegistered = true; - - // Define explicit mappings: "useParameterName" -> ["parameter1", "parameter2", ...] - const parameterMappings = { - // Image Inference - "useSteps": ["steps"], - "useSeed": ["seed"], - "useCFGScale": ["cfgScale"], // Image inference uses lowercase cfgScale - "useScheduler": ["scheduler"], - "useClipSkip": ["clipSkip"], - "useUpscaleFactor": ["upscaleFactor"], - - // Video Inference - "useCustomDimensions": ["width", "height"], // Note: Also handled separately in videoInferenceDimensionsHandler - "useDuration": ["duration"], - "useFps": ["fps"], - "useSchedulers": ["scheduler"], - "useCFGScale": ["cfgScale"], - "useTtl": ["ttl"], - // useSteps and useSeed are same as image inference, handled by fallback - - // Upscaler specific mappings (override for nodes that have CFGScale with capital C) - "usePrompts": ["positivePrompt", "negativePrompt"], - "useClarityParams": ["controlNetWeight", "strength", "scheduler"], - "useCCSRParams": ["colorFix", "tileDiffusion"], - "useLatentParams": ["clipSkip"], - - // Audio Inference - "usePositivePrompt": ["positivePrompt"], - "useSeed": ["seed"], - "useSteps": ["steps"], - "useStrength": ["strength"], - - // Accelerator Options - "useCacheDistance": ["cacheDistance"], - "useTeaCacheDistance": ["teaCacheDistance"], - "useDeepCacheOptions": ["deepCacheInterval", "deepCacheBranchId"], - "useCacheSteps": ["cacheStartStep", "cacheEndStep"], - "useCachePercentageSteps": ["cacheStartStepPercentage", "cacheEndStepPercentage"], - "useCacheMaxConsecutiveSteps": ["cacheMaxConsecutiveSteps"], - - // Bytedance Provider Settings - "useCameraFixed": ["cameraFixed"], - "useMaxSequentialImages": ["maxSequentialImages"], - "useFastMode": ["fastMode"], - - // OpenAI Provider Settings (these are dropdowns, not booleans, but handle them anyway) - "useBackground": ["background"], - "useStyle": ["style"], - - // Mask Margin - "Mask Margin": ["maskMargin"], - }; - - // Node-specific overrides for parameters that have different names in different nodes - // Format: nodeClass -> { "useParam": ["param1", "param2"] } - const nodeSpecificMappings = { - // Upscaler uses CFGScale (capital C) instead of cfgScale - [RUNWARE_NODE_TYPES.UPSCALER]: { - "useCFGScale": ["CFGScale"], - }, - // Audio Inference uses CFGScale (capital C) - [RUNWARE_NODE_TYPES.AUDIOINFERENCE]: { - "useCFGScale": ["CFGScale"], - }, - }; - - // Wait for widgets to be ready - function initializeHandler() { - if (!node.widgets || node.widgets.length === 0) { - setTimeout(initializeHandler, 100); - return; - } - - // Find all "use" widgets and their corresponding parameter widgets upfront (like videoInferenceDimensionsHandler does) - const togglePairs = []; - - // Find all "use" widgets - node.widgets.forEach(widget => { - if (!widget || !widget.name) return; - - const isUseWidget = widget.name.startsWith("use") && (widget.type === "BOOLEAN" || widget.type === "COMBO"); - const isMaskMargin = widget.name === "Mask Margin" && widget.type === "BOOLEAN"; - - if (!isUseWidget && !isMaskMargin) return; - - const useParamName = widget.name; - - // Get corresponding parameters - check node-specific mappings first, then general mappings - let paramNames = []; - const nodeClass = node.comfyClass; - if (nodeClass && nodeSpecificMappings[nodeClass] && nodeSpecificMappings[nodeClass][useParamName]) { - paramNames = nodeSpecificMappings[nodeClass][useParamName]; - } else { - paramNames = parameterMappings[useParamName] || []; - } - - // Handle special case: remove "use" prefix and lowercase first letter - if (paramNames.length === 0) { - const paramName = useParamName.replace(/^use/, "").replace(/^[A-Z]/, (match) => match.toLowerCase()); - paramNames = [paramName]; - } - - // Find the actual parameter widgets - const paramWidgets = []; - paramNames.forEach(paramName => { - const paramWidget = node.widgets.find(w => w && w.name === paramName); - if (paramWidget) { - paramWidgets.push(paramWidget); - } else { - // If mapped parameter doesn't exist, try fallback auto-detection - const fallbackParamName = useParamName.replace(/^use/, "").replace(/^[A-Z]/, (match) => match.toLowerCase()); - if (fallbackParamName !== paramName) { - const fallbackWidget = node.widgets.find(w => w && w.name === fallbackParamName); - if (fallbackWidget) { - paramWidgets.push(fallbackWidget); - } - } - } - }); - - if (paramWidgets.length > 0) { - togglePairs.push({ - useWidget: widget, - paramWidgets: paramWidgets - }); - } - }); - - // Create toggle functions for each pair (like toggleDimensionsEnabled in videoInferenceDimensionsHandler) - togglePairs.forEach(pair => { - const { useWidget, paramWidgets } = pair; - - function toggleEnabled() { - // Determine if enabled based on widget type - let enabled = false; - if (useWidget.type === "BOOLEAN") { - enabled = useWidget.value === true; - } else if (useWidget.type === "COMBO") { - enabled = useWidget.value === "enable" || useWidget.value === "Enable"; - } - - // Apply to each parameter widget (exactly like toggleDimensionsEnabled does) - paramWidgets.forEach(paramWidget => { - 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; - - // Fallback: try to find inputs via DOM if inputEl is not available - if (!paramWidget.inputEl) { - const nodeElement = node.htmlElements?.widgetsContainer || node.htmlElements; - if (nodeElement) { - const input = nodeElement.querySelector(`input[name="${paramWidget.name}"], textarea[name="${paramWidget.name}"], select[name="${paramWidget.name}"]`); - 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"; - } - } - } - } - }); - - node.setDirtyCanvas(true); - } - - // Set up callback (exactly like videoInferenceDimensionsHandler does) - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - // Initial call to set initial state - setTimeout(toggleEnabled, 50); - }); - } - - // Start initialization - setTimeout(initializeHandler, 200); -} - -function upscalerToggleHandler(upscalerNode) { - // Find all "use" parameter widgets for Upscaler - const useUpscaleFactorWidget = upscalerNode.widgets.find(w => w.name === "useUpscaleFactor"); - const upscaleFactorWidget = upscalerNode.widgets.find(w => w.name === "upscaleFactor"); - const useStepsWidget = upscalerNode.widgets.find(w => w.name === "useSteps"); - const stepsWidget = upscalerNode.widgets.find(w => w.name === "steps"); - const useSeedWidget = upscalerNode.widgets.find(w => w.name === "useSeed"); - const seedWidget = upscalerNode.widgets.find(w => w.name === "seed"); - const useCFGScaleWidget = upscalerNode.widgets.find(w => w.name === "useCFGScale"); - const cfgScaleWidget = upscalerNode.widgets.find(w => w.name === "CFGScale"); - const usePromptsWidget = upscalerNode.widgets.find(w => w.name === "usePrompts"); - const positivePromptWidget = upscalerNode.widgets.find(w => w.name === "positivePrompt"); - const negativePromptWidget = upscalerNode.widgets.find(w => w.name === "negativePrompt"); - const useClarityParamsWidget = upscalerNode.widgets.find(w => w.name === "useClarityParams"); - const controlNetWeightWidget = upscalerNode.widgets.find(w => w.name === "controlNetWeight"); - const strengthWidget = upscalerNode.widgets.find(w => w.name === "strength"); - const schedulerWidget = upscalerNode.widgets.find(w => w.name === "scheduler"); - const useCCSRParamsWidget = upscalerNode.widgets.find(w => w.name === "useCCSRParams"); - const colorFixWidget = upscalerNode.widgets.find(w => w.name === "colorFix"); - const tileDiffusionWidget = upscalerNode.widgets.find(w => w.name === "tileDiffusion"); - const useLatentParamsWidget = upscalerNode.widgets.find(w => w.name === "useLatentParams"); - const clipSkipWidget = upscalerNode.widgets.find(w => w.name === "clipSkip"); - - // Helper function to toggle widget enabled state (exact same pattern) - function toggleWidgetState(useWidget, paramWidgets, paramNames) { - if (!useWidget || !paramWidgets || paramWidgets.length === 0) return; - - function toggleEnabled() { - const enabled = useWidget.value === true; - - // Apply to each parameter widget - paramWidgets.forEach((paramWidget, idx) => { - if (!paramWidget) return; - - 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; - - // Fallback: try to find inputs via DOM if inputEl is not available - if (!paramWidget.inputEl) { - const nodeElement = upscalerNode.htmlElements?.widgetsContainer || upscalerNode.htmlElements; - if (nodeElement && paramNames[idx]) { - const input = nodeElement.querySelector(`input[name="${paramNames[idx]}"], textarea[name="${paramNames[idx]}"], select[name="${paramNames[idx]}"]`); - 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"; - } - } - } - } - }); - - upscalerNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - // Set up all toggle handlers - if (useUpscaleFactorWidget && upscaleFactorWidget) { - toggleWidgetState(useUpscaleFactorWidget, [upscaleFactorWidget], ["upscaleFactor"]); - } - - if (useStepsWidget && stepsWidget) { - toggleWidgetState(useStepsWidget, [stepsWidget], ["steps"]); - } - - if (useSeedWidget && seedWidget) { - toggleWidgetState(useSeedWidget, [seedWidget], ["seed"]); - } - - if (useCFGScaleWidget && cfgScaleWidget) { - toggleWidgetState(useCFGScaleWidget, [cfgScaleWidget], ["CFGScale"]); - } - - if (usePromptsWidget && positivePromptWidget && negativePromptWidget) { - toggleWidgetState(usePromptsWidget, [positivePromptWidget, negativePromptWidget], ["positivePrompt", "negativePrompt"]); - } - - if (useClarityParamsWidget && controlNetWeightWidget && strengthWidget && schedulerWidget) { - toggleWidgetState(useClarityParamsWidget, [controlNetWeightWidget, strengthWidget, schedulerWidget], ["controlNetWeight", "strength", "scheduler"]); - } - - if (useCCSRParamsWidget && colorFixWidget && tileDiffusionWidget) { - toggleWidgetState(useCCSRParamsWidget, [colorFixWidget, tileDiffusionWidget], ["colorFix", "tileDiffusion"]); - } - - if (useLatentParamsWidget && clipSkipWidget) { - toggleWidgetState(useLatentParamsWidget, [clipSkipWidget], ["clipSkip"]); - } - - const useTargetMegapixelsWidget = upscalerNode.widgets.find(w => w.name === "useTargetMegapixels"); - const targetMegapixelsWidget = upscalerNode.widgets.find(w => w.name === "targetMegapixels"); - if (useTargetMegapixelsWidget && targetMegapixelsWidget) { - toggleWidgetState(useTargetMegapixelsWidget, [targetMegapixelsWidget], ["targetMegapixels"]); - } -} - -function imageUpscalerSettingsToggleHandler(settingsNode) { - const useEnhanceDetailsWidget = settingsNode.widgets.find(w => w.name === "useEnhanceDetails"); - const enhanceDetailsWidget = settingsNode.widgets.find(w => w.name === "enhanceDetails"); - const useRealismWidget = settingsNode.widgets.find(w => w.name === "useRealism"); - const realismWidget = settingsNode.widgets.find(w => w.name === "realism"); - - 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 ? "pointer" : "not-allowed"; - } - paramWidget.disabled = !enabled; - - if (!paramWidget.inputEl) { - const nodeElement = settingsNode.htmlElements?.widgetsContainer || settingsNode.htmlElements; - if (nodeElement && paramName) { - 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 ? "pointer" : "not-allowed"; - } - } - } - - settingsNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - if (useEnhanceDetailsWidget && enhanceDetailsWidget) { - toggleWidgetState(useEnhanceDetailsWidget, enhanceDetailsWidget, "enhanceDetails"); - } - if (useRealismWidget && realismWidget) { - toggleWidgetState(useRealismWidget, realismWidget, "realism"); - } -} - -function audioInferenceToggleHandler(audioInferenceNode) { - // Find all "use" parameter widgets for Audio Inference - const usePositivePromptWidget = audioInferenceNode.widgets.find(w => w.name === "usePositivePrompt"); - const positivePromptWidget = audioInferenceNode.widgets.find(w => w.name === "positivePrompt"); - const useDurationWidget = audioInferenceNode.widgets.find(w => w.name === "useDuration"); - const durationWidget = audioInferenceNode.widgets.find(w => w.name === "duration"); - const useSampleRateWidget = audioInferenceNode.widgets.find(w => w.name === "useSampleRate"); - const sampleRateWidget = audioInferenceNode.widgets.find(w => w.name === "sampleRate"); - const useBitrateWidget = audioInferenceNode.widgets.find(w => w.name === "useBitrate"); - const bitrateWidget = audioInferenceNode.widgets.find(w => w.name === "bitrate"); - const useSeedWidget = audioInferenceNode.widgets.find(w => w.name === "useSeed"); - const seedWidget = audioInferenceNode.widgets.find(w => w.name === "seed"); - const useStepsWidget = audioInferenceNode.widgets.find(w => w.name === "useSteps"); - const stepsWidget = audioInferenceNode.widgets.find(w => w.name === "steps"); - const useStrengthWidget = audioInferenceNode.widgets.find(w => w.name === "useStrength"); - const strengthWidget = audioInferenceNode.widgets.find(w => w.name === "strength"); - const useCFGScaleWidget = audioInferenceNode.widgets.find(w => w.name === "useCFGScale"); - const CFGScaleWidget = audioInferenceNode.widgets.find(w => w.name === "CFGScale"); - const useChannelsWidget = audioInferenceNode.widgets.find(w => w.name === "useChannels"); - const channelsWidget = audioInferenceNode.widgets.find(w => w.name === "channels"); - - // Helper function to toggle widget enabled state (exact same pattern) - 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 = audioInferenceNode.htmlElements?.widgetsContainer || audioInferenceNode.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"; - } - } - } - } - - audioInferenceNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - // Set up all toggle handlers - if (usePositivePromptWidget && positivePromptWidget) { - toggleWidgetState(usePositivePromptWidget, positivePromptWidget, "positivePrompt"); - } - - if (useDurationWidget && durationWidget) { - toggleWidgetState(useDurationWidget, durationWidget, "duration"); - } - - if (useSampleRateWidget && sampleRateWidget) { - toggleWidgetState(useSampleRateWidget, sampleRateWidget, "sampleRate"); - } - - if (useBitrateWidget && bitrateWidget) { - toggleWidgetState(useBitrateWidget, bitrateWidget, "bitrate"); - } - - if (useSeedWidget && seedWidget) { - toggleWidgetState(useSeedWidget, seedWidget, "seed"); - } - - if (useStepsWidget && stepsWidget) { - toggleWidgetState(useStepsWidget, stepsWidget, "steps"); - } - - if (useStrengthWidget && strengthWidget) { - toggleWidgetState(useStrengthWidget, strengthWidget, "strength"); - } - - if (useCFGScaleWidget && CFGScaleWidget) { - toggleWidgetState(useCFGScaleWidget, CFGScaleWidget, "CFGScale"); - } - - if (useChannelsWidget && channelsWidget) { - toggleWidgetState(useChannelsWidget, channelsWidget, "channels"); - } -} - -function audioSettingsToggleHandler(settingsNode) { - if (!settingsNode?.widgets) return; - - const useTemperatureWidget = settingsNode.widgets.find(w => w && w.name === "useTemperature"); - const temperatureWidget = settingsNode.widgets.find(w => w && w.name === "temperature"); - const useAudioTemperatureWidget = settingsNode.widgets.find(w => w && w.name === "useAudioTemperature"); - const audioTemperatureWidget = settingsNode.widgets.find(w => w && w.name === "audioTemperature"); - const useTopKWidget = settingsNode.widgets.find(w => w && w.name === "useTopK"); - const topKWidget = settingsNode.widgets.find(w => w && w.name === "topK"); - const useIncludePrefixWidget = settingsNode.widgets.find(w => w && w.name === "useIncludePrefix"); - const includePrefixWidget = settingsNode.widgets.find(w => w && w.name === "includePrefix"); - const useLyricsWidget = settingsNode.widgets.find(w => w && w.name === "useLyrics"); - const lyricsWidget = settingsNode.widgets.find(w => w && w.name === "lyrics"); - const useInstrumentalWidget = settingsNode.widgets.find(w => w && w.name === "useInstrumental"); - const instrumentalWidget = settingsNode.widgets.find(w => w && w.name === "instrumental"); - const useLyricsOptimizerWidget = settingsNode.widgets.find(w => w && w.name === "useLyricsOptimizer"); - const lyricsOptimizerWidget = settingsNode.widgets.find(w => w && w.name === "lyricsOptimizer"); - const useGuidanceTypeWidget = settingsNode.widgets.find(w => w && w.name === "useGuidanceType"); - const guidanceTypeWidget = settingsNode.widgets.find(w => w && w.name === "guidanceType"); - const useLanguageBoostWidget = settingsNode.widgets.find(w => w && w.name === "useLanguageBoost"); - const languageBoostWidget = settingsNode.widgets.find(w => w && w.name === "languageBoost"); - const useTurboWidget = settingsNode.widgets.find(w => w && w.name === "useTurbo"); - const turboWidget = settingsNode.widgets.find(w => w && w.name === "turbo"); - const useTextNormalizationWidget = settingsNode.widgets.find(w => w && w.name === "useTextNormalization"); - const textNormalizationWidget = settingsNode.widgets.find(w => w && w.name === "textNormalization"); - const useBpmWidget = settingsNode.widgets.find(w => w && w.name === "useBpm"); - const bpmWidget = settingsNode.widgets.find(w => w && w.name === "bpm"); - const useKeyScaleWidget = settingsNode.widgets.find(w => w && w.name === "useKeyScale"); - const keyScaleWidget = settingsNode.widgets.find(w => w && w.name === "keyScale"); - const useTimeSignatureWidget = settingsNode.widgets.find(w => w && w.name === "useTimeSignature"); - const timeSignatureWidget = settingsNode.widgets.find(w => w && w.name === "timeSignature"); - const useVocalLanguageWidget = settingsNode.widgets.find(w => w && w.name === "useVocalLanguage"); - const vocalLanguageWidget = settingsNode.widgets.find(w => w && w.name === "vocalLanguage"); - const useCoverConditioningScaleWidget = settingsNode.widgets.find(w => w && w.name === "useCoverConditioningScale"); - const coverConditioningScaleWidget = settingsNode.widgets.find(w => w && w.name === "coverConditioningScale"); - const useRepaintingStartWidget = settingsNode.widgets.find(w => w && w.name === "useRepaintingStart"); - const repaintingStartWidget = settingsNode.widgets.find(w => w && w.name === "repaintingStart"); - const useRepaintingEndWidget = settingsNode.widgets.find(w => w && w.name === "useRepaintingEnd"); - const repaintingEndWidget = settingsNode.widgets.find(w => w && w.name === "repaintingEnd"); - const useXVectorOnlyWidget = settingsNode.widgets.find(w => w && w.name === "useXVectorOnly"); - const xVectorOnlyWidget = settingsNode.widgets.find(w => w && w.name === "xVectorOnly"); - const useMaxNewTokensWidget = settingsNode.widgets.find(w => w && w.name === "useMaxNewTokens"); - const maxNewTokensWidget = settingsNode.widgets.find(w => w && w.name === "maxNewTokens"); - const useTranscriptWidget = settingsNode.widgets.find(w => w && w.name === "useTranscript"); - const transcriptWidget = settingsNode.widgets.find(w => w && w.name === "transcript"); - const useCfgIntervalStartWidget = settingsNode.widgets.find(w => w && w.name === "useCfgIntervalStart"); - const cfgIntervalStartWidget = settingsNode.widgets.find(w => w && w.name === "cfgIntervalStart"); - const useCfgIntervalEndWidget = settingsNode.widgets.find(w => w && w.name === "useCfgIntervalEnd"); - const cfgIntervalEndWidget = settingsNode.widgets.find(w => w && w.name === "cfgIntervalEnd"); - const useNormalizeLoudnessWidget = settingsNode.widgets.find(w => w && w.name === "useNormalizeLoudness"); - const normalizeLoudnessWidget = settingsNode.widgets.find(w => w && w.name === "normalizeLoudness"); - const useTopPWidget = settingsNode.widgets.find(w => w && w.name === "useTopP"); - const topPWidget = settingsNode.widgets.find(w => w && w.name === "topP"); - const useChunkLengthWidget = settingsNode.widgets.find(w => w && w.name === "useChunkLength"); - const chunkLengthWidget = settingsNode.widgets.find(w => w && w.name === "chunkLength"); - const useMinChunkLengthWidget = settingsNode.widgets.find(w => w && w.name === "useMinChunkLength"); - const minChunkLengthWidget = settingsNode.widgets.find(w => w && w.name === "minChunkLength"); - const useNormalizeWidget = settingsNode.widgets.find(w => w && w.name === "useNormalize"); - const normalizeWidget = settingsNode.widgets.find(w => w && w.name === "normalize"); - const useLatencyWidget = settingsNode.widgets.find(w => w && w.name === "useLatency"); - const latencyWidget = settingsNode.widgets.find(w => w && w.name === "latency"); - const useMaxTokensWidget = settingsNode.widgets.find(w => w && w.name === "useMaxTokens"); - const maxTokensWidget = settingsNode.widgets.find(w => w && w.name === "maxTokens"); - const useRepetitionPenaltyWidget = settingsNode.widgets.find(w => w && w.name === "useRepetitionPenalty"); - const repetitionPenaltyWidget = settingsNode.widgets.find(w => w && w.name === "repetitionPenalty"); - const useConditionOnPreviousChunksWidget = settingsNode.widgets.find(w => w && w.name === "useConditionOnPreviousChunks"); - const conditionOnPreviousChunksWidget = settingsNode.widgets.find(w => w && w.name === "conditionOnPreviousChunks"); - const useEarlyStopThresholdWidget = settingsNode.widgets.find(w => w && w.name === "useEarlyStopThreshold"); - const earlyStopThresholdWidget = settingsNode.widgets.find(w => w && w.name === "earlyStopThreshold"); - - function toggleWidgetState(useWidget, paramWidget, paramName) { - if (!useWidget || !paramWidget) return; - function applyState() { - const enabled = useWidget.value === true; - toggleWidgetEnabled(paramWidget, enabled, settingsNode); - 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"; - } - settingsNode.setDirtyCanvas(true); - } - setTimeout(applyState, 100); - appendWidgetCB(useWidget, () => setTimeout(applyState, 50)); - } - - if (useTemperatureWidget && temperatureWidget) toggleWidgetState(useTemperatureWidget, temperatureWidget, "temperature"); - if (useAudioTemperatureWidget && audioTemperatureWidget) toggleWidgetState(useAudioTemperatureWidget, audioTemperatureWidget, "audioTemperature"); - if (useTopKWidget && topKWidget) toggleWidgetState(useTopKWidget, topKWidget, "topK"); - if (useIncludePrefixWidget && includePrefixWidget) toggleWidgetState(useIncludePrefixWidget, includePrefixWidget, "includePrefix"); - if (useLyricsWidget && lyricsWidget) toggleWidgetState(useLyricsWidget, lyricsWidget, "lyrics"); - if (useInstrumentalWidget && instrumentalWidget) toggleWidgetState(useInstrumentalWidget, instrumentalWidget, "instrumental"); - if (useLyricsOptimizerWidget && lyricsOptimizerWidget) toggleWidgetState(useLyricsOptimizerWidget, lyricsOptimizerWidget, "lyricsOptimizer"); - if (useGuidanceTypeWidget && guidanceTypeWidget) toggleWidgetState(useGuidanceTypeWidget, guidanceTypeWidget, "guidanceType"); - if (useLanguageBoostWidget && languageBoostWidget) toggleWidgetState(useLanguageBoostWidget, languageBoostWidget, "languageBoost"); - if (useTurboWidget && turboWidget) toggleWidgetState(useTurboWidget, turboWidget, "turbo"); - if (useTextNormalizationWidget && textNormalizationWidget) toggleWidgetState(useTextNormalizationWidget, textNormalizationWidget, "textNormalization"); - if (useBpmWidget && bpmWidget) toggleWidgetState(useBpmWidget, bpmWidget, "bpm"); - if (useKeyScaleWidget && keyScaleWidget) toggleWidgetState(useKeyScaleWidget, keyScaleWidget, "keyScale"); - if (useTimeSignatureWidget && timeSignatureWidget) toggleWidgetState(useTimeSignatureWidget, timeSignatureWidget, "timeSignature"); - if (useVocalLanguageWidget && vocalLanguageWidget) toggleWidgetState(useVocalLanguageWidget, vocalLanguageWidget, "vocalLanguage"); - if (useCoverConditioningScaleWidget && coverConditioningScaleWidget) toggleWidgetState(useCoverConditioningScaleWidget, coverConditioningScaleWidget, "coverConditioningScale"); - if (useRepaintingStartWidget && repaintingStartWidget) toggleWidgetState(useRepaintingStartWidget, repaintingStartWidget, "repaintingStart"); - if (useRepaintingEndWidget && repaintingEndWidget) toggleWidgetState(useRepaintingEndWidget, repaintingEndWidget, "repaintingEnd"); - if (useXVectorOnlyWidget && xVectorOnlyWidget) toggleWidgetState(useXVectorOnlyWidget, xVectorOnlyWidget, "xVectorOnly"); - if (useMaxNewTokensWidget && maxNewTokensWidget) toggleWidgetState(useMaxNewTokensWidget, maxNewTokensWidget, "maxNewTokens"); - if (useTranscriptWidget && transcriptWidget) toggleWidgetState(useTranscriptWidget, transcriptWidget, "transcript"); - if (useCfgIntervalStartWidget && cfgIntervalStartWidget) toggleWidgetState(useCfgIntervalStartWidget, cfgIntervalStartWidget, "cfgIntervalStart"); - if (useCfgIntervalEndWidget && cfgIntervalEndWidget) toggleWidgetState(useCfgIntervalEndWidget, cfgIntervalEndWidget, "cfgIntervalEnd"); - if (useNormalizeLoudnessWidget && normalizeLoudnessWidget) toggleWidgetState(useNormalizeLoudnessWidget, normalizeLoudnessWidget, "normalizeLoudness"); - if (useTopPWidget && topPWidget) toggleWidgetState(useTopPWidget, topPWidget, "topP"); - if (useChunkLengthWidget && chunkLengthWidget) toggleWidgetState(useChunkLengthWidget, chunkLengthWidget, "chunkLength"); - if (useMinChunkLengthWidget && minChunkLengthWidget) toggleWidgetState(useMinChunkLengthWidget, minChunkLengthWidget, "minChunkLength"); - if (useNormalizeWidget && normalizeWidget) toggleWidgetState(useNormalizeWidget, normalizeWidget, "normalize"); - if (useLatencyWidget && latencyWidget) toggleWidgetState(useLatencyWidget, latencyWidget, "latency"); - if (useMaxTokensWidget && maxTokensWidget) toggleWidgetState(useMaxTokensWidget, maxTokensWidget, "maxTokens"); - if (useRepetitionPenaltyWidget && repetitionPenaltyWidget) toggleWidgetState(useRepetitionPenaltyWidget, repetitionPenaltyWidget, "repetitionPenalty"); - if (useConditionOnPreviousChunksWidget && conditionOnPreviousChunksWidget) toggleWidgetState(useConditionOnPreviousChunksWidget, conditionOnPreviousChunksWidget, "conditionOnPreviousChunks"); - if (useEarlyStopThresholdWidget && earlyStopThresholdWidget) toggleWidgetState(useEarlyStopThresholdWidget, earlyStopThresholdWidget, "earlyStopThreshold"); -} - -function textInferenceSettingsToggleHandler(settingsNode) { - if (!settingsNode?.widgets) return; - - const useSystemPromptWidget = settingsNode.widgets.find(w => w && w.name === "useSystemPrompt"); - const systemWidget = settingsNode.widgets.find(w => w && (w.name === "systemPrompt" || w.name === "system")); - const useMaxTokensWidget = settingsNode.widgets.find(w => w && w.name === "useMaxTokens"); - const maxTokensWidget = settingsNode.widgets.find(w => w && w.name === "maxTokens"); - const useTemperatureWidget = settingsNode.widgets.find(w => w && w.name === "useTemperature"); - const temperatureWidget = settingsNode.widgets.find(w => w && w.name === "temperature"); - const useTopPWidget = settingsNode.widgets.find(w => w && w.name === "useTopP"); - const topPWidget = settingsNode.widgets.find(w => w && w.name === "topP"); - const useTopKWidget = settingsNode.widgets.find(w => w && w.name === "useTopK"); - const topKWidget = settingsNode.widgets.find(w => w && w.name === "topK"); - const useStopSequencesWidget = settingsNode.widgets.find(w => w && w.name === "useStopSequences"); - const stopSequencesWidget = settingsNode.widgets.find(w => w && w.name === "stopSequences"); - const usePresencePenaltyWidget = settingsNode.widgets.find(w => w && w.name === "usePresencePenalty"); - const presencePenaltyWidget = settingsNode.widgets.find(w => w && w.name === "presencePenalty"); - const useFrequencyPenaltyWidget = settingsNode.widgets.find(w => w && w.name === "useFrequencyPenalty"); - const frequencyPenaltyWidget = settingsNode.widgets.find(w => w && w.name === "frequencyPenalty"); - const useToolsWidget = settingsNode.widgets.find(w => w && w.name === "useTools"); - const toolsWidget = settingsNode.widgets.find(w => w && w.name === "tools"); - - function toggleWidgetState(useWidget, paramWidget) { - if (!useWidget || !paramWidget) return; - function applyState() { - const enabled = useWidget.value === true; - toggleWidgetEnabled(paramWidget, enabled, settingsNode); - 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"; - } - settingsNode.setDirtyCanvas(true); - } - setTimeout(applyState, 100); - appendWidgetCB(useWidget, () => setTimeout(applyState, 50)); - } - - if (useSystemPromptWidget && systemWidget) toggleWidgetState(useSystemPromptWidget, systemWidget); - if (useMaxTokensWidget && maxTokensWidget) toggleWidgetState(useMaxTokensWidget, maxTokensWidget); - if (useTemperatureWidget && temperatureWidget) toggleWidgetState(useTemperatureWidget, temperatureWidget); - if (useTopPWidget && topPWidget) toggleWidgetState(useTopPWidget, topPWidget); - if (useTopKWidget && topKWidget) toggleWidgetState(useTopKWidget, topKWidget); - if (useStopSequencesWidget && stopSequencesWidget) toggleWidgetState(useStopSequencesWidget, stopSequencesWidget); - if (usePresencePenaltyWidget && presencePenaltyWidget) toggleWidgetState(usePresencePenaltyWidget, presencePenaltyWidget); - if (useFrequencyPenaltyWidget && frequencyPenaltyWidget) toggleWidgetState(useFrequencyPenaltyWidget, frequencyPenaltyWidget); - if (useToolsWidget && toolsWidget) toggleWidgetState(useToolsWidget, toolsWidget); -} - -function videoSettingsToggleHandler(settingsNode) { - if (!settingsNode?.widgets) return; - - const useDraftWidget = settingsNode.widgets.find(w => w && w.name === "useDraft"); - const draftWidget = settingsNode.widgets.find(w => w && w.name === "draft"); - const useAudioWidget = settingsNode.widgets.find(w => w && w.name === "useAudio"); - const audioWidget = settingsNode.widgets.find(w => w && w.name === "audio"); - const usePreserveAudioWidget = settingsNode.widgets.find(w => w && w.name === "usePreserveAudio"); - const preserveAudioWidget = settingsNode.widgets.find(w => w && w.name === "preserveAudio"); - const useSourceAudioSyncWidget = settingsNode.widgets.find(w => w && w.name === "useSourceAudioSync"); - const sourceAudioSyncWidget = settingsNode.widgets.find(w => w && w.name === "sourceAudioSync"); - const useTurboWidget = settingsNode.widgets.find(w => w && w.name === "useTurbo"); - const turboWidget = settingsNode.widgets.find(w => w && w.name === "turbo"); - const useLoopWidget = settingsNode.widgets.find(w => w && w.name === "useLoop"); - const loopWidget = settingsNode.widgets.find(w => w && w.name === "loop"); - const useHdrWidget = settingsNode.widgets.find(w => w && w.name === "useHdr"); - const hdrWidget = settingsNode.widgets.find(w => w && w.name === "hdr"); - const useExrExportWidget = settingsNode.widgets.find(w => w && w.name === "useExrExport"); - const exrExportWidget = settingsNode.widgets.find(w => w && w.name === "exrExport"); - const useVoicePromptWidget = settingsNode.widgets.find(w => w && w.name === "useVoicePrompt"); - const voicePromptWidget = settingsNode.widgets.find(w => w && w.name === "voicePrompt"); - const useSafetyFilterWidget = settingsNode.widgets.find(w => w && w.name === "useSafetyFilter"); - const safetyFilterWidget = settingsNode.widgets.find(w => w && w.name === "safetyFilter"); - const usePromptUpsamplingWidget = settingsNode.widgets.find(w => w && w.name === "usePromptUpsampling"); - const promptUpsamplingWidget = settingsNode.widgets.find(w => w && w.name === "promptUpsampling"); - const useBackgroundColorWidget = settingsNode.widgets.find(w => w && w.name === "useBackgroundColor"); - const backgroundColorWidget = settingsNode.widgets.find(w => w && w.name === "backgroundColor"); - const useRemoveBackgroundWidget = settingsNode.widgets.find(w => w && w.name === "useRemoveBackground"); - const removeBackgroundWidget = settingsNode.widgets.find(w => w && w.name === "removeBackground"); - const useExpressivenessWidget = settingsNode.widgets.find(w => w && w.name === "useExpressiveness"); - const expressivenessWidget = settingsNode.widgets.find(w => w && w.name === "expressiveness"); - const useVoiceDescriptionWidget = settingsNode.widgets.find(w => w && w.name === "useVoiceDescription"); - const voiceDescriptionWidget = settingsNode.widgets.find(w => w && w.name === "voiceDescription"); - const useStyleWidget = settingsNode.widgets.find(w => w && w.name === "useStyle"); - const styleWidget = settingsNode.widgets.find(w => w && w.name === "style"); - const useThinkingWidget = settingsNode.widgets.find(w => w && w.name === "useThinking"); - const thinkingWidget = settingsNode.widgets.find(w => w && w.name === "thinking"); - const useMultiClipWidget = settingsNode.widgets.find(w => w && w.name === "useMultiClip"); - const multiClipWidget = settingsNode.widgets.find(w => w && w.name === "multiClip"); - const useShotTypeWidget = settingsNode.widgets.find(w => w && w.name === "useShotType"); - const shotTypeWidget = settingsNode.widgets.find(w => w && w.name === "shotType"); - const usePromptExtendWidget = settingsNode.widgets.find(w => w && w.name === "usePromptExtend"); - const promptExtendWidget = settingsNode.widgets.find(w => w && w.name === "promptExtend"); - const useSyncModeWidget = settingsNode.widgets.find(w => w && w.name === "useSyncMode"); - const syncModeWidget = settingsNode.widgets.find(w => w && w.name === "syncMode"); - const useModeWidget = settingsNode.widgets.find(w => w && w.name === "useMode"); - const modeWidget = settingsNode.widgets.find(w => w && w.name === "mode"); - const useEmotionWidget = settingsNode.widgets.find(w => w && w.name === "useEmotion"); - const emotionWidget = settingsNode.widgets.find(w => w && w.name === "emotion"); - const useTemperatureWidget = settingsNode.widgets.find(w => w && w.name === "useTemperature"); - const temperatureWidget = settingsNode.widgets.find(w => w && w.name === "temperature"); - const useOcclusionDetectionWidget = settingsNode.widgets.find(w => w && w.name === "useOcclusionDetection"); - const occlusionDetectionWidget = settingsNode.widgets.find(w => w && w.name === "occlusionDetection"); - const useKeyframeIdWidget = settingsNode.widgets.find(w => w && w.name === "useKeyframeId"); - const keyframeIdWidget = settingsNode.widgets.find(w => w && w.name === "keyframeId"); - const useFitWidget = settingsNode.widgets.find(w => w && w.name === "useFit"); - const fitWidget = settingsNode.widgets.find(w => w && w.name === "fit"); - const useCaptionWidget = settingsNode.widgets.find(w => w && w.name === "useCaption"); - const captionWidget = settingsNode.widgets.find(w => w && w.name === "caption"); - - function toggleWidgetState(useWidget, paramWidget, paramName) { - if (!useWidget || !paramWidget) return; - function applyState() { - const enabled = useWidget.value === true; - toggleWidgetEnabled(paramWidget, enabled, settingsNode); - 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"; - } - settingsNode.setDirtyCanvas(true); - } - setTimeout(applyState, 100); - appendWidgetCB(useWidget, () => setTimeout(applyState, 50)); - } - - if (useDraftWidget && draftWidget) toggleWidgetState(useDraftWidget, draftWidget, "draft"); - if (useAudioWidget && audioWidget) toggleWidgetState(useAudioWidget, audioWidget, "audio"); - if (usePreserveAudioWidget && preserveAudioWidget) toggleWidgetState(usePreserveAudioWidget, preserveAudioWidget, "preserveAudio"); - if (useSourceAudioSyncWidget && sourceAudioSyncWidget) toggleWidgetState(useSourceAudioSyncWidget, sourceAudioSyncWidget, "sourceAudioSync"); - if (useTurboWidget && turboWidget) toggleWidgetState(useTurboWidget, turboWidget, "turbo"); - if (useLoopWidget && loopWidget) toggleWidgetState(useLoopWidget, loopWidget, "loop"); - if (useHdrWidget && hdrWidget) toggleWidgetState(useHdrWidget, hdrWidget, "hdr"); - if (useExrExportWidget && exrExportWidget) toggleWidgetState(useExrExportWidget, exrExportWidget, "exrExport"); - if (useVoicePromptWidget && voicePromptWidget) toggleWidgetState(useVoicePromptWidget, voicePromptWidget, "voicePrompt"); - if (useSafetyFilterWidget && safetyFilterWidget) toggleWidgetState(useSafetyFilterWidget, safetyFilterWidget, "safetyFilter"); - if (usePromptUpsamplingWidget && promptUpsamplingWidget) toggleWidgetState(usePromptUpsamplingWidget, promptUpsamplingWidget, "promptUpsampling"); - if (useBackgroundColorWidget && backgroundColorWidget) toggleWidgetState(useBackgroundColorWidget, backgroundColorWidget, "backgroundColor"); - if (useRemoveBackgroundWidget && removeBackgroundWidget) toggleWidgetState(useRemoveBackgroundWidget, removeBackgroundWidget, "removeBackground"); - if (useExpressivenessWidget && expressivenessWidget) toggleWidgetState(useExpressivenessWidget, expressivenessWidget, "expressiveness"); - if (useVoiceDescriptionWidget && voiceDescriptionWidget) toggleWidgetState(useVoiceDescriptionWidget, voiceDescriptionWidget, "voiceDescription"); - if (useStyleWidget && styleWidget) toggleWidgetState(useStyleWidget, styleWidget, "style"); - if (useThinkingWidget && thinkingWidget) toggleWidgetState(useThinkingWidget, thinkingWidget, "thinking"); - if (useMultiClipWidget && multiClipWidget) toggleWidgetState(useMultiClipWidget, multiClipWidget, "multiClip"); - if (useShotTypeWidget && shotTypeWidget) toggleWidgetState(useShotTypeWidget, shotTypeWidget, "shotType"); - if (usePromptExtendWidget && promptExtendWidget) toggleWidgetState(usePromptExtendWidget, promptExtendWidget, "promptExtend"); - if (useSyncModeWidget && syncModeWidget) toggleWidgetState(useSyncModeWidget, syncModeWidget, "syncMode"); - if (useModeWidget && modeWidget) toggleWidgetState(useModeWidget, modeWidget, "mode"); - if (useEmotionWidget && emotionWidget) toggleWidgetState(useEmotionWidget, emotionWidget, "emotion"); - if (useTemperatureWidget && temperatureWidget) toggleWidgetState(useTemperatureWidget, temperatureWidget, "temperature"); - if (useOcclusionDetectionWidget && occlusionDetectionWidget) toggleWidgetState(useOcclusionDetectionWidget, occlusionDetectionWidget, "occlusionDetection"); - if (useKeyframeIdWidget && keyframeIdWidget) toggleWidgetState(useKeyframeIdWidget, keyframeIdWidget, "keyframeId"); - if (useFitWidget && fitWidget) toggleWidgetState(useFitWidget, fitWidget, "fit"); - if (useCaptionWidget && captionWidget) toggleWidgetState(useCaptionWidget, captionWidget, "caption"); -} - -function videoInferenceSettingsTtsToggleHandler(node) { - if (!node?.widgets) return; - - const useStabilityWidget = node.widgets.find(w => w && w.name === "useStability"); - const stabilityWidget = node.widgets.find(w => w && w.name === "stability"); - const useSimilarityBoostWidget = node.widgets.find(w => w && w.name === "useSimilarityBoost"); - const similarityBoostWidget = node.widgets.find(w => w && w.name === "similarityBoost"); - - function toggleWidgetState(useWidget, paramWidget, paramName) { - if (!useWidget || !paramWidget) return; - function applyState() { - const enabled = useWidget.value === true; - toggleWidgetEnabled(paramWidget, enabled, node); - 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"; - } - node.setDirtyCanvas(true); - } - setTimeout(applyState, 100); - appendWidgetCB(useWidget, () => setTimeout(applyState, 50)); - } - - if (useStabilityWidget && stabilityWidget) toggleWidgetState(useStabilityWidget, stabilityWidget, "stability"); - if (useSimilarityBoostWidget && similarityBoostWidget) toggleWidgetState(useSimilarityBoostWidget, similarityBoostWidget, "similarityBoost"); -} - -function videoInferenceSettingsActiveSpeakerDetectionToggleHandler(node) { - if (!node?.widgets) return; - - const useAutoDetectWidget = node.widgets.find(w => w && w.name === "useAutoDetect"); - const autoDetectWidget = node.widgets.find(w => w && w.name === "autoDetect"); - const useFrameNumberWidget = node.widgets.find(w => w && w.name === "useFrameNumber"); - const frameNumberWidget = node.widgets.find(w => w && w.name === "frameNumber"); - const useCoordinatesWidget = node.widgets.find(w => w && w.name === "useCoordinates"); - const coordinateXWidget = node.widgets.find(w => w && w.name === "coordinateX"); - const coordinateYWidget = node.widgets.find(w => w && w.name === "coordinateY"); - - function toggleWidgetState(useWidget, paramWidget, paramName) { - if (!useWidget || !paramWidget) return; - function applyState() { - const enabled = useWidget.value === true; - toggleWidgetEnabled(paramWidget, enabled, node); - 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"; - } - node.setDirtyCanvas(true); - } - setTimeout(applyState, 100); - appendWidgetCB(useWidget, () => setTimeout(applyState, 50)); - } - - if (useAutoDetectWidget && autoDetectWidget) toggleWidgetState(useAutoDetectWidget, autoDetectWidget, "autoDetect"); - if (useFrameNumberWidget && frameNumberWidget) toggleWidgetState(useFrameNumberWidget, frameNumberWidget, "frameNumber"); - if (useCoordinatesWidget && coordinateXWidget) toggleWidgetState(useCoordinatesWidget, coordinateXWidget, "coordinateX"); - if (useCoordinatesWidget && coordinateYWidget) toggleWidgetState(useCoordinatesWidget, coordinateYWidget, "coordinateY"); -} - -function videoInferenceSettingsActiveSpeakerBoundingBoxesToggleHandler(node) { - if (!node?.widgets) return; - - const useBox1Widget = node.widgets.find(w => w && w.name === "useBox1"); - const box1Widget = node.widgets.find(w => w && w.name === "box1"); - const useBox2Widget = node.widgets.find(w => w && w.name === "useBox2"); - const box2Widget = node.widgets.find(w => w && w.name === "box2"); - const useBox3Widget = node.widgets.find(w => w && w.name === "useBox3"); - const box3Widget = node.widgets.find(w => w && w.name === "box3"); - const useBox4Widget = node.widgets.find(w => w && w.name === "useBox4"); - const box4Widget = node.widgets.find(w => w && w.name === "box4"); - - function toggleWidgetState(useWidget, paramWidget, paramName) { - if (!useWidget || !paramWidget) return; - function applyState() { - const enabled = useWidget.value === true; - toggleWidgetEnabled(paramWidget, enabled, node); - 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"; - } - node.setDirtyCanvas(true); - } - setTimeout(applyState, 100); - appendWidgetCB(useWidget, () => setTimeout(applyState, 50)); - } - - if (useBox1Widget && box1Widget) toggleWidgetState(useBox1Widget, box1Widget, "box1"); - if (useBox2Widget && box2Widget) toggleWidgetState(useBox2Widget, box2Widget, "box2"); - if (useBox3Widget && box3Widget) toggleWidgetState(useBox3Widget, box3Widget, "box3"); - if (useBox4Widget && box4Widget) toggleWidgetState(useBox4Widget, box4Widget, "box4"); -} - -function videoInferenceSettingsSegmentsToggleHandler(node) { - if (!node?.widgets) return; - - function byName(name) { - return node.widgets.find(w => w && w.name === name); - } - - function togglePair(useWidget, paramWidget, paramName) { - if (!useWidget || !paramWidget) return; - function applyState() { - const enabled = useWidget.value === true; - toggleWidgetEnabled(paramWidget, enabled, node); - 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"; - } - node.setDirtyCanvas(true); - } - setTimeout(applyState, 100); - appendWidgetCB(useWidget, () => setTimeout(applyState, 50)); - } - - function wireSegment(idx) { - const useSegment = byName(`useSegment${idx}`); - const start = byName(`segment${idx}StartTime`); - const end = byName(`segment${idx}EndTime`); - const audio = byName(`segment${idx}Audio`); - const useCrop = byName(`useSegment${idx}AudioCrop`); - const cropStart = byName(`segment${idx}AudioStartTime`); - const cropEnd = byName(`segment${idx}AudioEndTime`); - - function toggleCropTimeWidget(paramWidget) { - if (!useSegment || !useCrop || !paramWidget) return; - function applyState() { - const enabled = useSegment.value === true && useCrop.value === true; - toggleWidgetEnabled(paramWidget, enabled, node); - 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"; - } - node.setDirtyCanvas(true); - } - setTimeout(applyState, 100); - appendWidgetCB(useSegment, () => setTimeout(applyState, 50)); - appendWidgetCB(useCrop, () => setTimeout(applyState, 50)); - } - - if (useSegment && start) togglePair(useSegment, start, `segment${idx}StartTime`); - if (useSegment && end) togglePair(useSegment, end, `segment${idx}EndTime`); - if (useSegment && audio) togglePair(useSegment, audio, `segment${idx}Audio`); - if (useSegment && useCrop) togglePair(useSegment, useCrop, `useSegment${idx}AudioCrop`); - if (cropStart) toggleCropTimeWidget(cropStart); - if (cropEnd) toggleCropTimeWidget(cropEnd); - } - - wireSegment(1); - wireSegment(2); - wireSegment(3); - wireSegment(4); -} - -function videoInferenceSettingsControlToggleHandler(node) { - if (!node?.widgets) return; - - const useAutoControlsWidget = node.widgets.find(w => w && w.name === "useAutoControls"); - const autoControlsWidget = node.widgets.find(w => w && w.name === "autoControls"); - const useStrengthWidget = node.widgets.find(w => w && w.name === "useStrength"); - const strengthWidget = node.widgets.find(w => w && w.name === "strength"); - const useDepthBlurWidget = node.widgets.find(w => w && w.name === "useDepthBlur"); - const depthBlurWidget = node.widgets.find(w => w && w.name === "depthBlur"); - const useFaceWidget = node.widgets.find(w => w && w.name === "useFace"); - const faceWidget = node.widgets.find(w => w && w.name === "face"); - const useNormalsAugmentationWidget = node.widgets.find(w => w && w.name === "useNormalsAugmentation"); - const normalsAugmentationWidget = node.widgets.find(w => w && w.name === "normalsAugmentation"); - const usePoseStrengthWidget = node.widgets.find(w => w && w.name === "usePoseStrength"); - const poseStrengthWidget = node.widgets.find(w => w && w.name === "poseStrength"); - const useTrajectorySparsityWidget = node.widgets.find(w => w && w.name === "useTrajectorySparsity"); - const trajectorySparsityWidget = node.widgets.find(w => w && w.name === "trajectorySparsity"); - - function toggleWidgetState(useWidget, paramWidget, paramName) { - if (!useWidget || !paramWidget) return; - function applyState() { - const enabled = useWidget.value === true; - toggleWidgetEnabled(paramWidget, enabled, node); - 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"; - } - node.setDirtyCanvas(true); - } - setTimeout(applyState, 100); - appendWidgetCB(useWidget, () => setTimeout(applyState, 50)); - } - - if (useAutoControlsWidget && autoControlsWidget) toggleWidgetState(useAutoControlsWidget, autoControlsWidget, "autoControls"); - if (useStrengthWidget && strengthWidget) toggleWidgetState(useStrengthWidget, strengthWidget, "strength"); - if (useDepthBlurWidget && depthBlurWidget) toggleWidgetState(useDepthBlurWidget, depthBlurWidget, "depthBlur"); - if (useFaceWidget && faceWidget) toggleWidgetState(useFaceWidget, faceWidget, "face"); - if (useNormalsAugmentationWidget && normalsAugmentationWidget) toggleWidgetState(useNormalsAugmentationWidget, normalsAugmentationWidget, "normalsAugmentation"); - if (usePoseStrengthWidget && poseStrengthWidget) toggleWidgetState(usePoseStrengthWidget, poseStrengthWidget, "poseStrength"); - if (useTrajectorySparsityWidget && trajectorySparsityWidget) toggleWidgetState(useTrajectorySparsityWidget, trajectorySparsityWidget, "trajectorySparsity"); -} - -function audioInferenceSpeechToggleHandler(speechNode) { - if (!speechNode?.widgets) return; - - const useVoiceWidget = speechNode.widgets.find(w => w && w.name === "useVoice"); - const voiceWidget = speechNode.widgets.find(w => w && w.name === "voice"); - const useSpeedWidget = speechNode.widgets.find(w => w && w.name === "useSpeed"); - const speedWidget = speechNode.widgets.find(w => w && w.name === "speed"); - const useVolumeWidget = speechNode.widgets.find(w => w && w.name === "useVolume"); - const volumeWidget = speechNode.widgets.find(w => w && w.name === "volume"); - const usePitchWidget = speechNode.widgets.find(w => w && w.name === "usePitch"); - const pitchWidget = speechNode.widgets.find(w => w && w.name === "pitch"); - const useEmotionWidget = speechNode.widgets.find(w => w && w.name === "useEmotion"); - const emotionWidget = speechNode.widgets.find(w => w && w.name === "emotion"); - const useToneWidget = speechNode.widgets.find(w => w && w.name === "useTone"); - const toneWidget = speechNode.widgets.find(w => w && w.name === "tone"); - const useLanguageWidget = speechNode.widgets.find(w => w && w.name === "useLanguage"); - const languageWidget = speechNode.widgets.find(w => w && w.name === "language"); - - function toggleWidgetState(useWidget, paramWidget, paramName) { - if (!useWidget || !paramWidget) return; - function applyState() { - const enabled = useWidget.value === true; - toggleWidgetEnabled(paramWidget, enabled, speechNode); - 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"; - } - speechNode.setDirtyCanvas(true); - } - setTimeout(applyState, 100); - appendWidgetCB(useWidget, () => setTimeout(applyState, 50)); - } - - if (useSpeedWidget && speedWidget) toggleWidgetState(useSpeedWidget, speedWidget, "speed"); - if (useVolumeWidget && volumeWidget) toggleWidgetState(useVolumeWidget, volumeWidget, "volume"); - if (usePitchWidget && pitchWidget) toggleWidgetState(usePitchWidget, pitchWidget, "pitch"); - if (useEmotionWidget && emotionWidget) toggleWidgetState(useEmotionWidget, emotionWidget, "emotion"); - if (useToneWidget && toneWidget) toggleWidgetState(useToneWidget, toneWidget, "tone"); - if (useLanguageWidget && languageWidget) toggleWidgetState(useLanguageWidget, languageWidget, "language"); - if (useVoiceWidget && voiceWidget) toggleWidgetState(useVoiceWidget, voiceWidget, "voice"); -} - -function acceleratorOptionsToggleHandler(acceleratorNode) { - // Find all "use" parameter widgets for Accelerator Options - const useCacheDistanceWidget = acceleratorNode.widgets.find(w => w.name === "useCacheDistance"); - const cacheDistanceWidget = acceleratorNode.widgets.find(w => w.name === "cacheDistance"); - const useTeaCacheDistanceWidget = acceleratorNode.widgets.find(w => w.name === "useTeaCacheDistance"); - const teaCacheDistanceWidget = acceleratorNode.widgets.find(w => w.name === "teaCacheDistance"); - const useDeepCacheOptionsWidget = acceleratorNode.widgets.find(w => w.name === "useDeepCacheOptions"); - const deepCacheIntervalWidget = acceleratorNode.widgets.find(w => w.name === "deepCacheInterval"); - const deepCacheBranchIdWidget = acceleratorNode.widgets.find(w => w.name === "deepCacheBranchId"); - const useCacheStepsWidget = acceleratorNode.widgets.find(w => w.name === "useCacheSteps"); - const cacheStartStepWidget = acceleratorNode.widgets.find(w => w.name === "cacheStartStep"); - const cacheEndStepWidget = acceleratorNode.widgets.find(w => w.name === "cacheEndStep"); - const useCachePercentageStepsWidget = acceleratorNode.widgets.find(w => w.name === "useCachePercentageSteps"); - const cacheStartStepPercentageWidget = acceleratorNode.widgets.find(w => w.name === "cacheStartStepPercentage"); - const cacheEndStepPercentageWidget = acceleratorNode.widgets.find(w => w.name === "cacheEndStepPercentage"); - const useCacheMaxConsecutiveStepsWidget = acceleratorNode.widgets.find(w => w.name === "useCacheMaxConsecutiveSteps"); - const cacheMaxConsecutiveStepsWidget = acceleratorNode.widgets.find(w => w.name === "cacheMaxConsecutiveSteps"); - - // Helper function to toggle widget enabled state (exact same pattern) - function toggleWidgetState(useWidget, paramWidgets, paramNames) { - if (!useWidget || !paramWidgets || paramWidgets.length === 0) return; - - function toggleEnabled() { - const enabled = useWidget.value === true; - - paramWidgets.forEach((paramWidget, idx) => { - if (!paramWidget) return; - - 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 = acceleratorNode.htmlElements?.widgetsContainer || acceleratorNode.htmlElements; - if (nodeElement && paramNames[idx]) { - const input = nodeElement.querySelector(`input[name="${paramNames[idx]}"], textarea[name="${paramNames[idx]}"], select[name="${paramNames[idx]}"]`); - 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"; - } - } - } - } - }); - - acceleratorNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - // Set up all toggle handlers - if (useCacheDistanceWidget && cacheDistanceWidget) { - toggleWidgetState(useCacheDistanceWidget, [cacheDistanceWidget], ["cacheDistance"]); - } - - if (useTeaCacheDistanceWidget && teaCacheDistanceWidget) { - toggleWidgetState(useTeaCacheDistanceWidget, [teaCacheDistanceWidget], ["teaCacheDistance"]); - } - - if (useDeepCacheOptionsWidget && deepCacheIntervalWidget && deepCacheBranchIdWidget) { - toggleWidgetState(useDeepCacheOptionsWidget, [deepCacheIntervalWidget, deepCacheBranchIdWidget], ["deepCacheInterval", "deepCacheBranchId"]); - } - - if (useCacheStepsWidget && cacheStartStepWidget && cacheEndStepWidget) { - toggleWidgetState(useCacheStepsWidget, [cacheStartStepWidget, cacheEndStepWidget], ["cacheStartStep", "cacheEndStep"]); - } - - if (useCachePercentageStepsWidget && cacheStartStepPercentageWidget && cacheEndStepPercentageWidget) { - toggleWidgetState(useCachePercentageStepsWidget, [cacheStartStepPercentageWidget, cacheEndStepPercentageWidget], ["cacheStartStepPercentage", "cacheEndStepPercentage"]); - } - - if (useCacheMaxConsecutiveStepsWidget && cacheMaxConsecutiveStepsWidget) { - toggleWidgetState(useCacheMaxConsecutiveStepsWidget, [cacheMaxConsecutiveStepsWidget], ["cacheMaxConsecutiveSteps"]); - } -} - -function bytedanceProviderSettingsToggleHandler(bytedanceNode) { - // Find all "use" parameter widgets for Bytedance Provider Settings - const useCameraFixedWidget = bytedanceNode.widgets.find(w => w.name === "useCameraFixed"); - const cameraFixedWidget = bytedanceNode.widgets.find(w => w.name === "cameraFixed"); - const useMaxSequentialImagesWidget = bytedanceNode.widgets.find(w => w.name === "useMaxSequentialImages"); - const maxSequentialImagesWidget = bytedanceNode.widgets.find(w => w.name === "maxSequentialImages"); - const useFastModeWidget = bytedanceNode.widgets.find(w => w.name === "useFastMode"); - const fastModeWidget = bytedanceNode.widgets.find(w => w.name === "fastMode"); - const useAudioWidget = bytedanceNode.widgets.find(w => w.name === "useAudio"); - const audioWidget = bytedanceNode.widgets.find(w => w.name === "audio"); - const useDraftWidget = bytedanceNode.widgets.find(w => w.name === "useDraft"); - const draftWidget = bytedanceNode.widgets.find(w => w.name === "draft"); - const useOptimizePromptModeWidget = bytedanceNode.widgets.find(w => w.name === "useOptimizePromptMode"); - const optimizePromptModeWidget = bytedanceNode.widgets.find(w => w.name === "optimizePromptMode"); - - // Helper function to toggle widget enabled state (exact same pattern) - 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 = bytedanceNode.htmlElements?.widgetsContainer || bytedanceNode.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"; - } - } - } - } - - bytedanceNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - // Set up all toggle handlers - if (useCameraFixedWidget && cameraFixedWidget) { - toggleWidgetState(useCameraFixedWidget, cameraFixedWidget, "cameraFixed"); - } - - if (useMaxSequentialImagesWidget && maxSequentialImagesWidget) { - toggleWidgetState(useMaxSequentialImagesWidget, maxSequentialImagesWidget, "maxSequentialImages"); - } - - if (useFastModeWidget && fastModeWidget) { - toggleWidgetState(useFastModeWidget, fastModeWidget, "fastMode"); - } - - if (useAudioWidget && audioWidget) { - toggleWidgetState(useAudioWidget, audioWidget, "audio"); - } - - if (useDraftWidget && draftWidget) { - toggleWidgetState(useDraftWidget, draftWidget, "draft"); - } - - if (useOptimizePromptModeWidget && optimizePromptModeWidget) { - toggleWidgetState(useOptimizePromptModeWidget, optimizePromptModeWidget, "optimizePromptMode"); - } -} - -function ultralyticsProviderSettingsToggleHandler(ultralyticsNode) { - const useParamPairs = [ - ["useMaskBlur", "maskBlur"], - ["useMaskPadding", "maskPadding"], - ["useConfidence", "confidence"], - ["usePositivePrompt", "positivePrompt"], - ["useNegativePrompt", "negativePrompt"], - ["useSteps", "steps"], - ["useCFGScale", "CFGScale"], - ["useStrength", "strength"], - ["useInpaintSize", "inpaintSize"], - ]; - - 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 = ultralyticsNode.htmlElements?.widgetsContainer || ultralyticsNode.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"; - } - } - } - - ultralyticsNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - useParamPairs.forEach(([useName, paramName]) => { - const useWidget = ultralyticsNode.widgets.find(w => w.name === useName); - const paramWidget = ultralyticsNode.widgets.find(w => w.name === paramName); - if (useWidget && paramWidget) { - toggleWidgetState(useWidget, paramWidget, paramName); - } - }); -} - -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 viduProviderSettingsToggleHandler(viduNode) { - const useAudioWidget = viduNode.widgets.find(w => w.name === "useAudio"); - const audioWidget = viduNode.widgets.find(w => w.name === "audio"); - const useBgmWidget = viduNode.widgets.find(w => w.name === "useBgm"); - const bgmWidget = viduNode.widgets.find(w => w.name === "bgm"); - const useStyleWidget = viduNode.widgets.find(w => w.name === "useStyle"); - const styleWidget = viduNode.widgets.find(w => w.name === "style"); - const useMovementAmplitudeWidget = viduNode.widgets.find(w => w.name === "useMovementAmplitude"); - const movementAmplitudeWidget = viduNode.widgets.find(w => w.name === "movementAmplitude"); - const useTemplateNameWidget = viduNode.widgets.find(w => w.name === "useTemplateName"); - const templateNameWidget = viduNode.widgets.find(w => w.name === "templateName"); - const useTemplateAreaWidget = viduNode.widgets.find(w => w.name === "useTemplateArea"); - const templateAreaWidget = viduNode.widgets.find(w => w.name === "templateArea"); - const useTemplateBeastWidget = viduNode.widgets.find(w => w.name === "useTemplateBeast"); - const templateBeastWidget = viduNode.widgets.find(w => w.name === "templateBeast"); - - 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 = viduNode.htmlElements?.widgetsContainer || viduNode.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"; - } - } - } - - viduNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - if (useAudioWidget && audioWidget) { - toggleWidgetState(useAudioWidget, audioWidget, "audio"); - } - if (useBgmWidget && bgmWidget) { - toggleWidgetState(useBgmWidget, bgmWidget, "bgm"); - } - if (useStyleWidget && styleWidget) { - toggleWidgetState(useStyleWidget, styleWidget, "style"); - } - if (useMovementAmplitudeWidget && movementAmplitudeWidget) { - toggleWidgetState(useMovementAmplitudeWidget, movementAmplitudeWidget, "movementAmplitude"); - } - if (useTemplateNameWidget && templateNameWidget) { - toggleWidgetState(useTemplateNameWidget, templateNameWidget, "templateName"); - } - if (useTemplateAreaWidget && templateAreaWidget) { - toggleWidgetState(useTemplateAreaWidget, templateAreaWidget, "templateArea"); - } - if (useTemplateBeastWidget && templateBeastWidget) { - toggleWidgetState(useTemplateBeastWidget, templateBeastWidget, "templateBeast"); - } -} - -function sourcefulProviderSettingsToggleHandler(sourcefulNode) { - const useTransparencyWidget = sourcefulNode.widgets.find(w => w.name === "useTransparency"); - const transparencyWidget = sourcefulNode.widgets.find(w => w.name === "transparency"); - const useEnhancePromptWidget = sourcefulNode.widgets.find(w => w.name === "useEnhancePrompt"); - const enhancePromptWidget = sourcefulNode.widgets.find(w => w.name === "enhancePrompt"); - - 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 = sourcefulNode.htmlElements?.widgetsContainer || sourcefulNode.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"; - } - } - } - - sourcefulNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - if (useTransparencyWidget && transparencyWidget) { - toggleWidgetState(useTransparencyWidget, transparencyWidget, "transparency"); - } - if (useEnhancePromptWidget && enhancePromptWidget) { - toggleWidgetState(useEnhancePromptWidget, enhancePromptWidget, "enhancePrompt"); - } -} - -function sourcefulProviderSettingsFontsToggleHandler(fontsNode) { - if (!fontsNode?.widgets) return; - if (fontsNode._sourcefulProviderSettingsFontsToggleHandlerRegistered) return; - fontsNode._sourcefulProviderSettingsFontsToggleHandlerRegistered = true; - - function toggleFontGroup(useWidget, fontUrlWidget, textWidget, fontParamName, textParamName) { - if (!useWidget || !fontUrlWidget || !textWidget) return; - - function toggleEnabled() { - const enabled = useWidget.value === true; - - [fontUrlWidget, textWidget].forEach(paramWidget => { - 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; - }); - - const nodeElement = fontsNode.htmlElements?.widgetsContainer || fontsNode.htmlElements; - if (nodeElement) { - [fontParamName, textParamName].forEach(paramName => { - const input = nodeElement.querySelector(`input[name="${paramName}"], textarea[name="${paramName}"]`); - if (input) { - input.disabled = !enabled; - input.style.opacity = enabled ? "1" : "0.5"; - input.style.pointerEvents = enabled ? "auto" : "none"; - } - }); - } - - fontsNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - for (let i = 1; i <= 2; i++) { - const useFontWidget = fontsNode.widgets.find(w => w && w.name === `useFont${i}`); - const fontUrlWidget = fontsNode.widgets.find(w => w && w.name === `fontUrl${i}`); - const textWidget = fontsNode.widgets.find(w => w && w.name === `text${i}`); - if (useFontWidget && fontUrlWidget && textWidget) { - toggleFontGroup(useFontWidget, fontUrlWidget, textWidget, `fontUrl${i}`, `text${i}`); - } - } -} - -function threeDInferenceToggleHandler(node) { - const useSeedWidget = node.widgets.find(w => w && w.name === "useSeed"); - const seedWidget = node.widgets.find(w => w && w.name === "seed"); - const useOutputQualityWidget = node.widgets.find(w => w.name === "useOutputQuality"); - const outputQualityWidget = node.widgets.find(w => w.name === "outputQuality"); - - if (useSeedWidget && seedWidget) { - function toggleSeed() { - const enabled = useSeedWidget.value === true; - toggleWidgetEnabled(seedWidget, enabled, node); - if (seedWidget.options && seedWidget.options.element) { - seedWidget.options.element.disabled = !enabled; - seedWidget.options.element.style.opacity = enabled ? "1" : "0.5"; - seedWidget.options.element.style.pointerEvents = enabled ? "auto" : "none"; - } - node.setDirtyCanvas(true); - } - setTimeout(toggleSeed, 100); - appendWidgetCB(useSeedWidget, () => setTimeout(toggleSeed, 50)); - } - - if (!useOutputQualityWidget || !outputQualityWidget) return; - function toggleEnabled() { - const enabled = useOutputQualityWidget.value === true; - toggleWidgetEnabled(outputQualityWidget, enabled, node); - node.setDirtyCanvas(true); - } - appendWidgetCB(useOutputQualityWidget, () => setTimeout(toggleEnabled, 50)); - setTimeout(toggleEnabled, 100); -} - -function threeDInferenceSettingsToggleHandler(node) { - const pairs = [ - ["useTextureSize", "textureSize"], - ["useDecimationTarget", "decimationTarget"], - ["useRemesh", "remesh"], - ["useResolution", "resolution"], - ["useImageAutoFix", "imageAutoFix"], - ["useFaceLimit", "faceLimit"], - ["useTexture", "texture"], - ["usePbr", "pbr"], - ["useTextureSeed", "textureSeed"], - ["useTextureAlignment", "textureAlignment"], - ["useTextureQuality", "textureQuality"], - ["useAutoSize", "autoSize"], - ["useOrientation", "orientation"], - ["useQuad", "quad"], - ["useCompress", "compress"], - ["useSmartLowPoly", "smartLowPoly"], - ["useGenerateParts", "generateParts"], - ["useExportUv", "exportUv"], - ["useGeometryQuality", "geometryQuality"], - ["useOriginalAlpha", "originalAlpha"], - ["useMaterial", "material"], - ["useQuality", "quality"], - ["usePolyCount", "polyCount"], - ["useTaPose", "taPose"], - ["useBoundingBox", "boundingBox"], - ["useMeshMode", "meshMode"], - ["useAddons", "addons"], - ["useHdTexture", "hdTexture"], - ["useMeshType", "meshType"], - ["useTopology", "topology"], - ["useDecimation", "decimation"], - ["useSymmetry", "symmetry"], - ["usePose", "pose"], - ["useImageEnhancement", "imageEnhancement"], - ["useRemoveLighting", "removeLighting"], - ["useOrigin", "origin"], - ["useModeration", "moderation"], - ["useSavePreRemeshedModel", "savePreRemeshedModel"], - ["useTexturePrompt", "texturePrompt"], - ["useFaceCount", "faceCount"], - ["useGenerateType", "generateType"], - ["usePolygonType", "polygonType"], - ["useGeometryOnly", "geometryOnly"], - ["useRemeshBand", "remeshBand"], - ["useRemeshProject", "remeshProject"], - ["useTextureFormat", "textureFormat"], - ["useAlphaMode", "alphaMode"], - ]; - pairs.forEach(([useName, paramName]) => { - const useW = node.widgets.find(w => w.name === useName); - const paramW = node.widgets.find(w => w.name === paramName); - if (!useW || !paramW) return; - function toggleEnabled() { - const enabled = useW.value === true; - toggleWidgetEnabled(paramW, enabled, node); - node.setDirtyCanvas(true); - } - appendWidgetCB(useW, () => setTimeout(toggleEnabled, 50)); - setTimeout(toggleEnabled, 100); - }); -} - -function threeDInferenceSettingsLatToggleHandler(node) { - const pairs = [ - ["useGuidanceStrength", "guidanceStrength"], - ["useGuidanceRescale", "guidanceRescale"], - ["useSteps", "steps"], - ["useRescaleT", "rescaleT"], - ]; - pairs.forEach(([useName, paramName]) => { - const useW = node.widgets.find(w => w.name === useName); - const paramW = node.widgets.find(w => w.name === paramName); - if (!useW || !paramW) return; - function toggleEnabled() { - const enabled = useW.value === true; - toggleWidgetEnabled(paramW, enabled, node); - node.setDirtyCanvas(true); - } - appendWidgetCB(useW, () => setTimeout(toggleEnabled, 50)); - setTimeout(toggleEnabled, 100); - }); -} - -function threeDInferenceSettingsMeshClusterToggleHandler(node) { - const pairs = [ - ["useThresholdConeHalfAngleRad", "thresholdConeHalfAngleRad"], - ["useRefineIterations", "refineIterations"], - ["useGlobalIterations", "globalIterations"], - ["useSmoothStrength", "smoothStrength"], - ]; - pairs.forEach(([useName, paramName]) => { - const useW = node.widgets.find(w => w.name === useName); - const paramW = node.widgets.find(w => w.name === paramName); - if (!useW || !paramW) return; - function toggleEnabled() { - const enabled = useW.value === true; - toggleWidgetEnabled(paramW, enabled, node); - node.setDirtyCanvas(true); - } - appendWidgetCB(useW, () => setTimeout(toggleEnabled, 50)); - setTimeout(toggleEnabled, 100); - }); -} - -function threeDInferenceSettingsDracoCompressionToggleHandler(node) { - const pairs = [ - ["useEnabled", "enabled"], - ["useLevel", "level"], - ["useQuantizationPosition", "quantizationPosition"], - ["useQuantizationNormal", "quantizationNormal"], - ["useQuantizationTexCoord", "quantizationTexCoord"], - ]; - pairs.forEach(([useName, paramName]) => { - const useW = node.widgets.find(w => w.name === useName); - const paramW = node.widgets.find(w => w.name === paramName); - if (!useW || !paramW) return; - function toggleEnabled() { - const enabled = useW.value === true; - toggleWidgetEnabled(paramW, enabled, node); - node.setDirtyCanvas(true); - } - appendWidgetCB(useW, () => setTimeout(toggleEnabled, 50)); - setTimeout(toggleEnabled, 100); - }); -} - -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"); - const backgroundWidget = openaiNode.widgets.find(w => w.name === "background"); - const useStyleWidget = openaiNode.widgets.find(w => w.name === "useStyle"); - const styleWidget = openaiNode.widgets.find(w => w.name === "style"); - - // Helper function to toggle widget enabled state (exact same pattern, but handles COMBO) - function toggleWidgetState(useWidget, paramWidget, paramName) { - if (!useWidget || !paramWidget) return; - - function toggleEnabled() { - // For COMBO widgets, check if value is "enable" - const enabled = useWidget.value === "enable" || useWidget.value === "Enable"; - - 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; - } - - // Handle dropdown widgets - 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"; - } - - paramWidget.disabled = !enabled; - - if (!paramWidget.inputEl) { - const nodeElement = openaiNode.htmlElements?.widgetsContainer || openaiNode.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"; - } - } - } - } - - openaiNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - // Set up all toggle handlers - if (useBackgroundWidget && backgroundWidget) { - toggleWidgetState(useBackgroundWidget, backgroundWidget, "background"); - } - - if (useStyleWidget && styleWidget) { - toggleWidgetState(useStyleWidget, styleWidget, "style"); - } -} - -function pixverseProviderSettingsToggleHandler(pixverseNode) { - // Find all "use" parameter widgets for Pixverse Provider Settings - const useEffectWidget = pixverseNode.widgets.find(w => w.name === "useEffect"); - const effectWidget = pixverseNode.widgets.find(w => w.name === "effect"); - const useCameraMovementWidget = pixverseNode.widgets.find(w => w.name === "useCameraMovement"); - const cameraMovementWidget = pixverseNode.widgets.find(w => w.name === "cameraMovement"); - const useStyleWidget = pixverseNode.widgets.find(w => w.name === "useStyle"); - const styleWidget = pixverseNode.widgets.find(w => w.name === "style"); - const useMotionModeWidget = pixverseNode.widgets.find(w => w.name === "useMotionMode"); - const motionModeWidget = pixverseNode.widgets.find(w => w.name === "motionMode"); - const useSoundEffectSwitchWidget = pixverseNode.widgets.find(w => w.name === "useSoundEffectSwitch"); - const soundEffectSwitchWidget = pixverseNode.widgets.find(w => w.name === "soundEffectSwitch"); - const useSoundEffectContentWidget = pixverseNode.widgets.find(w => w.name === "useSoundEffectContent"); - const soundEffectContentWidget = pixverseNode.widgets.find(w => w.name === "soundEffectContent"); - const useAudioWidget = pixverseNode.widgets.find(w => w.name === "useAudio"); - const audioWidget = pixverseNode.widgets.find(w => w.name === "audio"); - const useMultiClipWidget = pixverseNode.widgets.find(w => w.name === "useMultiClip"); - const multiClipWidget = pixverseNode.widgets.find(w => w.name === "multiClip"); - const useThinkingWidget = pixverseNode.widgets.find(w => w.name === "useThinking"); - const thinkingWidget = pixverseNode.widgets.find(w => w.name === "thinking"); - - // Helper function to toggle widget enabled state (exact same pattern) - 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; - } - - // Handle dropdown widgets - 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"; - } - - paramWidget.disabled = !enabled; - - if (!paramWidget.inputEl) { - const nodeElement = pixverseNode.htmlElements?.widgetsContainer || pixverseNode.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"; - } - } - } - } - - pixverseNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - // Set up all toggle handlers - if (useEffectWidget && effectWidget) { - toggleWidgetState(useEffectWidget, effectWidget, "effect"); - } - - if (useCameraMovementWidget && cameraMovementWidget) { - toggleWidgetState(useCameraMovementWidget, cameraMovementWidget, "cameraMovement"); - } - - if (useStyleWidget && styleWidget) { - toggleWidgetState(useStyleWidget, styleWidget, "style"); - } - - if (useMotionModeWidget && motionModeWidget) { - toggleWidgetState(useMotionModeWidget, motionModeWidget, "motionMode"); - } - - if (useSoundEffectSwitchWidget && soundEffectSwitchWidget) { - toggleWidgetState(useSoundEffectSwitchWidget, soundEffectSwitchWidget, "soundEffectSwitch"); - } - - if (useSoundEffectContentWidget && soundEffectContentWidget) { - toggleWidgetState(useSoundEffectContentWidget, soundEffectContentWidget, "soundEffectContent"); - } - - if (useAudioWidget && audioWidget) { - toggleWidgetState(useAudioWidget, audioWidget, "audio"); - } - - if (useMultiClipWidget && multiClipWidget) { - toggleWidgetState(useMultiClipWidget, multiClipWidget, "multiClip"); - } - - if (useThinkingWidget && thinkingWidget) { - toggleWidgetState(useThinkingWidget, thinkingWidget, "thinking"); - } -} - -function lightricksProviderSettingsToggleHandler(lightricksNode) { - const useStartTimeWidget = lightricksNode.widgets.find(w => w.name === "useStartTime"); - const startTimeWidget = lightricksNode.widgets.find(w => w.name === "startTime"); - const useDurationWidget = lightricksNode.widgets.find(w => w.name === "useDuration"); - const durationWidget = lightricksNode.widgets.find(w => w.name === "duration"); - const useModeWidget = lightricksNode.widgets.find(w => w.name === "useMode"); - const modeWidget = lightricksNode.widgets.find(w => w.name === "mode"); - const useGenerateAudioWidget = lightricksNode.widgets.find(w => w.name === "useGenerateAudio"); - const generateAudioWidget = lightricksNode.widgets.find(w => w.name === "generateAudio"); - - 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; - } - - 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"; - } - - paramWidget.disabled = !enabled; - - if (!paramWidget.inputEl) { - const nodeElement = lightricksNode.htmlElements?.widgetsContainer || lightricksNode.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"; - } - } - } - } - - lightricksNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - if (useStartTimeWidget && startTimeWidget) { - toggleWidgetState(useStartTimeWidget, startTimeWidget, "startTime"); - } - - if (useDurationWidget && durationWidget) { - toggleWidgetState(useDurationWidget, durationWidget, "duration"); - } - - if (useModeWidget && modeWidget) { - toggleWidgetState(useModeWidget, modeWidget, "mode"); - } - - if (useGenerateAudioWidget && generateAudioWidget) { - toggleWidgetState(useGenerateAudioWidget, generateAudioWidget, "generateAudio"); - } -} - -function imageInferenceToggleHandler(imageInferenceNode) { - // Find all "use" parameter widgets for Image Inference - const useStepsWidget = imageInferenceNode.widgets.find(w => w.name === "useSteps"); - const stepsWidget = imageInferenceNode.widgets.find(w => w.name === "steps"); - const useSeedWidget = imageInferenceNode.widgets.find(w => w.name === "useSeed"); - const seedWidget = imageInferenceNode.widgets.find(w => w.name === "seed"); - const useCFGScaleWidget = imageInferenceNode.widgets.find(w => w.name === "useCFGScale"); - const cfgScaleWidget = imageInferenceNode.widgets.find(w => w.name === "cfgScale"); - const useSchedulerWidget = imageInferenceNode.widgets.find(w => w.name === "useScheduler"); - const schedulerWidget = imageInferenceNode.widgets.find(w => w.name === "scheduler"); - const useClipSkipWidget = imageInferenceNode.widgets.find(w => w.name === "useClipSkip"); - const clipSkipWidget = imageInferenceNode.widgets.find(w => w.name === "clipSkip"); - const maskMarginWidget = imageInferenceNode.widgets.find(w => w.name === "Mask Margin"); - const maskMarginValueWidget = imageInferenceNode.widgets.find(w => w.name === "maskMargin"); - const useResolutionWidget = imageInferenceNode.widgets.find(w => w.name === "useResolution"); - const resolutionWidget = imageInferenceNode.widgets.find(w => w.name === "resolution"); - const useUpscaleFactorWidget = imageInferenceNode.widgets.find(w => w.name === "useUpscaleFactor"); - const upscaleFactorWidget = imageInferenceNode.widgets.find(w => w.name === "upscaleFactor"); - const dimensionsWidget = imageInferenceNode.widgets.find(w => w.name === "dimensions"); - const widthWidget = imageInferenceNode.widgets.find(w => w.name === "width"); - const heightWidget = imageInferenceNode.widgets.find(w => w.name === "height"); - - // Helper function to toggle widget enabled state (exact same pattern as videoInferenceDimensionsHandler) - function toggleWidgetState(useWidget, paramWidget, paramName) { - if (!useWidget || !paramWidget) return; - - function toggleEnabled() { - const enabled = useWidget.value === true; - - // Disable/enable widgets using inputEl if available (exact same pattern) - 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; - } - // Also set widget property - paramWidget.disabled = !enabled; - - // Fallback: try to find inputs via DOM if inputEl is not available - if (!paramWidget.inputEl) { - const nodeElement = imageInferenceNode.htmlElements?.widgetsContainer || imageInferenceNode.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"; - } - } - } - } - - imageInferenceNode.setDirtyCanvas(true); - } - - // Set up callback (exact same pattern as useCustomDimensions) - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - // Initial call to set initial state - setTimeout(toggleEnabled, 100); - } - - // Set up all toggle handlers - if (useStepsWidget && stepsWidget) { - toggleWidgetState(useStepsWidget, stepsWidget, "steps"); - } - - if (useSeedWidget && seedWidget) { - toggleWidgetState(useSeedWidget, seedWidget, "seed"); - } - - if (useCFGScaleWidget && cfgScaleWidget) { - toggleWidgetState(useCFGScaleWidget, cfgScaleWidget, "cfgScale"); - } - - if (useSchedulerWidget && schedulerWidget) { - toggleWidgetState(useSchedulerWidget, schedulerWidget, "scheduler"); - } - - if (useClipSkipWidget && clipSkipWidget) { - toggleWidgetState(useClipSkipWidget, clipSkipWidget, "clipSkip"); - } - - // Handle Mask Margin (BOOLEAN widget) - if (maskMarginWidget && maskMarginValueWidget) { - toggleWidgetState(maskMarginWidget, maskMarginValueWidget, "maskMargin"); - } - - // Handle Resolution - if (useResolutionWidget && resolutionWidget) { - toggleWidgetState(useResolutionWidget, resolutionWidget, "resolution"); - } - - if (useUpscaleFactorWidget && upscaleFactorWidget) { - toggleWidgetState(useUpscaleFactorWidget, upscaleFactorWidget, "upscaleFactor"); - } - - // Handle Dimensions - disable width/height when dimensions is "None" - if (dimensionsWidget && widthWidget && heightWidget) { - function toggleDimensionsState() { - const dimensionsValue = dimensionsWidget.value; - const enabled = dimensionsValue !== "None"; - - // Toggle width widget - if (widthWidget.inputEl) { - widthWidget.inputEl.disabled = !enabled; - widthWidget.inputEl.style.opacity = enabled ? "1" : "0.5"; - widthWidget.inputEl.style.cursor = enabled ? "text" : "not-allowed"; - widthWidget.inputEl.readOnly = !enabled; - } - widthWidget.disabled = !enabled; - - // Toggle height widget - if (heightWidget.inputEl) { - heightWidget.inputEl.disabled = !enabled; - heightWidget.inputEl.style.opacity = enabled ? "1" : "0.5"; - heightWidget.inputEl.style.cursor = enabled ? "text" : "not-allowed"; - heightWidget.inputEl.readOnly = !enabled; - } - heightWidget.disabled = !enabled; - - // Fallback: try to find inputs via DOM if inputEl is not available - if (!widthWidget.inputEl || !heightWidget.inputEl) { - const nodeElement = imageInferenceNode.htmlElements?.widgetsContainer || imageInferenceNode.htmlElements; - if (nodeElement) { - const widthInput = nodeElement.querySelector(`input[name="width"]`); - const heightInput = nodeElement.querySelector(`input[name="height"]`); - if (widthInput) { - widthInput.disabled = !enabled; - widthInput.style.opacity = enabled ? "1" : "0.5"; - widthInput.style.cursor = enabled ? "text" : "not-allowed"; - widthInput.readOnly = !enabled; - } - if (heightInput) { - heightInput.disabled = !enabled; - heightInput.style.opacity = enabled ? "1" : "0.5"; - heightInput.style.cursor = enabled ? "text" : "not-allowed"; - heightInput.readOnly = !enabled; - } - } - } - - imageInferenceNode.setDirtyCanvas(true); - } - - appendWidgetCB(dimensionsWidget, () => { - setTimeout(toggleDimensionsState, 50); - }); - - setTimeout(toggleDimensionsState, 100); - } -} - -function videoInferenceDimensionsHandler(videoInferenceNode) { - // Find "use" parameter widgets for Video Inference - const useDurationWidget = videoInferenceNode.widgets.find(w => w.name === "useDuration"); - const durationWidget = videoInferenceNode.widgets.find(w => w.name === "duration"); - const useFpsWidget = videoInferenceNode.widgets.find(w => w.name === "useFps"); - const fpsWidget = videoInferenceNode.widgets.find(w => w.name === "fps"); - const useSeedWidget = videoInferenceNode.widgets.find(w => w.name === "useSeed"); - const seedWidget = videoInferenceNode.widgets.find(w => w.name === "seed"); - const useStepsWidget = videoInferenceNode.widgets.find(w => w.name === "useSteps"); - const stepsWidget = videoInferenceNode.widgets.find(w => w.name === "steps"); - const useBatchSizeWidget = videoInferenceNode.widgets.find(w => w.name === "useBatchSize"); - const batchSizeWidget = videoInferenceNode.widgets.find(w => w.name === "batchSize"); - const useSchedulersWidget = videoInferenceNode.widgets.find(w => w.name === "useSchedulers"); - const schedulerWidget = videoInferenceNode.widgets.find(w => w.name === "scheduler"); - const useCFGScaleWidget = videoInferenceNode.widgets.find(w => w.name === "useCFGScale"); - const cfgScaleWidget = videoInferenceNode.widgets.find(w => w.name === "cfgScale"); - const useTtlWidget = videoInferenceNode.widgets.find(w => w.name === "useTtl"); - const ttlWidget = videoInferenceNode.widgets.find(w => w.name === "ttl"); - - // Helper function to toggle widget enabled state - function toggleWidgetState(useWidget, paramWidget, paramName) { - if (!useWidget || !paramWidget) return; - - function toggleEnabled() { - const enabled = useWidget.value === true; - - // Disable/enable widgets using inputEl if available - 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; - } - // Also set widget property - paramWidget.disabled = !enabled; - - // Fallback: try to find inputs via DOM if inputEl is not available - if (!paramWidget.inputEl) { - const nodeElement = videoInferenceNode.htmlElements?.widgetsContainer || videoInferenceNode.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"; - } - } - } - } - - videoInferenceNode.setDirtyCanvas(true); - } - - // Set up callback - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - // Initial call to set initial state - setTimeout(toggleEnabled, 100); - } - - // Set up all toggle handlers for "use" parameters - if (useDurationWidget && durationWidget) { - toggleWidgetState(useDurationWidget, durationWidget, "duration"); - } - - if (useFpsWidget && fpsWidget) { - toggleWidgetState(useFpsWidget, fpsWidget, "fps"); - } - - if (useSeedWidget && seedWidget) { - toggleWidgetState(useSeedWidget, seedWidget, "seed"); - } - - if (useStepsWidget && stepsWidget) { - toggleWidgetState(useStepsWidget, stepsWidget, "steps"); - } - - if (useBatchSizeWidget && batchSizeWidget) { - toggleWidgetState(useBatchSizeWidget, batchSizeWidget, "batchSize"); - } - - if (useSchedulersWidget && schedulerWidget) { - toggleWidgetState(useSchedulersWidget, schedulerWidget, "scheduler"); - } - - if (useCFGScaleWidget && cfgScaleWidget) { - toggleWidgetState(useCFGScaleWidget, cfgScaleWidget, "cfgScale"); - } - - if (useTtlWidget && ttlWidget) { - toggleWidgetState(useTtlWidget, ttlWidget, "ttl"); - } -} - -function videoModelSearchFilterHandler(videoModelSearchNode) { - const modelArchWidget = videoModelSearchNode.widgets.find(w => w.name === "Model Architecture"); - const videoListWidget = videoModelSearchNode.widgets.find(w => w.name === "VideoList"); - const widthWidget = videoModelSearchNode.widgets.find(w => w.name === "Width"); - const heightWidget = videoModelSearchNode.widgets.find(w => w.name === "Height"); - const useCustomDimensionsWidget = videoModelSearchNode.widgets.find(w => w.name === "useCustomDimensions"); - const useResolutionWidget = videoModelSearchNode.widgets.find(w => w.name === "useResolution"); - const resolutionWidget = videoModelSearchNode.widgets.find(w => w.name === "resolution"); - - if (!modelArchWidget || !videoListWidget) return; - - const VIDEO_MODELS = { - "KlingAI": [ - "klingai:1@2 (KlingAI V1.0 Pro)", "klingai:1@1 (KlingAI V1 Standard)", - "klingai:2@2 (KlingAI V1.5 Pro)", "klingai:2@1 (KlingAI V1.5 Standard)", - "klingai:3@1 (KlingAI V1.6 Standard)", "klingai:3@2 (KlingAI V1.6 Pro)", - "klingai:4@3 (KlingAI V2.1 Master)", "klingai:5@1 (KlingAI V2.1 Standard (I2V))", - "klingai:5@2 (KlingAI V2.1 Pro (I2V))", "klingai:5@3 (KlingAI V2.0 Master)", - "klingai:6@1 (KlingAI 2.5 Turbo Pro)", - "klingai:7@1 (KlingAI Lip-Sync)", - "klingai:kling@o1 (Kling VIDEO O1)", - "klingai:kling-video@2.6-pro (Kling VIDEO 2.6 Pro)", - "klingai:kling-video@3-pro (Kling VIDEO 3.0 Pro)", - "klingai:kling-video@3-standard (Kling VIDEO 3.0 Standard)", - "klingai:kling-video@3.0-turbo (Kling VIDEO 3.0 Turbo)", - "klingai:kling-video@3-4k (Kling VIDEO 3.0 4K)", - "klingai:kling-video@o3-pro (Kling VIDEO O3 Pro)", - "klingai:kling-video@o3-standard (Kling VIDEO O3 Standard)", - "klingai:kling-video@o3-4k (Kling VIDEO O3 4K)", - "klingai:avatar@2.0-standard (KlingAI Avatar 2.0 Standard)", - "klingai:avatar@2.0-pro (KlingAI Avatar 2.0 Pro)", - ], - "Google": [ - "google:2@0 (Veo 2.0)", "google:3@0 (Veo 3.0)", "google:3@1 (Veo 3.0 Fast)", - "google:3@2 (Veo 3.1)", "google:3@3 (Veo 3.1 Fast)", - "google:veo@3.1-lite (Veo 3.1 Lite)", - "google:gemini@omni-flash (Gemini Omni Flash)", - ], - "Bytedance": [ - "bytedance:2@1 (Seedance 1.0 Pro)", "bytedance:1@1 (Seedance 1.0 Lite)", - "bytedance:5@1 (OmniHuman 1)", "bytedance:5@2 (OmniHuman 1.5)", - "bytedance:seedance@1.5-pro (Seedance 1.5 Pro)", - "bytedance:seedance@2.0-fast (Seedance 2.0 Fast)", - "bytedance:seedance@2.0 (Seedance 2.0)", - "bytedance:seedance@2.0-mini (Seedance 2.0 Mini)", - ], - "MiniMax": [ - "minimax:1@1 (MiniMax 01 Base)", "minimax:2@1 (MiniMax 01 Director)", - "minimax:2@3 (MiniMax I2V 01 Live)", "minimax:3@1 (MiniMax 02 Hailuo)", - "minimax:4@1 (MiniMax Hailuo 2.3)", "minimax:4@2 (MiniMax Hailuo 2.3 Fast)", - ], - "PixVerse": [ - "pixverse:1@1 (PixVerse v3.5)", "pixverse:1@2 (PixVerse v4)", - "pixverse:1@3 (PixVerse v4.5)", "pixverse:1@5-fast (PixVerse v5 Fast)", "pixverse:1@6 (PixVerse v5.5)", "pixverse:1@7 (PixVerse v5.6)", "pixverse:1@8 (PixVerse v6)", "pixverse:lipsync@1 (PixVerse LipSync)", "pixverse:modify@0 (PixVerse Modify)", - ], - "Vidu": [ - "vidu:1@0 (Vidu Q1 Classic)", "vidu:1@1 (Vidu Q1)", - "vidu:1@5 (Vidu 1.5)", "vidu:2@0 (Vidu 2.0)", - "vidu:4@1 (Vidu Q3)", - "vidu:4@2 (Vidu Q3 Turbo)", - ], - "Alibaba": [ - "runware:200@1 (Wan 2.1 1.3B)", "runware:200@2 (Wan 2.1 14B)", - "runware:200@6 (Wan 2.2)", - "runware:200@8 (Wan 2.2 A14B Animate)", - "alibaba:wan@2.6 (Wan 2.6)", - "alibaba:wan@2.6-flash (Wan 2.6 Flash)", - "alibaba:wan@2.7 (Wan 2.7)", - "alibaba:happyhorse@1.0 (Alibaba Happy Horse 1.0)", - "alibaba:happyhorse@1.1 (Alibaba Happy Horse 1.1)", - ], - "OpenAI": [ - "openai:3@1 (OpenAI Sora 3.1)", "openai:3@0 (OpenAI Sora 3.0)", - ], - "Lightricks": [ - "lightricks:2@0 (LTX Fast)", "lightricks:2@1 (LTX Pro)", - "lightricks:3@1 (LTX-2 Retake)", "lightricks:ltx@2 (LTX-2)", - "lightricks:ltx@2.3 (LTX 2.3)", "lightricks:ltx@2.3-fast (LTX 2.3 Fast)", - "lightricks:ltx@2.3-open (LTX-2.3 Open)", - ], - "Ovi": [ - "runware:190@1 (Ovi)", - ], - "Runway": [ - "runway:aleph@2.0 (Runway Aleph 2.0)", - "runway:2@1 (Runway Aleph)", - "runway:1@1 (Runway Gen-4 Turbo)", - "runway:1@2 (Runway Gen-4.5)", - ], - "Luma": [ - "lumaai:1@1 (Luma Ray 1.6)", - "lumaai:2@1 (Luma Ray 2)", - "lumaai:2@2 (Luma Ray 2 Flash)", - "luma:ray@3.2 (Luma Ray 3.2)", - ], - "Sync": [ - "sync:lipsync-2@1 (Sync LipSync 2)", - "sync:lipsync-2-pro@1 (Sync LipSync 2 Pro)", - "sync:react-1@1 (Sync React-1)", - "sync:3@0 (Sync 3)", - ], - "Bria": [ - "bria:60@1 (Bria Video Eraser)", - ], - "Creatify": [ - "creatify:aurora@fast (Creatify Aurora Avatar Model API (720p))", - "creatify:aurora@0 (Creatify Aurora Avatar Model API (720p))", - ], - "HeyGen": [ - "heygen:avatar@4 (HeyGen Avatar IV)", - "heygen:video-agent@0 (HeyGen Video Agent)", - "heygen:avatar@5 (HeyGen Avatar V)", - ], - "Hunyuan": [ - "runware:hunyuanvideo@1.5 (HunyuanVideo-1.5)", - ], - "Kandinsky": [ - "runware:210@1 (Kandinsky 5.0 Lite)", - ], - "xAI": [ - "xai:grok-imagine@video-1.5 (Grok Imagine Video 1.5)", - "xai:grok-imagine@video-1.5-preview (Grok Imagine Video 1.5 Preview)", - "xai:grok-imagine@video (Grok Imagine Video)", - ], - "VEED": [ - "veed:fabric@1.0 (VEED Fabric 1.0)", - ], - "Pruna": [ - "prunaai:p-video@0 (P-Video)", - "prunaai:p-video@avatar (P-Video Avatar)", - "prunaai:p-video@animate (P-Video Animate)", - "prunaai:p-video@replace (P-Video Replace)", - ], - "SkyReels": [ - "skywork:skyreels@v4 (SkyReels V4)", - ], - }; - - const MODEL_DIMENSIONS = { - "klingai:1@2": {"width": 1280, "height": 720}, - "klingai:1@1": {"width": 1280, "height": 720}, - "klingai:2@2": {"width": 1920, "height": 1080}, - "klingai:2@1": {"width": 1280, "height": 720}, - "klingai:3@1": {"width": 1280, "height": 720}, - "klingai:3@2": {"width": 1920, "height": 1080}, - "klingai:4@3": {"width": 1280, "height": 720}, - "klingai:5@1": {"width": 1280, "height": 720}, - "klingai:5@2": {"width": 1920, "height": 1080}, - "klingai:5@3": {"width": 1920, "height": 1080}, - "klingai:6@1": {"width": 1920, "height": 1080}, - "klingai:7@1": {"width": 0, "height": 0}, - "klingai:kling@o1": {"width": 1440, "height": 1440}, - "klingai:kling-video@2.6-pro": {"width": 1920, "height": 1080}, - "klingai:kling-video@3-pro": {"width": 1920, "height": 1080}, - "klingai:kling-video@3-standard": {"width": 1920, "height": 1080}, - "klingai:kling-video@3.0-turbo": {"width": 1920, "height": 1080}, - "klingai:kling-video@3-4k": {"width": 3840, "height": 2160}, - "klingai:kling-video@o3-pro": {"width": 1920, "height": 1080}, - "klingai:kling-video@o3-standard": {"width": 1920, "height": 1080}, - "klingai:kling-video@o3-4k": {"width": 3840, "height": 2160}, - "klingai:avatar@2.0-standard": {"width": 0, "height": 0}, - "klingai:avatar@2.0-pro": {"width": 0, "height": 0}, - "google:2@0": {"width": 1280, "height": 720}, - "google:3@0": {"width": 1280, "height": 720}, - "google:3@1": {"width": 1280, "height": 720}, - "google:3@2": {"width": 1280, "height": 720}, - "google:3@3": {"width": 1280, "height": 720}, - "google:veo@3.1-lite": {"width": 1280, "height": 720}, - "google:gemini@omni-flash": {"width": 1280, "height": 720}, - "bytedance:2@1": {"width": 864, "height": 480}, - "bytedance:1@1": {"width": 864, "height": 480}, - "bytedance:5@1": {"width": 1024, "height": 1024}, - "bytedance:5@2": {"width": 1024, "height": 1024}, - "bytedance:seedance@1.5-pro": {"width": 864, "height": 496}, - "bytedance:seedance@2.0-fast": {"width": 864, "height": 496}, - "bytedance:seedance@2.0": {"width": 864, "height": 496}, - "bytedance:seedance@2.0-mini": {"width": 864, "height": 496}, - "minimax:1@1": {"width": 1366, "height": 768}, - "minimax:2@1": {"width": 1366, "height": 768}, - "minimax:2@3": {"width": 1366, "height": 768}, - "minimax:3@1": {"width": 1366, "height": 768}, - "minimax:4@1": {"width": 1366, "height": 768}, - "minimax:4@2": {"width": 1366, "height": 768}, - "pixverse:1@1": {"width": 640, "height": 360}, - "pixverse:1@2": {"width": 640, "height": 360}, - "pixverse:1@3": {"width": 640, "height": 360}, - "pixverse:1@5-fast": {"width": 640, "height": 360}, - "pixverse:1@6": {"width": 640, "height": 360}, - "pixverse:1@7": {"width": 640, "height": 360}, - "pixverse:1@8": {"width": 640, "height": 360}, - "pixverse:lipsync@1": {"width": 640, "height": 360}, - "pixverse:modify@0": {"width": 640, "height": 360}, - "vidu:1@0": {"width": 1920, "height": 1080}, - "vidu:1@1": {"width": 1920, "height": 1080}, - "vidu:1@5": {"width": 1920, "height": 1080}, - "vidu:2@0": {"width": 1920, "height": 1080}, - "vidu:4@1": {"width": 1920, "height": 1080}, - "vidu:4@2": {"width": 1920, "height": 1080}, - "runware:200@1": {"width": 853, "height": 480}, - "runware:200@2": {"width": 853, "height": 480}, - "runware:200@6": {"width": 1280, "height": 720}, - "runware:200@8": {"width": 1104, "height": 832}, - "alibaba:wan@2.6": {"width": 1280, "height": 720}, - "alibaba:wan@2.6-flash": {"width": 1280, "height": 720}, - "alibaba:wan@2.7": {"width": 1280, "height": 720}, - "alibaba:happyhorse@1.0": {"width": 1280, "height": 720}, - "alibaba:happyhorse@1.1": {"width": 1280, "height": 720}, - "openai:3@1": {"width": 1280, "height": 720}, - "openai:3@0": {"width": 1280, "height": 720}, - "lightricks:2@0": {"width": 1920, "height": 1080}, - "lightricks:2@1": {"width": 1920, "height": 1080}, - "lightricks:3@1": {"width": 0, "height": 0}, - "lightricks:ltx@2": {"width": 1024, "height": 1024}, - "lightricks:ltx@2.3": {"width": 1920, "height": 1080}, - "lightricks:ltx@2.3-fast": {"width": 1920, "height": 1080}, - "lightricks:ltx@2.3-open": {"width": 1024, "height": 1024}, - "runware:190@1": {"width": 0, "height": 0}, - "runway:aleph@2.0": {"width": 0, "height": 0}, - "runway:2@1": {"width": 1280, "height": 720}, - "runway:1@1": {"width": 1280, "height": 720}, - "runway:1@2": {"width": 1280, "height": 720}, - "lumaai:1@1": {"width": 1080, "height": 720}, - "lumaai:2@1": {"width": 1080, "height": 720}, - "lumaai:2@2": {"width": 1080, "height": 720}, - "luma:ray@3.2": {"width": 1280, "height": 720}, - "sync:lipsync-2@1": {"width": 0, "height": 0}, - "sync:lipsync-2-pro@1": {"width": 0, "height": 0}, - "sync:react-1@1": {"width": 0, "height": 0}, - "sync:3@0": {"width": 1280, "height": 720}, - "bria:60@1": {"width": 1280, "height": 720}, - "creatify:aurora@fast": {"width": 1280, "height": 720}, - "creatify:aurora@0": {"width": 1280, "height": 720}, - "runware:hunyuanvideo@1.5": {"width": 848, "height": 480}, - "runware:210@1": {"width": 512, "height": 512}, - "xai:grok-imagine@video-1.5": {"width": 480, "height": 480}, - "xai:grok-imagine@video-1.5-preview": {"width": 480, "height": 480}, - "xai:grok-imagine@video": {"width": 480, "height": 480}, - "veed:fabric@1.0": {"width": 1280, "height": 720}, - "prunaai:p-video@0": {"width": 1280, "height": 720}, - "prunaai:p-video@avatar": {"width": 1280, "height": 720}, - "prunaai:p-video@animate": {"width": 1280, "height": 720}, - "prunaai:p-video@replace": {"width": 1280, "height": 720}, - "heygen:avatar@4": {"width": 1280, "height": 720}, - "heygen:video-agent@0": {"width": 1280, "height": 720}, - "heygen:avatar@5": {"width": 1280, "height": 720}, - "skywork:skyreels@v4": {"width": 1280, "height": 720}, - }; - - const MODEL_RESOLUTIONS = { - "klingai:1@2": "720p", - "klingai:1@1": "720p", - "klingai:2@2": "1080p", - "klingai:2@1": "720p", - "klingai:3@1": "720p", - "klingai:3@2": "1080p", - "klingai:4@3": "720p", - "klingai:5@1": "720p", - "klingai:5@2": "1080p", - "klingai:5@3": "1080p", - "klingai:6@1": "1080p", - "klingai:7@1": null, // No resolution support - "klingai:kling@o1": null, // No standard resolution - "klingai:kling-video@2.6-pro": "1080p", - "klingai:kling-video@3-pro": "1080p", - "klingai:kling-video@3-standard": "1080p", - "klingai:kling-video@3.0-turbo": "1080p", - "klingai:kling-video@3-4k": null, // No 4K option in current resolution dropdown - "klingai:kling-video@o3-pro": "1080p", - "klingai:kling-video@o3-standard": "1080p", - "klingai:kling-video@o3-4k": null, // No 4K option in current resolution dropdown - "klingai:avatar@2.0-standard": null, // No resolution support - "klingai:avatar@2.0-pro": null, // No resolution support - "google:2@0": "720p", - "google:3@0": "720p", - "google:3@1": "720p", - "google:3@2": "720p", - "google:3@3": "720p", - "google:veo@3.1-lite": "720p", - "google:gemini@omni-flash": "720p", - "bytedance:2@1": "480p", - "bytedance:1@1": "480p", - "bytedance:5@1": null, // No resolution support - "bytedance:5@2": null, // No resolution support - "bytedance:seedance@1.5-pro": "480p", - "bytedance:seedance@2.0-fast": "480p", - "bytedance:seedance@2.0": "480p", - "bytedance:seedance@2.0-mini": "480p", - "minimax:1@1": "768p", - "minimax:2@1": "768p", - "minimax:2@3": "768p", - "minimax:3@1": "768p", - "minimax:4@1": "768p", - "minimax:4@2": "768p", - "pixverse:1@1": "360p", - "pixverse:1@2": "360p", - "pixverse:1@3": "360p", - "pixverse:1@5-fast": "360p", - "pixverse:1@6": "360p", - "pixverse:1@7": "360p", - "pixverse:1@8": "360p", - "pixverse:lipsync@1": "360p", - "pixverse:modify@0": "360p", - "vidu:1@0": "1080p", - "vidu:1@1": "1080p", - "vidu:1@5": "1080p", - "vidu:2@0": "1080p", - "vidu:4@1": "1080p", - "vidu:4@2": "1080p", - "runware:200@1": "480p", - "runware:200@2": "480p", - "runware:200@6": "720p", - "runware:200@8": "720p", - "alibaba:wan@2.6": "720p", - "alibaba:wan@2.6-flash": "720p", - "alibaba:wan@2.7": "720p", - "alibaba:happyhorse@1.0": "720p", - "alibaba:happyhorse@1.1": "720p", - "openai:3@1": "720p", - "openai:3@0": "720p", - "lightricks:2@0": "1080p", - "lightricks:2@1": "1080p", - "lightricks:3@1": null, // No resolution support - "lightricks:ltx@2": null, // No resolution support (fixed 1024x1024) - "lightricks:ltx@2.3": "1080p", - "lightricks:ltx@2.3-fast": "1080p", - "lightricks:ltx@2.3-open": null, // No resolution support (fixed 1024x1024) - "runware:190@1": null, // No resolution support - "runway:aleph@2.0": null, // Output ratio matches input video - "runway:2@1": "720p", - "runway:1@1": "720p", - "runway:1@2": "720p", - "lumaai:1@1": "720p", - "lumaai:2@1": "720p", - "lumaai:2@2": "720p", - "luma:ray@3.2": "720p", - "sync:lipsync-2@1": "720p", - "sync:lipsync-2-pro@1": "720p", - "sync:react-1@1": "720p", - "sync:3@0": "720p", - "bria:60@1": "720p", - "creatify:aurora@fast": "720p", - "creatify:aurora@0": "720p", - "runware:hunyuanvideo@1.5": "480p", - "runware:210@1": null, // No resolution support (fixed 512x512) - "xai:grok-imagine@video-1.5": "480p", - "xai:grok-imagine@video-1.5-preview": "480p", - "xai:grok-imagine@video": "480p", - "veed:fabric@1.0": "720p", - "prunaai:p-video@0": "720p", - "prunaai:p-video@avatar": "720p", - "prunaai:p-video@animate": "720p", - "prunaai:p-video@replace": "720p", - "heygen:avatar@4": "720p", - "heygen:video-agent@0": "720p", - "heygen:avatar@5": "720p", - "skywork:skyreels@v4": "720p", - }; - - const DEFAULT_DIMENSIONS = {"width": 1024, "height": 576}; - - function setWidthHeightEnabled(enabled) { - if (!widthWidget || !heightWidget) return; - [widthWidget, heightWidget].forEach(widget => { - widget.disabled = !enabled; - if (widget.inputEl) { - widget.inputEl.disabled = !enabled; - widget.inputEl.style.opacity = enabled ? "1" : "0.5"; - widget.inputEl.style.cursor = enabled ? "text" : "not-allowed"; - widget.inputEl.readOnly = !enabled; - } - }); - } - - function updateDimensions() { - if (!widthWidget || !heightWidget || !videoListWidget) return; - - const selectedModel = videoListWidget.value; - if (!selectedModel) return; - - const useCustomDimensionsValue = useCustomDimensionsWidget ? useCustomDimensionsWidget.value : "Model Default"; - - // Handle "Disabled" option - disable widgets and set to 0 (but Python will use None in dict) - if (useCustomDimensionsValue === "Disabled") { - setWidthHeightEnabled(false); - if (widthWidget.callback) widthWidget.callback(0, "customSetOperation"); - widthWidget.value = 0; - if (heightWidget.callback) heightWidget.callback(0, "customSetOperation"); - heightWidget.value = 0; - videoModelSearchNode.setDirtyCanvas(true); - return; - } - - // Handle "Model Default" option - disable widgets and use model defaults - if (useCustomDimensionsValue === "Model Default") { - setWidthHeightEnabled(false); - } else if (useCustomDimensionsValue === "Custom") { - // Handle "Custom" option - enable widgets - setWidthHeightEnabled(true); - } - - const modelCode = selectedModel.split(" (")[0]; - const dims = MODEL_DIMENSIONS[modelCode] || DEFAULT_DIMENSIONS; - - // Only update dimensions if "Model Default" is selected (widgets are disabled but we show the values) - if (useCustomDimensionsValue === "Model Default") { - if (dims.width === 0 && dims.height === 0) { - // Set to None when dimensions are 0,0 - if (widthWidget.callback) widthWidget.callback(null, "customSetOperation"); - if (heightWidget.callback) heightWidget.callback(null, "customSetOperation"); - videoModelSearchNode.setDirtyCanvas(true); - } else if (dims.width !== 0 && dims.height !== 0) { - if (widthWidget.callback) widthWidget.callback(dims.width, "customSetOperation"); - if (heightWidget.callback) heightWidget.callback(dims.height, "customSetOperation"); - videoModelSearchNode.setDirtyCanvas(true); - } - } - // For "Custom" mode, don't update - let user set their own values - // For "Disabled" mode, already handled above (set to None and disabled) - - // Update resolution based on selected model - if (resolutionWidget && useResolutionWidget) { - const modelCode = selectedModel.split(" (")[0]; - const modelResolution = MODEL_RESOLUTIONS[modelCode]; - - // If model supports resolution - if (modelResolution !== null && modelResolution !== undefined) { - // Enable useResolution checkbox - if (useResolutionWidget.inputEl) { - useResolutionWidget.inputEl.disabled = false; - useResolutionWidget.inputEl.style.opacity = "1"; - } - useResolutionWidget.disabled = false; - - // Only update resolution value if useResolution is enabled - if (useResolutionWidget.value === true) { - // Set resolution value to model's default - if (resolutionWidget.callback) resolutionWidget.callback(modelResolution, "customSetOperation"); - resolutionWidget.value = modelResolution; - } - } else { - // Model doesn't support resolution, disable useResolution checkbox and resolution dropdown - if (useResolutionWidget.callback) useResolutionWidget.callback(false, "customSetOperation"); - useResolutionWidget.value = false; - - // Disable useResolution checkbox - if (useResolutionWidget.inputEl) { - useResolutionWidget.inputEl.disabled = true; - useResolutionWidget.inputEl.style.opacity = "0.5"; - } - useResolutionWidget.disabled = true; - - // Disable resolution dropdown - if (resolutionWidget.inputEl) { - resolutionWidget.inputEl.disabled = true; - resolutionWidget.inputEl.style.opacity = "0.5"; - resolutionWidget.inputEl.style.cursor = "not-allowed"; - } - resolutionWidget.disabled = true; - } - videoModelSearchNode.setDirtyCanvas(true); - } - } - - function filterModelList() { - const selectedArch = modelArchWidget.value; - const selectedArchNormalized = selectedArch === "Wan" ? "Alibaba" : selectedArch; - let filteredModels = []; - - if (selectedArchNormalized === "All") { - Object.values(VIDEO_MODELS).forEach(models => filteredModels.push(...models)); - } else if (VIDEO_MODELS[selectedArchNormalized]) { - filteredModels = VIDEO_MODELS[selectedArchNormalized]; - } - - if (filteredModels.length > 0) { - const currentValue = videoListWidget.value; - videoListWidget.options.values = filteredModels; - - if (!filteredModels.includes(currentValue)) { - videoListWidget.value = filteredModels[0]; - } - - updateDimensions(); - videoModelSearchNode.setDirtyCanvas(true); - } - } - - appendWidgetCB(modelArchWidget, filterModelList); - if (videoListWidget) { - appendWidgetCB(videoListWidget, updateDimensions); - } - if (useCustomDimensionsWidget) { - appendWidgetCB(useCustomDimensionsWidget, () => { - updateDimensions(); - }); - } - - // Handle useResolution toggle - if (useResolutionWidget && resolutionWidget) { - function toggleResolutionState() { - // Check if current model supports resolution - const selectedModel = videoListWidget ? videoListWidget.value : null; - if (!selectedModel) return; - - const modelCode = selectedModel.split(" (")[0]; - const modelResolution = MODEL_RESOLUTIONS[modelCode]; - - // Only enable resolution if model supports it and useResolution is enabled - const enabled = useResolutionWidget.value === true && modelResolution !== null && modelResolution !== undefined; - - if (resolutionWidget.inputEl) { - resolutionWidget.inputEl.disabled = !enabled; - resolutionWidget.inputEl.style.opacity = enabled ? "1" : "0.5"; - resolutionWidget.inputEl.style.cursor = enabled ? "text" : "not-allowed"; - } - - resolutionWidget.disabled = !enabled; - - // Fallback: try to find input via DOM if inputEl is not available - if (!resolutionWidget.inputEl) { - const nodeElement = videoModelSearchNode.htmlElements?.widgetsContainer || videoModelSearchNode.htmlElements; - if (nodeElement) { - const input = nodeElement.querySelector(`select[name="resolution"]`); - if (input) { - input.disabled = !enabled; - input.style.opacity = enabled ? "1" : "0.5"; - input.style.pointerEvents = enabled ? "auto" : "none"; - } - } - } - - videoModelSearchNode.setDirtyCanvas(true); - } - - appendWidgetCB(useResolutionWidget, () => { - setTimeout(toggleResolutionState, 50); - }); - - // Also update when model changes - if (videoListWidget) { - appendWidgetCB(videoListWidget, () => { - setTimeout(toggleResolutionState, 50); - }); - } - - setTimeout(toggleResolutionState, 100); - } - - filterModelList(); - updateDimensions(); -} - -function textModelSearchFilterHandler(textModelSearchNode) { - const modelProviderWidget = textModelSearchNode.widgets.find(w => w.name === "Model Provider"); - const textListWidget = textModelSearchNode.widgets.find(w => w.name === "TextList"); - - if (!modelProviderWidget || !textListWidget) return; - - const TEXT_MODELS = { - "MiniMax": [ - "minimax:m2.7@0 (MiniMax-M2.7)", - "minimax:m2.7@highspeed (MiniMax-M2.7 Highspeed)", - "minimax:m2.5@0 (MiniMax-M2.5)", - ], - "OpenAI": [ - "openai:gpt@5.4 (GPT-5.4)", - "openai:gpt@5.4-pro (GPT-5.4 Pro)", - "openai:gpt@5.4-mini (GPT-5.4 Mini)", - "openai:gpt@5.4-nano (GPT-5.4 Nano)", - ], - "Anthropic": [ - "anthropic:claude@opus-4.7 (Claude Opus 4.7)", - "anthropic:claude@sonnet-4.6 (Claude Sonnet 4.6)", - "anthropic:claude@haiku-4.5 (Claude Haiku 4.5)", - ], - "Google": [ - "google:gemini@3-flash (Gemini 3 Flash)", - ], - "MoonshotAI": [ - "moonshotai:kimi@k2.6 (Kimi K2.6)", - ], - "Zai": [ - "zai-glm-5-1 (ZAI GLM 5.1)", - ], - }; - - function filterModelList() { - const selectedProvider = modelProviderWidget.value; - let filteredModels = []; - - if (selectedProvider === "All") { - Object.values(TEXT_MODELS).forEach(models => filteredModels.push(...models)); - } else if (TEXT_MODELS[selectedProvider]) { - filteredModels = TEXT_MODELS[selectedProvider]; - } - - if (filteredModels.length > 0) { - const currentValue = textListWidget.value; - textListWidget.options.values = filteredModels; - - if (!filteredModels.includes(currentValue)) { - textListWidget.value = filteredModels[0]; - } - - textModelSearchNode.setDirtyCanvas(true); - } - } - - appendWidgetCB(modelProviderWidget, filterModelList); - filterModelList(); -} - -function threeDModelSearchFilterHandler(threeDModelSearchNode) { - const modelArchWidget = threeDModelSearchNode.widgets.find(w => w.name === "Model Architecture"); - const threeDListWidget = threeDModelSearchNode.widgets.find(w => w.name === "ThreeDList"); - - if (!modelArchWidget || !threeDListWidget) return; - - const THREED_MODELS = { - "Tencent": [ - "tencent:hunyuan-3d@3.1-pro (Tencent Hunyuan 3D 3.1 Pro)", - "tencent:hunyuan-3d@3.1-rapid (Tencent Hunyuan 3D 3.1 Rapid)", - ], - "Meta": [ - "meta:sam@3d (Meta SAM 3D)", - ], - "Microsoft": [ - "microsoft:trellis-2@4b (TRELLIS.2)", - ], - "Tripo": [ - "tripo:v3.1@0 (Tripo 3D v3.1)", - ], - "Hyper3D": [ - "hyper3d:rodin@gen-1 (Rodin Gen-1)", - "hyper3d:rodin@gen-2 (Rodin Gen-2)", - ], - "Meshy": [ - "meshy:meshy@6 (Meshy 6)", - ], - }; - - function filterModelList() { - const selectedArch = modelArchWidget.value; - let filteredModels = []; - - if (selectedArch === "All") { - Object.values(THREED_MODELS).forEach(models => filteredModels.push(...models)); - } else if (THREED_MODELS[selectedArch]) { - filteredModels = THREED_MODELS[selectedArch]; - } - - if (filteredModels.length > 0) { - const currentValue = threeDListWidget.value; - threeDListWidget.options.values = filteredModels; - - if (!filteredModels.includes(currentValue)) { - threeDListWidget.value = filteredModels[0]; - } - - threeDModelSearchNode.setDirtyCanvas(true); - } - } - - appendWidgetCB(modelArchWidget, filterModelList); - filterModelList(); -} - -function audioModelSearchFilterHandler(audioModelSearchNode) { - const modelProviderWidget = audioModelSearchNode.widgets.find(w => w.name === "Model Provider"); - const audioListWidget = audioModelSearchNode.widgets.find(w => w.name === "AudioList"); - - if (!modelProviderWidget || !audioListWidget) return; - - const AUDIO_MODELS = { - "ElevenLabs": [ - "elevenlabs:1@1 (ElevenLabs Multilingual v2)", - "elevenlabs:2@1 (ElevenLabs Multilingual v2 Turbo)", - "elevenlabs:3@1 (ElevenLabs Monolingual v1)", - ], - "KlingAI": [ - "klingai:8@1 (KlingAI Audio)", - ], - "Mirelo": [ - "mirelo:1@1 (Mirelo SFX 1.5)", - ], - "Ace": [ - "runware:ace-step@0 (ACE Step v1 3.5B)", - "runware:ace-step@v1.5-base (ACE-Step v1.5 Base)", - "runware:ace-step@v1.5-turbo (ACE-Step v1.5 Turbo)", - "runware:ace-step@v1.5-xl-base (ACE-Step v1.5 XL Base)", - "runware:ace-step@v1.5-xl-turbo (ACE-Step v1.5 XL Turbo)", - "runware:ace-step@v1.5-xl-sft (ACE-Step v1.5 XL SFT)", - ], - "Alibaba": [ - "alibaba:qwen@3-tts-1.7b-voicedesign (Qwen3 TTS 1.7B Voice Design)", - "alibaba:qwen@3-tts-1.7b-customvoice (Qwen3 TTS 1.7B Custom Voice)", - "alibaba:qwen@3-tts-1.7b-base (Qwen3 TTS 1.7B Base)", - ], - "Bytedance": [ - "bytedance:seed-audio@1.0 (Seed Audio 1.0)", - ], - "Dia": [ - "runware:dia@v1.0 (Dia 1.6B)", - "runware:dia2@2b (Dia2 2B)", - ], - "xAI": [ - "xai:voice@tts (xAI TTS)", - ], - "MiniMax": [ - "minimax:speech@2.8 (MiniMax Speech 2.8)", - "minimax:music@cover (MiniMax Music Cover)", - "minimax:music@2.6 (MiniMax Music 2.6)", - ], - "Inworld": [ - "inworld:tts@2 (Inworld Realtime TTS 2)", - "inworld:tts@1.5-mini (Inworld TTS-1.5 Mini)", - "inworld:tts@1.5-max (Inworld TTS-1.5 Max)", - ], - "Google": [ - "google:gemini@3.1-flash-tts (Gemini 3.1 Flash TTS)", - ], - "Fish": [ - "fishaudio:s2.1@pro (Fish Audio S2.1 Pro)", - ], - }; - - function filterModelList() { - const selectedProvider = modelProviderWidget.value; - let filteredModels = []; - - if (selectedProvider === "All") { - Object.values(AUDIO_MODELS).forEach(models => filteredModels.push(...models)); - } else if (AUDIO_MODELS[selectedProvider]) { - filteredModels = AUDIO_MODELS[selectedProvider]; - } - - if (filteredModels.length > 0) { - const currentValue = audioListWidget.value; - audioListWidget.options.values = filteredModels; - - if (!filteredModels.includes(currentValue)) { - audioListWidget.value = filteredModels[0]; - } - - audioModelSearchNode.setDirtyCanvas(true); - } - } - - appendWidgetCB(modelProviderWidget, filterModelList); - filterModelList(); -} - -function vectorizeModelSearchFilterHandler(vectorizeNode) { - const modelArchWidget = vectorizeNode.widgets.find(w => w.name === "Model Architecture"); - const vectorListWidget = vectorizeNode.widgets.find(w => w.name === "Vector Model List"); - - if (!modelArchWidget || !vectorListWidget) return; - - const VECTORIZE_MODELS = { - "Recraft": [ - "recraft:1@1 (Recraft 1)", - "recraft:v4-pro@vector (Recraft V4 Pro Vector)", - "recraft:v4@vector (Recraft V4 Vector)", - ], - "Picsart": [ - "picsart:1@1 (Picsart 1)", - ], - }; - - function filterModelList() { - const selectedArch = modelArchWidget.value; - let filteredModels = []; - - if (selectedArch === "All") { - Object.values(VECTORIZE_MODELS).forEach(models => filteredModels.push(...models)); - } else if (VECTORIZE_MODELS[selectedArch]) { - filteredModels = VECTORIZE_MODELS[selectedArch]; - } - - if (filteredModels.length > 0) { - const currentValue = vectorListWidget.value; - vectorListWidget.options.values = filteredModels; - - if (!filteredModels.includes(currentValue)) { - vectorListWidget.value = filteredModels[0]; - } - - vectorizeNode.setDirtyCanvas(true); - } - } - - appendWidgetCB(modelArchWidget, filterModelList); - filterModelList(); -} - -function vectorizeToggleHandler(vectorizeNode) { - const usePositivePromptWidget = vectorizeNode.widgets.find(w => w.name === "Use positivePrompt"); - const positivePromptWidget = vectorizeNode.widgets.find(w => w.name === "positivePrompt"); - const dimensionsWidget = vectorizeNode.widgets.find(w => w.name === "dimensions"); - const widthWidget = vectorizeNode.widgets.find(w => w.name === "width"); - const heightWidget = vectorizeNode.widgets.find(w => w.name === "height"); - - function toggleWidgetState(useWidget, paramWidget, paramName) { - if (!useWidget || !paramWidget) return; - function applyState() { - 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"; - } - } - applyState(); - appendWidgetCB(useWidget, applyState); - } - - if (usePositivePromptWidget && positivePromptWidget) { - toggleWidgetState(usePositivePromptWidget, positivePromptWidget, "positivePrompt"); - } - - // Disable width/height when dimensions is "None" (same as image inference) - if (dimensionsWidget && widthWidget && heightWidget) { - function toggleDimensionsState() { - const dimensionsValue = dimensionsWidget.value; - const enabled = dimensionsValue !== "None"; - - if (widthWidget.inputEl) { - widthWidget.inputEl.disabled = !enabled; - widthWidget.inputEl.style.opacity = enabled ? "1" : "0.5"; - widthWidget.inputEl.style.cursor = enabled ? "text" : "not-allowed"; - widthWidget.inputEl.readOnly = !enabled; - } - widthWidget.disabled = !enabled; - - if (heightWidget.inputEl) { - heightWidget.inputEl.disabled = !enabled; - heightWidget.inputEl.style.opacity = enabled ? "1" : "0.5"; - heightWidget.inputEl.style.cursor = enabled ? "text" : "not-allowed"; - heightWidget.inputEl.readOnly = !enabled; - } - heightWidget.disabled = !enabled; - - vectorizeNode.setDirtyCanvas(true); - } - appendWidgetCB(dimensionsWidget, () => { - setTimeout(toggleDimensionsState, 50); - }); - setTimeout(toggleDimensionsState, 100); - } -} - -function klingProviderSettingsToggleHandler(klingNode) { - // Find all "use" parameter widgets for KlingAI Provider Settings (EXACT same pattern as imageInferenceToggleHandler) - const useCameraControlWidget = klingNode.widgets.find(w => w.name === "useCameraControl"); - const cameraControlWidget = klingNode.widgets.find(w => w.name === "cameraControl"); - const useSoundVolumeWidget = klingNode.widgets.find(w => w.name === "useSoundVolume"); - const soundVolumeWidget = klingNode.widgets.find(w => w.name === "soundVolume"); - const useOriginalAudioVolumeWidget = klingNode.widgets.find(w => w.name === "useOriginalAudioVolume"); - const originalAudioVolumeWidget = klingNode.widgets.find(w => w.name === "originalAudioVolume"); - const useSoundEffectPromptWidget = klingNode.widgets.find(w => w.name === "useSoundEffectPrompt"); - const soundEffectPromptWidget = klingNode.widgets.find(w => w.name === "soundEffectPrompt"); - const useBgmPromptWidget = klingNode.widgets.find(w => w.name === "useBgmPrompt"); - const bgmPromptWidget = klingNode.widgets.find(w => w.name === "bgmPrompt"); - const useAsmrModeWidget = klingNode.widgets.find(w => w.name === "useAsmrMode"); - const asmrModeWidget = klingNode.widgets.find(w => w.name === "asmrMode"); - const useKeepOriginalSoundWidget = klingNode.widgets.find(w => w.name === "useKeepOriginalSound"); - const keepOriginalSoundWidget = klingNode.widgets.find(w => w.name === "keepOriginalSound"); - const useSoundWidget = klingNode.widgets.find(w => w.name === "useSound"); - const soundWidget = klingNode.widgets.find(w => w.name === "sound"); - const useCharacterOrientationWidget = klingNode.widgets.find(w => w.name === "useCharacterOrientation"); - const characterOrientationWidget = klingNode.widgets.find(w => w.name === "characterOrientation"); - const useMultipromptWidget = klingNode.widgets.find(w => w.name === "useMultiprompt"); - - // Helper function to toggle widget enabled state (EXACT same pattern as imageInferenceToggleHandler) - // Callers guard with if (useX && xWidget) before invoking - function toggleWidgetState(useWidget, paramWidget, paramName) { - function toggleEnabled() { - const enabled = useWidget.value === true; - - // Disable/enable widgets using inputEl if available (exact same pattern) - 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; - } - // Also set widget property - paramWidget.disabled = !enabled; - - // Fallback: try to find inputs via DOM if inputEl is not available - if (!paramWidget.inputEl) { - const nodeElement = klingNode.htmlElements?.widgetsContainer || klingNode.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"; - } - } - } - } - - klingNode.setDirtyCanvas(true); - } - - // Set up callback (exact same pattern as imageInferenceToggleHandler) - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - // Initial call to set initial state (exact same pattern) - setTimeout(toggleEnabled, 100); - } - - // Set up all toggle handlers (exact same pattern as imageInferenceToggleHandler) - if (useCameraControlWidget && cameraControlWidget) { - toggleWidgetState(useCameraControlWidget, cameraControlWidget, "cameraControl"); - } - - if (useSoundVolumeWidget && soundVolumeWidget) { - toggleWidgetState(useSoundVolumeWidget, soundVolumeWidget, "soundVolume"); - } - - if (useOriginalAudioVolumeWidget && originalAudioVolumeWidget) { - toggleWidgetState(useOriginalAudioVolumeWidget, originalAudioVolumeWidget, "originalAudioVolume"); - } - - if (useSoundEffectPromptWidget && soundEffectPromptWidget) { - toggleWidgetState(useSoundEffectPromptWidget, soundEffectPromptWidget, "soundEffectPrompt"); - } - - if (useBgmPromptWidget && bgmPromptWidget) { - toggleWidgetState(useBgmPromptWidget, bgmPromptWidget, "bgmPrompt"); - } - - if (useAsmrModeWidget && asmrModeWidget) { - toggleWidgetState(useAsmrModeWidget, asmrModeWidget, "asmrMode"); - } - - if (useKeepOriginalSoundWidget && keepOriginalSoundWidget) { - toggleWidgetState(useKeepOriginalSoundWidget, keepOriginalSoundWidget, "keepOriginalSound"); - } - - if (useSoundWidget && soundWidget) { - toggleWidgetState(useSoundWidget, soundWidget, "sound"); - } - - if (useCharacterOrientationWidget && characterOrientationWidget) { - toggleWidgetState(useCharacterOrientationWidget, characterOrientationWidget, "characterOrientation"); - } - - // Toggle MultiPrompt Segment input slots when useMultiprompt changes - if (useMultipromptWidget) { - function toggleMultipromptInputs() { - const enabled = useMultipromptWidget.value === true; - klingNode.inputs?.forEach(inp => { - if (inp?.name?.startsWith("MultiPrompt Segment")) { - inp.disabled = !enabled; - if (inp.domElement) { - inp.domElement.style.opacity = enabled ? "1" : "0.4"; - inp.domElement.style.pointerEvents = enabled ? "auto" : "none"; - } - } - }); - klingNode.setDirtyCanvas(true); - } - appendWidgetCB(useMultipromptWidget, () => setTimeout(toggleMultipromptInputs, 50)); - setTimeout(toggleMultipromptInputs, 100); - } -} - -function alibabaProviderSettingsToggleHandler(alibabaNode) { - // Find all "use" parameter widgets for Alibaba Provider Settings - const usePromptEnhancerWidget = alibabaNode.widgets.find(w => w.name === "usePromptEnhancer"); - const promptEnhancerWidget = alibabaNode.widgets.find(w => w.name === "promptEnhancer"); - const usePromptExtendWidget = alibabaNode.widgets.find(w => w.name === "usePromptExtend"); - const promptExtendWidget = alibabaNode.widgets.find(w => w.name === "promptExtend"); - const useAudioWidget = alibabaNode.widgets.find(w => w.name === "useAudio"); - const audioWidget = alibabaNode.widgets.find(w => w.name === "audio"); - const useShotTypeWidget = alibabaNode.widgets.find(w => w.name === "useShotType"); - const shotTypeWidget = alibabaNode.widgets.find(w => w.name === "shotType"); - - // Helper function to toggle widget enabled state - 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 = alibabaNode.htmlElements?.widgetsContainer || alibabaNode.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"; - } - } - } - } - - alibabaNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - // Special handler for shotType - depends on both usePromptExtend AND promptExtend being true - function toggleShotTypeEnabled() { - if (!useShotTypeWidget || !shotTypeWidget || !usePromptExtendWidget || !promptExtendWidget) return; - - const usePromptExtendEnabled = usePromptExtendWidget.value === true; - const promptExtendValue = promptExtendWidget.value === true; - const useShotTypeEnabled = useShotTypeWidget.value === true; - - // shotType is enabled only if: useShotType is enabled AND usePromptExtend is enabled AND promptExtend is true - const enabled = useShotTypeEnabled && usePromptExtendEnabled && promptExtendValue; - - if (shotTypeWidget.inputEl) { - shotTypeWidget.inputEl.disabled = !enabled; - shotTypeWidget.inputEl.style.opacity = enabled ? "1" : "0.5"; - shotTypeWidget.inputEl.style.cursor = enabled ? "text" : "not-allowed"; - shotTypeWidget.inputEl.readOnly = !enabled; - } - - shotTypeWidget.disabled = !enabled; - - if (!shotTypeWidget.inputEl) { - const nodeElement = alibabaNode.htmlElements?.widgetsContainer || alibabaNode.htmlElements; - if (nodeElement) { - const input = nodeElement.querySelector(`input[name="shotType"], select[name="shotType"]`); - 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"; - } - } - } - } - - alibabaNode.setDirtyCanvas(true); - } - - // Set up toggle handlers - if (usePromptEnhancerWidget && promptEnhancerWidget) { - toggleWidgetState(usePromptEnhancerWidget, promptEnhancerWidget, "promptEnhancer"); - } - - if (usePromptExtendWidget && promptExtendWidget) { - toggleWidgetState(usePromptExtendWidget, promptExtendWidget, "promptExtend"); - - // Also listen to promptExtend value changes to update shotType - appendWidgetCB(promptExtendWidget, () => { - setTimeout(toggleShotTypeEnabled, 50); - }); - } - - if (useAudioWidget && audioWidget) { - toggleWidgetState(useAudioWidget, audioWidget, "audio"); - } - - if (useShotTypeWidget && shotTypeWidget) { - // Listen to useShotType changes - appendWidgetCB(useShotTypeWidget, () => { - setTimeout(toggleShotTypeEnabled, 50); - }); - - // Also listen to usePromptExtend changes - if (usePromptExtendWidget) { - appendWidgetCB(usePromptExtendWidget, () => { - setTimeout(toggleShotTypeEnabled, 50); - }); - } - - // Initial state - setTimeout(toggleShotTypeEnabled, 100); - } -} - -function mireloProviderSettingsToggleHandler(mireloNode) { - // Find all "use" parameter widgets for Mirelo Provider Settings - const useStartOffsetWidget = mireloNode.widgets.find(w => w.name === "useStartOffset"); - const startOffsetWidget = mireloNode.widgets.find(w => w.name === "startOffset"); - - // Helper function to toggle widget enabled state - 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 = mireloNode.htmlElements?.widgetsContainer || mireloNode.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"; - } - } - } - } - - mireloNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - // Set up toggle handler - if (useStartOffsetWidget && startOffsetWidget) { - toggleWidgetState(useStartOffsetWidget, startOffsetWidget, "startOffset"); - } -} - -function lumaProviderSettingsToggleHandler(lumaNode) { - // Find all "use" parameter widgets for Luma Provider Settings - const useLoopWidget = lumaNode.widgets.find(w => w.name === "useLoop"); - const loopWidget = lumaNode.widgets.find(w => w.name === "loop"); - const useConcept1Widget = lumaNode.widgets.find(w => w.name === "useConcept1"); - const concept1Widget = lumaNode.widgets.find(w => w.name === "concept1"); - const useConcept2Widget = lumaNode.widgets.find(w => w.name === "useConcept2"); - const concept2Widget = lumaNode.widgets.find(w => w.name === "concept2"); - const useConcept3Widget = lumaNode.widgets.find(w => w.name === "useConcept3"); - const concept3Widget = lumaNode.widgets.find(w => w.name === "concept3"); - const useConcept4Widget = lumaNode.widgets.find(w => w.name === "useConcept4"); - const concept4Widget = lumaNode.widgets.find(w => w.name === "concept4"); - - 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 = lumaNode.htmlElements?.widgetsContainer || lumaNode.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"; - } - } - } - } - - lumaNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - if (useLoopWidget && loopWidget) { - toggleWidgetState(useLoopWidget, loopWidget, "loop"); - } - - if (useConcept1Widget && concept1Widget) { - toggleWidgetState(useConcept1Widget, concept1Widget, "concept1"); - } - - if (useConcept2Widget && concept2Widget) { - toggleWidgetState(useConcept2Widget, concept2Widget, "concept2"); - } - - if (useConcept3Widget && concept3Widget) { - toggleWidgetState(useConcept3Widget, concept3Widget, "concept3"); - } - - if (useConcept4Widget && concept4Widget) { - toggleWidgetState(useConcept4Widget, concept4Widget, "concept4"); - } -} - -function briaProviderSettingsToggleHandler(briaNode) { - // Find all "use" parameter widgets for Bria Provider Settings - const useMediumWidget = briaNode.widgets.find(w => w.name === "useMedium"); - const mediumWidget = briaNode.widgets.find(w => w.name === "medium"); - const usePromptEnhancementWidget = briaNode.widgets.find(w => w.name === "usePromptEnhancement"); - const promptEnhancementWidget = briaNode.widgets.find(w => w.name === "promptEnhancement"); - const useEnhanceImageWidget = briaNode.widgets.find(w => w.name === "useEnhanceImage"); - const enhanceImageWidget = briaNode.widgets.find(w => w.name === "enhanceImage"); - const usePromptContentModerationWidget = briaNode.widgets.find(w => w.name === "usePromptContentModeration"); - const promptContentModerationWidget = briaNode.widgets.find(w => w.name === "promptContentModeration"); - const useContentModerationWidget = briaNode.widgets.find(w => w.name === "useContentModeration"); - const contentModerationWidget = briaNode.widgets.find(w => w.name === "contentModeration"); - const useIpSignalWidget = briaNode.widgets.find(w => w.name === "useIpSignal"); - const ipSignalWidget = briaNode.widgets.find(w => w.name === "ipSignal"); - const usePreserveAlphaWidget = briaNode.widgets.find(w => w.name === "usePreserveAlpha"); - const preserveAlphaWidget = briaNode.widgets.find(w => w.name === "preserveAlpha"); - const useModeWidget = briaNode.widgets.find(w => w.name === "useMode"); - const modeWidget = briaNode.widgets.find(w => w.name === "mode"); - const useEnhanceReferenceImagesWidget = briaNode.widgets.find(w => w.name === "useEnhanceReferenceImages"); - const enhanceReferenceImagesWidget = briaNode.widgets.find(w => w.name === "enhanceReferenceImages"); - const useRefinePromptWidget = briaNode.widgets.find(w => w.name === "useRefinePrompt"); - const refinePromptWidget = briaNode.widgets.find(w => w.name === "refinePrompt"); - const useOriginalQualityWidget = briaNode.widgets.find(w => w.name === "useOriginalQuality"); - const originalQualityWidget = briaNode.widgets.find(w => w.name === "originalQuality"); - const useForceBackgroundDetectionWidget = briaNode.widgets.find(w => w.name === "useForceBackgroundDetection"); - const forceBackgroundDetectionWidget = briaNode.widgets.find(w => w.name === "forceBackgroundDetection"); - const useAutoTrimWidget = briaNode.widgets.find(w => w.name === "useAutoTrim"); - const autoTrimWidget = briaNode.widgets.find(w => w.name === "autoTrim"); - const usePreserveAudioWidget = briaNode.widgets.find(w => w.name === "usePreserveAudio"); - const preserveAudioWidget = briaNode.widgets.find(w => w.name === "preserveAudio"); - const useSeasonWidget = briaNode.widgets.find(w => w.name === "useSeason"); - const seasonWidget = briaNode.widgets.find(w => w.name === "season"); - const useEditWidget = briaNode.widgets.find(w => w.name === "useEdit"); - const editWidget = briaNode.widgets.find(w => w.name === "edit"); - const useColorWidget = briaNode.widgets.find(w => w.name === "useColor"); - const colorWidget = briaNode.widgets.find(w => w.name === "color"); - const useLightDirectionWidget = briaNode.widgets.find(w => w.name === "useLightDirection"); - const lightDirectionWidget = briaNode.widgets.find(w => w.name === "lightDirection"); - const useLightTypeWidget = briaNode.widgets.find(w => w.name === "useLightType"); - const lightTypeWidget = briaNode.widgets.find(w => w.name === "lightType"); - - // Helper function to toggle widget enabled state (exact same pattern) - function toggleWidgetState(useWidget, paramWidget, paramName) { - if (!useWidget || !paramWidget) return; - - function toggleEnabled() { - const enabled = useWidget.value === true; - - // Disable/enable widgets using inputEl if available (exact same pattern) - 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; - } - - // Handle dropdown widgets (for medium and mode) - 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"; - } - - // Also set widget property - paramWidget.disabled = !enabled; - - // Fallback: try to find inputs via DOM if inputEl is not available - if (!paramWidget.inputEl) { - const nodeElement = briaNode.htmlElements?.widgetsContainer || briaNode.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"; - } - } - } - } - - briaNode.setDirtyCanvas(true); - } - - // Set up callback (exact same pattern) - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - // Initial call to set initial state - setTimeout(toggleEnabled, 100); - } - - // Set up all toggle handlers - if (useMediumWidget && mediumWidget) { - toggleWidgetState(useMediumWidget, mediumWidget, "medium"); - } - - if (usePromptEnhancementWidget && promptEnhancementWidget) { - toggleWidgetState(usePromptEnhancementWidget, promptEnhancementWidget, "promptEnhancement"); - } - - if (useEnhanceImageWidget && enhanceImageWidget) { - toggleWidgetState(useEnhanceImageWidget, enhanceImageWidget, "enhanceImage"); - } - - if (usePromptContentModerationWidget && promptContentModerationWidget) { - toggleWidgetState(usePromptContentModerationWidget, promptContentModerationWidget, "promptContentModeration"); - } - - if (useContentModerationWidget && contentModerationWidget) { - toggleWidgetState(useContentModerationWidget, contentModerationWidget, "contentModeration"); - } - - if (useIpSignalWidget && ipSignalWidget) { - toggleWidgetState(useIpSignalWidget, ipSignalWidget, "ipSignal"); - } - - if (usePreserveAlphaWidget && preserveAlphaWidget) { - toggleWidgetState(usePreserveAlphaWidget, preserveAlphaWidget, "preserveAlpha"); - } - - if (useModeWidget && modeWidget) { - toggleWidgetState(useModeWidget, modeWidget, "mode"); - } - - if (useEnhanceReferenceImagesWidget && enhanceReferenceImagesWidget) { - toggleWidgetState(useEnhanceReferenceImagesWidget, enhanceReferenceImagesWidget, "enhanceReferenceImages"); - } - - if (useRefinePromptWidget && refinePromptWidget) { - toggleWidgetState(useRefinePromptWidget, refinePromptWidget, "refinePrompt"); - } - - if (useOriginalQualityWidget && originalQualityWidget) { - toggleWidgetState(useOriginalQualityWidget, originalQualityWidget, "originalQuality"); - } - - if (useForceBackgroundDetectionWidget && forceBackgroundDetectionWidget) { - toggleWidgetState(useForceBackgroundDetectionWidget, forceBackgroundDetectionWidget, "forceBackgroundDetection"); - } - - if (useAutoTrimWidget && autoTrimWidget) { - toggleWidgetState(useAutoTrimWidget, autoTrimWidget, "autoTrim"); - } - - if (usePreserveAudioWidget && preserveAudioWidget) { - toggleWidgetState(usePreserveAudioWidget, preserveAudioWidget, "preserveAudio"); - } - - if (useSeasonWidget && seasonWidget) { - toggleWidgetState(useSeasonWidget, seasonWidget, "season"); - } - - if (useEditWidget && editWidget) { - toggleWidgetState(useEditWidget, editWidget, "edit"); - } - - if (useColorWidget && colorWidget) { - toggleWidgetState(useColorWidget, colorWidget, "color"); - } - - if (useLightDirectionWidget && lightDirectionWidget) { - toggleWidgetState(useLightDirectionWidget, lightDirectionWidget, "lightDirection"); - } - - if (useLightTypeWidget && lightTypeWidget) { - toggleWidgetState(useLightTypeWidget, lightTypeWidget, "lightType"); - } -} - -function audioInputToggleHandler(audioInputNode) { - // Find "use" parameter widget and "id" widget for Audio Input - const useIdWidget = audioInputNode.widgets.find(w => w.name === "useId"); - const idWidget = audioInputNode.widgets.find(w => w.name === "id"); - - // Helper function to toggle widget enabled state - function toggleWidgetState(useWidget, paramWidget, paramName) { - if (!useWidget || !paramWidget) return; - - function toggleEnabled() { - const enabled = useWidget.value === true; - - // Disable/enable widgets using inputEl if available - 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; - } - // Also set widget property - paramWidget.disabled = !enabled; - - // Fallback: try to find inputs via DOM if inputEl is not available - if (!paramWidget.inputEl) { - const nodeElement = audioInputNode.htmlElements?.widgetsContainer || audioInputNode.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"; - } - } - } - } - - audioInputNode.setDirtyCanvas(true); - } - - // Set up callback - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - // Initial call to set initial state - setTimeout(toggleEnabled, 100); - } - - // Set up toggle handler for "useId" parameter - if (useIdWidget && idWidget) { - toggleWidgetState(useIdWidget, idWidget, "id"); - } -} - -function speechInputToggleHandler(speechInputNode) { - // Find "use" parameter widget and "id" widget for Speech Input - const useIdWidget = speechInputNode.widgets.find(w => w.name === "useId"); - const idWidget = speechInputNode.widgets.find(w => w.name === "id"); - - // Helper function to toggle widget enabled state - function toggleWidgetState(useWidget, paramWidget, paramName) { - if (!useWidget || !paramWidget) return; - - function toggleEnabled() { - const enabled = useWidget.value === true; - - // Disable/enable widgets using inputEl if available - 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; - } - // Also set widget property - paramWidget.disabled = !enabled; - - // Fallback: try to find inputs via DOM if inputEl is not available - if (!paramWidget.inputEl) { - const nodeElement = speechInputNode.htmlElements?.widgetsContainer || speechInputNode.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"; - } - } - } - } - - speechInputNode.setDirtyCanvas(true); - } - - // Set up callback - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - // Initial call to set initial state - setTimeout(toggleEnabled, 100); - } - - // Set up toggle handler for "useId" parameter - if (useIdWidget && idWidget) { - toggleWidgetState(useIdWidget, idWidget, "id"); - } -} - -function briaProviderMaskToggleHandler(maskNode) { - // Helper function to toggle widget enabled state for multiple widgets - function toggleWidgetState(useWidget, paramWidgets, paramNames) { - if (!useWidget || !paramWidgets || paramWidgets.length === 0) return; - - function toggleEnabled() { - const enabled = useWidget.value === true; - - paramWidgets.forEach((paramWidget, idx) => { - if (!paramWidget) return; - - 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; - } - - // Handle dropdown widgets (for Type fields) - 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"; - } - - paramWidget.disabled = !enabled; - - // Fallback: try to find inputs via DOM if inputEl is not available - if (!paramWidget.inputEl && paramNames[idx]) { - const nodeElement = maskNode.htmlElements?.widgetsContainer || maskNode.htmlElements; - if (nodeElement) { - const input = nodeElement.querySelector(`input[name="${paramNames[idx]}"], textarea[name="${paramNames[idx]}"], select[name="${paramNames[idx]}"]`); - 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"; - } - } - } - } - }); - - maskNode.setDirtyCanvas(true); - } - - // Set up callback - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - // Initial call to set initial state - setTimeout(toggleEnabled, 100); - } - - // Set up toggle handlers for foreground, prompt, frameIndex - const useForegroundWidget = maskNode.widgets.find(w => w.name === "useForeground"); - const foregroundWidget = maskNode.widgets.find(w => w.name === "foreground"); - if (useForegroundWidget && foregroundWidget) { - toggleWidgetState(useForegroundWidget, [foregroundWidget], ["foreground"]); - } - - const usePromptWidget = maskNode.widgets.find(w => w.name === "usePrompt"); - const promptWidget = maskNode.widgets.find(w => w.name === "prompt"); - if (usePromptWidget && promptWidget) { - toggleWidgetState(usePromptWidget, [promptWidget], ["prompt"]); - } - - const useFrameIndexWidget = maskNode.widgets.find(w => w.name === "useFrameIndex"); - const frameIndexWidget = maskNode.widgets.find(w => w.name === "frameIndex"); - if (useFrameIndexWidget && frameIndexWidget) { - toggleWidgetState(useFrameIndexWidget, [frameIndexWidget], ["frameIndex"]); - } - - // Set up toggle handlers for all 6 key points - for (let i = 1; i <= 6; i++) { - const useWidget = maskNode.widgets.find(w => w.name === `use_${i}`); - const xWidget = maskNode.widgets.find(w => w.name === `X${i}`); - const yWidget = maskNode.widgets.find(w => w.name === `Y${i}`); - const typeWidget = maskNode.widgets.find(w => w.name === `Type${i}`); - - if (useWidget && xWidget && yWidget && typeWidget) { - toggleWidgetState(useWidget, [xWidget, yWidget, typeWidget], [`X${i}`, `Y${i}`, `Type${i}`]); - } - } -} - -function wanAnimateAdvancedFeatureSettingsToggleHandler(wanAnimateNode) { - // Find widgets - const useModeWidget = wanAnimateNode.widgets.find(w => w.name === "useMode"); - const modeWidget = wanAnimateNode.widgets.find(w => w.name === "mode"); - const useRetargetPoseWidget = wanAnimateNode.widgets.find(w => w.name === "useRetargetPose"); - const retargetPoseWidget = wanAnimateNode.widgets.find(w => w.name === "retargetPose"); - const usePrevSegCondFramesWidget = wanAnimateNode.widgets.find(w => w.name === "usePrevSegCondFrames"); - const prevSegCondFramesWidget = wanAnimateNode.widgets.find(w => w.name === "prevSegCondFrames"); - - // Helper function to toggle widget enabled state - 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; - } - - // Handle dropdown widgets (for mode field) - 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"; - } - - paramWidget.disabled = !enabled; - - // Fallback: try to find inputs via DOM if inputEl is not available - if (!paramWidget.inputEl && paramName) { - const nodeElement = wanAnimateNode.htmlElements?.widgetsContainer || wanAnimateNode.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"; - } - } - } - } - - wanAnimateNode.setDirtyCanvas(true); - } - - // Set up callback - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - // Initial call to set initial state - setTimeout(toggleEnabled, 100); - } - - // Set up toggle handler for mode - if (useModeWidget && modeWidget) { - toggleWidgetState(useModeWidget, modeWidget, "mode"); - } - - // Set up toggle handler for retargetPose (with mode dependency) - if (useRetargetPoseWidget && retargetPoseWidget) { - function toggleRetargetPoseEnabled() { - const useRetargetPoseEnabled = useRetargetPoseWidget.value === true; - const modeValue = modeWidget ? modeWidget.value : "animate"; - // retargetPose is only supported for animate mode - const enabled = useRetargetPoseEnabled && modeValue === "animate"; - - if (retargetPoseWidget.inputEl) { - retargetPoseWidget.inputEl.disabled = !enabled; - retargetPoseWidget.inputEl.style.opacity = enabled ? "1" : "0.5"; - retargetPoseWidget.inputEl.style.cursor = enabled ? "text" : "not-allowed"; - retargetPoseWidget.inputEl.readOnly = !enabled; - } - - retargetPoseWidget.disabled = !enabled; - - // Fallback: try to find inputs via DOM - if (!retargetPoseWidget.inputEl) { - const nodeElement = wanAnimateNode.htmlElements?.widgetsContainer || wanAnimateNode.htmlElements; - if (nodeElement) { - const input = nodeElement.querySelector(`input[name="retargetPose"], textarea[name="retargetPose"], select[name="retargetPose"]`); - if (input) { - input.disabled = !enabled; - input.style.opacity = enabled ? "1" : "0.5"; - input.style.cursor = enabled ? "text" : "not-allowed"; - input.readOnly = !enabled; - } - } - } - - wanAnimateNode.setDirtyCanvas(true); - } - - // Set up callback for useRetargetPose toggle - appendWidgetCB(useRetargetPoseWidget, () => { - setTimeout(toggleRetargetPoseEnabled, 50); - }); - - // Set up callback for mode change (to disable retargetPose when mode is "replace") - if (modeWidget) { - appendWidgetCB(modeWidget, () => { - setTimeout(toggleRetargetPoseEnabled, 50); - }); - } - - // Initial call to set initial state - setTimeout(toggleRetargetPoseEnabled, 100); - } - - // Set up toggle handler for prevSegCondFrames - if (usePrevSegCondFramesWidget && prevSegCondFramesWidget) { - toggleWidgetState(usePrevSegCondFramesWidget, prevSegCondFramesWidget, "prevSegCondFrames"); - } -} - -function videoAdvancedFeatureInputsToggleHandler(advancedFeatureNode) { - // Helper function to toggle widget enabled state - 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; - - // Fallback: try to find inputs via DOM if inputEl is not available - if (!paramWidget.inputEl && paramName) { - const nodeElement = advancedFeatureNode.htmlElements?.widgetsContainer || advancedFeatureNode.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; - } - } - } - - advancedFeatureNode.setDirtyCanvas(true); - } - - // Set up callback - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - // Initial call to set initial state - setTimeout(toggleEnabled, 100); - } - - // Set up toggle handlers for each parameter - const useVideoCFGScaleWidget = advancedFeatureNode.widgets.find(w => w.name === "useVideoCFGScale"); - const videoCFGScaleWidget = advancedFeatureNode.widgets.find(w => w.name === "videoCFGScale"); - if (useVideoCFGScaleWidget && videoCFGScaleWidget) { - toggleWidgetState(useVideoCFGScaleWidget, videoCFGScaleWidget, "videoCFGScale"); - } - - const useAudioCFGScaleWidget = advancedFeatureNode.widgets.find(w => w.name === "useAudioCFGScale"); - const audioCFGScaleWidget = advancedFeatureNode.widgets.find(w => w.name === "audioCFGScale"); - if (useAudioCFGScaleWidget && audioCFGScaleWidget) { - toggleWidgetState(useAudioCFGScaleWidget, audioCFGScaleWidget, "audioCFGScale"); - } - - const useVideoNegativePromptWidget = advancedFeatureNode.widgets.find(w => w.name === "useVideoNegativePrompt"); - const videoNegativePromptWidget = advancedFeatureNode.widgets.find(w => w.name === "videoNegativePrompt"); - if (useVideoNegativePromptWidget && videoNegativePromptWidget) { - toggleWidgetState(useVideoNegativePromptWidget, videoNegativePromptWidget, "videoNegativePrompt"); - } - - const useAudioNegativePromptWidget = advancedFeatureNode.widgets.find(w => w.name === "useAudioNegativePrompt"); - const audioNegativePromptWidget = advancedFeatureNode.widgets.find(w => w.name === "audioNegativePrompt"); - if (useAudioNegativePromptWidget && audioNegativePromptWidget) { - toggleWidgetState(useAudioNegativePromptWidget, audioNegativePromptWidget, "audioNegativePrompt"); - } - - const useSlgLayerWidget = advancedFeatureNode.widgets.find(w => w.name === "useSlgLayer"); - const slgLayerWidget = advancedFeatureNode.widgets.find(w => w.name === "slgLayer"); - if (useSlgLayerWidget && slgLayerWidget) { - toggleWidgetState(useSlgLayerWidget, slgLayerWidget, "slgLayer"); - } -} - -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 watermarkAdvancedFeatureToggleHandler(watermarkNode) { - if (!watermarkNode?.widgets) return; - - 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 = watermarkNode.htmlElements?.widgetsContainer || watermarkNode.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; - } - } - } - - watermarkNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - const pairs = [ - ["useText", "text"], - ["useImage", "image"], - ["useDisplayPosition", "displayPosition"], - ["useTiled", "tiled"], - ["useOpacity", "opacity"], - ["useFontColor", "fontColor"], - ["useBgColor", "bgColor"], - ]; - - for (const [useName, paramName] of pairs) { - const useWidget = watermarkNode.widgets.find(w => w.name === useName); - const paramWidget = watermarkNode.widgets.find(w => w.name === paramName); - if (useWidget && paramWidget) { - toggleWidgetState(useWidget, paramWidget, paramName); - } - } -} - -function videoInferenceSpeechInputToggleHandler(speechInputNode) { - if (!speechInputNode?.widgets) return; - - 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 = speechInputNode.htmlElements?.widgetsContainer || speechInputNode.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; - } - } - } - - speechInputNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - const pairs = [ - ["useVoice", "voice"], - ["useText", "text"], - ["useSpeed", "speed"], - ["usePitch", "pitch"], - ["useLanguage", "language"], - ]; - - for (const [useName, paramName] of pairs) { - const useWidget = speechInputNode.widgets.find(w => w.name === useName); - const paramWidget = speechInputNode.widgets.find(w => w.name === paramName); - if (useWidget && paramWidget) { - toggleWidgetState(useWidget, paramWidget, paramName); - } - } -} - -function regionalPromptingRegionsToggleHandler(regionsNode) { - if (!regionsNode?.widgets) return; - - function toggleWidgetState(useWidget, paramWidgets, paramNames) { - if (!useWidget || !paramWidgets || paramWidgets.length === 0) return; - - function toggleEnabled() { - const enabled = useWidget.value === true; - - for (let i = 0; i < paramWidgets.length; i++) { - const paramWidget = paramWidgets[i]; - const paramName = paramNames[i]; - - if (!paramWidget) continue; - - 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 = regionsNode.htmlElements?.widgetsContainer || regionsNode.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; - } - } - } - } - - regionsNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - for (let idx = 1; idx <= 4; idx++) { - const useWidget = regionsNode.widgets.find(w => w.name === `useRegion${idx}`); - const promptWidget = regionsNode.widgets.find(w => w.name === `region${idx}Prompt`); - const x0Widget = regionsNode.widgets.find(w => w.name === `region${idx}_x0`); - const y0Widget = regionsNode.widgets.find(w => w.name === `region${idx}_y0`); - const x1Widget = regionsNode.widgets.find(w => w.name === `region${idx}_x1`); - const y1Widget = regionsNode.widgets.find(w => w.name === `region${idx}_y1`); - - const paramWidgets = [promptWidget, x0Widget, y0Widget, x1Widget, y1Widget]; - const paramNames = [ - `region${idx}Prompt`, - `region${idx}_x0`, - `region${idx}_y0`, - `region${idx}_x1`, - `region${idx}_y1`, - ]; - - if (useWidget) { - toggleWidgetState(useWidget, paramWidgets, paramNames); - } - } -} - -function audioInferenceReferenceVoiceToggleHandler(referenceVoiceNode) { - if (!referenceVoiceNode?.widgets) return; - if (referenceVoiceNode._audioInferenceReferenceVoiceToggleHandlerRegistered) return; - referenceVoiceNode._audioInferenceReferenceVoiceToggleHandlerRegistered = true; - - function toggleWidgetState(useWidget, paramWidget, paramName) { - if (!useWidget || !paramWidget) return; - - function applyState() { - const enabled = useWidget.value === true; - toggleWidgetEnabled(paramWidget, enabled, referenceVoiceNode); - 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"; - } - referenceVoiceNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => setTimeout(applyState, 50)); - setTimeout(applyState, 100); - } - - for (let i = 1; i <= 4; i++) { - const useReferenceVoiceWidget = referenceVoiceNode.widgets.find((w) => w && w.name === `useReferenceVoice${i}`); - const audioWidget = referenceVoiceNode.widgets.find((w) => w && w.name === `audio${i}`); - const textWidget = referenceVoiceNode.widgets.find((w) => w && w.name === `text${i}`); - - if (useReferenceVoiceWidget && audioWidget) { - toggleWidgetState(useReferenceVoiceWidget, audioWidget, `audio${i}`); - } - if (useReferenceVoiceWidget && textWidget) { - toggleWidgetState(useReferenceVoiceWidget, textWidget, `text${i}`); - } - } -} - -function audioInferenceInputsToggleHandler(audioInputsNode) { - if (!audioInputsNode?.widgets) return; - - // Find widgets - const useAudioWidget = audioInputsNode.widgets.find(w => w && w.name === "useAudio"); - const audioWidget = audioInputsNode.widgets.find(w => w && w.name === "Audio"); - const useVideoWidget = audioInputsNode.widgets.find(w => w && w.name === "useVideo"); - const videoWidget = audioInputsNode.widgets.find(w => w && w.name === "Video"); - const useVideosWidget = audioInputsNode.widgets.find(w => w && w.name === "useVideos"); - const useAudiosWidget = audioInputsNode.widgets.find(w => w && w.name === "useAudios"); - const useReferenceAudiosWidget = audioInputsNode.widgets.find(w => w && w.name === "useReferenceAudios"); - - // Helper function to toggle widget enabled state - 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; - - // Fallback: try to find inputs via DOM if inputEl is not available - if (!paramWidget.inputEl && paramName) { - const nodeElement = audioInputsNode.htmlElements?.widgetsContainer || audioInputsNode.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; - } - } - } - - audioInputsNode.setDirtyCanvas(true); - } - - // Set up callback - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - // Initial call to set initial state - setTimeout(toggleEnabled, 100); - } - - // Set up toggle handler for single audio - if (useAudioWidget && audioWidget) { - toggleWidgetState(useAudioWidget, audioWidget, "Audio"); - } - - // Set up toggle handler for single video - if (useVideoWidget && videoWidget) { - toggleWidgetState(useVideoWidget, videoWidget, "Video"); - } - - // Set up toggle handlers for multiple audios (Audio1 … AudioN; N from widgets, fallback to AUDIO_INFERENCE_INPUTS_MAX_AUDIOS) - if (useAudiosWidget) { - function getAudioInferenceAudioSlotCount() { - let max = 0; - for (const w of audioInputsNode.widgets) { - if (!w?.name) continue; - const m = /^Audio(\d+)$/.exec(w.name); - if (m) max = Math.max(max, parseInt(m[1], 10)); - } - return max > 0 ? max : AUDIO_INFERENCE_INPUTS_MAX_AUDIOS; - } - - function toggleAudiosEnabled() { - const enabled = useAudiosWidget.value === true; - const slotCount = getAudioInferenceAudioSlotCount(); - - for (let i = 1; i <= slotCount; i++) { - const audioSlotWidget = audioInputsNode.widgets.find(w => w && w.name === `Audio${i}`); - if (audioSlotWidget) { - if (audioSlotWidget.inputEl) { - audioSlotWidget.inputEl.disabled = !enabled; - audioSlotWidget.inputEl.style.opacity = enabled ? "1" : "0.5"; - audioSlotWidget.inputEl.style.cursor = enabled ? "text" : "not-allowed"; - audioSlotWidget.inputEl.readOnly = !enabled; - } - - audioSlotWidget.disabled = !enabled; - - if (!audioSlotWidget.inputEl) { - const nodeElement = audioInputsNode.htmlElements?.widgetsContainer || audioInputsNode.htmlElements; - if (nodeElement) { - const input = nodeElement.querySelector(`input[name="Audio${i}"], textarea[name="Audio${i}"], select[name="Audio${i}"]`); - if (input) { - input.disabled = !enabled; - input.style.opacity = enabled ? "1" : "0.5"; - input.style.cursor = enabled ? "text" : "not-allowed"; - input.readOnly = !enabled; - } - } - } - } - } - - audioInputsNode.setDirtyCanvas(true); - } - - appendWidgetCB(useAudiosWidget, () => { - setTimeout(toggleAudiosEnabled, 50); - }); - - setTimeout(toggleAudiosEnabled, 100); - } - - // Set up toggle handlers for multiple videos (Video1 … VideoN; N from widgets, fallback to AUDIO_INFERENCE_INPUTS_MAX_VIDEOS) - if (useVideosWidget) { - function getAudioInferenceVideoSlotCount() { - let max = 0; - for (const w of audioInputsNode.widgets) { - if (!w?.name) continue; - const m = /^Video(\d+)$/.exec(w.name); - if (m) max = Math.max(max, parseInt(m[1], 10)); - } - return max > 0 ? max : AUDIO_INFERENCE_INPUTS_MAX_VIDEOS; - } - - function toggleVideosEnabled() { - const enabled = useVideosWidget.value === true; - const slotCount = getAudioInferenceVideoSlotCount(); - - for (let i = 1; i <= slotCount; i++) { - const videoWidget = audioInputsNode.widgets.find(w => w && w.name === `Video${i}`); - if (videoWidget) { - if (videoWidget.inputEl) { - videoWidget.inputEl.disabled = !enabled; - videoWidget.inputEl.style.opacity = enabled ? "1" : "0.5"; - videoWidget.inputEl.style.cursor = enabled ? "text" : "not-allowed"; - videoWidget.inputEl.readOnly = !enabled; - } - - videoWidget.disabled = !enabled; - - // Fallback: try to find inputs via DOM - if (!videoWidget.inputEl) { - const nodeElement = audioInputsNode.htmlElements?.widgetsContainer || audioInputsNode.htmlElements; - if (nodeElement) { - const input = nodeElement.querySelector(`input[name="Video${i}"], textarea[name="Video${i}"], select[name="Video${i}"]`); - if (input) { - input.disabled = !enabled; - input.style.opacity = enabled ? "1" : "0.5"; - input.style.cursor = enabled ? "text" : "not-allowed"; - input.readOnly = !enabled; - } - } - } - } - } - - audioInputsNode.setDirtyCanvas(true); - } - - // Set up callback - appendWidgetCB(useVideosWidget, () => { - setTimeout(toggleVideosEnabled, 50); - }); - - // Initial call to set initial state - setTimeout(toggleVideosEnabled, 100); - } - - // Set up toggle handlers for reference audios (Reference Audio 1 … N; N from widgets, fallback to 4) - if (useReferenceAudiosWidget) { - function getAudioInferenceReferenceAudioSlotCount() { - let max = 0; - for (const w of audioInputsNode.widgets) { - if (!w?.name) continue; - const m = /^Reference Audio (\d+)$/.exec(w.name); - if (m) max = Math.max(max, parseInt(m[1], 10)); - } - return max > 0 ? max : 4; - } - - function toggleReferenceAudiosEnabled() { - const enabled = useReferenceAudiosWidget.value === true; - const slotCount = getAudioInferenceReferenceAudioSlotCount(); - - for (let i = 1; i <= slotCount; i++) { - const refAudioWidget = audioInputsNode.widgets.find(w => w && w.name === `Reference Audio ${i}`); - if (refAudioWidget) { - if (refAudioWidget.inputEl) { - refAudioWidget.inputEl.disabled = !enabled; - refAudioWidget.inputEl.style.opacity = enabled ? "1" : "0.5"; - refAudioWidget.inputEl.style.cursor = enabled ? "text" : "not-allowed"; - refAudioWidget.inputEl.readOnly = !enabled; - } - - refAudioWidget.disabled = !enabled; - - if (!refAudioWidget.inputEl) { - const nodeElement = audioInputsNode.htmlElements?.widgetsContainer || audioInputsNode.htmlElements; - if (nodeElement) { - const input = nodeElement.querySelector(`input[name="Reference Audio ${i}"], textarea[name="Reference Audio ${i}"], select[name="Reference Audio ${i}"]`); - if (input) { - input.disabled = !enabled; - input.style.opacity = enabled ? "1" : "0.5"; - input.style.cursor = enabled ? "text" : "not-allowed"; - input.readOnly = !enabled; - } - } - } - } - } - - audioInputsNode.setDirtyCanvas(true); - } - - appendWidgetCB(useReferenceAudiosWidget, () => { - setTimeout(toggleReferenceAudiosEnabled, 50); - }); - - setTimeout(toggleReferenceAudiosEnabled, 100); - } -} - -function audioInferenceSpeechVoicesToggleHandler(voicesNode) { - if (!voicesNode?.widgets) return; - - 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 = voicesNode.htmlElements?.widgetsContainer || voicesNode.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"; - } - } - } - } - - voicesNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - for (let i = 1; i <= 4; i++) { - const useVoiceWidget = voicesNode.widgets.find((w) => w && w.name === `useVoice${i}`); - const speakerWidget = voicesNode.widgets.find((w) => w && w.name === `speaker${i}`); - const voiceWidget = voicesNode.widgets.find((w) => w && w.name === `voice${i}`); - - if (useVoiceWidget && speakerWidget) { - toggleWidgetState(useVoiceWidget, speakerWidget, `speaker${i}`); - } - if (useVoiceWidget && voiceWidget) { - toggleWidgetState(useVoiceWidget, voiceWidget, `voice${i}`); - } - } -} - -function videoInputsFrameToggleHandler(frameImagesNode) { - if (!frameImagesNode?.widgets) return; - if (frameImagesNode._videoInputsFrameToggleHandlerRegistered) return; - frameImagesNode._videoInputsFrameToggleHandlerRegistered = true; - - function toggleWidgetState(useWidget, paramWidget, paramName) { - if (!useWidget || !paramWidget) return; - - function toggleEnabled() { - const enabled = useWidget.value === true; - - // FLOAT timestamp widgets: avoid '' on disabled slots (ComfyUI validation error) - if (!enabled && paramName && paramName.startsWith("timestamp")) { - if (paramWidget.value === "" || paramWidget.value == null) { - paramWidget.value = 0.0; - } - } - - 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; - } - - 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"; - } - - paramWidget.disabled = !enabled; - - if (!paramWidget.inputEl && paramName) { - const nodeElement = frameImagesNode.htmlElements?.widgetsContainer || frameImagesNode.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"; - } - } - } - } - - frameImagesNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - function initializeHandler() { - if (!frameImagesNode.widgets || frameImagesNode.widgets.length === 0) { - setTimeout(initializeHandler, 100); - return; - } - - for (let i = 1; i <= 4; i++) { - const useFrameWidget = frameImagesNode.widgets.find((w) => w && w.name === `useFrame${i}`); - const frameWidget = frameImagesNode.widgets.find((w) => w && w.name === `frame${i} position`); - const useTimestampWidget = frameImagesNode.widgets.find((w) => w && w.name === `useTimestamp${i}`); - const timestampWidget = frameImagesNode.widgets.find((w) => w && w.name === `timestamp${i}`); - - if (useFrameWidget && frameWidget) { - toggleWidgetState(useFrameWidget, frameWidget, `frame${i} position`); - } - if (useTimestampWidget && timestampWidget) { - toggleWidgetState(useTimestampWidget, timestampWidget, `timestamp${i}`); - } - } - } - - initializeHandler(); -} - -function referenceVideosToggleHandler(referenceVideosNode) { - if (!referenceVideosNode?.widgets) return; - - 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; - } - - 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"; - } - - paramWidget.disabled = !enabled; - - if (!paramWidget.inputEl && paramName) { - const nodeElement = referenceVideosNode.htmlElements?.widgetsContainer || referenceVideosNode.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"; - } - } - } - } - - referenceVideosNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - for (let i = 1; i <= 4; i++) { - const useVideoWidget = referenceVideosNode.widgets.find((w) => w && w.name === `useVideo${i}`); - const videoWidget = referenceVideosNode.widgets.find((w) => w && w.name === `Video${i}`); - const tagWidget = referenceVideosNode.widgets.find((w) => w && w.name === `Tag${i}`); - const typeWidget = referenceVideosNode.widgets.find((w) => w && w.name === `Type${i}`); - - if (useVideoWidget && videoWidget) { - toggleWidgetState(useVideoWidget, videoWidget, `Video${i}`); - } - if (useVideoWidget && tagWidget) { - toggleWidgetState(useVideoWidget, tagWidget, `Tag${i}`); - } - if (useVideoWidget && typeWidget) { - toggleWidgetState(useVideoWidget, typeWidget, `Type${i}`); - } - } -} - -export { - notifyUser, - promptEnhanceHandler, - syncDimensionsNodeHandler, - searchNodeHandler, - mediaUUIDHandler, - save3DFilepathHandler, - captionNodeHandler, - saveTextHandler, - videoTranscriptionHandler, - videoOutputsHandler, - handleCustomErrors, - APIKeyHandler, - videoInferenceDimensionsHandler, - videoModelSearchFilterHandler, - threeDModelSearchFilterHandler, - audioModelSearchFilterHandler, - textModelSearchFilterHandler, - vectorizeModelSearchFilterHandler, - vectorizeToggleHandler, - useParameterToggleHandler, - imageInferenceToggleHandler, - imageInferenceAdvancedFeaturesToggleHandler, - watermarkAdvancedFeatureToggleHandler, - videoInferenceSpeechInputToggleHandler, - regionalPromptingRegionsToggleHandler, - upscalerToggleHandler, - imageUpscalerSettingsToggleHandler, - videoUpscalerToggleHandler, - audioInferenceToggleHandler, - audioInferenceSpeechToggleHandler, - audioSettingsToggleHandler, - textInferenceSettingsToggleHandler, - videoSettingsToggleHandler, - videoInferenceSettingsTtsToggleHandler, - videoInferenceSettingsActiveSpeakerDetectionToggleHandler, - videoInferenceSettingsActiveSpeakerBoundingBoxesToggleHandler, - videoInferenceSettingsSegmentsToggleHandler, - videoInferenceSettingsControlToggleHandler, - acceleratorOptionsToggleHandler, - bytedanceProviderSettingsToggleHandler, - xaiProviderSettingsToggleHandler, - viduProviderSettingsToggleHandler, - sourcefulProviderSettingsToggleHandler, - sourcefulProviderSettingsFontsToggleHandler, - threeDInferenceToggleHandler, - threeDInferenceSettingsToggleHandler, - threeDInferenceSettingsLatToggleHandler, - threeDInferenceSettingsMeshClusterToggleHandler, - threeDInferenceSettingsDracoCompressionToggleHandler, - ultralyticsProviderSettingsToggleHandler, - openaiProviderSettingsToggleHandler, - lightricksProviderSettingsToggleHandler, - klingProviderSettingsToggleHandler, - lumaProviderSettingsToggleHandler, - briaProviderSettingsToggleHandler, - pixverseProviderSettingsToggleHandler, - alibabaProviderSettingsToggleHandler, - mireloProviderSettingsToggleHandler, - googleProviderSettingsToggleHandler, - syncProviderSettingsToggleHandler, - syncSegmentToggleHandler, - settingsToggleHandler, - outpaintSettingsToggleHandler, - safetyInputsToggleHandler, - imageInferenceSettingsColorPaletteToggleHandler, - imageInferenceSettingsMoodboardsToggleHandler, - imageInferenceSettingsStructuredPromptToggleHandler, - imageInferenceSettingsPromptEnhanceToggleHandler, - imageInferenceSettingsScoringRubricToggleHandler, - audioInputToggleHandler, - speechInputToggleHandler, - briaProviderMaskToggleHandler, - wanAnimateAdvancedFeatureSettingsToggleHandler, - videoAdvancedFeatureInputsToggleHandler, - audioInferenceInputsToggleHandler, - audioInferenceReferenceVoiceToggleHandler, - audioInferenceSpeechVoicesToggleHandler, - videoInputsFrameToggleHandler, - referenceVideosToggleHandler, -}; - -function googleProviderSettingsToggleHandler(googleNode) { - // Find all "use" parameter widgets for Google Provider Settings - const useGenerateAudioWidget = googleNode.widgets.find(w => w && w.name === "useGenerateAudio"); - const generateAudioWidget = googleNode.widgets.find(w => w && w.name === "generateAudio"); - const useEnhancePromptWidget = googleNode.widgets.find(w => w && w.name === "useEnhancePrompt"); - const enhancePromptWidget = googleNode.widgets.find(w => w && w.name === "enhancePrompt"); - const useSearchWidget = googleNode.widgets.find(w => w && w.name === "useSearch"); - const searchWidget = googleNode.widgets.find(w => w && w.name === "search"); - const useResizeModeWidget = googleNode.widgets.find(w => w && w.name === "useResizeMode"); - const resizeModeWidget = googleNode.widgets.find(w => w && w.name === "resizeMode"); - - // Helper function to toggle widget enabled state - 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 = googleNode.htmlElements?.widgetsContainer || googleNode.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"; - } - } - } - } - - googleNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - // Set up toggle handlers - if (useGenerateAudioWidget && generateAudioWidget) { - toggleWidgetState(useGenerateAudioWidget, generateAudioWidget, "generateAudio"); - } - if (useEnhancePromptWidget && enhancePromptWidget) { - toggleWidgetState(useEnhancePromptWidget, enhancePromptWidget, "enhancePrompt"); - } - if (useSearchWidget && searchWidget) { - toggleWidgetState(useSearchWidget, searchWidget, "search"); - } - if (useResizeModeWidget && resizeModeWidget) { - toggleWidgetState(useResizeModeWidget, resizeModeWidget, "resizeMode"); - } -} - -function settingsToggleHandler(settingsNode) { - // Find all "use" parameter widgets for Settings - const useTemperatureWidget = settingsNode.widgets.find(w => w.name === "useTemperature"); - const temperatureWidget = settingsNode.widgets.find(w => w.name === "temperature"); - const useSystemPromptWidget = settingsNode.widgets.find(w => w.name === "useSystemPrompt"); - const systemPromptWidget = settingsNode.widgets.find(w => w.name === "systemPrompt"); - const useTopPWidget = settingsNode.widgets.find(w => w.name === "useTopP"); - const topPWidget = settingsNode.widgets.find(w => w.name === "topP"); - const useLayersWidget = settingsNode.widgets.find(w => w.name === "useLayers"); - const layersWidget = settingsNode.widgets.find(w => w.name === "layers"); - const useTrueCFGScaleWidget = settingsNode.widgets.find(w => w.name === "useTrueCFGScale"); - const trueCFGScaleWidget = settingsNode.widgets.find(w => w.name === "trueCFGScale"); - const useQualityWidget = settingsNode.widgets.find(w => w.name === "useQuality"); - const qualityWidget = settingsNode.widgets.find(w => w.name === "quality"); - const useBackgroundWidget = settingsNode.widgets.find(w => w.name === "useBackground"); - const backgroundWidget = settingsNode.widgets.find(w => w.name === "background"); - const useStyleWidget = settingsNode.widgets.find(w => w.name === "useStyle"); - const styleWidget = settingsNode.widgets.find(w => w.name === "style"); - const useSearchWidget = settingsNode.widgets.find(w => w.name === "useSearch"); - const searchWidget = settingsNode.widgets.find(w => w.name === "search"); - const usePromptExtendWidget = settingsNode.widgets.find(w => w.name === "usePromptExtend"); - const promptExtendWidget = settingsNode.widgets.find(w => w.name === "promptExtend"); - const useEditRegionsWidget = settingsNode.widgets.find(w => w.name === "useEditRegions"); - const editRegionsWidget = settingsNode.widgets.find(w => w.name === "editRegions"); - const useThinkingWidget = settingsNode.widgets.find(w => w.name === "useThinking"); - const thinkingWidget = settingsNode.widgets.find(w => w.name === "thinking"); - const useThinkingLevelWidget = settingsNode.widgets.find(w => w.name === "useThinkingLevel"); - const thinkingLevelWidget = settingsNode.widgets.find(w => w.name === "thinkingLevel"); - const useSequentialWidget = settingsNode.widgets.find(w => w.name === "useSequential"); - const sequentialWidget = settingsNode.widgets.find(w => w.name === "sequential"); - const useRenderingSpeedWidget = settingsNode.widgets.find(w => w.name === "useRenderingSpeed"); - 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"); - const useDilatePixelsWidget = settingsNode.widgets.find(w => w.name === "useDilatePixels"); - const dilatePixelsWidget = settingsNode.widgets.find(w => w.name === "dilatePixels"); - const useCreativityWidget = settingsNode.widgets.find(w => w.name === "useCreativity"); - const creativityWidget = settingsNode.widgets.find(w => w.name === "creativity"); - const useBackgroundModeWidget = settingsNode.widgets.find(w => w.name === "useBackgroundMode"); - const backgroundModeWidget = settingsNode.widgets.find(w => w.name === "backgroundMode"); - const useBackgroundColorWidget = settingsNode.widgets.find(w => w.name === "useBackgroundColor"); - const backgroundColorWidget = settingsNode.widgets.find(w => w.name === "backgroundColor"); - const useEnhancePromptWidget = settingsNode.widgets.find(w => w.name === "useEnhancePrompt"); - const enhancePromptWidget = settingsNode.widgets.find(w => w.name === "enhancePrompt"); - const useScoringPromptWidget = settingsNode.widgets.find(w => w.name === "useScoringPrompt"); - const scoringPromptWidget = settingsNode.widgets.find(w => w.name === "scoringPrompt"); - const useCopyrightDetectionWidget = settingsNode.widgets.find(w => w.name === "useCopyrightDetection"); - const copyrightDetectionWidget = settingsNode.widgets.find(w => w.name === "copyrightDetection"); - const usePreserveInputSizeWidget = settingsNode.widgets.find(w => w.name === "usePreserveInputSize"); - const preserveInputSizeWidget = settingsNode.widgets.find(w => w.name === "preserveInputSize"); - const useTurboWidget = settingsNode.widgets.find(w => w.name === "useTurbo"); - const turboWidget = settingsNode.widgets.find(w => w.name === "turbo"); - - // Helper function to toggle widget enabled state - 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); - } - - // Set up toggle handlers - if (useTemperatureWidget && temperatureWidget) { - toggleWidgetState(useTemperatureWidget, temperatureWidget, "temperature"); - } - if (useSystemPromptWidget && systemPromptWidget) { - toggleWidgetState(useSystemPromptWidget, systemPromptWidget, "systemPrompt"); - } - if (useTopPWidget && topPWidget) { - toggleWidgetState(useTopPWidget, topPWidget, "topP"); - } - if (useLayersWidget && layersWidget) { - toggleWidgetState(useLayersWidget, layersWidget, "layers"); - } - if (useTrueCFGScaleWidget && trueCFGScaleWidget) { - toggleWidgetState(useTrueCFGScaleWidget, trueCFGScaleWidget, "trueCFGScale"); - } - if (useQualityWidget && qualityWidget) { - toggleWidgetState(useQualityWidget, qualityWidget, "quality"); - } - if (useBackgroundWidget && backgroundWidget) { - toggleWidgetState(useBackgroundWidget, backgroundWidget, "background"); - } - if (useStyleWidget && styleWidget) { - toggleWidgetState(useStyleWidget, styleWidget, "style"); - } - if (useSearchWidget && searchWidget) { - toggleWidgetState(useSearchWidget, searchWidget, "search"); - } - if (usePromptExtendWidget && promptExtendWidget) { - toggleWidgetState(usePromptExtendWidget, promptExtendWidget, "promptExtend"); - } - if (useEditRegionsWidget && editRegionsWidget) { - toggleWidgetState(useEditRegionsWidget, editRegionsWidget, "editRegions"); - } - if (useThinkingWidget && thinkingWidget) { - toggleWidgetState(useThinkingWidget, thinkingWidget, "thinking"); - } - if (useThinkingLevelWidget && thinkingLevelWidget) { - toggleWidgetState(useThinkingLevelWidget, thinkingLevelWidget, "thinkingLevel"); - } - if (useSequentialWidget && sequentialWidget) { - toggleWidgetState(useSequentialWidget, sequentialWidget, "sequential"); - } - if (useRenderingSpeedWidget && renderingSpeedWidget) { - toggleWidgetState(useRenderingSpeedWidget, renderingSpeedWidget, "renderingSpeed"); - } - if (useMagicPromptWidget && magicPromptWidget) { - toggleWidgetState(useMagicPromptWidget, magicPromptWidget, "magicPrompt"); - } - if (useAutoCropWidget && autoCropWidget) { - toggleWidgetState(useAutoCropWidget, autoCropWidget, "autoCrop"); - } - if (useDilatePixelsWidget && dilatePixelsWidget) { - toggleWidgetState(useDilatePixelsWidget, dilatePixelsWidget, "dilatePixels"); - } - if (useCreativityWidget && creativityWidget) { - toggleWidgetState(useCreativityWidget, creativityWidget, "creativity"); - } - if (useBackgroundModeWidget && backgroundModeWidget) { - toggleWidgetState(useBackgroundModeWidget, backgroundModeWidget, "backgroundMode"); - } - if (useBackgroundColorWidget && backgroundColorWidget) { - toggleWidgetState(useBackgroundColorWidget, backgroundColorWidget, "backgroundColor"); - } - if (useEnhancePromptWidget && enhancePromptWidget) { - toggleWidgetState(useEnhancePromptWidget, enhancePromptWidget, "enhancePrompt"); - } - if (useScoringPromptWidget && scoringPromptWidget) { - toggleWidgetState(useScoringPromptWidget, scoringPromptWidget, "scoringPrompt"); - } - if (useCopyrightDetectionWidget && copyrightDetectionWidget) { - toggleWidgetState(useCopyrightDetectionWidget, copyrightDetectionWidget, "copyrightDetection"); - } - if (usePreserveInputSizeWidget && preserveInputSizeWidget) { - toggleWidgetState(usePreserveInputSizeWidget, preserveInputSizeWidget, "preserveInputSize"); - } - if (useTurboWidget && turboWidget) { - toggleWidgetState(useTurboWidget, turboWidget, "turbo"); - } -} - -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) { - const useModeWidget = safetyNode.widgets.find(w => w.name === "useMode"); - const modeWidget = safetyNode.widgets.find(w => w.name === "mode"); - const useToleranceWidget = safetyNode.widgets.find(w => w.name === "useTolerance"); - const toleranceWidget = safetyNode.widgets.find(w => w.name === "tolerance"); - const useCheckInputsWidget = safetyNode.widgets.find(w => w.name === "useCheckInputs"); - const checkInputsWidget = safetyNode.widgets.find(w => w.name === "checkInputs"); - const useCheckContentWidget = safetyNode.widgets.find(w => w.name === "useCheckContent"); - const checkContentWidget = safetyNode.widgets.find(w => w.name === "checkContent"); - - 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 = safetyNode.htmlElements?.widgetsContainer || safetyNode.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"; - } - } - } - } - - safetyNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - if (useModeWidget && modeWidget) { - toggleWidgetState(useModeWidget, modeWidget, "mode"); - } - if (useToleranceWidget && toleranceWidget) { - toggleWidgetState(useToleranceWidget, toleranceWidget, "tolerance"); - } - if (useCheckInputsWidget && checkInputsWidget) { - toggleWidgetState(useCheckInputsWidget, checkInputsWidget, "checkInputs"); - } - if (useCheckContentWidget && checkContentWidget) { - toggleWidgetState(useCheckContentWidget, checkContentWidget, "checkContent"); - } -} - -function imageInferenceSettingsColorPaletteToggleHandler(paletteNode) { - function applyParamState(useWidget, paramWidget, paramName) { - if (!useWidget || !paramWidget) return; - 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 = paletteNode.htmlElements?.widgetsContainer || paletteNode.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; - } - } - } - } - - function bindSlot(i) { - const useW = paletteNode.widgets.find((w) => w.name === `use_${i}`); - const hexW = paletteNode.widgets.find((w) => w.name === `hex_${i}`); - const ratioW = paletteNode.widgets.find((w) => w.name === `ratio_${i}`); - if (!useW || !hexW || !ratioW) return; - - function toggleSlot() { - applyParamState(useW, hexW, `hex_${i}`); - applyParamState(useW, ratioW, `ratio_${i}`); - paletteNode.setDirtyCanvas(true); - } - - appendWidgetCB(useW, () => { - setTimeout(toggleSlot, 50); - }); - setTimeout(toggleSlot, 100); - } - - for (let i = 1; i <= 8; i++) { - bindSlot(i); - } -} - -function imageInferenceSettingsPromptEnhanceToggleHandler(node) { - if (!node?.widgets) return; - - const useTemperatureWidget = node.widgets.find((w) => w && w.name === "useTemperature"); - const temperatureWidget = node.widgets.find((w) => w && w.name === "temperature"); - const useTopPWidget = node.widgets.find((w) => w && w.name === "useTopP"); - const topPWidget = node.widgets.find((w) => w && w.name === "topP"); - const useEnabledWidget = node.widgets.find((w) => w && w.name === "useEnabled"); - const enabledWidget = node.widgets.find((w) => w && w.name === "enabled"); - - function toggleWidgetState(useWidget, paramWidget) { - if (!useWidget || !paramWidget) return; - function toggleEnabled() { - toggleWidgetEnabled(paramWidget, useWidget.value === true, node); - node.setDirtyCanvas(true); - } - appendWidgetCB(useWidget, () => setTimeout(toggleEnabled, 50)); - setTimeout(toggleEnabled, 100); - } - - if (useTemperatureWidget && temperatureWidget) { - toggleWidgetState(useTemperatureWidget, temperatureWidget); - } - if (useTopPWidget && topPWidget) { - toggleWidgetState(useTopPWidget, topPWidget); - } - if (useEnabledWidget && enabledWidget) { - toggleWidgetState(useEnabledWidget, enabledWidget); - } -} - -function imageInferenceSettingsMoodboardsToggleHandler(moodboardsNode) { - if (!moodboardsNode?.widgets) return; - - const useStrengthWidget = moodboardsNode.widgets.find((w) => w && w.name === "useStrength"); - const strengthWidget = moodboardsNode.widgets.find((w) => w && w.name === "strength"); - if (!useStrengthWidget || !strengthWidget) return; - - function toggleStrengthState() { - const enabled = useStrengthWidget.value === true; - toggleWidgetEnabled(strengthWidget, enabled, moodboardsNode); - moodboardsNode.setDirtyCanvas(true); - } - - appendWidgetCB(useStrengthWidget, () => { - setTimeout(toggleStrengthState, 50); - }); - setTimeout(toggleStrengthState, 100); -} - -function imageInferenceSettingsScoringRubricToggleHandler(rubricNode) { - if (!rubricNode?.widgets) return; - if (rubricNode._imageInferenceSettingsScoringRubricToggleHandlerRegistered) return; - rubricNode._imageInferenceSettingsScoringRubricToggleHandlerRegistered = true; - - function toggleWidgetState(useWidget, paramWidgets, paramNames) { - if (!useWidget) return; - const widgets = Array.isArray(paramWidgets) ? paramWidgets : [paramWidgets]; - const names = Array.isArray(paramNames) ? paramNames : [paramNames]; - - function toggleEnabled() { - const enabled = useWidget.value === true; - - widgets.forEach((paramWidget, index) => { - if (!paramWidget) return; - toggleWidgetEnabled(paramWidget, enabled, rubricNode); - const paramName = names[index]; - if (!paramWidget.inputEl && paramName) { - const nodeElement = rubricNode.htmlElements?.widgetsContainer || rubricNode.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"; - } - } - } - }); - - rubricNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => setTimeout(toggleEnabled, 50)); - setTimeout(toggleEnabled, 100); - } - - const usePassingScoreWidget = rubricNode.widgets.find((w) => w && w.name === "usePassingScore"); - const passingScoreWidget = rubricNode.widgets.find((w) => w && w.name === "passingScore"); - if (usePassingScoreWidget && passingScoreWidget) { - toggleWidgetState(usePassingScoreWidget, passingScoreWidget, "passingScore"); - } - - for (let i = 1; i <= 5; i++) { - const useScoreGuidanceWidget = rubricNode.widgets.find((w) => w && w.name === `useScoreGuidance${i}`); - const scoreWidget = rubricNode.widgets.find((w) => w && w.name === `score${i}`); - const guidanceDescriptionWidget = rubricNode.widgets.find((w) => w && w.name === `guidanceDescription${i}`); - if (useScoreGuidanceWidget && (scoreWidget || guidanceDescriptionWidget)) { - toggleWidgetState( - useScoreGuidanceWidget, - [scoreWidget, guidanceDescriptionWidget].filter(Boolean), - [`score${i}`, `guidanceDescription${i}`] - ); - } - } -} - -function imageInferenceSettingsStructuredPromptToggleHandler(node) { - if (!node?.widgets) return; - - function applyParamState(useWidget, paramWidget, paramName) { - if (!useWidget || !paramWidget) return; - 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 = node.htmlElements?.widgetsContainer || node.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; - } - } - } - } - - function toggleWidgetState(useWidget, paramWidget, paramName) { - if (!useWidget || !paramWidget) return; - function toggleEnabled() { - applyParamState(useWidget, paramWidget, paramName); - node.setDirtyCanvas(true); - } - appendWidgetCB(useWidget, () => setTimeout(toggleEnabled, 50)); - setTimeout(toggleEnabled, 100); - } - - const useStyleDescriptionWidget = node.widgets.find((w) => w && w.name === "useStyleDescription"); - const styleDescriptionWidget = node.widgets.find((w) => w && w.name === "style_description"); - if (useStyleDescriptionWidget && styleDescriptionWidget) { - toggleWidgetState(useStyleDescriptionWidget, styleDescriptionWidget, "style_description"); - } - - const useElementsJsonWidget = node.widgets.find((w) => w && w.name === "useElementsJson"); - const elementsJsonWidget = node.widgets.find((w) => w && w.name === "elementsJson"); - const elementSlotRefreshers = []; - if (useElementsJsonWidget && elementsJsonWidget) { - toggleWidgetState(useElementsJsonWidget, elementsJsonWidget, "elementsJson"); - } - - function bindElementSlot(i) { - const useW = node.widgets.find((w) => w && w.name === `use_element_${i}`); - const typeW = node.widgets.find((w) => w && w.name === `element_type_${i}`); - const descW = node.widgets.find((w) => w && w.name === `element_desc_${i}`); - const textW = node.widgets.find((w) => w && w.name === `element_text_${i}`); - const bboxW = node.widgets.find((w) => w && w.name === `element_bbox_${i}`); - const paletteW = node.widgets.find((w) => w && w.name === `element_color_palette_${i}`); - if (!useW) return; - - function toggleSlot() { - const jsonMode = useElementsJsonWidget?.value === true; - toggleWidgetEnabled(useW, !jsonMode, node); - const enabled = !jsonMode && useW.value === true; - [typeW, descW, textW, bboxW, paletteW].forEach((w) => { - if (w) toggleWidgetEnabled(w, enabled, node); - }); - node.setDirtyCanvas(true); - } - - elementSlotRefreshers.push(toggleSlot); - appendWidgetCB(useW, () => setTimeout(toggleSlot, 50)); - setTimeout(toggleSlot, 100); - } - - for (let i = 1; i <= 8; i++) { - bindElementSlot(i); - } - - if (useElementsJsonWidget) { - function refreshElementSlotsForJsonMode() { - elementSlotRefreshers.forEach((refresh) => refresh()); - node.setDirtyCanvas(true); - } - appendWidgetCB(useElementsJsonWidget, () => setTimeout(refreshElementSlotsForJsonMode, 50)); - setTimeout(refreshElementSlotsForJsonMode, 100); - } -} - -function syncProviderSettingsToggleHandler(syncNode) { - // Find all "use" parameter widgets for Sync Provider Settings - const useEditRegionWidget = syncNode.widgets.find(w => w.name === "useEditRegion"); - const editRegionWidget = syncNode.widgets.find(w => w.name === "editRegion"); - const useEmotionPromptWidget = syncNode.widgets.find(w => w.name === "useEmotionPrompt"); - const emotionPromptWidget = syncNode.widgets.find(w => w.name === "emotionPrompt"); - const useTemperatureWidget = syncNode.widgets.find(w => w.name === "useTemperature"); - const temperatureWidget = syncNode.widgets.find(w => w.name === "temperature"); - const useActiveSpeakerDetectionWidget = syncNode.widgets.find(w => w.name === "useActiveSpeakerDetection"); - const activeSpeakerDetectionWidget = syncNode.widgets.find(w => w.name === "activeSpeakerDetection"); - const useOcclusionDetectionEnabledWidget = syncNode.widgets.find(w => w.name === "useOcclusionDetectionEnabled"); - const occlusionDetectionEnabledWidget = syncNode.widgets.find(w => w.name === "occlusionDetectionEnabled"); - - // Helper function to toggle widget enabled state - 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 = syncNode.htmlElements?.widgetsContainer || syncNode.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"; - } - } - } - } - - syncNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - // Set up toggle handlers - if (useEditRegionWidget && editRegionWidget) { - toggleWidgetState(useEditRegionWidget, editRegionWidget, "editRegion"); - } - if (useEmotionPromptWidget && emotionPromptWidget) { - toggleWidgetState(useEmotionPromptWidget, emotionPromptWidget, "emotionPrompt"); - } - if (useTemperatureWidget && temperatureWidget) { - toggleWidgetState(useTemperatureWidget, temperatureWidget, "temperature"); - } - if (useActiveSpeakerDetectionWidget && activeSpeakerDetectionWidget) { - toggleWidgetState(useActiveSpeakerDetectionWidget, activeSpeakerDetectionWidget, "activeSpeakerDetection"); - } - if (useOcclusionDetectionEnabledWidget && occlusionDetectionEnabledWidget) { - toggleWidgetState(useOcclusionDetectionEnabledWidget, occlusionDetectionEnabledWidget, "occlusionDetectionEnabled"); - } -} - -function syncSegmentToggleHandler(syncSegmentNode) { - // Find all "use" parameter widgets for Sync Segment - const useAudioStartTimeWidget = syncSegmentNode.widgets.find(w => w.name === "useAudioStartTime"); - const audioStartTimeWidget = syncSegmentNode.widgets.find(w => w.name === "audioStartTime"); - const useAudioEndTimeWidget = syncSegmentNode.widgets.find(w => w.name === "useAudioEndTime"); - const audioEndTimeWidget = syncSegmentNode.widgets.find(w => w.name === "audioEndTime"); - - // Helper function to toggle widget enabled state - 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 = syncSegmentNode.htmlElements?.widgetsContainer || syncSegmentNode.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"; - } - } - } - } - - syncSegmentNode.setDirtyCanvas(true); - } - - appendWidgetCB(useWidget, () => { - setTimeout(toggleEnabled, 50); - }); - - setTimeout(toggleEnabled, 100); - } - - // Set up toggle handlers - if (useAudioStartTimeWidget && audioStartTimeWidget) { - toggleWidgetState(useAudioStartTimeWidget, audioStartTimeWidget, "audioStartTime"); - } - if (useAudioEndTimeWidget && audioEndTimeWidget) { - toggleWidgetState(useAudioEndTimeWidget, audioEndTimeWidget, "audioEndTime"); - } -} diff --git a/modules/acceleratorOptions.py b/modules/acceleratorOptions.py deleted file mode 100644 index 94a39bc..0000000 --- a/modules/acceleratorOptions.py +++ /dev/null @@ -1,172 +0,0 @@ -class acceleratorOptions: - """Accelerator Options node for configuring caching options for faster generation""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "fbcache": ("BOOLEAN", { - "tooltip": "Enable Frame Buffer Cache for faster generation", - "default": None, - }), - "useCacheDistance": ("BOOLEAN", { - "tooltip": "Enable to include cacheDistance parameter in API request.", - "default": False, - }), - "cacheDistance": ("FLOAT", { - "tooltip": "Cache distance parameter for FBCache", - "default": 0.0, - "min": 0.0, - "max": 1.0, - "step": 0.01, - }), - "teaCache": ("BOOLEAN", { - "tooltip": "Enable TeaCache for transformer-based models (Flux, SD3). Does not work with UNet models like SDXL or SD1.5. Particularly effective for iterative editing workflows.", - "default": None, - }), - "useTeaCacheDistance": ("BOOLEAN", { - "tooltip": "Enable to include teaCacheDistance parameter in API request.", - "default": False, - }), - "teaCacheDistance": ("FLOAT", { - "tooltip": "Controls TeaCache aggressiveness: 0.0 (conservative/quality) to 1.0 (aggressive/speed). Lower values maintain quality, higher values prioritize speed.", - "default": 0.0, - "min": 0.0, - "max": 1.0, - "step": 0.01, - }), - "deepCache": ("BOOLEAN", { - "tooltip": "Enable DeepCache for UNet-based models (SDXL, SD1.5). Not applicable to transformer models. Provides performance improvements for high-throughput scenarios.", - "default": None, - }), - "useDeepCacheOptions": ("BOOLEAN", { - "tooltip": "Enable to include DeepCache options (deepCacheInterval and deepCacheBranchId) in API request.", - "default": False, - }), - "deepCacheInterval": ("INT", { - "tooltip": "Frequency of feature caching - steps between cache operations. Larger values = faster but may impact quality. Smaller values = better quality but slower.", - "default": 1, - "min": 1, - "max": 20, - }), - "deepCacheBranchId": ("INT", { - "tooltip": "Network branch for caching (0=shallowest, deeper=more conservative). Lower IDs = aggressive caching/faster, higher IDs = conservative caching/better quality.", - "default": 0, - "min": 0, - "max": 10, - }), - "useCacheSteps": ("BOOLEAN", { - "tooltip": "Enable to include cache step control parameters (step numbers) in API request.", - "default": False, - }), - "cacheStartStep": ("INT", { - "tooltip": "Inference step number where caching begins (0 to total steps). Only included when useCacheSteps is enabled and value > 0.", - "default": 0, - "min": 0, - "max": 200, - }), - "cacheEndStep": ("INT", { - "tooltip": "Inference step number where caching stops (must be > cacheStartStep). Only included when useCacheSteps is enabled.", - "default": 1, - "min": 1, - "max": 200, - }), - "useCachePercentageSteps": ("BOOLEAN", { - "tooltip": "Enable to include cache step control parameters (percentages) in API request.", - "default": False, - }), - "cacheStartStepPercentage": ("INT", { - "tooltip": "Percentage of total steps where caching begins (0-99). Only included when useCachePercentageSteps is enabled and value > 0.", - "default": 0, - "min": 0, - "max": 99, - }), - "cacheEndStepPercentage": ("INT", { - "tooltip": "Percentage of total steps where caching stops (must be > cacheStartStepPercentage). Only included when useCachePercentageSteps is enabled.", - "default": 1, - "min": 1, - "max": 100, - }), - "useCacheMaxConsecutiveSteps": ("BOOLEAN", { - "tooltip": "Enable to include cacheMaxConsecutiveSteps parameter in API request.", - "default": False, - }), - "cacheMaxConsecutiveSteps": ("INT", { - "tooltip": "Max consecutive steps using cached computations before forcing fresh computation. Prevents quality degradation from extended cache reuse.", - "default": 1, - "min": 1, - "max": 5, - }), - }, - } - - DESCRIPTION = "Configure Runware accelerator options for faster image generation. Supports TeaCache (transformer models like Flux/SD3) and DeepCache (UNet models like SDXL/SD1.5) with fine-grained control over caching parameters and step ranges. Note: These caching methods work best with deterministic schedulers (Euler, DDIM) rather than stochastic schedulers." - FUNCTION = "acceleratorOptions" - RETURN_TYPES = ("RUNWAREACCELERATOR",) - RETURN_NAMES = ("Runware Accelerator",) - CATEGORY = "Runware" - - def acceleratorOptions(self, **kwargs): - """Build accelerator options dictionary""" - params = self._extractParameters(kwargs) - acceleratorOptions = self._buildAcceleratorOptions(params) - return (acceleratorOptions,) - - def _extractParameters(self, kwargs): - """Extract all parameters from kwargs""" - return { - "fbcache": kwargs.get("fbcache"), - "useCacheDistance": kwargs.get("useCacheDistance", False), - "cacheDistance": kwargs.get("cacheDistance", 0.0), - "teaCache": kwargs.get("teaCache"), - "useTeaCacheDistance": kwargs.get("useTeaCacheDistance", False), - "teaCacheDistance": kwargs.get("teaCacheDistance", 0.0), - "deepCache": kwargs.get("deepCache"), - "useDeepCacheOptions": kwargs.get("useDeepCacheOptions", False), - "deepCacheInterval": kwargs.get("deepCacheInterval", 1), - "deepCacheBranchId": kwargs.get("deepCacheBranchId", 0), - "useCacheSteps": kwargs.get("useCacheSteps", False), - "cacheStartStep": kwargs.get("cacheStartStep", 0), - "cacheEndStep": kwargs.get("cacheEndStep", 1), - "useCachePercentageSteps": kwargs.get("useCachePercentageSteps", False), - "cacheStartStepPercentage": kwargs.get("cacheStartStepPercentage", 0), - "cacheEndStepPercentage": kwargs.get("cacheEndStepPercentage", 1), - "useCacheMaxConsecutiveSteps": kwargs.get("useCacheMaxConsecutiveSteps", False), - "cacheMaxConsecutiveSteps": kwargs.get("cacheMaxConsecutiveSteps", 1), - } - - def _buildAcceleratorOptions(self, params): - """Build accelerator options dictionary from parameters""" - acceleratorOptions = {} - - if params["fbcache"] is True: - acceleratorOptions["fbcache"] = params["fbcache"] - if params["useCacheDistance"]: - acceleratorOptions["cacheDistance"] = params["cacheDistance"] - - if params["teaCache"] is True: - acceleratorOptions["teaCache"] = params["teaCache"] - if params["useTeaCacheDistance"]: - acceleratorOptions["teaCacheDistance"] = params["teaCacheDistance"] - - if params["deepCache"] is True: - acceleratorOptions["deepCache"] = params["deepCache"] - if params["useDeepCacheOptions"]: - acceleratorOptions["deepCacheInterval"] = params["deepCacheInterval"] - acceleratorOptions["deepCacheBranchId"] = params["deepCacheBranchId"] - - if params["useCacheSteps"]: - if params["cacheStartStep"] > 0: - acceleratorOptions["cacheStartStep"] = params["cacheStartStep"] - acceleratorOptions["cacheEndStep"] = params["cacheEndStep"] - - if params["useCachePercentageSteps"]: - if params["cacheStartStepPercentage"] > 0: - acceleratorOptions["cacheStartStepPercentage"] = params["cacheStartStepPercentage"] - acceleratorOptions["cacheEndStepPercentage"] = params["cacheEndStepPercentage"] - - if params["useCacheMaxConsecutiveSteps"]: - acceleratorOptions["cacheMaxConsecutiveSteps"] = params["cacheMaxConsecutiveSteps"] - - return acceleratorOptions diff --git a/modules/advancedFeatureSettings/__init__.py b/modules/advancedFeatureSettings/__init__.py deleted file mode 100644 index 7eac2f0..0000000 --- a/modules/advancedFeatureSettings/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# Advanced Feature Settings module - diff --git a/modules/advancedFeatureSettings/wanAnimateAdvancedFeatureSettings.py b/modules/advancedFeatureSettings/wanAnimateAdvancedFeatureSettings.py deleted file mode 100644 index 6381a91..0000000 --- a/modules/advancedFeatureSettings/wanAnimateAdvancedFeatureSettings.py +++ /dev/null @@ -1,99 +0,0 @@ -""" -Runware Wan Animate Advanced Feature Settings Node -Provides Wan Animate-specific settings for video generation -""" - -from typing import Dict, Any - -class RunwareWanAnimateAdvancedFeatureSettings: - """Runware Wan Animate Advanced Feature Settings Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useMode": ("BOOLEAN", { - "tooltip": "Enable to include mode parameter in API request.", - "default": True, - }), - "mode": (["animate", "replace"], { - "tooltip": "Animation mode: 'animate' uses pose detector and skeleton retargeting to animate a character from a reference image. 'replace' uses pose detector and segmentation model to replace a character in existing footage. Only used when 'Use Mode' is enabled.", - "default": "animate", - }), - "useRetargetPose": ("BOOLEAN", { - "tooltip": "Enable to include retargetPose parameter in API request. Only available for animate mode.", - "default": False, - }), - "retargetPose": ("BOOLEAN", { - "tooltip": "Retarget the pose of video image to match the reference image initial pose. That is achieved moving the hands' bones according to video. Means if the character from video moves his hands it will take the initial reference image pose and change the position of bones according to video movements. Supported only for animate mode. Only used when 'Use Retarget Pose' is enabled.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "usePrevSegCondFrames": ("BOOLEAN", { - "tooltip": "Enable to include prevSegCondFrames parameter in API request.", - "default": False, - }), - "prevSegCondFrames": ("INT", { - "tooltip": "How many frames to take from previous segment to keep temporal consistency. Less -> less consistent between the segments. More -> more time for inference. Only used when 'Use Prev Seg Cond Frames' is enabled.", - "default": 1, - "min": 1, - "max": 5, - }), - } - } - - RETURN_TYPES = ("RUNWAREWANANIMATEADVANCEDFEATURESETTINGS",) - RETURN_NAMES = ("Wan Animate Advanced Feature Settings",) - FUNCTION = "create_wan_animate_settings" - CATEGORY = "Runware/Advanced Feature Settings" - DESCRIPTION = "Configure Wan Animate advanced feature settings including mode (animate/replace), pose retargeting, and previous segment conditioning frames for character animation and replacement." - - def create_wan_animate_settings(self, **kwargs) -> tuple[Dict[str, Any]]: - """Create Wan Animate advanced feature settings""" - - # Get use parameters - useMode = kwargs.get("useMode", True) - useRetargetPose = kwargs.get("useRetargetPose", False) - usePrevSegCondFrames = kwargs.get("usePrevSegCondFrames", False) - - # Get actual parameters - mode = kwargs.get("mode", "animate") - retargetPose = kwargs.get("retargetPose", False) - prevSegCondFrames = kwargs.get("prevSegCondFrames", 1) - - # Build settings dictionary - wanAnimateSettings = {} - - # Add mode only if useMode is enabled - if useMode and mode is not None: - wanAnimateSettings["mode"] = mode - - # Add retargetPose only if useRetargetPose is enabled - # Note: retargetPose is only supported for animate mode, but we'll let the API handle validation - if useRetargetPose: - wanAnimateSettings["retargetPose"] = retargetPose - - # Add prevSegCondFrames only if usePrevSegCondFrames is enabled - if usePrevSegCondFrames: - wanAnimateSettings["prevSegCondFrames"] = prevSegCondFrames - - # Clean up None values - wanAnimateSettings = {k: v for k, v in wanAnimateSettings.items() if v is not None} - - # Return the full structure with the feature name as key (similar to providerSettings pattern) - if wanAnimateSettings: - return ({"wanAnimate": wanAnimateSettings},) - else: - return ({},) - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareWanAnimateAdvancedFeatureSettings": RunwareWanAnimateAdvancedFeatureSettings, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareWanAnimateAdvancedFeatureSettings": "Runware Wan Animate Advanced Feature Settings", -} - diff --git a/modules/apiManager.py b/modules/apiManager.py deleted file mode 100644 index 4663f3d..0000000 --- a/modules/apiManager.py +++ /dev/null @@ -1,84 +0,0 @@ -from .utils import runwareUtils as rwUtils - - -class apiManager: - """API Manager node for configuring Runware API settings""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "API Key": ( - "STRING", - { - "tooltip": "Define Or Change Your Runware API Key To Start Using Runware Image Inference Services.\n\n(e.g; BcVr1JVQM8FGzrRwb3GsbCq5ww1QwabV)\n\nIf You Don't Have One, You Can Get It From: https://my.runware.ai/keys", - }, - ), - "Max Timeout": ( - "INT", - { - "tooltip": "Change Runware API Request Timeout In Seconds.\n\n(e.g; 90 Seconds).", - "min": 5, - "max": 99, - "default": int(rwUtils.getTimeout()), - }, - ), - "Image Output Quality": ( - "INT", - { - "tooltip": "Sets the compression quality of the output image. Higher values preserve more quality but increase file size, lower values reduce file size but decrease quality.", - "min": 20, - "max": 99, - "default": int(rwUtils.getOutputQuality()), - }, - ), - "Image Output Format": ( - ["WEBP", "PNG", "JPEG"], - { - "tooltip": "Change the Default Image Output Format.", - "default": rwUtils.getOutputFormat(), - }, - ), - "Enable Images Caching": ( - "BOOLEAN", - { - "label_on": "Enabled", - "label_off": "Disabled", - "tooltip": "Enable or disable image caching functionality.\n\nWhen enabled, images will be cached to improve performance and reduce redundant processing.", - "default": rwUtils.getEnableImagesCaching(), - }, - ), - "Min Image Cache Size": ( - "INT", - { - "tooltip": "Set the minimum size (in KB) for images to be cached.", - "min": 30, - "max": 4096, - "step": 1, - "default": int(rwUtils.getMinImageCacheSize()), - }, - ), - }, - } - - DESCRIPTION = "API Managers is a Runware Utility That helps you define or change your API Key, Session Timeout, Image Output Format & Quality, and Image Caching settings From The ComfyUI Interface Without having to adjust the env file locally." - CATEGORY = "Runware" - RETURN_TYPES = () - - def manageApiSettings(self, **kwargs): - """Manage API settings""" - apiKey = kwargs.get("API Key") - maxTimeout = kwargs.get("Max Timeout") - imageOutputQuality = kwargs.get("Image Output Quality") - imageOutputFormat = kwargs.get("Image Output Format") - enableImagesCaching = kwargs.get("Enable Images Caching") - minImageCacheSize = kwargs.get("Min Image Cache Size") - - rwUtils.setApiKey(apiKey) - rwUtils.setTimeout(maxTimeout) - rwUtils.setOutputQuality(imageOutputQuality) - rwUtils.setOutputFormat(imageOutputFormat) - rwUtils.setEnableImagesCaching(enableImagesCaching) - rwUtils.setMinImageCacheSize(minImageCacheSize) - - return () diff --git a/modules/audioInference.py b/modules/audioInference.py deleted file mode 100644 index a958620..0000000 --- a/modules/audioInference.py +++ /dev/null @@ -1,577 +0,0 @@ -import uuid -import requests -import torch -import librosa -import tempfile -import os -from urllib.parse import urlparse -import comfy.model_management -from .utils import runwareUtils as rwUtils - - -class RunwareAudioInference: - """Runware Audio Inference node for generating audio using Runware API""" - - def __init__(self): - pass - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "model": ("RUNWAREAUDIOMODEL", { - "tooltip": "AI model to use for audio generation" - }), - "positivePrompt": ("STRING", { - "multiline": True, - "default": "classical piano piece, gentle and melodic", - "tooltip": "Text description that guides the audio generation process" - }), - "negativePrompt": ("STRING", { - "multiline": True, - "default": "", - "tooltip": "Text description of what you don't want in the audio" - }), - "useDuration": ("BOOLEAN", { - "default": True, - "tooltip": "Enable/disable duration parameter in API request" - }), - "duration": ("INT", { - "default": 10, - "min": 10, - "max": 300, - "step": 1, - "tooltip": "Length of generated audio in seconds (10-300)" - }), - "useSampleRate": ("BOOLEAN", { - "default": False, - "tooltip": "Enable/disable sampleRate parameter in API request" - }), - "sampleRate": ([8000, 16000, 22050, 24000, 32000, 44100, 48000], { - "default": 32000, - "tooltip": "Audio sample rate in Hz. Supported: 8000, 16000, 22050, 24000, 32000, 44100, 48000.", - }), - "useBitrate": ("BOOLEAN", { - "default": False, - "tooltip": "Enable/disable bitrate parameter in API request" - }), - "bitrate": ([8, 16, 32, 64, 128, 256], { - "default": 128, - "tooltip": "Audio bitrate in kbps. Allowed: 8, 16, 32, 64, 128, 256. Applies to compressed formats (e.g. MP3, OGG).", - }), - "useChannels": ("BOOLEAN", { - "default": False, - "tooltip": "Enable/disable channels parameter in API request" - }), - "channels": ("INT", { - "default": 2, - "min": 1, - "max": 2, - "step": 1, - "tooltip": "Number of audio channels (1=mono, 2=stereo)" - }), - "outputFormat": (["MP3", "MP4", "WAV", "FLAC", "OGG"], { - "default": "MP3", - "tooltip": "Format of the output audio" - }), - "numberResults": ("INT", { - "default": 1, - "min": 1, - "max": 3, - "tooltip": "Number of audio files to generate" - }), - "useSeed": ("BOOLEAN", { - "tooltip": "Enable to include seed parameter in API request for reproducible generation.", - "default": False, - }), - "seed": ("INT", { - "tooltip": "Seed for reproducible audio generation. Only used when 'Use Seed' is enabled.", - "default": 1, - "min": 1, - "max": 2147483647, - }), - "useSteps": ("BOOLEAN", { - "tooltip": "Enable to include steps parameter in API request. Disable if your model doesn't support steps.", - "default": False, - }), - "steps": ("INT", { - "tooltip": "Number of inference steps for audio generation. More steps generally result in higher quality but longer generation time.", - "default": 20, - "min": 1, - "max": 100, - }), - "useStrength": ("BOOLEAN", { - "tooltip": "Enable to include strength parameter in API request. Used for audio-to-audio generation.", - "default": False, - }), - "strength": ("FLOAT", { - "tooltip": "Influence of the input audio in audio-to-audio generation. Lower = more original, higher = more variation. Only used when 'Use Strength' is enabled.", - "default": 0.8, - "min": 0.0, - "max": 1.0, - "step": 0.01, - }), - "useCFGScale": ("BOOLEAN", { - "tooltip": "Enable to include CFGScale parameter in API request. Disable if your model doesn't support CFG scale.", - "default": False, - }), - "CFGScale": ("FLOAT", { - "tooltip": "Classifier-free guidance scale. Higher values adhere more closely to the prompt. Only used when 'Use CFG Scale' is enabled.", - "default": 12.0, - "min": 1.0, - "max": 50.0, - "step": 0.5, - }), - }, - "optional": { - "inputs": ("RUNWAREAUDIOINFERENCEINPUTS", { - "tooltip": "Custom inputs for audio generation (e.g., video URL for audio extraction)" - }), - "settings": ("RUNWAREAUDIOSETTINGS", { - "tooltip": "Connect Runware Audio Inference Settings for includePrefix, topK, temperature, audioTemperature, lyrics, guidanceType, languageBoost, turbo, textNormalization, xVectorOnly, maxNewTokens, transcript, etc." - }), - "speech": ("RUNWARESPEECH", { - "tooltip": "Connect Runware Audio Inference Speech for speech synthesis (e.g. Minimax)" - }), - "voiceModify": ("RUNWAREVOICEMODIFY", { - "tooltip": "Connect Runware Audio Inference Settings Voice Modify for pitch, intensity, timbre, sound effects" - }), - "providerSettings": ("RUNWAREPROVIDERSETTINGS", { - "tooltip": "Provider-specific configuration settings" - }), - } - } - - RETURN_TYPES = ("AUDIO", "VIDEO") - RETURN_NAMES = ("audio", "video") - FUNCTION = "generateAudio" - CATEGORY = "Runware/Audio" - - def generateAudio(self, **kwargs): - """Main function to generate audio using Runware API""" - params = self._extractParameters(kwargs) - genConfig = self._buildGenConfig(params) - - try: - # Debug: Print the request being sent - print(f"[DEBUG] Sending Audio Inference Request:") - print(f"[DEBUG] Request Payload: {rwUtils.safe_json_dumps(genConfig, indent=2)}") - - genResult = rwUtils.inferenecRequest(genConfig) - - # Debug: Print the response received - print(f"[DEBUG] Received Audio Inference Response:") - print(f"[DEBUG] Response: {rwUtils.safe_json_dumps(genResult, indent=2)}") - - print(f"[Debugging] Generation config: {rwUtils.safe_json_dumps(genConfig, indent=2)}") - except Exception as e: - # Re-raise the original error without modification - raise e - - # Extract task UUID for polling - taskUUID = genConfig[0]["taskUUID"] - - # Poll for audio completion - while True: - # Check for interrupt before each poll - comfy.model_management.throw_exception_if_processing_interrupted() - - # Poll for audio result - pollResult = rwUtils.pollVideoResult(taskUUID) - print(f"[Debugging] Poll result: {rwUtils.safe_json_dumps(pollResult, indent=2) if isinstance(pollResult, (dict, list)) else pollResult}") - - # Check for errors first - if pollResult and "errors" in pollResult and len(pollResult["errors"]) > 0: - error_info = pollResult["errors"][0] - error_message = error_info.get("message", "Unknown error") - - # Extract more detailed error info if available - if "responseContent" in error_info: - response_content = error_info["responseContent"] - # Handle both string and dict response content - if isinstance(response_content, str): - detailed_message = response_content - elif isinstance(response_content, dict): - detailed_message = response_content.get("message", str(response_content)) - else: - detailed_message = str(response_content) - - if detailed_message: - error_message = f"{error_message}\nProvider Error: {detailed_message}" - - # Include taskUUID for debugging - task_uuid = error_info.get("taskUUID", "unknown") - raise Exception(f"Audio generation failed (Task: {task_uuid}): {error_message}") - - if pollResult and "data" in pollResult and len(pollResult["data"]) > 0: - audioData = pollResult["data"][0] - - # Check status directly - if "status" in audioData: - status = audioData["status"] - - if status == "success": - audioUrls = self._extractAudioUrls(pollResult) - hasAudio = len(audioUrls) > 0 - hasVideo = bool(audioData.get("videoURL") or audioData.get("videoBase64Data", False)) - - if hasAudio: - audioObjects = [] - for audioUrl in audioUrls: - audioObjects.append(self._downloadAndProcessAudio(audioUrl, params["sampleRate"], params["outputFormat"])) - audioObj = self._mergeAudioObjects(audioObjects, params["sampleRate"]) - print(f"[DEBUG] Audio URL(s) found, returning batched audio. Count: {len(audioUrls)}") - # Return empty video object when only audio is present (prevents errors in downstream nodes) - emptyVideoObj = rwUtils.VideoObject("", width=0, height=0) - return (audioObj, emptyVideoObj) - - if hasVideo: - videos = rwUtils.convertVideoB64List(pollResult, width=None, height=None) - print(f"[DEBUG] No audio URL in response, but video is present. Returning video.") - # Extract first video object from tuple (ComfyUI expects single VideoObject, not tuple) - if len(videos) > 0: - # Return empty audio object when only video is present (prevents errors in downstream nodes) - emptyAudioObj = { - "waveform": torch.zeros((1, 1, 1)), # [batch, channels, samples] - "sample_rate": params["sampleRate"] - } - return (emptyAudioObj, videos[0]) - else: - raise Exception("No video object found in response") - - raise Exception("No audio or video data received from API") - - # If status is "processing", continue polling - - # Check for interrupt before waiting - comfy.model_management.throw_exception_if_processing_interrupted() - - # Wait before next poll (split into smaller chunks to allow more frequent interrupt checks) - for _ in range(10): # 10 x 0.1 second = 1 second total - comfy.model_management.throw_exception_if_processing_interrupted() - rwUtils.time.sleep(0.1) - - def _extractParameters(self, kwargs): - """Extract and validate parameters from kwargs""" - return { - "positivePrompt": kwargs.get("positivePrompt", ""), - "model": kwargs.get("model", ""), - "duration": kwargs.get("duration", 30), - "useDuration": kwargs.get("useDuration", True), - "sampleRate": int(kwargs.get("sampleRate", 32000)), - "useSampleRate": kwargs.get("useSampleRate", False), - "bitrate": kwargs.get("bitrate", 128), - "useBitrate": kwargs.get("useBitrate", False), - "channels": kwargs.get("channels", 2), - "useChannels": kwargs.get("useChannels", False), - "outputFormat": kwargs.get("outputFormat", "MP3"), - "negativePrompt": kwargs.get("negativePrompt", ""), - "numberResults": kwargs.get("numberResults", 1), - "seed": kwargs.get("seed", 1), - "useSeed": kwargs.get("useSeed", False), - "steps": kwargs.get("steps", 20), - "useSteps": kwargs.get("useSteps", False), - "strength": kwargs.get("strength", 0.8), - "useStrength": kwargs.get("useStrength", False), - "CFGScale": kwargs.get("CFGScale", 12.0), - "useCFGScale": kwargs.get("useCFGScale", False), - "inputs": kwargs.get("inputs", None), - "settings": kwargs.get("settings", None), - "speech": kwargs.get("speech", None), - "voiceModify": kwargs.get("voiceModify", None), - "providerSettings": kwargs.get("providerSettings", None), - } - - def _hasSections(self, providerSettings): - """Check if provider settings contain sections""" - if not providerSettings or not isinstance(providerSettings, dict): - return False - - # Provider settings is now flat (e.g., {"music": {...}}) - # Check if it has music.compositionPlan.sections - musicSettings = providerSettings.get("music", {}) - compositionPlan = musicSettings.get("compositionPlan", {}) - sections = compositionPlan.get("sections", []) - - return len(sections) > 0 - - def _buildGenConfig(self, params): - """Build the generation configuration for API request""" - taskUuid = str(uuid.uuid4()) - - genConfig = [{ - "taskType": "audioInference", - "taskUUID": taskUuid, - "model": params["model"], - "outputType": "URL", - "outputFormat": params["outputFormat"], - "deliveryMethod": "async", - "includeCost": True, - "numberResults": params["numberResults"], - }] - - # Build audioSettings conditionally based on use flags - audioSettings = {} - if params["useSampleRate"]: - audioSettings["sampleRate"] = int(params["sampleRate"]) - if params["useBitrate"]: - _br = int(params["bitrate"]) - _allowed_bitrates = (8, 16, 32, 64, 128, 256) - audioSettings["bitrate"] = _br if _br in _allowed_bitrates else min(_allowed_bitrates, key=lambda x: abs(x - _br)) - if params["useChannels"]: - audioSettings["channels"] = params["channels"] - - # Only add audioSettings if at least one setting is enabled - if audioSettings: - genConfig[0]["audioSettings"] = audioSettings - - # Handle sections - disable duration if sections are provided - hasSections = self._hasSections(params["providerSettings"]) - if hasSections: - params["useDuration"] = False - print(f"[DEBUG] Disabled duration because sections are provided") - - # Add positivePrompt only when non-empty - if len(params["positivePrompt"]) > 0: - genConfig[0]["positivePrompt"] = params["positivePrompt"] - print(f"[DEBUG] Added positivePrompt: '{params['positivePrompt']}'") - else: - print(f"[DEBUG] Skipped positivePrompt") - - if params["useDuration"]: - genConfig[0]["duration"] = params["duration"] - print(f"[DEBUG] Added duration: {params['duration']}") - else: - print(f"[DEBUG] Skipped duration") - - # Add seed parameter only if enabled - if params["useSeed"]: - genConfig[0]["seed"] = params["seed"] - - # Add steps parameter only if enabled - if params["useSteps"]: - genConfig[0]["steps"] = params["steps"] - - # Add strength parameter only if enabled - if params["useStrength"]: - genConfig[0]["strength"] = params["strength"] - - # Add CFGScale parameter only if enabled - if params["useCFGScale"]: - genConfig[0]["CFGScale"] = params["CFGScale"] - - # Add optional parameters - if params["negativePrompt"]: - genConfig[0]["negativePrompt"] = params["negativePrompt"] - - # Handle audio settings (lyrics, guidance_type) - if params["settings"] is not None and isinstance(params["settings"], dict) and len(params["settings"]) > 0: - genConfig[0]["settings"] = params["settings"] - print(f"[DEBUG] Audio settings merged: {rwUtils.sanitize_for_logging(params['settings'])}") - - # Handle speech (from Runware Audio Inference Speech node) - if params["speech"] is not None and isinstance(params["speech"], dict) and len(params["speech"]) > 0: - genConfig[0]["speech"] = params["speech"] - print(f"[DEBUG] Speech merged: {rwUtils.sanitize_for_logging(params['speech'])}") - - # Handle voiceModify (from Runware Audio Inference Settings Voice Modify node) -> settings.voiceModify - if params["voiceModify"] is not None and isinstance(params["voiceModify"], dict) and len(params["voiceModify"]) > 0: - if "settings" not in genConfig[0]: - genConfig[0]["settings"] = {} - vm = dict(params["voiceModify"]) - - genConfig[0]["settings"]["voiceModify"] = vm - print(f"[DEBUG] Voice modify merged: {rwUtils.sanitize_for_logging(vm)}") - - # Handle inputs - merge custom inputs from Audio Inference Inputs node - if params["inputs"] is not None: - # Merge inputs from audio inference inputs node - if "inputs" not in genConfig[0]: - genConfig[0]["inputs"] = {} - - # Merge each input from inputs - for key, value in params["inputs"].items(): - genConfig[0]["inputs"][key] = value - - print(f"[DEBUG] Audio inference inputs merged: {rwUtils.sanitize_for_logging(params['inputs'])}") - print(f"[DEBUG] Final genConfig inputs: {rwUtils.sanitize_for_logging(genConfig[0].get('inputs', {}))}") - - # Handle providerSettings - extract provider name from model and wrap with provider name (same pattern as video inference) - if params["providerSettings"] is not None: - # Extract provider name from model (e.g., "klingai:8@1" -> "klingai", "elevenlabs:1@1" -> "elevenlabs") - provider_name = params["model"].split(":")[0] if ":" in params["model"] else params["model"] - - # If providerSettings is a dictionary, create the correct API format - if isinstance(params["providerSettings"], dict): - # Create the providerSettings object with provider name as key - final_provider_settings = { - provider_name: params["providerSettings"] - } - genConfig[0]["providerSettings"] = final_provider_settings - print(f"[DEBUG] Provider settings wrapped with provider name: {rwUtils.sanitize_for_logging(final_provider_settings)}") - else: - # If it's just a string, use it directly - genConfig[0]["providerSettings"] = params["providerSettings"] - - print(f"[DEBUG] Sending Audio Inference Request:") - print(f"[DEBUG] Request Payload: {rwUtils.safe_json_dumps(genConfig, indent=2)}") - - return genConfig - - def _logResponse(self, genResult): - """Log the API response for debugging""" - print(f"[DEBUG] Received Audio Inference Response:") - print(f"[DEBUG] Response: {rwUtils.safe_json_dumps(genResult, indent=2)}") - - def _validateResponse(self, genResult): - """Validate API response and raise errors if needed""" - if "errors" in genResult: - errorMessage = genResult["errors"][0]["message"] - raise Exception(f"Audio generation failed: {errorMessage}") - - if "data" not in genResult or len(genResult["data"]) == 0: - raise Exception("No data received from API") - - - audioData = genResult["data"][0] - hasAudio = bool(audioData.get("audioURL") or audioData.get("audioDataURI") or audioData.get("audioBase64Data")) - hasVideo = bool(audioData.get("videoURL") or audioData.get("videoBase64Data") or audioData.get("videoUUID")) - - if not hasAudio and not hasVideo: - raise Exception("No audio or video data received from API") - - def _extractAudioUrls(self, genResult): - """Extract all available audio URLs from API response.""" - audioUrls = [] - for item in genResult.get("data", []): - audioUrl = item.get("audioURL", "") or item.get("audioDataURI", "") or item.get("audioBase64Data", "") - if audioUrl: - audioUrls.append(audioUrl) - return audioUrls - - def _mergeAudioObjects(self, audioObjects, targetSampleRate): - """Merge multiple audio objects into a single batched audio object.""" - if not audioObjects: - return { - "waveform": torch.zeros((1, 1, 1)), - "sample_rate": targetSampleRate, - "format": "wav" - } - - waveforms = [] - maxChannels = 0 - maxSamples = 0 - - for audioObj in audioObjects: - waveform = audioObj["waveform"] - if waveform.dim() == 2: - waveform = waveform.unsqueeze(0) - waveforms.append(waveform) - maxChannels = max(maxChannels, waveform.shape[1]) - maxSamples = max(maxSamples, waveform.shape[2]) - - paddedWaveforms = [] - for waveform in waveforms: - batchSize, channels, samples = waveform.shape - - if channels < maxChannels: - channelPadding = torch.zeros( - (batchSize, maxChannels - channels, samples), - dtype=waveform.dtype, - device=waveform.device - ) - waveform = torch.cat([waveform, channelPadding], dim=1) - - if samples < maxSamples: - waveform = torch.nn.functional.pad(waveform, (0, maxSamples - samples)) - - paddedWaveforms.append(waveform) - - outputFormat = audioObjects[0].get("format", "wav") - return { - "waveform": torch.cat(paddedWaveforms, dim=0), - "sample_rate": targetSampleRate, - "format": outputFormat - } - - def _downloadAndProcessAudio(self, audioUrl, targetSampleRate, outputFormat): - """Download audio file and process it for ComfyUI""" - try: - response = requests.get(audioUrl, timeout=30) - response.raise_for_status() - - tempSuffix = self._inferAudioSuffix(audioUrl, outputFormat) - with tempfile.NamedTemporaryFile(suffix=tempSuffix, delete=False) as tempFile: - tempFile.write(response.content) - tempFilePath = tempFile.name - - try: - waveformNp, originalSampleRate = self._loadAudioFile(tempFilePath) - waveformNp = self._resampleAudio(waveformNp, originalSampleRate, targetSampleRate) - waveformTensor = self._convertToTensor(waveformNp) - - return { - "waveform": waveformTensor, - "sample_rate": targetSampleRate, - "format": tempSuffix.lstrip(".") - } - finally: - if os.path.exists(tempFilePath): - os.unlink(tempFilePath) - except Exception as e: - raise Exception(f"Failed to download audio: {e}") - - def _inferAudioSuffix(self, audioUrl, outputFormat): - """Infer temporary audio file extension from URL or requested format.""" - parsedPath = urlparse(audioUrl).path if audioUrl else "" - ext = os.path.splitext(parsedPath)[1].lower() - allowed = {".mp3", ".mp4", ".wav", ".flac", ".ogg"} - if ext in allowed: - return ext - - formatMap = { - "MP3": ".mp3", - "MP4": ".mp4", - "WAV": ".wav", - "FLAC": ".flac", - "OGG": ".ogg", - } - return formatMap.get(str(outputFormat).upper(), ".wav") - - def _loadAudioFile(self, filePath): - """Load audio file using librosa""" - waveformNp, originalSampleRate = librosa.load(filePath, sr=None, mono=False) - - # Convert to [samples, channels] format - if waveformNp.ndim == 1: - waveformNp = waveformNp.reshape(-1, 1) - else: - waveformNp = waveformNp.T # [channels, samples] -> [samples, channels] - - return waveformNp, originalSampleRate - - def _resampleAudio(self, waveformNp, originalSampleRate, targetSampleRate): - """Resample audio to target sample rate""" - if originalSampleRate == targetSampleRate: - return waveformNp - - if waveformNp.ndim == 1: - return librosa.resample(waveformNp, orig_sr=originalSampleRate, target_sr=targetSampleRate) - else: - # Multi-channel: resample each channel - return librosa.resample(waveformNp.T, orig_sr=originalSampleRate, target_sr=targetSampleRate).T - - def _convertToTensor(self, waveformNp): - """Convert numpy array to PyTorch tensor with correct format""" - # Ensure 2D shape [samples, channels] - if waveformNp.ndim == 1: - waveformNp = waveformNp.reshape(-1, 1) - - # Convert to [channels, samples] for ComfyUI - waveformTensor = torch.from_numpy(waveformNp.T).float() - - # Add batch dimension if needed: [batch, channels, samples] - if waveformTensor.dim() == 2: - waveformTensor = waveformTensor.unsqueeze(0) - - return waveformTensor diff --git a/modules/audioInferenceInputs.py b/modules/audioInferenceInputs.py deleted file mode 100644 index 4814231..0000000 --- a/modules/audioInferenceInputs.py +++ /dev/null @@ -1,171 +0,0 @@ -from .utils import runwareUtils as rwUtils -from typing import Dict, Any - - -class audioInferenceInputs: - """Audio Inference Inputs node for configuring audio generation inputs""" - - MAX_VIDEOS = 4 - MAX_AUDIOS = 4 - MAX_REFERENCE_IMAGES = 4 - MAX_REFERENCE_AUDIOS = 4 - - @classmethod - def INPUT_TYPES(cls): - optionalInputs = { - "useAudio": ("BOOLEAN", { - "tooltip": "Enable to include single audio input in API request.", - "default": False, - }), - "Audio": ("STRING", { - "tooltip": "Audio URL or mediaUUID for audio generation. Can be a direct URL or a mediaUUID from Runware Media Upload node. Only used when 'Use Audio' is enabled.", - "default": "", - }), - "useVideo": ("BOOLEAN", { - "tooltip": "Enable to include single video input in API request.", - "default": False, - }), - "Video": ("STRING", { - "tooltip": "Video URL or mediaUUID for audio generation. Can be a direct URL or a mediaUUID from Runware Media Upload node. Only used when 'Use Video' is enabled.", - "default": "", - }), - "useVideos": ("BOOLEAN", { - "tooltip": "Enable to include multiple videos input in API request.", - "default": False, - }), - } - - # Add Video1, Video2, Video3, Video4 inputs - for i in range(1, cls.MAX_VIDEOS + 1): - ordinal = rwUtils.getOrdinal(i) - optionalInputs[f"Video{i}"] = ("STRING", { - "tooltip": f"Video URL or mediaUUID for the {ordinal} video. Only used when 'Use Videos' is enabled.", - "default": "", - }) - - # Multiple audios last so the UI groups useAudios with Audio1…Audio4 (ComfyUI order = dict insertion order) - optionalInputs["useAudios"] = ("BOOLEAN", { - "tooltip": "Enable to include multiple audio inputs in API request (inputs.audios array).", - "default": False, - }) - for i in range(1, cls.MAX_AUDIOS + 1): - ordinal = rwUtils.getOrdinal(i) - optionalInputs[f"Audio{i}"] = ("STRING", { - "tooltip": f"Audio URL or mediaUUID for the {ordinal} audio. Only used when 'Use Audios' is enabled.", - "default": "", - }) - - for i in range(1, cls.MAX_REFERENCE_IMAGES + 1): - ordinal = rwUtils.getOrdinal(i) - optionalInputs[f"Reference Image {i}"] = ("IMAGE", { - "tooltip": f"Optional {ordinal} reference image for audio inference (inputs.referenceImages).", - }) - - optionalInputs["useReferenceAudios"] = ("BOOLEAN", { - "tooltip": "Enable to include reference audios in API request (inputs.referenceAudios array).", - "default": False, - }) - for i in range(1, cls.MAX_REFERENCE_AUDIOS + 1): - ordinal = rwUtils.getOrdinal(i) - optionalInputs[f"Reference Audio {i}"] = ("STRING", { - "tooltip": f"Audio URL or mediaUUID for the {ordinal} reference audio (inputs.referenceAudios).", - "default": "", - }) - - optionalInputs["Reference Voice"] = ("RUNWAREAUDIOINFERENCEREFERENCEVOICES", { - "tooltip": "Connect Runware Audio Inference Inputs Reference Audio for zero-shot voice cloning (inputs.referenceVoices).", - }) - - return { - "required": {}, - "optional": optionalInputs - } - - DESCRIPTION = ( - "Configure custom inputs for Runware Audio Inference, including optional single or multiple audio URL/mediaUUID " - "(inputs.audio or inputs.audios), reference voice for cloning (inputs.referenceVoices), " - "single or multiple video inputs for audio extraction or generation, up to 4 reference images " - "(inputs.referenceImages), and up to 4 reference audios (inputs.referenceAudios)." - ) - FUNCTION = "createInputs" - RETURN_TYPES = ("RUNWAREAUDIOINFERENCEINPUTS",) - RETURN_NAMES = ("Audio Inference Inputs",) - CATEGORY = "Runware" - - def createInputs(self, **kwargs) -> tuple[Dict[str, Any]]: - """Create audio inference inputs from provided parameters""" - useAudio = kwargs.get("useAudio", False) - audio = kwargs.get("Audio", None) - useAudios = kwargs.get("useAudios", False) - useVideo = kwargs.get("useVideo", False) - video = kwargs.get("Video", None) - useVideos = kwargs.get("useVideos", False) - useReferenceAudios = kwargs.get("useReferenceAudios", False) - referenceVoices = kwargs.get("Reference Voice", None) - - inputs = {} - - # Handle single audio (inputs.audio) - if useAudio and audio is not None and audio.strip() != "": - inputs["audio"] = audio.strip() - - # Handle multiple audios (inputs.audios as array) - if useAudios: - audioList = [] - for i in range(1, self.MAX_AUDIOS + 1): - audioKey = f"Audio{i}" - audioUrl = kwargs.get(audioKey) - if audioUrl and audioUrl.strip() != "": - audioList.append(audioUrl.strip()) - - if len(audioList) > 0: - inputs["audios"] = audioList - - # Handle single video (inputs.video) - if useVideo and video is not None and video.strip() != "": - inputs["video"] = video.strip() - - # Handle multiple videos (inputs.videos as array) - if useVideos: - videoList = [] - for i in range(1, self.MAX_VIDEOS + 1): - videoKey = f"Video{i}" - videoUrl = kwargs.get(videoKey) - if videoUrl and videoUrl.strip() != "": - videoList.append(videoUrl.strip()) - - if len(videoList) > 0: - inputs["videos"] = videoList - - referenceImages = [] - for i in range(1, self.MAX_REFERENCE_IMAGES + 1): - image = kwargs.get(f"Reference Image {i}", None) - if image is not None: - referenceImages.append(rwUtils.convertTensor2IMG(image)) - if len(referenceImages) > 0: - inputs["referenceImages"] = referenceImages - - if useReferenceAudios: - referenceAudios = [] - for i in range(1, self.MAX_REFERENCE_AUDIOS + 1): - audioUrl = kwargs.get(f"Reference Audio {i}", None) - if audioUrl and isinstance(audioUrl, str) and audioUrl.strip() != "": - referenceAudios.append(audioUrl.strip()) - if len(referenceAudios) > 0: - inputs["referenceAudios"] = referenceAudios - - if referenceVoices is not None and isinstance(referenceVoices, list) and len(referenceVoices) > 0: - inputs["referenceVoices"] = referenceVoices - - return (inputs,) - - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareAudioInferenceInputs": audioInferenceInputs, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareAudioInferenceInputs": "Runware Audio Inference Inputs", -} - diff --git a/modules/audioInferenceReferenceVoices.py b/modules/audioInferenceReferenceVoices.py deleted file mode 100644 index 37f521d..0000000 --- a/modules/audioInferenceReferenceVoices.py +++ /dev/null @@ -1,74 +0,0 @@ -""" -Runware Audio Inference Inputs Reference Audio node. -Builds inputs.referenceVoices for zero-shot voice cloning (up to 4 entries). -""" - -from typing import Any, Dict, List - -from .utils import runwareUtils as rwUtils - - -class RunwareAudioInferenceReferenceVoices: - """Build inputs.referenceVoices[] for Fish Audio and other TTS models.""" - - MAX_REFERENCE_VOICES = 4 - - @classmethod - def INPUT_TYPES(cls): - optional_inputs = {} - for i in range(1, cls.MAX_REFERENCE_VOICES + 1): - ordinal = rwUtils.getOrdinal(i) - optional_inputs[f"useReferenceVoice{i}"] = ("BOOLEAN", { - "default": False, - "tooltip": f"Enable to include the {ordinal} reference voice in inputs.referenceVoices.", - }) - optional_inputs[f"audio{i}"] = ("STRING", { - "default": "", - "tooltip": f"Reference audio clip ({ordinal}) as media UUID, URL, or base64. Required when enabled.", - }) - optional_inputs[f"text{i}"] = ("STRING", { - "multiline": True, - "default": "", - "tooltip": f"Transcript of the {ordinal} reference audio clip (1–1000 characters). Required when enabled.", - }) - - return { - "required": {}, - "optional": optional_inputs, - } - - RETURN_TYPES = ("RUNWAREAUDIOINFERENCEREFERENCEVOICES",) - RETURN_NAMES = ("referenceVoices",) - FUNCTION = "createReferenceVoices" - CATEGORY = "Runware/Audio" - DESCRIPTION = ( - "Configure inputs.referenceVoices for zero-shot voice cloning (up to 4 entries). " - "Each entry: { \"audio\": \"\", \"text\": \"\" }. " - "Connect to Runware Audio Inference Inputs." - ) - - def createReferenceVoices(self, **kwargs) -> tuple[List[Dict[str, Any]]]: - reference_voices: List[Dict[str, Any]] = [] - - for i in range(1, self.MAX_REFERENCE_VOICES + 1): - if not kwargs.get(f"useReferenceVoice{i}", False): - continue - - audio = (kwargs.get(f"audio{i}") or "").strip() - text = (kwargs.get(f"text{i}") or "").strip() - - if not audio or not text: - continue - - reference_voices.append({"audio": audio, "text": text}) - - return (reference_voices,) - - -NODE_CLASS_MAPPINGS = { - "RunwareAudioInferenceReferenceVoices": RunwareAudioInferenceReferenceVoices, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareAudioInferenceReferenceVoices": "Runware Audio Inference Inputs Reference Audio", -} diff --git a/modules/audioInferenceSpeech.py b/modules/audioInferenceSpeech.py deleted file mode 100644 index c3f901f..0000000 --- a/modules/audioInferenceSpeech.py +++ /dev/null @@ -1,145 +0,0 @@ -""" -Runware Audio Inference Speech node: builds the speech payload for Runware Audio Inference. -Connect its output to the "speech" input of Runware Audio Inference for speech synthesis (e.g. Minimax). -""" - -from typing import Dict, Any - - -class RunwareAudioInferenceSpeech: - """Builds speech payload (text, voice, speed, volume, pitch?, emotion?, tone?) for Runware Audio Inference.""" - - EMOTIONS = [ - "happy", "sad", "angry", "fearful", "disgusted", "surprised", - "calm", "fluent", "whisper", - ] - - def __init__(self): - pass - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "text": ("STRING", { - "multiline": True, - "default": "", - "tooltip": "Text to synthesize as speech (speech.text). Optional when positivePrompt on Runware Audio Inference carries the script (e.g. Seed Audio).", - }), - }, - "optional": { - "useVoice": ("BOOLEAN", { - "default": False, - "tooltip": "Enable to include voice in speech synthesis (speech.voice).", - }), - "voice": ("STRING", { - "default": "", - "tooltip": "Voice identifier.", - }), - "useSpeed": ("BOOLEAN", {"default": False, "tooltip": "Include speed (speech.speed)"}), - "speed": ("FLOAT", { - "default": 0.0, - "min": 0.0, - "max": 2.0, - "step": 0.01, - "tooltip": "Speech rate adjustment (speech.speed). 0 = no change for Seed Audio.", - }), - "useVolume": ("BOOLEAN", {"default": False, "tooltip": "Include volume (speech.volume)"}), - "volume": ("FLOAT", { - "default": 0.0, - "min": 0.0, - "max": 10.0, - "step": 0.1, - "tooltip": "Volume adjustment (speech.volume). 0 = no change.", - }), - "usePitch": ("BOOLEAN", {"default": False, "tooltip": "Include pitch (speech.pitch)"}), - "pitch": ("FLOAT", { - "default": 0.0, - "min": -12.0, - "max": 12.0, - "step": 0.1, - "tooltip": "Pitch multiplier -12 to 12 (speech.pitch)", - }), - "useEmotion": ("BOOLEAN", {"default": False, "tooltip": "Include emotion (not available for speech.turbo)"}), - "emotion": (cls.EMOTIONS, {"default": "calm", "tooltip": "Emotion for speech (speech.emotion)"}), - "useTone": ("BOOLEAN", {"default": False, "tooltip": "Include pronunciation dictionary (speech.tone)"}), - "tone": ("STRING", { - "multiline": True, - "default": "", - "placeholder": "omg/oh my god\nother/other expansion", - "tooltip": "Pronunciation dictionary, one mapping per line (e.g. omg/oh my god)", - }), - "useLanguage": ("BOOLEAN", { - "default": False, - "tooltip": "Enable to include language (speech.language).", - }), - "language": ("STRING", { - "default": "Auto", - "tooltip": "Language of the input text (for example: en-US). Applies to all variants. Only used when 'Use Language' is enabled.", - }), - "voices": ("RUNWAREAUDIOINFERENCESPEECHVOICES", { - "tooltip": "Optional multi-speaker voices array (speech.voices[]). If provided, it takes precedence over speech.voice.", - }), - } - } - - RETURN_TYPES = ("RUNWARESPEECH",) - RETURN_NAMES = ("speech",) - FUNCTION = "createSpeech" - CATEGORY = "Runware/Audio" - DESCRIPTION = ( - "Build speech parameters for Runware Audio Inference (text, voice, speed, volume, pitch, emotion, tone, language, etc.). " - "Connect output to the 'speech' input of Runware Audio Inference." - ) - - def createSpeech(self, **kwargs) -> tuple: - """Build the speech object for the API (connect to Runware Audio Inference 'speech' input).""" - text = (kwargs.get("text") or "").strip() - voice = (kwargs.get("voice") or "").strip() - use_voice = kwargs.get("useVoice", False) - use_speed = kwargs.get("useSpeed", False) - speed = float(kwargs.get("speed", 0.0)) - use_volume = kwargs.get("useVolume", False) - volume = float(kwargs.get("volume", 0.0)) - use_pitch = kwargs.get("usePitch", False) - pitch = float(kwargs.get("pitch", 0.0)) - use_emotion = kwargs.get("useEmotion", False) - emotion = kwargs.get("emotion", "calm") - use_tone = kwargs.get("useTone", False) - tone_str = kwargs.get("tone", "") or "" - use_language = kwargs.get("useLanguage", False) - language = (kwargs.get("language") or "Auto").strip() - voices = kwargs.get("voices") - - speech: Dict[str, Any] = {} - if text: - speech["text"] = text - if isinstance(voices, list) and len(voices) > 0: - speech["voices"] = voices - elif use_voice and voice: - speech["voice"] = voice - if use_speed: - speech["speed"] = speed - if use_volume: - speech["volume"] = volume - if use_pitch: - speech["pitch"] = pitch - if use_emotion: - speech["emotion"] = emotion - if use_tone and tone_str.strip(): - tone_lines = [s.strip() for s in tone_str.replace(",", "\n").split("\n") if s.strip()] - if tone_lines: - speech["tone"] = tone_lines - if use_language: - speech["language"] = language - - return (speech,) - - -NODE_CLASS_MAPPINGS = { - "RunwareAudioInferenceSpeech": RunwareAudioInferenceSpeech, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareAudioInferenceSpeech": "Runware Audio Inference Speech", -} diff --git a/modules/audioInferenceSpeechVoices.py b/modules/audioInferenceSpeechVoices.py deleted file mode 100644 index c7f7008..0000000 --- a/modules/audioInferenceSpeechVoices.py +++ /dev/null @@ -1,86 +0,0 @@ -""" -Runware Audio Inference Speech Voices node: -Builds speech.voices[] for multi-speaker audio inference speech payloads. -""" - -import re - - -class RunwareAudioInferenceSpeechVoices: - """Build speech.voices[] list for Runware Audio Inference.""" - - MAX_VOICES = 4 - _SPEAKER_ALIAS_PATTERN = re.compile(r"^[A-Za-z0-9]+$") - - @classmethod - def INPUT_TYPES(cls): - optional_inputs = {} - for i in range(1, cls.MAX_VOICES + 1): - optional_inputs[f"useVoice{i}"] = ("BOOLEAN", { - "default": False, - "tooltip": f"Enable to include speaker/voice pair #{i} in speech.voices.", - }) - optional_inputs[f"speaker{i}"] = ("STRING", { - "default": f"Speaker{i}", - "tooltip": "Unique alphanumeric speaker alias (speech.voices[].speaker).", - }) - optional_inputs[f"voice{i}"] = ("STRING", { - "default": "", - "tooltip": "Voice name for this speaker (speech.voices[].voice).", - }) - - return { - "required": {}, - "optional": optional_inputs, - } - - RETURN_TYPES = ("RUNWAREAUDIOINFERENCESPEECHVOICES",) - RETURN_NAMES = ("voices",) - FUNCTION = "createVoices" - CATEGORY = "Runware/Audio" - DESCRIPTION = ( - "Build speech.voices[] for multi-speaker synthesis. " - "Each item contains speaker (unique alphanumeric alias) and voice name." - ) - - def createVoices(self, **kwargs) -> tuple[list[dict[str, str]],]: - voices: list[dict[str, str]] = [] - seen_speakers = set() - - for i in range(1, self.MAX_VOICES + 1): - use_voice = bool(kwargs.get(f"useVoice{i}", False)) - if not use_voice: - continue - - speaker = (kwargs.get(f"speaker{i}") or "").strip() - voice = (kwargs.get(f"voice{i}") or "").strip() - - if not speaker or not voice: - raise Exception( - f"Voice #{i} is enabled, but speaker{i} and voice{i} must both be provided." - ) - if not self._SPEAKER_ALIAS_PATTERN.match(speaker): - raise Exception( - f"speaker{i} must be alphanumeric only (got: '{speaker}')." - ) - if speaker in seen_speakers: - raise Exception( - f"Duplicate speaker alias '{speaker}'. Each speaker must be unique." - ) - - seen_speakers.add(speaker) - voices.append({ - "speaker": speaker, - "voice": voice, - }) - - return (voices,) - - -NODE_CLASS_MAPPINGS = { - "RunwareAudioInferenceSpeechVoices": RunwareAudioInferenceSpeechVoices, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareAudioInferenceSpeechVoices": "Runware Audio Inference Speech Voices", -} diff --git a/modules/audioInput.py b/modules/audioInput.py deleted file mode 100644 index ca43ecd..0000000 --- a/modules/audioInput.py +++ /dev/null @@ -1,68 +0,0 @@ -""" -Runware Audio Input Node -Creates an audio input configuration with id and source -""" - -from typing import Dict, Any - - -class RunwareAudioInput: - """Runware Audio Input Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "source": ("STRING", { - "tooltip": "URL, base64, data URI, or UUID for the audio file. Audio formats: WAV, MP3, OGG, M4A, M3A, AAC, WMA, FLAC, MP4. Recommended: WAV/MP3 at 44.1kHz or 48kHz sampling rate.", - "default": "", - }), - }, - "optional": { - "useId": ("BOOLEAN", { - "tooltip": "Enable to include reference ID for mapping audio input. Required when using segments array.", - "default": False, - }), - "id": ("STRING", { - "tooltip": "Reference ID used to map audio input. Required when using segments array.", - "default": "", - }), - } - } - - RETURN_TYPES = ("RUNWAREAUDIOINPUT",) - RETURN_NAMES = ("Audio Input",) - FUNCTION = "createAudioInput" - CATEGORY = "Runware" - DESCRIPTION = "Create an audio input configuration with reference ID and source for video generation." - - def createAudioInput(self, **kwargs) -> tuple[Dict[str, Any]]: - """Create audio input configuration""" - - useId = kwargs.get("useId", False) - audio_id = kwargs.get("id", "").strip() - source = kwargs.get("source", "").strip() - - if not source: - return ({},) - - audioInput: Dict[str, Any] = { - "source": source, - } - - # Only include id if useId is enabled and id is provided - if useId and audio_id: - audioInput["id"] = audio_id - - return (audioInput,) - - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareAudioInput": RunwareAudioInput, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareAudioInput": "Runware Video Audio Input", -} - diff --git a/modules/audioModelSearch.py b/modules/audioModelSearch.py deleted file mode 100644 index 512bb36..0000000 --- a/modules/audioModelSearch.py +++ /dev/null @@ -1,130 +0,0 @@ -class RunwareAudioModelSearch: - """Audio Model Search node for searching audio models""" - - # Define the audio models by provider - AUDIO_MODELS = { - "ElevenLabs": [ - "elevenlabs:1@1 (ElevenLabs Multilingual v2)", - "elevenlabs:2@1 (ElevenLabs Multilingual v2 Turbo)", - "elevenlabs:3@1 (ElevenLabs Monolingual v1)", - ], - "KlingAI": [ - "klingai:8@1 (KlingAI Audio)", - ], - "Mirelo": [ - "mirelo:1@1 (Mirelo SFX 1.5)", - ], - "Ace": [ - "runware:ace-step@0 (ACE Step v1 3.5B)", - "runware:ace-step@v1.5-base (ACE-Step v1.5 Base)", - "runware:ace-step@v1.5-turbo (ACE-Step v1.5 Turbo)", - "runware:ace-step@v1.5-xl-base (ACE-Step v1.5 XL Base)", - "runware:ace-step@v1.5-xl-turbo (ACE-Step v1.5 XL Turbo)", - "runware:ace-step@v1.5-xl-sft (ACE-Step v1.5 XL SFT)", - ], - "Alibaba": [ - "alibaba:qwen@3-tts-1.7b-voicedesign (Qwen3 TTS 1.7B Voice Design)", - "alibaba:qwen@3-tts-1.7b-customvoice (Qwen3 TTS 1.7B Custom Voice)", - "alibaba:qwen@3-tts-1.7b-base (Qwen3 TTS 1.7B Base)", - ], - "Bytedance": [ - "bytedance:seed-audio@1.0 (Seed Audio 1.0)", - ], - "Dia": [ - "runware:dia@v1.0 (Dia 1.6B)", - "runware:dia2@2b (Dia2 2B)", - ], - "xAI": [ - "xai:voice@tts (xAI TTS)", - ], - "MiniMax": [ - "minimax:speech@2.8 (MiniMax Speech 2.8)", - "minimax:music@cover (MiniMax Music Cover)", - "minimax:music@2.6 (MiniMax Music 2.6)", - ], - "Inworld": [ - "inworld:tts@2 (Inworld Realtime TTS 2)", - "inworld:tts@1.5-mini (Inworld TTS-1.5 Mini)", - "inworld:tts@1.5-max (Inworld TTS-1.5 Max)", - ], - "Google": [ - "google:gemini@3.1-flash-tts (Gemini 3.1 Flash TTS)", - ], - "Fish": [ - "fishaudio:s2.1@pro (Fish Audio S2.1 Pro)", - ], - } - - MODEL_PROVIDERS = [ - "All", - "ElevenLabs", - "KlingAI", - "Mirelo", - "Ace", - "Alibaba", - "Bytedance", - "Dia", - "xAI", - "MiniMax", - "Inworld", - "Google", - "Fish", - ] - - @classmethod - def INPUT_TYPES(cls): - allModels = cls._getAllModels() - defaultModel = "elevenlabs:1@1 (ElevenLabs Multilingual v2)" - - return { - "required": { - "Model Search": ("STRING", { - "tooltip": "Search For Specific Audio Model By Name Or Code (eg: elevenlabs, klingai).", - }), - "Model Provider": (cls.MODEL_PROVIDERS, { - "tooltip": "Choose Audio Model Provider To Filter Results.", - "default": "ElevenLabs", - }), - "AudioList": (allModels, { - "tooltip": "Audio Model Results Will Show UP Here So You Could Choose From.", - "default": defaultModel, - }), - "Use Search Value": ("BOOLEAN", { - "tooltip": "When Enabled, the value you've set in the search input will be used instead.\n\nThis is useful in case the model search API is down or you prefer to set the model manually.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - } - } - - @classmethod - def _getAllModels(cls): - """Get all models from all providers""" - allModels = [] - for models in cls.AUDIO_MODELS.values(): - allModels.extend(models) - return allModels - - RETURN_TYPES = ("RUNWAREAUDIOMODEL",) - RETURN_NAMES = ("model",) - FUNCTION = "searchModels" - CATEGORY = "Runware" - DESCRIPTION = "Directly Search and Connect Audio Models to Runware Audio Inference Nodes In ComfyUI." - - @classmethod - def VALIDATE_INPUTS(cls, AudioList): - return True - - def searchModels(self, **kwargs): - """Search and return audio model""" - enableSearchValue = kwargs.get("Use Search Value", False) - searchInput = kwargs.get("Model Search") - - if enableSearchValue: - modelAirCode = searchInput - else: - currentModel = kwargs.get("AudioList") - modelAirCode = currentModel.split(" (")[0] - - return (modelAirCode,) diff --git a/modules/audioSections.py b/modules/audioSections.py deleted file mode 100644 index 4e9911c..0000000 --- a/modules/audioSections.py +++ /dev/null @@ -1,66 +0,0 @@ -class RunwareAudioSections: - """Audio Sections node for creating audio composition sections""" - - def __init__(self): - pass - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "sectionName": ("STRING", { - "default": "intro", - "tooltip": "Name of the section" - }), - "positiveLocalStyles": ("STRING", { - "default": "guitar, buildup", - "tooltip": "Styles that should be present in this section (comma-separated)" - }), - "negativeLocalStyles": ("STRING", { - "default": "vocals", - "tooltip": "Styles that should not be present in this section (comma-separated)" - }), - "duration": ("INT", { - "default": 15, - "min": 3, - "max": 120, - "tooltip": "Duration of the section in seconds (3-120)" - }), - "lines": ("STRING", { - "multiline": True, - "default": "", - "tooltip": "Lyrics for the section (one line per line)" - }), - } - } - - RETURN_TYPES = ("RUNWAREAUDIOSECTIONS",) - RETURN_NAMES = ("sections",) - FUNCTION = "createSections" - CATEGORY = "Runware/Audio" - - def createSections(self, **kwargs): - """Create audio section object from provided parameters""" - sectionName = kwargs.get("sectionName", "") - positiveLocalStyles = kwargs.get("positiveLocalStyles", "") - negativeLocalStyles = kwargs.get("negativeLocalStyles", "") - duration = kwargs.get("duration", 0) - lines = kwargs.get("lines", "") - - section = { - "sectionName": sectionName, - "positiveLocalStyles": self._parseCommaSeparated(positiveLocalStyles), - "negativeLocalStyles": self._parseCommaSeparated(negativeLocalStyles), - "duration": duration, - "lines": self._parseLines(lines) - } - - return (section,) - - def _parseCommaSeparated(self, text): - """Parse comma-separated string into list""" - return [item.strip() for item in text.split(",") if item.strip()] - - def _parseLines(self, text): - """Parse multiline text into list""" - return [line.strip() for line in text.split("\n") if line.strip()] diff --git a/modules/audioSettings.py b/modules/audioSettings.py deleted file mode 100644 index fe302d6..0000000 --- a/modules/audioSettings.py +++ /dev/null @@ -1,552 +0,0 @@ -""" -Runware Audio Inference Settings Node -Provides lyrics, lyricsOptimizer, instrumental, guidanceType, languageBoost, turbo, temperature, textNormalization, -bpm, keyScale, timeSignature, vocalLanguage, coverConditioningScale, repaintingStart, repaintingEnd, -cfgIntervalStart, cfgIntervalEnd, xVectorOnly, maxNewTokens, maxTokens, transcript, -normalizeLoudness, topP, chunkLength, minChunkLength, normalize, latency, repetitionPenalty, -conditionOnPreviousChunks, earlyStopThreshold, and more for Runware Audio Inference. -""" - -from typing import Dict, Any - -_VOCAL_LANGUAGE_CODES = [ - "ar", "az", "bg", "bn", "ca", "cs", "da", "de", "el", "en", "es", "fa", "fi", "fr", - "he", "hi", "hr", "ht", "hu", "id", "is", "it", "ja", "ko", "la", "lt", "ms", "ne", - "nl", "no", "pa", "pl", "pt", "ro", "ru", "sa", "sk", "sr", "sv", "sw", "ta", "te", - "th", "tl", "tr", "uk", "ur", "vi", "yue", "zh", "unknown", -] - - -class RunwareAudioSettings: - """Runware Audio Inference Settings Node.""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useTemperature": ("BOOLEAN", { - "tooltip": "Enable to include temperature in audio generation settings", - "default": False, - }), - "temperature": ("FLOAT", { - "tooltip": "Sampling temperature for text token generation. Lower values produce more coherent, predictable speech content. Higher values increase variety but risk artifacts. Set 0 for greedy decoding. Only used when 'Use Temperature' is enabled.", - "default": 0.6, - "min": 0.0, - "max": 5.0, - "step": 0.1, - }), - "useAudioTemperature": ("BOOLEAN", { - "tooltip": "Enable to include audioTemperature in audio generation settings", - "default": False, - }), - "audioTemperature": ("FLOAT", { - "tooltip": "Sampling temperature for audio token generation. Lower values produce cleaner, more stable audio. Higher values add expressiveness but may introduce noise. Set 0 for greedy decoding. Only used when 'Use Audio Temperature' is enabled.", - "default": 0.8, - "min": 0.0, - "max": 5.0, - "step": 0.1, - }), - "useTopK": ("BOOLEAN", { - "tooltip": "Enable to include topK token sampling in audio generation settings", - "default": False, - }), - "topK": ("INT", { - "tooltip": "Top-K candidates for both text and audio token sampling. Limits sampling to the K most likely next tokens at each step. Only used when 'Use Top K' is enabled.", - "default": 50, - "min": 1, - "max": 500, - "step": 1, - }), - "useIncludePrefix": ("BOOLEAN", { - "tooltip": "Enable to include includePrefix in audio generation settings", - "default": False, - }), - "includePrefix": ("BOOLEAN", { - "tooltip": "When voice cloning, keep prefix audio in output (true) or trim to new speech (false). Only relevant when compatible prefix/reference audio is provided. Only used when 'Use Include Prefix' is enabled.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "useLyrics": ("BOOLEAN", { - "tooltip": "Enable to include lyrics in audio generation settings", - "default": False, - }), - "lyrics": ("STRING", { - "multiline": True, - "default": "", - "placeholder": "[verse] ... [chorus] ... (format like genius.com)", - "tooltip": "Lyrics for the audio generation. Format like lyrics from genius.com with [verse], [chorus], [refrain], etc.", - }), - "useGuidanceType": ("BOOLEAN", { - "tooltip": "Enable to include guidanceType (controls how guidance value is used)", - "default": False, - }), - "guidanceType": (["apg", "cfg"], { - "tooltip": "Controls how the guidance value is used. See API GuidanceType: apg | cfg.", - "default": "apg", - }), - "useLanguageBoost": ("BOOLEAN", { - "tooltip": "Enable to include languageBoost (language detection setting) in audio generation settings", - "default": False, - }), - "languageBoost": ([ - "auto", "zh", "yue", "en", "ar", "ru", "es", "fr", "pt", "de", "tr", "nl", "uk", - "vi", "id", "ja", "it", "ko", "th", "pl", "ro", "el", "cs", "fi", "hi", "bg", "da", - "he", "ms", "fa", "sk", "sv", "hr", "fil", "hu", "no", "sl", "ca", "nn", "ta", "af", - ], { - "tooltip": "Language detection setting. Codes: zh, yue, en, ar, ru, es, fr, pt, de, tr, nl, uk, vi, id, ja, it, ko, th, pl, ro, el, cs, fi, hi, bg, da, he, ms, fa, sk, sv, hr, fil, hu, no, sl, ca, nn, ta, af, auto", - "default": "auto", - }), - "useTurbo": ("BOOLEAN", { - "tooltip": "Enable to include turbo (select turbo model or not) in audio generation settings", - "default": False, - }), - "turbo": ("BOOLEAN", { - "tooltip": "When enabled, use turbo model. Only used when 'Use Turbo' is enabled.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "useTextNormalization": ("BOOLEAN", { - "tooltip": "Enable to include textNormalization (normalize text before synthesis) in audio generation settings", - "default": False, - }), - "textNormalization": ("BOOLEAN", { - "tooltip": "Normalize text (e.g. numbers, abbreviations) before synthesis to improve pronunciation. Only used when 'Use Text Normalization' is enabled.", - "default": True, - "label_on": "true", - "label_off": "false", - }), - "useBpm": ("BOOLEAN", { - "tooltip": "Enable to include bpm (tempo) in audio generation settings. If disabled, the model decides automatically.", - "default": False, - }), - "bpm": ("INT", { - "tooltip": "Beats per minute (30–300). If not set via API, the model decides. Common: 60–80 ballad, 90–110 pop, 120–130 house, 140–170 DnB. Only used when 'Use Bpm' is enabled.", - "default": 120, - "min": 30, - "max": 300, - "step": 1, - }), - "useKeyScale": ("BOOLEAN", { - "tooltip": "Enable to include keyScale (musical key and scale). Empty value lets the model decide.", - "default": False, - }), - "keyScale": ("STRING", { - "default": "", - "tooltip": "Musical key and scale. Empty string lets the model decide. Format: '{Note}{Accidental} {Mode}' (Note A–G, Accidental '' | '#' | 'b' | '♯' | '♭', Mode 'major' | 'minor'). Examples: 'C major', 'F# minor', 'B♭ major'.", - }), - "useTimeSignature": ("BOOLEAN", { - "tooltip": "Enable to include timeSignature (beats per measure). If disabled, the model decides automatically.", - "default": False, - }), - "timeSignature": ("INT", { - "default": 4, - "min": 1, - "max": 32, - "step": 1, - "tooltip": "Time signature as integer beats per bar (e.g. 2, 3, 4, 6). Only used when 'Use Time Signature' is enabled.", - }), - "useVocalLanguage": ("BOOLEAN", { - "tooltip": "Enable to include vocalLanguage (language code) for vocal generation. See dropdown for available codes.", - "default": False, - }), - "vocalLanguage": (_VOCAL_LANGUAGE_CODES, { - "tooltip": "Language code for vocals. Supports values from the dropdown list (including 'yue', 'zh', and 'unknown'). Use 'unknown' for instrumental or automatic detection. Only used when 'Use Vocal Language' is enabled.", - "default": "en", - }), - "useCoverConditioningScale": ("BOOLEAN", { - "tooltip": "Enable to include coverConditioningScale (source-audio conditioning fraction for cover tasks). Only effective when input audio is provided.", - "default": False, - }), - "coverConditioningScale": ("FLOAT", { - "tooltip": "Fraction of denoising steps using source-audio conditioning (cover task). 1.0 = all steps; 0.5 = first half source then text-only. Only used when 'Use Cover Conditioning Scale' is enabled.", - "default": 1.0, - "min": 0.0, - "max": 1.0, - "step": 0.01, - }), - "useRepaintingStart": ("BOOLEAN", { - "tooltip": "Enable to include repaintingStart (seconds). Requires input audio. Sets repaint region with repaintingEnd; negative values prepend (outpaint before start).", - "default": False, - }), - "repaintingStart": ("FLOAT", { - "tooltip": "Start time in seconds for repaint/inpaint/outpaint region. Only used when 'Use Repainting Start' is enabled.", - "default": 0.0, - "step": 0.01, - }), - "useRepaintingEnd": ("BOOLEAN", { - "tooltip": "Enable to include repaintingEnd (seconds). Requires input audio. Values beyond source duration append (outpaint).", - "default": False, - }), - "repaintingEnd": ("FLOAT", { - "tooltip": "End time in seconds for repaint region. Only used when 'Use Repainting End' is enabled.", - "default": 0.0, - "step": 0.01, - }), - "useXVectorOnly": ("BOOLEAN", { - "tooltip": "Enable to include xVectorOnly in audio generation settings.", - "default": False, - }), - "xVectorOnly": ("BOOLEAN", { - "tooltip": "true = speaker embedding only (no transcript needed, lower similarity). false = ICL mode (needs transcript, higher quality). Only used when 'Use X Vector Only' is enabled.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "useMaxNewTokens": ("BOOLEAN", { - "tooltip": "Enable to include maxNewTokens (audio output token cap) in audio generation settings.", - "default": False, - }), - "maxNewTokens": ("INT", { - "tooltip": "Audio output token cap. Higher = longer audio, but risk of generation hangs. Applies to all variants. Only used when 'Use Max New Tokens' is enabled.", - "default": 4096, - "min": 1, - "max": 262144, - "step": 1, - }), - "useTranscript": ("BOOLEAN", { - "tooltip": "Enable to include transcript (reference audio transcript) in audio generation settings.", - "default": False, - }), - "transcript": ("STRING", { - "multiline": True, - "default": "", - "tooltip": "Transcript of the reference audio. Required for ICL mode; omit or leave empty for x-vector-only mode. Base variant only. Only used when 'Use Transcript' is enabled.", - }), - "useInstrumental": ("BOOLEAN", { - "tooltip": "Enable to include instrumental in audio generation settings.", - "default": False, - }), - "instrumental": ("BOOLEAN", { - "tooltip": "When true, generates instrumental audio. For Music 2.6, this mode rejects settings.lyrics and settings.lyricsOptimizer, and positivePrompt becomes required.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "useLyricsOptimizer": ("BOOLEAN", { - "tooltip": "Enable to include lyricsOptimizer in audio generation settings.", - "default": False, - }), - "lyricsOptimizer": ("BOOLEAN", { - "tooltip": "Provider-side lyric generation from prompt when lyrics is empty/omitted. Supported for non-instrumental Music 2.6 requests only; rejected when instrumental=true.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "useCfgIntervalStart": ("BOOLEAN", { - "tooltip": "Enable to include cfgIntervalStart (diffusion ratio where CFG begins). ACE-Step Base only — not supported on Turbo variants.", - "default": False, - }), - "cfgIntervalStart": ("FLOAT", { - "tooltip": "Diffusion ratio where CFG begins (0.0 = first step). Only used when 'Use Cfg Interval Start' is enabled.", - "default": 0.0, - "min": 0.0, - "max": 1.0, - "step": 0.01, - }), - "useCfgIntervalEnd": ("BOOLEAN", { - "tooltip": "Enable to include cfgIntervalEnd (diffusion ratio where CFG ends). ACE-Step Base only — not supported on Turbo variants.", - "default": False, - }), - "cfgIntervalEnd": ("FLOAT", { - "tooltip": "Diffusion ratio where CFG ends (1.0 = last step). Only used when 'Use Cfg Interval End' is enabled.", - "default": 1.0, - "min": 0.0, - "max": 1.0, - "step": 0.01, - }), - "useNormalizeLoudness": ("BOOLEAN", { - "tooltip": "Enable to include normalizeLoudness in settings.", - "default": False, - }), - "normalizeLoudness": ("BOOLEAN", { - "tooltip": "Normalize output loudness for consistent perceived volume. Only used when 'Use Normalize Loudness' is enabled.", - "default": True, - "label_on": "true", - "label_off": "false", - }), - "useTopP": ("BOOLEAN", { - "tooltip": "Enable to include topP in settings.", - "default": False, - }), - "topP": ("FLOAT", { - "tooltip": "Controls diversity via nucleus sampling. Must be between 0.0001 and 1. Only used when 'Use Top P' is enabled.", - "default": 0.7, - "min": 0.0001, - "max": 1.0, - "step": 0.0001, - }), - "useChunkLength": ("BOOLEAN", { - "tooltip": "Enable to include chunkLength in settings.", - "default": False, - }), - "chunkLength": ("INT", { - "tooltip": "Text segment size for processing. Only used when 'Use Chunk Length' is enabled.", - "default": 300, - "min": 100, - "max": 300, - "step": 1, - }), - "useMinChunkLength": ("BOOLEAN", { - "tooltip": "Enable to include minChunkLength in settings.", - "default": False, - }), - "minChunkLength": ("INT", { - "tooltip": "Minimum characters before splitting into a new chunk. Only used when 'Use Min Chunk Length' is enabled.", - "default": 50, - "min": 0, - "max": 100, - "step": 1, - }), - "useNormalize": ("BOOLEAN", { - "tooltip": "Enable to include normalize in settings (text normalization for English and Chinese).", - "default": False, - }), - "normalize": ("BOOLEAN", { - "tooltip": "Normalizes text for English and Chinese, improving stability for numbers. Only used when 'Use Normalize' is enabled.", - "default": True, - "label_on": "true", - "label_off": "false", - }), - "useLatency": ("BOOLEAN", { - "tooltip": "Enable to include latency in settings.", - "default": False, - }), - "latency": (["low", "normal", "balanced"], { - "tooltip": "Latency / quality trade-off. normal = best quality, balanced = reduced latency, low = lowest latency. Only used when 'Use Latency' is enabled.", - "default": "normal", - }), - "useMaxTokens": ("BOOLEAN", { - "tooltip": "Enable to include maxTokens in settings (e.g. Fish Audio TTS).", - "default": False, - }), - "maxTokens": ("INT", { - "tooltip": "Maximum audio tokens to generate per text chunk. Only used when 'Use Max Tokens' is enabled.", - "default": 1024, - "min": 1, - "max": 4294967295, - "step": 1, - }), - "useRepetitionPenalty": ("BOOLEAN", { - "tooltip": "Enable to include repetitionPenalty in settings.", - "default": False, - }), - "repetitionPenalty": ("FLOAT", { - "tooltip": "Penalty for repeating audio patterns. Values above 1.0 reduce repetition. Only used when 'Use Repetition Penalty' is enabled.", - "default": 1.2, - "min": 0.0, - "max": 2.0, - "step": 0.01, - }), - "useConditionOnPreviousChunks": ("BOOLEAN", { - "tooltip": "Enable to include conditionOnPreviousChunks in settings.", - "default": False, - }), - "conditionOnPreviousChunks": ("BOOLEAN", { - "tooltip": "Use previous audio as context for voice consistency across chunks. Only used when 'Use Condition On Previous Chunks' is enabled.", - "default": True, - "label_on": "true", - "label_off": "false", - }), - "useEarlyStopThreshold": ("BOOLEAN", { - "tooltip": "Enable to include earlyStopThreshold in settings.", - "default": False, - }), - "earlyStopThreshold": ("FLOAT", { - "tooltip": "Early stopping threshold for batch processing. Only used when 'Use Early Stop Threshold' is enabled.", - "default": 1.0, - "min": 0.0, - "max": 1.0, - "step": 0.01, - }), - } - } - - RETURN_TYPES = ("RUNWAREAUDIOSETTINGS",) - RETURN_NAMES = ("settings",) - FUNCTION = "createSettings" - CATEGORY = "Runware/Audio" - DESCRIPTION = ( - "Configure audio generation settings (lyrics, lyricsOptimizer, instrumental, guidanceType, languageBoost, turbo, temperature, textNormalization, " - "bpm, keyScale, timeSignature, vocalLanguage, coverConditioningScale, repaintingStart, repaintingEnd, " - "cfgIntervalStart, cfgIntervalEnd, xVectorOnly, maxNewTokens, maxTokens, transcript, " - "normalizeLoudness, topP, chunkLength, minChunkLength, normalize, latency, repetitionPenalty, " - "conditionOnPreviousChunks, earlyStopThreshold, etc.) " - "for Runware Audio Inference. Connect to Runware Audio Inference node." - ) - - def createSettings(self, **kwargs) -> tuple[Dict[str, Any]]: - """Create audio settings dict for API""" - use_temperature = kwargs.get("useTemperature", False) - temperature = kwargs.get("temperature", 0.6) - use_audio_temperature = kwargs.get("useAudioTemperature", False) - audio_temperature = kwargs.get("audioTemperature", 0.8) - use_top_k = kwargs.get("useTopK", False) - top_k = kwargs.get("topK", 50) - use_include_prefix = kwargs.get("useIncludePrefix", False) - include_prefix = kwargs.get("includePrefix", False) - use_lyrics = kwargs.get("useLyrics", False) - lyrics = kwargs.get("lyrics", "") - use_instrumental = kwargs.get("useInstrumental", False) - instrumental = kwargs.get("instrumental", False) - use_lyrics_optimizer = kwargs.get("useLyricsOptimizer", False) - lyrics_optimizer = kwargs.get("lyricsOptimizer", False) - use_guidance_type = kwargs.get("useGuidanceType", False) - guidance_type = kwargs.get("guidanceType", "apg") - use_language_boost = kwargs.get("useLanguageBoost", False) - language_boost = kwargs.get("languageBoost", "auto") - use_turbo = kwargs.get("useTurbo", False) - turbo = kwargs.get("turbo", False) - use_text_normalization = kwargs.get("useTextNormalization", False) - text_normalization = kwargs.get("textNormalization", True) - use_bpm = kwargs.get("useBpm", False) - bpm = kwargs.get("bpm", 120) - use_key_scale = kwargs.get("useKeyScale", False) - key_scale = kwargs.get("keyScale", "") - use_time_signature = kwargs.get("useTimeSignature", False) - time_signature = kwargs.get("timeSignature", 4) - use_vocal_language = kwargs.get("useVocalLanguage", False) - vocal_language = kwargs.get("vocalLanguage", "en") - use_cover_conditioning_scale = kwargs.get("useCoverConditioningScale", False) - cover_conditioning_scale = kwargs.get("coverConditioningScale", 1.0) - use_repainting_start = kwargs.get("useRepaintingStart", False) - repainting_start = kwargs.get("repaintingStart", 0.0) - use_repainting_end = kwargs.get("useRepaintingEnd", False) - repainting_end = kwargs.get("repaintingEnd", 0.0) - use_x_vector_only = kwargs.get("useXVectorOnly", False) - x_vector_only = kwargs.get("xVectorOnly", False) - use_max_new_tokens = kwargs.get("useMaxNewTokens", False) - max_new_tokens = kwargs.get("maxNewTokens", 4096) - use_transcript = kwargs.get("useTranscript", False) - transcript = kwargs.get("transcript", "") or "" - use_cfg_interval_start = kwargs.get("useCfgIntervalStart", False) - cfg_interval_start = kwargs.get("cfgIntervalStart", 0.0) - use_cfg_interval_end = kwargs.get("useCfgIntervalEnd", False) - cfg_interval_end = kwargs.get("cfgIntervalEnd", 1.0) - use_normalize_loudness = kwargs.get("useNormalizeLoudness", False) - use_top_p = kwargs.get("useTopP", False) - top_p = kwargs.get("topP", 0.7) - use_chunk_length = kwargs.get("useChunkLength", False) - chunk_length = kwargs.get("chunkLength", 300) - use_min_chunk_length = kwargs.get("useMinChunkLength", False) - min_chunk_length = kwargs.get("minChunkLength", 50) - use_normalize = kwargs.get("useNormalize", False) - normalize = kwargs.get("normalize", True) - use_latency = kwargs.get("useLatency", False) - latency = kwargs.get("latency", "normal") - use_max_tokens = kwargs.get("useMaxTokens", False) - max_tokens = kwargs.get("maxTokens", 1024) - use_repetition_penalty = kwargs.get("useRepetitionPenalty", False) - repetition_penalty = kwargs.get("repetitionPenalty", 1.2) - use_condition_on_previous_chunks = kwargs.get("useConditionOnPreviousChunks", False) - use_early_stop_threshold = kwargs.get("useEarlyStopThreshold", False) - early_stop_threshold = kwargs.get("earlyStopThreshold", 1.0) - - settings: Dict[str, Any] = {} - - if use_temperature: - settings["temperature"] = float(temperature) - if use_audio_temperature: - settings["audioTemperature"] = float(audio_temperature) - if use_top_k: - settings["topK"] = int(top_k) - if use_include_prefix: - settings["includePrefix"] = bool(include_prefix) - - if use_lyrics and lyrics and lyrics.strip(): - settings["lyrics"] = lyrics.strip() - if use_instrumental: - settings["instrumental"] = bool(instrumental) - if use_lyrics_optimizer: - settings["lyricsOptimizer"] = bool(lyrics_optimizer) - - if use_guidance_type: - settings["guidanceType"] = guidance_type - - if use_language_boost: - settings["languageBoost"] = language_boost - - if use_turbo: - settings["turbo"] = bool(turbo) # API requires true/false - - if use_text_normalization: - settings["textNormalization"] = bool(text_normalization) - - if use_bpm: - settings["bpm"] = int(bpm) - - if use_key_scale and str(key_scale).strip(): - settings["keyScale"] = str(key_scale).strip() - - if use_time_signature: - settings["timeSignature"] = int(time_signature) - - if use_vocal_language: - settings["vocalLanguage"] = vocal_language - - if use_cover_conditioning_scale: - settings["coverConditioningScale"] = float(cover_conditioning_scale) - - if use_repainting_start: - settings["repaintingStart"] = float(repainting_start) - - if use_repainting_end: - settings["repaintingEnd"] = float(repainting_end) - - if use_x_vector_only: - settings["xVectorOnly"] = bool(x_vector_only) - - if use_max_new_tokens: - settings["maxNewTokens"] = int(max_new_tokens) - - if use_transcript and transcript.strip(): - settings["transcript"] = transcript.strip() - - if use_cfg_interval_start: - settings["cfgIntervalStart"] = float(cfg_interval_start) - - if use_cfg_interval_end: - settings["cfgIntervalEnd"] = float(cfg_interval_end) - - if use_normalize_loudness: - settings["normalizeLoudness"] = bool(kwargs.get("normalizeLoudness", True)) - - if use_top_p: - settings["topP"] = float(top_p) - - if use_chunk_length: - settings["chunkLength"] = int(chunk_length) - - if use_min_chunk_length: - settings["minChunkLength"] = int(min_chunk_length) - - if use_normalize: - settings["normalize"] = bool(normalize) - - if use_latency: - settings["latency"] = str(latency) - - if use_max_tokens: - settings["maxTokens"] = int(max_tokens) - - if use_repetition_penalty: - settings["repetitionPenalty"] = float(repetition_penalty) - - if use_condition_on_previous_chunks: - settings["conditionOnPreviousChunks"] = bool(kwargs.get("conditionOnPreviousChunks", True)) - - if use_early_stop_threshold: - settings["earlyStopThreshold"] = float(early_stop_threshold) - - return (settings,) - - -NODE_CLASS_MAPPINGS = { - "RunwareAudioSettings": RunwareAudioSettings, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareAudioSettings": "Runware Audio Inference Settings", -} diff --git a/modules/audioSettingsVoiceModify.py b/modules/audioSettingsVoiceModify.py deleted file mode 100644 index 8ac047f..0000000 --- a/modules/audioSettingsVoiceModify.py +++ /dev/null @@ -1,98 +0,0 @@ -""" -Runware Audio Inference Settings Voice Modify node. -Outputs settings.voiceModify (pitch, intensity, timbre, soundEffects) for Runware Audio Inference. -""" - -from typing import Dict, Any - -SOUND_EFFECTS = ["", "spacious_echo", "auditorium_echo", "lofi_telephone", "robotic"] - - -class RunwareAudioSettingsVoiceModify: - """Runware Audio Inference Settings Voice Modify – pitch, intensity, timbre, sound effects.""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "usePitch": ("BOOLEAN", { - "default": False, - "tooltip": "Include pitch in voice modification", - }), - "pitch": ("INT", { - "default": 0, - "min": -100, - "max": 100, - "step": 1, - "tooltip": "Voice pitch modification (settings.voiceModify.pitch)", - }), - "useIntensity": ("BOOLEAN", { - "default": False, - "tooltip": "Include intensity in voice modification", - }), - "intensity": ("INT", { - "default": 0, - "min": -100, - "max": 100, - "step": 1, - "tooltip": "Voice intensity modification (settings.voiceModify.intensity)", - }), - "useTimbre": ("BOOLEAN", { - "default": False, - "tooltip": "Include timbre in voice modification", - }), - "timbre": ("INT", { - "default": 0, - "min": -100, - "max": 100, - "step": 1, - "tooltip": "Voice timbre modification (settings.voiceModify.timbre)", - }), - "useSoundEffects": ("BOOLEAN", { - "default": False, - "tooltip": "Include sound effect in voice modification", - }), - "soundEffects": (SOUND_EFFECTS, { - "default": "", - "tooltip": "Sound effect: spacious_echo, auditorium_echo, lofi_telephone, robotic", - }), - } - } - - RETURN_TYPES = ("RUNWAREVOICEMODIFY",) - RETURN_NAMES = ("voiceModify",) - FUNCTION = "createVoiceModify" - CATEGORY = "Runware/Audio" - DESCRIPTION = "Voice modification settings (pitch, intensity, timbre, sound effects). Connect to Runware Audio Inference voiceModify input." - - def createVoiceModify(self, **kwargs) -> tuple: - """Build voiceModify dict for settings.voiceModify. Only includes keys when the corresponding use toggle is on.""" - use_pitch = kwargs.get("usePitch", False) - pitch = kwargs.get("pitch", 0) - use_intensity = kwargs.get("useIntensity", False) - intensity = kwargs.get("intensity", 0) - use_timbre = kwargs.get("useTimbre", False) - timbre = kwargs.get("timbre", 0) - use_sound_effects = kwargs.get("useSoundEffects", False) - sound_effects = (kwargs.get("soundEffects") or "").strip() - - voice_modify: Dict[str, Any] = {} - if use_pitch: - voice_modify["pitch"] = pitch - if use_intensity: - voice_modify["intensity"] = intensity - if use_timbre: - voice_modify["timbre"] = timbre - if use_sound_effects and sound_effects: - voice_modify["soundEffects"] = sound_effects - return (voice_modify,) - - -NODE_CLASS_MAPPINGS = { - "RunwareAudioSettingsVoiceModify": RunwareAudioSettingsVoiceModify, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareAudioSettingsVoiceModify": "Runware Audio Inference Settings Voice Modify", -} diff --git a/modules/bgremoval.py b/modules/bgremoval.py deleted file mode 100644 index 15bec2e..0000000 --- a/modules/bgremoval.py +++ /dev/null @@ -1,171 +0,0 @@ -from .utils import runwareUtils as rwUtils - -class bgremoval: - RUNWARE_RMBG_MODELS = { - "RemBG 1.4": "runware:109@1", - "Bria RMBG 2.0": "runware:110@1", - "Bria RMBG v2.0": "bria:2@1", - "BiRefNet v1 Base": "runware:112@1", - "BiRefNet v1 Base - COD": "runware:112@2", - "BiRefNet Dis": "runware:112@3", - "BiRefNet General": "runware:112@5", - "BiRefNet General RES 512x512": "runware:112@6", - "BiRefNet HRSOD DHU": "runware:112@7", - "BiRefNet Massive TR DIS5K TES": "runware:112@8", - "BiRefNet Matting": "runware:112@9", - "BiRefNet Portrait": "runware:112@10" - } - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Image": ("IMAGE", { - "tooltip": "Specifies the input image to be processed." - }), - "Model": (list(cls.RUNWARE_RMBG_MODELS.keys()), { - "tooltip": "Select the background removal model to use. Different models have varying strengths depending on image content and complexity.", - "default": "RemBG 1.4", - }), - }, - "optional": { - "Post Process Mask": ("BOOLEAN", { - "tooltip": "Controls whether the mask should undergo additional post-processing. This step can improve the accuracy and quality of the background removal mask.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "Return Only Mask": ("BOOLEAN", { - "tooltip": "Whether to return only the mask. The mask is the opposite of the image background removal.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "Alpha Matting": ("BOOLEAN", { - "tooltip": "Alpha matting is a post-processing technique that enhances the quality of the output by refining the edges of the foreground object.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "Alpha Matting Foreground Threshold": ("INT", { - "tooltip": "Threshold value used in alpha matting to distinguish the foreground from the background. Adjusting this parameter affects the sharpness and accuracy of the foreground object edges.", - "default": 240, - "min": 1, - "max": 255, - }), - "Alpha Matting Background Threshold": ("INT", { - "tooltip": "Threshold value used in alpha matting to refine the background areas. It influences how aggressively the algorithm removes the background while preserving image details. The higher the value, the more computation is needed and therefore the more expensive the operation is.", - "default": 10, - "min": 1, - "max": 255, - }), - "Alpha Matting Erode Size": ("INT", { - "tooltip": "Specifies the size of the erosion operation used in alpha matting. Erosion helps in smoothing the edges of the foreground object for a cleaner removal of the background.", - "default": 10, - "min": 1, - "max": 255, - }), - "safetyInputs": ("RUNWARESAFETYINPUTS", { - "tooltip": "Connect Runware Safety Inputs node to configure safety and content moderation settings.", - }), - "Accelerator": ("RUNWAREACCELERATOR", { - "tooltip": "Connect a Runware Accelerator Options Node to configure caching and acceleration settings.", - }), - "providerSettings": ("RUNWAREPROVIDERSETTINGS", { - "tooltip": "Connect a Runware Provider Settings node to configure provider-specific parameters.", - }), - **rwUtils.RUNWARE_REMBG_OUTPUT_FORMATS, - } - } - - DESCRIPTION = "Remove backgrounds from images effortlessly using Runware's low-cost image editing Inference." - FUNCTION = "rembg" - RETURN_TYPES = ("STRING",) - RETURN_NAMES = ("IMAGE",) - CATEGORY = "Runware" - - def rembg(self, **kwargs): - image = kwargs.get("Image") - modelName = kwargs.get("Model", "RemBG 1.4") - postProcessMask = kwargs.get("Post Process Mask", False) - returnOnlyMask = kwargs.get("Return Only Mask", False) - alphaMatting = kwargs.get("Alpha Matting", False) - alphaMattingForegroundThreshold = kwargs.get("Alpha Matting Foreground Threshold", 240) - alphaMattingBackgroundThreshold = kwargs.get("Alpha Matting Background Threshold", 10) - alphaMattingErodeSize = kwargs.get("Alpha Matting Erode Size", 10) - outputFormat = kwargs.get("outputFormat", "WEBP") - safetyInputs = kwargs.get("safetyInputs", None) - runwareAccelerator = kwargs.get("Accelerator", None) - providerSettings = kwargs.get("providerSettings", None) - modelAIR = self.RUNWARE_RMBG_MODELS.get(modelName, "runware:109@1") - includeExtraSettings = postProcessMask or returnOnlyMask or alphaMatting - - if modelAIR != "runware:109@1" and includeExtraSettings: - raise ValueError( - f"Oops! The selected model '{modelName}' does not support additional settings!\n" - "Please switch to 'RemBG 1.4' if you wish to use these features." - ) - - genConfig = { - "taskType": "imageBackgroundRemoval", - "taskUUID": rwUtils.genRandUUID(), - "inputImage": rwUtils.convertTensor2IMG(image), - "model": modelAIR, - "outputFormat": outputFormat, - "outputQuality": rwUtils.OUTPUT_QUALITY, - "outputType": "URL", - } - - if includeExtraSettings: - settings = { - "postProcessMask": postProcessMask, - "returnOnlyMask": returnOnlyMask, - "alphaMatting": alphaMatting, - } - if alphaMatting: - settings["alphaMattingForegroundThreshold"] = alphaMattingForegroundThreshold - settings["alphaMattingBackgroundThreshold"] = alphaMattingBackgroundThreshold - settings["alphaMattingErodeSize"] = alphaMattingErodeSize - genConfig["settings"] = settings - - # Add safety inputs if provided - if safetyInputs is not None and isinstance(safetyInputs, dict) and len(safetyInputs) > 0: - genConfig["safety"] = safetyInputs - - # Add accelerator options if provided - if runwareAccelerator is not None and isinstance(runwareAccelerator, dict) and len(runwareAccelerator) > 0: - genConfig["acceleratorOptions"] = runwareAccelerator - - # Handle providerSettings - extract provider name from model and merge with custom settings - if providerSettings is not None: - # Extract provider name from model (e.g., "bria:2@1" -> "bria", "runware:109@1" -> "runware") - provider_name = modelAIR.split(":")[0] if ":" in modelAIR else "runware" - - # If providerSettings is a dictionary, create the correct API format - if isinstance(providerSettings, dict): - # Create the providerSettings object with provider name as key - final_provider_settings = { - provider_name: providerSettings - } - genConfig["providerSettings"] = final_provider_settings - print(f"[Debugging] Provider settings: {final_provider_settings}") - else: - # If it's just a string, use it directly - genConfig["providerSettings"] = providerSettings - - # Debug: Print the request being sent - print(f"[DEBUG] Sending Background Removal Request:", flush=True) - print(f"[DEBUG] Request Payload: {rwUtils.safe_json_dumps([genConfig], indent=2)}", flush=True) - - try: - genResult = rwUtils.inferenecRequest([genConfig]) - - # Debug: Print the response received - print(f"[DEBUG] Received Background Removal Response:", flush=True) - print(f"[DEBUG] Response: {rwUtils.safe_json_dumps(genResult, indent=2)}", flush=True) - except Exception as e: - print(f"[DEBUG] Error in Background Removal Request: {str(e)}", flush=True) - raise - - images = rwUtils.extractImageURLs(genResult) - return (images,) \ No newline at end of file diff --git a/modules/bridges/mainRoute.py b/modules/bridges/mainRoute.py deleted file mode 100644 index 7d22a96..0000000 --- a/modules/bridges/mainRoute.py +++ /dev/null @@ -1,143 +0,0 @@ -from ..utils import runwareUtils as rwUtils -from server import PromptServer -from aiohttp import web - -routes = PromptServer.instance.routes - -@routes.post('/setAPIKey') -async def setAPIKey(reqPayload): - reqData = await reqPayload.json() - apiKey = reqData.get('apiKey', None) - if(apiKey is None or apiKey == "" or len(apiKey) < 30): - return web.json_response({'success': False, 'error': 'Invalid API Key!'}) - try: - apiKey = apiKey.strip() - apiCheckResult = rwUtils.checkAPIKey(apiKey) - if(apiCheckResult == False): - return web.json_response({'success': False, 'error': 'Failed To Set Your API Key, Please Try Again!'}) - elif(apiCheckResult != True): - return web.json_response({'success': False, 'error': apiCheckResult}) - rwUtils.setAPIKey(apiKey) - except Exception as e: - return web.json_response({'success': False, 'error': str(e)}) - return web.json_response({'success': True}) - -@routes.post('/setMaxTimeout') -async def setMaxTimeout(reqPayload): - reqData = await reqPayload.json() - maxTimeout = reqData.get('maxTimeout', 90) - if(maxTimeout < 5 or maxTimeout > 99): - return web.json_response({'success': False, 'error': 'Invalid Timeout Value!'}) - try: - rwUtils.setTimeout(maxTimeout) - except Exception as e: - return web.json_response({'success': False, 'error': str(e)}) - return web.json_response({'success': True}) - -@routes.post('/setOutputFormat') -async def setOutputFormat(reqPayload): - reqData = await reqPayload.json() - outputFormat = reqData.get('outputFormat', 'WEBP') - if outputFormat not in ['WEBP', 'PNG', 'JPEG', 'TIFF']: - return web.json_response({'success': False, 'error': 'Invalid Output Format!'}) - try: - rwUtils.setOutputFormat(outputFormat) - except Exception as e: - return web.json_response({'success': False, 'error': str(e)}) - return web.json_response({'success': True}) - -@routes.post('/setOutputQuality') -async def setOutputQuality(reqPayload): - reqData = await reqPayload.json() - outputQuality = reqData.get('outputQuality', 95) - if not isinstance(outputQuality, int) or outputQuality < 20 or outputQuality > 99: - return web.json_response({'success': False, 'error': 'Invalid Output Quality!'}) - try: - rwUtils.setOutputQuality(outputQuality) - except Exception as e: - return web.json_response({'success': False, 'error': str(e)}) - return web.json_response({'success': True}) - -@routes.post('/setEnableImagesCaching') -async def setEnableImagesCaching(reqPayload): - reqData = await reqPayload.json() - enableCaching = reqData.get('enableCaching', True) - if not isinstance(enableCaching, bool): - return web.json_response({'success': False, 'error': 'Invalid value for enable caching!'}) - try: - rwUtils.setEnableImagesCaching(enableCaching) - except Exception as e: - return web.json_response({'success': False, 'error': str(e)}) - return web.json_response({'success': True}) - -@routes.post('/setMinImageCacheSize') -async def setMinImageCacheSize(reqPayload): - reqData = await reqPayload.json() - minCacheSize = reqData.get('minCacheSize', 100) - if not isinstance(minCacheSize, int) or minCacheSize < 30 or minCacheSize > 4096: - return web.json_response({'success': False, 'error': 'Invalid minimum cache size!'}) - try: - rwUtils.setMinImageCacheSize(minCacheSize) - except Exception as e: - return web.json_response({'success': False, 'error': str(e)}) - return web.json_response({'success': True}) - -@routes.post('/promptEnhance') -async def promptEnhance(reqPayload): - reqData = await reqPayload.json() - userPrompt = reqData.get('userPrompt') - utilityConfig = [{ - "taskType": "promptEnhance", - "taskUUID": rwUtils.genRandUUID(), - "prompt": userPrompt, - "promptMaxLength": 300, - "promptVersions": 1, - }] - - try: - utilityResults = rwUtils.inferenecRequest(utilityConfig) - except Exception as e: - return web.json_response({'success': False, 'error': str(e)}) - enhancedPrompt = utilityResults["data"][0]["text"] - return web.json_response({'success': True, 'enhancedPrompt': enhancedPrompt}) - -@routes.post('/modelSearch') -async def modelSearch(reqPayload): - reqData = await reqPayload.json() - modelQuery = reqData.get('modelQuery', "") - modelArch = reqData.get('modelArch', "all") - modelCategory = reqData.get('modelCat', "checkpoint") - modelType = reqData.get('modelType', "base") - controlNetConditioning = reqData.get('condtioning', "all") - - utilityConfig = [{ - "taskType": "modelSearch", - "taskUUID": rwUtils.genRandUUID(), - "category": modelCategory, - "limit": 25, - "sort": "-downloadCount", - }] - - aclTypes = ["controlnet", "lora", "lycoris", "embeddings", "vae"] - - if(modelCategory not in aclTypes): - utilityConfig[0]["type"] = modelType - elif(modelCategory == "controlnet" and controlNetConditioning != "all"): - utilityConfig[0]["conditioning"] = controlNetConditioning - if(modelArch != "all"): - utilityConfig[0]["architecture"] = modelArch - if(modelQuery != ""): - utilityConfig[0]["search"] = modelQuery - - try: - utilityResults = rwUtils.inferenecRequest(utilityConfig) - except Exception as e: - return web.json_response({'success': False, 'error': str(e)}) - totalResults = utilityResults["data"][0]["totalResults"] - if(totalResults < 1): - return web.json_response({'success': False, 'error': 'No Results Found!'}) - results = utilityResults["data"][0].get("results", []) - if not results: - return web.json_response({'success': False, 'error': 'No Results Found!'}) - modelList = results - return web.json_response({'success': True, 'modelList': modelList}) \ No newline at end of file diff --git a/modules/controlNet.py b/modules/controlNet.py deleted file mode 100644 index 3703213..0000000 --- a/modules/controlNet.py +++ /dev/null @@ -1,169 +0,0 @@ -from .utils import runwareUtils as rwUtils - -class controlNet: - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Guide Image": ("IMAGE", { - "tooltip": "Specifies the preprocessed image to be used as guide to control the image generation process." - }), - "ControlNet Search": ("STRING", { - "tooltip": "Searchg For Specific ControlNet By Name Or Civit AIR Code (eg: Canny).", - }), - "Model Architecture": ([ - "All", - "FLUX.1-Schnell", - "FLUX.1-Dev", - "FLUX.1 Krea", - "Pony", - "SD 1.5", - "SD 1.5 Hyper", - "SD 1.5 LCM", - "SD 3", - "SDXL 1.0", - "SDXL 1.0 LCM", - "SDXL Distilled", - "SDXL Hyper", - "SDXL Lightning", - "SDXL Turbo", - ], { - "tooltip": "Choose ControlNet Model Architecture To Filter Results.", - "default": "All", - }), - "ControlNetType": ([ - "All", - "Canny", - "Depth", - "MLSD", - "Normal BAE", - "Open Pose", - "Tile", - "Seg", - "Line Art", - "Line Art Anime", - "Shuffle", - "Scribble", - "Soft Edge", - ], { - "tooltip": "Choose ControlNet Type To Filter Results.", - "default": "All", - }), - "ControlNetList": ([ - "civitai:38784@44716 (SD1.5 Canny)", - "civitai:38784@44876 (SD1.5 Inpaint)", - "civitai:38784@44877 (SD1.5 Lineart)", - "civitai:38784@44795 (SD1.5 MLSD)", - "civitai:38784@44774 (SD1.5 NormalBAE)", - "runware:20@1 (SDXL Canny)", - "runware:25@1 (Flux Dev Canny)", - "runware:26@1 (Flux Dev Tile)", - "runware:28@1 (Flux Dev Blur)", - "runware:29@1 (Flux Dev OpenPose)", - "runware:30@1 (Flux Dev Gray)", - "runware:31@1 (Flux Dev Low Quality)", - ], { - "tooltip": "ControlNet Results Will Show UP Here So You Could Choose From.", - "default": "civitai:38784@44716 (SD1.5 Canny)", - }), - "startStep": ("INT", { - "tooltip": "Represents the step number at which the ControlNet model starts to control the inference process. (Enter -1 To Disable)", - "min": -1, - "max": 99, - "default": -1, - }), - "startStepPercentage": ("INT", { - "tooltip": "Represents the percentage of steps at which the ControlNet model starts to control the inference process. (Enter -1 To Disable)", - "min": -1, - "max": 99, - "default": 0, - }), - "endStep": ("INT", { - "tooltip": "Represents the step number at which the ControlNet preprocessor ends to control the inference process. (Enter -1 To Disable)", - "min": -1, - "max": 100, - "default": -1, - }), - "endStepPercentage": ("INT", { - "tooltip": "Represents the percentage of steps at which the ControlNet model ends to control the inference process. (Enter -1 To Disable)", - "min": -1, - "max": 100, - "default": 80, - }), - "Control Mode": (["prompt", "controlnet", "balanced"], { - "tooltip": "Choose Control Mode To Control The Inference Process.", - "default": "balanced", - }), - "weight": ("FLOAT", { - "tooltip": "Represents the weight (strength) of the ControlNet model in the image.", - "default": 1.0, - "min": 0, - "max": 1.0, - "step": 0.1, - }), - "Use Search Value": ("BOOLEAN", { - "tooltip": "When Enabled, the value you've set in the search input will be used instead.\n\nThis is useful in case the model search API is down or you prefer to set the model manually.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - }, - } - - DESCRIPTION = "Directly Search and Configure ControlNet Guidance to Connect It With Runware Image Inference Nodes In ComfyUI." - FUNCTION = "controlNet" - RETURN_TYPES = ("RUNWARECONTROLNET",) - RETURN_NAMES = ("Runware ControlNet",) - CATEGORY = "Runware" - - @classmethod - def VALIDATE_INPUTS(cls, ControlNetList, startStep, startStepPercentage, endStep, endStepPercentage): - if((startStep == -1 and startStepPercentage == -1) or (startStep != -1 and startStepPercentage != -1)): - raise Exception("Error: Please Provide Either Start Step or Start Step Percentage!") - if((endStep == -1 and endStepPercentage == -1) or (endStep != -1 and endStepPercentage != -1)): - raise Exception("Error: Please Provide Either End Step or End Step Percentage!") - if((startStep != -1 and endStep != -1) and (startStep > endStep)): - raise Exception("Error: Start Step Cannot Be Greater Than End Step!") - elif((startStep != -1 and endStep != -1) and (startStep == endStep)): - raise Exception("Error: Start Step Cannot Be Equal To End Step!") - if((startStepPercentage != -1 and endStepPercentage != -1) and (startStepPercentage > endStepPercentage)): - raise Exception("Error: Start Step Percentage Cannot Be Greater Than End Step Percentage!") - elif((startStepPercentage != -1 and endStepPercentage != -1) and (startStepPercentage == endStepPercentage)): - raise Exception("Error: Start Step Percentage Cannot Be Equal To End Step Percentage!") - return True - - def controlNet(self, **kwargs): - guideImage = kwargs.get("Guide Image") - enableSearchValue = kwargs.get("Use Search Value", False) - searchInput = kwargs.get("ControlNet Search") - - if enableSearchValue: - modelAIRCode = searchInput - else: - CRModel = kwargs.get("ControlNetList") - modelAIRCode = CRModel.split(" ")[0] - - startStep = kwargs.get("startStep") - startStepPercentage = kwargs.get("startStepPercentage") - endStep = kwargs.get("endStep") - endStepPercentage = kwargs.get("endStepPercentage") - controlMode = kwargs.get("Control Mode") - weight = kwargs.get("weight") - - controlNetGuideOBJ = [{ - "model": modelAIRCode, - "guideImage": rwUtils.convertTensor2IMG(guideImage), - "weight": round(weight, 2), - "controlMode": controlMode, - }] - - if(startStep != -1): - controlNetGuideOBJ[0]["startStep"] = startStep - elif(startStepPercentage != -1): - controlNetGuideOBJ[0]["startStepPercentage"] = startStepPercentage - if(endStep != -1): - controlNetGuideOBJ[0]["endStep"] = endStep - elif(endStepPercentage != -1): - controlNetGuideOBJ[0]["endStepPercentage"] = endStepPercentage - - return (controlNetGuideOBJ,) \ No newline at end of file diff --git a/modules/controlNetCombine.py b/modules/controlNetCombine.py deleted file mode 100644 index 2fd2adb..0000000 --- a/modules/controlNetCombine.py +++ /dev/null @@ -1,37 +0,0 @@ -class controlNetCombine: - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "ControlNet 1": ("RUNWARECONTROLNET", { - "tooltip": "Connect a Runware ControlNet Node.", - }), - }, - "optional": { - "ControlNet 2": ("RUNWARECONTROLNET", { - "tooltip": "Connect a Runware ControlNet Node.", - }), - "ControlNet 3": ("RUNWARECONTROLNET", { - "tooltip": "Connect a Runware ControlNet Node.", - }), - }, - } - - DESCRIPTION = "Combine One or More ControlNet's To Guide Image Generation Process in Runware Image Inference." - FUNCTION = "controlNetCombine" - RETURN_TYPES = ("RUNWARECONTROLNET",) - RETURN_NAMES = ("Runware ControlNet's",) - CATEGORY = "Runware" - - def controlNetCombine(self, **kwargs): - controlNet1 = kwargs.get("ControlNet 1") - controlNet2 = kwargs.get("ControlNet 2", None) - controlNet3 = kwargs.get("ControlNet 3", None) - - controlNetObjectArray = controlNet1 - if(controlNet2 is not None): - controlNetObjectArray = controlNetObjectArray + controlNet2 - if(controlNet3 is not None): - controlNetObjectArray = controlNetObjectArray + controlNet3 - print(controlNetObjectArray) - return (controlNetObjectArray,) \ No newline at end of file diff --git a/modules/controlNetPreprocessor.py b/modules/controlNetPreprocessor.py deleted file mode 100644 index 5e9aa9c..0000000 --- a/modules/controlNetPreprocessor.py +++ /dev/null @@ -1,119 +0,0 @@ -from .utils import runwareUtils as rwUtils - -class controlNetPreprocessor: - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Image": ("IMAGE", { - "tooltip": "Specifies the input image to be preprocessed to generate a guide image. This guide image will be used as a reference for image generation processes, guiding the AI to generate images that are more aligned with the input image." - }), - "PreProcessor Type": ([ - "Canny", - "Depth", - "MLSD", - "NormalBAE", - "OpenPose", - "Tile", - "Seg", - "LineArt", - "LineArtAnime", - "Shuffle", - "Scribble", - "SoftEdge", - ], { - "tooltip": "Choose Preprocessor Type To Generate The Guide Image.", - "default": "Canny", - }), - "Include Hands And Faces [ OpenPose ]": ("BOOLEAN", { - "default": False, - "tooltip": "Include the hands and face in the pose outline when using the OpenPose preprocessor.", - "label_on": "Enabled", - "label_off": "Disabled", - }), - "Canny Low Threshold": ("INT", { - "tooltip": "Defines the lower threshold when using the Canny edge detection preprocessor.", - "default": 100, - "min": 0, - "max": 255, - }), - "Canny High Threshold": ("INT", { - "tooltip": "Defines the high threshold when using the Canny edge detection preprocessor.", - "default": 200, - "min": 0, - "max": 255, - }), - "Image Resizing": ("BOOLEAN", { - "default": False, - "tooltip": "It Allows Image Resizing if the dimension of the image is higher than a specific value it will be resized.", - "label_on": "Enabled", - "label_off": "Disabled", - }), - "dimensions": ([ - "Square (512x512)", "Square HD (1024x1024)", "Portrait 3:4 (768x1024)", - "Portrait 9:16 (576x1024)", "Landscape 4:3 (1024x768)", - "Landscape 16:9 (1024x576)", "Custom" - ], { - "default": "Square HD (1024x1024)", - "tooltip": "Resize the dimensions of the generated Guide image by specifying its width and height in pixels, or select from the predefined options. Image dimensions must be multiples of 64 (e.g., 512x512, 1024x768).", - }), - "width": ("INT", { - "tooltip": "If the Image height dimension is larger than this value, the output image will be resized to the specified height.", - "default": 1024, - "min": 512, - "max": 2048, - "step": 64, - }), - "height": ("INT", { - "tooltip": "If the Image width dimension is larger than this value, the output image will be resized to the specified width.", - "default": 1024, - "min": 512, - "max": 2048, - "step": 64, - }), - }, - } - - DESCRIPTION = "ControlNet offers advanced capabilities for precise image processing through the use of guide images in specific formats, known as preprocessed images. This powerful tool enhances the control and customization of image generation, enabling users to achieve desired artistic styles and detailed adjustments effectively." - FUNCTION = "controlNetPreProcess" - RETURN_TYPES = ("STRING",) - RETURN_NAMES = ("GUIDE IMAGE",) - CATEGORY = "Runware" - - def controlNetPreProcess(self, **kwargs): - image = kwargs.get("Image") - preProcessorType = kwargs.get("PreProcessor Type") - includeHandsAndFaces = kwargs.get("Include Hands And Faces [ OpenPose ]") - cannyLowThreshold = kwargs.get("Canny Low Threshold") - cannyHighThreshold = kwargs.get("Canny High Threshold") - imageResizing = kwargs.get("Image Resizing") - width = kwargs.get("width") - height = kwargs.get("height") - - genConfig = [ - { - "taskType": "imageControlNetPreProcess", - "taskUUID": rwUtils.genRandUUID(), - "inputImage": rwUtils.convertTensor2IMG(image), - "preProcessorType": preProcessorType, - "outputFormat": rwUtils.OUTPUT_FORMAT, - "outputQuality": rwUtils.OUTPUT_QUALITY, - "outputType": "URL", - } - ] - - # For Debugging Purposes Only - print(f"[Debugging] Task UUID: {genConfig[0]['taskUUID']}") - - if(imageResizing): - genConfig[0]["width"] = width - genConfig[0]["height"] = height - if(preProcessorType == "OpenPose" and includeHandsAndFaces): - genConfig[0]["includeHandsAndFaceOpenPose"] = includeHandsAndFaces - elif(preProcessorType == "Canny"): - genConfig[0]["lowThresholdCanny"] = cannyLowThreshold - genConfig[0]["highThresholdCanny"] = cannyHighThreshold - - genResult = rwUtils.inferenecRequest(genConfig) - images = rwUtils.extractImageURLs(genResult) - return (images,) \ No newline at end of file diff --git a/modules/embeddingSearch.py b/modules/embeddingSearch.py deleted file mode 100644 index bcd0040..0000000 --- a/modules/embeddingSearch.py +++ /dev/null @@ -1,80 +0,0 @@ -class embeddingSearch: - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Embedding Search": ("STRING", { - "tooltip": "Search For A Specific Embedding By Name Or Civit AIR Code (eg: EasyNegative).", - }), - "Model Architecture": ([ - "All", - "FLUX.1-Schnell", - "FLUX.1-Dev", - "FLUX.1 Krea", - "Pony", - "SD 1.5", - "SD 1.5 Hyper", - "SD 1.5 LCM", - "SD 3", - "SDXL 1.0", - "SDXL 1.0 LCM", - "SDXL Distilled", - "SDXL Hyper", - "SDXL Lightning", - "SDXL Turbo", - ], { - "tooltip": "Choose Embedding Model Architecture To Filter Out The Results.", - "default": "SD 1.5", - }), - "EmbeddingList": ([ - "civitai:7808@9208 (EasyNegative)", - "civitai:4629@5637 (Deep Negative V1.x)", - "civitai:56519@60938 (negative_hand Negative Embedding)", - "civitai:72437@77169 (BadDream + UnrealisticDream (Negative Embeddings))", - "civitai:11772@25820 (veryBadImageNegative)", - "civitai:71961@94057 (Fast Negative Embedding (+ FastNegativeV2))", - ], { - "tooltip": "Embedding Results Will Show UP Here So You Could Choose From.", - "default": "civitai:7808@9208 (EasyNegative)", - }), - "weight": ("FLOAT", { - "tooltip": "Defines the strength or influence of the Embedding on the generation process.", - "default": 1.0, - "min": 0, - "max": 1, - "step": 0.1, - }), - "Use Search Value": ("BOOLEAN", { - "tooltip": "When Enabled, the value you've set in the search input will be used instead.\n\nThis is useful in case the model search API is down or you prefer to set the model manually.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - }, - } - - DESCRIPTION = "Directly Search and Connect Embeddings to Runware Inference Nodes In ComfyUI." - FUNCTION = "embeddingSearch" - RETURN_TYPES = ("RUNWAREEMBEDDING",) - RETURN_NAMES = ("Runware Embedding",) - CATEGORY = "Runware" - - @classmethod - def VALIDATE_INPUTS(cls, EmbeddingList): - return True - - def embeddingSearch(self, **kwargs): - enableSearchValue = kwargs.get("Use Search Value", False) - searchInput = kwargs.get("Embedding Search") - embedding_weight = kwargs.get("weight") - - if enableSearchValue: - modelAIRCode = searchInput - else: - crModel = kwargs.get("EmbeddingList") - modelAIRCode = crModel.split(" ")[0] - - return ({ - "model": modelAIRCode, - "weight": round(embedding_weight, 2), - },) \ No newline at end of file diff --git a/modules/embeddingsCombine.py b/modules/embeddingsCombine.py deleted file mode 100644 index 1834c79..0000000 --- a/modules/embeddingsCombine.py +++ /dev/null @@ -1,37 +0,0 @@ -class embeddingsCombine: - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Embedding 1": ("RUNWAREEMBEDDING", { - "tooltip": "Connect a Runware Embedding From an Embedding Node.", - }), - }, - "optional": { - "Embedding 2": ("RUNWAREEMBEDDING", { - "tooltip": "Connect a Runware Embedding From an Embedding Node.", - }), - "Embedding 3": ("RUNWAREEMBEDDING", { - "tooltip": "Connect a Runware Embedding From an Embedding Node.", - }), - }, - } - - DESCRIPTION = "Combine One or More Embeddings To Connect It With Runware Image Inference." - FUNCTION = "embeddingsCombine" - RETURN_TYPES = ("RUNWAREEMBEDDING",) - RETURN_NAMES = ("Runware Embeddings",) - CATEGORY = "Runware" - - def embeddingsCombine(self, **kwargs): - embeddingV1 = kwargs.get("Embedding 1") - embeddingV2 = kwargs.get("Embedding 2", None) - embeddingV3 = kwargs.get("Embedding 3", None) - - embeddingsObjArray = [] - embeddingsObjArray.append(embeddingV1) - if(embeddingV2): - embeddingsObjArray.append(embeddingV2) - if(embeddingV3): - embeddingsObjArray.append(embeddingV3) - return (embeddingsObjArray,) \ No newline at end of file diff --git a/modules/frameImages.py b/modules/frameImages.py deleted file mode 100644 index 2e6372f..0000000 --- a/modules/frameImages.py +++ /dev/null @@ -1,72 +0,0 @@ -from .utils import runwareUtils as rwUtils - - -class RunwareFrameImages: - """Frame Images node for defining keyframes that constrain video timeline""" - - FRAME_POSITIONS = ["auto", "first", "last", "0", "12", "24", "36", "48", "60", "72", "84", "96", "108", "120"] - MAX_FRAMES = 4 - - @classmethod - def INPUT_TYPES(cls): - optionalInputs = {} - - for i in range(1, cls.MAX_FRAMES + 1): - optionalInputs[f"image{i}"] = ("IMAGE", { - "tooltip": "Frame image that will constrain video content at a specific timeline position. Used for keyframe control.", - }) - optionalInputs[f"frame{i}_position"] = (cls.FRAME_POSITIONS, { - "default": "auto", - "tooltip": "Frame position: 'auto' (automatic distribution), 'first' (beginning), 'last' (end), or specific frame number (0-120).", - }) - - return { - "required": {}, - "optional": optionalInputs - } - - DESCRIPTION = "Define keyframes that constrain specific frames within the video timeline. Different from reference images - these control WHEN specific visual content appears, not overall style consistency." - FUNCTION = "createFrameImages" - RETURN_TYPES = ("RUNWAREFRAMEIMAGES",) - RETURN_NAMES = ("Frame Images",) - CATEGORY = "Runware" - - def createFrameImages(self, **kwargs): - """Create frame images list from provided parameters""" - frameImages = [] - - for i in range(1, self.MAX_FRAMES + 1): - imageKey = f"image{i}" - positionKey = f"frame{i}_position" - - image = kwargs.get(imageKey) - position = kwargs.get(positionKey, "auto") - - if image is not None: - frameData = self._createFrameData(image, position) - frameImages.append(frameData) - - return (frameImages,) - - def _createFrameData(self, image, position): - """Create frame data object from image and position""" - imageData = rwUtils.convertTensor2IMGBase64Only(image) - frameData = {"inputImage": imageData} - - if position != "auto": - if position.isdigit(): - frameData["frame"] = int(position) - else: - frameData["frame"] = position # "first" or "last" - - return frameData - - -# Node class mappings for ComfyUI registration -NODE_CLASS_MAPPINGS = { - "RunwareFrameImages": RunwareFrameImages, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareFrameImages": "Runware Frame Images", -} diff --git a/modules/imageCaptioning.py b/modules/imageCaptioning.py deleted file mode 100644 index 69caca5..0000000 --- a/modules/imageCaptioning.py +++ /dev/null @@ -1,134 +0,0 @@ -from .utils import runwareUtils as rwUtils - -class imageCaptioning: - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Always Recaption": ("BOOLEAN", { - "default": False, - "tooltip": "Enable this option to always recaption the image each time you run the workflow.", - "label_on": "Enabled", - "label_off": "Disabled", - }), - "prompt": ("STRING", { - "multiline": True, - "default": "Describe this image in detail", - "placeholder": "Enter the prompt for image captioning. You can provide multiple prompts separated by newlines.", - "tooltip": "The prompt(s) to guide the image captioning. Multiple prompts can be provided, each on a new line." - }), - }, - "optional": { - "inputImages": ("IMAGE", { - "tooltip": "Connect multiple Load Image nodes here to caption multiple images at once." - }), - "inputImage": ("IMAGE", { - "tooltip": "Connect a single Load Image node here for convenience. If inputImages is provided, this will be ignored." - }), - "model": ("STRING", { - "default": "", - "placeholder": "Leave empty for default model (runware:150@1)", - "tooltip": "Optional: Specify the AIR model ID (e.g., runware:150@1, runware:150@2). Leave empty to use the default model." - }), - "template": ("STRING", { - "default": "", - "placeholder": "Optional template for structured output", - "tooltip": "Optional template to structure the caption output." - }), - "imageCaption": ("STRING", { - "multiline": True, - "placeholder": "Generated image caption will appear here automatically.", - "tooltip": "This field will be automatically populated with the generated image caption." - }), - }, - "hidden": { "node_id": "UNIQUE_ID" } - } - - DESCRIPTION = "Advanced image captioning with support for multiple images, custom prompts, and model selection. Generate descriptive text from single or multiple images using customizable prompts and optional AIR models. Perfect for batch processing and structured output generation." - - FUNCTION = "imageCaptioning" - RETURN_TYPES = ("STRING",) - RETURN_NAMES = ("IMAGE PROMPT",) - CATEGORY = "Runware" - OUTPUT_NODE = True - - @classmethod - def IS_CHANGED(s, **kwargs): - alwaysRecaption = kwargs.get("Always Recaption") - if(alwaysRecaption): - return float("NAN") - return True - - def imageCaptioning(self, **kwargs): - inputImages = kwargs.get("inputImages", None) - inputImage = kwargs.get("inputImage", None) - prompt = kwargs.get("prompt", "Describe this image in detail") - model = kwargs.get("model", "") - template = kwargs.get("template", "") - - # Handle multiple prompts - split by newlines - prompt_list = [p.strip() for p in prompt.split('\n') if p.strip()] - if not prompt_list: - prompt_list = ["Describe this image in detail"] - - # Determine which images to use (following SDK logic) - if inputImages is not None: - images_to_process = inputImages - elif inputImage is not None: - # Single image provided via inputImage - convert to array - images_to_process = [inputImage] - else: - raise Exception("Either inputImages or inputImage must be provided") - - # Set inputImage to inputImages[0] if not already provided - actual_input_image = inputImage - if actual_input_image is None and len(images_to_process) > 0: - actual_input_image = images_to_process[0] - - # Convert images to base64 format - converted_images = [] - for img in images_to_process: - converted_images.append(rwUtils.convertTensor2IMG(img)) - - # Create a dictionary with mandatory parameters - task_params = { - "taskType": "imageCaption", - "taskUUID": rwUtils.genRandUUID(), - } - - # Add either inputImage or inputImages, but not both (API requirement) - if len(converted_images) == 1: - # Single image - use inputImage parameter - task_params["inputImage"] = converted_images[0] - else: - # Multiple images - use inputImages parameter - task_params["inputImages"] = converted_images - - # Add model parameter only if specified - backend handles default - if model and model.strip(): - task_params["model"] = model.strip() - - # Add template parameter if specified - if template and template.strip(): - task_params["template"] = template.strip() - # When using template, do NOT include prompt parameter - else: - # Use the provided prompt when no template - task_params["prompt"] = prompt_list - - # Send the task with all applicable parameters - genConfig = [task_params] - genResult = rwUtils.inferenecRequest(genConfig) - print(genResult) - - # Handle multiple results if multiple images were processed - if len(genResult["data"]) > 1: - # Multiple images - combine results - combined_text = "\n\n".join([item["text"] for item in genResult["data"]]) - genText = combined_text - else: - # Single image - genText = genResult["data"][0]["text"] - - rwUtils.sendImageCaption(genText, kwargs.get("node_id")) - return (genText, ) \ No newline at end of file diff --git a/modules/imageInference.py b/modules/imageInference.py deleted file mode 100644 index b123bca..0000000 --- a/modules/imageInference.py +++ /dev/null @@ -1,536 +0,0 @@ -from .utils import runwareUtils as rwUtils -import comfy.model_management - - -class txt2img: - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "positivePrompt": ("STRING", { - "multiline": True, - "placeholder": "Positive Prompt: a text instruction to guide the model on generating the image. It is usually a sentence or a paragraph that provides positive guidance for the task. This parameter is essential to shape the desired results.\n\nYou Can Press (Ctrl + Alt + E) To Enhance The Prompt!", - "tooltip": "Positive Prompt: a text instruction to guide the model on generating the image. You Can Also Press (Ctrl + Alt + E) To Enhance The Prompt!" - }), - "negativePrompt": ("STRING", { - "multiline": True, - "placeholder": "Negative Prompt: a text instruction to guide the model on generating the image. It is usually a sentence or a paragraph that provides negative guidance for the task. This parameter helps to avoid certain undesired results.", - "tooltip": "Negative Prompt: a text instruction to guide the model on generating the image." - }), - "Model": ("RUNWAREMODEL", { - "tooltip": "Connect a Runware Model From Runware Model Node.", - }), - "Multi Inference Mode": ("BOOLEAN", { - "tooltip": "If Enabled the node will skip the image generation process and will only return the Runware Task Object to be used in the Multi Inference Node.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "Prompt Weighting": (["Disabled", "sdEmbeds", "Compel"], { - "default": "Disabled", - "tooltip": "Prompt weighting allows you to adjust how strongly different parts of your prompt influence the generated image.\n\nChoose between \"compel\" notation with advanced weighting operations or \"sdEmbeds\" for simple emphasis adjustments.\n\nCompel Example: \"small+ dog, pixar style\"\n\nsdEmbeds Example: \"(small:2.5) dog, pixar style\"", - }), - "dimensions": ([ - "None", "Square (512x512)", "Square HD (1024x1024)", "Square 2K (2048x2048)", "Portrait 3:4 (768x1024)", - "Portrait 9:16 (576x1024)", "Landscape 4:3 (1024x768)", - "Landscape 16:9 (1024x576)", - "Custom" - ], { - "default": "Square (512x512)", - "tooltip": "Adjust the dimensions of the generated image by specifying its width and height in pixels, or select from the predefined options. Image dimensions must be multiples of 64 (e.g., 512x512, 1024x768). Select 'None' to let the model determine dimensions automatically.", - }), - "width": ("INT", { - "tooltip": "The Width of the image in pixels.", - "default": 512, - "min": 128, - "max": 6048, - "step": 1, - }), - "height": ("INT", { - "tooltip": "The Height of the image in pixels.", - "default": 512, - "min": 128, - "max": 6048, - "step": 1, - }), - "useResolution": ("BOOLEAN", { - "tooltip": "Enable to include resolution parameter in API request. Disable if your model doesn't support resolution.", - "default": False, - }), - "resolution": (["960p", "1080p", "1k", "2k", "4k"], { - "tooltip": "Select a standard resolution for Image Inference. Only used when 'Use Resolution' is enabled.", - "default": "1k", - }), - "useSteps": ("BOOLEAN", { - "tooltip": "Enable to include steps parameter in API request. Disable if your model doesn't support steps (like nano banana).", - "default": False, - }), - "steps": ("INT", { - "tooltip": "The number of steps is the number of iterations the model will perform to generate the image. Only used when 'Use Steps' is enabled.", - "default": 4, - "min": 1, - "max": 100, - }), - "useScheduler": ("BOOLEAN", { - "tooltip": "Enable to include scheduler parameter in API request. Disable if your model doesn't support scheduler.", - "default": False, - }), - "scheduler": (['Default', 'DDIM', 'DDIMScheduler', 'DDPMScheduler', 'DEISMultistepScheduler', 'DPMSolverSinglestepScheduler', 'DPMSolverMultistepScheduler', 'DPMSolverMultistepInverse', 'DPM++', 'DPM++ Karras', 'DPM++ 2M', 'DPM++ 2M Karras', 'DPM++ 2M SDE Karras', 'DPM++ 2M SDE', 'DPM++ 3M', 'DPM++ 3M Karras', 'DPM++ SDE Karras', 'DPM++ SDE', 'EDMEulerScheduler', 'EDMDPMSolverMultistepScheduler', 'Euler', 'EulerDiscreteScheduler', 'Euler Karras', 'Euler a', 'EulerAncestralDiscreteScheduler', 'FlowMatchEulerDiscreteScheduler', 'Heun', 'HeunDiscreteScheduler', 'Heun Karras', 'IPNDMScheduler', 'KDPM2DiscreteScheduler', 'KDPM2AncestralDiscreteScheduler', 'LCM', 'LCMScheduler', 'LMS', 'LMSDiscreteScheduler', 'LMS Karras', 'PNDMScheduler', 'TCDScheduler', 'UniPC', 'UniPCMultistepScheduler', 'UniPC Karras', 'UniPC 2M', 'UniPC 2M Karras', 'UniPC 3M', 'UniPC 3M Karras'], { - "tooltip": "An scheduler is a component that manages the inference process. Different schedulers can be used to achieve different results like more detailed images, faster inference, or more accurate results.", - "default": "Default", - }), - "useCFGScale": ("BOOLEAN", { - "tooltip": "Enable to include CFG scale parameter in API request. Disable if your model doesn't support CFG scale (like nano banana).", - "default": False, - }), - "cfgScale": ("FLOAT", { - "tooltip": "Guidance scale represents how closely the images will resemble the prompt or how much freedom the AI model has. Only used when 'Use CFG Scale' is enabled.", - "default": 6.5, - "min": 1.0, - "max": 50.0, - "step": 0.5, - }), - "useSeed": ("BOOLEAN", { - "tooltip": "Enable to include seed parameter in API request. Disable if your model doesn't support seed.", - "default": False, - }), - "seed": ("INT", { - "tooltip": "A value used to randomize the image generation. If you want to make images reproducible (generate the same image multiple times), you can use the same seed value.", - "default": 1, - "min": 1, - "max": 2147483647, - }), - "useClipSkip": ("BOOLEAN", { - "tooltip": "Enable to include clipSkip parameter in API request. Disable if your model doesn't support clipSkip.", - "default": False, - }), - "clipSkip": ("INT", { - "tooltip": "Enables skipping layers of the CLIP embedding process, leading to quicker and more varied image generation. Only used when 'Use Clip Skip' is enabled.", - "default": 0, - "min": 0, - "max": 2, - }), - "strength": ("FLOAT", { - "tooltip": "When doing Image-to-Image or Inpainting, this parameter is used to determine the influence of the seedImage image in the generated output. A lower value results in more influence from the original image, while a higher value allows more creative deviation.", - "default": 0.8, - "min": 0.0, - "max": 1.0, - "step": 0.01, - }), - "Mask Margin": ("BOOLEAN", { - "tooltip": "Enables Or Disables Mask Margin Feature.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "maskMargin": ("INT", { - "tooltip": "Adds extra context pixels around the masked region during inpainting. When this parameter is present, the model will zoom into the masked area, considering these additional pixels to create more coherent and well-integrated details.", - "default": 32, - "min": 32, - "max": 128, - }), - "outputFormat": (["WEBP", "PNG", "JPEG", "TIFF"], { - "tooltip": "Choose the output image format. This will be used for the API request. The actual saved format will match the format returned by the API (visible in imageURL).", - "default": rwUtils.getOutputFormat(), - }), - "batchSize": ("INT", { - "tooltip": "The number of images to generate in a single request.", - "default": 1, - "min": 1, - "max": 10, - }), - "acceleration": (["none", "low", "medium", "high"], { - "tooltip": "Applies optimized acceleration presets that automatically configure multiple generation parameters for the best speed and quality balance. This parameter serves as an abstraction layer that intelligently adjusts acceleratorOptions, steps, scheduler, and other underlying settings.\n\nAvailable values:\n- none: No acceleration applied, uses default parameter values.\n- low: Minimal acceleration with optimized settings for lowest quality loss.\n- medium: Balanced acceleration preset with moderate speed improvements.\n- high: Maximum acceleration with caching and aggressive optimizations for fastest generation.", - "default": "none", - }), - "outputQuality": ("INT", { - "tooltip": "Output quality passed to the API request (0-100).", - "default": rwUtils.OUTPUT_QUALITY, - "min": 0, - "max": 100, - "step": 1, - }), - "useUpscaleFactor": ("BOOLEAN", { - "tooltip": "Enable to include upscaleFactor parameter in API request.", - "default": False, - }), - "upscaleFactor": ([1, 2, 4], { - "tooltip": "Upscale the initially generated image by the given factor. Supported values: 1, 2, or 4.", - "default": 2, - }), - - }, - "optional": { - "Accelerator": ("RUNWAREACCELERATOR", { - "tooltip": "Connect a Runware Accelerator Options Node to configure caching and acceleration settings.", - }), - "Lora": ("RUNWARELORA", { - "tooltip": "Connect a Runware Lora From Lora Search Node Or Lora Combine For Multiple Lora's Together.", - }), - "Outpainting": ("RUNWAREOUTPAINT", { - "tooltip": "Connect a Runware Outpainting Node to extend the image boundaries in different directions.", - }), - "IPAdapters": ("RUNWAREIPAdapter", { - "tooltip": "Connect a Runware IP Adapter node or IP Adapter Combine node to use reference images for guiding the generation.", - }), - "ControlNet": ("RUNWARECONTROLNET", { - "tooltip": "Connect a Runware ControlNet Guidance Node to help the model generate images that align with the desired structure.", - }), - "Refiner": ("RUNWAREREFINER", { - "tooltip": "Connect a Runware Refiner Node to help create higher quality image outputs by incorporating specialized models designed to enhance image details and overall coherence.", - }), - "seedImage": ("IMAGE", { - "tooltip": "Specifies the seed image to be used for the diffusion process, when doing Image-to-Image, Inpainting or Outpainting, this parameter is required.", - }), - "maskImage": ("MASK", { - "tooltip": "Specifies the mask image to be used for the inpainting process, when doing Inpainting, this parameter is required.", - }), - "Embeddings": ("RUNWAREEMBEDDING", { - "tooltip": "Connect a Runware Embedding Node to help the model generate images that align with the desired structure.", - }), - "VAE": ("RUNWAREVAE", { - "tooltip": "Connect a Runware VAE Node to help the model generate images that align with the desired structure.", - }), - "referenceImages": ("RUNWAREREFERENCEIMAGES", { - "tooltip": "Connect a Runware Reference Images Node to provide visual guidance for image generation.", - }), - "inputs": ("RUNWAREIMAGEINFERENCEINPUTS", { - "tooltip": "Connect a Runware Image Inference Inputs Node to provide custom inputs like references for the inference process.", - }), - "providerSettings": ("RUNWAREPROVIDERSETTINGS", { - "tooltip": "Connect a Runware Provider Settings Node to configure provider-specific parameters.", - }), - "safetyInputs": ("RUNWARESAFETYINPUTS", { - "tooltip": "Connect Runware Safety Inputs node to configure safety and content moderation settings.", - }), - "settings": ("RUNWARESETTINGS", { - "tooltip": "Connect Runware Image Inference Settings for temperature, systemPrompt, topP, layers, quality, backgroundMode, backgroundColor, enhancePrompt, scoringPrompt, background, style, search, promptExtend, editRegions (JSON), thinking, thinkingLevel (low/medium/high/xhigh), sequential, colorPalette (via Color Palette node), etc.", - }), - "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 Advanced Feature Input to configure advancedFeatures: layerDiffuse (transparency), hiresFix (two-stage high-res), watermark, and regionalPrompting (per-region prompts and masks).", - }), - } - } - - DESCRIPTION = "Generates Images Lightning Fast With Runware Image Inference Sonic Engine." - FUNCTION = "generateImage" - RETURN_TYPES = ("STRING", "RUNWARETASK") - RETURN_NAMES = ("IMAGE", "RW-Task") - CATEGORY = "Runware" - - @classmethod - def VALIDATE_INPUTS(cls, **kwargs): - positivePrompt = kwargs.get("positivePrompt", "") - negativePrompt = kwargs.get("negativePrompt", "") - settings = kwargs.get("settings") - - structured_prompt = None - if isinstance(settings, dict): - structured_prompt = settings.get("structuredPrompt") - has_structured_prompt = ( - isinstance(structured_prompt, dict) and len(structured_prompt) > 0 - ) - has_positive_prompt = bool( - positivePrompt is not None and str(positivePrompt) != "" - ) - if has_structured_prompt and has_positive_prompt: - return ( - "settings.structuredPrompt and positivePrompt are mutually exclusive. " - "Clear positivePrompt or disconnect Structured Prompt from Settings." - ) - - # Only validate positivePrompt length if it's provided - if positivePrompt and len(positivePrompt) > 10000: - return "Positive Prompt is too long. Maximum length is 10000 characters." - - if negativePrompt and len(negativePrompt) > 10000: - return "Negative Prompt is too long. Maximum length is 10000 characters." - - return True - - def generateImage(self, **kwargs): - runwareModel = kwargs.get("Model") - positivePrompt = kwargs.get("positivePrompt") - negativePrompt = kwargs.get("negativePrompt", None) - multiInferenceMode = kwargs.get("Multi Inference Mode", False) - promptWeighting = kwargs.get("Prompt Weighting", "Disabled") - runwareControlNet = kwargs.get("ControlNet", None) - runwareAccelerator = kwargs.get("Accelerator", None) - runwareLora = kwargs.get("Lora", None) - runwareOutpainting = kwargs.get("Outpainting", None) - runwareIPAdapters = kwargs.get("IPAdapters", None) - runwareRefiner = kwargs.get("Refiner", None) - runwareEmbedding = kwargs.get("Embeddings", None) - runwareVAE = kwargs.get("VAE", None) - referenceImages = kwargs.get("referenceImages", None) - inputs = kwargs.get("inputs", None) - providerSettings = kwargs.get("providerSettings", None) - 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) - enableMaskMargin = kwargs.get("Mask Margin", False) - maskImageMargin = kwargs.get("maskMargin", 32) - clipSkip = kwargs.get("clipSkip", 0) - height = kwargs.get("height", 512) - width = kwargs.get("width", 512) - steps = kwargs.get("steps", 4) - useSteps = kwargs.get("useSteps", False) - scheduler = kwargs.get("scheduler", "Default") - useScheduler = kwargs.get("useScheduler", False) - cfgScale = kwargs.get("cfgScale", 6.5) - useCFGScale = kwargs.get("useCFGScale", False) - seed = kwargs.get("seed") - useSeed = kwargs.get("useSeed", False) - useClipSkip = kwargs.get("useClipSkip", False) - dimensions = kwargs.get("dimensions", "Square (512x512)") - outputFormat = kwargs.get("outputFormat", rwUtils.getOutputFormat()) - batchSize = kwargs.get("batchSize", 1) - outputQuality = kwargs.get("outputQuality", rwUtils.OUTPUT_QUALITY) - acceleration = kwargs.get("acceleration", "none") - useResolution = kwargs.get("useResolution", False) - resolution = kwargs.get("resolution", "1k") - useUpscaleFactor = kwargs.get("useUpscaleFactor", False) - upscaleFactor = kwargs.get("upscaleFactor", 2) - - if (maskImage is not None and seedImage is None): - raise Exception("Mask Image Requires Seed Image To Be Provided!") - - genConfig = [ - { - "taskType": "imageInference", - "taskUUID": rwUtils.genRandUUID(), - "model": runwareModel, - "outputType": "URL", - "outputFormat": outputFormat, - "outputQuality": int(outputQuality), - "numberResults": batchSize, - "deliveryMethod": "async", - } - ] - - # Add positivePrompt only if provided - if positivePrompt is not None and positivePrompt != "": - genConfig[0]["positivePrompt"] = positivePrompt - - - # For Debugging Purposes Only - print(f"[Debugging] Task UUID: {genConfig[0]['taskUUID']}") - - # Add steps, CFGScale, seed, scheduler, clipSkip, and dimensions only if enabled - if useSteps: - genConfig[0]["steps"] = steps - if useCFGScale: - # Extract provider name from model (e.g., "bria:20@1" -> "bria") - provider_name = runwareModel.split(":")[0] if ":" in runwareModel else runwareModel - # Cast to int for Bria models - if provider_name.lower() == "bria": - genConfig[0]["CFGScale"] = int(cfgScale) - else: - genConfig[0]["CFGScale"] = cfgScale - if useSeed: - genConfig[0]["seed"] = seed - if useScheduler: - genConfig[0]["scheduler"] = scheduler - if useClipSkip: - genConfig[0]["clipSkip"] = clipSkip - if dimensions != "None": - genConfig[0]["width"] = width - genConfig[0]["height"] = height - - if (negativePrompt is not None and negativePrompt != ""): - genConfig[0]["negativePrompt"] = negativePrompt - if (promptWeighting != "Disabled"): - if (promptWeighting == "sdEmbeds"): - genConfig[0]["promptWeighting"] = "sdEmbeds" - else: - genConfig[0]["promptWeighting"] = "compel" - if (runwareAccelerator is not None): - genConfig[0]["acceleratorOptions"] = runwareAccelerator - - # Add acceleration if not "none" - if acceleration and acceleration != "none": - genConfig[0]["acceleration"] = acceleration - - # Add resolution if enabled - if useResolution: - genConfig[0]["resolution"] = resolution - - if useUpscaleFactor: - upscaleFactor = int(upscaleFactor) - if upscaleFactor not in (1, 2, 4): - raise ValueError("upscaleFactor must be 1, 2, or 4 when useUpscaleFactor is enabled.") - genConfig[0]["upscaleFactor"] = upscaleFactor - - if (runwareLora is not None): - if (isinstance(runwareLora, list)): - genConfig[0]["lora"] = runwareLora - elif (isinstance(runwareLora, dict)): - genConfig[0]["lora"] = [runwareLora] - if (runwareIPAdapters is not None): - if (isinstance(runwareIPAdapters, list)): - genConfig[0]["ipAdapters"] = runwareIPAdapters - elif (isinstance(runwareIPAdapters, dict)): - genConfig[0]["ipAdapters"] = [runwareIPAdapters] - if (runwareEmbedding is not None): - if (isinstance(runwareEmbedding, list)): - genConfig[0]["embeddings"] = runwareEmbedding - elif (isinstance(runwareEmbedding, dict)): - genConfig[0]["embeddings"] = [runwareEmbedding] - if runwareOutpainting: - genConfig[0]["outpaint"] = runwareOutpainting - if (runwareVAE is not None): - genConfig[0]["vae"] = runwareVAE - if (runwareControlNet is not None): - genConfig[0]["controlNet"] = runwareControlNet - if (runwareRefiner is not None): - genConfig[0]["refiner"] = runwareRefiner - if (seedImage is not None): - seedImage = rwUtils.convertTensor2IMG(seedImage) - genConfig[0]["seedImage"] = seedImage - genConfig[0]["strength"] = seedImageStrength - if (maskImage is not None): - maskImage = rwUtils.convertTensor2IMG(maskImage) - genConfig[0]["maskImage"] = maskImage - if (enableMaskMargin): - genConfig[0]["maskMargin"] = maskImageMargin - - # Handle referenceImages - if referenceImages is not None: - genConfig[0]["referenceImages"] = referenceImages - - # Handle inputs (custom inference inputs) - if inputs is not None: - genConfig[0]["inputs"] = inputs - - # Handle providerSettings - extract provider name from model and merge with custom settings - if providerSettings is not None: - # Extract provider name from model (e.g., "bytedance:1@1" -> "bytedance") - provider_name = runwareModel.split(":")[0] if ":" in runwareModel else runwareModel - - # Special case: model "runware:201@10" uses "alibaba" as provider - if runwareModel == "runware:201@10": - provider_name = "alibaba" - - # If providerSettings is a dictionary, create the correct API format - 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", "xai", "recraft", "sourceful"]): - final_provider_settings = providerSettings - else: - # Otherwise, wrap with the extracted provider name - final_provider_settings = { - provider_name: providerSettings - } - genConfig[0]["providerSettings"] = final_provider_settings - else: - # If it's already in the correct format, use it directly - genConfig[0]["providerSettings"] = providerSettings - - # Add safety inputs if provided - if safetyInputs is not None and isinstance(safetyInputs, dict) and len(safetyInputs) > 0: - genConfig[0]["safety"] = safetyInputs - - # Add settings if provided - if settings is not None and isinstance(settings, dict) and len(settings) > 0: - genConfig[0]["settings"] = settings - - # Add ultralytics parameters if provided - 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: - try: - # Debug: Print the request being sent - print(f"[DEBUG] Sending Image Inference Request:") - print(f"[DEBUG] Request Payload: {rwUtils.safe_json_dumps(genConfig, indent=2)}") - - genResult = rwUtils.inferenecRequest(genConfig) - - # Debug: Print the response received - print(f"[DEBUG] Received Image Inference Response:") - print(f"[DEBUG] Response: {rwUtils.safe_json_dumps(genResult, indent=2)}") - except Exception as e: - # Re-raise the original error without modification - raise e - - # Extract task UUID for polling (async delivery) - taskUUID = genConfig[0]["taskUUID"] - - # Poll for image completion - while True: - # Check for interrupt before each poll - comfy.model_management.throw_exception_if_processing_interrupted() - - # Poll for image result - pollResult = rwUtils.pollVideoResult(taskUUID) # Reuse pollVideoResult as it's generic - print(f"[Debugging] Poll result: {rwUtils.safe_json_dumps(pollResult, indent=2) if isinstance(pollResult, (dict, list)) else pollResult}") - - # Check for errors first - if pollResult and "errors" in pollResult and len(pollResult["errors"]) > 0: - error_info = pollResult["errors"][0] - error_message = error_info.get("message", "Unknown error") - - # Extract more detailed error info if available - if "responseContent" in error_info: - response_content = error_info["responseContent"] - # Handle both string and dict response content - if isinstance(response_content, str): - detailed_message = response_content - elif isinstance(response_content, dict): - detailed_message = response_content.get("message", str(response_content)) - else: - detailed_message = str(response_content) - - if detailed_message: - error_message = f"{error_message}\nProvider Error: {detailed_message}" - - # Include taskUUID for debugging - task_uuid = error_info.get("taskUUID", "unknown") - raise Exception(f"Image generation failed (Task: {task_uuid}): {error_message}") - - if pollResult and "data" in pollResult and len(pollResult["data"]) > 0: - image_data = pollResult["data"][0] - - # Check status directly - if "status" in image_data: - status = image_data["status"] - - if status == "success": - # Check for image data (imageURL, imageBase64Data) - if "imageURL" in image_data or "imageBase64Data" in image_data: - # Extract URLs from all results - image_urls = [] - - for result in pollResult.get("data", []): - imageURL = result.get("imageURL") - if imageURL: - image_urls.append(imageURL) - - # Return URLs as comma-separated string (or single URL) - image_url_str = ",".join(image_urls) if image_urls else "" - - return (image_url_str, None) - - # If status is "processing", continue polling - - # Check for interrupt before waiting - comfy.model_management.throw_exception_if_processing_interrupted() - - # Wait before next poll (split into smaller chunks to allow more frequent interrupt checks) - for _ in range(10): # 10 x 0.1 second = 1 second total - comfy.model_management.throw_exception_if_processing_interrupted() - rwUtils.time.sleep(0.1) \ No newline at end of file diff --git a/modules/imageInferenceAdvancedFeatures.py b/modules/imageInferenceAdvancedFeatures.py deleted file mode 100644 index 698423e..0000000 --- a/modules/imageInferenceAdvancedFeatures.py +++ /dev/null @@ -1,80 +0,0 @@ -from typing import Dict, Any - - -class RunwareImageInferenceAdvancedFeatures: - """Runware Image Advanced Feature Input 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", - }), - "watermark": ("RUNWAREIMAGEWATERMARKADVFEATURE", { - "tooltip": "Connect Runware Watermark Advanced Feature to include watermark configuration in advancedFeatures.watermark.", - }), - "regionalPrompting": ("RUNWAREREGIONALPROMPTINGADVFEATURE", { - "tooltip": "Connect Runware Regional Prompting Advanced Feature to configure regionalPrompting in advancedFeatures.", - }), - }, - } - - RETURN_TYPES = ("RUNWAREIMAGEINFERENCEADVANCEDFEATURES",) - RETURN_NAMES = ("advancedFeatures",) - FUNCTION = "createAdvancedFeatures" - CATEGORY = "Runware" - DESCRIPTION = ( - "Configure advanced features for Runware Image Inference: layerDiffuse (transparency), " - "hiresFix (two-stage high-res), watermark, and regional prompting. " - "Connect to Runware Image Inference advancedFeatures input." - ) - - def createAdvancedFeatures(self, watermark=None, regionalPrompting=None, **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) - - if isinstance(watermark, dict) and watermark: - advanced_features["watermark"] = watermark - - if isinstance(regionalPrompting, dict) and regionalPrompting: - advanced_features["regionalPrompting"] = regionalPrompting - - return (advanced_features,) - - -NODE_CLASS_MAPPINGS = { - "RunwareImageInferenceAdvancedFeatures": RunwareImageInferenceAdvancedFeatures, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareImageInferenceAdvancedFeatures": "Runware Image Advanced Feature Input", -} diff --git a/modules/imageInferenceInputs.py b/modules/imageInferenceInputs.py deleted file mode 100644 index 65b1daa..0000000 --- a/modules/imageInferenceInputs.py +++ /dev/null @@ -1,160 +0,0 @@ -from .utils import runwareUtils as rwUtils - - -class imageInferenceInputs: - """Image Inference Inputs node for configuring image generation inputs""" - - MAX_REFERENCE_IMAGES = 14 - MAX_SUPER_RESOLUTION_REFERENCE_IMAGES = 5 - - @classmethod - def INPUT_TYPES(cls): - optionalInputs = { - "image": ("IMAGE", { - "tooltip": "Specifies an image input for the inference process." - }), - "mask": ("IMAGE", { - "tooltip": "Optional mask image for the inference process." - }), - "seedImage": ("IMAGE", { - "tooltip": "Optional seed image for the inference process" - }), - } - - for i in range(1, cls.MAX_REFERENCE_IMAGES + 1): - ordinal = rwUtils.getOrdinal(i) - optionalInputs[f"Reference Image {i}"] = ("IMAGE", { - "tooltip": f"Specifies {ordinal.capitalize()} Reference Image for the inputs. These reference images help guide the image generation process." - }) - optionalInputs[f"Reference Tag {i}"] = ("STRING", { - "tooltip": f"Optional tag describing {ordinal.capitalize()} Reference Image. Leave empty to omit.", - "default": "", - }) - optionalInputs[f"Reference Role {i}"] = ("STRING", { - "tooltip": f"Optional role for {ordinal} reference image (e.g. person, garment). Leave empty to omit.", - "default": "", - }) - optionalInputs[f"Reference Type {i}"] = ("STRING", { - "tooltip": f"Optional type for {ordinal} reference, e.g. 'sketch' for illustrative style models. Leave empty to omit.", - "default": "", - }) - optionalInputs[f"Reference Strength {i}"] = ("FLOAT", { - "tooltip": f"Strength (0-1) for sketch reference. Only used when Reference Type is 'sketch'.", - "default": 0.0, - "min": 0.0, - "max": 1.0, - "step": 0.1, - }) - - for i in range(1, cls.MAX_SUPER_RESOLUTION_REFERENCE_IMAGES + 1): - ordinal = rwUtils.getOrdinal(i) - optionalInputs[f"Super Resolution Reference Image {i}"] = ("IMAGE", { - "tooltip": f"Specifies {ordinal.capitalize()} Super Resolution Reference Image for the inputs.", - }) - - optionalInputs["Fonts"] = ("RUNWAREIMAGEINFERENCEFONTS", { - "tooltip": "Connect Runware Image Inference Inputs Fonts for inputs.fonts (up to 2 font URL + text references).", - }) - - return { - "required": {}, - "optional": optionalInputs - } - - DESCRIPTION = ( - "Configure custom inputs for Runware Image Inference, including image/mask/seedImage, reference images " - "(with optional tag, role, type e.g. 'sketch' for illustrative style models, and strength 0-1 for sketch), " - "super resolution references, and font references (inputs.fonts)." - ) - FUNCTION = "createInputs" - RETURN_TYPES = ("RUNWAREIMAGEINFERENCEINPUTS",) - RETURN_NAMES = ("Inference Inputs",) - CATEGORY = "Runware" - - def createInputs(self, **kwargs): - """Create image inference inputs from provided parameters""" - image = kwargs.get("image", None) - mask = kwargs.get("mask", None) - seedImage = kwargs.get("seedImage", None) - - inputs = {} - - if image is not None: - inputs["image"] = rwUtils.convertTensor2IMG(image) - if mask is not None: - inputs["mask"] = rwUtils.convertTensor2IMG(mask) - if seedImage is not None: - inputs["seedImage"] = rwUtils.convertTensor2IMG(seedImage) - - references = self._collectReferences(kwargs) - if len(references) > 0: - inputs["referenceImages"] = references - - super_resolution_refs = self._collectSuperResolutionReferences(kwargs) - if len(super_resolution_refs) > 0: - inputs["superResolutionReferenceImages"] = super_resolution_refs - - fonts = kwargs.get("Fonts", None) - if fonts is not None and isinstance(fonts, list) and len(fonts) > 0: - inputs["fonts"] = fonts - - return (inputs,) - - def _collectReferences(self, kwargs): - """Collect and convert reference images to list. Each entry may include type (e.g. 'sketch') and strength (0-1, only for sketch).""" - reference_slots = [] - - for i in range(1, self.MAX_REFERENCE_IMAGES + 1): - image = kwargs.get(f"Reference Image {i}", None) - tag = kwargs.get(f"Reference Tag {i}", "") - role = kwargs.get(f"Reference Role {i}", "") - ref_type = kwargs.get(f"Reference Type {i}", "") - strength = kwargs.get(f"Reference Strength {i}", 0.0) - if image is not None: - reference_slots.append((image, tag, role, ref_type, strength)) - - if not reference_slots: - return [] - - has_tags = any( - isinstance(tag, str) and tag.strip() != "" - for _, tag, _, _, _ in reference_slots - ) - has_roles = any( - isinstance(role, str) and role.strip() != "" - for _, _, role, _, _ in reference_slots - ) - has_type = any( - isinstance(rt, str) and rt.strip() != "" - for _, _, _, rt, _ in reference_slots - ) - - if not has_tags and not has_roles and not has_type: - return [ - rwUtils.convertTensor2IMG(image) - for image, _, _, _, _ in reference_slots - ] - - references = [] - for image, tag, role, ref_type, strength in reference_slots: - entry = {"image": rwUtils.convertTensor2IMG(image)} - if isinstance(tag, str) and tag.strip() != "": - entry["tag"] = tag.strip() - if isinstance(role, str) and role.strip() != "": - entry["role"] = role.strip() - if isinstance(ref_type, str) and ref_type.strip() != "": - entry["type"] = ref_type.strip() - if ref_type.strip().lower() == "sketch": - entry["strength"] = max(0.0, min(1.0, float(strength))) - references.append(entry) - - return references - - def _collectSuperResolutionReferences(self, kwargs): - """Collect and convert super resolution reference images to list (same pattern as referenceImages)""" - images = [] - for i in range(1, self.MAX_SUPER_RESOLUTION_REFERENCE_IMAGES + 1): - image = kwargs.get(f"Super Resolution Reference Image {i}", None) - if image is not None: - images.append(rwUtils.convertTensor2IMG(image)) - return images diff --git a/modules/imageInferenceInputsFonts.py b/modules/imageInferenceInputsFonts.py deleted file mode 100644 index ce240c5..0000000 --- a/modules/imageInferenceInputsFonts.py +++ /dev/null @@ -1,60 +0,0 @@ -""" -Runware Image Inference Inputs Fonts node. -Builds inputs.fonts for image inference (up to 2 font references with url and text). -""" - -from typing import Any, Dict, List, Tuple - - -class RunwareImageInferenceInputsFonts: - """Build inputs.fonts[] for image inference requests.""" - - MAX_FONTS = 2 - - @classmethod - def INPUT_TYPES(cls): - optional_inputs = {} - for i in range(1, cls.MAX_FONTS + 1): - optional_inputs[f"fontUrl{i}"] = ("STRING", { - "default": "", - "tooltip": ( - f"Font file URL for reference {i}. Must be ttf, otf, woff, or woff2. " - "Included when both fontUrl and text are non-empty." - ), - }) - optional_inputs[f"text{i}"] = ("STRING", { - "multiline": True, - "default": "", - "tooltip": f"Text to render with font reference {i}. Included when both fontUrl and text are non-empty.", - }) - - return { - "required": {}, - "optional": optional_inputs, - } - - RETURN_TYPES = ("RUNWAREIMAGEINFERENCEFONTS",) - RETURN_NAMES = ("fonts",) - FUNCTION = "create_fonts" - CATEGORY = "Runware" - DESCRIPTION = ( - "Configure inputs.fonts for Runware Image Inference (up to 2 entries). " - "Each entry: { \"url\": \"\", \"text\": \"\" }. " - "A slot is included only when both fontUrl and text are non-empty. " - "Connect to Runware Image Inference Inputs." - ) - - def create_fonts(self, **kwargs) -> Tuple[List[Dict[str, Any]]]: - fonts: List[Dict[str, Any]] = [] - - for i in range(1, self.MAX_FONTS + 1): - font_url = (kwargs.get(f"fontUrl{i}") or "").strip() - text = (kwargs.get(f"text{i}") or "").strip() - - if len(font_url) > 0 and len(text) > 0: - fonts.append({ - "url": font_url, - "text": text, - }) - - return (fonts,) diff --git a/modules/imageInferenceSettingsColorPalette.py b/modules/imageInferenceSettingsColorPalette.py deleted file mode 100644 index 753c3ef..0000000 --- a/modules/imageInferenceSettingsColorPalette.py +++ /dev/null @@ -1,59 +0,0 @@ -""" -Runware Image Inference Settings Color Palette -Builds settings.colorPalette: list of { "hex": "#...", "ratio": "NN.NN%" } for Runware Image Inference Settings. -""" - -from typing import Any, Dict, List, Tuple - - -class RunwareImageInferenceSettingsColorPalette: - """Up to 8 hex/ratio pairs; each slot is included only when use_{i} is enabled.""" - - _SLOTS = 8 - - @classmethod - def INPUT_TYPES(cls): - optional: Dict[str, tuple] = {} - for i in range(1, cls._SLOTS + 1): - optional[f"use_{i}"] = ("BOOLEAN", { - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - "tooltip": f"Include swatch {i} in the output colorPalette.", - }) - optional[f"hex_{i}"] = ("STRING", { - "default": "", - "tooltip": f"Swatch {i} hex, e.g. #C2D1E6. Required when use_{i} is enabled.", - }) - optional[f"ratio_{i}"] = ("STRING", { - "default": "", - "tooltip": f"Swatch {i} ratio, e.g. 23.51%%. Optional.", - }) - return {"required": {}, "optional": optional} - - RETURN_TYPES = ("RUNWAREIMAGEINFERENCECOLORPALETTE",) - RETURN_NAMES = ("colorPalette",) - FUNCTION = "build_palette" - CATEGORY = "Runware" - DESCRIPTION = ( - "Build a colorPalette list for image inference settings (hex + optional ratio per swatch). " - "Enable use_1…use_8 for each swatch to include; connect the output to Runware Image Inference Settings." - ) - - def build_palette(self, **kwargs) -> Tuple[List[Dict[str, Any]]]: - out: List[Dict[str, Any]] = [] - for i in range(1, self._SLOTS + 1): - if not kwargs.get(f"use_{i}", False): - continue - hx = str(kwargs.get(f"hex_{i}") or "").strip() - if not hx: - raise ValueError( - f"use_{i} is enabled but hex_{i} is empty or invalid. " - "Provide a hex color (e.g. #C2D1E6) or disable this swatch." - ) - ratio = str(kwargs.get(f"ratio_{i}") or "").strip() - entry: Dict[str, Any] = {"hex": hx} - if ratio: - entry["ratio"] = ratio - out.append(entry) - return (out,) diff --git a/modules/imageInferenceSettingsMoodboards.py b/modules/imageInferenceSettingsMoodboards.py deleted file mode 100644 index 3995198..0000000 --- a/modules/imageInferenceSettingsMoodboards.py +++ /dev/null @@ -1,56 +0,0 @@ -""" -Runware Image Inference Settings Moodboards -Builds settings.moodboards: list of { "id": "", "strength": }. -""" - -from typing import Any, Dict, List, Tuple - - -class RunwareImageInferenceSettingsMoodboards: - """Build moodboards list for image inference settings.""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "id": ("STRING", { - "default": "", - "tooltip": "Moodboard UUID (settings.moodboards[].id).", - }), - }, - "optional": { - "useStrength": ("BOOLEAN", { - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - "tooltip": "Include strength in moodboards entry.", - }), - "strength": ("FLOAT", { - "default": 0.35, - "min": -0.5, - "max": 1.5, - "step": 0.01, - "tooltip": "Moodboard strength (-0.5 to 1.5). Only used when useStrength is enabled.", - }), - }, - } - - RETURN_TYPES = ("RUNWAREIMAGEINFERENCEMOODBOARDS",) - RETURN_NAMES = ("moodboards",) - FUNCTION = "build_moodboards" - CATEGORY = "Runware" - DESCRIPTION = ( - "Build settings.moodboards for image inference settings. " - "Outputs one-element array with required id and optional strength." - ) - - def build_moodboards(self, **kwargs) -> Tuple[List[Dict[str, Any]]]: - moodboard_id = str(kwargs.get("id") or "").strip() - if not moodboard_id: - return ([],) - - entry: Dict[str, Any] = {"id": moodboard_id} - if kwargs.get("useStrength", False): - entry["strength"] = float(kwargs.get("strength", 0.35)) - - return ([entry],) diff --git a/modules/imageInferenceSettingsPromptEnhance.py b/modules/imageInferenceSettingsPromptEnhance.py deleted file mode 100644 index 929d163..0000000 --- a/modules/imageInferenceSettingsPromptEnhance.py +++ /dev/null @@ -1,103 +0,0 @@ -""" -Runware Image Inference Settings Prompt Enhance -Builds settings.promptEnhance for image inference (e.g. Ernie). -Connect the output to Runware Image Inference Settings → promptEnhance. -""" - -from typing import Any, Dict, Tuple - - -class RunwareImageInferenceSettingsPromptEnhance: - """Build settings.promptEnhance object (enabled, temperature, topP).""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useTemperature": ("BOOLEAN", { - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - "tooltip": "Include temperature in settings.promptEnhance.", - }), - "temperature": ("FLOAT", { - "default": 1.2, - "min": 0.1, - "max": 5.0, - "step": 0.1, - "tooltip": ( - "settings.promptEnhance.temperature (0.1–5). " - "Ernie-specific API default when omitted: 0.6." - ), - }), - "useTopP": ("BOOLEAN", { - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - "tooltip": "Include topP in settings.promptEnhance.", - }), - "topP": ("FLOAT", { - "default": 0.95, - "min": 0.1, - "max": 1.0, - "step": 0.01, - "tooltip": ( - "settings.promptEnhance.topP (0.1–1). " - "Ernie-specific API default when omitted: 0.95." - ), - }), - "useEnabled": ("BOOLEAN", { - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - "tooltip": "Include enabled in settings.promptEnhance.", - }), - "enabled": ("BOOLEAN", { - "default": True, - "label_on": "true", - "label_off": "false", - "tooltip": ( - "settings.promptEnhance.enabled. Required when using temperature or topP. " - "Only used when 'Use Enabled' is on." - ), - }), - }, - } - - RETURN_TYPES = ("RUNWAREIMAGEINFERENCEPROMPTENHANCE",) - RETURN_NAMES = ("promptEnhance",) - FUNCTION = "build_prompt_enhance" - CATEGORY = "Runware" - DESCRIPTION = ( - "Build settings.promptEnhance (enabled, temperature, topP) for image inference. " - "Connect to Runware Image Inference Settings." - ) - - def build_prompt_enhance(self, **kwargs) -> Tuple[Dict[str, Any]]: - prompt_enhance: Dict[str, Any] = {} - - if kwargs.get("useEnabled", False): - prompt_enhance["enabled"] = bool(kwargs.get("enabled", True)) - - if kwargs.get("useTemperature", False): - prompt_enhance["temperature"] = float(kwargs.get("temperature", 1.2)) - - if kwargs.get("useTopP", False): - prompt_enhance["topP"] = float(kwargs.get("topP", 0.95)) - - if prompt_enhance and "enabled" not in prompt_enhance and ( - "temperature" in prompt_enhance or "topP" in prompt_enhance - ): - prompt_enhance["enabled"] = True - - return (prompt_enhance,) - - -NODE_CLASS_MAPPINGS = { - "RunwareImageInferenceSettingsPromptEnhance": RunwareImageInferenceSettingsPromptEnhance, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareImageInferenceSettingsPromptEnhance": "Runware Image Inference Settings Prompt Enhance", -} diff --git a/modules/imageInferenceSettingsScoringRubric.py b/modules/imageInferenceSettingsScoringRubric.py deleted file mode 100644 index 6d19b75..0000000 --- a/modules/imageInferenceSettingsScoringRubric.py +++ /dev/null @@ -1,171 +0,0 @@ -""" -Runware Image Inference Settings Scoring Rubric -Builds settings.scoringRubric[] for Riverflow 2.5 (1–8 dimensions). -""" - -from typing import Any, Dict, List, Tuple - -_MAX_SCORE_GUIDANCE = 5 -_MAX_RUBRIC_COMBINE = 4 - - -def _build_score_guidance(kwargs: Dict[str, Any]) -> List[Dict[str, Any]]: - guidance: List[Dict[str, Any]] = [] - - for i in range(1, _MAX_SCORE_GUIDANCE + 1): - if not kwargs.get(f"useScoreGuidance{i}", False): - continue - - score = kwargs.get(f"score{i}") - description = (kwargs.get(f"guidanceDescription{i}") or "").strip() - if score is None or not description: - continue - - guidance.append({ - "score": float(score), - "description": description, - }) - - return guidance - - -def _build_rubric_entry(kwargs: Dict[str, Any]) -> Dict[str, Any]: - entry: Dict[str, Any] = { - "key": (kwargs.get("key") or "").strip(), - "label": (kwargs.get("label") or "").strip(), - "description": (kwargs.get("description") or "").strip(), - "weight": float(kwargs.get("weight", 1.0)), - } - - if kwargs.get("usePassingScore", False): - entry["passingScore"] = float(kwargs.get("passingScore", 0.0)) - - guidance = _build_score_guidance(kwargs) - if guidance: - entry["scoreGuidance"] = guidance - - return entry - - -class RunwareImageInferenceSettingsScoringRubric: - """Build one scoringRubric dimension for settings.scoringRubric.""" - - @classmethod - def INPUT_TYPES(cls): - optional: Dict[str, tuple] = { - "usePassingScore": ("BOOLEAN", { - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - "tooltip": "Include passingScore for this scoring dimension.", - }), - "passingScore": ("FLOAT", { - "default": 0.5, - "min": 0.0, - "max": 1.0, - "step": 0.01, - "tooltip": "Optional dimension floor from 0 to 1. Only used when usePassingScore is enabled.", - }), - } - - for i in range(1, _MAX_SCORE_GUIDANCE + 1): - optional[f"useScoreGuidance{i}"] = ("BOOLEAN", { - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - "tooltip": f"Include scoreGuidance anchor {i} (up to {_MAX_SCORE_GUIDANCE} per dimension).", - }) - optional[f"score{i}"] = ("FLOAT", { - "default": 0.0, - "min": 0.0, - "max": 1.0, - "step": 0.01, - "tooltip": f"Normalized score anchor (0–1) for scoreGuidance entry {i}.", - }) - optional[f"guidanceDescription{i}"] = ("STRING", { - "multiline": True, - "default": "", - "tooltip": f"What score anchor {i} means for the judge.", - }) - - return { - "required": { - "key": ("STRING", { - "default": "", - "tooltip": "Unique machine-readable dimension key (e.g. composition, lighting).", - }), - "label": ("STRING", { - "default": "", - "tooltip": "Short human-readable dimension label.", - }), - "description": ("STRING", { - "multiline": True, - "default": "", - "tooltip": "Judging criteria for this score dimension.", - }), - "weight": ("FLOAT", { - "default": 1.0, - "min": 0.01, - "max": 100.0, - "step": 0.01, - "tooltip": "Positive scoring weight. Weights are normalized internally.", - }), - }, - "optional": optional, - } - - RETURN_TYPES = ("RUNWAREIMAGEINFERENCESCORINGRUBRIC",) - RETURN_NAMES = ("scoringRubric",) - FUNCTION = "build_scoring_rubric" - CATEGORY = "Runware" - DESCRIPTION = ( - "Define one settings.scoringRubric[] dimension for Riverflow 2.5 (key, label, description, weight, " - "optional passingScore and up to 5 scoreGuidance anchors). Connect to Runware Image Inference Settings, " - "or use Runware Image Inference Settings Scoring Rubric Combine for up to 4 dimensions." - ) - - def build_scoring_rubric(self, **kwargs) -> Tuple[List[Dict[str, Any]]]: - return ([_build_rubric_entry(kwargs)],) - - -class RunwareImageInferenceSettingsScoringRubricCombine: - """Combine up to 4 Scoring Rubric node outputs into settings.scoringRubric.""" - - @classmethod - def INPUT_TYPES(cls): - optional: Dict[str, tuple] = {} - for i in range(2, _MAX_RUBRIC_COMBINE + 1): - optional[f"Scoring Rubric {i}"] = ("RUNWAREIMAGEINFERENCESCORINGRUBRIC", { - "tooltip": f"Optional scoring rubric dimension {i} (connect Runware Image Inference Settings Scoring Rubric).", - }) - - return { - "required": { - "Scoring Rubric 1": ("RUNWAREIMAGEINFERENCESCORINGRUBRIC", { - "tooltip": "First scoring rubric dimension (connect Runware Image Inference Settings Scoring Rubric).", - }), - }, - "optional": optional, - } - - RETURN_TYPES = ("RUNWAREIMAGEINFERENCESCORINGRUBRIC",) - RETURN_NAMES = ("scoringRubric",) - FUNCTION = "combine_scoring_rubric" - CATEGORY = "Runware" - DESCRIPTION = ( - "Combine up to 4 Runware Image Inference Settings Scoring Rubric outputs into settings.scoringRubric. " - "Connect scoringRubric to Runware Image Inference Settings." - ) - - def combine_scoring_rubric(self, **kwargs) -> Tuple[List[Dict[str, Any]]]: - combined: List[Dict[str, Any]] = [] - - for i in range(1, _MAX_RUBRIC_COMBINE + 1): - chunk = kwargs.get(f"Scoring Rubric {i}") - if chunk is not None and isinstance(chunk, list): - combined.extend( - entry for entry in chunk - if isinstance(entry, dict) and len(entry) > 0 - ) - - return (combined,) diff --git a/modules/imageInferenceSettingsStructuredPrompt.py b/modules/imageInferenceSettingsStructuredPrompt.py deleted file mode 100644 index bae80a1..0000000 --- a/modules/imageInferenceSettingsStructuredPrompt.py +++ /dev/null @@ -1,216 +0,0 @@ -""" -Runware Image Inference Settings Structured Prompt -Builds settings.structuredPrompt for Ideogram 4.0 and compatible models. -Connect the output to Runware Image Inference Settings → structuredPrompt. -Mutually exclusive with positivePrompt at the API level. -""" - -import json -from typing import Any, Dict, List, Tuple - - -class RunwareImageInferenceSettingsStructuredPrompt: - """Ideogram-style structured JSON prompt for image inference settings.""" - - _ELEMENT_SLOTS = 8 - - @classmethod - def INPUT_TYPES(cls): - optional: Dict[str, tuple] = { - "background": ("STRING", { - "multiline": True, - "default": "", - "tooltip": "compositional_deconstruction.background — setting/surface/atmosphere, not discrete subjects.", - }), - "useStyleDescription": ("BOOLEAN", { - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - "tooltip": "Include style_description from JSON below.", - }), - "style_description": ("STRING", { - "multiline": True, - "default": "", - "tooltip": "style_description object as JSON (aesthetics, lighting, photo OR art_style, medium, color_palette). Only when 'Use Style Description' is enabled.", - }), - "useElementsJson": ("BOOLEAN", { - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - "tooltip": "Set elements from a JSON array instead of element slots 1–8.", - }), - "elementsJson": ("STRING", { - "multiline": True, - "default": "", - "tooltip": "JSON array of element objects ({type, desc, text?, bbox?, color_palette?}). Only when 'Use Elements JSON' is enabled.", - }), - } - - for i in range(1, cls._ELEMENT_SLOTS + 1): - optional[f"use_element_{i}"] = ("BOOLEAN", { - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - "tooltip": f"Include element slot {i} in compositional_deconstruction.elements.", - }) - optional[f"element_type_{i}"] = (["obj", "text"], { - "default": "obj", - "tooltip": f"Element {i} type: obj (desc interpreted) or text (text rendered literally).", - }) - optional[f"element_desc_{i}"] = ("STRING", { - "multiline": True, - "default": "", - "tooltip": f"Element {i} desc — natural language treatment/position notes.", - }) - optional[f"element_text_{i}"] = ("STRING", { - "multiline": True, - "default": "", - "tooltip": f"Element {i} text — literal copy for type text only.", - }) - optional[f"element_bbox_{i}"] = ("STRING", { - "default": "", - "tooltip": f"Element {i} optional bbox JSON: [y_min, x_min, y_max, x_max] in 0–1000 coords.", - }) - optional[f"element_color_palette_{i}"] = ("STRING", { - "default": "", - "tooltip": f"Element {i} optional hex colours, comma-separated (e.g. #1F3B26,#7A5A2F).", - }) - - required = { - "high_level_description": ("STRING", { - "multiline": True, - "default": "", - "tooltip": "Global scene summary (required).", - }), - } - return {"required": required, "optional": optional} - - RETURN_TYPES = ("RUNWAREIMAGEINFERENCESTRUCTUREDPROMPT",) - RETURN_NAMES = ("structuredPrompt",) - FUNCTION = "build_structured_prompt" - CATEGORY = "Runware" - DESCRIPTION = ( - "Build settings.structuredPrompt for Ideogram 4.0 (snake_case schema) from " - "high_level_description, background, style_description, and elements. " - "Connect to Runware Image Inference Settings. Do not send positivePrompt in the same request." - ) - - @staticmethod - def _parse_json_object(raw: str, field_name: str) -> Dict[str, Any]: - text = (raw or "").strip() - if not text: - raise ValueError(f"{field_name} is empty.") - try: - parsed = json.loads(text) - except json.JSONDecodeError as e: - raise ValueError(f"{field_name} must be valid JSON: {e}") from e - if not isinstance(parsed, dict): - raise ValueError(f"{field_name} must be a JSON object.") - return parsed - - @staticmethod - def _parse_json_array(raw: str, field_name: str) -> List[Any]: - text = (raw or "").strip() - if not text: - raise ValueError(f"{field_name} is empty.") - try: - parsed = json.loads(text) - except json.JSONDecodeError as e: - raise ValueError(f"{field_name} must be valid JSON: {e}") from e - if not isinstance(parsed, list): - raise ValueError(f"{field_name} must be a JSON array.") - return parsed - - @classmethod - def _build_element_from_slot(cls, kwargs: Dict[str, Any], index: int) -> Dict[str, Any]: - el_type = str(kwargs.get(f"element_type_{index}", "obj")).strip() or "obj" - if el_type not in ("obj", "text"): - raise ValueError(f"element_type_{index} must be obj or text.") - - element: Dict[str, Any] = {"type": el_type} - - desc = str(kwargs.get(f"element_desc_{index}") or "").strip() - if desc: - element["desc"] = desc - - if el_type == "text": - text = str(kwargs.get(f"element_text_{index}") or "").strip() - if text: - element["text"] = text - - bbox_raw = str(kwargs.get(f"element_bbox_{index}") or "").strip() - if bbox_raw: - try: - bbox = json.loads(bbox_raw) - except json.JSONDecodeError as e: - raise ValueError(f"element_bbox_{index} must be valid JSON: {e}") from e - if not isinstance(bbox, list): - raise ValueError(f"element_bbox_{index} must be a JSON array.") - element["bbox"] = bbox - - palette_raw = str(kwargs.get(f"element_color_palette_{index}") or "").strip() - if palette_raw: - palette = [h.strip() for h in palette_raw.split(",") if h.strip()] - if palette: - element["color_palette"] = palette - - if el_type == "text" and "text" not in element and not desc: - raise ValueError( - f"Element slot {index}: type text requires element_text_{index} or element_desc_{index}." - ) - if el_type == "obj" and not desc: - raise ValueError(f"Element slot {index}: type obj requires element_desc_{index}.") - - return element - - @classmethod - def _collect_elements(cls, kwargs: Dict[str, Any]) -> List[Dict[str, Any]]: - if kwargs.get("useElementsJson", False): - return cls._parse_json_array( - kwargs.get("elementsJson", ""), - "elementsJson", - ) - - elements: List[Dict[str, Any]] = [] - for i in range(1, cls._ELEMENT_SLOTS + 1): - if not kwargs.get(f"use_element_{i}", False): - continue - elements.append(cls._build_element_from_slot(kwargs, i)) - return elements - - def build_structured_prompt(self, **kwargs) -> Tuple[Dict[str, Any]]: - hld = str(kwargs.get("high_level_description") or "").strip() - if not hld: - raise ValueError("high_level_description is required.") - - structured: Dict[str, Any] = {"high_level_description": hld} - - if kwargs.get("useStyleDescription", False): - style_raw = kwargs.get("style_description", "") - structured["style_description"] = self._parse_json_object( - style_raw, - "style_description", - ) - - comp: Dict[str, Any] = {} - background = str(kwargs.get("background") or "").strip() - if background: - comp["background"] = background - - elements = self._collect_elements(kwargs) - if elements: - comp["elements"] = elements - - if comp: - structured["compositional_deconstruction"] = comp - - return (structured,) - - -NODE_CLASS_MAPPINGS = { - "RunwareImageInferenceSettingsStructuredPrompt": RunwareImageInferenceSettingsStructuredPrompt, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareImageInferenceSettingsStructuredPrompt": "Runware Image Inference Settings Structured Prompt", -} diff --git a/modules/imageMasking.py b/modules/imageMasking.py deleted file mode 100644 index a8c5917..0000000 --- a/modules/imageMasking.py +++ /dev/null @@ -1,101 +0,0 @@ -from .utils import runwareUtils as rwUtils - - -class imageMasking: - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Image": ("IMAGE", { - "tooltip": "Specifies the input image to be processed for mask generation." - }), - "Detection Model": ([ - "face_yolov8n", "face_yolov8s", "mediapipe_face_full", "mediapipe_face_short", "mediapipe_face_mesh", - "mediapipe_face_mesh_eyes_only", "eyes_mesh_mediapipe", "nose_mesh_mediapipe", "lips_mesh_mediapipe", - "eyes_lips_mesh", "nose_eyes_mesh", "nose_lips_mesh", "hand_yolov8n", "person_yolov8n-seg", "person_yolov8s-seg" - ], { - "tooltip": "Specifies the specialized detection model to use for mask generation.", - "default": "face_yolov8n", - }), - "Confidence": ("FLOAT", { - "tooltip": "Confidence threshold for detections. Only detections with confidence scores above this threshold will be included in the mask.", - "default": 0.25, - "min": 0, - "max": 1, - "step": 0.01, - }), - "Max Detections": ("INT", { - "tooltip": "Limits the maximum number of elements (faces, hands, or people) that will be detected and masked in the image. If there are more elements than this value, only the ones with highest confidence scores will be included.", - "default": 6, - "min": 1, - "max": 20, - }), - "Mask Padding": ("INT", { - "tooltip": "Extends or reduces the detected mask area by the specified number of pixels. Positive values create a larger masked region (useful when you want to ensure complete coverage of the element), while negative values shrink the mask (useful for tighter, more focused areas).", - "default": 4, - "min": -40, - "max": 40, - }), - "Mask Blur": ("INT", { - "tooltip": "Extends the mask by the specified number of pixels with a gradual fade-out effect, creating smooth transitions between masked and unmasked regions in the final result.", - "default": 4, - "min": 0, - "max": 20, - }), - }, - } - - DESCRIPTION = "Image Masking provides intelligent detection and mask generation for specific elements in images, particularly optimized for faces, hands, and people. Built on advanced detection models, this feature enhances the inpainting workflow by automatically creating precise masks around detected elements, enabling targeted enhancement and detailing." - - FUNCTION = "imageMasking" - RETURN_TYPES = ("IMAGE", "STRING", "STRING") - RETURN_NAMES = ("Image", "Mask Preview", "Mask") - CATEGORY = "Runware" - - def imageMasking(self, **kwargs): - image = kwargs.get("Image") - detectionModel = kwargs.get("Detection Model") - confidence = kwargs.get("Confidence") - maxDetections = kwargs.get("Max Detections") - maskPadding = kwargs.get("Mask Padding") - maskBlur = kwargs.get("Mask Blur") - - model_mapping = { - "face_yolov8n": "runware:35@1", - "face_yolov8s": "runware:35@2", - "mediapipe_face_full": "runware:35@6", - "mediapipe_face_short": "runware:35@7", - "mediapipe_face_mesh": "runware:35@8", - "mediapipe_face_mesh_eyes_only": "runware:35@9", - "eyes_mesh_mediapipe": "runware:35@15", - "nose_mesh_mediapipe": "runware:35@13", - "lips_mesh_mediapipe": "runware:35@14", - "eyes_lips_mesh": "runware:35@10", - "nose_eyes_mesh": "runware:35@11", - "nose_lips_mesh": "runware:35@12", - "hand_yolov8n": "runware:35@3", - "person_yolov8n-seg": "runware:35@4", - "person_yolov8s-seg": "runware:35@5" - } - detectionModel = model_mapping.get(detectionModel, detectionModel) - - genConfig = [ - { - "taskType": "imageMasking", - "taskUUID": rwUtils.genRandUUID(), - "inputImage": rwUtils.convertTensor2IMG(image), - "model": detectionModel, - "confidence": confidence, - "maxDetections": maxDetections, - "outputType": "URL", - "outputFormat": rwUtils.OUTPUT_FORMAT, - "outputQuality": rwUtils.OUTPUT_QUALITY, - } - ] - - genConfig[0]["maskPadding"] = maskPadding - genConfig[0]["maskBlur"] = maskBlur - - genResult = rwUtils.inferenecRequest(genConfig) - image_url = rwUtils.extractImageURLs(genResult) - return (image, image_url, image_url) diff --git a/modules/imageRegionalPromptingAdvancedFeature.py b/modules/imageRegionalPromptingAdvancedFeature.py deleted file mode 100644 index 5fdfa8c..0000000 --- a/modules/imageRegionalPromptingAdvancedFeature.py +++ /dev/null @@ -1,80 +0,0 @@ -from typing import Dict, Any, Tuple - - -class RunwareRegionalPromptingAdvancedFeature: - """ - Runware Regional Prompting Advanced Feature Node - - Builds the advancedFeatures.regionalPrompting configuration object: - - injectSteps - - backgroundPrompt - - baseRatio - - regions (connected from the Regions node) - """ - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "injectSteps": ("INT", { - "tooltip": "Steps to inject regional masks (1-100).", - "default": 15, - "min": 1, - "max": 100, - }), - "backgroundPrompt": ("STRING", { - "tooltip": "Background prompt applied to uncovered areas.", - "default": "", - }), - "baseRatio": ("FLOAT", { - "tooltip": "Base prompt attention weight (0.0 - 1.0).", - "default": 0.2, - "min": 0.0, - "max": 1.0, - "step": 0.01, - }), - "regions": ("RUNWAREREGIONALPROMPTINGREGIONS", { - "tooltip": "Connect Runware Regional Prompting Advanced Feature Regions node to define regional prompts and masks.", - }), - }, - } - - RETURN_TYPES: Tuple[str] = ("RUNWAREREGIONALPROMPTINGADVFEATURE",) - RETURN_NAMES = ("regionalPrompting",) - FUNCTION = "createRegionalPrompting" - CATEGORY = "Runware" - DESCRIPTION = ( - "Configure regional prompting advanced feature (injectSteps, backgroundPrompt, " - "baseRatio, and regions). Connect output to Runware Image Advanced Feature Input " - "regionalPrompting input." - ) - - def createRegionalPrompting(self, regions=None, **kwargs) -> tuple: - """Build regionalPrompting dict for advancedFeatures.regionalPrompting.""" - inject_steps = int(kwargs.get("injectSteps", 15)) - base_ratio = float(kwargs.get("baseRatio", 0.2)) - background_prompt = (kwargs.get("backgroundPrompt", "") or "").strip() - - config: Dict[str, Any] = { - "injectSteps": inject_steps, - "baseRatio": base_ratio, - } - - if background_prompt: - config["backgroundPrompt"] = background_prompt - - if isinstance(regions, list) and regions: - config["regions"] = regions - - return (config,) - - -NODE_CLASS_MAPPINGS = { - "RunwareRegionalPromptingAdvancedFeature": RunwareRegionalPromptingAdvancedFeature, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareRegionalPromptingAdvancedFeature": "Runware Regional Prompting Advanced Feature", -} - diff --git a/modules/imageRegionalPromptingAdvancedFeatureRegions.py b/modules/imageRegionalPromptingAdvancedFeatureRegions.py deleted file mode 100644 index f715002..0000000 --- a/modules/imageRegionalPromptingAdvancedFeatureRegions.py +++ /dev/null @@ -1,196 +0,0 @@ -from typing import Dict, Any, List, Tuple - - -class RunwareRegionalPromptingAdvancedFeatureRegions: - """ - Runware Regional Prompting Advanced Feature Regions Node - - Builds the advancedFeatures.regionalPrompting.regions array, with up to 4 regions. - Each region has a prompt and a rectangular mask [x0, y0, x1, y1]. - """ - - @classmethod - def INPUT_TYPES(cls): - coords_tooltip = "Mask rectangle as [x0, y0, x1, y1] in image pixel coordinates." - return { - "required": {}, - "optional": { - # Region 1 - "useRegion1": ("BOOLEAN", { - "tooltip": "Enable first regional prompt mask.", - "default": False, - }), - "region1Prompt": ("STRING", { - "tooltip": "Prompt for region 1.", - "default": "", - }), - "region1_x0": ("INT", { - "tooltip": coords_tooltip, - "default": 0, - "min": 0, - "max": 8192, - }), - "region1_y0": ("INT", { - "tooltip": coords_tooltip, - "default": 0, - "min": 0, - "max": 8192, - }), - "region1_x1": ("INT", { - "tooltip": coords_tooltip, - "default": 512, - "min": 0, - "max": 8192, - }), - "region1_y1": ("INT", { - "tooltip": coords_tooltip, - "default": 512, - "min": 0, - "max": 8192, - }), - # Region 2 - "useRegion2": ("BOOLEAN", { - "tooltip": "Enable second regional prompt mask.", - "default": False, - }), - "region2Prompt": ("STRING", { - "tooltip": "Prompt for region 2.", - "default": "", - }), - "region2_x0": ("INT", { - "tooltip": coords_tooltip, - "default": 512, - "min": 0, - "max": 8192, - }), - "region2_y0": ("INT", { - "tooltip": coords_tooltip, - "default": 0, - "min": 0, - "max": 8192, - }), - "region2_x1": ("INT", { - "tooltip": coords_tooltip, - "default": 1024, - "min": 0, - "max": 8192, - }), - "region2_y1": ("INT", { - "tooltip": coords_tooltip, - "default": 512, - "min": 0, - "max": 8192, - }), - # Region 3 - "useRegion3": ("BOOLEAN", { - "tooltip": "Enable third regional prompt mask.", - "default": False, - }), - "region3Prompt": ("STRING", { - "tooltip": "Prompt for region 3.", - "default": "", - }), - "region3_x0": ("INT", { - "tooltip": coords_tooltip, - "default": 0, - "min": 0, - "max": 8192, - }), - "region3_y0": ("INT", { - "tooltip": coords_tooltip, - "default": 512, - "min": 0, - "max": 8192, - }), - "region3_x1": ("INT", { - "tooltip": coords_tooltip, - "default": 512, - "min": 0, - "max": 8192, - }), - "region3_y1": ("INT", { - "tooltip": coords_tooltip, - "default": 1024, - "min": 0, - "max": 8192, - }), - # Region 4 - "useRegion4": ("BOOLEAN", { - "tooltip": "Enable fourth regional prompt mask.", - "default": False, - }), - "region4Prompt": ("STRING", { - "tooltip": "Prompt for region 4.", - "default": "", - }), - "region4_x0": ("INT", { - "tooltip": coords_tooltip, - "default": 512, - "min": 0, - "max": 8192, - }), - "region4_y0": ("INT", { - "tooltip": coords_tooltip, - "default": 512, - "min": 0, - "max": 8192, - }), - "region4_x1": ("INT", { - "tooltip": coords_tooltip, - "default": 1024, - "min": 0, - "max": 8192, - }), - "region4_y1": ("INT", { - "tooltip": coords_tooltip, - "default": 1024, - "min": 0, - "max": 8192, - }), - }, - } - - RETURN_TYPES: Tuple[str] = ("RUNWAREREGIONALPROMPTINGREGIONS",) - RETURN_NAMES = ("regions",) - FUNCTION = "createRegions" - CATEGORY = "Runware" - DESCRIPTION = ( - "Configure regions array for regional prompting. Each enabled region provides " - "a prompt and a rectangular mask [x0, y0, x1, y1]. Connect to Runware Regional " - "Prompting Advanced Feature regions input." - ) - - def createRegions(self, **kwargs) -> tuple: - """Build list of regional prompting regions.""" - regions: List[Dict[str, Any]] = [] - - for idx in range(1, 5): - use_region = kwargs.get(f"useRegion{idx}", False) - prompt = (kwargs.get(f"region{idx}Prompt", "") or "").strip() - if not use_region or not prompt: - continue - - x0 = int(kwargs.get(f"region{idx}_x0", 0)) - y0 = int(kwargs.get(f"region{idx}_y0", 0)) - x1 = int(kwargs.get(f"region{idx}_x1", 0)) - y1 = int(kwargs.get(f"region{idx}_y1", 0)) - - mask = [x0, y0, x1, y1] - regions.append( - { - "prompt": prompt, - "mask": mask, - } - ) - - return (regions,) - - -NODE_CLASS_MAPPINGS = { - "RunwareRegionalPromptingAdvancedFeatureRegions": RunwareRegionalPromptingAdvancedFeatureRegions, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareRegionalPromptingAdvancedFeatureRegions": "Runware Regional Prompting Advanced Feature Regions", -} - diff --git a/modules/imageUpscalerSettings.py b/modules/imageUpscalerSettings.py deleted file mode 100644 index 4f27e60..0000000 --- a/modules/imageUpscalerSettings.py +++ /dev/null @@ -1,61 +0,0 @@ -""" -Runware Image Upscaler Settings — builds settings (enhanceDetails, realism). Connect to Runware Image Upscaler. -""" - -from typing import Any, Dict, Tuple - - -class RunwareImageUpscalerSettings: - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useEnhanceDetails": ("BOOLEAN", { - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - "tooltip": "Include settings.enhanceDetails in the upscale request.", - }), - "enhanceDetails": ("BOOLEAN", { - "default": False, - "label_on": "true", - "label_off": "false", - "tooltip": "Enhance fine textures and small details. May increase contrast and introduce minor deviations from the original.", - }), - "useRealism": ("BOOLEAN", { - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - "tooltip": "Include settings.realism in the upscale request.", - }), - "realism": ("BOOLEAN", { - "default": True, - "label_on": "true", - "label_off": "false", - "tooltip": "Improve realism. May deviate more from the original. Recommended for AI-generated images.", - }), - }, - } - - RETURN_TYPES = ("RUNWAREIMAGEUPSCALERSETTINGS",) - RETURN_NAMES = ("Upscaler Settings",) - FUNCTION = "build_settings" - CATEGORY = "Runware" - DESCRIPTION = ( - "Optional settings.enhanceDetails and settings.realism for image upscale. " - "Connect to Runware Image Upscaler." - ) - - def build_settings(self, **kwargs) -> Tuple[Dict[str, Any]]: - out: Dict[str, Any] = {} - - settings: Dict[str, Any] = {} - if kwargs.get("useEnhanceDetails", False): - settings["enhanceDetails"] = bool(kwargs.get("enhanceDetails", False)) - if kwargs.get("useRealism", False): - settings["realism"] = bool(kwargs.get("realism", True)) - if settings: - out["settings"] = settings - - return (out,) diff --git a/modules/imageWatermarkAdvancedFeature.py b/modules/imageWatermarkAdvancedFeature.py deleted file mode 100644 index a3b6a6b..0000000 --- a/modules/imageWatermarkAdvancedFeature.py +++ /dev/null @@ -1,162 +0,0 @@ -from typing import Dict, Any, Tuple - -from .utils.runwareUtils import convertTensor2IMG - - -class RunwareWatermarkAdvancedFeature: - """Runware Watermark Advanced Feature Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useText": ("BOOLEAN", { - "tooltip": "Enable to set text content for the watermark (2-32 characters).", - "default": False, - }), - "text": ("STRING", { - "tooltip": "Text content for the watermark (2-32 characters). Only used when 'Use Text' is enabled.", - "default": "", - }), - "useImage": ("BOOLEAN", { - "tooltip": "Enable to set image content for the watermark (connect an IMAGE, UUID, URL, data URI, or base64).", - "default": False, - }), - "image": ("IMAGE", { - "tooltip": "Image to use as watermark. Can be connected from a Load Image node; internally converted to a data URI/UUID when used.", - }), - "useDisplayPosition": ("BOOLEAN", { - "tooltip": "Enable to set watermark display position.", - "default": False, - }), - "displayPosition": ([ - "top-left", "top-center", "top-right", - "center-left", "center-center", "center-right", - "bottom-left", "bottom-center", "bottom-right", - ], { - "tooltip": "Watermark position on the image.", - "default": "bottom-right", - }), - "useTiled": ("BOOLEAN", { - "tooltip": "Enable to tile the watermark across the image at -45 degrees.", - "default": False, - }), - "tiled": ("BOOLEAN", { - "tooltip": "When enabled, distribute watermark across the image at -45 degrees. Only used when 'Use Tiled' is enabled.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "useOpacity": ("BOOLEAN", { - "tooltip": "Enable to set watermark opacity (0.1 - 1.0).", - "default": False, - }), - "opacity": ("FLOAT", { - "tooltip": "Watermark opacity (0.1 - 1.0). Only used when 'Use Opacity' is enabled.", - "default": 0.6, - "min": 0.1, - "max": 1.0, - "step": 0.05, - }), - "useFontColor": ("BOOLEAN", { - "tooltip": "Enable to set watermark font color (hex).", - "default": False, - }), - "fontColor": ("STRING", { - "tooltip": "Text color in hex format (e.g. #ffffff). Only used when 'Use Font Color' is enabled.", - "default": "#ffffff", - }), - "useBgColor": ("BOOLEAN", { - "tooltip": "Enable to set watermark background color (hex).", - "default": False, - }), - "bgColor": ("STRING", { - "tooltip": "Background color in hex format (e.g. #000000 or transparent). Only used when 'Use Bg Color' is enabled.", - "default": "transparent", - }), - }, - } - - RETURN_TYPES: Tuple[str] = ("RUNWAREIMAGEWATERMARKADVFEATURE",) - RETURN_NAMES = ("watermark",) - FUNCTION = "createWatermark" - CATEGORY = "Runware" - DESCRIPTION = ( - "Configure watermark advanced feature for Runware Image Inference. " - "You must provide exactly one of text or image. Connect output to " - "Runware Image Advanced Feature Input watermark connection." - ) - - def createWatermark(self, **kwargs) -> tuple: - """Build watermark dict for advancedFeatures.watermark.""" - use_text = kwargs.get("useText", False) - text = (kwargs.get("text", "") or "").strip() - use_image = kwargs.get("useImage", False) - raw_image = kwargs.get("image", None) - - has_text = use_text and bool(text) - - image_str: str = "" - if use_image: - if raw_image is None: - raise Exception( - "Watermark 'useImage' is enabled but no IMAGE input was provided. " - "Connect an IMAGE (e.g., from a Load Image node) to the watermark node." - ) - # If an IMAGE tensor is connected, convert it to a data URI / UUID. - try: - # convertTensor2IMG handles caching and returns either UUID or data URI. - image_str = convertTensor2IMG(raw_image) - except Exception as e: - raise Exception( - f"Failed to convert watermark IMAGE input. " - f"Ensure the connected image is valid. Details: {e}" - ) from e - - has_image = use_image and bool(image_str) - - if has_text == has_image: - raise Exception( - "Watermark configuration requires exactly one of text or image (but not both or neither)." - ) - - use_pos = kwargs.get("useDisplayPosition", False) - pos = kwargs.get("displayPosition", "bottom-right") - use_tiled = kwargs.get("useTiled", False) - tiled = bool(kwargs.get("tiled", False)) - use_opacity = kwargs.get("useOpacity", False) - opacity = float(kwargs.get("opacity", 0.6)) - use_font = kwargs.get("useFontColor", False) - font_color = (kwargs.get("fontColor", "#ffffff") or "").strip() - use_bg = kwargs.get("useBgColor", False) - bg_color = (kwargs.get("bgColor", "transparent") or "").strip() - - watermark: Dict[str, Any] = {} - - if has_text: - watermark["text"] = text - if has_image: - watermark["image"] = image_str - if use_pos: - watermark["displayPosition"] = pos - if use_tiled: - watermark["tiled"] = tiled - if use_opacity: - watermark["opacity"] = opacity - if use_font and font_color: - watermark["fontColor"] = font_color - if use_bg and bg_color: - watermark["bgColor"] = bg_color - - return (watermark,) - - -NODE_CLASS_MAPPINGS = { - "RunwareWatermarkAdvancedFeature": RunwareWatermarkAdvancedFeature, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareWatermarkAdvancedFeature": "Runware Watermark Advanced Feature", -} - diff --git a/modules/inputAudios.py b/modules/inputAudios.py deleted file mode 100644 index 2c55f43..0000000 --- a/modules/inputAudios.py +++ /dev/null @@ -1,44 +0,0 @@ -from typing import List - - -class inputAudios: - """Input Audios node for configuring multiple audio inputs""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "Audio1": ("STRING", { - "tooltip": "MediaUUID for the first audio file from Runware Media Upload node.", - }), - "Audio2": ("STRING", { - "tooltip": "MediaUUID for the second audio file from Runware Media Upload node.", - }), - "Audio3": ("STRING", { - "tooltip": "MediaUUID for the third audio file from Runware Media Upload node.", - }), - "Audio4": ("STRING", { - "tooltip": "MediaUUID for the fourth audio file from Runware Media Upload node.", - }), - } - } - - DESCRIPTION = "Configure multiple audio inputs (mediaUUIDs) for video generation with audio synchronization." - FUNCTION = "createInputAudios" - RETURN_TYPES = ("RUNWAREINPUTAUDIOS",) - RETURN_NAMES = ("Input Audios",) - CATEGORY = "Runware" - - def createInputAudios(self, **kwargs) -> tuple[List[str]]: - """Create list of audio UUIDs from provided parameters""" - audioList = [] - - for i in range(1, 5): - audioKey = f"Audio{i}" - audioUuid = kwargs.get(audioKey) - - if audioUuid and audioUuid.strip() != "": - audioList.append(audioUuid.strip()) - - return (audioList,) diff --git a/modules/ipAdapter.py b/modules/ipAdapter.py deleted file mode 100644 index 8f13a65..0000000 --- a/modules/ipAdapter.py +++ /dev/null @@ -1,54 +0,0 @@ -from .utils import runwareUtils as rwUtils - -class ipAdapter: - RUNWARE_IPADAPTER_MODELS = { - "FLUX.1 Dev Redux": "runware:105@1", - "IP Adapter SDXL": "runware:55@1", - "IP Adapter SDXL Plus": "runware:55@2", - "IP Adapter SDXL Plus Face": "runware:55@3", - "IP Adapter SDXL Vit-H": "runware:55@4", - "IP Adapter SD 1.5": "runware:55@5", - "IP Adapter SD 1.5 Plus": "runware:55@6", - "IP Adapter SD 1.5 Light": "runware:55@7", - "IP Adapter SD 1.5 Plus Face": "runware:55@8", - "IP Adapter SD 1.5 Full Face": "runware:55@9", - "IP Adapter SD 1.5 Vit-G": "runware:55@10", - "Bria IP Adapter": "bria:10@21" - } - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Reference Image": ("IMAGE",), - "Model": (list(cls.RUNWARE_IPADAPTER_MODELS.keys()), { - "tooltip": "Choose IP Adapter model to use for reference-based image generation.", - "default": "IP Adapter SDXL", - }), - "weight": ("FLOAT", { - "default": 1.0, - "min": 0.0, - "max": 1.0, - "step": 0.01, - "tooltip": "Represents the strength or influence of this IP-Adapter in the generation process.\n\nA value of 0 means no influence, while 1 means maximum influence.\n\nNote: This Value Is Ignored For Flux Redux.", - }), - }, - } - - RETURN_TYPES = ("RUNWAREIPAdapter",) - RETURN_NAMES = ("IPAdapter",) - FUNCTION = "ipAdapter" - CATEGORY = "Runware" - DESCRIPTION = "IP-Adapters enable image-prompted generation, allowing you to use reference images to guide the style and content of your generations. Multiple IP Adapters can be used simultaneously." - - def ipAdapter(self, **kwargs): - refImage = kwargs.get("Reference Image") - modelName = kwargs.get("Model") - weight = kwargs.get("weight") - modelAirCode = self.RUNWARE_IPADAPTER_MODELS.get(modelName) - guideImage = rwUtils.convertTensor2IMG(refImage) - return ({ - "model": modelAirCode, - "guideImage": guideImage, - "weight": round(weight, 2), - },) \ No newline at end of file diff --git a/modules/ipAdapterCombine.py b/modules/ipAdapterCombine.py deleted file mode 100644 index 25777c2..0000000 --- a/modules/ipAdapterCombine.py +++ /dev/null @@ -1,37 +0,0 @@ -class ipAdapterCombine: - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "IPAdapter 1": ("RUNWAREIPAdapter", { - "tooltip": "Connect an IPAdapter from Runware IPAdapter node.", - }), - }, - "optional": { - "IPAdapter 2": ("RUNWAREIPAdapter", { - "tooltip": "Connect an IPAdapter from Runware IPAdapter node.", - }), - "IPAdapter 3": ("RUNWAREIPAdapter", { - "tooltip": "Connect an IPAdapter from Runware IPAdapter node.", - }), - }, - } - - DESCRIPTION = "Combine multiple IPAdapters to connect with Runware Image Inference." - FUNCTION = "ipAdapterCombine" - RETURN_TYPES = ("RUNWAREIPAdapter",) - RETURN_NAMES = ("IPAdapters",) - CATEGORY = "Runware" - - def ipAdapterCombine(self, **kwargs): - ipAdapter1 = kwargs.get("IPAdapter 1") - ipAdapter2 = kwargs.get("IPAdapter 2", None) - ipAdapter3 = kwargs.get("IPAdapter 3", None) - - ipAdapterArray = [] - ipAdapterArray.append(ipAdapter1) - if(ipAdapter2): - ipAdapterArray.append(ipAdapter2) - if(ipAdapter3): - ipAdapterArray.append(ipAdapter3) - return (ipAdapterArray,) \ No newline at end of file diff --git a/modules/loadMesh.py b/modules/loadMesh.py deleted file mode 100644 index 47d5b66..0000000 --- a/modules/loadMesh.py +++ /dev/null @@ -1,55 +0,0 @@ -import base64 -import os - - -class RunwareLoadMesh: - """Runware Load Mesh node for loading 3D model files (uses same logic as Load Image)""" - - MESH_EXTENSIONS = {".glb", ".ply"} - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "file_path": ("STRING", { - "default": "", - "multiline": False, - "placeholder": "/path/to/model.glb or .ply", - "tooltip": "Full path to .glb or .ply file. Use this to load from any directory.", - }), - }, - } - - RETURN_TYPES = ("STRING",) - RETURN_NAMES = ("Base64",) - FUNCTION = "load_mesh" - CATEGORY = "Runware" - DESCRIPTION = "Load a 3D model file from a path or entering a path. Base64 encodes and outputs as data URI. Connect to Runware 3D Inference Inputs meshFile." - - def load_mesh(self, file_path): - path = (file_path or "").strip() if isinstance(file_path, str) else "" - if not path: - return ("",) - full_path = os.path.expanduser(path) - ext = os.path.splitext(full_path)[1].lower() - if ext not in self.MESH_EXTENSIONS: - raise ValueError( - f"Runware Load Mesh: unsupported extension '{ext}'. Expected .glb or .ply." - ) - if not os.path.isfile(full_path): - raise FileNotFoundError( - f"Runware Load Mesh: file not found: {full_path}" - ) - with open(full_path, 'rb') as f: - mesh_bytes = f.read() - mesh_base64 = base64.b64encode(mesh_bytes).decode('utf-8') - return (f"data:application/octet-stream;base64,{mesh_base64}",) - - -NODE_CLASS_MAPPINGS = { - "RunwareLoadMesh": RunwareLoadMesh, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareLoadMesh": "Runware Load Mesh", -} diff --git a/modules/loraCombine.py b/modules/loraCombine.py deleted file mode 100644 index 584375d..0000000 --- a/modules/loraCombine.py +++ /dev/null @@ -1,37 +0,0 @@ -class loraCombine: - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Lora 1": ("RUNWARELORA", { - "tooltip": "Connect a Runware Lora From Lora Search Node.", - }), - }, - "optional": { - "Lora 2": ("RUNWARELORA", { - "tooltip": "Connect a Runware Lora From Lora Search Node.", - }), - "Lora 3": ("RUNWARELORA", { - "tooltip": "Connect a Runware Lora From Lora Search Node.", - }), - }, - } - - DESCRIPTION = "Combine One or More Lora's To Connect It With Runware Image Inference." - FUNCTION = "loraCombine" - RETURN_TYPES = ("RUNWARELORA",) - RETURN_NAMES = ("Runware Lora's",) - CATEGORY = "Runware" - - def loraCombine(self, **kwargs): - runwareLora1 = kwargs.get("Lora 1") - runwareLora2 = kwargs.get("Lora 2", None) - runwareLora3 = kwargs.get("Lora 3", None) - - loraObjectArray = [] - loraObjectArray.append(runwareLora1) - if(runwareLora2): - loraObjectArray.append(runwareLora2) - if(runwareLora3): - loraObjectArray.append(runwareLora3) - return (loraObjectArray,) \ No newline at end of file diff --git a/modules/loraSearch.py b/modules/loraSearch.py deleted file mode 100644 index e9e2c89..0000000 --- a/modules/loraSearch.py +++ /dev/null @@ -1,87 +0,0 @@ -class loraSearch: - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Lora Search": ("STRING", { - "tooltip": "Search For Specific Lora By Name Or Civit AIR Code (eg: Cyberpunk).", - }), - "Model Architecture": ([ - "All", - "FLUX.1-Schnell", - "FLUX.1-Dev", - "FLUX.1 Krea", - "Pony", - "SD 1.5", - "SD 1.5 Hyper", - "SD 1.5 LCM", - "SD 3", - "SDXL 1.0", - "SDXL 1.0 LCM", - "SDXL Distilled", - "SDXL Hyper", - "SDXL Lightning", - "SDXL Turbo", - ], { - "tooltip": "Choose Lora Model Architecture To Filter Results.", - "default": "All", - }), - "LoraType": ([ - "Lora", - "LyCORIS" - ], { - "tooltip": "Choose Lora Type To Filter Out The Results.", - "default": "Lora", - }), - "LoraList": ([ - "civitai:58390@62833 (Detail Tweaker LoRA (细节调整LoRA))", - "civitai:82098@87153 (Add More Details - Detail Enhancer / Tweaker (细节调整) LoRA)", - "civitai:122359@135867 (Detail Tweaker XL)", - "civitai:14171@16677 (Cute_girl_mix4)", - "civitai:13941@16576 (epi_noiseoffset)", - "civitai:25995@32988 (blindbox/大概是盲盒)", - ], { - "tooltip": "Lora Results Will Show UP Here So You Could Choose From.", - "default": "civitai:58390@62833 (Detail Tweaker LoRA (细节调整LoRA))", - }), - "weight": ("FLOAT", { - "tooltip": "Defines the strength or influence of the LoRA model in the generation process.", - "default": 1.0, - "min": -4.0, - "max": 4.0, - "step": 0.1, - }), - "Use Search Value": ("BOOLEAN", { - "tooltip": "When Enabled, the value you've set in the search input will be used instead.\n\nThis is useful in case the model search API is down or you prefer to set the model manually.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - }, - } - - DESCRIPTION = "Directly Search and Connect Lora's to Runware Inference Nodes In ComfyUI." - FUNCTION = "loraSearch" - RETURN_TYPES = ("RUNWARELORA",) - RETURN_NAMES = ("Runware Lora",) - CATEGORY = "Runware" - - @classmethod - def VALIDATE_INPUTS(cls, LoraList): - return True - - def loraSearch(self, **kwargs): - enableSearchValue = kwargs.get("Use Search Value", False) - searchInput = kwargs.get("Lora Search") - lora_weight = kwargs.get("weight") - - if enableSearchValue: - modelAIRCode = searchInput - else: - crModel = kwargs.get("LoraList") - modelAIRCode = crModel.split(" ")[0] - - return ({ - "model": modelAIRCode, - "weight": round(lora_weight, 2), - },) \ No newline at end of file diff --git a/modules/mediaUpload.py b/modules/mediaUpload.py deleted file mode 100644 index 9f7ee46..0000000 --- a/modules/mediaUpload.py +++ /dev/null @@ -1,296 +0,0 @@ -import base64 -import os -import time -import torch -import soundfile as sf -import numpy as np -from io import BytesIO -from .utils.runwareUtils import ( - RUNWARE_API_BASE_URL, - genRandUUID, - inferenecRequest, - pollVideoResult, - sanitize_for_logging, - safe_json_dumps, - sendMediaUUID, -) - - -class RunwareMediaUpload: - """Runware Media Upload node for uploading audio/video to Runware storage""" - - # MIME type mapping for video files - VIDEO_MIME_TYPES = { - '.mp4': 'video/mp4', - '.avi': 'video/avi', - '.mov': 'video/quicktime', - '.webm': 'video/webm', - } - - DEFAULT_SAMPLE_RATE = 22050 - DEFAULT_VIDEO_MIME = 'video/mp4' - MAX_POLL_ATTEMPTS = 100 - POLL_INTERVAL = 2 - REQUEST_TIMEOUT = 30 - - def __init__(self): - pass - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "media": ("VIDEO,AUDIO", { - "tooltip": "Media tensor from ComfyUI load video or audio node", - }), - "mediaUUID": ("STRING", { - "placeholder": "Generated media UUID will appear here automatically.", - "tooltip": "This field will be automatically populated with the generated media UUID after upload.", - }), - }, - "hidden": {"node_id": "UNIQUE_ID"} - } - - RETURN_TYPES = ("STRING",) - RETURN_NAMES = ("mediaUUID",) - FUNCTION = "uploadMedia" - CATEGORY = "Runware" - DESCRIPTION = "Upload audio media to Runware's media storage and get mediaUUID" - OUTPUT_NODE = True - - @classmethod - def IS_CHANGED(cls, **kwargs): - return float("NAN") - - def uploadMedia(self, media=None, mediaUuid=None, **kwargs): - """Main function to upload media and return mediaUUID""" - if media is None: - raise ValueError("Media input is required") - - print(f"[Debug] uploadMedia called with media: {type(media)}, mediaUuid: {mediaUuid}") - - try: - mediaBase64 = self._convertMediaToBase64(media) - print(f"[Debug] Media converted to base64, length: {len(mediaBase64)}") - - mediaUuid = self._uploadToRunware(mediaBase64) - print(f"[Debug] Upload completed! MediaUUID: {mediaUuid}") - print(f"[Debug] ===== RESULT: {mediaUuid} =====") - - sendMediaUUID(mediaUuid, kwargs.get("node_id")) - return (mediaUuid,) - except Exception as e: - print(f"[Debug] Media upload failed: {str(e)}") - raise e - - def _convertMediaToBase64(self, mediaTensor): - """Convert media tensor to base64 data URI""" - print(f"[Debug] Media type: {type(mediaTensor)}") - - if self._isVideoFile(mediaTensor): - return self._convertVideoToBase64(mediaTensor) - elif isinstance(mediaTensor, dict) and 'waveform' in mediaTensor: - return self._convertAudioDictToBase64(mediaTensor) - elif isinstance(mediaTensor, torch.Tensor): - return self._convertTensorToBase64(mediaTensor) - else: - raise ValueError(f"Unsupported media type: {type(mediaTensor)}") - - def _isVideoFile(self, mediaTensor): - """Check if media tensor is a VideoFromFile object""" - return (hasattr(mediaTensor, 'video_path') or - str(type(mediaTensor)).find('VideoFromFile') != -1) - - def _convertVideoToBase64(self, videoTensor): - """Convert video file to base64 data URI""" - print(f"[Debug] VideoFromFile object detected") - - videoFile = self._getVideoFilePath(videoTensor) - videoPath = self._extractVideoPath(videoFile) - - print(f"[Debug] Processing video file: {videoPath}") - - with open(videoPath, 'rb') as f: - videoBytes = f.read() - - mimeType = self._getMimeType(videoPath) - videoBase64 = base64.b64encode(videoBytes).decode('utf-8') - - return f"data:{mimeType};base64,{videoBase64}" - - def _getVideoFilePath(self, videoTensor): - """Extract video file path from VideoFromFile object""" - videoFile = getattr(videoTensor, '_VideoFromFile__file', None) - - if videoFile is None: - for attr in ['video_path', 'path', 'file_path', 'filename', '_file']: - if hasattr(videoTensor, attr): - videoFile = getattr(videoTensor, attr) - print(f"[Debug] Found video file via {attr}: {videoFile}") - break - - if videoFile is None: - raise ValueError("Could not find video file in VideoFromFile object") - - return videoFile - - def _extractVideoPath(self, videoFile): - """Extract file path from file object or string""" - if hasattr(videoFile, 'name'): - return videoFile.name - elif isinstance(videoFile, str): - return videoFile - else: - raise ValueError(f"Unexpected video file type: {type(videoFile)}") - - def _getMimeType(self, filePath): - """Get MIME type based on file extension""" - ext = os.path.splitext(filePath.lower())[1] - return self.VIDEO_MIME_TYPES.get(ext, self.DEFAULT_VIDEO_MIME) - - def _convertAudioDictToBase64(self, audioDict): - """Convert audio dictionary to base64 WAV data URI""" - waveform = audioDict['waveform'] - sampleRate = audioDict.get('sample_rate', self.DEFAULT_SAMPLE_RATE) - - waveformNp = self._prepareWaveformNumpy(waveform) - wavBytes = self._convertWaveformToWav(waveformNp, sampleRate) - wavBase64 = base64.b64encode(wavBytes).decode('utf-8') - - return f"data:audio/wav;base64,{wavBase64}" - - def _convertTensorToBase64(self, mediaTensor): - """Convert direct tensor input to base64 WAV data URI""" - waveformNp = self._prepareWaveformNumpy(mediaTensor) - wavBytes = self._convertWaveformToWav(waveformNp, self.DEFAULT_SAMPLE_RATE) - wavBase64 = base64.b64encode(wavBytes).decode('utf-8') - - return f"data:audio/wav;base64,{wavBase64}" - - def _prepareWaveformNumpy(self, waveform): - """Prepare waveform tensor/array for soundfile (returns [channels, samples])""" - if isinstance(waveform, torch.Tensor): - # Normalize dimensions: [batch, channels, samples] -> [channels, samples] - if waveform.dim() == 3: - waveform = waveform.squeeze(0) - elif waveform.dim() == 1: - waveform = waveform.unsqueeze(0) - waveformNp = waveform.cpu().numpy() - else: - waveformNp = np.array(waveform) - if waveformNp.ndim == 1: - waveformNp = waveformNp.reshape(1, -1) - - return waveformNp - - def _convertWaveformToWav(self, waveformNp, sampleRate): - """Convert numpy waveform to WAV bytes using soundfile""" - # soundfile expects [samples, channels] - waveformNp = waveformNp.T - - buffer = BytesIO() - sf.write(buffer, waveformNp, sampleRate, format='WAV') - buffer.seek(0) - - return buffer.getvalue() - - def _uploadToRunware(self, mediaDataUri): - """Upload media to Runware and return mediaUUID""" - taskUuid = genRandUUID() - print(f"[Debug] Generated task UUID: {taskUuid}") - - mediaData = self._stripDataUriPrefix(mediaDataUri) - uploadConfig = self._buildUploadConfig(taskUuid, mediaData) - - print(f"[Debug] Upload config: {sanitize_for_logging(uploadConfig[0])}") - print(f"[Debug] API URL: {RUNWARE_API_BASE_URL}") - - uploadResult = self._makeUploadRequest(uploadConfig) - self._validateUploadResponse(uploadResult) - - uploadData = uploadResult.get("data", []) - if uploadData and len(uploadData) > 0: - mediaUuid = uploadData[0].get("mediaUUID", "") - if mediaUuid and mediaUuid != "1": - print(f"[Debug] Got immediate mediaUUID: {mediaUuid}") - return mediaUuid - - print(f"[Debug] Starting polling for result...") - return self._pollForResult(taskUuid) - - def _stripDataUriPrefix(self, mediaDataUri): - """Strip data URI prefix if present""" - if mediaDataUri.startswith("data:"): - mediaData = mediaDataUri.split(",", 1)[1] - print(f"[Debug] Stripped data URI prefix, media data length: {len(mediaData)}") - return mediaData - return mediaDataUri - - def _buildUploadConfig(self, taskUuid, mediaData): - """Build upload configuration for API request""" - return [{ - "taskType": "mediaStorage", - "taskUUID": taskUuid, - "operation": "upload", - "media": mediaData, - }] - - def _makeUploadRequest(self, uploadConfig): - """Make upload request to Runware API""" - print(f"[Debug] Making upload request to Runware API...") - return inferenecRequest(uploadConfig) - - def _validateUploadResponse(self, uploadResult): - """Validate upload response""" - print(f"[Debug] Upload response: {safe_json_dumps(uploadResult, indent=2) if isinstance(uploadResult, (dict, list)) else uploadResult}") - - if "errors" in uploadResult: - print(f"[Debug] Upload error: {safe_json_dumps(uploadResult, indent=2) if isinstance(uploadResult, (dict, list)) else uploadResult}") - raise Exception(f"Upload failed: {uploadResult}") - - def _pollForResult(self, taskUuid): - """Poll for media upload result""" - for attempt in range(self.MAX_POLL_ATTEMPTS): - try: - print(f"[Debug] Poll attempt {attempt + 1}/{self.MAX_POLL_ATTEMPTS}") - - pollResult = pollVideoResult(taskUuid) - pollData = self._parsePollResponse(pollResult) - - if pollData: - mediaUuid = pollData.get("mediaUUID", "") - if mediaUuid == "1": - print(f"[Debug] Still processing... attempt {attempt + 1}") - time.sleep(self.POLL_INTERVAL) - continue - elif mediaUuid and mediaUuid != "1": - print(f"[Debug] Upload completed! MediaUUID: {mediaUuid}") - return mediaUuid - - print(f"[Debug] Attempt {attempt + 1}: No data in response, continuing...") - time.sleep(self.POLL_INTERVAL) - except Exception as e: - print(f"[Debug] Poll attempt {attempt + 1} failed: {str(e)}") - time.sleep(self.POLL_INTERVAL) - continue - - raise Exception("Polling timeout - upload did not complete") - - def _parsePollResponse(self, pollResult): - """Parse polling response""" - if pollResult is None: - print(f"[Debug] Poll returned empty response") - return None - - print(f"[Debug] Poll response: {safe_json_dumps(pollResult, indent=2) if isinstance(pollResult, (dict, list)) else pollResult}") - if "errors" in pollResult: - print(f"[Debug] Poll error: {safe_json_dumps(pollResult, indent=2) if isinstance(pollResult, (dict, list)) else pollResult}") - return None - - if "data" in pollResult and len(pollResult["data"]) > 0: - print(f"[Debug] Poll data: {sanitize_for_logging(pollResult['data'][0])}") - return pollResult["data"][0] - - return None -runwareMediaUpload = RunwareMediaUpload diff --git a/modules/modelSearch.py b/modules/modelSearch.py deleted file mode 100644 index 0e39336..0000000 --- a/modules/modelSearch.py +++ /dev/null @@ -1,89 +0,0 @@ -class modelSearch: - """Model Search node for searching and selecting image models""" - - MODEL_ARCHITECTURES = [ - "All", - "FLUX.1-Schnell", - "FLUX.1-Dev", - "FLUX.1-Krea", - "Pony", - "SD 1.5", - "SD 1.5 Hyper", - "SD 1.5 LCM", - "SD 3", - "SDXL 1.0", - "SDXL 1.0 LCM", - "SDXL Distilled", - "SDXL Hyper", - "SDXL Lightning", - "SDXL Turbo", - ] - - MODEL_TYPES = [ - "Base Model", - "Inpainting Model", - ] - - FEATURED_MODELS = [ - "rundiffusion:110@101 (Juggernaut Lightning Flux by RunDiffusion)", - "rundiffusion:130@100 (Juggernaut Pro Flux by RunDiffusion)", - "runware:100@1 (Flux Schnell)", - "runware:101@1 (Flux Dev)", - "runware:107@1 (FLUX.1 Krea)", - "runware:5@1 (SD3)", - "civitai:4384@128713 (SDXL 1.5 DreamShaper)", - "civitai:43331@176425 (SD 1.5 majicMIX realistic 麦橘写实)", - "civitai:101055@128078 (SDXL v1.0 VAE fix)", - "civitai:133005@288982 (SDXL Juggernaut XL V8)", - ] - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Model Search": ("STRING", { - "tooltip": "Search For Specific Model By Name Or Civit AIR Code (eg: Juggernaut).", - }), - "Model Architecture": (cls.MODEL_ARCHITECTURES, { - "tooltip": "Choose Model Architecture To Filter Results.", - "default": "All", - }), - "ModelType": (cls.MODEL_TYPES, { - "tooltip": "Choose Model Type To Filter Results.", - "default": "Base Model", - }), - "ModelList": (cls.FEATURED_MODELS, { - "tooltip": "Model Results Will Show UP Here So You Could Choose From. If You didn't Search For Anything this will show featured Model List.", - "default": "runware:100@1 (Flux Schnell)", - }), - "Use Search Value": ("BOOLEAN", { - "tooltip": "When Enabled, the value you've set in the search input will be used instead.\n\nThis is useful in case the model search API is down or you prefer to set the model manually.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - }, - } - - DESCRIPTION = "Directly Search and Connect Model Checkpoints to Runware Inference Nodes In ComfyUI." - FUNCTION = "modelSearch" - RETURN_TYPES = ("RUNWAREMODEL",) - RETURN_NAMES = ("Runware Model",) - CATEGORY = "Runware" - - @classmethod - def VALIDATE_INPUTS(cls, ModelList): - return True - - def modelSearch(self, **kwargs): - """Search and return model AIR code""" - enableSearchValue = kwargs.get("Use Search Value", False) - searchInput = kwargs.get("Model Search") - - if enableSearchValue: - modelAirCode = searchInput - else: - currentModel = kwargs.get("ModelList") - modelAirCode = currentModel.split(" ")[0] - - return (modelAirCode,) diff --git a/modules/multiInference.py b/modules/multiInference.py deleted file mode 100644 index fbe41ad..0000000 --- a/modules/multiInference.py +++ /dev/null @@ -1,109 +0,0 @@ -import asyncio -from .utils import runwareUtils as rwUtils -from comfy_execution.graph import ExecutionBlocker - - -class multiInference: - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Task 1": ( - "RUNWARETASK", - { - "tooltip": "Connect a Runware Task From Any Inference Node.", - }, - ), - }, - "optional": { - "Task 2": ( - "RUNWARETASK", - { - "tooltip": "Connect a Runware Task From Any Inference Node.", - }, - ), - "Task 3": ( - "RUNWARETASK", - { - "tooltip": "Connect a Runware Task From Any Inference Node.", - }, - ), - "Task 4": ( - "RUNWARETASK", - { - "tooltip": "Connect a Runware Task From Any Inference Node.", - }, - ), - }, - } - - DESCRIPTION = "Allows you to Run Multiple Inference Tasks in Parallel." - FUNCTION = "multiInference" - RETURN_TYPES = ("STRING", "STRING", "STRING", "STRING") - RETURN_NAMES = ("Result 1", "Result 2", "Result 3", "Result 4") - CATEGORY = "Runware" - - def multiInference(self, **kwargs): - tasksData = [kwargs.get(f"Task {i}", None) for i in range(1, 5)] - validTasks = [task for task in tasksData if task is not None] - - - if not validTasks: - raise Exception("Error: No valid tasks provided for Multi Inference!") - - taskIncidents = {} - - async def runInference(taskData, taskIndex, oindex): - try: - print(f"[Debugging] Task {oindex + 1} UUID => {taskData[0]['taskUUID']}") - loop = asyncio.get_running_loop() - result = await loop.run_in_executor( - None, rwUtils.inferenecRequest, taskData - ) - image_url = rwUtils.extractImageURLs(result) - return image_url - except Exception as e: - print(f"\n---- Runware Multi Inference Task {oindex + 1} Failed ----") - print(f"Task-Type: {taskData[0]['taskType']}") - print(f"Task-UUID: {taskData[0]['taskUUID']}") - print(f"{e}") - print(f"-------------------\n") - taskIncidents[taskIndex] = e - return ExecutionBlocker(None) - - async def main(): - coroutines = [] - valid_indices = [idx for idx, t in enumerate(tasksData) if t is not None] - for i, config in enumerate(validTasks): - original_index = valid_indices[i] - coroutines.append(runInference(config, i, original_index)) - results = await asyncio.gather(*coroutines, return_exceptions=False) - return results - - try: - loop = asyncio.get_event_loop() - except RuntimeError: - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) - - finalResults = loop.run_until_complete(main()) - - optResult = [ExecutionBlocker(None)] * 4 - rindex = 0 - workingTasks = 0 - - for i, task_config in enumerate(tasksData): - if task_config is not None: - result = finalResults[rindex] - if result is not None and not isinstance(result, ExecutionBlocker): - workingTasks += 1 - optResult[i] = result - rindex += 1 - - if workingTasks == 0 and len(validTasks) > 0: - firstError = min(taskIncidents.keys()) - raise Exception( - f"Error in Task {firstError + 1} => {taskIncidents[firstError]}" - ) - - return tuple(optResult) diff --git a/modules/outpaintSettings.py b/modules/outpaintSettings.py deleted file mode 100644 index 206f02e..0000000 --- a/modules/outpaintSettings.py +++ /dev/null @@ -1,99 +0,0 @@ -class outpaintSettings: - @classmethod - 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. Only used when 'Use Top' is enabled.", - "default": 64, - "min": 0, - "max": 2048, - "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. Only used when 'Use Right' is enabled.", - "default": 64, - "min": 0, - "max": 2048, - "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. Only used when 'Use Bottom' is enabled.", - "default": 64, - "min": 0, - "max": 2048, - "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. Only used when 'Use Left' is enabled.", - "default": 64, - "min": 0, - "max": 2048, - "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. Only used when 'Use Blur' is enabled.", - "default": 0, - "min": 0, - "max": 32, - "step": 1, - }, - ), - }, - } - - DESCRIPTION = "Can Be Added To Image Inference Nodes To Extend the image boundaries in specified directions. \n\nYou must provide the final dimensions using width and height parameters, which should account for the original image size plus the total extension (seedImage dimensions + top + bottom, left + right)." - FUNCTION = "outpaintSettings" - RETURN_TYPES = ("RUNWAREOUTPAINT",) - RETURN_NAMES = ("Outpaint Settings",) - CATEGORY = "Runware" - - def outpaintSettings(self, **kwargs): - outpaint = {} - - 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 if outpaint else None,) diff --git a/modules/photoMaker.py b/modules/photoMaker.py deleted file mode 100644 index c4afef8..0000000 --- a/modules/photoMaker.py +++ /dev/null @@ -1,191 +0,0 @@ -from .utils import runwareUtils as rwUtils - - -class photoMaker: - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Model": ("RUNWAREMODEL", { - "tooltip": "Connect a Runware Model From Runware Model Node.", - }), - "Image 1": ("IMAGE", { - "tooltip": "Specifies Input Image 1 that will be used as reference for the subject. These reference images help the AI to maintain identity consistency during the generation process." - }), - "positivePrompt": ("STRING", { - "multiline": True, - "placeholder": "Positive Prompt: a text instruction to guide the model on generating the image. It is usually a sentence or a paragraph that provides positive guidance for the task. This parameter is essential to shape the desired results.\n\nThe PhotoMaker positive prompt must follow a specific format: the class word (like \"man\", \"woman\", \"girl\") must be followed by the trigger word \"img\".\nExample: man img, wearing a suit", - "tooltip": "Positive Prompt: a text instruction to guide the model on generating the image.\nDo not Forget To Add trigger word \"img\" after the class word (like \"man\", \"woman\", \"girl\")", - }), - "negativePrompt": ("STRING", { - "multiline": True, - "placeholder": "Negative Prompt: a text instruction to guide the model on generating the image. It is usually a sentence or a paragraph that provides negative guidance for the task. This parameter helps to avoid certain undesired results.", - "tooltip": "Negative Prompt: a text instruction to guide the model on generating the image." - }), - "Prompt Weighting": (["Disabled", "Compel"], { - "default": "Disabled", - "tooltip": "Prompt weighting allows you to adjust how strongly different parts of your prompt influence the generated image.", - }), - "style": ([ - "No style", "Cinematic", "Disney Character", "Digital Art", "Photographic", "Fantasy art", - "Neonpunk", "Enhance", "Comic book", "Lowpoly", "Line art" - ], { - "default": "No style", - "tooltip": "Specifies the artistic style to be applied to the generated images." - }), - "dimensions": ([ - "Square (512x512)", "Square HD (1024x1024)", "Portrait 3:4 (768x1024)", - "Portrait 9:16 (576x1024)", "Landscape 4:3 (1024x768)", - "Landscape 16:9 (1024x576)", "Custom" - ], { - "default": "Square HD (1024x1024)", - "tooltip": "Adjust the dimensions of the generated image by specifying its width and height in pixels, or select from the predefined options. Image dimensions must be multiples of 64 (e.g., 512x512, 1024x768).", - }), - "width": ("INT", { - "tooltip": "The Width of the image in pixels.", - "default": 1024, - "min": 512, - "max": 2048, - "step": 64, - }), - "height": ("INT", { - "tooltip": "The Height of the image in pixels.", - "default": 1024, - "min": 512, - "max": 2048, - "step": 64, - }), - "steps": ("INT", { - "tooltip": "The number of steps is the number of iterations the model will perform to generate the image. The higher the number of steps, the more detailed the image will be. However, increasing the number of steps will also increase the time it takes to generate the image and may not always result in a better image.", - "default": 25, - "min": 1, - "max": 100, - }), - "scheduler": (['Default', 'DDIM', 'DDIMScheduler', 'DDPMScheduler', 'DEISMultistepScheduler', 'DPMSolverSinglestepScheduler', 'DPMSolverMultistepScheduler', 'DPMSolverMultistepInverse', 'DPM++', 'DPM++ Karras', 'DPM++ 2M', 'DPM++ 2M Karras', 'DPM++ 2M SDE Karras', 'DPM++ 2M SDE', 'DPM++ 3M', 'DPM++ 3M Karras', 'DPM++ SDE Karras', 'DPM++ SDE', 'EDMEulerScheduler', 'EDMDPMSolverMultistepScheduler', 'Euler', 'EulerDiscreteScheduler', 'Euler Karras', 'Euler a', 'EulerAncestralDiscreteScheduler', 'FlowMatchEulerDiscreteScheduler', 'Heun', 'HeunDiscreteScheduler', 'Heun Karras', 'IPNDMScheduler', 'KDPM2DiscreteScheduler', 'KDPM2AncestralDiscreteScheduler', 'LCM', 'LCMScheduler', 'LMS', 'LMSDiscreteScheduler', 'LMS Karras', 'PNDMScheduler', 'TCDScheduler', 'UniPC', 'UniPCMultistepScheduler', 'UniPC Karras', 'UniPC 2M', 'UniPC 2M Karras', 'UniPC 3M', 'UniPC 3M Karras'], { - "tooltip": "An scheduler is a component that manages the inference process. Different schedulers can be used to achieve different results like more detailed images, faster inference, or more accurate results.", - "default": "Default", - }), - "cfgScale": ("FLOAT", { - "tooltip": "Guidance scale represents how closely the images will resemble the prompt or how much freedom the AI model has. Higher values are closer to the prompt. Low values may reduce the quality of the results.", - "default": 6.5, - "min": 1.0, - "max": 30.0, - "step": 0.5, - }), - "strength": ("INT", { - "default": 15, - "min": 15, - "max": 50, - "tooltip": "Controls the balance between preserving the subject's original features and the creative transformation specified in the prompt.\n- Lower values provide stronger subject fidelity.\n- Higher values allow more creative freedom in the transformation." - }), - "clipSkip": ("INT", { - "tooltip": "Enables skipping layers of the CLIP embedding process, leading to quicker and more varied image generation.", - "default": 0, - "min": 0, - "max": 2, - }), - "seed": ("INT", { - "tooltip": "A value used to randomize the image generation. If you want to make images reproducible (generate the same image multiple times), you can use the same seed value. Set to 0 to auto-generate a random seed.", - "default": 0, - "min": 0, - "max": 4294967295, - }), - "batchSize": ("INT", { - "tooltip": "The number of images to generate in a single request.", - "default": 1, - "min": 1, - "max": 10, - }), - }, - "optional": { - "Image 2": ("IMAGE", { - "tooltip": "Specifies Input Image 2 that will be used as reference for the subject. These reference images help the AI to maintain identity consistency during the generation process." - }), - "Image 3": ("IMAGE", { - "tooltip": "Specifies Input Image 3 that will be used as reference for the subject. These reference images help the AI to maintain identity consistency during the generation process." - }), - "Image 4": ("IMAGE", { - "tooltip": "Specifies Input Image 4 that will be used as reference for the subject. These reference images help the AI to maintain identity consistency during the generation process." - }), - } - } - - DESCRIPTION = "Transform and style images using PhotoMaker's advanced personalization technology. Create consistent, high-quality image variations with precise subject fidelity and style control." - FUNCTION = "photoMaker" - RETURN_TYPES = ("STRING",) - RETURN_NAMES = ("IMAGE",) - CATEGORY = "Runware" - - @classmethod - def VALIDATE_INPUTS(cls, positivePrompt, negativePrompt): - if (positivePrompt is not None and (positivePrompt == "" or len(positivePrompt) < 3 or len(positivePrompt) > 2000)): - raise Exception( - "Positive Prompt Must Be Between 3 And 2000 characters!") - if (negativePrompt is not None and negativePrompt != "" and (len(negativePrompt) < 3 or len(negativePrompt) > 2000)): - raise Exception( - "Negative Prompt Must Be Between 3 And 2000 characters!") - return True - - def photoMaker(self, **kwargs): - runwareModel = kwargs.get("Model") - image1 = kwargs.get("Image 1") - image2 = kwargs.get("Image 2", None) - image3 = kwargs.get("Image 3", None) - image4 = kwargs.get("Image 4", None) - positivePrompt = kwargs.get("positivePrompt") - negativePrompt = kwargs.get("negativePrompt", None) - promptWeighting = kwargs.get("Prompt Weighting", "Disabled") - style = kwargs.get("style", "No style") - dimensions = kwargs.get("dimensions", "Square HD (1024x1024)") - width = kwargs.get("width", 1024) - height = kwargs.get("height", 1024) - steps = kwargs.get("steps", 25) - scheduler = kwargs.get("scheduler", "Default") - cfgScale = kwargs.get("cfgScale", 6.5) - strength = kwargs.get("strength", 15) - clipSkip = kwargs.get("clipSkip", 0) - seed = kwargs.get("seed") - batchSize = kwargs.get("batchSize", 1) - - imageList = [rwUtils.convertTensor2IMG(image1)] - if (image2 is not None): - imageList.append(rwUtils.convertTensor2IMG(image2)) - if (image3 is not None): - imageList.append(rwUtils.convertTensor2IMG(image3)) - if (image4 is not None): - imageList.append(rwUtils.convertTensor2IMG(image4)) - - genConfig = [ - { - "taskType": "photoMaker", - "taskUUID": rwUtils.genRandUUID(), - "model": runwareModel, - "inputImages": imageList, - "positivePrompt": positivePrompt, - "style": style, - "strength": strength, - "height": height, - "width": width, - "steps": steps, - "scheduler": scheduler, - "seed": seed, - "CFGScale": cfgScale, - "clipSkip": clipSkip, - "numberResults": batchSize, - "outputType": "URL", - "outputFormat": rwUtils.OUTPUT_FORMAT, - "outputQuality": rwUtils.OUTPUT_QUALITY, - } - ] - - if (negativePrompt is not None and negativePrompt != ""): - genConfig[0]["negativePrompt"] = negativePrompt - if (promptWeighting != "Disabled"): - if (promptWeighting == "sdEmbeds"): - genConfig[0]["promptWeighting"] = "sdEmbeds" - else: - genConfig[0]["promptWeighting"] = "compel" - - genResult = rwUtils.inferenecRequest(genConfig) - images = rwUtils.extractImageURLs(genResult) - return (images,) diff --git a/modules/providerSettings/__init__.py b/modules/providerSettings/__init__.py deleted file mode 100644 index b85256b..0000000 --- a/modules/providerSettings/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -""" -Runware Provider Settings Module -Contains all provider-specific settings nodes for Runware ComfyUI integration. -""" - diff --git a/modules/providerSettings/alibabaProviderSettings.py b/modules/providerSettings/alibabaProviderSettings.py deleted file mode 100644 index 098f197..0000000 --- a/modules/providerSettings/alibabaProviderSettings.py +++ /dev/null @@ -1,114 +0,0 @@ -""" -Runware Alibaba Provider Settings Node -Provides Alibaba-specific settings for image/video generation -""" - -from typing import Dict, Any - - -class RunwareAlibabaProviderSettings: - """Runware Alibaba Provider Settings Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "usePromptEnhancer": ("BOOLEAN", { - "tooltip": "Enable to include promptEnhancer parameter in provider settings", - "default": False, - }), - "promptEnhancer": ("BOOLEAN", { - "tooltip": "Enable prompt enhancement for Alibaba generation. Only used when 'Use Prompt Enhancer' is enabled.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "usePromptExtend": ("BOOLEAN", { - "tooltip": "Enable to include promptExtend parameter in provider settings", - "default": False, - }), - "promptExtend": ("BOOLEAN", { - "tooltip": "Enable LLM prompt rewriting. If enabled, a large language model (LLM) rewrites the input prompt. This can significantly improve the generation quality for shorter prompts but increases the time required. Only used when 'Use Prompt Extend' is enabled.", - "default": True, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useAudio": ("BOOLEAN", { - "tooltip": "Enable to include audio parameter in provider settings", - "default": False, - }), - "audio": ("BOOLEAN", { - "tooltip": "Automatically add audio (ignored if audio_url is set). Only used when 'Use Audio' is enabled.", - "default": True, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useShotType": ("BOOLEAN", { - "tooltip": "Enable to include shotType parameter in provider settings. Only applicable if promptExtend is enabled.", - "default": False, - }), - "shotType": (["single", "multi"], { - "tooltip": "Shot type for generation. Only applicable if promptExtend is true. Only used when 'Use Shot Type' is enabled.", - "default": "single", - }), - } - } - - RETURN_TYPES = ("RUNWAREPROVIDERSETTINGS",) - RETURN_NAMES = ("Provider Settings",) - FUNCTION = "createProviderSettings" - CATEGORY = "Runware/Provider Settings" - DESCRIPTION = "Configure Alibaba-specific provider settings for image/video generation including prompt enhancement, prompt extension, audio, and shot type." - - def createProviderSettings(self, **kwargs) -> tuple[Dict[str, Any]]: - """Create Alibaba provider settings""" - - # Get control parameters - usePromptEnhancer = kwargs.get("usePromptEnhancer", False) - usePromptExtend = kwargs.get("usePromptExtend", False) - useAudio = kwargs.get("useAudio", False) - useShotType = kwargs.get("useShotType", False) - - # Get value parameters - promptEnhancer = kwargs.get("promptEnhancer", False) - promptExtend = kwargs.get("promptExtend", True) - audio = kwargs.get("audio", True) - shotType = kwargs.get("shotType", "single") - - # Build settings dictionary - only include what is enabled - alibabaSettings: Dict[str, Any] = {} - - # Add promptEnhancer only if usePromptEnhancer is enabled - if usePromptEnhancer: - alibabaSettings["promptEnhancer"] = promptEnhancer - - # Add promptExtend only if usePromptExtend is enabled - if usePromptExtend: - alibabaSettings["promptExtend"] = promptExtend - - # Add audio only if useAudio is enabled - if useAudio: - alibabaSettings["audio"] = audio - - # Add shotType only if useShotType is enabled and promptExtend is enabled - if useShotType and usePromptExtend and promptExtend: - if shotType is not None and shotType != "None": - alibabaSettings["shotType"] = shotType - - # Clean up None values - alibabaSettings = {k: v for k, v in alibabaSettings.items() if v is not None} - - # Return flat dictionary - will be wrapped by inference node with provider name - return (alibabaSettings,) - - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareAlibabaProviderSettings": RunwareAlibabaProviderSettings, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareAlibabaProviderSettings": "Runware Alibaba Provider Settings", -} - diff --git a/modules/providerSettings/blackForestProviderSettings.py b/modules/providerSettings/blackForestProviderSettings.py deleted file mode 100644 index b831473..0000000 --- a/modules/providerSettings/blackForestProviderSettings.py +++ /dev/null @@ -1,66 +0,0 @@ -""" -Runware BlackForest Labs Provider Settings Node -Provides BlackForest Labs-specific settings for image generation -""" - -from typing import Dict, Any - -class RunwareBlackForestProviderSettings: - """Runware BlackForest Labs Provider Settings Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useSafetyTolerance": ("BOOLEAN", { - "tooltip": "Enable to include safetyTolerance parameter in API request", - "default": False, - }), - "safetyTolerance": ("INT", { - "tooltip": "Safety tolerance value for generation. Only used when 'Use Safety Tolerance' is enabled.", - "default": 0, - "min": 0, - "max": 100, - }), - } - } - - RETURN_TYPES = ("RUNWAREPROVIDERSETTINGS",) - RETURN_NAMES = ("Provider Settings",) - FUNCTION = "createProviderSettings" - CATEGORY = "Runware/Provider Settings" - DESCRIPTION = "Configure BlackForest Labs-specific provider settings for image generation including safety tolerance." - - def createProviderSettings(self, **kwargs) -> tuple[Dict[str, Any]]: - """Create BlackForest Labs provider settings""" - - # Get control parameters - useSafetyTolerance = kwargs.get("useSafetyTolerance", False) - - # Get value parameters - safetyTolerance = kwargs.get("safetyTolerance", 0) - - # Build settings dictionary - only include what is enabled - blackForestSettings: Dict[str, Any] = {} - - # Add safetyTolerance only if useSafetyTolerance is enabled - if useSafetyTolerance: - blackForestSettings["safetyTolerance"] = safetyTolerance - - # Clean up None values - blackForestSettings = {k: v for k, v in blackForestSettings.items() if v is not None} - - # Return flat dictionary - will be wrapped by inference node with provider name - return (blackForestSettings,) - - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareBlackForestProviderSettings": RunwareBlackForestProviderSettings, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareBlackForestProviderSettings": "Runware BlackForest Labs Provider Settings", -} - diff --git a/modules/providerSettings/briaProviderMask.py b/modules/providerSettings/briaProviderMask.py deleted file mode 100644 index ee2c8a7..0000000 --- a/modules/providerSettings/briaProviderMask.py +++ /dev/null @@ -1,228 +0,0 @@ -""" -Runware Bria Provider Mask Node -Creates mask configuration for Bria video eraser settings -""" - -from typing import Dict, Any, List - - -class RunwareBriaProviderMask: - """Runware Bria Provider Mask Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useForeground": ("BOOLEAN", { - "tooltip": "Enable to include mask.foreground parameter in API request.", - "default": False, - }), - "foreground": ("BOOLEAN", { - "tooltip": "Triggers the foreground mask endpoint. Only used when 'Use Foreground' is enabled.", - "default": True, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "usePrompt": ("BOOLEAN", { - "tooltip": "Enable to include mask.prompt parameter in API request.", - "default": False, - }), - "prompt": ("STRING", { - "tooltip": "Text instruction describing the object to be masked. Only used when 'Use Prompt' is enabled.", - "default": "", - "multiline": True, - }), - "useFrameIndex": ("BOOLEAN", { - "tooltip": "Enable to include mask.frameIndex parameter in API request.", - "default": False, - }), - "frameIndex": ("INT", { - "tooltip": "The frame number to apply key points to. Specifies which frame in the video to use for masking. Only used when 'Use Frame Index' is enabled.", - "default": 0, - "min": 0, - }), - "use_1": ("BOOLEAN", { - "tooltip": "Enable to include the first key point in the mask configuration.", - "default": False, - }), - "X1": ("INT", { - "tooltip": "X-coordinate of the first key point on the frame", - "default": 0, - "min": 0, - }), - "Y1": ("INT", { - "tooltip": "Y-coordinate of the first key point on the frame", - "default": 0, - "min": 0, - }), - "Type1": (["positive", "negative"], { - "tooltip": "Type of mask hint for first key point. 'positive' includes area, 'negative' excludes area.", - "default": "positive", - }), - "use_2": ("BOOLEAN", { - "tooltip": "Enable to include the second key point in the mask configuration.", - "default": False, - }), - "X2": ("INT", { - "tooltip": "X-coordinate of the second key point on the frame", - "default": 0, - "min": 0, - }), - "Y2": ("INT", { - "tooltip": "Y-coordinate of the second key point on the frame", - "default": 0, - "min": 0, - }), - "Type2": (["positive", "negative"], { - "tooltip": "Type of mask hint for second key point. 'positive' includes area, 'negative' excludes area.", - "default": "positive", - }), - "use_3": ("BOOLEAN", { - "tooltip": "Enable to include the third key point in the mask configuration.", - "default": False, - }), - "X3": ("INT", { - "tooltip": "X-coordinate of the third key point on the frame", - "default": 0, - "min": 0, - }), - "Y3": ("INT", { - "tooltip": "Y-coordinate of the third key point on the frame", - "default": 0, - "min": 0, - }), - "Type3": (["positive", "negative"], { - "tooltip": "Type of mask hint for third key point. 'positive' includes area, 'negative' excludes area.", - "default": "positive", - }), - "use_4": ("BOOLEAN", { - "tooltip": "Enable to include the fourth key point in the mask configuration.", - "default": False, - }), - "X4": ("INT", { - "tooltip": "X-coordinate of the fourth key point on the frame", - "default": 0, - "min": 0, - }), - "Y4": ("INT", { - "tooltip": "Y-coordinate of the fourth key point on the frame", - "default": 0, - "min": 0, - }), - "Type4": (["positive", "negative"], { - "tooltip": "Type of mask hint for fourth key point. 'positive' includes area, 'negative' excludes area.", - "default": "positive", - }), - "use_5": ("BOOLEAN", { - "tooltip": "Enable to include the fifth key point in the mask configuration.", - "default": False, - }), - "X5": ("INT", { - "tooltip": "X-coordinate of the fifth key point on the frame", - "default": 0, - "min": 0, - }), - "Y5": ("INT", { - "tooltip": "Y-coordinate of the fifth key point on the frame", - "default": 0, - "min": 0, - }), - "Type5": (["positive", "negative"], { - "tooltip": "Type of mask hint for fifth key point. 'positive' includes area, 'negative' excludes area.", - "default": "positive", - }), - "use_6": ("BOOLEAN", { - "tooltip": "Enable to include the sixth key point in the mask configuration.", - "default": False, - }), - "X6": ("INT", { - "tooltip": "X-coordinate of the sixth key point on the frame", - "default": 0, - "min": 0, - }), - "Y6": ("INT", { - "tooltip": "Y-coordinate of the sixth key point on the frame", - "default": 0, - "min": 0, - }), - "Type6": (["positive", "negative"], { - "tooltip": "Type of mask hint for sixth key point. 'positive' includes area, 'negative' excludes area.", - "default": "positive", - }), - } - } - - RETURN_TYPES = ("RUNWAREBRIAPROVIDERMASK",) - RETURN_NAMES = ("Bria Provider Setting Mask",) - FUNCTION = "createMask" - CATEGORY = "Runware/Provider Settings" - DESCRIPTION = "Create mask configuration for Bria video eraser settings. Supports foreground mask, text-based masking, and coordinate-based key points for precise object removal." - - def createMask(self, **kwargs) -> tuple[Dict[str, Any]]: - """Create mask configuration from provided parameters""" - - mask: Dict[str, Any] = {} - maskEnabled = False - - # Handle foreground - useForeground = kwargs.get("useForeground", False) - if useForeground: - foreground = kwargs.get("foreground", True) - mask["foreground"] = foreground - maskEnabled = True - - # Handle prompt - usePrompt = kwargs.get("usePrompt", False) - if usePrompt: - prompt = kwargs.get("prompt", "").strip() - if prompt: - mask["prompt"] = prompt - maskEnabled = True - - # Handle frameIndex - useFrameIndex = kwargs.get("useFrameIndex", False) - if useFrameIndex: - frameIndex = kwargs.get("frameIndex", 0) - mask["frameIndex"] = frameIndex - maskEnabled = True - - # Process key points - keyPoints: List[Dict[str, Any]] = [] - for i in range(1, 7): - use_key = kwargs.get(f"use_{i}", False) - - # Only process key point if use toggle is enabled - if use_key: - x = kwargs.get(f"X{i}", 0) - y = kwargs.get(f"Y{i}", 0) - point_type = kwargs.get(f"Type{i}", "positive") - - # Only add key point if both x and y are provided and at least one is non-zero - if x > 0 or y > 0: - keyPoints.append({ - "x": x, - "y": y, - "type": point_type - }) - - # Add keyPoints if any were provided - if len(keyPoints) > 0: - mask["keyPoints"] = keyPoints - maskEnabled = True - - # Only return mask if it has at least one property - if maskEnabled: - return (mask,) - else: - return ({},) - - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareBriaProviderMask": RunwareBriaProviderMask, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareBriaProviderMask": "Runware Bria Provider Mask", -} diff --git a/modules/providerSettings/briaProviderSettings.py b/modules/providerSettings/briaProviderSettings.py deleted file mode 100644 index c7701d7..0000000 --- a/modules/providerSettings/briaProviderSettings.py +++ /dev/null @@ -1,349 +0,0 @@ -""" -Runware Bria Provider Settings Node -Provides Bria-specific settings for image/video generation -""" - -from typing import Dict, Any - -class RunwareBriaProviderSettings: - """Runware Bria Provider Settings Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useMedium": ("BOOLEAN", { - "tooltip": "Enable to include medium parameter in API request. Disable if not needed.", - "default": False, - }), - "medium": (["None", "photography", "art"], { - "tooltip": "Select the medium type for image generation. Only used when 'Use Medium' is enabled.", - "default": "photography", - }), - "usePromptEnhancement": ("BOOLEAN", { - "tooltip": "Enable to include promptEnhancement parameter in API request.", - "default": False, - }), - "promptEnhancement": ("BOOLEAN", { - "tooltip": "When set to true, enhances the provided prompt by generating additional, more descriptive variations, resulting in more diverse and creative output images. Note that turning this flag on may result in a few additional seconds to the inference time. Only used when 'Use Prompt Enhancement' is enabled.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useEnhanceImage": ("BOOLEAN", { - "tooltip": "Enable to include enhanceImage parameter in API request.", - "default": False, - }), - "enhanceImage": ("BOOLEAN", { - "tooltip": "When set to true, generates images with richer details, sharper textures, and enhanced clarity. Slightly increases generation time per image. Only used when 'Use Enhance Image' is enabled.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "usePromptContentModeration": ("BOOLEAN", { - "tooltip": "Enable to include promptContentModeration parameter in API request.", - "default": False, - }), - "promptContentModeration": ("BOOLEAN", { - "tooltip": "When enabled (default: true), the input prompt is scanned for NSFW or ethically restricted terms before image generation. If the prompt violates Bria's ethical guidelines, the request will be rejected with a 408 error. Only used when 'Use Prompt Content Moderation' is enabled.", - "default": True, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useContentModeration": ("BOOLEAN", { - "tooltip": "Enable to include contentModeration parameter in API request.", - "default": False, - }), - "contentModeration": ("BOOLEAN", { - "tooltip": "When enabled, applies content moderation to both input visuals and generated outputs. Only used when 'Use Content Moderation' is enabled.", - "default": True, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useIpSignal": ("BOOLEAN", { - "tooltip": "Enable to include ipSignal parameter in API request.", - "default": False, - }), - "ipSignal": ("BOOLEAN", { - "tooltip": "Flags prompts with potential IP content. If detected, a warning will be included in the response. Only used when 'Use IP Signal' is enabled.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "usePreserveAlpha": ("BOOLEAN", { - "tooltip": "Enable to include preserveAlpha parameter in API request.", - "default": False, - }), - "preserveAlpha": ("BOOLEAN", { - "tooltip": "Preserve alpha channel in the image. Only used when 'Use Preserve Alpha' is enabled.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useMode": ("BOOLEAN", { - "tooltip": "Enable to include mode parameter in API request for Background Replace.", - "default": False, - }), - "mode": (["None", "base", "high_control", "fast"], { - "tooltip": "Selects the background-generation mode for Background Replace. Base: clean, high quality backgrounds. High_control: stronger prompt adherence and scene context, finer control over layout and details. Fast: same core capabilities as base, optimal speed and quality balance. Only used when 'Use Mode' is enabled.", - "default": "base", - }), - "useEnhanceReferenceImages": ("BOOLEAN", { - "tooltip": "Enable to include enhanceReferenceImages parameter in API request.", - "default": False, - }), - "enhanceReferenceImages": ("BOOLEAN", { - "tooltip": "When set to true, additional logic processes the included reference image to make adjustments for optimal results. Only used when 'Use Enhance Reference Images' is enabled.", - "default": True, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useRefinePrompt": ("BOOLEAN", { - "tooltip": "Enable to include refinePrompt parameter in API request.", - "default": False, - }), - "refinePrompt": ("BOOLEAN", { - "tooltip": "When true, an additional logic takes the prompt that was included and adjusts it to achieve optimal results. Only used when 'Use Refine Prompt' is enabled.", - "default": True, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useOriginalQuality": ("BOOLEAN", { - "tooltip": "Enable to include originalQuality parameter in API request.", - "default": False, - }), - "originalQuality": ("BOOLEAN", { - "tooltip": "When true, the output image retains the original input image's size; otherwise, the image is scaled to 1 megapixel (1MP) while preserving its aspect ratio. Only used when 'Use Original Quality' is enabled.", - "default": True, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useForceBackgroundDetection": ("BOOLEAN", { - "tooltip": "Enable to include forceBackgroundDetection parameter in API request.", - "default": False, - }), - "forceBackgroundDetection": ("BOOLEAN", { - "tooltip": "When true, forces background detection and removal, even if the original image already contains an alpha channel. Useful for refining existing foreground/background separation or ignoring unnecessary alpha channels. Only used when 'Use Force Background Detection' is enabled.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "usePreserveAudio": ("BOOLEAN", { - "tooltip": "Enable to include preserveAudio parameter in API request.", - "default": False, - }), - "preserveAudio": ("BOOLEAN", { - "tooltip": "Whether to keep the original audio track. Only used when 'Use Preserve Audio' is enabled.", - "default": True, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useAutoTrim": ("BOOLEAN", { - "tooltip": "Enable to include autoTrim parameter in API request.", - "default": False, - }), - "autoTrim": ("BOOLEAN", { - "tooltip": "If true, videos longer than 5 seconds are trimmed to the first 5 seconds. If false, videos longer than 5 seconds are rejected. Only used when 'Use Auto Trim' is enabled.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useSeason": ("BOOLEAN", { - "tooltip": "Enable to include season parameter (maps to /reseason).", - "default": False, - }), - "season": (["spring", "summer", "autumn", "winter"], { - "tooltip": "Desired season. Maps to /reseason.", - "default": "spring", - }), - "useEdit": ("BOOLEAN", { - "tooltip": "Enable to include edit parameter.", - "default": False, - }), - "edit": (["colorize", "relight", "restore", "blend", "reseason", "sketch_to_image"], { - "tooltip": "Edit mode: colorize, relight, restore, blend, reseason, sketch_to_image.", - "default": "restore", - }), - "useColor": ("BOOLEAN", { - "tooltip": "Enable to include color parameter (maps to /colorize).", - "default": False, - }), - "color": (["contemporary color", "vivid color", "black and white colors", "sepia vintage"], { - "tooltip": "Restoration/color style. Maps to /colorize.", - "default": "contemporary color", - }), - "useLightDirection": ("BOOLEAN", { - "tooltip": "Enable to include lightDirection parameter (maps to /relight).", - "default": False, - }), - "lightDirection": (["front", "side", "bottom", "top-down"], { - "tooltip": "Direction of light. Maps to /relight.", - "default": "front", - }), - "useLightType": ("BOOLEAN", { - "tooltip": "Enable to include lightType parameter (maps to /relight).", - "default": False, - }), - "lightType": ([ - "midday", "blue hour light", "low-angle sunlight", "sunrise light", - "spotlight on subject, keep background settings", "overcast light", - "soft overcast daylight lighting", "cloud-filtered lighting", "fog-diffused lighting", - "moonlight lighting", "starlight lighting nighttime", "soft bokeh lighting", - "harsh studio lighting keep background setting", - ], { - "tooltip": "Type of lighting. Maps to /relight.", - "default": "midday", - }), - "Bria Provider Setting Mask": ("RUNWAREBRIAPROVIDERMASK", { - "tooltip": "Connect Runware Bria Provider Mask node to provide mask configuration for video eraser operations.", - }), - } - } - - RETURN_TYPES = ("RUNWAREPROVIDERSETTINGS",) - RETURN_NAMES = ("providerSettings",) - FUNCTION = "create_provider_settings" - CATEGORY = "Runware/Provider Settings" - DESCRIPTION = "Configure Bria-specific provider settings for image generation, background replacement, and video operations including medium type, prompt enhancement, content moderation, and background replace mode." - - def create_provider_settings(self, **kwargs) -> tuple[Dict[str, Any]]: - """Create Bria provider settings""" - - # Get use parameters - useMedium = kwargs.get("useMedium", False) - usePromptEnhancement = kwargs.get("usePromptEnhancement", False) - useEnhanceImage = kwargs.get("useEnhanceImage", False) - usePromptContentModeration = kwargs.get("usePromptContentModeration", False) - useContentModeration = kwargs.get("useContentModeration", False) - useIpSignal = kwargs.get("useIpSignal", False) - usePreserveAlpha = kwargs.get("usePreserveAlpha", False) - useMode = kwargs.get("useMode", False) - useEnhanceReferenceImages = kwargs.get("useEnhanceReferenceImages", False) - useRefinePrompt = kwargs.get("useRefinePrompt", False) - useOriginalQuality = kwargs.get("useOriginalQuality", False) - useForceBackgroundDetection = kwargs.get("useForceBackgroundDetection", False) - usePreserveAudio = kwargs.get("usePreserveAudio", False) - useAutoTrim = kwargs.get("useAutoTrim", False) - useSeason = kwargs.get("useSeason", False) - useEdit = kwargs.get("useEdit", False) - useColor = kwargs.get("useColor", False) - useLightDirection = kwargs.get("useLightDirection", False) - useLightType = kwargs.get("useLightType", False) - - # Get actual parameters - medium = kwargs.get("medium", "photography") - promptEnhancement = kwargs.get("promptEnhancement", False) - enhanceImage = kwargs.get("enhanceImage", False) - promptContentModeration = kwargs.get("promptContentModeration", True) - contentModeration = kwargs.get("contentModeration", True) - ipSignal = kwargs.get("ipSignal", False) - preserveAlpha = kwargs.get("preserveAlpha", False) - mode = kwargs.get("mode", "base") - enhanceReferenceImages = kwargs.get("enhanceReferenceImages", True) - refinePrompt = kwargs.get("refinePrompt", True) - originalQuality = kwargs.get("originalQuality", True) - forceBackgroundDetection = kwargs.get("forceBackgroundDetection", False) - preserveAudio = kwargs.get("preserveAudio", True) - autoTrim = kwargs.get("autoTrim", False) - season = kwargs.get("season", "spring") - edit = kwargs.get("edit", "restore") - color = kwargs.get("color", "contemporary color") - lightDirection = kwargs.get("lightDirection", "front") - lightType = kwargs.get("lightType", "midday") - mask = kwargs.get("Bria Provider Setting Mask", None) - - # Build settings dictionary - settings = {} - - # Add medium only if useMedium is enabled - if useMedium and medium is not None and medium != "None": - settings["medium"] = medium - - # Add promptEnhancement only if usePromptEnhancement is enabled - if usePromptEnhancement: - settings["promptEnhancement"] = promptEnhancement - - # Add enhanceImage only if useEnhanceImage is enabled - if useEnhanceImage: - settings["enhanceImage"] = enhanceImage - - # Add promptContentModeration only if usePromptContentModeration is enabled - if usePromptContentModeration: - settings["promptContentModeration"] = promptContentModeration - - # Add contentModeration only if useContentModeration is enabled - if useContentModeration: - settings["contentModeration"] = contentModeration - - # Add ipSignal only if useIpSignal is enabled - if useIpSignal: - settings["ipSignal"] = ipSignal - - # Add preserveAlpha only if usePreserveAlpha is enabled - if usePreserveAlpha: - settings["preserveAlpha"] = preserveAlpha - - # Add mode only if useMode is enabled (for Background Replace) - if useMode and mode is not None and mode != "None": - settings["mode"] = mode - - # Add enhanceReferenceImages only if useEnhanceReferenceImages is enabled - if useEnhanceReferenceImages: - settings["enhanceReferenceImages"] = enhanceReferenceImages - - # Add refinePrompt only if useRefinePrompt is enabled - if useRefinePrompt: - settings["refinePrompt"] = refinePrompt - - # Add originalQuality only if useOriginalQuality is enabled - if useOriginalQuality: - settings["originalQuality"] = originalQuality - - # Add forceBackgroundDetection only if useForceBackgroundDetection is enabled - if useForceBackgroundDetection: - settings["forceBackgroundDetection"] = forceBackgroundDetection - - # Add preserveAudio only if usePreserveAudio is enabled - if usePreserveAudio: - settings["preserveAudio"] = preserveAudio - - # Add autoTrim only if useAutoTrim is enabled - if useAutoTrim: - settings["autoTrim"] = autoTrim - - # Add season only if useSeason is enabled (maps to /reseason) - if useSeason: - settings["season"] = season - - # Add edit only if useEdit is enabled - if useEdit: - settings["edit"] = edit - - # Add color only if useColor is enabled (maps to /colorize) - if useColor: - settings["color"] = color - - # Add relight params (Bria API expects camelCase) - if useLightDirection: - settings["lightDirection"] = lightDirection - if useLightType: - settings["lightType"] = lightType - - # Add mask if provided from Mask node - if mask is not None and isinstance(mask, dict) and len(mask) > 0: - settings["mask"] = mask - - # Clean up None values - settings = {k: v for k, v in settings.items() if v is not None} - - return (settings,) - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareBriaProviderSettings": RunwareBriaProviderSettings, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareBriaProviderSettings": "Runware Bria Provider Settings", -} diff --git a/modules/providerSettings/bytedanceProviderSettings.py b/modules/providerSettings/bytedanceProviderSettings.py deleted file mode 100644 index 11ccde4..0000000 --- a/modules/providerSettings/bytedanceProviderSettings.py +++ /dev/null @@ -1,132 +0,0 @@ -""" -Runware Bytedance Provider Settings Node -Provides Bytedance-specific settings for image/video generation -""" - -from typing import Dict, Any - -class RunwareBytedanceProviderSettings: - """Runware Bytedance Provider Settings Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useCameraFixed": ("BOOLEAN", { - "tooltip": "Enable to include cameraFixed parameter in provider settings", - "default": False, - }), - "cameraFixed": ("BOOLEAN", { - "tooltip": "Enable to fix camera position during video generation", - "default": False, - }), - "useMaxSequentialImages": ("BOOLEAN", { - "tooltip": "Enable to include maxSequentialImages parameter in provider settings", - "default": False, - }), - "maxSequentialImages": ("INT", { - "tooltip": "Maximum number of sequential images to generate (1-15)", - "default": 1, - "min": 1, - "max": 15, - }), - "useFastMode": ("BOOLEAN", { - "tooltip": "Enable to include fastMode parameter in provider settings", - "default": False, - }), - "fastMode": ("BOOLEAN", { - "tooltip": "When enabled, speeds up generation by sacrificing some effects. Default: false. RTF: 25-28 (fast) vs 35 (normal). Supported by OmniHuman 1.5.", - "default": False, - }), - "useAudio": ("BOOLEAN", { - "tooltip": "Enable to include audio parameter in provider settings.", - "default": False, - }), - "audio": ("BOOLEAN", { - "tooltip": "Enable audio generation support when available.", - "default": False, - }), - "useDraft": ("BOOLEAN", { - "tooltip": "Enable to include draft parameter in provider settings", - "default": False, - }), - "draft": ("BOOLEAN", { - "tooltip": "Enable draft mode for Bytedance provider", - "default": False, - }), - "useOptimizePromptMode": ("BOOLEAN", { - "tooltip": "Enable to include optimizePromptMode parameter in provider settings", - "default": False, - }), - "optimizePromptMode": (["standard", "fast"], { - "tooltip": "Prompt optimization mode. standard: higher quality, longer time. fast: faster generation, average quality.", - "default": "standard", - }), - } - } - - 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 Bytedance provider settings""" - - # Get control parameters - useCameraFixed = kwargs.get("useCameraFixed", False) - useMaxSequentialImages = kwargs.get("useMaxSequentialImages", False) - useFastMode = kwargs.get("useFastMode", False) - useAudio = kwargs.get("useAudio", False) - useDraft = kwargs.get("useDraft", False) - useOptimizePromptMode = kwargs.get("useOptimizePromptMode", False) - - # Get value parameters - cameraFixed = kwargs.get("cameraFixed", False) - maxSequentialImages = kwargs.get("maxSequentialImages", 1) - fastMode = kwargs.get("fastMode", False) - audio = kwargs.get("audio", False) - draft = kwargs.get("draft", False) - optimizePromptMode = kwargs.get("optimizePromptMode", "standard") - - # Build settings dictionary - only include what is enabled - settings = {} - - # Add cameraFixed only if useCameraFixed is enabled - if useCameraFixed: - settings["cameraFixed"] = cameraFixed - - # Add maxSequentialImages only if useMaxSequentialImages is enabled - if useMaxSequentialImages: - settings["maxSequentialImages"] = maxSequentialImages - - # Add fastMode only if useFastMode is enabled - if useFastMode: - settings["fastMode"] = fastMode - - # Add audio only if useAudio is enabled - if useAudio: - settings["audio"] = audio - - # Add draft only if useDraft is enabled - if useDraft: - settings["draft"] = draft - - # Add optimizePromptMode only if useOptimizePromptMode is enabled - if useOptimizePromptMode: - settings["optimizePromptMode"] = optimizePromptMode - - # Clean up None values - settings = {k: v for k, v in settings.items() if v is not None} - - return (settings,) - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareBytedanceProviderSettings": RunwareBytedanceProviderSettings, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareBytedanceProviderSettings": "Runware Bytedance Provider Settings", -} diff --git a/modules/providerSettings/elevenlabsProviderSettings.py b/modules/providerSettings/elevenlabsProviderSettings.py deleted file mode 100644 index 51381b5..0000000 --- a/modules/providerSettings/elevenlabsProviderSettings.py +++ /dev/null @@ -1,65 +0,0 @@ -class RunwareElevenLabsProviderSettings: - def __init__(self): - pass - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "positiveGlobalStyles": ("STRING", { - "multiline": True, - "default": "rock, energetic", - "tooltip": "Global positive styles for the entire song (comma-separated): positiveGlobalStyles" - }), - "negativeGlobalStyles": ("STRING", { - "multiline": True, - "default": "slow, quiet", - "tooltip": "Global negative styles for the entire song (comma-separated): negativeGlobalStyles" - }), - }, - "optional": { - "sections": ("RUNWAREAUDIOSECTIONS", { - "tooltip": "Connect multiple Runware Audio Sections nodes to define song structure" - }), - } - } - - RETURN_TYPES = ("RUNWAREPROVIDERSETTINGS",) - RETURN_NAMES = ("providerSettings",) - FUNCTION = "create_provider_settings" - CATEGORY = "Runware/Audio" - - def create_provider_settings(self, **kwargs): - positiveGlobalStyles = kwargs.get("positiveGlobalStyles", "") - negativeGlobalStyles = kwargs.get("negativeGlobalStyles", "") - sections = kwargs.get("sections", []) - - # Parse styles from comma-separated strings - positiveStyles = [style.strip() for style in positiveGlobalStyles.split(",") if style.strip()] - negativeStyles = [style.strip() for style in negativeGlobalStyles.split(",") if style.strip()] - - # Handle sections - can be single section or list of sections - sections_list = [] - if sections: - if isinstance(sections, list): - sections_list = sections - else: - sections_list = [sections] - - # Build the music composition plan - - - music = { - "compositionPlan": { - "positiveGlobalStyles": positiveStyles, - "negativeGlobalStyles": negativeStyles, - "sections": sections_list - } - } - - # Return flat dictionary - will be wrapped by inference node with provider name (same pattern as video provider settings) - providerSettings = { - "music": music - } - - return (providerSettings,) diff --git a/modules/providerSettings/elevenlabsProviderSettingsSections.py b/modules/providerSettings/elevenlabsProviderSettingsSections.py deleted file mode 100644 index d505c92..0000000 --- a/modules/providerSettings/elevenlabsProviderSettingsSections.py +++ /dev/null @@ -1,56 +0,0 @@ -class RunwareElevenLabsProviderSettingsSections: - def __init__(self): - pass - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "sectionName": ("STRING", { - "default": "intro", - "tooltip": "Name of the section" - }), - "positiveLocalStyles": ("STRING", { - "default": "guitar, buildup", - "tooltip": "Local positive styles for this section (comma-separated): positiveLocalStyles" - }), - "negativeLocalStyles": ("STRING", { - "default": "vocals", - "tooltip": "Local negative styles for this section (comma-separated): negativeLocalStyles" - }), - "duration": ("INT", { - "default": 15, - "min": 3, - "max": 120, - "tooltip": "Duration of the section in seconds (3-120)" - }), - "lines": ("STRING", { - "multiline": True, - "default": "", - "tooltip": "Lyrics for the section (one line per line)" - }), - } - } - - RETURN_TYPES = ("RUNWAREAUDIOSECTIONS",) - RETURN_NAMES = ("sections",) - FUNCTION = "create_sections" - CATEGORY = "Runware/Audio" - - def create_sections(self, **kwargs): - sectionName = kwargs.get("sectionName", "") - positiveLocalStyles = kwargs.get("positiveLocalStyles", "") - negativeLocalStyles = kwargs.get("negativeLocalStyles", "") - duration = kwargs.get("duration", 0) - lines = kwargs.get("lines", "") - - # Create section object - section = { - "sectionName": sectionName, - "positiveLocalStyles": [style.strip() for style in positiveLocalStyles.split(",") if style.strip()], - "negativeLocalStyles": [style.strip() for style in negativeLocalStyles.split(",") if style.strip()], - "duration": duration, - "lines": [line.strip() for line in lines.split("\n") if line.strip()] - } - - return (section,) diff --git a/modules/providerSettings/googleProviderSettings.py b/modules/providerSettings/googleProviderSettings.py deleted file mode 100644 index c2bbaed..0000000 --- a/modules/providerSettings/googleProviderSettings.py +++ /dev/null @@ -1,108 +0,0 @@ -""" -Runware Google Provider Settings Node -Provides Google-specific settings for image/video generation -""" - -from typing import Dict, Any - - -class RunwareGoogleProviderSettings: - """Runware Google Provider Settings Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useGenerateAudio": ("BOOLEAN", { - "tooltip": "Enable to include generateAudio parameter in provider settings", - "default": False, - }), - "generateAudio": ("BOOLEAN", { - "tooltip": "Enable audio generation. Only used when 'Use Generate Audio' is enabled.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useEnhancePrompt": ("BOOLEAN", { - "tooltip": "Enable to include enhancePrompt parameter in provider settings", - "default": False, - }), - "enhancePrompt": ("BOOLEAN", { - "tooltip": "Enable prompt enhancement for Google generation. Only used when 'Use Enhance Prompt' is enabled.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useSearch": ("BOOLEAN", { - "tooltip": "Enable to include search parameter in provider settings", - "default": False, - }), - "search": ("BOOLEAN", { - "tooltip": "Enable search functionality. Only used when 'Use Search' is enabled.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useResizeMode": ("BOOLEAN", { - "tooltip": "Enable to include resizeMode in providerSettings.google (image resize behavior).", - "default": False, - }), - "resizeMode": (["crop", "pad"], { - "tooltip": "Value for providerSettings.google.resizeMode. Must be 'crop' or 'pad'. Only used when 'Use Resize Mode' is enabled.", - "default": "crop", - }), - } - } - - RETURN_TYPES = ("RUNWAREPROVIDERSETTINGS",) - RETURN_NAMES = ("Provider Settings",) - FUNCTION = "createProviderSettings" - CATEGORY = "Runware/Provider Settings" - DESCRIPTION = "Configure Google-specific provider settings for image/video generation including audio generation, prompt enhancement, search, and resizeMode (crop/pad)." - - def createProviderSettings(self, **kwargs) -> tuple[Dict[str, Any]]: - """Create Google provider settings""" - - # Get control parameters - useGenerateAudio = kwargs.get("useGenerateAudio", False) - useEnhancePrompt = kwargs.get("useEnhancePrompt", False) - useSearch = kwargs.get("useSearch", False) - useResizeMode = kwargs.get("useResizeMode", False) - - # Get value parameters - generateAudio = kwargs.get("generateAudio", False) - enhancePrompt = kwargs.get("enhancePrompt", False) - search = kwargs.get("search", False) - resizeMode = kwargs.get("resizeMode", "crop") - - # Build settings dictionary - only include what is enabled - googleSettings: Dict[str, Any] = {} - - # Add parameters only if their use toggles are enabled - if useGenerateAudio: - googleSettings["generateAudio"] = generateAudio - if useEnhancePrompt: - googleSettings["enhancePrompt"] = enhancePrompt - if useSearch: - googleSettings["search"] = search - if useResizeMode: - mode = str(resizeMode).strip().lower() if resizeMode is not None else "crop" - googleSettings["resizeMode"] = mode if mode in ("crop", "pad") else "crop" - - # Clean up None values - googleSettings = {k: v for k, v in googleSettings.items() if v is not None} - - # Return flat dictionary - will be wrapped by inference node with provider name - return (googleSettings,) - - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareGoogleProviderSettings": RunwareGoogleProviderSettings, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareGoogleProviderSettings": "Runware Google Provider Settings", -} - diff --git a/modules/providerSettings/klingMultiPromptSegment.py b/modules/providerSettings/klingMultiPromptSegment.py deleted file mode 100644 index 3298154..0000000 --- a/modules/providerSettings/klingMultiPromptSegment.py +++ /dev/null @@ -1,47 +0,0 @@ -""" -Runware Kling MultiPrompt Segment Node -Creates a single prompt/duration entry for Kling multiPrompt provider settings -""" - -from typing import Dict, Any - - -class RunwareKlingMultiPromptSegment: - """Runware Kling MultiPrompt Segment Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "prompt": ("STRING", { - "multiline": True, - "default": "", - "tooltip": "Prompt for this segment of the video", - }), - "duration": ("INT", { - "default": 4, - "min": 1, - "max": 30, - "step": 1, - "tooltip": "Duration in seconds for this segment", - }), - }, - } - - RETURN_TYPES = ("RUNWAREKLINGMULTIPROMPTSEGMENT",) - RETURN_NAMES = ("MultiPrompt Segment",) - FUNCTION = "createSegment" - CATEGORY = "Runware/Provider Settings" - DESCRIPTION = "Create a prompt/duration segment for Kling multiPrompt. Connect multiple segments to Runware Kling Provider Settings MultiPrompt." - - def createSegment(self, prompt: str, duration: int) -> tuple[Dict[str, Any]]: - return ({"prompt": prompt.strip(), "duration": int(duration)},) - - -NODE_CLASS_MAPPINGS = { - "RunwareKlingMultiPromptSegment": RunwareKlingMultiPromptSegment, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareKlingMultiPromptSegment": "Runware Kling MultiPrompt Segment", -} diff --git a/modules/providerSettings/klingProviderSettings.py b/modules/providerSettings/klingProviderSettings.py deleted file mode 100644 index 2015df1..0000000 --- a/modules/providerSettings/klingProviderSettings.py +++ /dev/null @@ -1,230 +0,0 @@ -""" -Runware KlingAI Provider Settings Node -Provides KlingAI-specific settings for video generation -""" - -from typing import Dict, Any, List - - -class RunwareKlingProviderSettings: - """Runware KlingAI Provider Settings Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useCameraControl": ("BOOLEAN", { - "tooltip": "Enable to include cameraControl parameter in provider settings", - "default": False, - }), - "cameraControl": (["none", "static", "dynamic", "zoom_in", "zoom_out", "pan_left", "pan_right", "tilt_up", "tilt_down", "smooth"], { - "tooltip": "Camera control mode for KlingAI video generation", - "default": "none", - }), - "useSoundVolume": ("BOOLEAN", { - "tooltip": "Enable to include soundVolume parameter in provider settings", - "default": False, - }), - "soundVolume": ("FLOAT", { - "tooltip": "Background sound volume to mix with generated audio (provider key: soundVolume).", - "default": 1.0, - "min": 0.0, - "max": 2.0, - "step": 0.1, - }), - "useOriginalAudioVolume": ("BOOLEAN", { - "tooltip": "Enable to include originalAudioVolume parameter in provider settings", - "default": False, - }), - "originalAudioVolume": ("FLOAT", { - "tooltip": "Original video volume mix level (provider key: originalAudioVolume). No effect if source has no audio.", - "default": 1.0, - "min": 0.0, - "max": 2.0, - "step": 0.1, - }), - "useSoundEffectPrompt": ("BOOLEAN", { - "tooltip": "Enable to include soundEffectPrompt parameter in provider settings", - "default": False, - }), - "soundEffectPrompt": ("STRING", { - "multiline": True, - "tooltip": "Prompt describing the sound effect to generate", - "default": "", - }), - "useBgmPrompt": ("BOOLEAN", { - "tooltip": "Enable to include bgmPrompt parameter in provider settings", - "default": False, - }), - "bgmPrompt": ("STRING", { - "multiline": True, - "tooltip": "Prompt describing the background music to generate", - "default": "", - }), - "useAsmrMode": ("BOOLEAN", { - "tooltip": "Enable to include asmrMode parameter in provider settings", - "default": False, - }), - "asmrMode": ("BOOLEAN", { - "tooltip": "Enable ASMR mode for audio generation", - "default": False, - }), - "useKeepOriginalSound": ("BOOLEAN", { - "tooltip": "Enable to include keepOriginalSound parameter in provider settings", - "default": False, - }), - "keepOriginalSound": ("BOOLEAN", { - "tooltip": "Keep the original sound from the source video. Only used when 'Use Keep Original Sound' is enabled.", - "default": True, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useSound": ("BOOLEAN", { - "tooltip": "Enable to include sound parameter in provider settings", - "default": False, - }), - "sound": ("BOOLEAN", { - "tooltip": "Whether sound is generated simultaneously when generating a video", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useCharacterOrientation": ("BOOLEAN", { - "tooltip": "Enable to include characterOrientation parameter in provider settings", - "default": False, - }), - "characterOrientation": (["image", "video"], { - "tooltip": "Character orientation mode. 'image': has the same orientation as the person in the picture (reference video duration should not exceed 10 seconds). 'video': consistent with the orientation of the characters in the video (reference video duration should not exceed 30 seconds). Only used when 'Use Character Orientation' is enabled.", - "default": "image", - }), - "useMultiprompt": ("BOOLEAN", { - "tooltip": "Enable to include multiPrompt in provider settings. When enabled, connect Runware Kling MultiPrompt Segment nodes.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "MultiPrompt Segment 1": ("RUNWAREKLINGMULTIPROMPTSEGMENT", { - "tooltip": "Connect a Runware Kling MultiPrompt Segment. Only used when 'Use Multiprompt' is enabled.", - }), - "MultiPrompt Segment 2": ("RUNWAREKLINGMULTIPROMPTSEGMENT", { - "tooltip": "Connect a Runware Kling MultiPrompt Segment. Only used when 'Use Multiprompt' is enabled.", - }), - "MultiPrompt Segment 3": ("RUNWAREKLINGMULTIPROMPTSEGMENT", { - "tooltip": "Connect a Runware Kling MultiPrompt Segment. Only used when 'Use Multiprompt' is enabled.", - }), - "MultiPrompt Segment 4": ("RUNWAREKLINGMULTIPROMPTSEGMENT", { - "tooltip": "Connect a Runware Kling MultiPrompt Segment. Only used when 'Use Multiprompt' is enabled.", - }), - "MultiPrompt Segment 5": ("RUNWAREKLINGMULTIPROMPTSEGMENT", { - "tooltip": "Connect a Runware Kling MultiPrompt Segment. Only used when 'Use Multiprompt' is enabled.", - }), - "MultiPrompt Segment 6": ("RUNWAREKLINGMULTIPROMPTSEGMENT", { - "tooltip": "Connect a Runware Kling MultiPrompt Segment. Only used when 'Use Multiprompt' is enabled.", - }), - } - } - - RETURN_TYPES = ("RUNWAREPROVIDERSETTINGS",) - RETURN_NAMES = ("Provider Settings",) - FUNCTION = "createProviderSettings" - CATEGORY = "Runware/Provider Settings" - DESCRIPTION = "Configure KlingAI-specific provider settings for video generation including camera control, audio volume, sound effects, ASMR mode, and sound generation." - - def createProviderSettings(self, **kwargs) -> tuple[Dict[str, Any]]: - """Create KlingAI provider settings""" - - # Get control parameters - useCameraControl = kwargs.get("useCameraControl", False) - useSoundVolume = kwargs.get("useSoundVolume", False) - useOriginalAudioVolume = kwargs.get("useOriginalAudioVolume", False) - useSoundEffectPrompt = kwargs.get("useSoundEffectPrompt", False) - useBgmPrompt = kwargs.get("useBgmPrompt", False) - useAsmrMode = kwargs.get("useAsmrMode", False) - useKeepOriginalSound = kwargs.get("useKeepOriginalSound", False) - useSound = kwargs.get("useSound", False) - useCharacterOrientation = kwargs.get("useCharacterOrientation", False) - useMultiprompt = kwargs.get("useMultiprompt", False) - - # Get value parameters - cameraControl = kwargs.get("cameraControl", "none") - soundVolume = kwargs.get("soundVolume", 1.0) - originalAudioVolume = kwargs.get("originalAudioVolume", 1.0) - soundEffectPrompt = kwargs.get("soundEffectPrompt", "") - bgmPrompt = kwargs.get("bgmPrompt", "") - asmrMode = kwargs.get("asmrMode", False) - keepOriginalSound = kwargs.get("keepOriginalSound", True) - sound = kwargs.get("sound", False) - characterOrientation = kwargs.get("characterOrientation", "image") - - # Build settings dictionary - only include what is enabled - klingSettings: Dict[str, Any] = {} - - # Add cameraControl only if useCameraControl is enabled and not "none" - if useCameraControl and cameraControl != "none": - klingSettings["cameraControl"] = cameraControl - - # Add soundVolume only if useSoundVolume is enabled - if useSoundVolume: - klingSettings["soundVolume"] = float(soundVolume) - - # Add originalAudioVolume only if useOriginalAudioVolume is enabled - if useOriginalAudioVolume: - klingSettings["originalAudioVolume"] = float(originalAudioVolume) - - # Add soundEffectPrompt only if useSoundEffectPrompt is enabled and not empty - if useSoundEffectPrompt and soundEffectPrompt and soundEffectPrompt.strip(): - klingSettings["soundEffectPrompt"] = soundEffectPrompt.strip() - - # Add bgmPrompt only if useBgmPrompt is enabled and not empty - if useBgmPrompt and bgmPrompt and bgmPrompt.strip(): - klingSettings["bgmPrompt"] = bgmPrompt.strip() - - # Add asmrMode only if useAsmrMode is enabled - if useAsmrMode: - klingSettings["asmrMode"] = asmrMode - - # Add keepOriginalSound only if useKeepOriginalSound is enabled - if useKeepOriginalSound: - klingSettings["keepOriginalSound"] = keepOriginalSound - - # Add sound only if useSound is enabled - if useSound: - klingSettings["sound"] = sound - - # Add characterOrientation only if useCharacterOrientation is enabled - if useCharacterOrientation and characterOrientation: - klingSettings["characterOrientation"] = characterOrientation - - # Add multiPrompt only if useMultiprompt is enabled - if useMultiprompt: - segments: List[Dict[str, Any]] = [] - for i in range(1, 7): - segment = kwargs.get(f"MultiPrompt Segment {i}") - if segment is not None and isinstance(segment, dict): - prompt = segment.get("prompt", "").strip() - if prompt: - segments.append({ - "prompt": prompt, - "duration": int(segment.get("duration", 4)), - }) - if segments: - klingSettings["multiPrompt"] = segments - - # Clean up None values - klingSettings = {k: v for k, v in klingSettings.items() if v is not None} - - # Return flat dictionary - will be wrapped by inference node with provider name (same pattern as video provider settings) - return (klingSettings,) - - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareKlingProviderSettings": RunwareKlingProviderSettings, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareKlingProviderSettings": "Runware KlingAI Provider Settings", -} - - diff --git a/modules/providerSettings/klingProviderSettingsMultiPrompt.py b/modules/providerSettings/klingProviderSettingsMultiPrompt.py deleted file mode 100644 index 0604f75..0000000 --- a/modules/providerSettings/klingProviderSettingsMultiPrompt.py +++ /dev/null @@ -1,91 +0,0 @@ -""" -Runware Kling Provider Settings MultiPrompt Node -Adds multiPrompt to Kling provider settings. Connects to Runware Kling Provider Settings -and outputs merged provider settings for Video Inference. -""" - -from typing import Dict, Any, List - - -class RunwareKlingProviderSettingsMultiPrompt: - """Runware Kling Provider Settings MultiPrompt Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "providerSettings": ("RUNWAREPROVIDERSETTINGS", { - "tooltip": "Connect Runware KlingAI Provider Settings to merge with multiPrompt", - }), - }, - "optional": { - "MultiPrompt Segment 1": ("RUNWAREKLINGMULTIPROMPTSEGMENT", { - "tooltip": "Connect a Runware Kling MultiPrompt Segment", - }), - "MultiPrompt Segment 2": ("RUNWAREKLINGMULTIPROMPTSEGMENT", { - "tooltip": "Connect a Runware Kling MultiPrompt Segment", - }), - "MultiPrompt Segment 3": ("RUNWAREKLINGMULTIPROMPTSEGMENT", { - "tooltip": "Connect a Runware Kling MultiPrompt Segment", - }), - "MultiPrompt Segment 4": ("RUNWAREKLINGMULTIPROMPTSEGMENT", { - "tooltip": "Connect a Runware Kling MultiPrompt Segment", - }), - "MultiPrompt Segment 5": ("RUNWAREKLINGMULTIPROMPTSEGMENT", { - "tooltip": "Connect a Runware Kling MultiPrompt Segment", - }), - "MultiPrompt Segment 6": ("RUNWAREKLINGMULTIPROMPTSEGMENT", { - "tooltip": "Connect a Runware Kling MultiPrompt Segment", - }), - } - } - - RETURN_TYPES = ("RUNWAREPROVIDERSETTINGS",) - RETURN_NAMES = ("Provider Settings",) - FUNCTION = "mergeProviderSettings" - CATEGORY = "Runware/Provider Settings" - DESCRIPTION = "Add multiPrompt to Kling provider settings. Connect Runware KlingAI Provider Settings and one or more Runware Kling MultiPrompt Segment nodes. Output connects to Runware Video Inference." - - def mergeProviderSettings(self, **kwargs) -> tuple[Dict[str, Any]]: - """Merge Kling provider settings with multiPrompt segments""" - - provider_settings = kwargs.get("providerSettings") - segments: List[Dict[str, Any]] = [] - - for i in range(1, 7): - segment = kwargs.get(f"MultiPrompt Segment {i}") - if segment is not None and isinstance(segment, dict): - prompt = segment.get("prompt", "").strip() - if prompt: - segments.append({ - "prompt": prompt, - "duration": int(segment.get("duration", 4)), - }) - - # Start with existing provider settings or empty dict - if isinstance(provider_settings, dict): - # May be flat (from Kling) or wrapped {"klingai": {...}} - if "klingai" in provider_settings: - kling_settings = dict(provider_settings["klingai"]) - else: - kling_settings = dict(provider_settings) - else: - kling_settings = {} - - if segments: - kling_settings["multiPrompt"] = segments - - if not kling_settings: - return ({},) - - # Output format expected by video inference: wrap with klingai if flat - return ({"klingai": kling_settings},) - - -NODE_CLASS_MAPPINGS = { - "RunwareKlingProviderSettingsMultiPrompt": RunwareKlingProviderSettingsMultiPrompt, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareKlingProviderSettingsMultiPrompt": "Runware Kling Provider Settings MultiPrompt", -} diff --git a/modules/providerSettings/lightricksProviderSettings.py b/modules/providerSettings/lightricksProviderSettings.py deleted file mode 100644 index e5ff6c5..0000000 --- a/modules/providerSettings/lightricksProviderSettings.py +++ /dev/null @@ -1,102 +0,0 @@ -""" -Runware Lightricks Provider Settings Node -Provides Lightricks-specific settings for video generation -""" - -from typing import Dict, Any - -class RunwareLightricksProviderSettings: - """Runware Lightricks Provider Settings Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - - "useGenerateAudio": ("BOOLEAN", { - "tooltip": "Enable to override the audio generation flag. Disable to keep the default behavior.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "generateAudio": ("BOOLEAN", { - "tooltip": "Enable to generate audio for the video. Disable to generate video without audio. Default: false.", - "default": False, - }), - "useStartTime": ("BOOLEAN", { - "tooltip": "Enable to include a custom start time for the replacement segment.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "startTime": ("INT", { - "tooltip": "Start time (seconds) where the replacement should begin.", - "default": 0, - "min": 0, - }), - "useDuration": ("BOOLEAN", { - "tooltip": "Enable to include a custom duration for the replacement segment.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "duration": ("INT", { - "tooltip": "Duration (seconds) for the replacement segment.", - "default": 5, - "min": 1, - }), - "useMode": ("BOOLEAN", { - "tooltip": "Enable to select what parts of the video should be replaced.", - "default": False, - "label_on": "Enabled", - "label_off": "Default", - }), - "mode": (["replace_audio", "replace_video", "replace_audio_and_video"], { - "tooltip": "Choose what to replace in the video task.", - "default": "replace_audio", - }), - } - } - - 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 Lightricks provider settings""" - - # Get value parameters - generateAudio = kwargs.get("generateAudio", False) - useStartTime = kwargs.get("useStartTime", False) - useDuration = kwargs.get("useDuration", False) - useMode = kwargs.get("useMode", False) - useGenerateAudio = kwargs.get("useGenerateAudio", False) - startTime = kwargs.get("startTime", 0) - duration = kwargs.get("duration", 5) - mode = kwargs.get("mode", "replace_audio") - - # Build settings dictionary - # Always include generateAudio to ensure it's explicitly set - settings = {} - if useGenerateAudio: - settings["generateAudio"] = generateAudio - if useStartTime: - settings["startTime"] = startTime - if useDuration: - settings["duration"] = duration - if useMode: - settings["mode"] = mode - - return (settings,) - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareLightricksProviderSettings": RunwareLightricksProviderSettings, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareLightricksProviderSettings": "Runware Lightricks Provider Settings", -} - diff --git a/modules/providerSettings/lumaProviderSettings.py b/modules/providerSettings/lumaProviderSettings.py deleted file mode 100644 index 76bfb8b..0000000 --- a/modules/providerSettings/lumaProviderSettings.py +++ /dev/null @@ -1,146 +0,0 @@ -from typing import Any, Dict, List - - -class RunwareLumaProviderSettings: - """Provider settings node for LumaAI video generation parameters.""" - - CONCEPT_OPTIONS = [ - "", - "aerial", - "aerial_drone", - "bolt_cam", - "crane_down", - "crane_up", - "dolly_zoom", - "elevator_doors", - "eye_level", - "ground_level", - "handheld", - "high_angle", - "low_angle", - "orbit_left", - "orbit_right", - "over_the_shoulder", - "overhead", - "pan_left", - "pan_right", - "pedestal_down", - "pedestal_up", - "pov", - "pull_out", - "push_in", - "roll_left", - "roll_right", - "selfie", - "static", - "tilt_down", - "tilt_up", - "tiny_planet", - "truck_left", - "truck_right", - "zoom_in", - "zoom_out", - ] - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useLoop": ("BOOLEAN", { - "tooltip": "Enable to include the loop parameter in provider settings.", - "default": False, - }), - "loop": ("BOOLEAN", { - "tooltip": "When enabled, generated video will loop seamlessly.", - "default": False, - }), - "useConcept1": ("BOOLEAN", { - "tooltip": "Enable to include Concept 1 in the concepts list.", - "default": False, - }), - "concept1": (cls.CONCEPT_OPTIONS, { - "tooltip": "Concept key to guide the video generation (e.g., aerial, bolt_cam).", - "default": "", - }), - "useConcept2": ("BOOLEAN", { - "tooltip": "Enable to include Concept 2 in the concepts list.", - "default": False, - }), - "concept2": (cls.CONCEPT_OPTIONS, { - "tooltip": "Concept key to guide the video generation.", - "default": "", - }), - "useConcept3": ("BOOLEAN", { - "tooltip": "Enable to include Concept 3 in the concepts list.", - "default": False, - }), - "concept3": (cls.CONCEPT_OPTIONS, { - "tooltip": "Concept key to guide the video generation.", - "default": "", - }), - "useConcept4": ("BOOLEAN", { - "tooltip": "Enable to include Concept 4 in the concepts list.", - "default": False, - }), - "concept4": (cls.CONCEPT_OPTIONS, { - "tooltip": "Concept key to guide the video generation.", - "default": "", - }), - } - } - - DESCRIPTION = "Configure LumaAI provider settings including loop and concept guidance." - FUNCTION = "createProviderSettings" - RETURN_TYPES = ("RUNWAREPROVIDERSETTINGS",) - RETURN_NAMES = ("Provider Settings",) - CATEGORY = "Runware/Provider Settings" - - def createProviderSettings(self, **kwargs) -> tuple[Dict[str, Any]]: - """Build LumaAI provider settings payload.""" - - useLoop = kwargs.get("useLoop", False) - loop = kwargs.get("loop", False) - - concepts = self._collectConcepts(**kwargs) - - lumaSettings: Dict[str, Any] = {} - - if useLoop: - lumaSettings["loop"] = bool(loop) - - if concepts: - lumaSettings["concepts"] = concepts - - result = {} - if lumaSettings: - result["lumaai"] = lumaSettings - - return (result if result else None,) - - def _collectConcepts(self, **kwargs) -> List[Dict[str, str]]: - """Collect concept entries from kwargs respecting use toggles.""" - - concepts: List[Dict[str, str]] = [] - - for index in range(1, 5): - use_key = f"useConcept{index}" - concept_key = f"concept{index}" - - if kwargs.get(use_key, False): - concept_value = kwargs.get(concept_key, "") - if isinstance(concept_value, str): - normalized = concept_value.strip().lower() - if normalized != "": - concepts.append({"key": normalized}) - - return concepts - - -NODE_CLASS_MAPPINGS = { - "RunwareLumaProviderSettings": RunwareLumaProviderSettings, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareLumaProviderSettings": "Runware Luma Provider Settings", -} diff --git a/modules/providerSettings/midjourneyProviderSettings.py b/modules/providerSettings/midjourneyProviderSettings.py deleted file mode 100644 index 1aefb68..0000000 --- a/modules/providerSettings/midjourneyProviderSettings.py +++ /dev/null @@ -1,120 +0,0 @@ -""" -Runware Midjourney Provider Settings Node -Provides Midjourney-specific settings for image generation workflows. -""" - -from typing import Any, Dict, Optional, Tuple - - -class RunwareMidjourneyProviderSettings: - """Runware Midjourney Provider Settings Node""" - - QUALITY_STEP = 0.25 - QUALITY_MIN = 0.25 - QUALITY_MAX = 2.0 - DEFAULT_QUALITY = 1.0 - - DEFAULT_STYLIZE = 0 - STYLIZE_MIN = 0 - STYLIZE_MAX = 1000 - - DEFAULT_CHAOS = 0 - CHAOS_MIN = 0 - CHAOS_MAX = 100 - - DEFAULT_WEIRD = 0 - WEIRD_MIN = 0 - WEIRD_MAX = 3000 - - NIJI_OPTIONS = [ - "", # Allow provider default when omitted - "close", - "0", - "5", - "6", - ] - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "quality": ("FLOAT", { - "tooltip": "Midjourney quality multiplier (provider key: providerSettings.midjourney.quality).", - "default": cls.DEFAULT_QUALITY, - "min": cls.QUALITY_MIN, - "max": cls.QUALITY_MAX, - "step": cls.QUALITY_STEP, - }), - "stylize": ("INT", { - "tooltip": "Controls how strongly Midjourney's artistic style is applied (provider key: providerSettings.midjourney.stylize).", - "default": cls.DEFAULT_STYLIZE, - "min": cls.STYLIZE_MIN, - "max": cls.STYLIZE_MAX, - }), - "chaos": ("INT", { - "tooltip": "Controls variation and unpredictability (provider key: providerSettings.midjourney.chaos).", - "default": cls.DEFAULT_CHAOS, - "min": cls.CHAOS_MIN, - "max": cls.CHAOS_MAX, - }), - "weird": ("INT", { - "tooltip": "Adds surreal, experimental characteristics (provider key: providerSettings.midjourney.weird).", - "default": cls.DEFAULT_WEIRD, - "min": cls.WEIRD_MIN, - "max": cls.WEIRD_MAX, - }), - "niji": (cls.NIJI_OPTIONS, { - "tooltip": "Select the Midjourney anime-focused rendering engine (provider key: providerSettings.midjourney.niji).", - "default": "close", - }), - } - } - - RETURN_TYPES = ("RUNWAREPROVIDERSETTINGS",) - RETURN_NAMES = ("Provider Settings",) - FUNCTION = "create_provider_settings" - CATEGORY = "Runware/Provider Settings" - DESCRIPTION = "Configure Midjourney-specific provider settings such as quality, stylize, chaos, weird, and niji options for image generation." - - def create_provider_settings(self, **kwargs) -> Tuple[Optional[Dict[str, Any]],]: - """Build Midjourney provider settings payload.""" - - quality = kwargs.get("quality", self.DEFAULT_QUALITY) - stylize = kwargs.get("stylize", self.DEFAULT_STYLIZE) - chaos = kwargs.get("chaos", self.DEFAULT_CHAOS) - weird = kwargs.get("weird", self.DEFAULT_WEIRD) - niji = kwargs.get("niji", "close") - - settings: Dict[str, Any] = {} - - if quality is not None: - settings["quality"] = float(quality) - - if stylize is not None: - settings["stylize"] = int(stylize) - - if chaos is not None: - settings["chaos"] = int(chaos) - - if weird is not None: - settings["weird"] = int(weird) - - if isinstance(niji, str) and niji.strip(): - settings["niji"] = niji.strip() - - # Clean None values so the inference request only includes populated options. - settings = {k: v for k, v in settings.items() if v is not None} - - return (settings if settings else None,) - - -NODE_CLASS_MAPPINGS = { - "RunwareMidjourneyProviderSettings": RunwareMidjourneyProviderSettings, -} - - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareMidjourneyProviderSettings": "Runware Midjourney Provider Settings", -} - diff --git a/modules/providerSettings/minimaxProviderSettings.py b/modules/providerSettings/minimaxProviderSettings.py deleted file mode 100644 index 39d699f..0000000 --- a/modules/providerSettings/minimaxProviderSettings.py +++ /dev/null @@ -1,50 +0,0 @@ -""" -Runware MiniMax Provider Settings Node -Provides MiniMax-specific settings for video generation -""" - -from typing import Dict, Any - -class RunwareMiniMaxProviderSettings: - """Runware MiniMax Provider Settings Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "promptOptimizer": ("BOOLEAN", { - "tooltip": "Enable/disable prompt optimization.", - "default": False, - }), - } - } - - 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 MiniMax provider settings""" - - # Get value parameters - promptOptimizer = kwargs.get("promptOptimizer", False) - - # Build settings dictionary - # Always include promptOptimizer to ensure it's explicitly set - settings = { - "promptOptimizer": promptOptimizer - } - - return (settings,) - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareMiniMaxProviderSettings": RunwareMiniMaxProviderSettings, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareMiniMaxProviderSettings": "Runware MiniMax Provider Settings", -} - diff --git a/modules/providerSettings/mireloProviderSettings.py b/modules/providerSettings/mireloProviderSettings.py deleted file mode 100644 index b3c7f61..0000000 --- a/modules/providerSettings/mireloProviderSettings.py +++ /dev/null @@ -1,67 +0,0 @@ -""" -Runware Mirelo Provider Settings Node -Provides Mirelo-specific settings for audio generation -""" - -from typing import Dict, Any - - -class RunwareMireloProviderSettings: - """Runware Mirelo Provider Settings Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useStartOffset": ("BOOLEAN", { - "tooltip": "Enable to include startOffset parameter in provider settings", - "default": False, - }), - "startOffset": ("INT", { - "tooltip": "Start offset in seconds for audio generation. Specifies the starting point in the video (0-10 seconds). Only used when 'Use Start Offset' is enabled.", - "default": 0, - "min": 0, - "max": 10, - }), - } - } - - RETURN_TYPES = ("RUNWAREPROVIDERSETTINGS",) - RETURN_NAMES = ("Provider Settings",) - FUNCTION = "createProviderSettings" - CATEGORY = "Runware/Provider Settings" - DESCRIPTION = "Configure Mirelo-specific provider settings for audio generation including start offset for video-to-audio conversion." - - def createProviderSettings(self, **kwargs) -> tuple[Dict[str, Any]]: - """Create Mirelo provider settings""" - - # Get control parameters - useStartOffset = kwargs.get("useStartOffset", False) - - # Get value parameters - startOffset = kwargs.get("startOffset", 0) - - # Build settings dictionary - only include what is enabled - mireloSettings: Dict[str, Any] = {} - - # Add startOffset only if useStartOffset is enabled - if useStartOffset: - mireloSettings["startOffset"] = startOffset - - # Clean up None values - mireloSettings = {k: v for k, v in mireloSettings.items() if v is not None} - - # Return flat dictionary - will be wrapped by inference node with provider name - return (mireloSettings,) - - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareMireloProviderSettings": RunwareMireloProviderSettings, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareMireloProviderSettings": "Runware Mirelo Provider Settings", -} - diff --git a/modules/providerSettings/openaiProviderSettings.py b/modules/providerSettings/openaiProviderSettings.py deleted file mode 100644 index 2fd7653..0000000 --- a/modules/providerSettings/openaiProviderSettings.py +++ /dev/null @@ -1,68 +0,0 @@ - - -class RunwareOpenAIProviderSettings: - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "quality": (["auto", "high", "medium", "low"], { - "default": "auto", - "tooltip": "Quality setting for OpenAI DALL-E models.", - }), - "useBackground": (["enable", "disabled"], { - "default": "disabled", - "tooltip": "Enable to include background parameter in API request.", - }), - "background": (["transparent", "opaque"], { - "default": "opaque", - "tooltip": "Background setting for OpenAI image generation. Only used when 'Use Background' is enabled.", - }), - "useStyle": (["enable", "disabled"], { - "default": "disabled", - "tooltip": "Enable to include style parameter in API request.", - }), - "style": (["vivid", "natural"], { - "default": "vivid", - "tooltip": "Style setting for OpenAI DALL-E models. Only used when 'Use Style' is enabled.", - }), - } - } - - DESCRIPTION = "Configure OpenAI-specific settings for image generation with quality, background, and style options." - FUNCTION = "create_openai_settings" - RETURN_TYPES = ("RUNWAREPROVIDERSETTINGS",) - RETURN_NAMES = ("Provider Settings",) - CATEGORY = "Runware" - - def create_openai_settings(self, **kwargs): - quality = kwargs.get("quality", "auto") - useBackground = kwargs.get("useBackground", "disabled") - background = kwargs.get("background", "opaque") - useStyle = kwargs.get("useStyle", "disabled") - style = kwargs.get("style", "vivid") - - # Create OpenAI settings dictionary - openai_settings = { - "quality": quality, - } - - # Add background only if enabled - if useBackground == "enable": - openai_settings["background"] = background - - # Add style only if enabled - if useStyle == "enable": - openai_settings["style"] = style - - print(f"[OpenAI Provider Settings] Created settings: {openai_settings}") - return (openai_settings,) - - -# Node class mappings for ComfyUI registration -NODE_CLASS_MAPPINGS = { - "RunwareOpenAIProviderSettings": RunwareOpenAIProviderSettings, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareOpenAIProviderSettings": "Runware OpenAI Provider Settings", -} diff --git a/modules/providerSettings/pixverseProviderSettings.py b/modules/providerSettings/pixverseProviderSettings.py deleted file mode 100644 index aff763d..0000000 --- a/modules/providerSettings/pixverseProviderSettings.py +++ /dev/null @@ -1,148 +0,0 @@ - - -class RunwarePixverseProviderSettings: - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "useEffect": ("BOOLEAN", { - "tooltip": "Enable to include effect parameter in API request.", - "default": False, - }), - "effect": (["none", "boom drop", "zoom in", "zoom out", "pan left", "pan right", "tilt up", "tilt down"], { - "default": "none", - "tooltip": "Camera effect for Pixverse videos. Only used when 'Use Effect' is enabled.", - }), - "useCameraMovement": ("BOOLEAN", { - "tooltip": "Enable to include cameraMovement parameter in API request.", - "default": False, - }), - "cameraMovement": (["none", "static", "dynamic", "smooth"], { - "default": "none", - "tooltip": "Camera movement style for Pixverse videos. Only used when 'Use Camera Movement' is enabled.", - }), - "useStyle": ("BOOLEAN", { - "tooltip": "Enable to include style parameter in API request.", - "default": False, - }), - "style": (["anime", "realistic", "cinematic", "artistic", "vintage", "modern"], { - "default": "realistic", - "tooltip": "Visual style for Pixverse videos. Only used when 'Use Style' is enabled.", - }), - "useMotionMode": ("BOOLEAN", { - "tooltip": "Enable to include motionMode parameter in API request.", - "default": False, - }), - "motionMode": (["normal", "slow", "fast", "smooth", "dynamic"], { - "default": "normal", - "tooltip": "Motion mode for Pixverse videos. Only used when 'Use Motion Mode' is enabled.", - }), - "useSoundEffectSwitch": ("BOOLEAN", { - "tooltip": "Enable to include soundEffectSwitch parameter in API request.", - "default": False, - }), - "soundEffectSwitch": ("BOOLEAN", { - "default": False, - "tooltip": "Enable or disable sound effects for Pixverse videos. Only used when 'Use Sound Effect Switch' is enabled.", - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useSoundEffectContent": ("BOOLEAN", { - "tooltip": "Enable to include soundEffectContent parameter in API request.", - "default": False, - }), - "soundEffectContent": ("STRING", { - "multiline": True, - "placeholder": "Sound effect description or content", - "tooltip": "Sound effect content for Pixverse videos. Only used when 'Use Sound Effect Content' is enabled.", - }), - "useAudio": ("BOOLEAN", { - "tooltip": "Enable to include audio parameter in API request.", - "default": False, - }), - "audio": ("BOOLEAN", { - "tooltip": "Controls audio generation for Pixverse videos. Only used when 'Use Audio' is enabled.", - "default": False, - }), - "useMultiClip": ("BOOLEAN", { - "tooltip": "Enable to include multiClip parameter in API request.", - "default": False, - }), - "multiClip": ("BOOLEAN", { - "tooltip": "Multi-clip (Multi-shot) for Pixverse videos. Only used when 'Use Multi Clip' is enabled.", - "default": False, - }), - "useThinking": ("BOOLEAN", { - "tooltip": "Enable to include thinking parameter in API request.", - "default": False, - }), - "thinking": (["enabled", "disabled", "auto"], { - "tooltip": "Thinking option for Pixverse videos. Only used when 'Use Thinking' is enabled.", - "default": "auto", - }), - } - } - - DESCRIPTION = "Configure Pixverse-specific settings for video generation with effect, style, motion, and sound options." - FUNCTION = "create_pixverse_settings" - RETURN_TYPES = ("RUNWAREPROVIDERSETTINGS",) - RETURN_NAMES = ("Provider Settings",) - CATEGORY = "Runware" - - def create_pixverse_settings(self, **kwargs): - useEffect = kwargs.get("useEffect", False) - effect = kwargs.get("effect", "none") - useCameraMovement = kwargs.get("useCameraMovement", False) - cameraMovement = kwargs.get("cameraMovement", "none") - useStyle = kwargs.get("useStyle", False) - style = kwargs.get("style", "realistic") - useMotionMode = kwargs.get("useMotionMode", False) - motionMode = kwargs.get("motionMode", "normal") - useSoundEffectSwitch = kwargs.get("useSoundEffectSwitch", False) - soundEffectSwitch = kwargs.get("soundEffectSwitch", False) - useSoundEffectContent = kwargs.get("useSoundEffectContent", False) - soundEffectContent = kwargs.get("soundEffectContent", "") - useAudio = kwargs.get("useAudio", False) - audio = kwargs.get("audio", False) - useMultiClip = kwargs.get("useMultiClip", False) - multiClip = kwargs.get("multiClip", False) - useThinking = kwargs.get("useThinking", False) - thinking = kwargs.get("thinking", "auto") - - # Create Pixverse settings dictionary - only include parameters if their use flags are enabled - pixverse_settings = {} - - if useEffect: - pixverse_settings["effect"] = effect - if useCameraMovement: - pixverse_settings["cameraMovement"] = cameraMovement - if useStyle: - pixverse_settings["style"] = style - if useMotionMode: - pixverse_settings["motionMode"] = motionMode - if useSoundEffectSwitch: - pixverse_settings["soundEffectSwitch"] = soundEffectSwitch - if useSoundEffectContent and soundEffectContent and soundEffectContent.strip(): - pixverse_settings["soundEffectContent"] = soundEffectContent - if useAudio: - pixverse_settings["audio"] = audio - if useMultiClip: - pixverse_settings["multiClip"] = multiClip - if useThinking: - pixverse_settings["thinking"] = thinking - - # Remove "none" values to keep the settings clean - pixverse_settings = {k: v for k, v in pixverse_settings.items() if v != "none" and v is not None} - - print(f"[Pixverse Provider Settings] Created settings: {pixverse_settings}") - return (pixverse_settings,) - - -# Node class mappings for ComfyUI registration -NODE_CLASS_MAPPINGS = { - "RunwarePixverseProviderSettings": RunwarePixverseProviderSettings, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwarePixverseProviderSettings": "Runware Pixverse Provider Settings", -} diff --git a/modules/providerSettings/recraftProviderSettings.py b/modules/providerSettings/recraftProviderSettings.py deleted file mode 100644 index 237496f..0000000 --- a/modules/providerSettings/recraftProviderSettings.py +++ /dev/null @@ -1,68 +0,0 @@ -""" -Runware Recraft Provider Settings Node -IRecraftProviderSettings: styleId, colors (List[IRecraftRGB]), backgroundColor (IRecraftRGB) -""" - -from typing import Dict, Any, List - - -class RunwareRecraftProviderSettings: - """Runware Recraft Provider Settings Node""" - - @classmethod - def INPUT_TYPES(cls): - color_input = ("RUNWARERECRAFTCOLOR", {"tooltip": "IRecraftRGB - connect Runware Recraft Color"}) - return { - "required": {}, - "optional": { - "useStyleId": ("BOOLEAN", { - "tooltip": "Enable to include styleId parameter", - "default": False, - }), - "styleId": ("STRING", { - "default": "", - "tooltip": "Style ID for Recraft image generation.", - }), - "color1": color_input, - "color2": color_input, - "color3": color_input, - "color4": color_input, - "color5": color_input, - "backgroundColor": color_input, - } - } - - RETURN_TYPES = ("RUNWAREPROVIDERSETTINGS",) - RETURN_NAMES = ("Provider Settings",) - FUNCTION = "createProviderSettings" - CATEGORY = "Runware/Provider Settings" - DESCRIPTION = "IRecraftProviderSettings. Connect Runware Recraft Color nodes for colors (palette) and backgroundColor." - - def createProviderSettings(self, **kwargs) -> tuple[Dict[str, Any]]: - settings: Dict[str, Any] = {} - - if kwargs.get("useStyleId") and (sid := kwargs.get("styleId", "").strip()): - settings["styleId"] = sid - - colors: List[Dict[str, List[int]]] = [] - for i in range(1, 6): - c = kwargs.get(f"color{i}") - if c and isinstance(c, dict) and "rgb" in c: - colors.append(c) - if colors: - settings["colors"] = colors - - bg = kwargs.get("backgroundColor") - if bg and isinstance(bg, dict) and "rgb" in bg: - settings["backgroundColor"] = bg - - return (settings,) - - -NODE_CLASS_MAPPINGS = { - "RunwareRecraftProviderSettings": RunwareRecraftProviderSettings, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareRecraftProviderSettings": "Runware Recraft Provider Settings", -} diff --git a/modules/providerSettings/recraftProviderSettingsColor.py b/modules/providerSettings/recraftProviderSettingsColor.py deleted file mode 100644 index 2f7adbc..0000000 --- a/modules/providerSettings/recraftProviderSettingsColor.py +++ /dev/null @@ -1,40 +0,0 @@ -""" -Runware Recraft Color Node - IRecraftRGB -Outputs {rgb: [r, g, b]} for use as palette color or backgroundColor in Recraft Provider Settings -""" - -from typing import Dict, List - - -def _clamp_rgb(value: int) -> int: - return max(0, min(255, int(value))) - - -class RunwareRecraftColor: - """Outputs IRecraftRGB {rgb: [r,g,b]} - use for colors palette or backgroundColor""" - - @classmethod - def INPUT_TYPES(cls): - rgb = ("INT", {"default": 128, "min": 0, "max": 255}) - return { - "required": {}, - "optional": {"r": rgb, "g": rgb, "b": rgb} - } - - RETURN_TYPES = ("RUNWARERECRAFTCOLOR",) - RETURN_NAMES = ("Color",) - FUNCTION = "create" - CATEGORY = "Runware/Provider Settings" - DESCRIPTION = "IRecraftRGB - use for palette (colors) or backgroundColor. Connect to Runware Recraft Provider Settings." - - def create(self, r: int = 128, g: int = 128, b: int = 128) -> tuple[Dict[str, List[int]]]: - return ({"rgb": [_clamp_rgb(r), _clamp_rgb(g), _clamp_rgb(b)]},) - - -NODE_CLASS_MAPPINGS = { - "RunwareRecraftColor": RunwareRecraftColor, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareRecraftColor": "Runware Provider Settings Recraft Color", -} diff --git a/modules/providerSettings/runwayProviderSettings.py b/modules/providerSettings/runwayProviderSettings.py deleted file mode 100644 index 42e1acf..0000000 --- a/modules/providerSettings/runwayProviderSettings.py +++ /dev/null @@ -1,56 +0,0 @@ -""" -Runware Runway Provider Settings Node -Provides Runway-specific settings for video generation -""" - -from typing import Dict, Any - - -class RunwareRunwayProviderSettings: - """Runware Runway Provider Settings Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "publicFigureThreshold": (["auto", "low"], { - "tooltip": "Select the public figure detection threshold (provider key: contentModeration.publicFigureThreshold).", - "default": "auto", - }), - } - } - - RETURN_TYPES = ("RUNWAREPROVIDERSETTINGS",) - RETURN_NAMES = ("Provider Settings",) - FUNCTION = "createProviderSettings" - CATEGORY = "Runware" - DESCRIPTION = "Configure Runway-specific provider settings for video generation including content moderation options." - - def createProviderSettings(self, **kwargs) -> tuple[Dict[str, Any]]: - """Create Runway provider settings""" - - publicFigureThreshold = kwargs.get("publicFigureThreshold") - - runwaySettings: Dict[str, Any] = {} - - if isinstance(publicFigureThreshold, str) and publicFigureThreshold.strip() != "": - contentModeration: Dict[str, Any] = {} - contentModeration["publicFigureThreshold"] = publicFigureThreshold.strip() - runwaySettings["contentModeration"] = contentModeration - - # Remove unset values - runwaySettings = {k: v for k, v in runwaySettings.items() if v is not None} - - return (runwaySettings,) - - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareRunwayProviderSettings": RunwareRunwayProviderSettings, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareRunwayProviderSettings": "Runware Runway Provider Settings", -} - diff --git a/modules/providerSettings/sourcefulProviderSettings.py b/modules/providerSettings/sourcefulProviderSettings.py deleted file mode 100644 index 63d5545..0000000 --- a/modules/providerSettings/sourcefulProviderSettings.py +++ /dev/null @@ -1,72 +0,0 @@ -""" -Runware Sourceful Provider Settings Node -Provides Sourceful-specific settings for image generation (providerSettings.sourceful.*) -""" - -from typing import Dict, Any - - -class RunwareSourcefulProviderSettings: - """Runware Sourceful Provider Settings Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useTransparency": ("BOOLEAN", { - "tooltip": "Enable to include transparency parameter in API request", - "default": False, - }), - "transparency": ("BOOLEAN", { - "tooltip": "Transparency setting for image generation. Only used when 'Use Transparency' is enabled.", - "default": False, - }), - "useEnhancePrompt": ("BOOLEAN", { - "tooltip": "Enable to include enhancePrompt parameter in API request", - "default": False, - }), - "enhancePrompt": ("BOOLEAN", { - "tooltip": "When true, enhances the provided prompt. Only used when 'Use Enhance Prompt' is enabled.", - "default": True, - }), - "fontInputs": ("RUNWARESOURCEFULFONTINPUTS", { - "tooltip": "Connect Runware Sourceful Provider Settings Fonts node to provide font references (fontUrl and text). Up to 2 fonts.", - }), - } - } - - RETURN_TYPES = ("RUNWAREPROVIDERSETTINGS",) - RETURN_NAMES = ("providerSettings",) - FUNCTION = "create_provider_settings" - CATEGORY = "Runware/Provider Settings" - DESCRIPTION = "Configure Sourceful-specific provider settings for image generation: transparency, enhancePrompt, and font inputs." - - def create_provider_settings(self, **kwargs) -> tuple[Dict[str, Any]]: - """Create Sourceful provider settings""" - - useTransparency = kwargs.get("useTransparency", False) - transparency = kwargs.get("transparency", False) - useEnhancePrompt = kwargs.get("useEnhancePrompt", False) - enhancePrompt = kwargs.get("enhancePrompt", True) - font_inputs = kwargs.get("fontInputs", None) - - settings: Dict[str, Any] = {} - - if useTransparency: - settings["transparency"] = transparency - if useEnhancePrompt: - settings["enhancePrompt"] = enhancePrompt - if font_inputs is not None and isinstance(font_inputs, list) and len(font_inputs) > 0: - settings["fontInputs"] = font_inputs - - return (settings,) - - -NODE_CLASS_MAPPINGS = { - "RunwareSourcefulProviderSettings": RunwareSourcefulProviderSettings, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareSourcefulProviderSettings": "Runware Sourceful Provider Settings", -} diff --git a/modules/providerSettings/sourcefulProviderSettingsFonts.py b/modules/providerSettings/sourcefulProviderSettingsFonts.py deleted file mode 100644 index 30e0aef..0000000 --- a/modules/providerSettings/sourcefulProviderSettingsFonts.py +++ /dev/null @@ -1,76 +0,0 @@ -""" -Runware Sourceful Provider Settings Fonts Node -Creates font inputs array for Sourceful provider (up to 2 font references with fontUrl and text). -""" - -from typing import Dict, List - - -class RunwareSourcefulProviderSettingsFonts: - """Runware Sourceful Provider Settings Fonts Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useFont1": ("BOOLEAN", { - "tooltip": "Enable to include first font reference in fontInputs array", - "default": False, - }), - "fontUrl1": ("STRING", { - "tooltip": "URL of the font file (e.g. .woff2). Only used when 'Use Font 1' is enabled.", - "default": "", - }), - "text1": ("STRING", { - "multiline": True, - "tooltip": "Text to render with the first font. Only used when 'Use Font 1' is enabled.", - "default": "", - }), - "useFont2": ("BOOLEAN", { - "tooltip": "Enable to include second font reference in fontInputs array", - "default": False, - }), - "fontUrl2": ("STRING", { - "tooltip": "URL of the font file (e.g. .woff2). Only used when 'Use Font 2' is enabled.", - "default": "", - }), - "text2": ("STRING", { - "multiline": True, - "tooltip": "Text to render with the second font. Only used when 'Use Font 2' is enabled.", - "default": "", - }), - } - } - - RETURN_TYPES = ("RUNWARESOURCEFULFONTINPUTS",) - RETURN_NAMES = ("Font Inputs",) - FUNCTION = "create_font_inputs" - CATEGORY = "Runware/Provider Settings" - DESCRIPTION = "Create font inputs for Sourceful provider. Up to 2 font references, each with font URL and text to render." - - def create_font_inputs(self, **kwargs) -> tuple[List[Dict[str, str]]]: - """Create font inputs array""" - font_inputs: List[Dict[str, str]] = [] - - for i in range(1, 3): - use_font = kwargs.get(f"useFont{i}", False) - if use_font: - font_url = (kwargs.get(f"fontUrl{i}", "") or "").strip() - text = (kwargs.get(f"text{i}", "") or "").strip() - if font_url and text: - font_inputs.append({ - "fontUrl": font_url, - "text": text, - }) - - return (font_inputs,) - - -NODE_CLASS_MAPPINGS = { - "RunwareSourcefulProviderSettingsFonts": RunwareSourcefulProviderSettingsFonts, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareSourcefulProviderSettingsFonts": "Runware Sourceful Provider Settings Fonts", -} diff --git a/modules/providerSettings/syncProviderSettings.py b/modules/providerSettings/syncProviderSettings.py deleted file mode 100644 index 98bcbd7..0000000 --- a/modules/providerSettings/syncProviderSettings.py +++ /dev/null @@ -1,157 +0,0 @@ -""" -Runware Sync Provider Settings Node -Provides Sync-specific settings for video generation with lip-sync capabilities -""" - -from typing import Dict, Any, List - - -class RunwareSyncProviderSettings: - """Runware Sync Provider Settings Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "syncMode": (["bounce", "loop", "cut_off", "silence", "remap"], { - "tooltip": "Synchronization strategy. Enum: bounce, loop, cut_off, silence, remap", - "default": "bounce", - }), - }, - "optional": { - "useEditRegion": ("BOOLEAN", { - "tooltip": "Enable to include editRegion parameter", - "default": False, - }), - "editRegion": (["lips", "face", "head"], { - "tooltip": "Edit region for the model. Only works with react-1. Defaults to face, which affects lipsync + emotions in the face region. When head is selected, model generates natural talking head movements along with emotions + lipsync. Only used when 'Use Edit Region' is enabled.", - "default": "face", - }), - "useEmotionPrompt": ("BOOLEAN", { - "tooltip": "Enable to include emotionPrompt parameter", - "default": False, - }), - "emotionPrompt": (["happy", "sad", "angry", "disgusted", "surprised", "neutral"], { - "tooltip": "Emotion prompt for the generation. Only works for react-1 model. Only single word emotions are supported. Only used when 'Use Emotion Prompt' is enabled.", - "default": "happy", - }), - "useTemperature": ("BOOLEAN", { - "tooltip": "Enable to include temperature parameter", - "default": False, - }), - "temperature": ("FLOAT", { - "tooltip": "Sampling temperature. 0 -> least expressive, 1 -> most expressive. Only used when 'Use Temperature' is enabled.", - "default": 0.5, - "min": 0.0, - "max": 1.0, - "step": 0.1, - }), - "useActiveSpeakerDetection": ("BOOLEAN", { - "tooltip": "Enable to include activeSpeakerDetection parameter", - "default": False, - }), - "activeSpeakerDetection": ("BOOLEAN", { - "tooltip": "Enable active speaker detection. Only used when 'Use Active Speaker Detection' is enabled.", - "default": True, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useOcclusionDetectionEnabled": ("BOOLEAN", { - "tooltip": "Enable to include occlusionDetectionEnabled parameter", - "default": False, - }), - "occlusionDetectionEnabled": ("BOOLEAN", { - "tooltip": "Enable occlusion detection. Only used when 'Use Occlusion Detection Enabled' is enabled.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "Sync Segment 1": ("RUNWARESYNCSEGMENT", { - "tooltip": "Connect a Runware Sync Segment node (optional)", - }), - "Sync Segment 2": ("RUNWARESYNCSEGMENT", { - "tooltip": "Connect a Runware Sync Segment node (optional)", - }), - "Sync Segment 3": ("RUNWARESYNCSEGMENT", { - "tooltip": "Connect a Runware Sync Segment node (optional)", - }), - "Sync Segment 4": ("RUNWARESYNCSEGMENT", { - "tooltip": "Connect a Runware Sync Segment node (optional)", - }), - } - } - - RETURN_TYPES = ("RUNWAREPROVIDERSETTINGS",) - RETURN_NAMES = ("Provider Settings",) - FUNCTION = "createProviderSettings" - CATEGORY = "Runware/Provider Settings" - DESCRIPTION = "Configure Sync-specific provider settings for video generation including lip-sync, emotion prompts, and segment configurations." - - def createProviderSettings(self, **kwargs) -> tuple[Dict[str, Any]]: - """Create Sync provider settings""" - - # Get required parameters - syncMode = kwargs.get("syncMode", "bounce") - - # Get control parameters - useEditRegion = kwargs.get("useEditRegion", False) - useEmotionPrompt = kwargs.get("useEmotionPrompt", False) - useTemperature = kwargs.get("useTemperature", False) - useActiveSpeakerDetection = kwargs.get("useActiveSpeakerDetection", False) - useOcclusionDetectionEnabled = kwargs.get("useOcclusionDetectionEnabled", False) - - # Get value parameters - editRegion = kwargs.get("editRegion", "face") - emotionPrompt = kwargs.get("emotionPrompt", "happy") - temperature = kwargs.get("temperature", 0.5) - activeSpeakerDetection = kwargs.get("activeSpeakerDetection", True) - occlusionDetectionEnabled = kwargs.get("occlusionDetectionEnabled", False) - - # Get sync segments (up to 4) - segments: List[Dict[str, Any]] = [] - for i in range(1, 5): - segmentKey = f"Sync Segment {i}" - segment = kwargs.get(segmentKey) - if segment is not None and isinstance(segment, dict): - segments.append(segment) - - # Build settings dictionary - syncSettings: Dict[str, Any] = { - "syncMode": syncMode, - } - - # Add optional parameters only if enabled - if useEditRegion: - syncSettings["editRegion"] = editRegion - if useEmotionPrompt: - syncSettings["emotionPrompt"] = emotionPrompt - if useTemperature: - syncSettings["temperature"] = float(temperature) - if useActiveSpeakerDetection: - syncSettings["activeSpeakerDetection"] = activeSpeakerDetection - if useOcclusionDetectionEnabled: - syncSettings["occlusionDetectionEnabled"] = occlusionDetectionEnabled - - # Add segments if any are provided - if segments: - syncSettings["segments"] = segments - - # Clean up None values - syncSettings = {k: v for k, v in syncSettings.items() if v is not None} - - # Return settings wrapped with provider key "sync" - if syncSettings: - return ({"sync": syncSettings},) - else: - return ({},) - - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareSyncProviderSettings": RunwareSyncProviderSettings, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareSyncProviderSettings": "Runware Sync Provider Settings", -} - diff --git a/modules/providerSettings/syncSegment.py b/modules/providerSettings/syncSegment.py deleted file mode 100644 index 0f412c2..0000000 --- a/modules/providerSettings/syncSegment.py +++ /dev/null @@ -1,104 +0,0 @@ -""" -Runware Sync Segment Node -Creates a sync segment configuration for sync provider settings -""" - -from typing import Dict, Any - - -class RunwareSyncSegment: - """Runware Sync Segment Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "startTime": ("FLOAT", { - "tooltip": "Start time of the segment in seconds", - "default": 0.0, - "min": 0.0, - "step": 0.1, - }), - "endTime": ("FLOAT", { - "tooltip": "End time of the segment in seconds", - "default": 1.0, - "min": 0.0, - "step": 0.1, - }), - "ref": ("STRING", { - "tooltip": "Reference identifier for the audio track (e.g., 'audio-track-1', 'speech-track-1')", - "default": "audio-track-1", - }), - }, - "optional": { - "useAudioStartTime": ("BOOLEAN", { - "tooltip": "Enable to include audioStartTime parameter", - "default": False, - }), - "audioStartTime": ("FLOAT", { - "tooltip": "Start time in the audio track in seconds. Only used when 'Use Audio Start Time' is enabled.", - "default": 0.0, - "min": 0.0, - "step": 0.1, - }), - "useAudioEndTime": ("BOOLEAN", { - "tooltip": "Enable to include audioEndTime parameter", - "default": False, - }), - "audioEndTime": ("FLOAT", { - "tooltip": "End time in the audio track in seconds. Only used when 'Use Audio End Time' is enabled.", - "default": 1.0, - "min": 0.0, - "step": 0.1, - }), - } - } - - RETURN_TYPES = ("RUNWARESYNCSEGMENT",) - RETURN_NAMES = ("Sync Segment",) - FUNCTION = "createSyncSegment" - CATEGORY = "Runware/Provider Settings" - DESCRIPTION = "Create a sync segment configuration for sync provider settings." - - def createSyncSegment(self, **kwargs) -> tuple[Dict[str, Any]]: - """Create sync segment configuration""" - - # Get required parameters - startTime = kwargs.get("startTime", 0.0) - endTime = kwargs.get("endTime", 1.0) - ref = kwargs.get("ref", "audio-track-1") - - # Get optional parameters - useAudioStartTime = kwargs.get("useAudioStartTime", False) - audioStartTime = kwargs.get("audioStartTime", 0.0) - useAudioEndTime = kwargs.get("useAudioEndTime", False) - audioEndTime = kwargs.get("audioEndTime", 1.0) - - # Build segment dictionary - segment: Dict[str, Any] = { - "startTime": float(startTime), - "endTime": float(endTime), - "ref": str(ref), - } - - # Add optional audio timing parameters - if useAudioStartTime: - segment["audioStartTime"] = float(audioStartTime) - if useAudioEndTime: - segment["audioEndTime"] = float(audioEndTime) - - # Clean up None values - segment = {k: v for k, v in segment.items() if v is not None} - - return (segment,) - - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareSyncSegment": RunwareSyncSegment, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareSyncSegment": "Runware Sync Segment", -} - diff --git a/modules/providerSettings/ultralyticsProviderSettings.py b/modules/providerSettings/ultralyticsProviderSettings.py deleted file mode 100644 index 5d48622..0000000 --- a/modules/providerSettings/ultralyticsProviderSettings.py +++ /dev/null @@ -1,142 +0,0 @@ -""" -Runware Image Inference Ultralytics Node -Provides Ultralytics-specific settings for image generation (providerSettings.ultralytics.*) -""" - -from typing import Dict, Any - - -class RunwareUltralyticsProviderSettings: - """Runware Image Inference Ultralytics - Ultralytics provider settings""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useMaskBlur": ("BOOLEAN", { - "tooltip": "Enable to include maskBlur parameter.", - "default": False, - }), - "maskBlur": ("INT", { - "default": 5, - "min": 0, - "max": 100, - "tooltip": "Mask feathering amount (0-100).", - }), - "useMaskPadding": ("BOOLEAN", { - "tooltip": "Enable to include maskPadding parameter.", - "default": False, - }), - "maskPadding": ("INT", { - "default": 5, - "min": 0, - "max": 20, - "tooltip": "Padding around face region (0-20).", - }), - "useConfidence": ("BOOLEAN", { - "tooltip": "Enable to include confidence parameter.", - "default": False, - }), - "confidence": ("FLOAT", { - "default": 0.5, - "min": 0.0, - "max": 1.0, - "step": 0.01, - "tooltip": "Detection confidence threshold (0-1).", - }), - "usePositivePrompt": ("BOOLEAN", { - "tooltip": "Enable to include positivePrompt parameter.", - "default": False, - }), - "positivePrompt": ("STRING", { - "default": "", - "multiline": True, - "tooltip": "Prompt for diffusion model.", - }), - "useNegativePrompt": ("BOOLEAN", { - "tooltip": "Enable to include negativePrompt parameter.", - "default": False, - }), - "negativePrompt": ("STRING", { - "default": "", - "multiline": True, - "tooltip": "Negative prompt for model.", - }), - "useSteps": ("BOOLEAN", { - "tooltip": "Enable to include steps parameter.", - "default": False, - }), - "steps": ("INT", { - "default": 20, - "min": 1, - "max": 100, - "tooltip": "Number of diffusion steps (1-100).", - }), - "useCFGScale": ("BOOLEAN", { - "tooltip": "Enable to include CFGScale parameter.", - "default": False, - }), - "CFGScale": ("FLOAT", { - "default": 8.0, - "min": 0.0, - "max": 50.0, - "step": 0.1, - "tooltip": "Classifier-free guidance scale (0-50).", - }), - "useStrength": ("BOOLEAN", { - "tooltip": "Enable to include strength parameter.", - "default": False, - }), - "strength": ("FLOAT", { - "default": 0.3, - "min": 0.0001, - "max": 1.0, - "step": 0.01, - "tooltip": "Denoising strength (0.0001-1).", - }), - } - } - - DESCRIPTION = "Configure Ultralytics-specific settings for Runware Image Inference. providerSettings.ultralytics.*" - 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 Ultralytics provider settings""" - - settings = {} - - if kwargs.get("useMaskBlur", False): - settings["maskBlur"] = kwargs.get("maskBlur", 5) - if kwargs.get("useMaskPadding", False): - settings["maskPadding"] = kwargs.get("maskPadding", 5) - if kwargs.get("useConfidence", False): - settings["confidence"] = kwargs.get("confidence", 0.5) - if kwargs.get("usePositivePrompt", False): - val = kwargs.get("positivePrompt", "") - if val is not None and str(val).strip(): - settings["positivePrompt"] = str(val).strip() - if kwargs.get("useNegativePrompt", False): - val = kwargs.get("negativePrompt", "") - if val is not None and str(val).strip(): - settings["negativePrompt"] = str(val).strip() - if kwargs.get("useSteps", False): - settings["steps"] = kwargs.get("steps", 20) - if kwargs.get("useCFGScale", False): - settings["CFGScale"] = kwargs.get("CFGScale", 8.0) - if kwargs.get("useStrength", False): - settings["strength"] = kwargs.get("strength", 0.3) - - return (settings,) - - -NODE_CLASS_MAPPINGS = { - "RunwareUltralyticsProviderSettings": RunwareUltralyticsProviderSettings, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareUltralyticsProviderSettings": "Runware Image Inference Ultralytics", -} diff --git a/modules/providerSettings/viduProviderSettings.py b/modules/providerSettings/viduProviderSettings.py deleted file mode 100644 index a3f14c6..0000000 --- a/modules/providerSettings/viduProviderSettings.py +++ /dev/null @@ -1,118 +0,0 @@ - -class RunwareViduProviderSettings: - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - # Audio parameter - "useAudio": ("BOOLEAN", { - "tooltip": "Enable to include audio parameter in API request", - "default": False, - }), - "audio": ("BOOLEAN", { - "tooltip": "Enable audio for video generation. Only used when 'Use Audio' is enabled.", - "default": True, - }), - # BGM parameter - "useBgm": ("BOOLEAN", { - "tooltip": "Enable to include bgm parameter in API request", - "default": False, - }), - "bgm": ("BOOLEAN", { - "tooltip": "Enable background music for video generation. Only used when 'Use BGM' is enabled.", - "default": False, - }), - # Style parameter - "useStyle": ("BOOLEAN", { - "tooltip": "Enable to include style parameter in API request", - "default": False, - }), - "style": ("STRING", { - "tooltip": "Video style configuration for Vidu models. Only used when 'Use Style' is enabled.", - "default": "", - }), - # Movement amplitude parameter - "useMovementAmplitude": ("BOOLEAN", { - "tooltip": "Enable to include movementAmplitude parameter in API request", - "default": False, - }), - "movementAmplitude": ("STRING", { - "tooltip": "Controls the amplitude/intensity of movement in the generated video. Only used when 'Use Movement Amplitude' is enabled.", - "default": "", - }), - # Template parameters - "useTemplateName": ("BOOLEAN", { - "tooltip": "Enable to include template name in API request", - "default": False, - }), - "templateName": ("STRING", { - "tooltip": "Template name for video generation. Only used when 'Use Template Name' is enabled.", - "default": "", - }), - "useTemplateArea": ("BOOLEAN", { - "tooltip": "Enable to include template area in API request", - "default": False, - }), - "templateArea": ("STRING", { - "tooltip": "Template area configuration. Only used when 'Use Template Area' is enabled.", - "default": "", - }), - "useTemplateBeast": ("BOOLEAN", { - "tooltip": "Enable to include template beast in API request", - "default": False, - }), - "templateBeast": ("STRING", { - "tooltip": "Template beast configuration. Only used when 'Use Template Beast' is enabled.", - "default": "", - }), - }, - } - - DESCRIPTION = "Configure Vidu-specific provider settings for video generation. Includes background music, style, movement amplitude, and template configurations." - FUNCTION = "viduProviderSettings" - RETURN_TYPES = ("RUNWAREPROVIDERSETTINGS",) - RETURN_NAMES = ("Vidu Provider Settings",) - CATEGORY = "Runware" - - def viduProviderSettings(self, **kwargs): - # Get all optional parameters - useAudio = kwargs.get("useAudio", False) - audio = kwargs.get("audio", True) - useBgm = kwargs.get("useBgm", False) - bgm = kwargs.get("bgm", False) - useStyle = kwargs.get("useStyle", False) - style = kwargs.get("style", "") - useMovementAmplitude = kwargs.get("useMovementAmplitude", False) - movementAmplitude = kwargs.get("movementAmplitude", "") - useTemplateName = kwargs.get("useTemplateName", False) - templateName = kwargs.get("templateName", "") - useTemplateArea = kwargs.get("useTemplateArea", False) - templateArea = kwargs.get("templateArea", "") - useTemplateBeast = kwargs.get("useTemplateBeast", False) - templateBeast = kwargs.get("templateBeast", "") - - # Build provider settings dictionary - providerSettings = {} - - if useAudio: - providerSettings["audio"] = audio - if useBgm: - providerSettings["bgm"] = bgm - if useStyle and style and style.strip(): - providerSettings["style"] = style.strip() - if useMovementAmplitude and movementAmplitude and movementAmplitude.strip(): - providerSettings["movementAmplitude"] = movementAmplitude.strip() - - # Build template object if any template parameters are enabled and provided - template = {} - if useTemplateName and templateName and templateName.strip(): - template["name"] = templateName.strip() - if useTemplateArea and templateArea and templateArea.strip(): - template["area"] = templateArea.strip() - if useTemplateBeast and templateBeast and templateBeast.strip(): - template["beast"] = templateBeast.strip() - if template: - providerSettings["template"] = template - - return (providerSettings,) diff --git a/modules/providerSettings/xaiProviderSettings.py b/modules/providerSettings/xaiProviderSettings.py deleted file mode 100644 index c57fda6..0000000 --- a/modules/providerSettings/xaiProviderSettings.py +++ /dev/null @@ -1,54 +0,0 @@ -""" -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", -} diff --git a/modules/referenceAudios.py b/modules/referenceAudios.py deleted file mode 100644 index 0c028d6..0000000 --- a/modules/referenceAudios.py +++ /dev/null @@ -1,48 +0,0 @@ -from typing import List - - -class referenceAudios: - """Reference Audios node for configuring reference audio inputs""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "Audio1": ("STRING", { - "default": "", - "tooltip": "MediaUUID for the first reference audio from Runware Media Upload node.", - }), - "Audio2": ("STRING", { - "default": "", - "tooltip": "MediaUUID for the second reference audio from Runware Media Upload node.", - }), - "Audio3": ("STRING", { - "default": "", - "tooltip": "MediaUUID for the third reference audio from Runware Media Upload node.", - }), - "Audio4": ("STRING", { - "default": "", - "tooltip": "MediaUUID for the fourth reference audio from Runware Media Upload node.", - }), - } - } - - DESCRIPTION = "Configure multiple reference audios (mediaUUIDs) for video inference inputs." - FUNCTION = "createReferenceAudios" - RETURN_TYPES = ("RUNWAREINPUTAUDIOS",) - RETURN_NAMES = ("Reference Audios",) - CATEGORY = "Runware" - - def createReferenceAudios(self, **kwargs) -> tuple[List[str]]: - """Create list of reference audio UUIDs from provided parameters""" - audioList = [] - - for i in range(1, 5): - audioKey = f"Audio{i}" - audioUuid = kwargs.get(audioKey) - - if audioUuid and audioUuid.strip() != "": - audioList.append(audioUuid.strip()) - - return (audioList,) diff --git a/modules/referenceImages.py b/modules/referenceImages.py deleted file mode 100644 index 20c1177..0000000 --- a/modules/referenceImages.py +++ /dev/null @@ -1,50 +0,0 @@ -from .utils import runwareUtils as rwUtils - - -class referenceImages: - """Reference Images node for providing reference images for identity consistency""" - - MAX_IMAGES = 14 - - @classmethod - def INPUT_TYPES(cls): - requiredInputs = { - "Image 1": ("IMAGE", { - "tooltip": "Specifies Reference Image 1 that will be used as reference for the subject. These reference images help the AI to maintain identity consistency during the generation process." - }), - } - - optionalInputs = {} - for i in range(2, cls.MAX_IMAGES + 1): - ordinal = rwUtils.getOrdinal(i) - optionalInputs[f"Image {i}"] = ("IMAGE", { - "tooltip": f"Specifies {ordinal.capitalize()} Reference Image that will be used as reference for the subject. These reference images help the AI to maintain identity consistency during the generation process." - }) - - return { - "required": requiredInputs, - "optional": optionalInputs - } - - DESCRIPTION = "Used With Runware Tasks To Provide Reference Images For The Subject. These Reference Images Help The AI To Maintain Identity Consistency During The Generation Process." - FUNCTION = "referenceImages" - RETURN_TYPES = ("RUNWAREREFERENCEIMAGES",) - RETURN_NAMES = ("Reference Images",) - CATEGORY = "Runware" - - def referenceImages(self, **kwargs): - """Collect and convert reference images to list""" - imageList = [] - - # Always include Image 1 (required) - image1 = kwargs.get("Image 1") - if image1 is not None: - imageList.append(rwUtils.convertTensor2IMG(image1)) - - # Add optional images 2 through MAX_IMAGES - for i in range(2, self.MAX_IMAGES + 1): - image = kwargs.get(f"Image {i}", None) - if image is not None: - imageList.append(rwUtils.convertTensor2IMG(image)) - - return (imageList,) diff --git a/modules/referenceVideos.py b/modules/referenceVideos.py deleted file mode 100644 index 187a40a..0000000 --- a/modules/referenceVideos.py +++ /dev/null @@ -1,79 +0,0 @@ -from typing import Any, Dict, List -from .utils import runwareUtils as rwUtils - - -class referenceVideos: - """Reference Videos node for configuring reference video inputs""" - - MAX_VIDEOS = 4 - - @classmethod - def INPUT_TYPES(cls): - optionalInputs = {} - - for i in range(1, cls.MAX_VIDEOS + 1): - ordinal = rwUtils.getOrdinal(i) - optionalInputs[f"useVideo{i}"] = ("BOOLEAN", { - "default": False, - "tooltip": f"Enable to include the {ordinal} reference video.", - }) - optionalInputs[f"Video{i}"] = ("STRING", { - "tooltip": f"MediaUUID for the {ordinal} reference video from Runware Media Upload node.", - }) - optionalInputs[f"Tag{i}"] = ("STRING", { - "default": "", - "tooltip": f"Optional tag for the {ordinal} reference video (e.g., @video{i}). Must be used in the prompt.", - }) - optionalInputs[f"Type{i}"] = ("STRING", { - "default": "reference", - "tooltip": ( - f"Optional type for the {ordinal} reference video. " - "For example: reference or extend." - ), - }) - - return { - "required": {}, - "optional": optionalInputs - } - - DESCRIPTION = ( - "Configure multiple reference video inputs (mediaUUIDs) for video generation, " - "with optional tag and type per reference." - ) - FUNCTION = "createReferenceVideos" - RETURN_TYPES = ("RUNWAREREFERENCEVIDEOS",) - RETURN_NAMES = ("Reference Videos",) - CATEGORY = "Runware" - - def createReferenceVideos(self, **kwargs) -> tuple[List[Any]]: - """Create list of reference video entries (string UUIDs or objects with tag/type).""" - videoList: List[Any] = [] - - for i in range(1, self.MAX_VIDEOS + 1): - useKey = f"useVideo{i}" - videoKey = f"Video{i}" - tagKey = f"Tag{i}" - typeKey = f"Type{i}" - useVideo = bool(kwargs.get(useKey, False)) - videoUuid = kwargs.get(videoKey) - tagValue = (kwargs.get(tagKey) or "").strip() - typeValue = (kwargs.get(typeKey) or "reference").strip() - - if useVideo and videoUuid and videoUuid.strip() != "": - normalized_video = videoUuid.strip() - - # Backward compatible payload: - # - If tag/type are not provided, keep legacy string entry. - # - If tag or non-default type is provided, emit object entry. - if tagValue or typeValue != "reference": - entry: Dict[str, str] = {"video": normalized_video} - if tagValue: - entry["tag"] = tagValue - if typeValue: - entry["type"] = typeValue - videoList.append(entry) - else: - videoList.append(normalized_video) - - return (videoList,) diff --git a/modules/referenceVoices.py b/modules/referenceVoices.py deleted file mode 100644 index 8baa2e6..0000000 --- a/modules/referenceVoices.py +++ /dev/null @@ -1,43 +0,0 @@ -from typing import List -from .utils import runwareUtils as rwUtils - - -class referenceVoices: - """Reference Voices node for configuring reference voice inputs""" - - MAX_VOICES = 4 - - @classmethod - def INPUT_TYPES(cls): - optionalInputs = {} - - for i in range(1, cls.MAX_VOICES + 1): - ordinal = rwUtils.getOrdinal(i) - optionalInputs[f"Voice{i}"] = ("STRING", { - "tooltip": f"URL or mediaUUID for the {ordinal} reference voice from Runware Media Upload node or external URL.", - }) - - return { - "required": {}, - "optional": optionalInputs - } - - DESCRIPTION = "Configure multiple reference voice inputs (URLs or mediaUUIDs) for video generation." - FUNCTION = "createReferenceVoices" - RETURN_TYPES = ("RUNWAREREFERENCEVOICES",) - RETURN_NAMES = ("Reference Voices",) - CATEGORY = "Runware" - - def createReferenceVoices(self, **kwargs) -> tuple[List[str]]: - """Create list of reference voice URLs/UUIDs""" - voiceList = [] - - for i in range(1, self.MAX_VOICES + 1): - voiceKey = f"Voice{i}" - voiceUrl = kwargs.get(voiceKey) - - if voiceUrl and voiceUrl.strip() != "": - voiceList.append(voiceUrl.strip()) - - return (voiceList,) - diff --git a/modules/refiner.py b/modules/refiner.py deleted file mode 100644 index 61630ed..0000000 --- a/modules/refiner.py +++ /dev/null @@ -1,56 +0,0 @@ -class refiner: - """Refiner node for enhancing image quality using refiner models""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Model": ("RUNWAREMODEL", { - "tooltip": "Connect a Runware Model From Model Search Node.", - }), - "startStep": ("INT", { - "tooltip": "Represents the step number at which the refinement process begins. The initial model will generate the image up to this step, after which the refiner model takes over to enhance the result.", - "min": 0, - "max": 99, - "default": 0, - }), - "startStepPercentage": ("INT", { - "tooltip": "Represents the percentage of total steps at which the refinement process begins. The initial model will generate the image up to this percentage of steps before the refiner takes over.", - "min": 0, - "max": 99, - "default": 0 - }), - }, - } - - DESCRIPTION = "Refiner models help create higher quality image outputs by incorporating specialized models designed to enhance image details and overall coherence. This can be particularly useful when you need results with superior quality, photorealism, or specific aesthetic refinements. (Note that refiner models are only SDXL based)" - FUNCTION = "refiner" - RETURN_TYPES = ("RUNWAREREFINER",) - CATEGORY = "Runware" - - @classmethod - def VALIDATE_INPUTS(cls, startStep, startStepPercentage): - """Validate that exactly one of startStep or startStepPercentage is provided""" - if startStep != 0 and startStepPercentage != 0: - raise Exception("Please provide either startStep or startStepPercentage, not both.") - elif startStep == 0 and startStepPercentage == 0: - raise Exception("Please provide either startStep or startStepPercentage.") - else: - return True - - def refiner(self, **kwargs): - """Create refiner configuration""" - runwareModel = kwargs.get("Model") - startStep = kwargs.get("startStep") - startStepPercentage = kwargs.get("startStepPercentage") - - refinerResult = { - "model": runwareModel, - } - - if startStep != 0: - refinerResult["startStep"] = startStep - else: - refinerResult["startStepPercentage"] = startStepPercentage - - return (refinerResult,) diff --git a/modules/runwareBFL.py b/modules/runwareBFL.py deleted file mode 100644 index dcef443..0000000 --- a/modules/runwareBFL.py +++ /dev/null @@ -1,139 +0,0 @@ -from .utils import runwareUtils as rwUtils - -class runwareKontext: - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Model": ([ - "bfl:3@1 (FLUX.1 Kontext Pro)", - "bfl:4@1 (FLUX.1 Kontext Max)", - ], { - "tooltip": "Select The Model You Want For Image Generation or Image Editing.", - "default": "bfl:3@1 (FLUX.1 Kontext Pro)", - }), - "positivePrompt": ("STRING", { - "multiline": True, - "placeholder": "Text instruction to guide the model on generating the image. It is usually a sentence or a paragraph that provides positive guidance for the task. This parameter is essential to shape the desired results.\n\nYou Can Press (Ctrl + Alt + E) To Enhance The Prompt!", - "tooltip": "Text instruction to guide the model on generating the image. You Can Also Press (Ctrl + Alt + E) To Enhance The Prompt!" - }), - "Prompt Upsampling": ("BOOLEAN", { - "tooltip": "If Enabled it Will automatically modify the prompt at generation time for more creative results.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "Aspect Ratio": ([ - "21:9 (Ultra-Wide / Landscape)", - "16:9 (Wide / Landscape)", - "4:3 (Standard / Landscape)", - "3:2 (Classic Photo / Landscape)", - "1:1 (Square)", - "2:3 (Classic Photo / Portrait)", - "3:4 (Standard / Portrait)", - "9:16 (Vertical Video / Portrait)", - "9:21 (Ultra-Tall / Portrait)" - ], { - "default": "16:9 (Wide / Landscape)", - "tooltip": "Adjust the dimensions of the generated image. This setting allows you to choose from various aspect ratios, such as 16:9 for wide images or 1:1 for square images. The width and height will be automatically adjusted based on the selected aspect ratio.", - }), - "seed": ("INT", { - "tooltip": "A value used to randomize the image generation. If you want to make images reproducible (generate the same image multiple times), you can use the same seed value. Set to 0 to auto-generate a random seed.", - "default": 0, - "min": 0, - "max": 4294967295, - }), - "Multi Inference Mode": ("BOOLEAN", { - "tooltip": "If Enabled the node will skip the image generation process and will only return the Runware Task Object to be used in the Multi Inference Node.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "batchSize": ("INT", { - "tooltip": "The number of images to generate in a single request.", - "default": 1, - "min": 1, - "max": 10, - }), - }, - "optional": { - "Reference Images": ("RUNWAREREFERENCEIMAGES", { - "tooltip": "Connect a Runware Reference Images Node to use reference images for image editing or generation.", - }), - } - } - - @classmethod - def VALIDATE_INPUTS(cls, positivePrompt): - if (positivePrompt is not None and (positivePrompt == "" or len(positivePrompt) < 3 or len(positivePrompt) > 2000)): - raise Exception( - "Positive Prompt Must Be Between 3 And 2000 characters!") - return True - - DESCRIPTION = "Generate And Edit Images Using Runware BFL Kontext Models." - FUNCTION = "kontextInference" - RETURN_TYPES = ("IMAGE", "RUNWARETASK") - RETURN_NAMES = ("IMAGE", "RW-Task") - CATEGORY = "Runware" - - def kontextInference(self, **kwargs): - runwareModel = kwargs.get("Model") - runwareModel = runwareModel.split(" ")[0] - positivePrompt = kwargs.get("positivePrompt") - promptUpsampling = kwargs.get("Prompt Upsampling") - aspectRatio = kwargs.get("Aspect Ratio") - multiInferenceMode = kwargs.get("Multi Inference Mode", False) - referenceImages = kwargs.get("Reference Images", None) - seed = kwargs.get("seed") - batchSize = kwargs.get("batchSize", 1) - - aspectRatioMap = { - "21:9": (1568, 672), - "16:9": (1392, 752), - "4:3": (1184, 880), - "3:2": (1248, 832), - "1:1": (1024, 1024), - "2:3": (832, 1248), - "3:4": (880, 1184), - "9:16": (752, 1392), - "9:21": (672, 1568), - } - - secAspectRatio = aspectRatio.split(" ")[0] - width, height = aspectRatioMap.get(secAspectRatio, (1024, 1024)) - - genConfig = [ - { - "taskType": "imageInference", - "taskUUID": rwUtils.genRandUUID(), - "positivePrompt": positivePrompt, - "height": height, - "width": width, - "model": runwareModel, - "seed": seed, - "outputType": "base64Data", - "outputFormat": rwUtils.OUTPUT_FORMAT, - "outputQuality": rwUtils.OUTPUT_QUALITY, - "numberResults": batchSize, - } - ] - - if (referenceImages is not None): - genConfig[0]["referenceImages"] = referenceImages - - if (promptUpsampling): - genConfig[0]["providerSettings"] = { - "bfl": { - "promptUpsampling": True - } - } - - # For Debugging Purposes Only - print(f"[Debugging] Task UUID: {genConfig[0]['taskUUID']}") - - if (multiInferenceMode): - return (None, genConfig) - else: - genResult = rwUtils.inferenecRequest(genConfig) - images = rwUtils.convertImageB64List(genResult) - return (images, None) diff --git a/modules/runwareImagen.py b/modules/runwareImagen.py deleted file mode 100644 index 487453b..0000000 --- a/modules/runwareImagen.py +++ /dev/null @@ -1,111 +0,0 @@ -from .utils import runwareUtils as rwUtils - -class runwareImagen: - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Model": ([ - "google:1@1 (Imagen 3)", - "google:1@2 (Imagen 3 Fast)", - "google:2@1 (Imagen 4 Preview)", - "google:2@2 (Imagen 4 Ultra)", - "google:2@3 (Imagen 4 Fast)", - ], { - "tooltip": "Select The Google Imagen Model For Image Generation.", - "default": "google:1@1 (Imagen 3)", - }), - "positivePrompt": ("STRING", { - "multiline": True, - "placeholder": "Text instruction to guide the model on generating the image. It is usually a sentence or a paragraph that provides positive guidance for the task. This parameter is essential to shape the desired results.", - "tooltip": "Text instruction to guide the model on generating the image." - }), - "Aspect Ratio": ([ - "1:1 (Square)", - "9:16 (Vertical)", - "16:9 (Wide)", - "3:4 (Portrait)", - "4:3 (Landscape)" - ], { - "default": "1:1 (Square)", - "tooltip": "Adjust the dimensions of the generated image. The width and height will be automatically adjusted based on the selected aspect ratio.", - }), - "seed": ("INT", { - "tooltip": "A value used to randomize the image generation. If you want to make images reproducible (generate the same image multiple times), you can use the same seed value.", - "default": 0, - "min": 1, - "max": 9223372036854776000, - }), - "Multi Inference Mode": ("BOOLEAN", { - "tooltip": "If Enabled the node will skip the image generation process and will only return the Runware Task Object to be used in the Multi Inference Node.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "batchSize": ("INT", { - "tooltip": "The number of images to generate in a single request.", - "default": 1, - "min": 1, - "max": 10, - }), - } - } - - @classmethod - def VALIDATE_INPUTS(cls, positivePrompt): - if (positivePrompt is not None and (positivePrompt == "" or len(positivePrompt) < 3 or len(positivePrompt) > 2000)): - raise Exception( - "Positive Prompt Must Be Between 3 And 2000 characters!") - return True - - DESCRIPTION = "Generate Images Using Google Imagen Models." - FUNCTION = "imagenInference" - RETURN_TYPES = ("IMAGE", "RUNWARETASK") - RETURN_NAMES = ("IMAGE", "RW-Task") - CATEGORY = "Runware" - - def imagenInference(self, **kwargs): - runwareModel = kwargs.get("Model") - runwareModel = runwareModel.split(" ")[0] - positivePrompt = kwargs.get("positivePrompt") - aspectRatio = kwargs.get("Aspect Ratio") - multiInferenceMode = kwargs.get("Multi Inference Mode", False) - seed = kwargs.get("seed") - batchSize = kwargs.get("batchSize", 1) - - aspectRatioMap = { - "1:1": (1024, 1024), - "9:16": (768, 1408), - "16:9": (1408, 768), - "3:4": (896, 1280), - "4:3": (1280, 896), - } - - secAspectRatio = aspectRatio.split(" ")[0] - width, height = aspectRatioMap.get(secAspectRatio, (1024, 1024)) - - genConfig = [ - { - "taskType": "imageInference", - "taskUUID": rwUtils.genRandUUID(), - "positivePrompt": positivePrompt, - "height": height, - "width": width, - "model": runwareModel, - "seed": seed, - "outputType": "base64Data", - "outputFormat": rwUtils.OUTPUT_FORMAT, - "outputQuality": rwUtils.OUTPUT_QUALITY, - "numberResults": batchSize - } - ] - - # For Debugging Purposes Only - print(f"[Debugging] Task UUID: {genConfig[0]['taskUUID']}") - - if (multiInferenceMode): - return (None, genConfig) - else: - genResult = rwUtils.inferenecRequest(genConfig) - images = rwUtils.convertImageB64List(genResult) - return (images, None) diff --git a/modules/safetyInputs.py b/modules/safetyInputs.py deleted file mode 100644 index 1e2b230..0000000 --- a/modules/safetyInputs.py +++ /dev/null @@ -1,91 +0,0 @@ -from typing import Dict, Any - - -class safetyInputs: - """Runware Safety Inputs Node for configuring safety and content moderation settings""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useMode": ("BOOLEAN", { - "tooltip": "Enable to include mode in payload.", - "default": False, - }), - "mode": (["none", "fast", "full"], { - "tooltip": "Safety moderation mode: none (disable), fast (quick check), or full (comprehensive check).", - "default": "none", - }), - "useTolerance": ("BOOLEAN", { - "tooltip": "Enable to include tolerance in payload.", - "default": False, - }), - "tolerance": ("BOOLEAN", { - "tooltip": "Safety tolerance setting for content moderation.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useCheckInputs": ("BOOLEAN", { - "tooltip": "Enable to include checkInputs in payload.", - "default": False, - }), - "checkInputs": ("BOOLEAN", { - "tooltip": "Enable checking of input content for safety violations.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useCheckContent": ("BOOLEAN", { - "tooltip": "Enable to include checkContent in payload.", - "default": False, - }), - "checkContent": ("BOOLEAN", { - "tooltip": "Enable checking of generated content for safety violations.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - } - } - - RETURN_TYPES = ("RUNWARESAFETYINPUTS",) - RETURN_NAMES = ("Safety Inputs",) - FUNCTION = "createSafetyInputs" - CATEGORY = "Runware" - DESCRIPTION = "Configure safety and content moderation settings for Runware tasks." - - def createSafetyInputs(self, **kwargs) -> tuple[Dict[str, Any]]: - """Create safety inputs dictionary""" - useMode = kwargs.get("useMode", False) - mode = kwargs.get("mode", None) - useTolerance = kwargs.get("useTolerance", False) - tolerance = kwargs.get("tolerance", None) - useCheckInputs = kwargs.get("useCheckInputs", False) - checkInputs = kwargs.get("checkInputs", None) - useCheckContent = kwargs.get("useCheckContent", False) - checkContent = kwargs.get("checkContent", None) - - safetyInputs = {} - - if useMode and mode is not None: - safetyInputs["mode"] = mode - if useTolerance and tolerance is not None: - safetyInputs["tolerance"] = tolerance - if useCheckInputs and checkInputs is not None: - safetyInputs["checkInputs"] = checkInputs - if useCheckContent and checkContent is not None: - safetyInputs["checkContent"] = checkContent - - return (safetyInputs,) - - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareSafetyInputs": safetyInputs, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareSafetyInputs": "Runware Safety Inputs", -} diff --git a/modules/save3D.py b/modules/save3D.py deleted file mode 100644 index 95ef30e..0000000 --- a/modules/save3D.py +++ /dev/null @@ -1,124 +0,0 @@ -from .utils import runwareUtils as rwUtils -import folder_paths -import os -import re -import requests -from datetime import datetime - - -class RunwareSave3D: - """Runware Save 3D node for saving 3D model files from URL""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "3dObject": ("STRING", { - "tooltip": "3D file URL from Runware 3D Inference node." - }), - "filenamePrefix": ("STRING", { - "default": "ComfyUI", - "tooltip": "Prefix for the filename." - }), - }, - "optional": { - "filepath": ("STRING", { - "placeholder": "Saved file path will appear here after execution.", - "tooltip": "This field is automatically populated with the saved file path after save.", - }), - }, - "hidden": {"node_id": "UNIQUE_ID"}, - } - - RETURN_TYPES = ("STRING",) - RETURN_NAMES = ("filepath",) - FUNCTION = "save_3d" - OUTPUT_NODE = True - CATEGORY = "Runware" - DESCRIPTION = "Save 3D model files (GLB/PLY/FBX) from Runware 3D Inference to the output folder." - - def save_3d(self, filenamePrefix="ComfyUI", **kwargs): - """Save 3D file from URL""" - file_url = kwargs.get("3dObject", "") - - if not file_url or not file_url.strip(): - raise Exception("No 3D URL provided. Please connect the '3dObject' output from Runware 3D Inference node.") - - file_url = file_url.strip() - - # Get output directory - output_dir = folder_paths.get_output_directory() - threed_output_dir = os.path.join(output_dir, "3d_models") - os.makedirs(threed_output_dir, exist_ok=True) - - # Get extension from URL (handle query parameters) - url_without_params = file_url.split('?')[0] - extension = url_without_params.split('.')[-1].lower() - - if extension not in ["glb", "ply", "fbx"]: - raise Exception(f"Unsupported 3D file extension '{extension}' from URL. Expected .glb, .ply, or .fbx.") - - # Sanitize filenamePrefix to prevent path traversal or arbitrary subdir creation - prefix_basename = os.path.basename( - filenamePrefix.replace(os.sep, "_").replace(os.altsep or os.sep, "_") - ) - safe_prefix = re.sub(r"[^\w\-]", "", prefix_basename) or "ComfyUI" - - # Generate filename with timestamp - timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") - filename = f"{safe_prefix}_{timestamp}.{extension}" - filepath = os.path.join(threed_output_dir, filename) - - # Download with retry logic - max_retries = 10 - retry_delays = [2, 5, 10, 15, 20] - - for attempt in range(max_retries): - try: - response = requests.get(file_url, stream=True, timeout=60) - print(f"[Runware Save 3D] Download attempt {attempt + 1}: {response.status_code}") - - if response.status_code == 422: - print(f"[Runware Save 3D] Server still processing, waiting...") - rwUtils.time.sleep(retry_delays[min(attempt, len(retry_delays) - 1)]) - continue - - if response.status_code == 502: - print(f"[Runware Save 3D] Server error (502), retrying...") - rwUtils.time.sleep(retry_delays[min(attempt, len(retry_delays) - 1)]) - continue - - response.raise_for_status() - - with open(filepath, 'wb') as f: - for chunk in response.iter_content(chunk_size=8192): - f.write(chunk) - - print(f"[Runware Save 3D] Successfully saved to: {filepath}") - - # Send filepath to UI (like media upload mediaUUID) - rwUtils.sendSave3DFilepath(filepath, kwargs.get("node_id")) - - return {"result": (filepath,), "ui": {"text": (f"Saved: {filename}",)}} - - except requests.exceptions.RequestException as e: - print(f"[Runware Save 3D] Attempt {attempt + 1} failed: {e}") - if attempt < max_retries - 1: - rwUtils.time.sleep(retry_delays[min(attempt, len(retry_delays) - 1)]) - continue - else: - raise Exception(f"Failed to download 3D file after {max_retries} attempts: {e}") - except Exception as e: - print(f"[Runware Save 3D] Unexpected error: {e}") - raise Exception(f"Failed to save 3D file: {e}") - - raise Exception("Failed to download 3D file: max retries exceeded") - - -NODE_CLASS_MAPPINGS = { - "RunwareSave3D": RunwareSave3D, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareSave3D": "Runware Save 3D", -} diff --git a/modules/saveImage.py b/modules/saveImage.py deleted file mode 100644 index b3ac596..0000000 --- a/modules/saveImage.py +++ /dev/null @@ -1,110 +0,0 @@ -import folder_paths -import os -import io -import requests -import torch -import numpy as np -from PIL import Image -from datetime import datetime - - -def _is_svg_url(url: str) -> bool: - """True if URL points to SVG (e.g. from Runware Vectorize).""" - u = (url or "").split("?")[0].lower() - return u.endswith(".svg") - - -def _bytes_to_image_tensor(img_data: bytes): - """Decode image bytes to ComfyUI IMAGE tensor [1, H, W, C] float32 0-1. Fails on SVG (use placeholder for SVG).""" - pil = Image.open(io.BytesIO(img_data)).convert("RGB") - arr = np.array(pil).astype(np.float32) / 255.0 - return torch.from_numpy(arr).unsqueeze(0) - - -def _placeholder_image_tensor(): - """Return a 1x1 RGB placeholder tensor [1, 1, 1, 3] for non-raster outputs (e.g. SVG from Vectorize).""" - arr = np.ones((1, 1, 3), dtype=np.float32) * 0.5 # grey - return torch.from_numpy(arr).unsqueeze(0) - - -class RunwareSaveImage: - """Runware Save Image: download from URL(s), save/preview to disk, and forward as IMAGE for chaining.""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Images": ("STRING", { - "tooltip": "Image URL(s) from Runware Image Inference or Runware Vectorize node. For multiple images, URLs should be comma-separated. SVG URLs (e.g. from Vectorize) are saved as .svg files; a placeholder tensor is passed for the IMAGE output." - }), - "filenamePrefix": ("STRING", { - "default": "ComfyUI", - "tooltip": "Prefix for the filename." - }), - "saveImage": ("BOOLEAN", { - "default": True, - "label_on": "Enabled", - "label_off": "Disabled", - "tooltip": "If true, save to output folder. If false, download and preview only (purged when ComfyUI restarts)." - }), - } - } - - RETURN_TYPES = ("IMAGE",) - RETURN_NAMES = ("IMAGE",) - FUNCTION = "save_images" - OUTPUT_NODE = True - CATEGORY = "Runware" - - def save_images(self, Images, filenamePrefix="ComfyUI", saveImage=True): - """Download image(s) from URL(s), save/preview to disk, update gallery, and return IMAGE for downstream nodes.""" - - image_urls = [url.strip() for url in Images.split(",") if url.strip()] - - if not image_urls: - raise Exception("No images provided. Connect the 'IMAGE' output from Runware Image Inference node.") - - if saveImage: - output_dir = folder_paths.get_output_directory() - os.makedirs(output_dir, exist_ok=True) - file_type = "output" - else: - output_dir = folder_paths.get_temp_directory() - file_type = "temp" - - saved_files = [] - timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") - tensors = [] - - for i, image_url in enumerate(image_urls): - response = requests.get(image_url, timeout=30) - response.raise_for_status() - img_data = response.content - - # SVG (e.g. from Runware Vectorize) cannot be opened by PIL; save as file and use placeholder tensor - if _is_svg_url(image_url): - tensors.append(_placeholder_image_tensor()) - else: - tensors.append(_bytes_to_image_tensor(img_data)) - - url_without_params = image_url.split("?")[0] - ext = url_without_params.split(".")[-1].lstrip(".").lower() or "png" - extension = "." + ext - if len(image_urls) > 1: - filename = f"{filenamePrefix}_{timestamp}_{i+1:03}{extension}" - else: - filename = f"{filenamePrefix}_{timestamp}{extension}" - filepath = os.path.join(output_dir, filename) - - with open(filepath, "wb") as f: - f.write(img_data) - print(f"[Runware] {'Saved' if saveImage else 'Preview'}: {filepath}") - - saved_files.append({ - "filename": filename, - "subfolder": "", - "type": file_type - }) - - image_batch = torch.cat(tensors, dim=0) - return {"result": (image_batch,), "ui": {"images": saved_files}} diff --git a/modules/saveText.py b/modules/saveText.py deleted file mode 100644 index 708507a..0000000 --- a/modules/saveText.py +++ /dev/null @@ -1,37 +0,0 @@ -from .utils import runwareUtils as rwUtils - - -class RunwareSaveText: - """Show text in the node (e.g. from Runware Text Inference) and forward it for downstream nodes.""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "text": ("STRING", { - "multiline": True, - "default": "", - "tooltip": "Connect the 'text' output from Runware Text Inference. Text is mirrored here after run.", - }), - }, - "hidden": {"node_id": "UNIQUE_ID"}, - } - - RETURN_TYPES = ("STRING",) - RETURN_NAMES = ("text",) - FUNCTION = "forward_text" - OUTPUT_NODE = True - CATEGORY = "Runware" - DESCRIPTION = "Display text in the node and forward the same string to other nodes." - - def forward_text(self, text, **kwargs): - if text is None: - text = "" - elif not isinstance(text, str): - text = str(text) - - node_id = kwargs.get("node_id") - if node_id is not None: - rwUtils.sendSaveText(text, node_id) - - return (text,) diff --git a/modules/settings.py b/modules/settings.py deleted file mode 100644 index 279ce8b..0000000 --- a/modules/settings.py +++ /dev/null @@ -1,486 +0,0 @@ -""" -Runware Image Inference Settings (registered as Runware Settings for workflow compatibility). -Provides settings for image generation including temperature, systemPrompt, topP, layers, -quality, background, style, search, promptExtend, editRegions, thinking (boolean), -thinkingLevel (low/medium/high/xhigh), backgroundMode (original/transparent/solid), backgroundColor, -enhancePrompt, scoringPrompt, sequential, renderingSpeed (TURBO/DEFAULT/QUALITY), -magicPrompt (AUTO/ON/OFF), autoCrop, dilatePixels, creativity (raw/low/medium/high), colorPalette, -moodboards (from Runware Image Inference Settings Moodboards), -structuredPrompt (from Runware Image Inference Settings Structured Prompt; Ideogram 4.0), -and promptEnhance (from Runware Image Inference Settings Prompt Enhance), -preserveInputSize (return output at original input resolution), -and turbo (faster generation for slightly lower quality). -""" - -import json -from typing import Any, Dict, List, Optional - - -class RunwareSettings: - """Runware Image Inference Settings node (display name); API registration key remains Runware Settings.""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useTemperature": ("BOOLEAN", { - "tooltip": "Enable to include temperature parameter in API request", - "default": False, - }), - "temperature": ("FLOAT", { - "tooltip": "Temperature value for generation. Only used when 'Use Temperature' is enabled.", - "default": 1.0, - "min": 0.0, - "max": 2.0, - "step": 0.1, - }), - "useSystemPrompt": ("BOOLEAN", { - "tooltip": "Enable to include systemPrompt parameter in API request", - "default": False, - }), - "systemPrompt": ("STRING", { - "multiline": True, - "tooltip": "System prompt for generation. Only used when 'Use System Prompt' is enabled.", - "default": "", - }), - "useTopP": ("BOOLEAN", { - "tooltip": "Enable to include topP parameter in API request", - "default": False, - }), - "topP": ("FLOAT", { - "tooltip": "Top-p (nucleus) sampling parameter. Only used when 'Use Top P' is enabled.", - "default": 1.0, - "min": 0.0, - "max": 1.0, - "step": 0.01, - }), - "useLayers": ("BOOLEAN", { - "tooltip": "Enable to include layers parameter in API request", - "default": False, - }), - "layers": ("INT", { - "tooltip": "The number of layers to generate. Only used when 'Use Layers' is enabled.", - "default": 4, - "min": 1, - "max": 10, - "step": 1, - }), - "useTrueCFGScale": ("BOOLEAN", { - "tooltip": "Enable to include true_cfg_scale parameter in API request", - "default": False, - }), - "trueCFGScale": ("FLOAT", { - "tooltip": "Guidance scale as defined in Classifier-Free Diffusion Guidance. Classifier-free guidance is enabled by setting true_cfg_scale > 1 and a provided negative_prompt. Higher guidance scale encourages to generate images that are closely linked to the text prompt, usually at the expense of lower image quality. Only used when 'Use True CFG Scale' is enabled.", - "default": 1.0, - "min": 1.0, - "step": 0.1, - }), - "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. Only used when 'Use Quality' is enabled.", - }), - "usePromptExtend": ("BOOLEAN", { - "tooltip": "Enable to include promptExtend (automatic prompt rewriting/expansion) in API request.", - "default": False, - }), - "promptExtend": ("BOOLEAN", { - "tooltip": "Enables automatic prompt rewriting/expansion to improve quality. Adds 3–5s latency. Disable for detailed prompts or latency-sensitive use cases. Only used when 'Use Prompt Extend' is enabled.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "useEditRegions": ("BOOLEAN", { - "tooltip": "Enable to include editRegions in settings (per-input-image bounding boxes for edit flows).", - "default": False, - }), - "editRegions": ("STRING", { - "multiline": True, - "tooltip": "JSON array: one entry per input image; each entry is a list of boxes [x1,y1,x2,y2]. Example: [[[0,0,12,12],[25,25,100,100]],[],[[10,10,50,50]]]", - "default": "", - }), - "useThinking": ("BOOLEAN", { - "tooltip": "Enable to include thinking (boolean) in settings.", - "default": False, - }), - "thinking": ("BOOLEAN", { - "tooltip": "Thinking / reasoning flag passed in settings. Only used when 'Use Thinking' is enabled.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "useSequential": ("BOOLEAN", { - "tooltip": "Enable to include sequential (boolean) in settings.", - "default": False, - }), - "sequential": ("BOOLEAN", { - "tooltip": "Sequential / image-set mode flag. Only used when 'Use Sequential' is enabled.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "colorPalette": ("RUNWAREIMAGEINFERENCECOLORPALETTE", { - "tooltip": "Connect Runware Image Inference Color Palette. When the palette node outputs at least one swatch, it is merged into settings.colorPalette.", - }), - "useThinkingLevel": ("BOOLEAN", { - "tooltip": "Enable to include thinkingLevel (string) in settings.", - "default": False, - }), - "thinkingLevel": (["high", "medium", "low", "xhigh"], { - "default": "high", - "tooltip": ( - "Reasoning level for visual understanding. Riverflow 2.5 also supports xhigh (Pro only). " - "Only used when 'Use Thinking Level' is enabled." - ), - }), - "useBackground": ("BOOLEAN", { - "tooltip": "Enable to include background style in API request", - "default": False, - }), - "background": (["auto", "transparent", "opaque"], { - "default": "auto", - "tooltip": "Background style for the generated image. Only used when 'Use Background' is enabled.", - }), - "useStyle": ("BOOLEAN", { - "tooltip": "Enable to include style preset in API request", - "default": False, - }), - "style": ("STRING", { - "default": "auto", - "multiline": False, - "tooltip": "Style preset for generation. Only used when 'Use Style' is enabled.", - }), - "useSearch": ("BOOLEAN", { - "tooltip": "Enable to include search grounding in API request", - "default": False, - }), - "search": ("BOOLEAN", { - "tooltip": "Enables web search grounding for reference. Only used when 'Use Search' is enabled.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "useRenderingSpeed": ("BOOLEAN", { - "tooltip": "Enable to include renderingSpeed in settings.", - "default": False, - }), - "renderingSpeed": (["TURBO", "DEFAULT", "QUALITY"], { - "default": "DEFAULT", - "tooltip": "The rendering speed to use. Only used when 'Use Rendering Speed' is enabled.", - }), - "useMagicPrompt": ("BOOLEAN", { - "tooltip": "Enable to include magicPrompt in settings.", - "default": False, - }), - "magicPrompt": (["AUTO", "ON", "OFF"], { - "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", - }), - "useDilatePixels": ("BOOLEAN", { - "tooltip": "Enable to include dilatePixels in settings.", - "default": False, - }), - "dilatePixels": ("INT", { - "tooltip": "Expands mask edges for cleaner removal. Only used when 'Use Dilate Pixels' is enabled.", - "default": 10, - "min": 0, - "max": 100, - "step": 1, - }), - "useCreativity": ("BOOLEAN", { - "tooltip": "Enable to include creativity in settings.", - "default": False, - }), - "creativity": (["raw", "low", "medium", "high"], { - "default": "medium", - "tooltip": "Creativity level. Only used when 'Use Creativity' is enabled.", - }), - "moodboards": ("RUNWAREIMAGEINFERENCEMOODBOARDS", { - "tooltip": "Connect Runware Image Inference Settings Moodboards. When connected with at least one entry, it is merged into settings.moodboards.", - }), - "structuredPrompt": ("RUNWAREIMAGEINFERENCESTRUCTUREDPROMPT", { - "tooltip": "Connect Runware Image Inference Settings Structured Prompt (Ideogram 4.0). Merged into settings.structuredPrompt. Mutually exclusive with positivePrompt on the same API request.", - }), - "promptEnhance": ("RUNWAREIMAGEINFERENCEPROMPTENHANCE", { - "tooltip": "Connect Runware Image Inference Settings Prompt Enhance. Merged into settings.promptEnhance (temperature, topP). Omit from API when not connected or empty.", - }), - "useBackgroundMode": ("BOOLEAN", { - "tooltip": "Enable to include backgroundMode in settings (Riverflow 2.5 output background handling).", - "default": False, - }), - "backgroundMode": (["original", "transparent", "solid"], { - "default": "original", - "tooltip": ( - "settings.backgroundMode: original, transparent, or solid. " - "Only used when 'Use Background Mode' is enabled." - ), - }), - "useBackgroundColor": ("BOOLEAN", { - "tooltip": "Enable to include backgroundColor in settings (required when backgroundMode is solid).", - "default": False, - }), - "backgroundColor": ("STRING", { - "default": "#FFFFFF", - "tooltip": ( - "Hex color (#RRGGBB) composited when backgroundMode is solid. " - "Only used when 'Use Background Color' is enabled." - ), - }), - "useEnhancePrompt": ("BOOLEAN", { - "tooltip": "Enable to include enhancePrompt (boolean) in settings.", - "default": False, - }), - "enhancePrompt": ("BOOLEAN", { - "default": False, - "label_on": "true", - "label_off": "false", - "tooltip": ( - "Enhance the prompt with use-case context before generation (Riverflow 2.5). " - "Distinct from settings.promptEnhance (nested object). " - "Only used when 'Use Enhance Prompt' is enabled." - ), - }), - "useScoringPrompt": ("BOOLEAN", { - "tooltip": "Enable to include scoringPrompt in settings.", - "default": False, - }), - "scoringPrompt": ("STRING", { - "multiline": True, - "default": "", - "tooltip": ( - "Optional quality rubric used when RF 2.5 scores candidate outputs. " - "Only used when 'Use Scoring Prompt' is enabled." - ), - }), - "scoringRubric": ("RUNWAREIMAGEINFERENCESCORINGRUBRIC", { - "tooltip": ( - "Connect Runware Image Inference Settings Scoring Rubric or Scoring Rubric Combine " - "for settings.scoringRubric (up to 4 dimensions via Combine)." - ), - }), - "useCopyrightDetection": ("BOOLEAN", { - "tooltip": "Enable to include copyrightDetection in settings.", - "default": False, - }), - "copyrightDetection": ("BOOLEAN", { - "default": False, - "label_on": "true", - "label_off": "false", - "tooltip": ( - "Opt into post-generation copyright detection (Hive likeness + logo checks). " - "Only used when 'Use Copyright Detection' is enabled." - ), - }), - "usePreserveInputSize": ("BOOLEAN", { - "tooltip": "Enable to include preserveInputSize in settings.", - "default": False, - }), - "preserveInputSize": ("BOOLEAN", { - "default": False, - "label_on": "true", - "label_off": "false", - "tooltip": ( - "Return the output at the original input resolution. " - "Only used when 'Use Preserve Input Size' is enabled." - ), - }), - "useTurbo": ("BOOLEAN", { - "tooltip": "Enable to include turbo in settings.", - "default": False, - }), - "turbo": ("BOOLEAN", { - "tooltip": "Turbo mode: faster generation for slightly lower quality. Only used when 'Use Turbo' is enabled.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - } - } - - RETURN_TYPES = ("RUNWARESETTINGS",) - RETURN_NAMES = ("Settings",) - FUNCTION = "createSettings" - CATEGORY = "Runware" - DESCRIPTION = ( - "Configure general settings for image generation: temperature, system prompt, top-p, layers, quality, " - "backgroundMode (original/transparent/solid), backgroundColor, enhancePrompt, scoringPrompt, background, style, search, " - "promptExtend, editRegions (JSON), thinking (boolean), thinkingLevel (low/medium/high/xhigh), sequential, " - "renderingSpeed (TURBO/DEFAULT/QUALITY), magicPrompt (AUTO/ON/OFF), autoCrop, dilatePixels, " - "creativity (raw/low/medium/high), preserveInputSize, turbo (faster generation for slightly lower quality), and optional colorPalette, moodboards, structuredPrompt, promptEnhance, " - "and scoringRubric from dedicated settings nodes." - ) - - def createSettings(self, **kwargs) -> tuple[Dict[str, Any]]: - """Create settings configuration""" - - # Get control parameters - useTemperature = kwargs.get("useTemperature", False) - useSystemPrompt = kwargs.get("useSystemPrompt", False) - useTopP = kwargs.get("useTopP", False) - useLayers = kwargs.get("useLayers", False) - useTrueCFGScale = kwargs.get("useTrueCFGScale", False) - useQuality = kwargs.get("useQuality", False) - useBackground = kwargs.get("useBackground", False) - useStyle = kwargs.get("useStyle", False) - useSearch = kwargs.get("useSearch", False) - usePromptExtend = kwargs.get("usePromptExtend", False) - promptExtend = kwargs.get("promptExtend", False) - useEditRegions = kwargs.get("useEditRegions", False) - useThinking = kwargs.get("useThinking", False) - useThinkingLevel = kwargs.get("useThinkingLevel", False) - useBackgroundMode = kwargs.get("useBackgroundMode", False) - useBackgroundColor = kwargs.get("useBackgroundColor", False) - useEnhancePrompt = kwargs.get("useEnhancePrompt", False) - useScoringPrompt = kwargs.get("useScoringPrompt", False) - useCopyrightDetection = kwargs.get("useCopyrightDetection", False) - usePreserveInputSize = kwargs.get("usePreserveInputSize", False) - useSequential = kwargs.get("useSequential", False) - useRenderingSpeed = kwargs.get("useRenderingSpeed", False) - useMagicPrompt = kwargs.get("useMagicPrompt", False) - useAutoCrop = kwargs.get("useAutoCrop", False) - useDilatePixels = kwargs.get("useDilatePixels", False) - useCreativity = kwargs.get("useCreativity", False) - useTurbo = kwargs.get("useTurbo", False) - - # Get value parameters - temperature = kwargs.get("temperature", 1.0) - systemPrompt = kwargs.get("systemPrompt", "") - topP = kwargs.get("topP", 1.0) - layers = kwargs.get("layers") - trueCFGScale = kwargs.get("trueCFGScale") - quality = kwargs.get("quality", "medium") - background = kwargs.get("background", "auto") - style = kwargs.get("style", "auto") - renderingSpeed = kwargs.get("renderingSpeed", "DEFAULT") - magicPrompt = kwargs.get("magicPrompt", "AUTO") - creativity = kwargs.get("creativity", "medium") - - # Build settings dictionary - only include what is enabled - settings: Dict[str, Any] = {} - - # Add optional parameters only if enabled - if useTemperature: - settings["temperature"] = float(temperature) - if useSystemPrompt and systemPrompt and systemPrompt.strip(): - settings["systemPrompt"] = systemPrompt.strip() - if useTopP: - settings["topP"] = float(topP) - if useLayers: - settings["layers"] = int(layers) - if useTrueCFGScale: - settings["true_cfg_scale"] = float(trueCFGScale) - if useQuality: - settings["quality"] = quality - if useBackground: - settings["background"] = background - if useStyle: - settings["style"] = style - if useSearch: - settings["search"] = bool(kwargs.get("search", False)) - if usePromptExtend: - settings["promptExtend"] = bool(promptExtend) - - if useEditRegions: - raw_er = (kwargs.get("editRegions") or "").strip() - if raw_er: - try: - parsed = json.loads(raw_er) - except json.JSONDecodeError as e: - raise ValueError(f"editRegions must be valid JSON: {e}") from e - if not isinstance(parsed, list): - raise ValueError("editRegions JSON must be an array (one element per input image).") - settings["editRegions"] = parsed - - if useThinking: - settings["thinking"] = bool(kwargs.get("thinking", False)) - - if useThinkingLevel: - settings["thinkingLevel"] = str(kwargs.get("thinkingLevel", "high")) - - if useBackgroundMode: - settings["backgroundMode"] = str(kwargs.get("backgroundMode", "original")) - - if useBackgroundColor: - background_color = (kwargs.get("backgroundColor") or "").strip() - if background_color: - settings["backgroundColor"] = background_color - - if useEnhancePrompt: - settings["enhancePrompt"] = bool(kwargs.get("enhancePrompt", False)) - - if useScoringPrompt: - scoring_prompt = (kwargs.get("scoringPrompt") or "").strip() - if scoring_prompt: - settings["scoringPrompt"] = scoring_prompt - - if useCopyrightDetection: - settings["copyrightDetection"] = bool(kwargs.get("copyrightDetection", False)) - - if usePreserveInputSize: - settings["preserveInputSize"] = bool(kwargs.get("preserveInputSize", False)) - - if useSequential: - settings["sequential"] = bool(kwargs.get("sequential", False)) - - palette: Optional[List[Dict[str, Any]]] = kwargs.get("colorPalette") - if palette is not None and isinstance(palette, list) and len(palette) > 0: - settings["colorPalette"] = palette - moodboards: Optional[List[Dict[str, Any]]] = kwargs.get("moodboards") - if moodboards is not None and isinstance(moodboards, list) and len(moodboards) > 0: - settings["moodboards"] = moodboards - - structured_prompt: Optional[Dict[str, Any]] = kwargs.get("structuredPrompt") - if ( - structured_prompt is not None - and isinstance(structured_prompt, dict) - and len(structured_prompt) > 0 - ): - settings["structuredPrompt"] = structured_prompt - - prompt_enhance: Optional[Dict[str, Any]] = kwargs.get("promptEnhance") - if ( - prompt_enhance is not None - and isinstance(prompt_enhance, dict) - and len(prompt_enhance) > 0 - ): - settings["promptEnhance"] = prompt_enhance - - scoring_rubric: Optional[List[Dict[str, Any]]] = kwargs.get("scoringRubric") - if scoring_rubric is not None and isinstance(scoring_rubric, list) and len(scoring_rubric) > 0: - settings["scoringRubric"] = scoring_rubric - - if useRenderingSpeed: - settings["renderingSpeed"] = str(renderingSpeed) - if useMagicPrompt: - settings["magicPrompt"] = str(magicPrompt) - if useAutoCrop: - settings["autoCrop"] = bool(kwargs.get("autoCrop", False)) - if useDilatePixels: - settings["dilatePixels"] = int(kwargs.get("dilatePixels", 10)) - if useCreativity: - creativity = str(creativity) - if creativity not in ("raw", "low", "medium", "high"): - raise ValueError("creativity must be raw, low, medium, or high when useCreativity is enabled.") - settings["creativity"] = creativity - if useTurbo: - settings["turbo"] = bool(kwargs.get("turbo", False)) - - # Clean up None values - settings = {k: v for k, v in settings.items() if v is not None} - - return (settings,) - diff --git a/modules/speechInput.py b/modules/speechInput.py deleted file mode 100644 index 0a4f424..0000000 --- a/modules/speechInput.py +++ /dev/null @@ -1,81 +0,0 @@ -""" -Runware Speech Input Node -Creates a speech input configuration with TTS provider settings -""" - -from typing import Dict, Any - - -class RunwareSpeechInput: - """Runware Speech Input Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "provider": ("STRING", { - "tooltip": "TTS provider name. Currently supports: elevenlabs", - "default": "elevenlabs", - }), - "voiceId": ("STRING", { - "tooltip": "ElevenLabs voice ID for text-to-speech generation", - "default": "", - }), - "text": ("STRING", { - "multiline": True, - "tooltip": "The text script to be spoken", - "default": "", - }), - }, - "optional": { - "useId": ("BOOLEAN", { - "tooltip": "Enable to include reference ID for mapping speech input. Required when using segments array.", - "default": False, - }), - "id": ("STRING", { - "tooltip": "Reference ID used to map speech input. Required when using segments array.", - "default": "", - }), - } - } - - RETURN_TYPES = ("RUNWARESPEECHINPUT",) - RETURN_NAMES = ("Speech Input",) - FUNCTION = "createSpeechInput" - CATEGORY = "Runware" - DESCRIPTION = "Create a speech input configuration with TTS provider settings for video generation." - - def createSpeechInput(self, **kwargs) -> tuple[Dict[str, Any]]: - """Create speech input configuration""" - - useId = kwargs.get("useId", False) - speech_id = kwargs.get("id", "").strip() - provider = kwargs.get("provider", "elevenlabs").strip() - voiceId = kwargs.get("voiceId", "").strip() - text = kwargs.get("text", "").strip() - - if not provider or not voiceId or not text: - return ({},) - - speechInput: Dict[str, Any] = { - "provider": provider, - "voiceId": voiceId, - "text": text, - } - - # Only include id if useId is enabled and id is provided - if useId and speech_id: - speechInput["id"] = speech_id - - return (speechInput,) - - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareSpeechInput": RunwareSpeechInput, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareSpeechInput": "Runware Video Speech Input", -} - diff --git a/modules/speechInputCombine.py b/modules/speechInputCombine.py deleted file mode 100644 index 14094c1..0000000 --- a/modules/speechInputCombine.py +++ /dev/null @@ -1,59 +0,0 @@ -""" -Runware Speech Input Combine Node -Combines multiple speech inputs into a list -""" - - - -class RunwareSpeechInputCombine: - """Runware Speech Input Combine Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Speech Input 1": ("RUNWARESPEECHINPUT", { - "tooltip": "Connect a Runware Speech Input node.", - }), - }, - "optional": { - "Speech Input 2": ("RUNWARESPEECHINPUT", { - "tooltip": "Connect a Runware Speech Input node.", - }), - "Speech Input 3": ("RUNWARESPEECHINPUT", { - "tooltip": "Connect a Runware Speech Input node.", - }), - "Speech Input 4": ("RUNWARESPEECHINPUT", { - "tooltip": "Connect a Runware Speech Input node.", - }), - }, - } - - DESCRIPTION = "Combine multiple speech inputs to connect with Runware Video Inference Inputs." - FUNCTION = "speechInputCombine" - RETURN_TYPES = ("RUNWARESPEECHINPUT",) - RETURN_NAMES = ("Speech Inputs",) - CATEGORY = "Runware" - - def speechInputCombine(self, **kwargs): - """Combine speech inputs into a list""" - speechInputs = [] - - for i in range(1, 5): - speechKey = f"Speech Input {i}" - speechInput = kwargs.get(speechKey) - if speechInput is not None and isinstance(speechInput, dict) and len(speechInput) > 0: - speechInputs.append(speechInput) - - return (speechInputs,) - - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareSpeechInputCombine": RunwareSpeechInputCombine, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareSpeechInputCombine": "Runware Speech Inputs Combine", -} - diff --git a/modules/textInference.py b/modules/textInference.py deleted file mode 100644 index 3ab898a..0000000 --- a/modules/textInference.py +++ /dev/null @@ -1,117 +0,0 @@ -import uuid -from typing import Any, Dict, List, Optional - -from .utils import runwareUtils as rwUtils - - -class RunwareTextInference: - """Runware textInference API: chat completion via selected text model and messages.""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "model": ("RUNWARETEXTMODEL", { - "tooltip": "Connect Runware Text Model Search output.", - }), - "messages": ("RUNWARETEXTINFERENCEMESSAGES", { - "tooltip": "Connect Runware Text Inference Messages output.", - }), - }, - "optional": { - "settings": ("RUNWARETEXTINFERENCESETTINGS", { - "tooltip": "Connect Runware Text Inference Settings (setting + thinking).", - }), - "providerSettings": ("RUNWAREPROVIDERSETTINGS", { - "tooltip": "Optional provider-specific settings (wrapped by provider prefix from the model AIR).", - }), - "toolChoice": ("RUNWARETEXTINFERENCETOOLCHOICE", { - "tooltip": "Connect Runware Text Inference Tool Choice for tool-calling strategy (auto / any / tool / none).", - }), - "inputs": ("RUNWARETEXTINFERENCEINPUTS", { - "tooltip": "Connect Runware Text Inference Inputs for inputs.images / inputs.videos (URLs or mediaUUIDs).", - }), - }, - } - - RETURN_TYPES = ("STRING",) - RETURN_NAMES = ("text",) - FUNCTION = "infer_text" - CATEGORY = "Runware/Text" - DESCRIPTION = "Run text/chat inference using Runware textInference. Connect Text Model and Text Inference Messages. Optional: Settings, provider settings, tool choice, inputs (images/videos)." - - @staticmethod - def _extract_text_from_data_item(item: Dict[str, Any]) -> Optional[str]: - if not isinstance(item, dict): - return None - if "text" in item and item["text"] is not None: - return str(item["text"]) - if "content" in item and isinstance(item["content"], str): - return item["content"] - choices = item.get("choices") - if isinstance(choices, list) and len(choices) > 0: - ch0 = choices[0] - if isinstance(ch0, dict): - msg = ch0.get("message") - if isinstance(msg, dict) and "content" in msg: - return str(msg["content"]) - if "text" in ch0: - return str(ch0["text"]) - return None - - def _finalize_text(self, gen_result: Dict[str, Any]) -> str: - if "data" not in gen_result or not gen_result["data"]: - raise Exception("No data in text inference response.") - item = gen_result["data"][0] - text = self._extract_text_from_data_item(item) - if text is None: - raise Exception( - "Could not read assistant text from response. " - f"Keys on data[0]: {list(item.keys()) if isinstance(item, dict) else type(item)}" - ) - return text - - def infer_text(self, **kwargs): - model = (kwargs.get("model") or "").strip() - messages: List[Dict[str, str]] = kwargs.get("messages") or [] - text_settings = kwargs.get("settings") - provider_settings = kwargs.get("providerSettings") - tool_choice = kwargs.get("toolChoice") - text_inputs = kwargs.get("inputs") - - if not model: - raise Exception("model is empty.") - if not messages: - raise Exception("messages are empty.") - - task_uuid = str(uuid.uuid4()) - task: Dict[str, Any] = { - "taskType": "textInference", - "taskUUID": task_uuid, - "model": model, - "deliveryMethod": "sync", - "messages": messages, - "includeCost": True, - "includeUsage": True, - } - - if text_settings is not None and isinstance(text_settings, dict) and len(text_settings) > 0: - task["settings"] = text_settings - - if provider_settings is not None and isinstance(provider_settings, dict) and len(provider_settings) > 0: - provider_name = model.split(":")[0] if ":" in model else model - task["providerSettings"] = {provider_name: provider_settings} - - if tool_choice is not None and isinstance(tool_choice, dict) and len(tool_choice) > 0: - task["toolChoice"] = tool_choice - - if text_inputs is not None and isinstance(text_inputs, dict) and len(text_inputs) > 0: - task["inputs"] = dict(text_inputs) - - gen_config = [task] - print(f"[Runware Text Inference] Request: {rwUtils.safe_json_dumps(gen_config, indent=2)}") - - gen_result = rwUtils.inferenecRequest(gen_config) - print(f"[Runware Text Inference] Response: {rwUtils.safe_json_dumps(gen_result, indent=2)}") - - return (self._finalize_text(gen_result),) diff --git a/modules/textInferenceInputs.py b/modules/textInferenceInputs.py deleted file mode 100644 index 923e4c7..0000000 --- a/modules/textInferenceInputs.py +++ /dev/null @@ -1,52 +0,0 @@ -"""Runware Text Inference Inputs — merge Images + Videos blocks into task.inputs for textInference.""" - -from typing import Any, Dict, Tuple - - -class RunwareTextInferenceInputs: - """Merge Runware Text Inference Inputs Images and/or Videos into a single inputs dict.""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "images": ("RUNWARETEXTINFERENCEINPUTSIMAGES", { - "tooltip": "Connect Runware Text Inference Inputs Images for inputs.images[].", - }), - "videos": ("RUNWARETEXTINFERENCEINPUTSVIDEOS", { - "tooltip": "Connect Runware Text Inference Inputs Videos for inputs.videos[].", - }), - }, - } - - RETURN_TYPES = ("RUNWARETEXTINFERENCEINPUTS",) - RETURN_NAMES = ("inputs",) - FUNCTION = "merge_inputs" - CATEGORY = "Runware/Text" - DESCRIPTION = ( - "Combine Runware Text Inference Inputs Images and/or Videos into inputs for Runware Text Inference " - "(inputs.images, inputs.videos)." - ) - - def merge_inputs(self, **kwargs) -> Tuple[Dict[str, Any], ...]: - images_block = kwargs.get("images") - videos_block = kwargs.get("videos") - - out: Dict[str, Any] = {} - - if isinstance(images_block, dict) and images_block.get("images"): - imgs = images_block["images"] - if isinstance(imgs, list) and len(imgs) > 0: - filtered_imgs = [str(x).strip() for x in imgs if x is not None and str(x).strip()] - if filtered_imgs: - out["images"] = filtered_imgs - - if isinstance(videos_block, dict) and videos_block.get("videos"): - vids = videos_block["videos"] - if isinstance(vids, list) and len(vids) > 0: - filtered_vids = [str(x).strip() for x in vids if x is not None and str(x).strip()] - if filtered_vids: - out["videos"] = filtered_vids - - return (out,) diff --git a/modules/textInferenceInputsImages.py b/modules/textInferenceInputsImages.py deleted file mode 100644 index 6d44a83..0000000 --- a/modules/textInferenceInputsImages.py +++ /dev/null @@ -1,50 +0,0 @@ -"""Runware Text Inference Inputs Images — builds inputs.images from ComfyUI IMAGE tensors.""" - -from typing import Any, Dict, List, Tuple - -from .utils import runwareUtils as rwUtils - - -class RunwareTextInferenceInputsImages: - """Collect IMAGE tensors and convert them for textInference task.inputs.images. - - Each connected IMAGE is converted via runwareUtils.convertTensor2IMG, which returns - either a cached mediaUUID (when caching is enabled) or a base64 data URI. - """ - - _MAX_IMAGES = 8 - - @classmethod - def INPUT_TYPES(cls): - optional: Dict[str, tuple] = {} - for i in range(1, cls._MAX_IMAGES + 1): - ordinal = rwUtils.getOrdinal(i) - optional[f"Image {i}"] = ("IMAGE", { - "tooltip": ( - f"{ordinal.capitalize()} image for the model. Connect a Load Image (or any IMAGE source) node. " - "Tensor is converted to base64 / mediaUUID before being sent to the API." - ), - }) - return {"required": {}, "optional": optional} - - RETURN_TYPES = ("RUNWARETEXTINFERENCEINPUTSIMAGES",) - RETURN_NAMES = ("images",) - FUNCTION = "createImages" - CATEGORY = "Runware/Text" - DESCRIPTION = ( - "Collect one or more IMAGE tensors (Load Image, generated images, etc.) for Runware Text Inference " - "inputs.images. Connect the output to Runware Text Inference Inputs." - ) - - def createImages(self, **kwargs) -> Tuple[Dict[str, Any], ...]: - urls: List[str] = [] - for i in range(1, self._MAX_IMAGES + 1): - tensor = kwargs.get(f"Image {i}", None) - if tensor is None: - continue - urls.append(rwUtils.convertTensor2IMG(tensor)) - - if not urls: - return ({},) - - return ({"images": urls},) diff --git a/modules/textInferenceInputsVideos.py b/modules/textInferenceInputsVideos.py deleted file mode 100644 index 13680dd..0000000 --- a/modules/textInferenceInputsVideos.py +++ /dev/null @@ -1,51 +0,0 @@ -"""Runware Text Inference Inputs Videos — builds inputs.videos (URL or mediaUUID per item).""" - -from typing import Any, Dict, List, Tuple - -from .utils import runwareUtils as rwUtils - - -class RunwareTextInferenceInputsVideos: - """Collect video references for textInference task.inputs.videos.""" - - _MAX_VIDEOS = 4 - - @classmethod - def INPUT_TYPES(cls): - optional: Dict[str, tuple] = { - "useVideos": ("BOOLEAN", { - "default": False, - "tooltip": "Enable to include inputs.videos in the text inference request.", - }), - } - for i in range(1, cls._MAX_VIDEOS + 1): - ordinal = rwUtils.getOrdinal(i) - optional[f"Video{i}"] = ("STRING", { - "default": "", - "tooltip": f"Video URL or mediaUUID for the {ordinal} video. Only used when 'Use Videos' is enabled.", - }) - return {"required": {}, "optional": optional} - - RETURN_TYPES = ("RUNWARETEXTINFERENCEINPUTSVIDEOS",) - RETURN_NAMES = ("videos",) - FUNCTION = "createVideos" - CATEGORY = "Runware/Text" - DESCRIPTION = ( - "Collect one or more video references (URL or mediaUUID) for Runware Text Inference " - "inputs.videos. Connect the output to Runware Text Inference Inputs." - ) - - def createVideos(self, **kwargs) -> Tuple[Dict[str, Any], ...]: - if not kwargs.get("useVideos", False): - return ({},) - - urls: List[str] = [] - for i in range(1, self._MAX_VIDEOS + 1): - raw = kwargs.get(f"Video{i}", "") - if raw is not None and str(raw).strip(): - urls.append(str(raw).strip()) - - if not urls: - return ({},) - - return ({"videos": urls},) diff --git a/modules/textInferenceMessage.py b/modules/textInferenceMessage.py deleted file mode 100644 index 3c6770a..0000000 --- a/modules/textInferenceMessage.py +++ /dev/null @@ -1,33 +0,0 @@ -class RunwareTextInferenceMessage: - """One chat message (role + content) for Runware Text Inference Messages combiner.""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "role": (["user", "assistant"], { - "default": "user", - "tooltip": "Speaker role for this message.", - }), - "content": ("STRING", { - "multiline": True, - "default": "What's Photosynthesis?", - "tooltip": "Message text sent to the model.", - }), - } - } - - RETURN_TYPES = ("RUNWARETEXTINFERENCEMESSAGE",) - RETURN_NAMES = ("message",) - FUNCTION = "create_message" - CATEGORY = "Runware/Text" - DESCRIPTION = ( - "One chat message (role + content). Connect to Runware Text Inference Messages." - ) - - def create_message(self, role: str, content: str): - r = (role or "user").strip().lower() - if r not in ("user", "assistant"): - r = "user" - body = (content or "").strip() - return ({"role": r, "content": body},) diff --git a/modules/textInferenceMessages.py b/modules/textInferenceMessages.py deleted file mode 100644 index 2cbba57..0000000 --- a/modules/textInferenceMessages.py +++ /dev/null @@ -1,58 +0,0 @@ -from typing import Dict, List - - -class RunwareTextInferenceMessages: - """Merge Runware Text Inference Message segments into the API `messages` array (order = segment 1 … N).""" - - _SEGMENT_COUNT = 8 - - @classmethod - def INPUT_TYPES(cls): - optional = {} - for i in range(2, cls._SEGMENT_COUNT + 1): - optional[f"Message Segment {i}"] = ( - "RUNWARETEXTINFERENCEMESSAGE", - {"tooltip": f"Optional message {i}. Connect Runware Text Inference Message."}, - ) - return { - "required": { - "Message Segment 1": ("RUNWARETEXTINFERENCEMESSAGE", { - "tooltip": "First message. Connect Runware Text Inference Message.", - }), - }, - "optional": optional, - } - - RETURN_TYPES = ("RUNWARETEXTINFERENCEMESSAGES",) - RETURN_NAMES = ("messages",) - FUNCTION = "merge_messages" - CATEGORY = "Runware/Text" - DESCRIPTION = ( - "Combine one or more Runware Text Inference Message nodes into a messages list for Runware Text Inference " - "(same idea as Kling MultiPrompt Segment → Kling Provider Settings MultiPrompt)." - ) - - def merge_messages(self, **kwargs) -> tuple: - messages: List[Dict[str, str]] = [] - - for i in range(1, self._SEGMENT_COUNT + 1): - key = f"Message Segment {i}" - seg = kwargs.get(key) - if seg is None: - continue - if not isinstance(seg, dict): - continue - content = (seg.get("content") or "").strip() - if not content: - continue - role = seg.get("role", "user") - if role not in ("user", "assistant"): - role = "user" - messages.append({"role": role, "content": content}) - - if not messages: - raise Exception( - "No messages: connect Runware Text Inference Message to Message Segment 1 with non-empty content." - ) - - return (messages,) diff --git a/modules/textInferenceSettings.py b/modules/textInferenceSettings.py deleted file mode 100644 index 0aa93f6..0000000 --- a/modules/textInferenceSettings.py +++ /dev/null @@ -1,245 +0,0 @@ -import json -from typing import Any, Dict, List, Tuple - - -class RunwareTextInferenceSettings: - """Optional generation controls for Runware Text Inference (flat task.settings per API).""" - - _MAX_SYSTEM_CHARS = 200000 - _MAX_TOKENS_CAP = 131072 - _MAX_TOP_K = 100647 - _MAX_STOP_ITEMS = 5 - _MAX_STOP_ITEM_CHARS = 50 - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useSystemPrompt": ("BOOLEAN", { - "default": False, - "tooltip": "Include systemPrompt in settings.", - }), - "systemPrompt": ("STRING", { - "multiline": True, - "default": "", - "tooltip": "System instruction (max 200,000 chars).", - }), - "useMaxTokens": ("BOOLEAN", { - "default": False, - "tooltip": "Include maxTokens in settings.", - }), - "maxTokens": ("INT", { - "default": 4096, - "min": 1, - "max": cls._MAX_TOKENS_CAP, - "step": 1, - "tooltip": f"maxTokens (1–{cls._MAX_TOKENS_CAP}).", - }), - "useTemperature": ("BOOLEAN", { - "default": False, - "tooltip": "Include temperature in settings.", - }), - "temperature": ("FLOAT", { - "default": 1.0, - "min": 0.0, - "max": 1.0, - "step": 0.01, - "tooltip": "Sampling temperature (0.0–1.0).", - }), - "useTopP": ("BOOLEAN", { - "default": False, - "tooltip": "Include topP in settings.", - }), - "topP": ("FLOAT", { - "default": 1.0, - "min": 0.01, - "max": 1.0, - "step": 0.01, - "tooltip": "Nucleus sampling (0.01–1.0).", - }), - "useTopK": ("BOOLEAN", { - "default": False, - "tooltip": "Include topK in settings.", - }), - "topK": ("INT", { - "default": 40, - "min": 1, - "max": cls._MAX_TOP_K, - "step": 1, - "tooltip": f"Top-k sampling (1–{cls._MAX_TOP_K}).", - }), - # Keep this in the original slot to avoid shifting legacy widgets_values. - "thinkingLevel": (["none", "low", "medium", "high", "max", "adaptive"], { - "default": "none", - "tooltip": ( - "Extended reasoning level: none, low, medium, high, max, adaptive. " - "none -> disabled. low/medium/high/max -> adaptive thinking with the chosen effort. " - "adaptive -> model picks budget. Legacy 'off' is mapped to 'none'." - ), - }), - "useStopSequences": ("BOOLEAN", { - "default": False, - "tooltip": "Include stopSequences in settings.", - }), - "stopSequences": ("STRING", { - "multiline": True, - "default": "", - "tooltip": "Stop sequences: one per line (max 5 items, 50 chars each).", - }), - "usePresencePenalty": ("BOOLEAN", { - "default": False, - "tooltip": "Include presencePenalty in settings.", - }), - "presencePenalty": ("FLOAT", { - "default": 0.0, - "min": -2.0, - "max": 2.0, - "step": 0.01, - "tooltip": "Presence penalty (-2.0 to 2.0).", - }), - "useFrequencyPenalty": ("BOOLEAN", { - "default": False, - "tooltip": "Include frequencyPenalty in settings.", - }), - "frequencyPenalty": ("FLOAT", { - "default": 0.0, - "min": -2.0, - "max": 2.0, - "step": 0.01, - "tooltip": "Frequency penalty (-2.0 to 2.0).", - }), - "useTools": ("BOOLEAN", { - "default": False, - "tooltip": "Include tools in settings.", - }), - "tools": ("STRING", { - "multiline": True, - "default": "[]", - "tooltip": "JSON array for tools.", - }), - "cache": ("RUNWARETEXTINFERENCESETTINGSCACHE", { - "tooltip": "Connect Runware Text Inference Settings Cache for settings.cache.{scope, ttl}.", - }), - }, - } - - RETURN_TYPES = ("RUNWARETEXTINFERENCESETTINGS",) - RETURN_NAMES = ("settings",) - FUNCTION = "create_settings" - CATEGORY = "Runware/Text" - DESCRIPTION = ( - "Optional text inference settings (systemPrompt, maxTokens, temperature, topP, topK, " - "stopSequences, presencePenalty, frequencyPenalty, tools, thinkingLevel, cache). " - "Connect to Runware Text Inference. For tool calling, use Runware Text Inference Tool Choice on the inference node." - ) - - @staticmethod - def _parse_json_setting(raw: Any, expected_type: type, field_name: str) -> Any: - if isinstance(raw, expected_type): - return raw - if raw is None: - return expected_type() - - text = str(raw).strip() - if not text: - return expected_type() - - try: - parsed = json.loads(text) - except Exception as exc: - raise Exception(f"{field_name} must be valid JSON.") from exc - - if not isinstance(parsed, expected_type): - expected = "array" if expected_type is list else "object" - raise Exception(f"{field_name} must be a JSON {expected}.") - return parsed - - def _parse_stop_sequences(self, raw: Any) -> List[str]: - if raw is None: - return [] - - items: List[str] = [] - if isinstance(raw, (list, tuple)): - for item in raw: - text = str(item).strip() - if text: - items.append(text) - else: - text = str(raw).strip() - if text: - normalized = text.replace("\r\n", "\n").replace(",", "\n") - items = [segment.strip() for segment in normalized.split("\n") if segment.strip()] - - if len(items) > self._MAX_STOP_ITEMS: - raise Exception(f"stopSequences supports up to {self._MAX_STOP_ITEMS} items.") - for idx, item in enumerate(items, start=1): - if len(item) > self._MAX_STOP_ITEM_CHARS: - raise Exception( - f"stopSequences item {idx} exceeds {self._MAX_STOP_ITEM_CHARS} characters." - ) - return items - - @staticmethod - def _normalize_thinking_level(raw: Any) -> str: - value = str(raw or "none").strip().lower() - # Backward compatibility with older workflows. - aliases = { - "off": "none", - "minimal": "low", - } - value = aliases.get(value, value) - if value not in ("none", "low", "medium", "high", "max", "adaptive"): - return "none" - return value - - def create_settings(self, **kwargs) -> Tuple[Dict[str, Any], ...]: - out: Dict[str, Any] = {} - - if kwargs.get("useSystemPrompt", False): - sys_text = (kwargs.get("systemPrompt") or kwargs.get("system") or "").strip() - if sys_text: - if len(sys_text) > self._MAX_SYSTEM_CHARS: - sys_text = sys_text[: self._MAX_SYSTEM_CHARS] - out["systemPrompt"] = sys_text - - if kwargs.get("useMaxTokens", False): - out["maxTokens"] = int(kwargs.get("maxTokens", 4096)) - - if kwargs.get("useTemperature", False): - out["temperature"] = float(kwargs.get("temperature", 1.0)) - - if kwargs.get("useTopP", False): - out["topP"] = float(kwargs.get("topP", 1.0)) - - if kwargs.get("useTopK", False): - out["topK"] = int(kwargs.get("topK", 40)) - - if kwargs.get("useStopSequences", False): - parsed_stop = self._parse_stop_sequences(kwargs.get("stopSequences", "")) - if parsed_stop: - out["stopSequences"] = parsed_stop - - if kwargs.get("usePresencePenalty", False): - out["presencePenalty"] = float(kwargs.get("presencePenalty", 0.0)) - - if kwargs.get("useFrequencyPenalty", False): - out["frequencyPenalty"] = float(kwargs.get("frequencyPenalty", 0.0)) - - if kwargs.get("useTools", False): - parsed_tools = self._parse_json_setting(kwargs.get("tools"), list, "tools") - if parsed_tools: - out["tools"] = parsed_tools - - tl = self._normalize_thinking_level(kwargs.get("thinkingLevel", "none")) - if tl != "none": - out["thinkingLevel"] = tl - - cache_cfg = kwargs.get("cache") - if cache_cfg is not None and isinstance(cache_cfg, dict) and len(cache_cfg) > 0: - out["cache"] = cache_cfg - - if not out: - return ({},) - - return (out,) diff --git a/modules/textInferenceSettingsCache.py b/modules/textInferenceSettingsCache.py deleted file mode 100644 index f5b91b1..0000000 --- a/modules/textInferenceSettingsCache.py +++ /dev/null @@ -1,64 +0,0 @@ -""" -Runware Text Inference Settings Cache Node -Builds the cache object for Runware Text Inference (settings.cache.{scope, ttl}). - -Maps cache_control placement (Anthropic): - - scope: where cache_control is attached - * system -> system block only - * system+history -> system block + last user message block (default) - - ttl: cache lifetime (5m or 1h) -""" - -from typing import Dict, Any - - -class RunwareTextInferenceSettingsCache: - """Runware Text Inference Settings Cache node.""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "scope": (["system", "system+history"], { - "default": "system+history", - "tooltip": ( - "Where cache_control is attached.\n" - "- system: cache the system block only.\n" - "- system+history: cache the system block and the last user message block." - ), - }), - "ttl": (["5m", "1h"], { - "default": "5m", - "tooltip": "Cache lifetime: 5m (5 minutes) or 1h (1 hour).", - }), - } - } - - RETURN_TYPES = ("RUNWARETEXTINFERENCESETTINGSCACHE",) - RETURN_NAMES = ("cache",) - FUNCTION = "createCache" - CATEGORY = "Runware/Text" - DESCRIPTION = ( - "Build a settings.cache object (scope + ttl) and connect it to Runware Text Inference. " - "Merged into the request as settings.cache.{scope, ttl}." - ) - - def createCache(self, **kwargs) -> tuple[Dict[str, Any]]: - scope = (kwargs.get("scope") or "system+history").strip().lower() - if scope not in ("system", "system+history"): - scope = "system+history" - - ttl = (kwargs.get("ttl") or "5m").strip().lower() - if ttl not in ("5m", "1h"): - ttl = "5m" - - return ({"scope": scope, "ttl": ttl},) - - -NODE_CLASS_MAPPINGS = { - "RunwareTextInferenceSettingsCache": RunwareTextInferenceSettingsCache, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareTextInferenceSettingsCache": "Runware Text Inference Settings Cache", -} diff --git a/modules/textInferenceToolChoice.py b/modules/textInferenceToolChoice.py deleted file mode 100644 index 3e33656..0000000 --- a/modules/textInferenceToolChoice.py +++ /dev/null @@ -1,73 +0,0 @@ -""" -Runware Text Inference Tool Choice Node -Builds the toolChoice object for Runware Text Inference (textInference). - -Strategies (type): - - auto: model decides whether to call a tool (recommended default) - - any: model must call at least one tool but chooses which one - - tool: model must call the specific tool identified by `name` - - none: model will not call any tool -""" - -from typing import Dict, Any - - -class RunwareTextInferenceToolChoice: - """Runware Text Inference Tool Choice node.""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "type": (["auto", "any", "tool", "none"], { - "default": "auto", - "tooltip": ( - "Strategy the model uses to decide when and which tools to call.\n" - "- auto: model decides (recommended default).\n" - "- any: model must call at least one tool, of its choosing.\n" - "- tool: model must call the specific tool named below.\n" - "- none: model will not call any tool." - ), - }), - "name": ("STRING", { - "default": "", - "tooltip": "Name of the specific tool the model must call. Required when type is 'tool'; ignored otherwise.", - }), - } - } - - RETURN_TYPES = ("RUNWARETEXTINFERENCETOOLCHOICE",) - RETURN_NAMES = ("toolChoice",) - FUNCTION = "createToolChoice" - CATEGORY = "Runware/Text" - DESCRIPTION = ( - "Build a toolChoice object (type + optional tool name) and connect it to " - "Runware Text Inference. Required when type is 'tool'." - ) - - def createToolChoice(self, **kwargs) -> tuple[Dict[str, Any]]: - choice_type = (kwargs.get("type") or "auto").strip().lower() - if choice_type not in ("auto", "any", "tool", "none"): - choice_type = "auto" - - name = (kwargs.get("name") or "").strip() - - result: Dict[str, Any] = {"type": choice_type} - if choice_type == "tool": - if not name: - raise Exception( - "Tool Choice: 'name' is required when type is 'tool'. " - "Provide the exact tool name the model must call." - ) - result["name"] = name - - return (result,) - - -NODE_CLASS_MAPPINGS = { - "RunwareTextInferenceToolChoice": RunwareTextInferenceToolChoice, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareTextInferenceToolChoice": "Runware Text Inference Tool Choice", -} diff --git a/modules/textModelSearch.py b/modules/textModelSearch.py deleted file mode 100644 index 53b38cb..0000000 --- a/modules/textModelSearch.py +++ /dev/null @@ -1,98 +0,0 @@ -class RunwareTextModelSearch: - """Text model search node: pick or type a text/chat AIR model for Runware Text Inference.""" - - TEXT_MODELS = { - "MiniMax": [ - "minimax:m2.7@0 (MiniMax-M2.7)", - "minimax:m2.7@highspeed (MiniMax-M2.7 Highspeed)", - "minimax:m2.5@0 (MiniMax-M2.5)", - ], - "OpenAI": [ - "openai:gpt@5.4 (GPT-5.4)", - "openai:gpt@5.4-pro (GPT-5.4 Pro)", - "openai:gpt@5.4-mini (GPT-5.4 Mini)", - "openai:gpt@5.4-nano (GPT-5.4 Nano)", - ], - "Anthropic": [ - "anthropic:claude@opus-4.7 (Claude Opus 4.7)", - "anthropic:claude@sonnet-4.6 (Claude Sonnet 4.6)", - "anthropic:claude@haiku-4.5 (Claude Haiku 4.5)", - ], - "Google": [ - "google:gemini@3-flash (Gemini 3 Flash)", - ], - "MoonshotAI": [ - "moonshotai:kimi@k2.6 (Kimi K2.6)", - ], - "Zai": [ - "zai-glm-5-1 (ZAI GLM 5.1)", - ], - } - - MODEL_PROVIDERS = [ - "All", - "Anthropic", - "Google", - "MiniMax", - "MoonshotAI", - "OpenAI", - "Zai", - ] - - @classmethod - def INPUT_TYPES(cls): - all_models = cls._get_all_models() - default_model = "minimax:m2.7@0 (MiniMax-M2.7)" - - return { - "required": { - "Model Search": ("STRING", { - "tooltip": "Search or type a text model AIR code (e.g. minimax:m2.7@0). Used when 'Use Search Value' is enabled.", - }), - "Model Provider": (cls.MODEL_PROVIDERS, { - "tooltip": "Filter the model list by provider.", - "default": "MiniMax", - }), - "TextList": (all_models, { - "tooltip": "Choose a model from the filtered list (AIR code is taken from text before ' (').", - "default": default_model, - }), - "Use Search Value": ("BOOLEAN", { - "tooltip": "When enabled, 'Model Search' is used as the model AIR instead of the selection in TextList.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - } - } - - @classmethod - def _get_all_models(cls): - all_models = [] - for models in cls.TEXT_MODELS.values(): - all_models.extend(models) - return all_models - - RETURN_TYPES = ("RUNWARETEXTMODEL",) - RETURN_NAMES = ("model",) - FUNCTION = "searchModels" - CATEGORY = "Runware" - DESCRIPTION = "Search and select text/chat models for Runware Text Inference." - - @classmethod - def VALIDATE_INPUTS(cls, TextList): - return True - - def searchModels(self, **kwargs): - use_search = kwargs.get("Use Search Value", False) - search_input = (kwargs.get("Model Search") or "").strip() - - if use_search: - if not search_input: - raise Exception("Use Search Value is enabled but Model Search is empty.") - model_air = search_input - else: - current = kwargs.get("TextList") - model_air = current.split(" (")[0] if current else "" - - return (model_air,) diff --git a/modules/threeDInference.py b/modules/threeDInference.py deleted file mode 100644 index 4f064e4..0000000 --- a/modules/threeDInference.py +++ /dev/null @@ -1,208 +0,0 @@ -from .utils import runwareUtils as rwUtils -import comfy.model_management - - -class threeDInference: - """Runware 3D Inference node for generating 3D models from images""" - - # Output formats - OUTPUT_FORMATS = ["GLB", "FBX", "PLY", "OBJ"] - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Model": ("RUNWARE3DMODEL", { - "tooltip": "Connect a Runware 3D Model from Runware 3D Model Search node.", - }), - "positivePrompt": ("STRING", { - "multiline": True, - "placeholder": "Describe the 3D object you want to generate...", - "tooltip": "A text prompt describing the 3D object to generate." - }), - "negativePrompt": ("STRING", { - "multiline": True, - "placeholder": "Describe what to avoid in the 3D output...", - "tooltip": "A negative text prompt describing attributes to avoid in the generated 3D object." - }), - "useSeed": ("BOOLEAN", { - "tooltip": "Include seed in the API request. Turn off if the model should not receive a seed.", - "default": True, - }), - "seed": ("INT", { - "tooltip": "Seed for reproducibility. Only sent when 'Use Seed' is on.", - "default": 1, - "min": 1, - "max": 2147483647, - }), - "outputFormat": (cls.OUTPUT_FORMATS, { - "tooltip": "Output format for the 3D model file.", - "default": "GLB", - }), - }, - "optional": { - "useOutputQuality": ("BOOLEAN", { - "tooltip": "Enable to include outputQuality in API request.", - "default": False, - }), - "outputQuality": ("INT", { - "tooltip": "Output quality (0-100). Only used when 'Use Output Quality' is enabled.", - "default": 95, - "min": 0, - "max": 100, - "step": 1, - }), - "inputs": ("RUNWARE3DINFERENCEINPUTS", { - "tooltip": "Connect Runware 3D Inference Inputs for image, mask, meshFile, images (array from Images 1…8), etc.", - }), - "settings": ("RUNWARE3DINFERENCESETTINGS", { - "tooltip": "Connect Runware 3D Inference Settings for textureSize, decimationTarget, remesh, resolution, imageAutoFix, faceLimit, texture, pbr, quad, Tripo options, sparseStructure, shapeSlat, texSlat, etc.", - }), - }, - } - - DESCRIPTION = "Generate 3D models from images using Runware's 3D Inference API. Connect the output to 'Runware Save 3D' node to save the file." - FUNCTION = "generate3D" - RETURN_TYPES = ("STRING",) - RETURN_NAMES = ("3dObject",) - CATEGORY = "Runware" - - def generate3D(self, **kwargs): - """Generate 3D model from inputs""" - model = kwargs.get("Model", "meta:sam@3d") - positivePrompt = kwargs.get("positivePrompt", "") - negativePrompt = kwargs.get("negativePrompt", "") - seed = kwargs.get("seed", 1) - use_seed = kwargs.get("useSeed", True) - outputFormat = kwargs.get("outputFormat", "GLB") - use_output_quality = kwargs.get("useOutputQuality", False) - output_quality = kwargs.get("outputQuality", 95) - inputs = kwargs.get("inputs", None) - settings = kwargs.get("settings", None) - - # Build generation config - genConfig = [ - { - "taskType": "3dInference", - "taskUUID": rwUtils.genRandUUID(), - "model": model, - "numberResults": 1, - "outputType": "URL", - "includeCost": True, - "deliveryMethod": "async", - "outputFormat": outputFormat, - } - ] - - # Add positivePrompt if provided - if positivePrompt and positivePrompt.strip() != "": - genConfig[0]["positivePrompt"] = positivePrompt.strip() - - # Add negativePrompt if provided - if negativePrompt and negativePrompt.strip() != "": - genConfig[0]["negativePrompt"] = negativePrompt.strip() - - if use_seed: - genConfig[0]["seed"] = seed - - if use_output_quality: - genConfig[0]["outputQuality"] = int(output_quality) - - # Handle inputs from 3D Inference Inputs node - if inputs is not None and isinstance(inputs, dict) and len(inputs) > 0: - genConfig[0]["inputs"] = inputs - - # Handle settings from 3D Inference Settings node - if settings is not None and isinstance(settings, dict) and len(settings) > 0: - genConfig[0]["settings"] = settings - - try: - print(f"[DEBUG] Sending 3D Inference Request:") - print(f"[DEBUG] Request Payload: {rwUtils.safe_json_dumps(genConfig, indent=2)}") - - # Send initial request - genResult = rwUtils.inferenecRequest(genConfig) - - print(f"[DEBUG] Received 3D Inference Response:") - print(f"[DEBUG] Response: {rwUtils.safe_json_dumps(genResult, indent=2)}") - - except Exception as e: - raise - - # Extract task UUID for polling - taskUUID = genConfig[0]["taskUUID"] - - # Poll for 3D generation completion - while True: - # Check for interrupt before each poll - comfy.model_management.throw_exception_if_processing_interrupted() - - # Poll for result - pollResult = rwUtils.pollVideoResult(taskUUID) # Reuse existing poll function - print(f"[Debugging] Poll result: {rwUtils.safe_json_dumps(pollResult, indent=2) if isinstance(pollResult, (dict, list)) else pollResult}") - - # Check for errors - if pollResult and "errors" in pollResult and len(pollResult["errors"]) > 0: - error_info = pollResult["errors"][0] - error_message = error_info.get("message", "Unknown error") - - if "responseContent" in error_info: - response_content = error_info["responseContent"] - if isinstance(response_content, str): - detailed_message = response_content - elif isinstance(response_content, dict): - detailed_message = response_content.get("message", str(response_content)) - else: - detailed_message = str(response_content) - - if detailed_message: - error_message = f"{error_message}\nProvider Error: {detailed_message}" - - task_uuid = error_info.get("taskUUID", "unknown") - raise Exception(f"3D generation failed (Task: {task_uuid}): {error_message}") - - # Check for successful completion - if pollResult and "data" in pollResult and len(pollResult["data"]) > 0: - data = pollResult["data"][0] - - # Check if outputs.files exists (3D inference response format) - outputs = data.get("outputs", {}) - files = outputs.get("files", []) - - if len(files) > 0: - file_info = files[0] - file_url = file_info.get("url", "") - - if file_url: - print(f"[3D Inference] Generated 3D file URL: {file_url}") - return (file_url,) - - # Check status if available - if "status" in data: - status = data["status"] - if status == "success": - # Try alternative response format - if "outputs" in data and "files" in data["outputs"]: - files = data["outputs"]["files"] - if len(files) > 0: - file_url = files[0].get("url", "") - if file_url: - print(f"[3D Inference] Generated 3D file URL: {file_url}") - return (file_url,) - - # Check for interrupt before waiting - comfy.model_management.throw_exception_if_processing_interrupted() - - # Wait before next poll - for _ in range(10): # 10 x 0.1 second = 1 second total - comfy.model_management.throw_exception_if_processing_interrupted() - rwUtils.time.sleep(0.1) - - -NODE_CLASS_MAPPINGS = { - "Runware3DInference": threeDInference, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "Runware3DInference": "Runware 3D Inference", -} diff --git a/modules/threeDInferenceInputs.py b/modules/threeDInferenceInputs.py deleted file mode 100644 index a0eff6d..0000000 --- a/modules/threeDInferenceInputs.py +++ /dev/null @@ -1,75 +0,0 @@ -from .utils import runwareUtils as rwUtils - -_IMAGE_SLOTS = 8 - - -class threeDInferenceInputs: - """3D Inference Inputs node for configuring 3D generation inputs""" - - @classmethod - def INPUT_TYPES(cls): - optional = { - "image": ("IMAGE", { - "tooltip": "Input image for 3D inference. This image will be used as the source for generating the 3D model.", - }), - "mask": ("IMAGE", { - "tooltip": "Optional mask image to specify a region of interest in the input image for 3D generation.", - }), - "meshFile": ("STRING", { - "default": "", - "tooltip": "Base64 data URI of mesh file (.glb or .ply) from Runware Load Mesh.", - }), - } - for i in range(1, _IMAGE_SLOTS + 1): - optional[f"Images {i}"] = ("IMAGE", { - "tooltip": f"Multi-view image slot {i}; merged in order into inputs.images as a list of data URIs.", - }) - return { - "required": {}, - "optional": optional, - } - - DESCRIPTION = ( - "Configure custom inputs for Runware 3D Inference: image, mask, meshFile, and Images 1…Images 8 " - "(merged into inputs.images as an array)." - ) - FUNCTION = "createInputs" - RETURN_TYPES = ("RUNWARE3DINFERENCEINPUTS",) - RETURN_NAMES = ("Inputs",) - CATEGORY = "Runware" - - def createInputs(self, **kwargs): - """Create 3D inference inputs from provided parameters""" - image = kwargs.get("image", None) - mask = kwargs.get("mask", None) - mesh_file = kwargs.get("meshFile", "") - - inputs = {} - - if image is not None: - inputs["image"] = rwUtils.convertTensor2IMG(image) - - if mask is not None: - inputs["mask"] = rwUtils.convertTensor2IMG(mask) - - if mesh_file and isinstance(mesh_file, str) and mesh_file.strip(): - inputs["meshFile"] = mesh_file.strip() - - images_list: list = [] - for i in range(1, _IMAGE_SLOTS + 1): - slot = kwargs.get(f"Images {i}") - if slot is not None: - images_list.append(rwUtils.convertTensor2IMG(slot)) - if images_list: - inputs["images"] = images_list - - return (inputs,) - - -NODE_CLASS_MAPPINGS = { - "Runware3DInferenceInputs": threeDInferenceInputs, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "Runware3DInferenceInputs": "Runware 3D Inference Inputs", -} diff --git a/modules/threeDInferenceSettings.py b/modules/threeDInferenceSettings.py deleted file mode 100644 index ae263d7..0000000 --- a/modules/threeDInferenceSettings.py +++ /dev/null @@ -1,628 +0,0 @@ -""" -Runware 3D Inference Settings Node -Main settings for 3D inference: textureSize, decimationTarget, remesh, remeshBand, remeshProject, -resolution, imageAutoFix, faceLimit, texture, pbr, textureFormat, alphaMode, Tripo mesh/texture options, material/quality, -polyCount, taPose, boundingBox, meshMode, addons, hdTexture, and sub-configs -sparseStructure, shapeSlat, texSlat, meshCluster, dracoCompression from connected nodes. -""" - -from typing import Dict, Any - - -class Runware3DInferenceSettings: - """Runware 3D Inference Settings Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useTextureSize": ("BOOLEAN", { - "tooltip": "Enable to include textureSize in settings", - "default": False, - }), - "textureSize": ("INT", { - "tooltip": "Texture size for 3D output (1024-4096, step 1024). Only used when enabled.", - "default": 2048, - "min": 1024, - "max": 4096, - "step": 1024, - }), - "useDecimationTarget": ("BOOLEAN", { - "tooltip": "Enable to include decimationTarget in settings", - "default": False, - }), - "decimationTarget": ("INT", { - "tooltip": "Decimation target for mesh (100000-1000000). Only used when enabled.", - "default": 500000, - "min": 100000, - "max": 1000000, - "step": 10000, - }), - "useRemesh": ("BOOLEAN", { - "tooltip": "Enable to include remesh in settings", - "default": False, - }), - "remesh": ("BOOLEAN", { - "tooltip": "Whether to remesh the output. Only used when enabled.", - "default": True, - }), - "useResolution": ("BOOLEAN", { - "tooltip": "Enable to include resolution in settings", - "default": False, - }), - "resolution": ([512, 1024, 1536], { - "tooltip": "Resolution for 3D generation (512, 1024, or 1536). Only used when enabled.", - "default": 1024, - }), - "useImageAutoFix": ("BOOLEAN", { - "tooltip": "Enable to include imageAutoFix in settings.", - "default": False, - }), - "imageAutoFix": ("BOOLEAN", { - "tooltip": "When true, optimizes the input image for better generation. Only used when 'Use Image Auto Fix' is enabled.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "useFaceLimit": ("BOOLEAN", { - "tooltip": "Enable to include faceLimit in settings.", - "default": False, - }), - "faceLimit": ("INT", { - "tooltip": "Limits faces on the output mesh; if unset, face count is adaptive. With smartLowPoly: typically 1000–20000; with quad: 500–10000. Only used when enabled.", - "default": 10000, - "min": 500, - "max": 20000, - "step": 100, - }), - "useTexture": ("BOOLEAN", { - "tooltip": "Enable to include texture (enable texturing) in settings.", - "default": False, - }), - "texture": ("BOOLEAN", { - "tooltip": "Enable texturing. Default API behavior is true; set false for untextured base mesh. Only used when 'Use Texture' is enabled.", - "default": True, - "label_on": "true", - "label_off": "false", - }), - "usePbr": ("BOOLEAN", { - "tooltip": "Enable to include pbr in settings.", - "default": False, - }), - "pbr": ("BOOLEAN", { - "tooltip": "Enable PBR materials. Default API behavior is true; set false for no PBR. Only used when 'Use Pbr' is enabled.", - "default": True, - "label_on": "true", - "label_off": "false", - }), - "useTextureSeed": ("BOOLEAN", { - "tooltip": "Enable to include textureSeed in settings.", - "default": False, - }), - "textureSeed": ("INT", { - "tooltip": "Seed for texture generation. Only used when 'Use Texture Seed' is enabled.", - "default": 1, - "min": 0, - "max": 2147483647, - }), - "useTextureAlignment": ("BOOLEAN", { - "tooltip": "Enable to include textureAlignment in settings.", - "default": False, - }), - "textureAlignment": (["original_image", "geometry"], { - "tooltip": "original_image: fidelity to source image. geometry: alignment to 3D structure. Only used when 'Use Texture Alignment' is enabled.", - "default": "original_image", - }), - "useTextureQuality": ("BOOLEAN", { - "tooltip": "Enable to include textureQuality in settings.", - "default": False, - }), - "textureQuality": (["standard", "detailed"], { - "tooltip": "Texture quality: standard (default) or detailed (high-res, finer detail). Only used when 'Use Texture Quality' is enabled.", - "default": "standard", - }), - "useAutoSize": ("BOOLEAN", { - "tooltip": "Enable to include autoSize in settings.", - "default": False, - }), - "autoSize": ("BOOLEAN", { - "tooltip": "Scale the model to real-world size (meters). Default false. Only used when 'Use Auto Size' is enabled.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "useOrientation": ("BOOLEAN", { - "tooltip": "Enable to include orientation in settings.", - "default": False, - }), - "orientation": (["default", "align_image"], { - "tooltip": "align_image rotates the model to align with the source image. Default: default. Only used when 'Use Orientation' is enabled.", - "default": "default", - }), - "useQuad": ("BOOLEAN", { - "tooltip": "Enable to include quad in settings.", - "default": False, - }), - "quad": ("BOOLEAN", { - "tooltip": "Enable quad mesh output. If quad=true and faceLimit is unset, default faceLimit is 10000. Only used when 'Use Quad' is enabled.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "useCompress": ("BOOLEAN", { - "tooltip": "Enable to include compress in settings.", - "default": False, - }), - "compress": (["meshopt", "geometry"], { - "tooltip": "meshopt: default compression. geometry: geometry-based compression (decompress before editing in most DCC tools). Only used when 'Use Compress' is enabled.", - "default": "meshopt", - }), - "useSmartLowPoly": ("BOOLEAN", { - "tooltip": "Enable to include smartLowPoly in settings.", - "default": False, - }), - "smartLowPoly": ("BOOLEAN", { - "tooltip": "Low-poly meshes with hand-crafted topology; simpler inputs work best. Default false. Only used when 'Use Smart Low Poly' is enabled.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "useGenerateParts": ("BOOLEAN", { - "tooltip": "Enable to include generateParts in settings.", - "default": False, - }), - "generateParts": ("BOOLEAN", { - "tooltip": "Segmented editable parts. Not compatible with texture/pbr when true, or with quad=true (set texture=false, pbr=false, quad=false). Only used when 'Use Generate Parts' is enabled.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "useExportUv": ("BOOLEAN", { - "tooltip": "Enable to include exportUv in settings.", - "default": False, - }), - "exportUv": ("BOOLEAN", { - "tooltip": "Whether UV unwrapping runs during generation. Only used when 'Use Export Uv' is enabled.", - "default": True, - "label_on": "true", - "label_off": "false", - }), - "useGeometryQuality": ("BOOLEAN", { - "tooltip": "Enable to include geometryQuality in settings.", - "default": False, - }), - "geometryQuality": (["standard", "detailed"], { - "tooltip": "standard: balanced (default). detailed: maximum detail (ultra mode). Only used when 'Use Geometry Quality' is enabled.", - "default": "standard", - }), - "useOriginalAlpha": ("BOOLEAN", { - "tooltip": "Enable to include originalAlpha in settings.", - "default": False, - }), - "originalAlpha": ("BOOLEAN", { - "tooltip": "If true, use the original transparency channel while processing the image. Only used when 'Use Original Alpha' is enabled.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "useMaterial": ("BOOLEAN", { - "tooltip": "Enable to include material in settings.", - "default": False, - }), - "material": (["PBR", "Shaded", "All"], { - "tooltip": "Material type. PBR: physically based textures. Shaded: base color with baked lighting. All: return both. Only used when 'Use Material' is enabled.", - "default": "PBR", - }), - "useQuality": ("BOOLEAN", { - "tooltip": "Enable to include quality in settings.", - "default": False, - }), - "quality": (["high", "medium", "low", "extra-low"], { - "tooltip": "Generation quality. For Raw defaults to high; for Quad defaults to medium. Ignored when polyCount is used.", - "default": "medium", - }), - "usePolyCount": ("BOOLEAN", { - "tooltip": "Enable to include polyCount in settings.", - "default": False, - }), - "polyCount": ("FLOAT", { - "tooltip": "Advanced face-count control. Raw: 500-1000000 (default 500000). Quad: 1000-200000 (default 18000). Overrides quality.", - "default": 18000.0, - "min": 500.0, - "max": 1000000.0, - "step": 100.0, - }), - "useTaPose": ("BOOLEAN", { - "tooltip": "Enable to include taPose in settings.", - "default": False, - }), - "taPose": ("BOOLEAN", { - "tooltip": "When true, human-like models are generated in T/A pose. Only used when 'Use Ta Pose' is enabled.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "useBoundingBox": ("BOOLEAN", { - "tooltip": "Enable to include boundingBox in settings.", - "default": False, - }), - "boundingBox": ("STRING", { - "multiline": False, - "tooltip": "Comma-separated integers in fixed order y,z,x (width,height,length), e.g. 2,3,4. Only used when 'Use Bounding Box' is enabled.", - "default": "", - }), - "useMeshMode": ("BOOLEAN", { - "tooltip": "Enable to include meshMode in settings.", - "default": False, - }), - "meshMode": (["Raw", "Quad"], { - "tooltip": "Raw: triangular faces. Quad: quadrilateral faces. Only used when 'Use Mesh Mode' is enabled.", - "default": "Quad", - }), - "useAddons": ("BOOLEAN", { - "tooltip": "Enable to include addons in settings.", - "default": False, - }), - "addons": ("STRING", { - "multiline": False, - "tooltip": "Comma-separated addon values, e.g. HighPack. Leave empty to skip addons. Only used when 'Use Addons' is enabled.", - "default": "", - }), - "useHdTexture": ("BOOLEAN", { - "tooltip": "Enable to include hdTexture in settings.", - "default": False, - }), - "hdTexture": ("BOOLEAN", { - "tooltip": "If true, provides high-quality texture output. Only used when 'Use Hd Texture' is enabled.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "useMeshType": ("BOOLEAN", { - "tooltip": "Enable to include meshType in settings.", - "default": False, - }), - "meshType": (["standard", "lowpoly"], { - "tooltip": "Mesh type: standard or lowpoly. Only used when 'Use Mesh Type' is enabled.", - "default": "standard", - }), - "useTopology": ("BOOLEAN", { - "tooltip": "Enable to include topology in settings.", - "default": False, - }), - "topology": (["triangle", "quad"], { - "tooltip": "Mesh topology mode. Only used when 'Use Topology' is enabled.", - "default": "triangle", - }), - "useDecimation": ("BOOLEAN", { - "tooltip": "Enable to include decimation in settings.", - "default": False, - }), - "decimation": ("INT", { - "tooltip": "Adaptive decimation level (1=ultra, 2=high, 3=medium, 4=low). Only used when enabled.", - "default": 2, - "min": 1, - "max": 4, - "step": 1, - }), - "useSymmetry": ("BOOLEAN", { - "tooltip": "Enable to include symmetry in settings.", - "default": False, - }), - "symmetry": (["auto", "on", "off"], { - "tooltip": "Symmetry behavior for generation. Only used when 'Use Symmetry' is enabled.", - "default": "auto", - }), - "usePose": ("BOOLEAN", { - "tooltip": "Enable to include pose in settings.", - "default": False, - }), - "pose": (["none", "a-pose", "t-pose"], { - "tooltip": "Pose preset for generated model. Use 'none' for no pose preset.", - "default": "none", - }), - "useImageEnhancement": ("BOOLEAN", { - "tooltip": "Enable to include imageEnhancement in settings.", - "default": False, - }), - "imageEnhancement": ("BOOLEAN", { - "tooltip": "Optimize input image for improved 3D results. Only used when enabled.", - "default": True, - "label_on": "true", - "label_off": "false", - }), - "useRemoveLighting": ("BOOLEAN", { - "tooltip": "Enable to include removeLighting in settings.", - "default": False, - }), - "removeLighting": ("BOOLEAN", { - "tooltip": "Remove baked lighting from texture output. Only used when enabled.", - "default": True, - "label_on": "true", - "label_off": "false", - }), - "useOrigin": ("BOOLEAN", { - "tooltip": "Enable to include origin in settings.", - "default": False, - }), - "origin": (["bottom", "center"], { - "tooltip": "Origin point position used with autoSize. Only used when 'Use Origin' is enabled.", - "default": "bottom", - }), - "useModeration": ("BOOLEAN", { - "tooltip": "Enable to include moderation in settings.", - "default": False, - }), - "moderation": ("BOOLEAN", { - "tooltip": "Enable moderation checks before generation. Only used when enabled.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "useSavePreRemeshedModel": ("BOOLEAN", { - "tooltip": "Enable to include savePreRemeshedModel in settings.", - "default": False, - }), - "savePreRemeshedModel": ("BOOLEAN", { - "tooltip": "Store extra GLB before remesh completion. Only used when enabled.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "useTexturePrompt": ("BOOLEAN", { - "tooltip": "Enable to include texturePrompt in settings.", - "default": False, - }), - "texturePrompt": ("STRING", { - "multiline": True, - "tooltip": "Additional text prompt to guide texture generation. Only used when enabled.", - "default": "", - }), - "sparseStructure": ("RUNWARE3DINFERENCESETTINGSLAT", { - "tooltip": "Connect Runware 3D Inference Settings Sparse Structure node.", - }), - "shapeSlat": ("RUNWARE3DINFERENCESETTINGSLAT", { - "tooltip": "Connect Runware 3D Inference Settings Shape Slat node.", - }), - "texSlat": ("RUNWARE3DINFERENCESETTINGSLAT", { - "tooltip": "Connect Runware 3D Inference Settings Tex Slat node.", - }), - "useFaceCount": ("BOOLEAN", { - "tooltip": "Enable to include faceCount in settings (Tencent Hunyuan Pro).", - "default": False, - }), - "faceCount": ("INT", { - "tooltip": "Target number of mesh faces for Hunyuan Pro (3000-1500000).", - "default": 500000, - "min": 3000, - "max": 1500000, - "step": 1000, - }), - "useGenerateType": ("BOOLEAN", { - "tooltip": "Enable to include generateType in settings (Tencent Hunyuan Pro).", - "default": False, - }), - "generateType": (["Normal", "Geometry"], { - "tooltip": "Hunyuan Pro generation mode: Normal or Geometry.", - "default": "Normal", - }), - "usePolygonType": ("BOOLEAN", { - "tooltip": "Enable to include polygonType in settings (Tencent Hunyuan Pro).", - "default": False, - }), - "polygonType": (["triangle", "quadrilateral"], { - "tooltip": "Polygon type for low-poly style output. For Hunyuan 3.1, lowpoly mode is not supported by provider.", - "default": "triangle", - }), - "useGeometryOnly": ("BOOLEAN", { - "tooltip": "Enable to include geometryOnly in settings (Tencent Hunyuan Rapid).", - "default": False, - }), - "geometryOnly": ("BOOLEAN", { - "tooltip": "Rapid-only: texture-free white model generation.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "meshCluster": ("RUNWARE3DINFERENCESETTINGSLAT", { - "tooltip": "Connect Runware 3D Inference Settings Mesh Cluster node.", - }), - "useRemeshBand": ("BOOLEAN", { - "tooltip": "Enable to include remeshBand in settings.", - "default": False, - }), - "remeshBand": ("FLOAT", { - "tooltip": "Narrow-band width (in voxels) for dual-contouring remeshing. Must be greater than 0 when remesh is true. Only used when enabled.", - "default": 1.0, - "min": 0.1, - "max": 16.0, - "step": 0.1, - }), - "useRemeshProject": ("BOOLEAN", { - "tooltip": "Enable to include remeshProject in settings.", - "default": False, - }), - "remeshProject": ("FLOAT", { - "tooltip": "Projection factor for snapping remeshed vertices back to the original surface. Must be greater than 0 when remesh is true. Only used when enabled.", - "default": 0.01, - "min": 0.01, - "max": 1.0, - "step": 0.01, - }), - "useTextureFormat": ("BOOLEAN", { - "tooltip": "Enable to include textureFormat in settings.", - "default": False, - }), - "textureFormat": (["WEBP", "PNG"], { - "tooltip": "Texture format stored in the GLB output: WEBP or PNG. Only used when 'Use Texture Format' is enabled.", - "default": "WEBP", - }), - "useAlphaMode": ("BOOLEAN", { - "tooltip": "Enable to include alphaMode in settings.", - "default": False, - }), - "alphaMode": (["OPAQUE", "BLEND", "MASK"], { - "tooltip": "Material alpha mode. Only used when 'Use Alpha Mode' is enabled.", - "default": "OPAQUE", - }), - "dracoCompression": ("RUNWARE3DINFERENCESETTINGSLAT", { - "tooltip": "Connect Runware 3D Inference Settings Draco Compression node.", - }), - } - } - - RETURN_TYPES = ("RUNWARE3DINFERENCESETTINGS",) - RETURN_NAMES = ("Settings",) - FUNCTION = "create" - CATEGORY = "Runware" - DESCRIPTION = ( - "Configure Runware 3D Inference settings: textureSize, decimationTarget, remesh, remeshBand, remeshProject, " - "resolution, imageAutoFix, faceLimit, texture, pbr, textureSeed, textureAlignment, textureQuality, " - "textureFormat, alphaMode, autoSize, orientation, quad, compress, " - "smartLowPoly, generateParts, exportUv, geometryQuality, originalAlpha, material, quality, polyCount, " - "taPose, boundingBox, meshMode, addons, hdTexture, lat configs, meshCluster, and dracoCompression." - ) - - def create(self, **kwargs) -> tuple[Dict[str, Any]]: - settings: Dict[str, Any] = {} - - if kwargs.get("useTextureSize", False): - settings["textureSize"] = int(kwargs.get("textureSize", 2048)) - if kwargs.get("useDecimationTarget", False): - settings["decimationTarget"] = int(kwargs.get("decimationTarget", 500000)) - if kwargs.get("useRemesh", False): - settings["remesh"] = bool(kwargs.get("remesh", True)) - if kwargs.get("useRemeshBand", False): - settings["remeshBand"] = float(kwargs.get("remeshBand", 1.0)) - if kwargs.get("useRemeshProject", False): - settings["remeshProject"] = float(kwargs.get("remeshProject", 0.01)) - if kwargs.get("useResolution", False): - settings["resolution"] = int(kwargs.get("resolution", 1024)) - - if kwargs.get("useImageAutoFix", False): - settings["imageAutoFix"] = bool(kwargs.get("imageAutoFix", False)) - if kwargs.get("useFaceLimit", False): - settings["faceLimit"] = int(kwargs.get("faceLimit", 10000)) - if kwargs.get("useTexture", False): - settings["texture"] = bool(kwargs.get("texture", True)) - if kwargs.get("usePbr", False): - settings["pbr"] = bool(kwargs.get("pbr", True)) - if kwargs.get("useFaceCount", False): - settings["faceCount"] = int(kwargs.get("faceCount", 500000)) - if kwargs.get("useGenerateType", False): - settings["generateType"] = kwargs.get("generateType", "Normal") - if kwargs.get("usePolygonType", False): - settings["polygonType"] = kwargs.get("polygonType", "triangle") - if kwargs.get("useGeometryOnly", False): - settings["geometryOnly"] = bool(kwargs.get("geometryOnly", False)) - if kwargs.get("useTextureSeed", False): - settings["textureSeed"] = int(kwargs.get("textureSeed", 1)) - if kwargs.get("useTextureAlignment", False): - settings["textureAlignment"] = kwargs.get("textureAlignment", "original_image") - if kwargs.get("useTextureQuality", False): - settings["textureQuality"] = kwargs.get("textureQuality", "standard") - if kwargs.get("useTextureFormat", False): - settings["textureFormat"] = kwargs.get("textureFormat", "WEBP") - if kwargs.get("useAlphaMode", False): - settings["alphaMode"] = kwargs.get("alphaMode", "OPAQUE") - if kwargs.get("useAutoSize", False): - settings["autoSize"] = bool(kwargs.get("autoSize", False)) - if kwargs.get("useOrientation", False): - settings["orientation"] = kwargs.get("orientation", "default") - if kwargs.get("useQuad", False): - settings["quad"] = bool(kwargs.get("quad", False)) - if kwargs.get("useCompress", False): - settings["compress"] = kwargs.get("compress", "meshopt") - if kwargs.get("useSmartLowPoly", False): - settings["smartLowPoly"] = bool(kwargs.get("smartLowPoly", False)) - if kwargs.get("useGenerateParts", False): - settings["generateParts"] = bool(kwargs.get("generateParts", False)) - if kwargs.get("useExportUv", False): - settings["exportUv"] = bool(kwargs.get("exportUv", True)) - if kwargs.get("useGeometryQuality", False): - settings["geometryQuality"] = kwargs.get("geometryQuality", "standard") - if kwargs.get("useOriginalAlpha", False): - settings["originalAlpha"] = bool(kwargs.get("originalAlpha", False)) - if kwargs.get("useMaterial", False): - settings["material"] = kwargs.get("material", "PBR") - if kwargs.get("useQuality", False): - settings["quality"] = kwargs.get("quality", "medium") - if kwargs.get("usePolyCount", False): - settings["polyCount"] = float(kwargs.get("polyCount", 18000.0)) - if kwargs.get("useTaPose", False): - settings["taPose"] = bool(kwargs.get("taPose", False)) - if kwargs.get("useBoundingBox", False): - raw_bounding_box = (kwargs.get("boundingBox") or "").strip() - if raw_bounding_box: - parts = [part.strip() for part in raw_bounding_box.split(",") if part.strip()] - if len(parts) != 3: - raise ValueError("boundingBox must contain exactly 3 comma-separated integers in y,z,x order.") - try: - settings["boundingBox"] = [int(parts[0]), int(parts[1]), int(parts[2])] - except ValueError as exc: - raise ValueError("boundingBox values must be integers (y,z,x).") from exc - if kwargs.get("useMeshMode", False): - settings["meshMode"] = kwargs.get("meshMode", "Quad") - if kwargs.get("useAddons", False): - raw_addons = (kwargs.get("addons") or "").strip() - addons = [addon.strip() for addon in raw_addons.split(",") if addon.strip()] if raw_addons else [] - if addons: - settings["addons"] = addons - if kwargs.get("useHdTexture", False): - settings["hdTexture"] = bool(kwargs.get("hdTexture", False)) - if kwargs.get("useMeshType", False): - settings["meshType"] = kwargs.get("meshType", "standard") - if kwargs.get("useTopology", False): - settings["topology"] = kwargs.get("topology", "triangle") - if kwargs.get("useDecimation", False): - settings["decimation"] = int(kwargs.get("decimation", 2)) - if kwargs.get("useSymmetry", False): - settings["symmetry"] = kwargs.get("symmetry", "auto") - if kwargs.get("usePose", False): - pose_value = kwargs.get("pose", "none") - settings["pose"] = "" if pose_value == "none" else pose_value - if kwargs.get("useImageEnhancement", False): - settings["imageEnhancement"] = bool(kwargs.get("imageEnhancement", True)) - if kwargs.get("useRemoveLighting", False): - settings["removeLighting"] = bool(kwargs.get("removeLighting", True)) - if kwargs.get("useOrigin", False): - settings["origin"] = kwargs.get("origin", "bottom") - if kwargs.get("useModeration", False): - settings["moderation"] = bool(kwargs.get("moderation", False)) - if kwargs.get("useSavePreRemeshedModel", False): - settings["savePreRemeshedModel"] = bool(kwargs.get("savePreRemeshedModel", False)) - if kwargs.get("useTexturePrompt", False): - texture_prompt = (kwargs.get("texturePrompt") or "").strip() - if texture_prompt: - settings["texturePrompt"] = texture_prompt - - sparse = kwargs.get("sparseStructure", None) - if sparse is not None and isinstance(sparse, dict) and len(sparse) > 0: - settings["sparseStructure"] = sparse - - shape = kwargs.get("shapeSlat", None) - if shape is not None and isinstance(shape, dict) and len(shape) > 0: - settings["shapeSlat"] = shape - - tex = kwargs.get("texSlat", None) - if tex is not None and isinstance(tex, dict) and len(tex) > 0: - settings["texSlat"] = tex - - mesh_cluster = kwargs.get("meshCluster", None) - if mesh_cluster is not None and isinstance(mesh_cluster, dict) and len(mesh_cluster) > 0: - settings["meshCluster"] = mesh_cluster - - draco_compression = kwargs.get("dracoCompression", None) - if draco_compression is not None and isinstance(draco_compression, dict) and len(draco_compression) > 0: - settings["dracoCompression"] = draco_compression - - return (settings,) - - -NODE_CLASS_MAPPINGS = { - "Runware3DInferenceSettings": Runware3DInferenceSettings, -} -NODE_DISPLAY_NAME_MAPPINGS = { - "Runware3DInferenceSettings": "Runware 3D Inference Settings", -} diff --git a/modules/threeDInferenceSettingsDracoCompression.py b/modules/threeDInferenceSettingsDracoCompression.py deleted file mode 100644 index c5c4b97..0000000 --- a/modules/threeDInferenceSettingsDracoCompression.py +++ /dev/null @@ -1,109 +0,0 @@ -""" -Runware 3D Inference Settings Draco Compression Node -Outputs dracoCompression config: enabled, level, quantizationPosition, -quantizationNormal, quantizationTexCoord -""" - -from typing import Dict, Any - - -class Runware3DInferenceSettingsDracoCompression: - """Runware 3D Inference Settings Draco Compression Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useEnabled": ("BOOLEAN", { - "tooltip": "Enable to include enabled in dracoCompression", - "default": False, - }), - "enabled": ("BOOLEAN", { - "tooltip": ( - "If true, applies KHR_draco_mesh_compression to the output GLB " - "(5-10x geometry size reduction with no triangle loss). " - "Only used when 'Use Enabled' is on." - ), - "default": False, - "label_on": "true", - "label_off": "false", - }), - "useLevel": ("BOOLEAN", { - "tooltip": "Enable to include level in dracoCompression", - "default": False, - }), - "level": ("INT", { - "tooltip": "Draco compression level (0-10). Higher = better compression but slower encoding. Only used when enabled.", - "default": 7, - "min": 0, - "max": 10, - "step": 1, - }), - "useQuantizationPosition": ("BOOLEAN", { - "tooltip": "Enable to include quantizationPosition in dracoCompression", - "default": False, - }), - "quantizationPosition": ("INT", { - "tooltip": "Quantization bits for vertex positions (8-30). Higher = better quality, larger file. Only used when enabled.", - "default": 16, - "min": 8, - "max": 30, - "step": 1, - }), - "useQuantizationNormal": ("BOOLEAN", { - "tooltip": "Enable to include quantizationNormal in dracoCompression", - "default": False, - }), - "quantizationNormal": ("INT", { - "tooltip": "Quantization bits for vertex normals (8-30). Higher = smoother shading, larger file. Only used when enabled.", - "default": 14, - "min": 8, - "max": 30, - "step": 1, - }), - "useQuantizationTexCoord": ("BOOLEAN", { - "tooltip": "Enable to include quantizationTexCoord in dracoCompression", - "default": False, - }), - "quantizationTexCoord": ("INT", { - "tooltip": "Quantization bits for texture coordinates (8-30). Higher = sharper textures at UV seams. Only used when enabled.", - "default": 14, - "min": 8, - "max": 30, - "step": 1, - }), - } - } - - RETURN_TYPES = ("RUNWARE3DINFERENCESETTINGSLAT",) - RETURN_NAMES = ("Draco Compression",) - FUNCTION = "create" - CATEGORY = "Runware" - DESCRIPTION = ( - "Configure settings.dracoCompression for Runware 3D Inference " - "(enabled, level, quantizationPosition, quantizationNormal, quantizationTexCoord). " - "Connect to Runware 3D Inference Settings." - ) - - def create(self, **kwargs) -> tuple[Dict[str, Any]]: - out: Dict[str, Any] = {} - if kwargs.get("useEnabled", False): - out["enabled"] = bool(kwargs.get("enabled", False)) - if kwargs.get("useLevel", False): - out["level"] = int(kwargs.get("level", 7)) - if kwargs.get("useQuantizationPosition", False): - out["quantizationPosition"] = int(kwargs.get("quantizationPosition", 16)) - if kwargs.get("useQuantizationNormal", False): - out["quantizationNormal"] = int(kwargs.get("quantizationNormal", 14)) - if kwargs.get("useQuantizationTexCoord", False): - out["quantizationTexCoord"] = int(kwargs.get("quantizationTexCoord", 14)) - return (out,) - - -NODE_CLASS_MAPPINGS = { - "Runware3DInferenceSettingsDracoCompression": Runware3DInferenceSettingsDracoCompression, -} -NODE_DISPLAY_NAME_MAPPINGS = { - "Runware3DInferenceSettingsDracoCompression": "Runware 3D Inference Settings Draco Compression", -} diff --git a/modules/threeDInferenceSettingsMeshCluster.py b/modules/threeDInferenceSettingsMeshCluster.py deleted file mode 100644 index 9efac65..0000000 --- a/modules/threeDInferenceSettingsMeshCluster.py +++ /dev/null @@ -1,90 +0,0 @@ -""" -Runware 3D Inference Settings Mesh Cluster Node -Outputs meshCluster config: thresholdConeHalfAngleRad, refineIterations, -globalIterations, smoothStrength -""" - -import math -from typing import Dict, Any - - -class Runware3DInferenceSettingsMeshCluster: - """Runware 3D Inference Settings Mesh Cluster Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useThresholdConeHalfAngleRad": ("BOOLEAN", { - "tooltip": "Enable to include thresholdConeHalfAngleRad in meshCluster", - "default": False, - }), - "thresholdConeHalfAngleRad": ("FLOAT", { - "tooltip": "Cone half-angle threshold (radians) used during UV chart clustering. Only used when enabled.", - "default": math.pi / 2, - "min": 0.0, - "max": math.pi, - "step": 0.01, - }), - "useRefineIterations": ("BOOLEAN", { - "tooltip": "Enable to include refineIterations in meshCluster", - "default": False, - }), - "refineIterations": ("INT", { - "tooltip": "Local refinement iterations for chart clustering. Only used when enabled.", - "default": 0, - "min": 0, - "max": 64, - "step": 1, - }), - "useGlobalIterations": ("BOOLEAN", { - "tooltip": "Enable to include globalIterations in meshCluster", - "default": False, - }), - "globalIterations": ("INT", { - "tooltip": "Global iterations for chart clustering. Only used when enabled.", - "default": 1, - "min": 0, - "max": 64, - "step": 1, - }), - "useSmoothStrength": ("BOOLEAN", { - "tooltip": "Enable to include smoothStrength in meshCluster", - "default": False, - }), - "smoothStrength": ("INT", { - "tooltip": "Smoothing strength applied during chart clustering. Only used when enabled.", - "default": 1, - "min": 0, - "max": 10, - "step": 1, - }), - } - } - - RETURN_TYPES = ("RUNWARE3DINFERENCESETTINGSLAT",) - RETURN_NAMES = ("Mesh Cluster",) - FUNCTION = "create" - CATEGORY = "Runware" - DESCRIPTION = "Configure mesh cluster parameters for Runware 3D Inference settings." - - def create(self, **kwargs) -> tuple[Dict[str, Any]]: - out: Dict[str, Any] = {} - if kwargs.get("useThresholdConeHalfAngleRad", False): - out["thresholdConeHalfAngleRad"] = float(kwargs.get("thresholdConeHalfAngleRad", math.pi / 2)) - if kwargs.get("useRefineIterations", False): - out["refineIterations"] = int(kwargs.get("refineIterations", 0)) - if kwargs.get("useGlobalIterations", False): - out["globalIterations"] = int(kwargs.get("globalIterations", 1)) - if kwargs.get("useSmoothStrength", False): - out["smoothStrength"] = int(kwargs.get("smoothStrength", 1)) - return (out,) - - -NODE_CLASS_MAPPINGS = { - "Runware3DInferenceSettingsMeshCluster": Runware3DInferenceSettingsMeshCluster, -} -NODE_DISPLAY_NAME_MAPPINGS = { - "Runware3DInferenceSettingsMeshCluster": "Runware 3D Inference Settings Mesh Cluster", -} diff --git a/modules/threeDInferenceSettingsShapeSlat.py b/modules/threeDInferenceSettingsShapeSlat.py deleted file mode 100644 index baebaee..0000000 --- a/modules/threeDInferenceSettingsShapeSlat.py +++ /dev/null @@ -1,88 +0,0 @@ -""" -Runware 3D Inference Settings Shape Slat Node -Outputs shapeSlat config: guidanceStrength, guidanceRescale, steps, rescaleT -""" - -from typing import Dict, Any - - -class Runware3DInferenceSettingsShapeSlat: - """Runware 3D Inference Settings Shape Slat Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useGuidanceStrength": ("BOOLEAN", { - "tooltip": "Enable to include guidanceStrength in shapeSlat", - "default": False, - }), - "guidanceStrength": ("FLOAT", { - "tooltip": "Guidance strength for shape slat (1.0-10.0). Only used when enabled.", - "default": 7.5, - "min": 1.0, - "max": 10.0, - "step": 0.1, - }), - "useGuidanceRescale": ("BOOLEAN", { - "tooltip": "Enable to include guidanceRescale in shapeSlat", - "default": False, - }), - "guidanceRescale": ("FLOAT", { - "tooltip": "Guidance rescale for shape slat. Only used when enabled.", - "default": 0.5, - "min": 0.0, - "max": 1.0, - "step": 0.05, - }), - "useSteps": ("BOOLEAN", { - "tooltip": "Enable to include steps in shapeSlat", - "default": False, - }), - "steps": ("INT", { - "tooltip": "Number of steps for shape slat (1-50). Only used when enabled.", - "default": 12, - "min": 1, - "max": 50, - "step": 1, - }), - "useRescaleT": ("BOOLEAN", { - "tooltip": "Enable to include rescaleT in shapeSlat", - "default": False, - }), - "rescaleT": ("FLOAT", { - "tooltip": "Rescale T for shape slat (1.0-6.0). Only used when enabled.", - "default": 3.0, - "min": 1.0, - "max": 6.0, - "step": 0.1, - }), - } - } - - RETURN_TYPES = ("RUNWARE3DINFERENCESETTINGSLAT",) - RETURN_NAMES = ("Shape Slat",) - FUNCTION = "create" - CATEGORY = "Runware" - DESCRIPTION = "Configure shape slat parameters for Runware 3D Inference settings." - - def create(self, **kwargs) -> tuple[Dict[str, Any]]: - out: Dict[str, Any] = {} - if kwargs.get("useGuidanceStrength", False): - out["guidanceStrength"] = float(kwargs.get("guidanceStrength", 7.5)) - if kwargs.get("useGuidanceRescale", False): - out["guidanceRescale"] = float(kwargs.get("guidanceRescale", 0.5)) - if kwargs.get("useSteps", False): - out["steps"] = int(kwargs.get("steps", 12)) - if kwargs.get("useRescaleT", False): - out["rescaleT"] = float(kwargs.get("rescaleT", 3.0)) - return (out,) - - -NODE_CLASS_MAPPINGS = { - "Runware3DInferenceSettingsShapeSlat": Runware3DInferenceSettingsShapeSlat, -} -NODE_DISPLAY_NAME_MAPPINGS = { - "Runware3DInferenceSettingsShapeSlat": "Runware 3D Inference Settings Shape Slat", -} diff --git a/modules/threeDInferenceSettingsSparseStructure.py b/modules/threeDInferenceSettingsSparseStructure.py deleted file mode 100644 index 3c4bbc5..0000000 --- a/modules/threeDInferenceSettingsSparseStructure.py +++ /dev/null @@ -1,88 +0,0 @@ -""" -Runware 3D Inference Settings Sparse Structure Node -Outputs sparseStructure config: guidanceStrength, guidanceRescale, steps, rescaleT -""" - -from typing import Dict, Any - - -class Runware3DInferenceSettingsSparseStructure: - """Runware 3D Inference Settings Sparse Structure Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useGuidanceStrength": ("BOOLEAN", { - "tooltip": "Enable to include guidanceStrength in sparseStructure", - "default": False, - }), - "guidanceStrength": ("FLOAT", { - "tooltip": "Guidance strength for sparse structure (1.0-10.0). Only used when enabled.", - "default": 7.5, - "min": 1.0, - "max": 10.0, - "step": 0.1, - }), - "useGuidanceRescale": ("BOOLEAN", { - "tooltip": "Enable to include guidanceRescale in sparseStructure", - "default": False, - }), - "guidanceRescale": ("FLOAT", { - "tooltip": "Guidance rescale for sparse structure. Only used when enabled.", - "default": 0.7, - "min": 0.0, - "max": 1.0, - "step": 0.05, - }), - "useSteps": ("BOOLEAN", { - "tooltip": "Enable to include steps in sparseStructure", - "default": False, - }), - "steps": ("INT", { - "tooltip": "Number of steps for sparse structure (1-50). Only used when enabled.", - "default": 12, - "min": 1, - "max": 50, - "step": 1, - }), - "useRescaleT": ("BOOLEAN", { - "tooltip": "Enable to include rescaleT in sparseStructure", - "default": False, - }), - "rescaleT": ("FLOAT", { - "tooltip": "Rescale T for sparse structure (1.0-6.0). Only used when enabled.", - "default": 5.0, - "min": 1.0, - "max": 6.0, - "step": 0.1, - }), - } - } - - RETURN_TYPES = ("RUNWARE3DINFERENCESETTINGSLAT",) - RETURN_NAMES = ("Sparse Structure",) - FUNCTION = "create" - CATEGORY = "Runware" - DESCRIPTION = "Configure sparse structure parameters for Runware 3D Inference settings." - - def create(self, **kwargs) -> tuple[Dict[str, Any]]: - out: Dict[str, Any] = {} - if kwargs.get("useGuidanceStrength", False): - out["guidanceStrength"] = float(kwargs.get("guidanceStrength", 7.5)) - if kwargs.get("useGuidanceRescale", False): - out["guidanceRescale"] = float(kwargs.get("guidanceRescale", 0.7)) - if kwargs.get("useSteps", False): - out["steps"] = int(kwargs.get("steps", 12)) - if kwargs.get("useRescaleT", False): - out["rescaleT"] = float(kwargs.get("rescaleT", 5.0)) - return (out,) - - -NODE_CLASS_MAPPINGS = { - "Runware3DInferenceSettingsSparseStructure": Runware3DInferenceSettingsSparseStructure, -} -NODE_DISPLAY_NAME_MAPPINGS = { - "Runware3DInferenceSettingsSparseStructure": "Runware 3D Inference Settings Sparse Structure", -} diff --git a/modules/threeDInferenceSettingsTexSlat.py b/modules/threeDInferenceSettingsTexSlat.py deleted file mode 100644 index 4d807aa..0000000 --- a/modules/threeDInferenceSettingsTexSlat.py +++ /dev/null @@ -1,88 +0,0 @@ -""" -Runware 3D Inference Settings Tex Slat Node -Outputs texSlat config: guidanceStrength, guidanceRescale, steps, rescaleT -""" - -from typing import Dict, Any - - -class Runware3DInferenceSettingsTexSlat: - """Runware 3D Inference Settings Tex Slat Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useGuidanceStrength": ("BOOLEAN", { - "tooltip": "Enable to include guidanceStrength in texSlat", - "default": False, - }), - "guidanceStrength": ("FLOAT", { - "tooltip": "Guidance strength for tex slat (1.0-10.0). Only used when enabled.", - "default": 1.0, - "min": 1.0, - "max": 10.0, - "step": 0.1, - }), - "useGuidanceRescale": ("BOOLEAN", { - "tooltip": "Enable to include guidanceRescale in texSlat", - "default": False, - }), - "guidanceRescale": ("FLOAT", { - "tooltip": "Guidance rescale for tex slat. Only used when enabled.", - "default": 0.0, - "min": 0.0, - "max": 1.0, - "step": 0.05, - }), - "useSteps": ("BOOLEAN", { - "tooltip": "Enable to include steps in texSlat", - "default": False, - }), - "steps": ("INT", { - "tooltip": "Number of steps for tex slat (1-50). Only used when enabled.", - "default": 12, - "min": 1, - "max": 50, - "step": 1, - }), - "useRescaleT": ("BOOLEAN", { - "tooltip": "Enable to include rescaleT in texSlat", - "default": False, - }), - "rescaleT": ("FLOAT", { - "tooltip": "Rescale T for tex slat (1.0-6.0). Only used when enabled.", - "default": 3.0, - "min": 1.0, - "max": 6.0, - "step": 0.1, - }), - } - } - - RETURN_TYPES = ("RUNWARE3DINFERENCESETTINGSLAT",) - RETURN_NAMES = ("Tex Slat",) - FUNCTION = "create" - CATEGORY = "Runware" - DESCRIPTION = "Configure tex slat parameters for Runware 3D Inference settings." - - def create(self, **kwargs) -> tuple[Dict[str, Any]]: - out: Dict[str, Any] = {} - if kwargs.get("useGuidanceStrength", False): - out["guidanceStrength"] = float(kwargs.get("guidanceStrength", 1.0)) - if kwargs.get("useGuidanceRescale", False): - out["guidanceRescale"] = float(kwargs.get("guidanceRescale", 0.0)) - if kwargs.get("useSteps", False): - out["steps"] = int(kwargs.get("steps", 12)) - if kwargs.get("useRescaleT", False): - out["rescaleT"] = float(kwargs.get("rescaleT", 3.0)) - return (out,) - - -NODE_CLASS_MAPPINGS = { - "Runware3DInferenceSettingsTexSlat": Runware3DInferenceSettingsTexSlat, -} -NODE_DISPLAY_NAME_MAPPINGS = { - "Runware3DInferenceSettingsTexSlat": "Runware 3D Inference Settings Tex Slat", -} diff --git a/modules/threeDModelSearch.py b/modules/threeDModelSearch.py deleted file mode 100644 index 712144b..0000000 --- a/modules/threeDModelSearch.py +++ /dev/null @@ -1,91 +0,0 @@ -class Runware3DModelSearch: - """3D Model Search node for searching and selecting 3D generation models""" - - THREED_MODELS = { - "Tencent": [ - "tencent:hunyuan-3d@3.1-pro (Tencent Hunyuan 3D 3.1 Pro)", - "tencent:hunyuan-3d@3.1-rapid (Tencent Hunyuan 3D 3.1 Rapid)", - ], - "Meta": [ - "meta:sam@3d (Meta SAM 3D)", - ], - "Microsoft": [ - "microsoft:trellis-2@4b (TRELLIS.2)", - ], - "Tripo": [ - "tripo:v3.1@0 (Tripo 3D v3.1)", - ], - "Hyper3D": [ - "hyper3d:rodin@gen-1 (Rodin Gen-1)", - "hyper3d:rodin@gen-2 (Rodin Gen-2)", - ], - "Meshy": [ - "meshy:meshy@6 (Meshy 6)", - ], - } - - MODEL_ARCHITECTURES = [ - "All", - "Tencent", - "Meta", - "Microsoft", - "Tripo", - "Hyper3D", - "Meshy", - ] - - @classmethod - def INPUT_TYPES(cls): - allModels = cls._getAllModels() - defaultModel = "meta:sam@3d (Meta SAM 3D)" - - return { - "required": { - "Model Search": ("STRING", { - "tooltip": "Search for a specific 3D model by name or AIR code (e.g. hunyuan, trellis, tripo).", - }), - "Model Architecture": (cls.MODEL_ARCHITECTURES, { - "tooltip": "Choose 3D model architecture to filter results.", - "default": "Meta", - }), - "ThreeDList": (allModels, { - "tooltip": "3D model results will show up here so you can choose from.", - "default": defaultModel, - }), - "Use Search Value": ("BOOLEAN", { - "tooltip": "When enabled, the value in the search input is used instead of the selected list entry.\n\nUseful if you prefer to set the model manually.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - }, - } - - @classmethod - def _getAllModels(cls): - allModels = [] - for models in cls.THREED_MODELS.values(): - allModels.extend(models) - return allModels - - DESCRIPTION = "Search and connect 3D models to Runware 3D Inference nodes in ComfyUI." - FUNCTION = "threeDModelSearch" - RETURN_TYPES = ("RUNWARE3DMODEL",) - RETURN_NAMES = ("Runware 3D Model",) - CATEGORY = "Runware" - - @classmethod - def VALIDATE_INPUTS(cls, ThreeDList): - return True - - def threeDModelSearch(self, **kwargs): - enableSearchValue = kwargs.get("Use Search Value", False) - searchInput = kwargs.get("Model Search") - - if enableSearchValue: - modelAirCode = searchInput - else: - currentModel = kwargs.get("ThreeDList") - modelAirCode = currentModel.split(" (")[0] - - return (modelAirCode,) diff --git a/modules/ultralyticsInputs.py b/modules/ultralyticsInputs.py deleted file mode 100644 index c7a26b3..0000000 --- a/modules/ultralyticsInputs.py +++ /dev/null @@ -1,156 +0,0 @@ -""" -Runware Image Inference Ultralytics Node -Provides Ultralytics parameters for image inference (ultralytics.*) -Parameters are passed to genConfig["ultralytics"] like settings. -""" - -from typing import Dict, Any - - -class RunwareUltralyticsInputs: - """Runware Image Inference Ultralytics - Ultralytics parameters for image inference""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useMaskBlur": ("BOOLEAN", { - "tooltip": "Enable to include maskBlur parameter.", - "default": False, - }), - "maskBlur": ("INT", { - "default": 5, - "min": 0, - "max": 100, - "tooltip": "Mask feathering amount (0-100).", - }), - "useMaskPadding": ("BOOLEAN", { - "tooltip": "Enable to include maskPadding parameter.", - "default": False, - }), - "maskPadding": ("INT", { - "default": 5, - "min": 0, - "max": 20, - "tooltip": "Padding around face region (0-20).", - }), - "useConfidence": ("BOOLEAN", { - "tooltip": "Enable to include confidence parameter.", - "default": False, - }), - "confidence": ("FLOAT", { - "default": 0.5, - "min": 0.0, - "max": 1.0, - "step": 0.01, - "tooltip": "Detection confidence threshold (0-1).", - }), - "usePositivePrompt": ("BOOLEAN", { - "tooltip": "Enable to include positivePrompt parameter.", - "default": False, - }), - "positivePrompt": ("STRING", { - "default": "", - "multiline": True, - "tooltip": "Prompt for diffusion model.", - }), - "useNegativePrompt": ("BOOLEAN", { - "tooltip": "Enable to include negativePrompt parameter.", - "default": False, - }), - "negativePrompt": ("STRING", { - "default": "", - "multiline": True, - "tooltip": "Negative prompt for model.", - }), - "useSteps": ("BOOLEAN", { - "tooltip": "Enable to include steps parameter.", - "default": False, - }), - "steps": ("INT", { - "default": 20, - "min": 1, - "max": 100, - "tooltip": "Number of diffusion steps (1-100).", - }), - "useCFGScale": ("BOOLEAN", { - "tooltip": "Enable to include CFGScale parameter.", - "default": False, - }), - "CFGScale": ("FLOAT", { - "default": 8.0, - "min": 0.0, - "max": 50.0, - "step": 0.1, - "tooltip": "Classifier-free guidance scale (0-50).", - }), - "useStrength": ("BOOLEAN", { - "tooltip": "Enable to include strength parameter.", - "default": False, - }), - "strength": ("FLOAT", { - "default": 0.3, - "min": 0.0001, - "max": 1.0, - "step": 0.01, - "tooltip": "Denoising strength (0.0001-1).", - }), - "useInpaintSize": ("BOOLEAN", { - "tooltip": "Enable to include inpaintSize parameter.", - "default": False, - }), - "inpaintSize": ("INT", { - "default": 1024, - "min": 128, - "max": 2048, - "step": 1, - "tooltip": "Image size to use for each inpainting region. Only used when useInpaintSize is enabled.", - }), - } - } - - DESCRIPTION = "Configure Ultralytics parameters for Runware Image Inference. Passed as genConfig.ultralytics (like settings)." - RETURN_TYPES = ("RUNWAREULTRALYTICSINPUTS",) - RETURN_NAMES = ("Ultralytics",) - FUNCTION = "create_ultralytics_inputs" - CATEGORY = "Runware" - - def create_ultralytics_inputs(self, **kwargs) -> tuple[Dict[str, Any]]: - """Create Ultralytics parameters dict""" - - settings = {} - - if kwargs.get("useMaskBlur", False): - settings["maskBlur"] = kwargs.get("maskBlur", 5) - if kwargs.get("useMaskPadding", False): - settings["maskPadding"] = kwargs.get("maskPadding", 5) - if kwargs.get("useConfidence", False): - settings["confidence"] = kwargs.get("confidence", 0.5) - if kwargs.get("usePositivePrompt", False): - val = kwargs.get("positivePrompt", "") - if val is not None and str(val).strip(): - settings["positivePrompt"] = str(val).strip() - if kwargs.get("useNegativePrompt", False): - val = kwargs.get("negativePrompt", "") - if val is not None and str(val).strip(): - settings["negativePrompt"] = str(val).strip() - if kwargs.get("useSteps", False): - settings["steps"] = kwargs.get("steps", 20) - if kwargs.get("useCFGScale", False): - settings["CFGScale"] = kwargs.get("CFGScale", 8.0) - if kwargs.get("useStrength", False): - settings["strength"] = kwargs.get("strength", 0.3) - if kwargs.get("useInpaintSize", False): - settings["inpaintSize"] = int(kwargs.get("inpaintSize", 1024)) - - return (settings,) - - -NODE_CLASS_MAPPINGS = { - "RunwareUltralyticsInputs": RunwareUltralyticsInputs, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareUltralyticsInputs": "Runware Image Inference Ultralytics", -} diff --git a/modules/upscaler.py b/modules/upscaler.py deleted file mode 100644 index ca23b47..0000000 --- a/modules/upscaler.py +++ /dev/null @@ -1,291 +0,0 @@ -from .utils import runwareUtils as rwUtils - -class upscaler: - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Image": ("IMAGE", { - "tooltip": "Specifies the input image to be upscaled." - }), - "useUpscaleFactor": ("BOOLEAN", { - "tooltip": "Include upscaleFactor in the upscale request.", - "default": True, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "upscaleFactor": ("INT", { - "tooltip": "Each level will increase the size of the image by the corresponding factor. Only used when 'Use Upscale Factor' is enabled.", - "default": 2, - "min": 1, - "max": 8, - "step": 1, - }), - "useTargetMegapixels": ("BOOLEAN", { - "tooltip": "Enable targetMegapixels (root-level) on the upscale request.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "targetMegapixels": ("INT", { - "tooltip": "Target resolution in megapixels (1–8). Only used when 'Use Target Megapixels' is enabled.", - "default": 4, - "min": 1, - "max": 8, - "step": 1, - }), - }, - "optional": { - "model": ("STRING", { - "tooltip": "Model AIR ID (runware:500@1, runware:501@1, runware:502@1, runware:503@1, runware:504@1, bria:52@1)", - "default": "", - }), - # Common parameters toggles - "useSteps": ("BOOLEAN", { - "tooltip": "Enable quality steps parameter", - "default": False, - }), - "steps": ("INT", { - "tooltip": "Quality steps (4-60 depending on model)", - "default": 20, - "min": 1, - "max": 100, - }), - "useSeed": ("BOOLEAN", { - "tooltip": "Enable seed for reproducibility", - "default": False, - }), - "seed": ("INT", { - "tooltip": "Reproducibility toggle", - "default": 0, - "min": 0, - }), - "useCFGScale": ("BOOLEAN", { - "tooltip": "Enable CFG Scale parameter", - "default": False, - }), - "CFGScale": ("FLOAT", { - "tooltip": "Guidance CFG (3-20 depending on model)", - "default": 7.0, - "min": 1.0, - "max": 30.0, - "step": 0.1, - }), - "usePrompts": ("BOOLEAN", { - "tooltip": "Enable positive and negative prompts", - "default": False, - }), - "positivePrompt": ("STRING", { - "tooltip": "Positive prompt for upscaling", - "multiline": True, - "default": "", - }), - "negativePrompt": ("STRING", { - "tooltip": "Negative prompt for upscaling", - "multiline": True, - "default": "", - }), - # Clarity upscaler specific toggles - "useClarityParams": ("BOOLEAN", { - "tooltip": "Enable Clarity upscaler specific parameters", - "default": False, - }), - "controlNetWeight": ("FLOAT", { - "tooltip": "Style preservation/Resemblance (0-1) - Clarity upscaler specific", - "default": 0.5, - "min": 0.0, - "max": 1.0, - "step": 0.01, - }), - "strength": ("FLOAT", { - "tooltip": "Creativity (0-1) - Clarity upscaler specific", - "default": 0.5, - "min": 0.0, - "max": 1.0, - "step": 0.01, - }), - "scheduler": ("STRING", { - "tooltip": "Controls noise addition/removal - Clarity upscaler specific", - "default": "DPM++ 2M Karras", - }), - # CCSR and Latent upscaler specific toggles - "useCCSRParams": ("BOOLEAN", { - "tooltip": "Enable CCSR and Latent upscaler specific parameters", - "default": False, - }), - "colorFix": ("BOOLEAN", { - "tooltip": "Color correction (ADAIN/NOFIX) - CCSR and Latent upscaler specific", - "default": False, - }), - "tileDiffusion": ("BOOLEAN", { - "tooltip": "Tile diffusion for large images - CCSR and Latent upscaler specific", - "default": False, - }), - # Latent upscaler specific toggle - "useLatentParams": ("BOOLEAN", { - "tooltip": "Enable Latent upscaler specific parameters", - "default": False, - }), - "clipSkip": ("INT", { - "tooltip": "Skip CLIP layers during guidance (0-2) - Latent upscaler specific", - "default": 0, - "min": 0, - "max": 2, - }), - "safetyInputs": ("RUNWARESAFETYINPUTS", { - "tooltip": "Connect Runware Safety Inputs node to include safety settings in the upscale request.", - }), - "Accelerator": ("RUNWAREACCELERATOR", { - "tooltip": "Connect a Runware Accelerator Options Node to configure caching and acceleration settings.", - }), - "providerSettings": ("RUNWAREPROVIDERSETTINGS", { - "tooltip": "Connect a Runware Provider Settings node to configure provider-specific parameters.", - }), - "imageUpscalerSettings": ("RUNWAREIMAGEUPSCALERSETTINGS", { - "tooltip": "Connect Runware Image Upscaler Settings for settings.enhanceDetails and settings.realism.", - }), - }, - } - - DESCRIPTION = "Enhance the resolution and quality of your images using Runware's advanced upscaling API. Transform low-resolution images into sharp, high-definition visuals." - FUNCTION = "upscale" - RETURN_TYPES = ("STRING",) - RETURN_NAMES = ("IMAGE",) - CATEGORY = "Runware" - - def upscale(self, **kwargs): - image = kwargs.get("Image") - useUpscaleFactor = kwargs.get("useUpscaleFactor", True) - - # Get toggle parameters - useSteps = kwargs.get("useSteps", False) - useSeed = kwargs.get("useSeed", False) - useCFGScale = kwargs.get("useCFGScale", False) - usePrompts = kwargs.get("usePrompts", False) - useClarityParams = kwargs.get("useClarityParams", False) - useCCSRParams = kwargs.get("useCCSRParams", False) - useLatentParams = kwargs.get("useLatentParams", False) - - # Get optional parameters - model = kwargs.get("model", "") - steps = kwargs.get("steps", 20) - seed = kwargs.get("seed", 0) - CFGScale = kwargs.get("CFGScale", 7.0) - positivePrompt = kwargs.get("positivePrompt", "") - negativePrompt = kwargs.get("negativePrompt", "") - controlNetWeight = kwargs.get("controlNetWeight", 0.5) - strength = kwargs.get("strength", 0.5) - scheduler = kwargs.get("scheduler", "DPM++ 2M Karras") - colorFix = kwargs.get("colorFix", False) - tileDiffusion = kwargs.get("tileDiffusion", False) - clipSkip = kwargs.get("clipSkip", 0) - safetyInputs = kwargs.get("safetyInputs", None) - runwareAccelerator = kwargs.get("Accelerator", None) - providerSettings = kwargs.get("providerSettings", None) - imageUpscalerSettingsBundle = kwargs.get("imageUpscalerSettings", None) - useTargetMegapixels = kwargs.get("useTargetMegapixels", False) - - # Build the base configuration - genConfig = { - "taskType": "imageUpscale", - "taskUUID": rwUtils.genRandUUID(), - "inputImage": rwUtils.convertTensor2IMG(image), - "outputFormat": rwUtils.OUTPUT_FORMAT, - "outputQuality": rwUtils.OUTPUT_QUALITY, - "outputType": "URL", - } - - if useUpscaleFactor: - genConfig["upscaleFactor"] = int(kwargs.get("upscaleFactor", 2)) - - # Add model if specified - if model: - genConfig["model"] = model - - if useTargetMegapixels: - genConfig["targetMegapixels"] = int(kwargs.get("targetMegapixels", 4)) - - # Add common parameters at top level - only add if their toggle is enabled - if useSteps: - genConfig["steps"] = steps - if useSeed: - genConfig["seed"] = seed - if useCFGScale: - genConfig["CFGScale"] = CFGScale - if usePrompts: - if positivePrompt: - genConfig["positivePrompt"] = positivePrompt - if negativePrompt: - genConfig["negativePrompt"] = negativePrompt - - # Build settings object for advanced parameters - settings = {} - - # Clarity upscaler specific parameters - if useClarityParams: - settings["controlNetWeight"] = controlNetWeight - settings["strength"] = strength - settings["scheduler"] = scheduler - - # CCSR and Latent upscaler specific parameters - if useCCSRParams: - settings["colorFix"] = colorFix - settings["tileDiffusion"] = tileDiffusion - - # Latent upscaler specific parameters - if useLatentParams: - settings["clipSkip"] = clipSkip - - if ( - imageUpscalerSettingsBundle is not None - and isinstance(imageUpscalerSettingsBundle, dict) - and "settings" in imageUpscalerSettingsBundle - and isinstance(imageUpscalerSettingsBundle["settings"], dict) - ): - settings.update(imageUpscalerSettingsBundle["settings"]) - - # Add settings to config if any settings were specified - if settings: - genConfig["settings"] = settings - - # Add safety inputs if provided - if safetyInputs is not None and isinstance(safetyInputs, dict) and len(safetyInputs) > 0: - genConfig["safety"] = safetyInputs - - # Add accelerator options if provided - if runwareAccelerator is not None and isinstance(runwareAccelerator, dict) and len(runwareAccelerator) > 0: - genConfig["acceleratorOptions"] = runwareAccelerator - - # Handle providerSettings - extract provider name from model and merge with custom settings - if providerSettings is not None: - # Extract provider name from model (e.g., "runware:500@1" -> "runware") - provider_name = model.split(":")[0] if ":" in model and model else "runware" - - # If providerSettings is a dictionary, create the correct API format - if isinstance(providerSettings, dict): - # Create the providerSettings object with provider name as key - final_provider_settings = { - provider_name: providerSettings - } - genConfig["providerSettings"] = final_provider_settings - print(f"[Debugging] Provider settings: {final_provider_settings}") - else: - # If it's just a string, use it directly - genConfig["providerSettings"] = providerSettings - - # Debug: Print the request being sent - print(f"[DEBUG] Sending Image Upscale Request:", flush=True) - print(f"[DEBUG] Request Payload: {rwUtils.safe_json_dumps([genConfig], indent=2)}", flush=True) - - try: - genResult = rwUtils.inferenecRequest([genConfig]) - - # Debug: Print the response received - print(f"[DEBUG] Received Image Upscale Response:", flush=True) - print(f"[DEBUG] Response: {rwUtils.safe_json_dumps(genResult, indent=2)}", flush=True) - except Exception as e: - print(f"[DEBUG] Error in Image Upscale Request: {str(e)}", flush=True) - raise - - images = rwUtils.extractImageURLs(genResult) - return (images,) \ No newline at end of file diff --git a/modules/utils/runwareUtils.py b/modules/utils/runwareUtils.py deleted file mode 100644 index 4d2ad0b..0000000 --- a/modules/utils/runwareUtils.py +++ /dev/null @@ -1,1135 +0,0 @@ -from comfy.model_management import InterruptProcessingException -from requests.adapters import HTTPAdapter -from datetime import datetime, timedelta -from server import PromptServer -from dotenv import load_dotenv -from pathlib import Path -from PIL import Image -import numpy as np -import requests -import hashlib -import asyncio -import random -import base64 -import torch -import uuid -import time -import json -import os -import io -import threading -import re - -from websockets.sync.client import connect as ws_connect -from websockets.exceptions import ConnectionClosed, WebSocketException - -from ..version import __version__ - -load_dotenv() - -def getRunwareApiHeaders(include_auth=True): - headers = { - "Content-Type": "application/json", - "Accept": "application/json", - "Accept-Encoding": "gzip, deflate, br, zstd", - "X-SDK-Name": "comfyui", - "X-SDK-Version": __version__, - } - if include_auth: - api_key = getAPIKey() - if not api_key: - raise Exception( - "Runware API key is not configured. Add your API key in the Runware API Manager node." - ) - headers["Authorization"] = f"Bearer {api_key}" - return headers - -BASEFOLDER = Path(__file__).parent.parent.parent -IMAGE_CACHE_FILE = BASEFOLDER / "imagesCache.json" - -if not IMAGE_CACHE_FILE.exists(): - with open(IMAGE_CACHE_FILE, "w") as f: - print("[Runware] Initializing images cache...") - json.dump({}, f) - -RUNWARE_REMBG_OUTPUT_FORMATS = { - "outputFormat": ( - ["WEBP", "PNG"], - {"default": "WEBP", "tooltip": "Choose the output image format."}, - ) -} - -MAX_RETRIES = 4 -RETRY_COOLDOWNS = [1, 2, 5, 10] - -session = requests.Session() -adapter = HTTPAdapter(pool_connections=10, pool_maxsize=10) -session.mount("http://", adapter) -session.mount("https://", adapter) - -_BASE64_PATTERN = re.compile(r'^(?:data:[^;]+;base64,)?[A-Za-z0-9+/=\s]+$') - -def _truncate_base64_string(value: str, preview_length: int = 20) -> str: - """Return a short preview for base64/data URI strings.""" - if value is None: - return value - - prefix = "" - payload = value - - if value.startswith("data:") and "base64," in value: - prefix, payload = value.split("base64,", 1) - prefix += "base64," - - payload = payload.replace("\n", "").replace("\r", "") - if len(payload) > preview_length: - return f"{prefix}{payload[:preview_length]}...(truncated)" - return value - -def sanitize_for_logging(data, preview_length: int = 20, max_string_length: int = 2048): - """ - Sanitize data structures for debug logging by truncating base64 strings. - """ - if isinstance(data, dict): - return {key: sanitize_for_logging(value, preview_length, max_string_length) for key, value in data.items()} - if isinstance(data, list): - return [sanitize_for_logging(item, preview_length, max_string_length) for item in data] - if isinstance(data, tuple): - return tuple(sanitize_for_logging(item, preview_length, max_string_length) for item in data) - if isinstance(data, str): - stripped = data.strip() - if (len(stripped) > preview_length and _BASE64_PATTERN.match(stripped) - and not stripped.lower().startswith("http")): - return _truncate_base64_string(stripped, preview_length) - if len(data) > max_string_length: - return f"{data[:max_string_length]}...(truncated)" - return data - return data - -def safe_json_dumps(data, **kwargs) -> str: - """Dump JSON after sanitizing potential base64 payloads.""" - sanitized = sanitize_for_logging(data) - return json.dumps(sanitized, **kwargs) - -def generalRequestWrapper(recaller, *args, **kwargs): - for attempt in range(MAX_RETRIES + 1): - try: - return recaller(*args, **kwargs) - except (requests.exceptions.ConnectionError, requests.exceptions.SSLError) as e: - if attempt == MAX_RETRIES: - raise - else: - cooldown = RETRY_COOLDOWNS[attempt] - print(f"[Runware] Error API Request Failed! Retrying in {cooldown} seconds... (Attempt {attempt+1}/{MAX_RETRIES})") - time.sleep(cooldown) - continue - return False - -def getAPIKey(): - apiKey = os.getenv("RUNWARE_API_KEY") - if apiKey and isinstance(apiKey, str) and len(apiKey) > 24: - return apiKey - return False - -def getTimeout(): - timeout = os.getenv("RUNWARE_TIMEOUT") - if timeout and timeout.isdigit(): - return int(timeout) - else: - timeout = 180 - os.environ["RUNWARE_TIMEOUT"] = str(timeout) - return timeout - -def getOutputQuality(): - output_quality = os.getenv("RUNWARE_OUTPUT_QUALITY") - if output_quality and isinstance(output_quality, str) and output_quality.isdigit(): - return int(output_quality) - else: - output_quality = 95 - os.environ["RUNWARE_OUTPUT_QUALITY"] = str(output_quality) - return output_quality - -def getOutputFormat(): - output_format = os.getenv("RUNWARE_OUTPUT_FORMAT") - if output_format and isinstance(output_format, str): - return output_format - else: - output_format = "WEBP" - os.environ["RUNWARE_OUTPUT_FORMAT"] = output_format - return output_format - -def getEnableImagesCaching(): - enable_images_caching = os.getenv("RUNWARE_ENABLE_IMAGES_CACHING") - if enable_images_caching and enable_images_caching.lower() in ["true", "false"]: - return enable_images_caching.lower() == "true" - else: - enable_images_caching = True - os.environ["RUNWARE_ENABLE_IMAGES_CACHING"] = str(enable_images_caching) - return enable_images_caching - -def getMinImageCacheSize(): - min_image_cache_size = os.getenv("RUNWARE_MIN_IMAGE_CACHE_SIZE") - if min_image_cache_size and min_image_cache_size.isdigit(): - return int(min_image_cache_size) - else: - min_image_cache_size = 150 - os.environ["RUNWARE_MIN_IMAGE_CACHE_SIZE"] = str(min_image_cache_size) - return min_image_cache_size - -def getCustomEndpoint(): - custom_endpoint = os.getenv("RUNWARE_CUSTOM_ENDPOINT") - if custom_endpoint and isinstance(custom_endpoint, str): - return custom_endpoint - return "wss://ws-api.runware.ai/v1" - -def usesWebSocketTransport(endpoint=None): - endpoint = endpoint or getCustomEndpoint() - return endpoint.startswith("ws://") or endpoint.startswith("wss://") - -def getRunwareWsHeaders(): - return [ - f"X-SDK-Name: comfyui", - f"X-SDK-Version: {__version__}", - ] - -def getRunwareWsHeadersDict(): - headers = {} - for header in getRunwareWsHeaders(): - key, value = header.split(": ", 1) - headers[key] = value - return headers - -WS_CONNECT_TIMEOUT = 10 -WS_READ_TIMEOUT = 1 - -SESSION_TIMEOUT = getTimeout() -RUNWARE_API_KEY = getAPIKey() -OUTPUT_FORMAT = getOutputFormat() -OUTPUT_QUALITY = getOutputQuality() -ENABLE_IMAGES_CACHING = getEnableImagesCaching() -MIN_IMAGE_CACHE_SIZE = getMinImageCacheSize() -RUNWARE_API_BASE_URL = getCustomEndpoint() - -def refreshRunwareEndpoint(): - global RUNWARE_API_BASE_URL - RUNWARE_API_BASE_URL = getCustomEndpoint() - return RUNWARE_API_BASE_URL - -def setEnvKey(keyName, keyValue): - comfyNodeRoot = Path(__file__).parent.parent.parent - envFilePath = comfyNodeRoot / ".env" - if not envFilePath.exists(): - envFilePath.touch() - with open(envFilePath, "r") as f: - lines = f.readlines() - key_exists = False - new_lines = [] - for line in lines: - if line.startswith(f"{keyName}="): - key_exists = True - new_lines.append(f"{keyName}={keyValue}\n") - else: - new_lines.append(line) - if not key_exists: - new_lines.append(f"{keyName}={keyValue}\n") - with open(envFilePath, "w") as f: - f.writelines(new_lines) - return True - -def setAPIKey(apiKey: str): - global RUNWARE_API_KEY - envSetRes = setEnvKey("RUNWARE_API_KEY", apiKey) - if envSetRes: - RUNWARE_API_KEY = apiKey - os.environ["RUNWARE_API_KEY"] = apiKey - _reset_ws_client() - return True - -def setTimeout(timeout: int): - envSetRes = setEnvKey("RUNWARE_TIMEOUT", str(timeout)) - if envSetRes: - global SESSION_TIMEOUT - SESSION_TIMEOUT = timeout - os.environ["RUNWARE_TIMEOUT"] = str(timeout) - return True - -def setOutputFormat(format: str): - envSetRes = setEnvKey("RUNWARE_OUTPUT_FORMAT", format) - if envSetRes: - global OUTPUT_FORMAT - OUTPUT_FORMAT = format - os.environ["RUNWARE_OUTPUT_FORMAT"] = format - return True - -def setOutputQuality(quality: int): - envSetRes = setEnvKey("RUNWARE_OUTPUT_QUALITY", str(quality)) - if envSetRes: - global OUTPUT_QUALITY - OUTPUT_QUALITY = quality - os.environ["RUNWARE_OUTPUT_QUALITY"] = str(quality) - return True - -def setEnableImagesCaching(enabled: bool): - envSetRes = setEnvKey("RUNWARE_ENABLE_IMAGES_CACHING", str(enabled)) - if envSetRes: - global ENABLE_IMAGES_CACHING - ENABLE_IMAGES_CACHING = enabled - os.environ["RUNWARE_ENABLE_IMAGES_CACHING"] = str(enabled) - return True - -def setMinImageCacheSize(size: int): - envSetRes = setEnvKey("RUNWARE_MIN_IMAGE_CACHE_SIZE", str(size)) - if envSetRes: - global MIN_IMAGE_CACHE_SIZE - MIN_IMAGE_CACHE_SIZE = size - os.environ["RUNWARE_MIN_IMAGE_CACHE_SIZE"] = str(size) - return True - -def genRandSeed(minSeed=1, maxSeed=4294967295): - """Generate a random seed value (32-bit unsigned integer range for compatibility)""" - return random.randint(minSeed, maxSeed) - -def genRandUUID(): - return str(uuid.uuid4()) - -def getOrdinal(num): - """Get ordinal string for number (e.g., 1 -> 'first', 2 -> 'second')""" - ordinals = {1: "first", 2: "second", 3: "third", 4: "fourth"} - return ordinals.get(num, f"{num}th") - - -class RunwareWebSocketClient: - """Persistent WebSocket client for Runware API task requests.""" - - def __init__(self): - self._conn_lock = threading.RLock() - self._pending_lock = threading.Lock() - self._ws = None - self._connection_session_uuid = None - self._reader_thread = None - self._stop_reader = threading.Event() - self._pending = {} - - def close(self): - with self._conn_lock: - self._stop_reader.set() - if self._ws is not None: - try: - self._ws.close() - except Exception: - pass - self._ws = None - if self._reader_thread and self._reader_thread.is_alive(): - self._reader_thread.join(timeout=2) - self._reader_thread = None - with self._pending_lock: - for pending in self._pending.values(): - pending["response"] = {"errors": [{"message": "WebSocket connection closed"}]} - pending["event"].set() - self._pending.clear() - - def _connect(self): - url = getCustomEndpoint() - self._stop_reader.set() - if self._ws is not None: - try: - self._ws.close() - except Exception: - pass - self._ws = None - if self._reader_thread and self._reader_thread.is_alive(): - self._reader_thread.join(timeout=2) - - self._stop_reader.clear() - self._ws = ws_connect( - url, - max_size=None, - additional_headers=getRunwareWsHeadersDict(), - open_timeout=WS_CONNECT_TIMEOUT, - ) - self._reader_thread = threading.Thread( - target=self._reader_loop, - name="RunwareWebSocketReader", - daemon=True, - ) - self._reader_thread.start() - self._authenticate() - - def _ensure_connected(self): - reader_alive = self._reader_thread is not None and self._reader_thread.is_alive() - if self._ws is None or not reader_alive: - self._connect() - return - try: - self._ws.ping() - except Exception: - self._connect() - - def _authenticate(self, api_key=None): - key = api_key or getAPIKey() - if not key: - raise Exception( - "Runware API key is not configured. Add your API key in the Runware API Manager node." - ) - auth_task = { - "taskType": "authentication", - "apiKey": key, - } - if self._connection_session_uuid: - auth_task["connectionSessionUUID"] = self._connection_session_uuid - response = self._send_and_wait([auth_task], timeout=10, is_auth=True) - if "errors" in response: - error_message = response["errors"][0].get("message", "Authentication failed") - raise Exception(error_message) - auth_data = response.get("data", [{}])[0] - session_uuid = auth_data.get("connectionSessionUUID") - if session_uuid: - self._connection_session_uuid = session_uuid - - def _reader_loop(self): - while not self._stop_reader.is_set() and self._ws is not None: - try: - raw = self._ws.recv(timeout=WS_READ_TIMEOUT) - except TimeoutError: - continue - except ConnectionClosed: - break - except WebSocketException as e: - if not self._stop_reader.is_set(): - print(f"[Runware] WebSocket reader error: {e}") - break - - if not raw: - continue - - try: - message = json.loads(raw) - except json.JSONDecodeError: - print(f"[Runware] WebSocket received invalid JSON") - continue - - if self._is_ping_response(message): - continue - - self._dispatch_message(message) - - with self._pending_lock: - for pending in self._pending.values(): - if pending["response"] is None: - pending["response"] = {"errors": [{"message": "WebSocket connection closed"}]} - pending["event"].set() - - @staticmethod - def _is_ping_response(message): - data = message.get("data") or [] - return bool(data) and data[0].get("taskType") == "ping" and data[0].get("pong") - - def _dispatch_message(self, message): - with self._pending_lock: - for pending in list(self._pending.values()): - if pending["response"] is not None: - continue - - if pending["is_auth"]: - if message.get("data") and any( - item.get("taskType") == "authentication" for item in message["data"] - ): - pending["response"] = message - pending["event"].set() - continue - if message.get("errors") and any( - item.get("taskType") == "authentication" for item in message["errors"] - ): - pending["response"] = message - pending["event"].set() - continue - - for item in message.get("data", []): - task_uuid = item.get("taskUUID") - if task_uuid and task_uuid in pending["task_uuids"]: - pending["collected_data"].append(item) - pending["task_uuids"].discard(task_uuid) - - for item in message.get("errors", []): - task_uuid = item.get("taskUUID") - if task_uuid and task_uuid in pending["task_uuids"]: - pending["collected_errors"].append(item) - pending["task_uuids"].discard(task_uuid) - elif ( - not task_uuid - and len(self._pending) == 1 - and pending["task_uuids"] - and len(pending["task_uuids"]) == 1 - ): - pending["collected_errors"].append(item) - pending["task_uuids"].clear() - - if pending["task_uuids"]: - continue - - response = {} - if pending["collected_data"]: - response["data"] = pending["collected_data"] - if pending["collected_errors"]: - response["errors"] = pending["collected_errors"] - if not response: - response = message - pending["response"] = response - pending["event"].set() - - def _send_and_wait(self, gen_config, timeout, is_auth=False): - wait_event = threading.Event() - task_uuids = {task.get("taskUUID") for task in gen_config if task.get("taskUUID")} - pending = { - "event": wait_event, - "response": None, - "task_uuids": set(task_uuids), - "is_auth": is_auth, - "collected_data": [], - "collected_errors": [], - } - pending_id = id(pending) - - with self._pending_lock: - self._pending[pending_id] = pending - - try: - payload = json.dumps(gen_config) - with self._conn_lock: - self._ensure_connected() - self._ws.send(payload) - - if not wait_event.wait(timeout): - raise TimeoutError(f"WebSocket request timed out after {timeout} seconds") - - if pending["response"] is None: - raise Exception("WebSocket request failed: empty response") - return pending["response"] - finally: - with self._pending_lock: - self._pending.pop(pending_id, None) - - def request(self, gen_config, timeout): - def recaller(): - return self._send_and_wait(gen_config, timeout=timeout) - - return wsRequestWrapper(recaller) - - -_ws_client = None -_ws_client_lock = threading.Lock() - - -def _get_ws_client(): - global _ws_client - with _ws_client_lock: - if _ws_client is None: - _ws_client = RunwareWebSocketClient() - return _ws_client - - -def _reset_ws_client(): - global _ws_client - with _ws_client_lock: - if _ws_client is not None: - _ws_client.close() - _ws_client = None - - -def wsRequestWrapper(recaller): - for attempt in range(MAX_RETRIES + 1): - try: - return recaller() - except ( - WebSocketException, - ConnectionClosed, - ConnectionError, - OSError, - TimeoutError, - ): - if attempt == MAX_RETRIES: - raise - cooldown = RETRY_COOLDOWNS[attempt] - print( - f"[Runware] WebSocket request failed! Retrying in {cooldown} seconds..." - f" (Attempt {attempt + 1}/{MAX_RETRIES})" - ) - time.sleep(cooldown) - _reset_ws_client() - continue - return False - - -def checkAPIKeyWithWebSocket(apiKey): - url = getCustomEndpoint() - ws = None - try: - ws = ws_connect( - url, - max_size=None, - additional_headers=getRunwareWsHeadersDict(), - open_timeout=WS_CONNECT_TIMEOUT, - ) - ws.send(json.dumps([{"taskType": "authentication", "apiKey": apiKey}])) - response = json.loads(ws.recv()) - errors = response.get("errors") or [] - if errors: - return str(errors[0].get("message", "Authentication failed")) - return True - except Exception: - return False - finally: - if ws is not None: - try: - ws.close() - except Exception: - pass - - -def checkAPIKey(apiKey): - endpoint = refreshRunwareEndpoint() - if usesWebSocketTransport(endpoint): - return checkAPIKeyWithWebSocket(apiKey) - - headers = getRunwareApiHeaders(include_auth=False) - genConfig = [ - { - "taskType": "authentication", - "apiKey": apiKey, - } - ] - - try: - - def recaller(): - return session.post( - RUNWARE_API_BASE_URL, - headers=headers, - json=genConfig, - timeout=10, - allow_redirects=False, - stream=True, - ) - - genResult = generalRequestWrapper(recaller) - genResult = genResult.json() - if "errors" in genResult: - return str(genResult["errors"][0]["message"]) - else: - return True - except Exception as e: - return False - -def sendMediaUUID(mediaUUID, nodeID): - PromptServer.instance.send_sync( - "runwareMediaUUID", - { - "success": True, - "mediaUUID": mediaUUID, - "nodeID": nodeID, - "widgetName": "mediaUUID", # Target the mediaUUID widget - }, - ) - - -def sendSave3DFilepath(filepath, nodeID): - PromptServer.instance.send_sync( - "runwareSave3DFilepath", - { - "success": True, - "filepath": filepath, - "nodeID": nodeID, - "widgetName": "filepath", - }, - ) - -def sendImageCaption(captionText, nodeID): - PromptServer.instance.send_sync( - "runwareImageCaption", - { - "success": True, - "captionText": captionText, - "nodeID": nodeID, - "widgetName": "imageCaption", # Target the new imageCaption widget - }, - ) - - -def sendSaveText(text, nodeID): - """Push text into Runware Save Text node's textarea (ComfyUI does not mirror linked STRING inputs visually).""" - PromptServer.instance.send_sync( - "runwareSaveText", - { - "success": True, - "text": text if text is not None else "", - "nodeID": nodeID, - "widgetName": "text", - }, - ) - -def sendVideoTranscription(transcriptionText, nodeID): - PromptServer.instance.send_sync( - "runwareVideoTranscription", - { - "success": True, - "transcriptionText": transcriptionText, - "nodeID": nodeID, - "widgetName": "prompt", # Target the prompt widget (matching imageCaptioning pattern) - }, - ) - - -def sendVideoOutputs(draftId, videoId, nodeID): - """Send draftId and videoId to frontend for display in Video Inference Outputs node textboxes.""" - PromptServer.instance.send_sync( - "runwareVideoOutputs", - { - "success": True, - "draftId": draftId or "", - "videoId": videoId or "", - "nodeID": nodeID, - }, - ) - -def inferenecRequest(genConfig): - global RUNWARE_API_KEY, SESSION_TIMEOUT - RUNWARE_API_KEY = os.getenv("RUNWARE_API_KEY") - SESSION_TIMEOUT = int(os.getenv("RUNWARE_TIMEOUT")) - endpoint = refreshRunwareEndpoint() - - if usesWebSocketTransport(endpoint): - try: - genResult = _get_ws_client().request(genConfig, timeout=SESSION_TIMEOUT) - except TimeoutError: - raise Exception( - f"Error: Request Timed Out After {SESSION_TIMEOUT} Seconds - Please Try Again!" - ) - except Exception as e: - if "invalid api key" in str(e).lower(): - PromptServer.instance.send_sync( - "runwareError", - { - "success": False, - "errorMessage": str(e), - "errorCode": 401, - }, - ) - raise InterruptProcessingException() - raise Exception(f"Error: {e}") - - if "errors" in genResult: - print(f"[DEBUG] API Error Response: {safe_json_dumps(genResult, indent=2) if isinstance(genResult, dict) else genResult}") - error_obj = genResult["errors"][0] - error_message = error_obj.get("message", "Unknown error") - - if "allowedValues" in error_obj: - allowed_values = error_obj["allowedValues"] - error_message += f"\n\nAllowed values:\n" + "\n".join(f" - {val}" for val in allowed_values) - - if "documentation" in error_obj: - error_message += f"\n\nDocumentation: {error_obj['documentation']}" - - raise Exception(error_message) - return genResult - - headers = getRunwareApiHeaders() - - try: - def recaller(): - return session.post( - RUNWARE_API_BASE_URL, - headers=headers, - json=genConfig, - timeout=SESSION_TIMEOUT, - allow_redirects=False, - stream=True, - ) - - genResult = generalRequestWrapper(recaller) - try: - genResult = genResult.json() - except json.JSONDecodeError as e: - print(f"[Debugging] Runware JSON Decode Error: {str(e)}") - print(f"[Debugging] Runware Response Status Code: {genResult.status_code}") - print(f"[Debugging] Runware Response Headers: {genResult.headers}") - print(f"[Debugging] Runware Raw Response Content: {genResult.content}") - raise Exception("Error: Invalid JSON response from API!") - if "errors" in genResult: - print(f"[DEBUG] API Error Response: {safe_json_dumps(genResult, indent=2) if isinstance(genResult, dict) else genResult}") - error_obj = genResult["errors"][0] - error_message = error_obj.get("message", "Unknown error") - - # Add allowedValues if present - if "allowedValues" in error_obj: - allowed_values = error_obj["allowedValues"] - error_message += f"\n\nAllowed values:\n" + "\n".join(f" - {val}" for val in allowed_values) - - # Add documentation link if present - if "documentation" in error_obj: - error_message += f"\n\nDocumentation: {error_obj['documentation']}" - - raise Exception(error_message) - else: - return genResult - except requests.exceptions.Timeout: - raise Exception( - f"Error: Request Timed Out After {SESSION_TIMEOUT} Seconds - Please Try Again!" - ) - except requests.exceptions.RequestException: - raise Exception("Error: Runware Request Failed!") - except Exception as e: - if "invalid api key" in str(e).lower(): - PromptServer.instance.send_sync( - "runwareError", - { - "success": False, - "errorMessage": str(e), - "errorCode": 401, - }, - ) - raise InterruptProcessingException() - else: - raise Exception(f"Error: {e}") - return False - - -async def uploadImage(imageDataUri): - uploadTaskConfig = [ - {"taskType": "imageUpload", "taskUUID": genRandUUID(), "image": imageDataUri} - ] - - try: - uploadResult = inferenecRequest(uploadTaskConfig) - if ( - uploadResult - and "data" in uploadResult - and "imageUUID" in uploadResult["data"][0] - ): - imageUUID = uploadResult["data"][0]["imageUUID"] - return imageUUID - except Exception as e: - return False - - return False - -async def uploadAndCacheImage(imgSig: str, imgDataUri: str): - try: - imageUUID = await uploadImage(imgDataUri) - if imageUUID: - await imageStoreSet(imgSig, imageUUID) - except Exception as e: - return False - -async def imageStoreSet(imgHash: str, imgUUID: str) -> bool: - try: - with open(IMAGE_CACHE_FILE, "r") as f: - cache = json.load(f) - expires = (datetime.now() + timedelta(days=30)).isoformat() - cache[imgHash] = {"uuid": imgUUID, "expires": expires} - with open(IMAGE_CACHE_FILE, "w") as f: - json.dump(cache, f, indent=2) - return True - except Exception as e: - return False - -def imageStoreGet(imgHash: str) -> str | bool: - try: - with open(IMAGE_CACHE_FILE, "r") as f: - cache = json.load(f) - if imgHash not in cache: - return False - entry = cache[imgHash] - expires = datetime.fromisoformat(entry["expires"]) - if datetime.now() > expires: - del cache[imgHash] - with open(IMAGE_CACHE_FILE, "w") as f: - json.dump(cache, f, indent=2) - return False - return entry["uuid"] - except Exception as e: - return False - -def convertTensor2IMG(tensorImage): - global ENABLE_IMAGES_CACHING, MIN_IMAGE_CACHE_SIZE - ENABLE_IMAGES_CACHING = getEnableImagesCaching() - MIN_IMAGE_CACHE_SIZE = int(os.getenv("RUNWARE_MIN_IMAGE_CACHE_SIZE")) - - imageNP = (tensorImage.squeeze().numpy() * 255).astype(np.uint8) - imgSig = hashlib.sha256(imageNP.tobytes()).hexdigest() - - if ENABLE_IMAGES_CACHING: - imgUUID = imageStoreGet(imgSig) - if imgUUID: - return imgUUID - - image = Image.fromarray(imageNP) - with io.BytesIO() as buffer: - image.save(buffer, format="PNG") - imageRawData = buffer.getvalue() - imgBytes = len(imageRawData) - imgSize = int(imgBytes / 1024) - imgb64 = base64.b64encode(imageRawData).decode("utf-8") - imgDataUri = f"data:image/png;base64,{imgb64}" - - if ENABLE_IMAGES_CACHING and imgSize >= MIN_IMAGE_CACHE_SIZE: - try: - loop = asyncio.get_running_loop() - loop.call_soon(lambda: asyncio.ensure_future(uploadAndCacheImage(imgSig, imgDataUri))) - except RuntimeError: - def run_coro(): - new_loop = asyncio.new_event_loop() - asyncio.set_event_loop(new_loop) - new_loop.run_until_complete(uploadAndCacheImage(imgSig, imgDataUri)) - new_loop.close() - threading.Thread(target=run_coro).start() - return imgDataUri - - -def convertTensor2IMGBase64Only(tensorImage): - """Convert tensor to base64 data URI without caching - for frame images""" - imageNP = (tensorImage.squeeze().numpy() * 255).astype(np.uint8) - image = Image.fromarray(imageNP) - - with io.BytesIO() as buffer: - image.save(buffer, format="PNG") - imageRawData = buffer.getvalue() - imgb64 = base64.b64encode(imageRawData).decode("utf-8") - imgDataUri = f"data:image/png;base64,{imgb64}" - - return imgDataUri - - -def convertTensor2IMGForVideo(tensorImage): - """Convert tensor to image and force upload to get UUID for video frame images""" - imageNP = (tensorImage.squeeze().numpy() * 255).astype(np.uint8) - imgSig = hashlib.sha256(imageNP.tobytes()).hexdigest() - - # Check if already cached - imgUUID = imageStoreGet(imgSig) - if imgUUID: - return imgUUID - - # Convert to data URI - use PNG for video frame images - image = Image.fromarray(imageNP) - with io.BytesIO() as buffer: - image.save(buffer, format="PNG") - imageRawData = buffer.getvalue() - imgb64 = base64.b64encode(imageRawData).decode("utf-8") - imgDataUri = f"data:image/png;base64,{imgb64}" - - # Force upload to get UUID - use synchronous approach to avoid event loop conflicts - try: - # Use synchronous upload instead of async - uploadTaskConfig = [ - {"taskType": "imageUpload", "taskUUID": genRandUUID(), "image": imgDataUri} - ] - - uploadResult = inferenecRequest(uploadTaskConfig) - if ( - uploadResult - and "data" in uploadResult - and "imageUUID" in uploadResult["data"][0] - ): - uploaded_uuid = uploadResult["data"][0]["imageUUID"] - - # Cache the UUID synchronously - try: - with open(IMAGE_CACHE_FILE, "r") as f: - cache = json.load(f) - expires = (datetime.now() + timedelta(days=30)).isoformat() - cache[imgSig] = {"uuid": uploaded_uuid, "expires": expires} - with open(IMAGE_CACHE_FILE, "w") as f: - json.dump(cache, f, indent=2) - except Exception as e: - print(f"[Warning] Error caching image: {e}") - - return uploaded_uuid - else: - print("[Warning] Failed to upload image, returning data URI") - return imgDataUri - except Exception as e: - print(f"[Warning] Error uploading image: {e}") - return imgDataUri - -def convertIMG2Tensor(b64img): - imgbytes = base64.b64decode(b64img) - image = Image.open(io.BytesIO(imgbytes)) - imageNP = np.array(image).astype(np.float32) / 255.0 - tensorImage = torch.from_numpy(imageNP).squeeze() - return tensorImage - -def extractImageURLs(imageDataObject): - """Extract image URLs from API response and return as comma-separated string""" - image_urls = [] - for result in imageDataObject.get("data", []): - imageURL = result.get("imageURL") - if imageURL: - image_urls.append(imageURL) - return ",".join(image_urls) if image_urls else "" - -def convertImageB64List(imageDataObject): - images = () - for result in imageDataObject["data"]: - generatedImage = result.get( - "imageBase64Data", - result.get( - "maskImageBase64Data", result.get("guideImageBase64Data", False) - ), - ) - if generatedImage: - # Handle base64 data - generatedImage = convertIMG2Tensor(generatedImage) - images += (generatedImage,) - else: - # If no base64 data, try to get image URL - imageURL = result.get("imageURL") - if imageURL: - # Download image from URL and convert to tensor - try: - response = requests.get(imageURL, timeout=30) - response.raise_for_status() - image = Image.open(io.BytesIO(response.content)) - imageNP = np.array(image).astype(np.float32) / 255.0 - tensorImage = torch.from_numpy(imageNP).squeeze() - images += (tensorImage,) - except Exception as e: - print(f"[Error] Failed to download image from URL {imageURL}: {str(e)}") - raise Exception(f"Failed to download image from URL: {str(e)}") - images = torch.stack(images, dim=0) - return images - -class VideoObject: - def __init__(self, video_url, width=None, height=None): - self.video_url = video_url - self.video_path = None # Will be set after download - # Use provided dimensions or default to 864x480 for Seedance Lite - self.width = width if width is not None else 864 - self.height = height if height is not None else 480 - - def get_dimensions(self): - return (self.width, self.height) - - def save_to(self, filename, **kwargs): - """Save video to file by downloading from URL with retry logic""" - # If video URL is empty, this is a placeholder object (e.g., when only audio is returned) - if not self.video_url or self.video_url.strip() == "": - print(f"[Video Download] Skipping download - empty video URL (placeholder object)") - return False - - max_retries = 10 - retry_delays = [2, 5, 10, 15, 20] # Longer delays for retries with larger videos - - for attempt in range(max_retries): - try: - response = requests.get(self.video_url, stream=True, timeout=30) - print(f"[Video Download] Attempt {attempt + 1}: {response}") - - if response.status_code == 422: - print(f"[Video Download] Server still processing, waiting...") - time.sleep(retry_delays[min(attempt, len(retry_delays) - 1)]) - continue - - if response.status_code == 502: - print(f"[Video Download] Server error (502), retrying in {retry_delays[min(attempt, len(retry_delays) - 1)]} seconds...") - time.sleep(retry_delays[min(attempt, len(retry_delays) - 1)]) - continue - - response.raise_for_status() - - with open(filename, 'wb') as f: - for chunk in response.iter_content(chunk_size=8192): - f.write(chunk) - - print(f"[Video Download] Successfully downloaded video to {filename}") - self.video_path = filename # Store the downloaded path - return True - - except requests.exceptions.RequestException as e: - print(f"[Video Download] Attempt {attempt + 1} failed: {e}") - if attempt < max_retries - 1: - time.sleep(retry_delays[min(attempt, len(retry_delays) - 1)]) - continue - else: - print(f"[Video Download] All {max_retries} attempts failed. Video URL: {self.video_url}") - return False - except Exception as e: - print(f"[Video Download] Unexpected error: {e}") - return False - - return False - - def __str__(self): - return f"VideoObject(url={self.video_url}, path={self.video_path}, dimensions={self.width}x{self.height})" - -def convertVideoB64List(videoDataObject, width=None, height=None): - videos = () - for result in videoDataObject["data"]: - generatedVideo = result.get("videoBase64Data", False) - if generatedVideo: - # For base64 data, create a video object (would need proper decoding in full implementation) - video_obj = VideoObject(f"data:video/mp4;base64,{generatedVideo}", width, height) - videos += (video_obj,) - else: - # If no base64 data, try to get video URL (check both mediaURL and videoURL) - videoURL = result.get("mediaURL") or result.get("videoURL") - if videoURL: - # Create a proper video object that ComfyUI can handle - video_obj = VideoObject(videoURL, width, height) - videos += (video_obj,) - return videos - -def pollVideoResult(taskUUID): - """Poll async task result with taskType getResponse (video, audio, text inference, etc.).""" - endpoint = refreshRunwareEndpoint() - - pollConfig = [ - { - "taskType": "getResponse", - "taskUUID": taskUUID, - } - ] - - if usesWebSocketTransport(endpoint): - try: - pollResult = _get_ws_client().request(pollConfig, timeout=30) - except Exception as e: - print(f"[Debugging] Poll request failed: {str(e)}") - return None - - if "errors" in pollResult: - print(f"[Debugging] Poll error: {safe_json_dumps(pollResult, indent=2) if isinstance(pollResult, (dict, list)) else pollResult}") - return pollResult - return pollResult - - headers = getRunwareApiHeaders() - - try: - def recaller(): - return session.post( - RUNWARE_API_BASE_URL, - headers=headers, - json=pollConfig, - timeout=30, # Shorter timeout for polling - allow_redirects=False, - stream=True, - ) - - pollResult = generalRequestWrapper(recaller) - try: - pollResult = pollResult.json() - except json.JSONDecodeError as e: - print(f"[Debugging] Runware Poll JSON Decode Error: {str(e)}") - return None - - if "errors" in pollResult: - print(f"[Debugging] Poll error: {safe_json_dumps(pollResult, indent=2) if isinstance(pollResult, (dict, list)) else pollResult}") - return pollResult - else: - return pollResult - except Exception as e: - print(f"[Debugging] Poll request failed: {str(e)}") - return None - - -# Alias: getResponse is the generic async poll for any task type. -pollGetResponse = pollVideoResult diff --git a/modules/vaeSearch.py b/modules/vaeSearch.py deleted file mode 100644 index 8fb27c0..0000000 --- a/modules/vaeSearch.py +++ /dev/null @@ -1,69 +0,0 @@ -class vaeSearch: - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "VAE Search": ("STRING", { - "tooltip": "Search For A Specific VAE By Name Or Civit AIR Code (eg: ClearVAE).", - }), - "Model Architecture": ([ - "All", - "FLUX.1-Schnell", - "FLUX.1-Dev", - "FLUX.1 Krea", - "Pony", - "SD 1.5", - "SD 1.5 Hyper", - "SD 1.5 LCM", - "SD 3", - "SDXL 1.0", - "SDXL 1.0 LCM", - "SDXL Distilled", - "SDXL Hyper", - "SDXL Lightning", - "SDXL Turbo", - ], { - "tooltip": "Choose VAE's Model Architecture To Filter Out The Results.", - "default": "SD 1.5", - }), - "VAEList": ([ - "civitai:23906@28569 (kl-f8-anime2 VAE)", - "civitai:22354@88156 (ClearVAE(SD1.5))", - "civitai:276082@311162 (vae-ft-mse-840000-ema-pruned | 840000 | 840k SD1.5 VAE)", - "civitai:70248@83798 (Color101 VAE)", - "civitai:22354@26689 (ClearVAE (SD1.5))", - "civitai:88390@94036 (difConsistency RAW VAE (Pack))", - ], { - "tooltip": "VAE Results Will Show UP Here So You Could Choose From.", - "default": "civitai:23906@28569 (kl-f8-anime2 VAE)", - }), - "Use Search Value": ("BOOLEAN", { - "tooltip": "When Enabled, the value you've set in the search input will be used instead.\n\nThis is useful in case the model search API is down or you prefer to set the model manually.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - }, - } - - DESCRIPTION = "Directly Search and Connect VAE's to Runware Inference Nodes In ComfyUI." - FUNCTION = "vaeSearch" - RETURN_TYPES = ("RUNWAREVAE",) - RETURN_NAMES = ("Runware VAE",) - CATEGORY = "Runware" - - @classmethod - def VALIDATE_INPUTS(cls, VAEList): - return True - - def vaeSearch(self, **kwargs): - enableSearchValue = kwargs.get("Use Search Value", False) - searchInput = kwargs.get("VAE Search") - - if enableSearchValue: - modelAIRCode = searchInput - else: - crModel = kwargs.get("VAEList") - modelAIRCode = crModel.split(" ")[0] - - return (modelAIRCode,) \ No newline at end of file diff --git a/modules/vectorize.py b/modules/vectorize.py deleted file mode 100644 index 6dc200a..0000000 --- a/modules/vectorize.py +++ /dev/null @@ -1,209 +0,0 @@ -import re - -from .utils import runwareUtils as rwUtils - - -class vectorize: - """Vectorize node for converting images to vector format""" - - # Models grouped by architecture (provider), same pattern as video model search - VECTORIZE_MODELS = { - "Recraft": [ - "recraft:1@1 (Recraft 1)", - "recraft:v4-pro@vector (Recraft V4 Pro Vector)", - "recraft:v4@vector (Recraft V4 Vector)", - ], - "Picsart": [ - "picsart:1@1 (Picsart 1)", - ], - } - - MODEL_ARCHITECTURES = [ - "All", - "Recraft", - "Picsart", - ] - - @classmethod - def _getAllModels(cls): - """Get all models from all architectures""" - all_models = [] - for models in cls.VECTORIZE_MODELS.values(): - all_models.extend(models) - return all_models - - @classmethod - def INPUT_TYPES(cls): - all_models = cls._getAllModels() - default_model = all_models[0] if all_models else "recraft:1@1 (Recraft 1)" - return { - "required": { - "Model Search": ("STRING", { - "tooltip": "Search for a vectorization model by name or AIR code (e.g. recraft, picsart).", - }), - "Model Architecture": (cls.MODEL_ARCHITECTURES, { - "tooltip": "Choose model architecture to filter the model list.", - "default": "Recraft", - }), - "Vector Model List": (all_models, { - "tooltip": "Select the vectorization model. Filter by Model Architecture above.", - "default": default_model, - }), - "Use Search Value": ("BOOLEAN", { - "tooltip": "When enabled, the value in Model Search is used as the model AIR code instead of the list selection.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - }, - "optional": { - "Image": ("IMAGE", { - "tooltip": "Optional input image to be vectorized." - }), - "dimensions": ([ - "None", "Square HD (1024x1024)", "Custom" - ], { - "default": "None", - "tooltip": "Output dimensions preset. Select 'None' for model default, or a preset to set width/height. Use 'Custom' with width/height inputs.", - }), - "width": ("INT", { - "tooltip": "Width in pixels. Used when dimensions is not 'None' (or with Custom).", - "default": 1024, - "min": 128, - "max": 6048, - "step": 1, - }), - "height": ("INT", { - "tooltip": "Height in pixels. Used when dimensions is not 'None' (or with Custom).", - "default": 1024, - "min": 128, - "max": 6048, - "step": 1, - }), - "Use positivePrompt": ("BOOLEAN", { - "tooltip": "When enabled, include positivePrompt in the vectorize request.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "positivePrompt": ("STRING", { - "multiline": True, - "tooltip": "Optional text prompt for vectorization. Only sent when Use Positive Prompt is enabled.", - }), - "providerSettings": ("RUNWAREPROVIDERSETTINGS", { - "tooltip": "Connect a Runware Provider Settings Node to configure provider-specific parameters (e.g. Recraft, Picsart).", - }), - }, - } - - DESCRIPTION = "Convert images to vector format using Runware's vectorization service." - FUNCTION = "vectorizeImage" - RETURN_TYPES = ("STRING",) - RETURN_NAMES = ("IMAGE",) - CATEGORY = "Runware" - - @classmethod - def VALIDATE_INPUTS(cls, **kwargs): - return True - - def vectorizeImage(self, **kwargs): - """Vectorize image and return SVG URL""" - image = kwargs.get("Image") - use_search_value = kwargs.get("Use Search Value", False) - search_input = kwargs.get("Model Search", "") - current_model = kwargs.get("Vector Model List", "recraft:1@1 (Recraft 1)") - - if use_search_value and search_input and str(search_input).strip(): - model_air_code = str(search_input).strip() - else: - # Extract AIR code from "airId (Display Name)" format - model_air_code = current_model.split(" (")[0].strip() - - image_uuid = rwUtils.convertTensor2IMG(image) if image is not None else None - width = kwargs.get("width") - height = kwargs.get("height") - dimensions = kwargs.get("dimensions", "None") - use_positive_prompt = kwargs.get("Use positivePrompt", False) - positive_prompt = kwargs.get("positivePrompt") - provider_settings = kwargs.get("providerSettings") - gen_config = self._buildGenConfig( - model_air_code, image_uuid, - width=width, height=height, dimensions=dimensions, - use_positive_prompt=use_positive_prompt, positive_prompt=positive_prompt, - provider_settings=provider_settings, - ) - - print(f"[DEBUG] Sending Vectorize Request:") - print(f"[DEBUG] Request Payload: {rwUtils.safe_json_dumps(gen_config, indent=2)}") - - gen_result = rwUtils.inferenecRequest(gen_config) - print(f"[DEBUG] Received Vectorize Response:") - print(f"[DEBUG] Response: {rwUtils.safe_json_dumps(gen_result, indent=2)}") - - self._validateResponse(gen_result) - svg_url = rwUtils.extractImageURLs(gen_result) - return (svg_url,) - - @staticmethod - def _parseDimensionsPreset(dimensions): - """Parse 'Label (WxH)' to (width, height) or None if not a preset.""" - if not dimensions or dimensions in ("None", "Custom"): - return None, None - m = re.search(r"\((\d+)x(\d+)\)", dimensions) - if m: - return int(m.group(1)), int(m.group(2)) - return None, None - - def _buildGenConfig(self, model, image_uuid, width=None, height=None, dimensions="None", - use_positive_prompt=False, positive_prompt=None, provider_settings=None): - """Build generation configuration for API request. image_uuid, width, height, positivePrompt, providerSettings are optional.""" - inputs = {} - if image_uuid is not None: - inputs["image"] = image_uuid - payload = { - "taskType": "vectorize", - "taskUUID": rwUtils.genRandUUID(), - "model": model, - "inputs": inputs, - "outputType": "URL", - "outputFormat": "svg", - } - if dimensions and dimensions != "None": - w, h = width, height - if w is None or h is None: - pw, ph = self._parseDimensionsPreset(dimensions) - if pw is not None and ph is not None: - w, h = pw, ph - if w is not None and h is not None: - payload["width"] = w - payload["height"] = h - if use_positive_prompt and positive_prompt is not None and str(positive_prompt).strip(): - payload["positivePrompt"] = str(positive_prompt).strip() - # Handle providerSettings - extract provider name from model and merge (same as image inference) - if provider_settings is not None: - provider_name = model.split(":")[0] if ":" in model else model - if isinstance(provider_settings, dict): - if any(key in provider_settings for key in ["alibaba", "bytedance", "klingai", "openai", "pixverse", - "bria", "lightricks", "luma", "minimax", "runway", "vidu", - "elevenlabs", "bfl", "xai", "recraft", "picsart", "sourceful"]): - payload["providerSettings"] = provider_settings - else: - payload["providerSettings"] = {provider_name: provider_settings} - else: - payload["providerSettings"] = provider_settings - return [payload] - - def _validateResponse(self, gen_result): - """Validate API response""" - if "errors" in gen_result: - error_message = gen_result["errors"][0]["message"] - raise Exception(f"Vectorization failed: {error_message}") - - -NODE_CLASS_MAPPINGS = { - "RunwareVectorize": vectorize, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareVectorize": "Runware Vectorize", -} diff --git a/modules/version.py b/modules/version.py deleted file mode 100644 index 2cbc28c..0000000 --- a/modules/version.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "1.9.2" diff --git a/modules/videoAdvancedFeatureInputs.py b/modules/videoAdvancedFeatureInputs.py deleted file mode 100644 index 6c613cf..0000000 --- a/modules/videoAdvancedFeatureInputs.py +++ /dev/null @@ -1,121 +0,0 @@ -from typing import Dict, Any - -class videoAdvancedFeatureInputs: - """Runware Video Advanced Feature Inputs Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useVideoCFGScale": ("BOOLEAN", { - "tooltip": "Enable to include videoCFGScale parameter in API request.", - "default": False, - }), - "videoCFGScale": ("FLOAT", { - "tooltip": "CFG scale for video generation. Only used when 'Use Video CFG Scale' is enabled.", - "default": None, - "min": 0.0, - "max": 30.0, - "step": 0.1, - }), - "useAudioCFGScale": ("BOOLEAN", { - "tooltip": "Enable to include audioCFGScale parameter in API request.", - "default": False, - }), - "audioCFGScale": ("FLOAT", { - "tooltip": "CFG scale for audio generation. Only used when 'Use Audio CFG Scale' is enabled.", - "default": None, - "min": 0.0, - "max": 30.0, - "step": 0.1, - }), - "useVideoNegativePrompt": ("BOOLEAN", { - "tooltip": "Enable to include videoNegativePrompt parameter in API request.", - "default": False, - }), - "videoNegativePrompt": ("STRING", { - "tooltip": "Negative prompt for video generation. Only used when 'Use Video Negative Prompt' is enabled.", - "multiline": True, - "default": "", - }), - "useAudioNegativePrompt": ("BOOLEAN", { - "tooltip": "Enable to include audioNegativePrompt parameter in API request.", - "default": False, - }), - "audioNegativePrompt": ("STRING", { - "tooltip": "Negative prompt for audio generation. Only used when 'Use Audio Negative Prompt' is enabled.", - "multiline": True, - "default": "", - }), - "useSlgLayer": ("BOOLEAN", { - "tooltip": "Enable to include slgLayer parameter in API request.", - "default": False, - }), - "slgLayer": ("INT", { - "tooltip": "SLG layer setting. Only used when 'Use SLG Layer' is enabled.", - "default": None, - "min": 0, - "max": 100, - }), - "Advanced Feature Settings": ("RUNWAREWANANIMATEADVANCEDFEATURESETTINGS", { - "tooltip": "Connect Runware Wan Animate Advanced Feature Settings node to provide Wan Animate configuration for character animation and replacement.", - }), - } - } - - RETURN_TYPES = ("RUNWAREVIDEOADVANCEDFEATUREINPUTS",) - RETURN_NAMES = ("Video Advanced Feature Inputs",) - FUNCTION = "create_advanced_feature_inputs" - CATEGORY = "Runware" - DESCRIPTION = "Configure advanced video feature inputs including CFG scales, negative prompts, and SLG layer settings." - - def create_advanced_feature_inputs(self, **kwargs) -> tuple[Dict[str, Any]]: - """Create video advanced feature inputs dictionary""" - - # Get use parameters - useVideoCFGScale = kwargs.get("useVideoCFGScale", False) - useAudioCFGScale = kwargs.get("useAudioCFGScale", False) - useVideoNegativePrompt = kwargs.get("useVideoNegativePrompt", False) - useAudioNegativePrompt = kwargs.get("useAudioNegativePrompt", False) - useSlgLayer = kwargs.get("useSlgLayer", False) - - # Get actual parameters - videoCFGScale = kwargs.get("videoCFGScale", None) - audioCFGScale = kwargs.get("audioCFGScale", None) - videoNegativePrompt = kwargs.get("videoNegativePrompt", None) - audioNegativePrompt = kwargs.get("audioNegativePrompt", None) - slgLayer = kwargs.get("slgLayer", None) - wanAnimateSettings = kwargs.get("Advanced Feature Settings", None) - - # Build advanced feature inputs dictionary - only include when use* is enabled - advanced_inputs = {} - - if useVideoCFGScale and videoCFGScale is not None: - advanced_inputs["videoCFGScale"] = videoCFGScale - if useAudioCFGScale and audioCFGScale is not None: - advanced_inputs["audioCFGScale"] = audioCFGScale - if useVideoNegativePrompt and videoNegativePrompt is not None and videoNegativePrompt.strip() != "": - advanced_inputs["videoNegativePrompt"] = videoNegativePrompt.strip() - if useAudioNegativePrompt and audioNegativePrompt is not None and audioNegativePrompt.strip() != "": - advanced_inputs["audioNegativePrompt"] = audioNegativePrompt.strip() - if useSlgLayer and slgLayer is not None: - advanced_inputs["slgLayer"] = slgLayer - - # Merge advanced feature settings if provided (similar to how providerSettings are merged) - if wanAnimateSettings is not None and isinstance(wanAnimateSettings, dict) and len(wanAnimateSettings) > 0: - # Merge the settings dictionary directly into advanced_inputs - # The settings dict should already contain the correct structure (e.g., {"wanAnimate": {...}}) - advanced_inputs.update(wanAnimateSettings) - - return (advanced_inputs,) - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareVideoAdvancedFeatureInputs": videoAdvancedFeatureInputs, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareVideoAdvancedFeatureInputs": "Runware Video Advanced Feature Inputs", -} - diff --git a/modules/videoBgRemoval.py b/modules/videoBgRemoval.py deleted file mode 100644 index 26c17e8..0000000 --- a/modules/videoBgRemoval.py +++ /dev/null @@ -1,145 +0,0 @@ -from .utils import runwareUtils as rwUtils -import comfy.model_management - - -class videoBgRemoval: - """Video Background Removal node for removing video backgrounds""" - - RUNWARE_VRMBG_MODELS = { - "bria:51@1": "bria:51@1", - } - - BACKGROUND_COLORS = { - "Black [0, 0, 0, 1]": [0, 0, 0, 1], - "White [255, 255, 255, 0]": [255, 255, 255, 0], - "Gray [128, 128, 128, 0]": [128, 128, 128, 0], - "Red [255, 0, 0, 0]": [255, 0, 0, 0], - "Green [0, 255, 0, 0]": [0, 255, 0, 0], - "Blue [0, 0, 255, 0]": [0, 0, 255, 0], - "Yellow [255, 255, 0, 0]": [255, 255, 0, 0], - "Cyan [0, 255, 255, 0]": [0, 255, 255, 0], - "Magenta [255, 0, 255, 0]": [255, 0, 255, 0], - "Orange [255, 165, 0, 0]": [255, 165, 0, 0], - } - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Video": ("STRING", { - "tooltip": "MediaUUID from Runware Media Upload node for the video to process (max 30 seconds). Supports resolution up to 16000x16000 (16K)." - }), - "Model": (list(cls.RUNWARE_VRMBG_MODELS.keys()), { - "tooltip": "Select the video background removal model to use.", - "default": "Bria Video Background Removal", - }), - }, - "optional": { - "Background Color": (list(cls.BACKGROUND_COLORS.keys()), { - "default": "White", - "tooltip": "Background color preset to use. Hex values are not supported.", - }), - "Output Format": (["mp4", "webm", "mov"], { - "default": "mp4", - "tooltip": "Choose the output video format.", - }), - } - } - - DESCRIPTION = "Remove complex or moving video backgrounds in real time, isolating subjects with clean alpha channels for seamless compositing." - FUNCTION = "removeBackground" - RETURN_TYPES = ("VIDEO",) - RETURN_NAMES = ("VIDEO",) - CATEGORY = "Runware" - - def removeBackground(self, **kwargs): - """Remove background from video""" - videoUuid = kwargs.get("Video") - modelName = kwargs.get("Model", "Bria Video Background Removal") - backgroundColor = kwargs.get("Background Color", "Transparent") - outputFormat = kwargs.get("Output Format", "mp4") - - if not videoUuid or videoUuid.strip() == "": - raise ValueError("Video mediaUUID is required") - - modelAir = self.RUNWARE_VRMBG_MODELS.get(modelName, "bria:51@1") - rgbaColor = self.BACKGROUND_COLORS.get(backgroundColor, [255, 255, 255, 0]) - - genConfig = self._buildGenConfig(videoUuid, modelAir, outputFormat, rgbaColor) - - print(f"[DEBUG] Sending Video Background Removal Request:") - print(f"[DEBUG] Request Payload: {rwUtils.safe_json_dumps(genConfig, indent=2)}") - - genResult = rwUtils.inferenecRequest(genConfig) - - print(f"[DEBUG] Received Video Background Removal Response:") - print(f"[DEBUG] Response: {rwUtils.safe_json_dumps(genResult, indent=2)}") - - self._validateResponse(genResult) - - taskUuid = genConfig[0]["taskUUID"] - videos = self._pollForVideoResult(taskUuid) - - return videos - - def _buildGenConfig(self, videoUuid, modelAir, outputFormat, rgbaColor): - """Build generation configuration for API request""" - return [{ - "taskType": "removeBackground", - "taskUUID": rwUtils.genRandUUID(), - "inputs": { - "video": videoUuid - }, - "model": modelAir, - "outputFormat": outputFormat, - "settings": { - "rgba": rgbaColor - } - }] - - def _validateResponse(self, genResult): - """Validate API response""" - if "errors" in genResult: - errorMessage = genResult["errors"][0]["message"] - raise Exception(f"Video background removal failed: {errorMessage}") - - def _pollForVideoResult(self, taskUuid): - """Poll for video result""" - while True: - comfy.model_management.throw_exception_if_processing_interrupted() - - pollResult = rwUtils.pollVideoResult(taskUuid) - print(f"[Debugging] Poll result: {pollResult}") - - if pollResult and "errors" in pollResult and len(pollResult["errors"]) > 0: - errorInfo = pollResult["errors"][0] - errorMessage = errorInfo.get("message", "Unknown error") - raise Exception(f"Video background removal failed: {errorMessage}") - - if pollResult and "data" in pollResult and len(pollResult["data"]) > 0: - videoData = pollResult["data"][0] - - if "status" in videoData: - status = videoData["status"] - - if status == "success": - if "videoURL" in videoData or "videoBase64Data" in videoData: - videos = rwUtils.convertVideoB64List(pollResult, 1920, 1080) - # SaveVideo expects a single video object, not a tuple - return (videos[0],) if len(videos) > 0 else (None,) - - comfy.model_management.throw_exception_if_processing_interrupted() - - for _ in range(10): - comfy.model_management.throw_exception_if_processing_interrupted() - rwUtils.time.sleep(0.1) - - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareVideoBgRemoval": videoBgRemoval, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareVideoBgRemoval": "Runware Video Background Removal", -} diff --git a/modules/videoInference.py b/modules/videoInference.py deleted file mode 100644 index 14901bc..0000000 --- a/modules/videoInference.py +++ /dev/null @@ -1,553 +0,0 @@ -from .utils import runwareUtils as rwUtils -import comfy.model_management - - -class txt2vid: - @staticmethod - def _format_reference_images(referenceImages): - """ - Shape referenceImages by payload style: - - If any entry uses `images` (Images1..N style), return grouped objects - [{type, tag, images, audio?}] - - Otherwise return flat list[str] (legacy behavior) - """ - if referenceImages is None: - return [] - - if not isinstance(referenceImages, list): - referenceImages = [referenceImages] - - has_grouped_images = any( - isinstance(ref, dict) and isinstance(ref.get("images"), list) and len(ref.get("images")) > 0 - for ref in referenceImages - ) - - if has_grouped_images: - grouped = [] - for idx, ref in enumerate(referenceImages, start=1): - images = [] - ref_type = "image" - ref_tag = f"@image{idx}" - ref_audio = "" - - if isinstance(ref, str): - if ref.strip(): - images = [ref.strip()] - elif isinstance(ref, dict): - ref_type = (str(ref.get("type", "image")).strip() or "image") - raw_tag = str(ref.get("tag", "")).strip() - ref_tag = raw_tag if raw_tag else ref_tag - if not ref_tag.startswith("@"): - ref_tag = f"@{ref_tag}" - - raw_audio = ref.get("audio", "") - if isinstance(raw_audio, str) and raw_audio.strip(): - ref_audio = raw_audio.strip() - - image_value = ref.get("image") - if isinstance(image_value, str) and image_value.strip(): - images.append(image_value.strip()) - - image_group = ref.get("images") - if isinstance(image_group, list): - for item in image_group: - if isinstance(item, str) and item.strip(): - images.append(item.strip()) - - if not images: - continue - - group = { - "type": ref_type, - "tag": ref_tag, - "images": images[:5], # provider limit: max 5 - } - if ref_audio: - group["audio"] = ref_audio - grouped.append(group) - - return grouped - - # Legacy/default path: flatten to list of image strings - flattened = [] - for ref in referenceImages: - if isinstance(ref, str): - if ref.strip(): - flattened.append(ref.strip()) - elif isinstance(ref, dict): - image_value = ref.get("image") - if isinstance(image_value, str) and image_value.strip(): - flattened.append(image_value.strip()) - - image_group = ref.get("images") - if isinstance(image_group, list): - for item in image_group: - if isinstance(item, str) and item.strip(): - flattened.append(item.strip()) - return flattened - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Model": ("RUNWAREVIDEOMODEL", { - "tooltip": "Connect a Runware Video Model From Runware Video Model Search Node.", - }), - "Multi Inference Mode": ("BOOLEAN", { - "tooltip": "If Enabled the node will skip the video generation process and will only return the Runware Task Object to be used in the Multi Inference Node.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "Prompt Weighting": (["Disabled", "sdEmbeds", "Compel"], { - "default": "Disabled", - "tooltip": "Prompt weighting allows you to adjust how strongly different parts of your prompt influence the generated video.\n\nChoose between \"compel\" notation with advanced weighting operations or \"sdEmbeds\" for simple emphasis adjustments.\n\nCompel Example: \"small+ dog, pixar style\"\n\nsdEmbeds Example: \"(small:2.5) dog, pixar style\"", - }), - "useDuration": ("BOOLEAN", { - "tooltip": "Enable to include duration parameter in API request. Disable if your model doesn't support duration.", - "default": False, - }), - "duration": ("INT", { - "tooltip": "The duration of the video in seconds.", - "default": 5, - "min": 1, - "max": 30, - }), - "useFps": ("BOOLEAN", { - "tooltip": "Enable to include fps parameter in API request. Disable if your model doesn't support fps.", - "default": False, - }), - "fps": ("INT", { - "tooltip": "Frames per second for the generated video. Only used when 'Use FPS' is enabled.", - "default": 24, - "min": 8, - "max": 60, - }), - "outputFormat": (["mp4", "webm", "mov"], { - "default": "mp4", - "tooltip": "Choose the output video format.", - }), - "useSeed": ("BOOLEAN", { - "tooltip": "Enable to include seed parameter in API request. Disable if your model doesn't support seed.", - "default": False, - }), - "seed": ("INT", { - "tooltip": "A value used to randomize the video generation. If you want to make videos reproducible (generate the same video multiple times), you can use the same seed value.", - "default": 1, - "min": 1, - "max": 2147483647, - }), - "useSteps": ("BOOLEAN", { - "tooltip": "Enable to include steps parameter in API request. Disable if your model doesn't support steps.", - "default": False, - }), - "steps": ("INT", { - "tooltip": "Number of inference steps for video generation. More steps generally result in higher quality but longer generation time.", - "default": 20, - "min": 1, - "max": 100, - }), - "useBatchSize": ("BOOLEAN", { - "tooltip": "Enable to include batchSize parameter in API request. Disable if your model doesn't support batch size.", - "default": False, - }), - "batchSize": ("INT", { - "tooltip": "The number of videos to generate in a single request. Only used when 'Use Batch Size' is enabled.", - "default": 1, - "min": 1, - "max": 4, - }), - "useSchedulers": ("BOOLEAN", { - "tooltip": "Enable to include scheduler parameter in API request. Disable if your model doesn't support scheduler.", - "default": False, - }), - "scheduler": (["euler", "dpm", "adams", "unipc"], { - "default": "euler", - "tooltip": "High-level scheduler name for video generation. Only used when 'Use Schedulers' is enabled.", - }), - "useCFGScale": ("BOOLEAN", { - "tooltip": "Enable to include guidance_scale (CFG) parameter in API request. Disable for No-CFG models.", - "default": False, - }), - "cfgScale": ("FLOAT", { - "tooltip": "Classifier-free guidance strength. Set to 1 for No-CFG models. For Duration 5 use 1; for Duration 10, 1-7 is valid. Default 5.", - "default": 5.0, - "min": 1.0, - "max": 7.0, - "step": 0.1, - }), - "acceleration": (["none", "low", "medium", "high"], { - "tooltip": "Applies optimized acceleration presets that automatically configure multiple generation parameters for the best speed and quality balance. This parameter serves as an abstraction layer that intelligently adjusts acceleratorOptions, steps, scheduler, and other underlying settings.\n\nAvailable values:\n- none: No acceleration applied, uses default parameter values.\n- low: Minimal acceleration with optimized settings for lowest quality loss.\n- medium: Balanced acceleration preset with moderate speed improvements.\n- high: Maximum acceleration with caching and aggressive optimizations for fastest generation.", - "default": "none", - }), - }, - "optional": { - "positivePrompt": ("STRING", { - "multiline": True, - "placeholder": "Positive Prompt: a text instruction to guide the model on generating the video. It is usually a sentence or a paragraph that provides positive guidance for the task. This parameter is essential to shape the desired results.\n\nYou Can Press (Ctrl + Alt + E) To Enhance The Prompt!", - "tooltip": "Positive Prompt: a text instruction to guide the model on generating the video. You Can Also Press (Ctrl + Alt + E) To Enhance The Prompt!" - }), - "negativePrompt": ("STRING", { - "multiline": True, - "placeholder": "Negative Prompt: a text instruction to guide the model on generating the video. It is usually a sentence or a paragraph that provides negative guidance for the task. This parameter helps to avoid certain undesired results.", - "tooltip": "Negative Prompt: a text instruction to guide the model on generating the video." - }), - "frameImages": ("RUNWAREFRAMEIMAGES", { - "tooltip": "Frame images configuration from Runware Frame Images node. Allows precise control over frame positioning.", - }), - "referenceImages": ("RUNWAREREFERENCEIMAGES", { - "tooltip": "Connect a Runware Reference Images node to provide reference images for the subject. These reference images help the AI maintain identity consistency during the video generation process.", - }), - "providerSettings": ("RUNWAREPROVIDERSETTINGS", { - "tooltip": "Connect a Runware Provider Settings node to configure provider-specific parameters.", - }), - "inputAudios": ("RUNWAREINPUTAUDIOS", { - "tooltip": "Connect input audio files for video generation with audio synchronization.", - }), - "referenceVideos": ("RUNWAREREFERENCEVIDEOS", { - "tooltip": "Connect reference video files for video generation.", - }), - "speech": ("RUNWAREVIDEOINFERENCESPEECHINPUT", { - "tooltip": "Connect a Runware Video Inference Speech Input node to set voice and text for speech synthesis.", - }), - "inputs": ("RUNWAREVIDEOINFERENCEINPUTS", { - "tooltip": "Connect a Runware Video Inference Inputs node to provide custom inputs like image, audio, mask, and parameters for OmniHuman 1.5 and other video models.", - }), - "safetyInputs": ("RUNWARESAFETYINPUTS", { - "tooltip": "Connect Runware Safety Inputs node to configure safety and content moderation settings.", - }), - "videoAdvancedFeatureInputs": ("RUNWAREVIDEOADVANCEDFEATUREINPUTS", { - "tooltip": "Connect Runware Video Advanced Feature Inputs node to configure advanced video features like CFG scales, FPS, negative prompts, and SLG layer settings.", - }), - "Accelerator": ("RUNWAREACCELERATOR", { - "tooltip": "Connect a Runware Accelerator Options Node to configure caching and acceleration settings.", - }), - "settings": ("RUNWAREVIDEOSETTINGS", { - "tooltip": "Connect a Runware Video Inference Settings node to configure draft, audio, voicePrompt, safetyFilter, promptUpsampling, voiceDescription, style, thinking, multiClip, shotType, promptExtend, syncMode, mode, emotion, temperature, occlusionDetection, tts, activeSpeakerDetection, segments, etc.", - }), - "lora": ("RUNWAREVIDEOINFERENCELORA", { - "tooltip": "Connect a Runware Video Inference Lora node to apply LoRA models (e.g. for LTX video models).", - }), - "useTtl": ("BOOLEAN", { - "tooltip": "Enable to include ttl parameter in API request. Sets output URL retention time in seconds.", - "default": False, - }), - "ttl": ("INT", { - "tooltip": "Time-to-live in seconds for generated video URLs. Only used when 'Use TTL' is enabled. Minimum 60.", - "default": 604800, - "min": 60, - "max": 2592000, - }), - } - } - - @classmethod - def VALIDATE_INPUTS(cls, positivePrompt=None, negativePrompt=None): - # Only validate if prompts are provided and not empty - if positivePrompt is not None and positivePrompt.strip() != "": - if len(positivePrompt) < 3 or len(positivePrompt) > 2000: - raise Exception("Positive Prompt Must Be Between 3 And 2000 characters!") - if negativePrompt is not None and negativePrompt.strip() != "": - if len(negativePrompt) < 3 or len(negativePrompt) > 2000: - raise Exception("Negative Prompt Must Be Between 3 And 2000 characters!") - return True - - DESCRIPTION = "Generates Videos Lightning Fast With Runware Video Inference Engine." - FUNCTION = "generateVideo" - RETURN_TYPES = ("VIDEO", "RUNWARETASK", "RUNWARETASK") - RETURN_NAMES = ("VIDEO", "RW-Task", "OUTPUT") - CATEGORY = "Runware" - - def generateVideo(self, **kwargs): - runwareVideoModel = kwargs.get("Model") - positivePrompt = kwargs.get("positivePrompt") - negativePrompt = kwargs.get("negativePrompt", None) - multiInferenceMode = kwargs.get("Multi Inference Mode", False) - promptWeighting = kwargs.get("Prompt Weighting", "Disabled") - providerSettings = kwargs.get("providerSettings", None) - frameImages = kwargs.get("frameImages", None) - referenceImages = kwargs.get("referenceImages", None) - inputAudios = kwargs.get("inputAudios", None) - referenceVideos = kwargs.get("referenceVideos", None) - speech = kwargs.get("speech", None) - inputs = kwargs.get("inputs", None) - safetyInputs = kwargs.get("safetyInputs", None) - videoAdvancedFeatureInputs = kwargs.get("videoAdvancedFeatureInputs", None) - runwareAccelerator = kwargs.get("Accelerator", None) - settings = kwargs.get("settings", None) - lora = kwargs.get("lora", None) - useDuration = kwargs.get("useDuration", False) - duration = kwargs.get("duration", 5) - fps = kwargs.get("fps", 24) - useFps = kwargs.get("useFps", False) - outputFormat = kwargs.get("outputFormat", "mp4") - seed = kwargs.get("seed", 1) - useSeed = kwargs.get("useSeed", False) - steps = kwargs.get("steps", 20) - useSteps = kwargs.get("useSteps", False) - useBatchSize = kwargs.get("useBatchSize", False) - batchSize = kwargs.get("batchSize", 1) - useSchedulers = kwargs.get("useSchedulers", False) - scheduler = kwargs.get("scheduler", "euler") - useCFGScale = kwargs.get("useCFGScale", False) - cfgScale = kwargs.get("cfgScale", 5.0) - acceleration = kwargs.get("acceleration", "none") - useTtl = kwargs.get("useTtl", False) - ttl = kwargs.get("ttl", 604800) - - # Handle model input - could be dict or string - if isinstance(runwareVideoModel, dict): - model = runwareVideoModel.get("model", "") - width = runwareVideoModel.get("width") - height = runwareVideoModel.get("height") - useResolution = runwareVideoModel.get("useResolution", False) - resolution = runwareVideoModel.get("resolution", None) - else: - model = runwareVideoModel - width = None - height = None - useResolution = False - resolution = None - - genConfig = [ - { - "taskType": "videoInference", - "taskUUID": rwUtils.genRandUUID(), - "model": model, - "outputFormat": outputFormat, - "includeCost": True, - "deliveryMethod": "async", - } - ] - - # Add batchSize (numberResults) only if enabled - if useBatchSize: - genConfig[0]["numberResults"] = batchSize - - # Add resolution if enabled - if useResolution and resolution: - genConfig[0]["resolution"] = resolution - - # Add width/height if not using resolution (or if resolution is not provided) - if ( - width is not None and height is not None - and width > 0 and height > 0 - ): - genConfig[0]['height'] = height - genConfig[0]['width'] = width - - # Only add positivePrompt if it's not empty - if positivePrompt and positivePrompt.strip() != "": - genConfig[0]["positivePrompt"] = positivePrompt - - # Add fps parameter only if enabled - if useFps: - genConfig[0]["fps"] = fps - - # Add duration parameter - unified for all models - if useDuration: - genConfig[0]["duration"] = duration - - # Add seed parameter only if enabled - if useSeed: - genConfig[0]["seed"] = seed - - # Add steps parameter only if enabled - if useSteps: - genConfig[0]["steps"] = steps - - # Add scheduler parameter only if enabled - if useSchedulers: - genConfig[0]["scheduler"] = scheduler - - # Add CFGScale parameter only if enabled - if useCFGScale: - genConfig[0]["CFGScale"] = cfgScale - - if (negativePrompt is not None and negativePrompt != ""): - genConfig[0]["negativePrompt"] = negativePrompt - if (promptWeighting != "Disabled"): - if (promptWeighting == "sdEmbeds"): - genConfig[0]["promptWeighting"] = "sdEmbeds" - else: - genConfig[0]["promptWeighting"] = "compel" - # Add frameImages if provided from Runware Frame Images node - if frameImages is not None and len(frameImages) > 0: - genConfig[0]["frameImages"] = frameImages - print(f"[Debugging] Frame images array: {rwUtils.sanitize_for_logging(frameImages)}") - # Add referenceImages if provided from Runware Reference Images node - if referenceImages is not None and len(referenceImages) > 0: - formattedReferenceImages = self._format_reference_images(referenceImages) - if len(formattedReferenceImages) > 0: - genConfig[0]["referenceImages"] = formattedReferenceImages - print(f"[Debugging] Reference images array: {rwUtils.sanitize_for_logging(formattedReferenceImages)}") - # Add inputAudios if provided - if inputAudios is not None and len(inputAudios) > 0: - genConfig[0]["inputAudios"] = inputAudios - print(f"[Debugging] Input audios array: {rwUtils.sanitize_for_logging(inputAudios)}") - - # Add referenceVideos if provided and not empty - if referenceVideos is not None: - # Handle both single mediaUUID (string) and multiple mediaUUIDs (list) - if isinstance(referenceVideos, str) and referenceVideos.strip() != "": - genConfig[0]["referenceVideos"] = [referenceVideos.strip()] - print(f"[Debugging] Reference videos: {rwUtils.sanitize_for_logging(genConfig[0].get('referenceVideos', []))}") - elif isinstance(referenceVideos, list) and len(referenceVideos) > 0: - genConfig[0]["referenceVideos"] = referenceVideos - print(f"[Debugging] Reference videos: {rwUtils.sanitize_for_logging(genConfig[0].get('referenceVideos', []))}") - - # Add speech parameters if provided from Runware Video Inference Speech Input node - if speech is not None and isinstance(speech, dict) and speech: - genConfig[0]["speech"] = speech - print(f"[Debugging] Speech parameters: {rwUtils.sanitize_for_logging(speech)}") - - # Handle inputs - merge custom inputs from Video Inference Inputs node - if inputs is not None: - # Merge inputs from video inference inputs node - if "inputs" not in genConfig[0]: - genConfig[0]["inputs"] = {} - - # Merge each input from inputs (only actual input data, not provider settings) - for key, value in inputs.items(): - # Normalize referenceImages by payload style: - # grouped objects when using ImagesN; otherwise flat string[] - if key == "referenceImages": - formatted_input_refs = self._format_reference_images(value) - if len(formatted_input_refs) > 0: - genConfig[0]["inputs"][key] = formatted_input_refs - continue - genConfig[0]["inputs"][key] = value - - print(f"[Debugging] Video inference inputs merged: {rwUtils.sanitize_for_logging(inputs)}") - print(f"[Debugging] Final genConfig inputs: {rwUtils.sanitize_for_logging(genConfig[0].get('inputs', {}))}") - - # Handle providerSettings - extract provider name from model and merge with custom settings - if providerSettings is not None: - provider_name = model.split(":")[0] if ":" in model else model - - if isinstance(providerSettings, dict): - if provider_name in providerSettings: - final_provider_settings = providerSettings - else: - final_provider_settings = {provider_name: providerSettings} - - if final_provider_settings: - genConfig[0]["providerSettings"] = final_provider_settings - print(f"[Debugging] Provider settings: {rwUtils.sanitize_for_logging(final_provider_settings)}") - else: - genConfig[0]["providerSettings"] = providerSettings - - # Add safety inputs if provided - if safetyInputs is not None and isinstance(safetyInputs, dict) and len(safetyInputs) > 0: - genConfig[0]["safety"] = safetyInputs - - # Add video advanced feature inputs if provided - if videoAdvancedFeatureInputs is not None and isinstance(videoAdvancedFeatureInputs, dict) and len(videoAdvancedFeatureInputs) > 0: - genConfig[0]["advancedFeatures"] = videoAdvancedFeatureInputs - - # Add accelerator options if provided - if runwareAccelerator is not None and isinstance(runwareAccelerator, dict) and len(runwareAccelerator) > 0: - genConfig[0]["acceleratorOptions"] = runwareAccelerator - - # Add settings if provided (draft, audio, promptUpsampling, voiceDescription, ...) - if settings is not None and isinstance(settings, dict) and len(settings) > 0: - genConfig[0]["settings"] = settings - - if lora and lora.get("model"): - genConfig[0]["lora"] = [lora] - - # Add acceleration if not "none" - if acceleration and acceleration != "none": - genConfig[0]["acceleration"] = acceleration - - # Add TTL for output URL retention (requires outputType URL) - if useTtl: - genConfig[0]["ttl"] = int(ttl) - - if (multiInferenceMode): - return (None, genConfig, None) - else: - try: - # Debug: Print the request being sent - print(f"[DEBUG] Sending Video Inference Request:") - print(f"[DEBUG] Request Payload: {rwUtils.safe_json_dumps(genConfig, indent=2)}") - - genResult = rwUtils.inferenecRequest(genConfig) - - # Debug: Print the response received - print(f"[DEBUG] Received Video Inference Response:") - print(f"[DEBUG] Response: {rwUtils.safe_json_dumps(genResult, indent=2)}") - - print(f"[Debugging] Generation config: {rwUtils.safe_json_dumps(genConfig, indent=2)}") - except Exception as e: - # Re-raise the original error without modification - raise e - - # Extract task UUID for polling - taskUUID = genConfig[0]["taskUUID"] - - # Poll for video completion - while True: - # Check for interrupt before each poll - comfy.model_management.throw_exception_if_processing_interrupted() - - # Poll for video result - pollResult = rwUtils.pollVideoResult(taskUUID) - print(f"[Debugging] Poll result: {rwUtils.safe_json_dumps(pollResult, indent=2) if isinstance(pollResult, (dict, list)) else pollResult}") - - # Check for errors first - if pollResult and "errors" in pollResult and len(pollResult["errors"]) > 0: - error_info = pollResult["errors"][0] - error_message = error_info.get("message", "Unknown error") - - # Extract more detailed error info if available - if "responseContent" in error_info: - response_content = error_info["responseContent"] - # Handle both string and dict response content - if isinstance(response_content, str): - detailed_message = response_content - elif isinstance(response_content, dict): - detailed_message = response_content.get("message", str(response_content)) - else: - detailed_message = str(response_content) - - if detailed_message: - error_message = f"{error_message}\nProvider Error: {detailed_message}" - - # Include taskUUID for debugging - task_uuid = error_info.get("taskUUID", "unknown") - raise Exception(f"Video generation failed (Task: {task_uuid}): {error_message}") - - if pollResult and "data" in pollResult and len(pollResult["data"]) > 0: - video_data = pollResult["data"][0] - - # Check status directly - if "status" in video_data: - status = video_data["status"] - - if status == "success": - if "videoURL" in video_data or "videoBase64Data" in video_data: - videos = rwUtils.convertVideoB64List(pollResult, width, height) - # SaveVideo expects a single video object, not a tuple - video_output = videos[0] if len(videos) > 0 else None - return (video_output, genConfig, pollResult) - - # If status is "processing", continue polling - - # Check for interrupt before waiting - comfy.model_management.throw_exception_if_processing_interrupted() - - # Wait before next poll (split into smaller chunks to allow more frequent interrupt checks) - for _ in range(10): # 10 x 0.1 second = 1 second total - comfy.model_management.throw_exception_if_processing_interrupted() - rwUtils.time.sleep(0.1) - - -# Node class mappings for ComfyUI registration -NODE_CLASS_MAPPINGS = { - "txt2vid": txt2vid, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "txt2vid": "Runware Video Inference", -} \ No newline at end of file diff --git a/modules/videoInferenceElements.py b/modules/videoInferenceElements.py deleted file mode 100644 index f3c957b..0000000 --- a/modules/videoInferenceElements.py +++ /dev/null @@ -1,216 +0,0 @@ -""" -Runware Video Inference Elements — builds inputs.elements[] for videoInference (Kling elements, etc.). -""" - -import re -from typing import Any, Dict, List, Optional, Tuple -from .utils import runwareUtils as rwUtils - -_REF_IMAGE_SLOTS = 3 -_REF_VIDEO_SLOTS = 4 - -_ALLOWED_TAGS = frozenset( - { - "Hottest", - "Character", - "Animal", - "Item", - "Costume", - "Scene", - "Effect", - "Others", - } -) - - -def _split_lines_or_csv(value: Optional[str]) -> List[str]: - if value is None: - return [] - s = str(value).strip() - if not s: - return [] - parts = re.split(r"[\n,]+", s) - return [p.strip() for p in parts if p.strip()] - - -def _parse_tags(value: Optional[str]) -> List[str]: - raw = _split_lines_or_csv(value) - if not raw: - return [] - out: List[str] = [] - for t in raw: - if t in _ALLOWED_TAGS: - if t not in out: - out.append(t) - return out - - -def _build_element_dict( - id_: str, - description: str, - frontalImage: Any, - refer_images: List[Any], - refer_videos: List[str], - voice: str, - tags: str, -) -> Dict[str, Any]: - el: Dict[str, Any] = {} - id_s = (id_ or "").strip() - if id_s: - el["id"] = id_s - desc = (description or "").strip() - if desc: - el["description"] = desc - if isinstance(frontalImage, str): - front = frontalImage.strip() - if front: - el["frontalImage"] = front - elif frontalImage is not None: - el["frontalImage"] = frontalImage - imgs = [x for x in refer_images if x is not None] - if imgs: - el["images"] = imgs - if refer_videos: - el["videos"] = refer_videos - voices = _split_lines_or_csv(voice) - if voices: - el["voice"] = voices - tag_list = _parse_tags(tags) - if tag_list: - el["tags"] = tag_list - return el - - -class RunwareVideoInferenceElements: - """One Kling / video inference element for inputs.elements.""" - - @classmethod - def INPUT_TYPES(cls): - optional: Dict[str, tuple] = { - "id": ("STRING", { - "default": "", - "tooltip": "User-facing element id (max 20 chars on API). For reuse, set only id with no reference media.", - }), - "description": ("STRING", { - "default": "", - "multiline": True, - "tooltip": "Optional element description (e.g. for image_refer / new elements).", - }), - "frontalImage": ("IMAGE", { - "tooltip": "Frontal reference image for the element.", - }), - "voice": ("STRING", { - "default": "", - "multiline": True, - "tooltip": "Voice file URLs (mp3/wav/mp4/mov), one per line or comma-separated.", - }), - "tags": ("STRING", { - "default": "", - "multiline": True, - "tooltip": "Comma or newline-separated tags: Hottest, Character, Animal, Item, Costume, Scene, Effect, Others.", - }), - } - for i in range(1, _REF_IMAGE_SLOTS + 1): - optional[f"images_{i}"] = ("IMAGE", { - "tooltip": f"Optional reference image {i} for image_refer (up to {_REF_IMAGE_SLOTS}).", - }) - for i in range(1, _REF_VIDEO_SLOTS + 1): - optional[f"videos_{i}"] = ("STRING", { - "default": "", - "tooltip": ( - f"Optional reference video {i}: public URL or mediaUUID from Runware Media Upload " - f"(upload a video first, then paste the UUID here)." - ), - }) - return {"required": {}, "optional": optional} - - RETURN_TYPES = ("RUNWAREVIDEOINFERENCEELEMENTS",) - RETURN_NAMES = ("Elements",) - FUNCTION = "build_element" - CATEGORY = "Runware" - DESCRIPTION = ( - "Define a single video inference element (id, description, frontalImage, images_1…images_3, videos_1…videos_4, voice, tags) " - "for inputs.elements on Kling and compatible models. Connect to Runware Video Inference Inputs → Elements, " - "or use Runware Video Inference Elements Combine for multiple elements." - ) - - def build_element(self, **kwargs) -> Tuple[List[Dict[str, Any]],]: - frontal_image = kwargs.get("frontalImage", None) - frontal_image_value = None - if frontal_image is not None: - frontal_image_value = rwUtils.convertTensor2IMG(frontal_image) - - refer_images: List[Any] = [] - for i in range(1, _REF_IMAGE_SLOTS + 1): - slot = kwargs.get(f"images_{i}") - if slot is not None: - refer_images.append(rwUtils.convertTensor2IMG(slot)) - - refer_videos: List[str] = [] - for i in range(1, _REF_VIDEO_SLOTS + 1): - raw = kwargs.get(f"videos_{i}") - if raw is not None and str(raw).strip() != "": - refer_videos.append(str(raw).strip()) - - el = _build_element_dict( - str(kwargs.get("id") or ""), - str(kwargs.get("description") or ""), - frontal_image_value, - refer_images, - refer_videos, - str(kwargs.get("voice") or ""), - str(kwargs.get("tags") or ""), - ) - if not el: - raise ValueError( - "Runware Video Inference Elements: provide at least id, description, frontalImage, " - "images_1…images_3, videos_1…videos_4, voice, or tags." - ) - return ([el],) - - -class RunwareVideoInferenceElementsCombine: - """Combine multiple Runware Video Inference Elements (each output is a list) into one list.""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Elements 1": ("RUNWAREVIDEOINFERENCEELEMENTS", { - "tooltip": "Connect a Runware Video Inference Elements node (single-element list).", - }), - }, - "optional": { - "Elements 2": ("RUNWAREVIDEOINFERENCEELEMENTS", { - "tooltip": "Optional second Runware Video Inference Elements node.", - }), - "Elements 3": ("RUNWAREVIDEOINFERENCEELEMENTS", { - "tooltip": "Optional third Runware Video Inference Elements node.", - }), - }, - } - - RETURN_TYPES = ("RUNWAREVIDEOINFERENCEELEMENTS",) - RETURN_NAMES = ("Elements",) - FUNCTION = "combine" - CATEGORY = "Runware" - DESCRIPTION = ( - "Combine up to three Runware Video Inference Elements outputs into inputs.elements. " - "Connect the result to Runware Video Inference Inputs → Elements." - ) - - def combine(self, **kwargs) -> Tuple[List[Dict[str, Any]],]: - out: List[Dict[str, Any]] = [] - for i in range(1, 4): - key = f"Elements {i}" - chunk = kwargs.get(key) - if chunk is not None and isinstance(chunk, list): - out.extend( - e for e in chunk - if isinstance(e, dict) and len(e) > 0 - ) - if not out: - raise ValueError( - "Runware Video Inference Elements Combine: connect at least one non-empty Elements input." - ) - return (out,) diff --git a/modules/videoInferenceInputs.py b/modules/videoInferenceInputs.py deleted file mode 100644 index 8267f0d..0000000 --- a/modules/videoInferenceInputs.py +++ /dev/null @@ -1,169 +0,0 @@ -from .utils import runwareUtils as rwUtils - - -class videoInferenceInputs: - """Video Inference Inputs node for configuring video generation inputs""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "Image": ("IMAGE", { - "tooltip": "Portrait image for video generation (main subject that will speak and move). Mutually exclusive with Avatar: when Avatar is set, Image is ignored." - }), - "Avatar": ("STRING", { - "default": "", - "tooltip": "HeyGen avatar ID for a photo or video avatar. Mutually exclusive with Image: when set, Image is ignored; use one or the other.", - }), - "Frame Images": ("RUNWAREVIDEOINPUTSFRAMEIMAGES", { - "tooltip": "Connect the Runware Video Inputs Frame node to provide timeline-constrained frame images." - }), - "Audio": ("STRING", { - "tooltip": "Connect the mediaUUID output from Runware Media Upload node with audio file. This audio will be synchronized with the generated video. (Legacy: single audio string)" - }), - "Audio Inputs": ("RUNWAREAUDIOINPUT", { - "tooltip": "Connect Runware Video Audio Input node(s) to provide audio inputs with reference IDs." - }), - "Speech Inputs": ("RUNWARESPEECHINPUT", { - "tooltip": "Connect Runware Video Speech Input node or Runware Speech Inputs Combine node to provide TTS speech inputs with reference IDs." - }), - "Video": ("STRING", { - "tooltip": "Connect the mediaUUID output from Runware Media Upload node with a reference/input video." - }), - "Mask": ("IMAGE", { - "tooltip": "Mask image to specify a specific subject in the image to speak. Use white/black mask format." - }), - "Frame": ("IMAGE", { - "tooltip": "Frame image for video generation. Connect a Load Image node to provide the frame image." - }), - "Background": ("IMAGE", { - "tooltip": "Background image for video generation. Connect a Load Image node to provide the background.", - }), - "References Images": ("RUNWAREVIDEOINPUTSREFERENCEIMAGES", { - "tooltip": "Connect the Runware Video Inference Inputs Reference Images node to provide reference images." - }), - "Reference Videos": ("RUNWAREREFERENCEVIDEOS", { - "tooltip": "Connect the Runware Video Inference Inputs Reference Videos node to provide reference video mediaUUIDs." - }), - "Reference Voices": ("RUNWAREREFERENCEVOICES", { - "tooltip": "Connect the Runware Video Inference Inputs Reference Voices node to provide reference voice URLs or mediaUUIDs." - }), - "draftId": ("STRING", { - "default": "", - "multiline": False, - "tooltip": "Draft ID from a previous Bytedance video generation. Used when continuing or extending a draft output", - }), - "videoId": ("STRING", { - "default": "", - "multiline": False, - "tooltip": "Video ID from a previous generation. Used when extending or editing an existing OpenAI Sora video", - }), - "Elements": ("RUNWAREVIDEOINFERENCEELEMENTS", { - "tooltip": "Connect Runware Video Inference Elements (one element) or Runware Video Inference Elements Combine (several) for inputs.elements (Kling, etc.).", - }), - "Reference Audios": ("RUNWAREINPUTAUDIOS", { - "tooltip": "Connect the Runware Video Inference Inputs Reference Audios node to provide reference audio mediaUUIDs." - }), - } - } - - DESCRIPTION = ( - "Configure custom inputs for Runware Video Inference (image, audio, video, mask, avatar, etc.). " - "Avatar and Image are mutually exclusive: if Avatar is set, Image is ignored; provide only one." - ) - FUNCTION = "createInputs" - RETURN_TYPES = ("RUNWAREVIDEOINFERENCEINPUTS",) - RETURN_NAMES = ("Video Inference Inputs",) - CATEGORY = "Runware" - - def createInputs(self, **kwargs): - """Create video inference inputs from provided parameters""" - image = kwargs.get("Image", None) - audio = kwargs.get("Audio", None) - audioInputs = kwargs.get("Audio Inputs", None) - speechInputs = kwargs.get("Speech Inputs", None) - video = kwargs.get("Video", None) - mask = kwargs.get("Mask", None) - frame = kwargs.get("Frame", None) - background = kwargs.get("Background", None) - frameImages = kwargs.get("Frame Images", None) - references = kwargs.get("References Images", kwargs.get("References", None)) - referenceVideos = kwargs.get("Reference Videos", None) - referenceAudios = kwargs.get("Reference Audios", None) - referenceVoices = kwargs.get("Reference Voices", None) - draftId = kwargs.get("draftId", "") - videoId = kwargs.get("videoId", "") - avatar = kwargs.get("Avatar", "") - elements_list = kwargs.get("Elements", None) - - inputs = {} - - has_avatar = avatar is not None and avatar.strip() != "" - if has_avatar: - inputs["avatar"] = avatar.strip() - if image is not None: - inputs["image"] = rwUtils.convertTensor2IMG(image) - - # Handle audio: can be either a string (legacy), a single dict, or a list of audio inputs - if audioInputs is not None: - if isinstance(audioInputs, list) and len(audioInputs) > 0: - # List from combine node - inputs["audio"] = audioInputs - elif isinstance(audioInputs, dict) and len(audioInputs) > 0: - # Single audio input dict - inputs["audio"] = [audioInputs] - elif audio is not None and audio.strip() != "": - inputs["audio"] = audio.strip() - - # Handle speech inputs: can be a single dict or a list of speech inputs - if speechInputs is not None: - if isinstance(speechInputs, list) and len(speechInputs) > 0: - # List from combine node - inputs["speech"] = speechInputs - elif isinstance(speechInputs, dict) and len(speechInputs) > 0: - # Single speech input dict - inputs["speech"] = [speechInputs] - - if video is not None and video.strip() != "": - inputs["video"] = video.strip() - - if mask is not None: - inputs["mask"] = rwUtils.convertTensor2IMG(mask) - - if frame is not None: - inputs["frame"] = rwUtils.convertTensor2IMG(frame) - - if background is not None: - inputs["background"] = rwUtils.convertTensor2IMG(background) - - if frameImages is not None and len(frameImages) > 0: - inputs["frameImages"] = frameImages - - if references is not None and len(references) > 0: - inputs["referenceImages"] = references - - if referenceVideos is not None and len(referenceVideos) > 0: - inputs["referenceVideos"] = referenceVideos - - if referenceAudios is not None and len(referenceAudios) > 0: - inputs["referenceAudios"] = referenceAudios - - if referenceVoices is not None and len(referenceVoices) > 0: - inputs["referenceVoices"] = referenceVoices - - if draftId is not None and draftId.strip() != "": - inputs["draftId"] = draftId.strip() - - if videoId is not None and videoId.strip() != "": - inputs["videoId"] = videoId.strip() - - if elements_list is not None and isinstance(elements_list, list): - merged_elements = [ - e for e in elements_list - if isinstance(e, dict) and len(e) > 0 - ] - if merged_elements: - inputs["elements"] = merged_elements - - return (inputs,) diff --git a/modules/videoInferenceLora.py b/modules/videoInferenceLora.py deleted file mode 100644 index dfad75b..0000000 --- a/modules/videoInferenceLora.py +++ /dev/null @@ -1,35 +0,0 @@ -class RunwareVideoInferenceLora: - """LoRA config for Runware Video Inference.""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "model": ("STRING", { - "default": "", - "tooltip": "LoRA model AIR code (e.g. lvs:mayflower@lora-test).", - }), - "weight": ("FLOAT", { - "tooltip": "LoRA strength for video generation.", - "default": 0.7, - "min": -4.0, - "max": 4.0, - "step": 0.1, - }), - }, - } - - DESCRIPTION = ( - "Configure a LoRA for Runware Video Inference. Connect the output to " - "Runware Video Inference → lora." - ) - FUNCTION = "createLora" - RETURN_TYPES = ("RUNWAREVIDEOINFERENCELORA",) - RETURN_NAMES = ("lora",) - CATEGORY = "Runware" - - def createLora(self, model, weight): - return ({ - "model": model.strip(), - "weight": round(weight, 2), - },) diff --git a/modules/videoInferenceSettingsActiveSpeakerBoundingBoxes.py b/modules/videoInferenceSettingsActiveSpeakerBoundingBoxes.py deleted file mode 100644 index c62e2e9..0000000 --- a/modules/videoInferenceSettingsActiveSpeakerBoundingBoxes.py +++ /dev/null @@ -1,73 +0,0 @@ -""" -Runware Video Inference Settings Active Speaker Bounding Boxes -Builds settings.activeSpeakerDetection.boundingBoxes for Sync models. -Each element is [x1, y1, x2, y2] or null. Up to 4 elements. -""" - - - -def _parse_box(raw: str, label: str): - value = (raw or "").strip() - if value == "" or value.lower() == "null": - return None - - parts = [p.strip() for p in value.split(",")] - if len(parts) != 4: - raise ValueError(f"{label} must be 'x1,y1,x2,y2' or null.") - - try: - return [float(parts[0]), float(parts[1]), float(parts[2]), float(parts[3])] - except ValueError as exc: - raise ValueError(f"{label} values must be numbers.") from exc - - -class RunwareVideoInferenceSettingsActiveSpeakerBoundingBoxes: - """Optional settings.activeSpeakerDetection.boundingBoxes block for Sync.""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useBox1": ("BOOLEAN", {"tooltip": "Enable bounding box element 1.", "default": False}), - "box1": ("STRING", {"tooltip": "Element 1 as 'x1,y1,x2,y2' or null.", "default": ""}), - "useBox2": ("BOOLEAN", {"tooltip": "Enable bounding box element 2.", "default": False}), - "box2": ("STRING", {"tooltip": "Element 2 as 'x1,y1,x2,y2' or null.", "default": ""}), - "useBox3": ("BOOLEAN", {"tooltip": "Enable bounding box element 3.", "default": False}), - "box3": ("STRING", {"tooltip": "Element 3 as 'x1,y1,x2,y2' or null.", "default": ""}), - "useBox4": ("BOOLEAN", {"tooltip": "Enable bounding box element 4.", "default": False}), - "box4": ("STRING", {"tooltip": "Element 4 as 'x1,y1,x2,y2' or null.", "default": ""}), - }, - } - - RETURN_TYPES = ("RUNWAREVIDEOINFERENCESETTINGSACTIVESPEAKERBOUNDINGBOXES",) - RETURN_NAMES = ("boundingBoxes",) - FUNCTION = "create" - CATEGORY = "Runware" - DESCRIPTION = ( - "Configure settings.activeSpeakerDetection.boundingBoxes for Runware Video Inference. " - "Supports up to 4 elements, each [x1, y1, x2, y2] or null." - ) - - def create(self, **kwargs) -> tuple[list]: - boxes = [] - - if kwargs.get("useBox1", False): - boxes.append(_parse_box(kwargs.get("box1", ""), "box1")) - if kwargs.get("useBox2", False): - boxes.append(_parse_box(kwargs.get("box2", ""), "box2")) - if kwargs.get("useBox3", False): - boxes.append(_parse_box(kwargs.get("box3", ""), "box3")) - if kwargs.get("useBox4", False): - boxes.append(_parse_box(kwargs.get("box4", ""), "box4")) - - return (boxes[:4],) - - -NODE_CLASS_MAPPINGS = { - "RunwareVideoInferenceSettingsActiveSpeakerBoundingBoxes": RunwareVideoInferenceSettingsActiveSpeakerBoundingBoxes, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareVideoInferenceSettingsActiveSpeakerBoundingBoxes": "Runware Video Inference Settings Active Speaker Bounding Boxes", -} diff --git a/modules/videoInferenceSettingsActiveSpeakerDetection.py b/modules/videoInferenceSettingsActiveSpeakerDetection.py deleted file mode 100644 index 71f2f2a..0000000 --- a/modules/videoInferenceSettingsActiveSpeakerDetection.py +++ /dev/null @@ -1,97 +0,0 @@ -""" -Runware Video Inference Settings Active Speaker Detection -Exposes settings.activeSpeakerDetection fields for Sync models. -Connect optional boundingBoxes from the dedicated bounding-boxes node. -Connect the output to Runware Video Inference Settings -> activeSpeakerDetection. -""" - -from typing import Dict, Any - - -class RunwareVideoInferenceSettingsActiveSpeakerDetection: - """Optional settings.activeSpeakerDetection block for video inference (Sync).""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useAutoDetect": ("BOOLEAN", { - "tooltip": "Enable to include autoDetect in settings.activeSpeakerDetection.", - "default": False, - }), - "autoDetect": ("BOOLEAN", { - "tooltip": "Let Sync choose the active speaker automatically. Only used when 'Use Auto Detect' is enabled.", - "default": True, - "label_on": "true", - "label_off": "false", - }), - "useFrameNumber": ("BOOLEAN", { - "tooltip": "Enable to include frameNumber in settings.activeSpeakerDetection.", - "default": False, - }), - "frameNumber": ("INT", { - "tooltip": "Frame index corresponding to the provided face coordinates. Only used when 'Use Frame Number' is enabled.", - "default": 0, - "min": 0, - "max": 1000000, - "step": 1, - }), - "useCoordinates": ("BOOLEAN", { - "tooltip": "Enable to include coordinates ([x, y]) in settings.activeSpeakerDetection.", - "default": False, - }), - "coordinateX": ("FLOAT", { - "tooltip": "X point on the target speaker face for the selected frame. Must be an integer in range 1-4096. Only used when 'Use Coordinates' is enabled.", - "default": 512.0, - "min": 1.0, - "max": 4096.0, - "step": 1.0, - }), - "coordinateY": ("FLOAT", { - "tooltip": "Y point on the target speaker face for the selected frame. Must be an integer in range 1-4096. Only used when 'Use Coordinates' is enabled.", - "default": 512.0, - "min": 1.0, - "max": 4096.0, - "step": 1.0, - }), - "boundingBoxes": ("RUNWAREVIDEOINFERENCESETTINGSACTIVESPEAKERBOUNDINGBOXES", { - "tooltip": "Connect Runware Video Inference Settings Active Speaker Bounding Boxes (up to 4 elements).", - }), - }, - } - - RETURN_TYPES = ("RUNWAREVIDEOINFERENCESETTINGSACTIVESPEAKERDETECTION",) - RETURN_NAMES = ("activeSpeakerDetection",) - FUNCTION = "create" - CATEGORY = "Runware" - DESCRIPTION = ( - "Configure settings.activeSpeakerDetection (autoDetect, frameNumber, coordinates, boundingBoxes) " - "for Runware Video Inference. Connect to Runware Video Inference Settings -> activeSpeakerDetection (Sync)." - ) - - def create(self, **kwargs) -> tuple[Dict[str, Any]]: - active_speaker: Dict[str, Any] = {} - if kwargs.get("useAutoDetect", False): - active_speaker["autoDetect"] = bool(kwargs.get("autoDetect", True)) - if kwargs.get("useFrameNumber", False): - active_speaker["frameNumber"] = int(kwargs.get("frameNumber", 0)) - if kwargs.get("useCoordinates", False): - x = int(round(float(kwargs.get("coordinateX", 512.0)))) - y = int(round(float(kwargs.get("coordinateY", 512.0)))) - x = max(1, min(4096, x)) - y = max(1, min(4096, y)) - active_speaker["coordinates"] = [x, y] - bounding_boxes = kwargs.get("boundingBoxes", None) - if isinstance(bounding_boxes, list) and len(bounding_boxes) > 0: - active_speaker["boundingBoxes"] = bounding_boxes[:4] - return (active_speaker,) - - -NODE_CLASS_MAPPINGS = { - "RunwareVideoInferenceSettingsActiveSpeakerDetection": RunwareVideoInferenceSettingsActiveSpeakerDetection, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareVideoInferenceSettingsActiveSpeakerDetection": "Runware Video Inference Settings Active Speaker Detection", -} diff --git a/modules/videoInferenceSettingsControl.py b/modules/videoInferenceSettingsControl.py deleted file mode 100644 index 89c2c8c..0000000 --- a/modules/videoInferenceSettingsControl.py +++ /dev/null @@ -1,137 +0,0 @@ -""" -Runware Video Inference Settings Edit -Exposes settings.edit (autoControls, strength, controls) for video editing models. -Connect the output to Runware Video Inference Settings → edit. -""" - -from typing import Dict, Any - -_STRENGTH_PRESETS = [ - "adhere_1", "adhere_2", "adhere_3", - "flex_1", "flex_2", "flex_3", - "reimagine_1", "reimagine_2", "reimagine_3", -] - - -class RunwareVideoInferenceSettingsControl: - """Optional settings.edit block for video inference (e.g. Luma Ray 3.2).""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useAutoControls": ("BOOLEAN", { - "tooltip": "Enable to include autoControls in settings.edit.", - "default": False, - }), - "autoControls": ("BOOLEAN", { - "tooltip": "Derives the full conditioning schedule from the source video. Cannot be combined with settings.edit.strength or settings.edit.controls. Only used when 'Use Auto Controls' is enabled.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useStrength": ("BOOLEAN", { - "tooltip": "Enable to include strength in settings.edit.", - "default": False, - }), - "strength": (_STRENGTH_PRESETS, { - "tooltip": "Preservation preset: adhere (stay close to source), flex (moderate changes), or reimagine (loose guidance). Cannot be combined with autoControls. Only used when 'Use Strength' is enabled.", - "default": "flex_2", - }), - "useDepthBlur": ("BOOLEAN", { - "tooltip": "Enable to include depthBlur in settings.edit.controls.", - "default": False, - }), - "depthBlur": ("FLOAT", { - "tooltip": "Scene-geometry depth blur (0–1). Higher values allow more freedom. Only used when 'Use Depth Blur' is enabled.", - "default": 0.0, - "min": 0.0, - "max": 1.0, - "step": 0.01, - }), - "useFace": ("BOOLEAN", { - "tooltip": "Enable to include face in settings.edit.controls.", - "default": False, - }), - "face": ("BOOLEAN", { - "tooltip": "Enable face-identity conditioning. Only used when 'Use Face' is enabled.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useNormalsAugmentation": ("BOOLEAN", { - "tooltip": "Enable to include normalsAugmentation in settings.edit.controls.", - "default": False, - }), - "normalsAugmentation": ("FLOAT", { - "tooltip": "Surface-geometry normals augmentation (0–1). Higher values allow more reinterpretation. Only used when 'Use Normals Augmentation' is enabled.", - "default": 0.0, - "min": 0.0, - "max": 1.0, - "step": 0.01, - }), - "usePoseStrength": ("BOOLEAN", { - "tooltip": "Enable to include poseStrength in settings.edit.controls.", - "default": False, - }), - "poseStrength": (["precise", "coarse"], { - "tooltip": "Skeleton conditioning strength. Only used when 'Use Pose Strength' is enabled.", - "default": "precise", - }), - "useTrajectorySparsity": ("BOOLEAN", { - "tooltip": "Enable to include trajectorySparsity in settings.edit.controls.", - "default": False, - }), - "trajectorySparsity": ("FLOAT", { - "tooltip": "Motion-anchoring sparsity (0–1). Higher values use fewer anchors. Only used when 'Use Trajectory Sparsity' is enabled.", - "default": 0.0, - "min": 0.0, - "max": 1.0, - "step": 0.01, - }), - }, - } - - RETURN_TYPES = ("RUNWAREVIDEOINFERENCESETTINGSEDIT",) - RETURN_NAMES = ("edit",) - FUNCTION = "create" - CATEGORY = "Runware" - DESCRIPTION = ( - "Configure settings.edit (autoControls, strength, controls) for Runware Video Inference. " - "Connect to Runware Video Inference Settings → edit." - ) - - def create(self, **kwargs) -> tuple[Dict[str, Any]]: - edit: Dict[str, Any] = {} - - if kwargs.get("useAutoControls", False): - edit["autoControls"] = bool(kwargs.get("autoControls", False)) - if kwargs.get("useStrength", False): - edit["strength"] = str(kwargs.get("strength", "flex_2")) - - controls: Dict[str, Any] = {} - if kwargs.get("useDepthBlur", False): - controls["depthBlur"] = float(kwargs.get("depthBlur", 0.0)) - if kwargs.get("useFace", False): - controls["face"] = bool(kwargs.get("face", False)) - if kwargs.get("useNormalsAugmentation", False): - controls["normalsAugmentation"] = float(kwargs.get("normalsAugmentation", 0.0)) - if kwargs.get("usePoseStrength", False): - controls["poseStrength"] = str(kwargs.get("poseStrength", "precise")) - if kwargs.get("useTrajectorySparsity", False): - controls["trajectorySparsity"] = float(kwargs.get("trajectorySparsity", 0.0)) - - if len(controls) > 0: - edit["controls"] = controls - - return (edit,) - - -NODE_CLASS_MAPPINGS = { - "RunwareVideoInferenceSettingsControl": RunwareVideoInferenceSettingsControl, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareVideoInferenceSettingsControl": "Runware Video Inference Settings Edit", -} diff --git a/modules/videoInferenceSettingsSegments.py b/modules/videoInferenceSettingsSegments.py deleted file mode 100644 index d8c8e8e..0000000 --- a/modules/videoInferenceSettingsSegments.py +++ /dev/null @@ -1,101 +0,0 @@ -""" -Runware Video Inference Settings Segments -Builds settings.segments[] for Sync models. -Each segment can include startTime, endTime, audio, and optional audio crop range. -""" - -from typing import Any - - -class RunwareVideoInferenceSettingsSegments: - """Optional settings.segments[] block for video inference (Sync).""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useSegment1": ("BOOLEAN", {"default": False, "tooltip": "Enable segment 1."}), - "segment1StartTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 1 start time in seconds."}), - "segment1EndTime": ("FLOAT", {"default": 1.0, "step": 0.01, "tooltip": "Segment 1 end time in seconds."}), - "segment1Audio": ("STRING", {"default": "", "tooltip": "Segment 1 audio mediaUUID. Connect from Runware Media Upload output."}), - "useSegment1AudioCrop": ("BOOLEAN", {"default": False, "tooltip": "Enable audioStartTime/audioEndTime for segment 1."}), - "segment1AudioStartTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 1 audio crop start time in seconds."}), - "segment1AudioEndTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 1 audio crop end time in seconds."}), - - "useSegment2": ("BOOLEAN", {"default": False, "tooltip": "Enable segment 2."}), - "segment2StartTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 2 start time in seconds."}), - "segment2EndTime": ("FLOAT", {"default": 1.0, "step": 0.01, "tooltip": "Segment 2 end time in seconds."}), - "segment2Audio": ("STRING", {"default": "", "tooltip": "Segment 2 audio mediaUUID. Connect from Runware Media Upload output."}), - "useSegment2AudioCrop": ("BOOLEAN", {"default": False, "tooltip": "Enable audioStartTime/audioEndTime for segment 2."}), - "segment2AudioStartTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 2 audio crop start time in seconds."}), - "segment2AudioEndTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 2 audio crop end time in seconds."}), - - "useSegment3": ("BOOLEAN", {"default": False, "tooltip": "Enable segment 3."}), - "segment3StartTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 3 start time in seconds."}), - "segment3EndTime": ("FLOAT", {"default": 1.0, "step": 0.01, "tooltip": "Segment 3 end time in seconds."}), - "segment3Audio": ("STRING", {"default": "", "tooltip": "Segment 3 audio mediaUUID. Connect from Runware Media Upload output."}), - "useSegment3AudioCrop": ("BOOLEAN", {"default": False, "tooltip": "Enable audioStartTime/audioEndTime for segment 3."}), - "segment3AudioStartTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 3 audio crop start time in seconds."}), - "segment3AudioEndTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 3 audio crop end time in seconds."}), - - "useSegment4": ("BOOLEAN", {"default": False, "tooltip": "Enable segment 4."}), - "segment4StartTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 4 start time in seconds."}), - "segment4EndTime": ("FLOAT", {"default": 1.0, "step": 0.01, "tooltip": "Segment 4 end time in seconds."}), - "segment4Audio": ("STRING", {"default": "", "tooltip": "Segment 4 audio mediaUUID. Connect from Runware Media Upload output."}), - "useSegment4AudioCrop": ("BOOLEAN", {"default": False, "tooltip": "Enable audioStartTime/audioEndTime for segment 4."}), - "segment4AudioStartTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 4 audio crop start time in seconds."}), - "segment4AudioEndTime": ("FLOAT", {"default": 0.0, "step": 0.01, "tooltip": "Segment 4 audio crop end time in seconds."}), - }, - } - - RETURN_TYPES = ("RUNWAREVIDEOINFERENCESETTINGSSEGMENTS",) - RETURN_NAMES = ("segments",) - FUNCTION = "create" - CATEGORY = "Runware" - DESCRIPTION = ( - "Configure settings.segments[] for Runware Video Inference (Sync). " - "Each enabled segment includes startTime, endTime, audio and optional audioStartTime/audioEndTime." - ) - - def _build_segment(self, kwargs: dict[str, Any], idx: int) -> dict[str, Any]: - start = float(kwargs.get(f"segment{idx}StartTime", 0.0)) - end = float(kwargs.get(f"segment{idx}EndTime", 1.0)) - audio = (kwargs.get(f"segment{idx}Audio", "") or "").strip() - - if audio == "": - raise ValueError(f"segment{idx}Audio is required when segment {idx} is enabled.") - if end < start: - raise ValueError(f"segment{idx}EndTime must be >= segment{idx}StartTime.") - - segment: dict[str, Any] = { - "startTime": start, - "endTime": end, - "audio": audio, - } - - if kwargs.get(f"useSegment{idx}AudioCrop", False): - astart = float(kwargs.get(f"segment{idx}AudioStartTime", 0.0)) - aend = float(kwargs.get(f"segment{idx}AudioEndTime", 0.0)) - if aend < astart: - raise ValueError(f"segment{idx}AudioEndTime must be >= segment{idx}AudioStartTime.") - segment["audioStartTime"] = astart - segment["audioEndTime"] = aend - - return segment - - def create(self, **kwargs) -> tuple[list]: - segments: list[dict[str, Any]] = [] - for idx in (1, 2, 3, 4): - if kwargs.get(f"useSegment{idx}", False): - segments.append(self._build_segment(kwargs, idx)) - return (segments,) - - -NODE_CLASS_MAPPINGS = { - "RunwareVideoInferenceSettingsSegments": RunwareVideoInferenceSettingsSegments, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareVideoInferenceSettingsSegments": "Runware Video Inference Settings Segments", -} diff --git a/modules/videoInferenceSettingsSourcePosition.py b/modules/videoInferenceSettingsSourcePosition.py deleted file mode 100644 index 7b97eb2..0000000 --- a/modules/videoInferenceSettingsSourcePosition.py +++ /dev/null @@ -1,74 +0,0 @@ -""" -Runware Video Inference Settings Source Position -Exposes settings.sourcePosition for placing source video within the output canvas. -Connect the output to Runware Video Inference Settings → sourcePosition. -""" - -from typing import Dict, Any - - -class RunwareVideoInferenceSettingsSourcePosition: - """Optional settings.sourcePosition block for video inference.""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "width": ("FLOAT", { - "tooltip": "Width of the source video, as a fraction of the canvas width (max 2). Paired with height. Requires inputs.video and output width/height on the inference request.", - "default": 1.0, - "min": 0.0, - "max": 2.0, - "step": 0.01, - }), - "height": ("FLOAT", { - "tooltip": "Height of the source video, as a fraction of the canvas height (max 2). Paired with width.", - "default": 1.0, - "min": 0.0, - "max": 2.0, - "step": 0.01, - }), - "x": ("FLOAT", { - "tooltip": "Horizontal position of the source video, as a fraction of the canvas width (-2 to 2).", - "default": 0.0, - "min": -2.0, - "max": 2.0, - "step": 0.01, - }), - "y": ("FLOAT", { - "tooltip": "Vertical position of the source video, as a fraction of the canvas height (-2 to 2).", - "default": 0.0, - "min": -2.0, - "max": 2.0, - "step": 0.01, - }), - }, - } - - RETURN_TYPES = ("RUNWAREVIDEOINFERENCESETTINGSSOURCEPOSITION",) - RETURN_NAMES = ("sourcePosition",) - FUNCTION = "create" - CATEGORY = "Runware" - DESCRIPTION = ( - "Configure settings.sourcePosition (width, height, x, y) for Runware Video Inference. " - "Connect to Runware Video Inference Settings → sourcePosition." - ) - - def create(self, **kwargs) -> tuple[Dict[str, Any]]: - source_position = { - "width": float(kwargs.get("width", 1.0)), - "height": float(kwargs.get("height", 1.0)), - "x": float(kwargs.get("x", 0.0)), - "y": float(kwargs.get("y", 0.0)), - } - return (source_position,) - - -NODE_CLASS_MAPPINGS = { - "RunwareVideoInferenceSettingsSourcePosition": RunwareVideoInferenceSettingsSourcePosition, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareVideoInferenceSettingsSourcePosition": "Runware Video Inference Settings Source Position", -} diff --git a/modules/videoInferenceSettingsTts.py b/modules/videoInferenceSettingsTts.py deleted file mode 100644 index a50cb87..0000000 --- a/modules/videoInferenceSettingsTts.py +++ /dev/null @@ -1,67 +0,0 @@ -""" -Runware Video Inference Settings TTS -Exposes settings.tts fields (stability, similarityBoost) for Sync / ElevenLabs-style tuning. -Connect the output to Runware Video Inference Settings → tts. -""" - -from typing import Dict, Any - - -class RunwareVideoInferenceSettingsTts: - """Optional settings.tts block for video inference (Sync).""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useStability": ("BOOLEAN", { - "tooltip": "Enable to include stability in settings.tts.", - "default": False, - }), - "stability": ("FLOAT", { - "tooltip": "TTS stability (0–1). Optional Sync / ElevenLabs-style tuning. Only used when 'Use Stability' is enabled.", - "default": 0.5, - "min": 0.0, - "max": 1.0, - "step": 0.01, - }), - "useSimilarityBoost": ("BOOLEAN", { - "tooltip": "Enable to include similarityBoost in settings.tts.", - "default": False, - }), - "similarityBoost": ("FLOAT", { - "tooltip": "TTS similarity boost (0–1). Optional Sync / ElevenLabs-style tuning. Only used when 'Use Similarity Boost' is enabled.", - "default": 0.75, - "min": 0.0, - "max": 1.0, - "step": 0.01, - }), - }, - } - - RETURN_TYPES = ("RUNWAREVIDEOINFERENCESETTINGSTTS",) - RETURN_NAMES = ("tts",) - FUNCTION = "create" - CATEGORY = "Runware" - DESCRIPTION = ( - "Configure settings.tts (stability, similarityBoost) for Runware Video Inference. " - "Connect to Runware Video Inference Settings → tts (Sync)." - ) - - def create(self, **kwargs) -> tuple[Dict[str, Any]]: - tts: Dict[str, Any] = {} - if kwargs.get("useStability", False): - tts["stability"] = float(kwargs.get("stability", 0.5)) - if kwargs.get("useSimilarityBoost", False): - tts["similarityBoost"] = float(kwargs.get("similarityBoost", 0.75)) - return (tts,) - - -NODE_CLASS_MAPPINGS = { - "RunwareVideoInferenceSettingsTts": RunwareVideoInferenceSettingsTts, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareVideoInferenceSettingsTts": "Runware Video Inference Settings TTS", -} diff --git a/modules/videoInferenceSpeechInput.py b/modules/videoInferenceSpeechInput.py deleted file mode 100644 index 2ba0b54..0000000 --- a/modules/videoInferenceSpeechInput.py +++ /dev/null @@ -1,112 +0,0 @@ -""" -Runware Video Inference Speech Input Node. -Provides voice and text for speech synthesis; connect only to Runware Video Inference → speech (not Video Inference Inputs → Speech Inputs; that socket expects RUNWARESPEECHINPUT). -""" - -from typing import Any, Dict, Tuple - - -class RunwareVideoInferenceSpeechInput: - """Runware Video Inference Speech Input Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useVoice": ("BOOLEAN", { - "tooltip": "Enable to include voice in speech synthesis.", - "default": False, - }), - "voice": ("STRING", { - "tooltip": "Voice ID for text-to-speech or speech-to-speech. Required when text script is provided. Only used when 'Use Voice' is enabled.", - "default": "", - }), - "useText": ("BOOLEAN", { - "tooltip": "Enable to include text in speech synthesis.", - "default": False, - }), - "text": ("STRING", { - "multiline": True, - "tooltip": "Text script for the avatar to speak. Use with voice, or text-only when voice is described via settings.voiceDescription on Runware Video Inference Settings. Only used when 'Use Text' is enabled.", - "default": "", - }), - "useSpeed": ("BOOLEAN", { - "tooltip": "Enable to set voice playback speed multiplier.", - "default": False, - }), - "speed": ("FLOAT", { - "tooltip": "Voice playback speed multiplier (0.5 - 1.5). Only used when 'Use Speed' is enabled.", - "default": 1.0, - "min": 0.5, - "max": 1.5, - "step": 0.05, - }), - "usePitch": ("BOOLEAN", { - "tooltip": "Enable to set voice pitch adjustment in semitones.", - "default": False, - }), - "pitch": ("FLOAT", { - "tooltip": "Voice pitch adjustment in semitones (-50 to 50). Only used when 'Use Pitch' is enabled.", - "default": 0.0, - "min": -50.0, - "max": 50.0, - "step": 0.5, - }), - "useLanguage": ("BOOLEAN", { - "tooltip": "Enable to set locale or accent hint for multilingual voices.", - "default": False, - }), - "language": ("STRING", { - "tooltip": "Locale or accent hint for multilingual voices, e.g. en-US. Only used when 'Use Language' is enabled.", - "default": "", - }), - }, - } - - RETURN_TYPES: Tuple[str] = ("RUNWAREVIDEOINFERENCESPEECHINPUT",) - RETURN_NAMES = ("speech",) - FUNCTION = "createSpeech" - CATEGORY = "Runware" - DESCRIPTION = ( - "Configure speech synthesis for Runware Video Inference. Connect the output to Runware Video Inference → speech " - "(top-level task speech). For speech inside inputs (e.g. inputs.speech), use Runware Video Speech Input " - "(RUNWARESPEECHINPUT) into Video Inference Inputs → Speech Inputs. " - "Outputs speech when at least one of voice or text is included (non-empty with its toggle); " - "text-only is valid when voice is supplied via settings.voiceDescription. " - "Optional fields (speed, pitch, language) are added only when their toggles are on." - ) - - def createSpeech(self, **kwargs) -> tuple: - """Build speech dict for the Runware Video Inference speech connection (top-level task speech). Returns None if neither voice nor text is set.""" - speech: Dict[str, Any] = {} - - voice = (kwargs.get("voice") or "").strip() - if kwargs.get("useVoice") and voice: - speech["voice"] = voice - - text = (kwargs.get("text") or "").strip() - if kwargs.get("useText") and text: - speech["text"] = text - - if kwargs.get("useSpeed"): - speech["speed"] = float(kwargs.get("speed", 1.0)) - if kwargs.get("usePitch"): - speech["pitch"] = float(kwargs.get("pitch", 0.0)) - if kwargs.get("useLanguage"): - lang = (kwargs.get("language") or "").strip() - if lang: - speech["language"] = lang - - if "voice" not in speech and "text" not in speech: - return (None,) - return (speech,) - - -NODE_CLASS_MAPPINGS = { - "RunwareVideoInferenceSpeechInput": RunwareVideoInferenceSpeechInput, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareVideoInferenceSpeechInput": "Runware Video Inference Speech Input", -} diff --git a/modules/videoInputsFrame.py b/modules/videoInputsFrame.py deleted file mode 100644 index 60fc4e8..0000000 --- a/modules/videoInputsFrame.py +++ /dev/null @@ -1,117 +0,0 @@ -from .utils import runwareUtils as rwUtils - - -class RunwareVideoInputsFrameImages: - """Video Inputs Frame node for adapting frame images structure for video inference""" - - MAX_FRAMES = 4 - FRAME_POSITIONS = ["first", "last"] - - @classmethod - def INPUT_TYPES(cls): - optionalInputs = {} - - for i in range(1, cls.MAX_FRAMES + 1): - optionalInputs[f"image{i}"] = ("IMAGE", { - "tooltip": "Frame image to include in video inference inputs.frameImages.", - }) - optionalInputs[f"useFrame{i}"] = ("BOOLEAN", { - "tooltip": "Enable to set frame position (first/last).", - "default": False, - }) - optionalInputs[f"frame{i} position"] = (cls.FRAME_POSITIONS, { - "default": "first", - "tooltip": "Frame position: 'first' or 'last'. Only used when 'Use Frame' is enabled.", - }) - optionalInputs[f"useTimestamp{i}"] = ("BOOLEAN", { - "tooltip": "Enable to set a timestamp (seconds) within the input video.", - "default": False, - }) - optionalInputs[f"timestamp{i}"] = ("FLOAT", { - "default": 0.0, - "min": 0.0, - "max": 9999.0, - "step": 0.01, - "tooltip": "Timestamp in seconds (hundredths supported, e.g. 3.44). Only used when 'Use Timestamp' is enabled.", - }) - - return { - "required": {}, - "optional": optionalInputs, - } - - DESCRIPTION = ( - "Build inputs.frameImages entries for video inference: " - "{image: base64}, {image: base64, frame: first|last}, or " - "{image: base64, timestamp: seconds}." - ) - FUNCTION = "createFrameInputs" - RETURN_TYPES = ("RUNWAREVIDEOINPUTSFRAMEIMAGES",) - RETURN_NAMES = ("Video Inputs Frame Images",) - CATEGORY = "Runware" - - def createFrameInputs(self, **kwargs): - frameImages = [] - - for i in range(1, self.MAX_FRAMES + 1): - image = kwargs.get(f"image{i}") - if image is None: - continue - - use_frame = kwargs.get(f"useFrame{i}", False) - frame_position = kwargs.get(f"frame{i} position", "first") - use_timestamp = kwargs.get(f"useTimestamp{i}", False) - timestamp = self._parse_timestamp(kwargs.get(f"timestamp{i}", 0.0)) - - frameImages.append( - self._createFrameEntry( - image, - use_frame=use_frame, - frame_position=frame_position, - use_timestamp=use_timestamp, - timestamp=timestamp, - ) - ) - - return (frameImages,) - - @staticmethod - def _parse_timestamp(value, default=0.0): - """Coerce timestamp input; ComfyUI may send '' when the widget is disabled.""" - if value is None: - return default - if isinstance(value, (int, float)): - return max(0.0, float(value)) - if isinstance(value, str): - stripped = value.strip() - if stripped == "": - return default - try: - return max(0.0, float(stripped)) - except ValueError: - return default - return default - - def _createFrameEntry(self, image, use_frame, frame_position, use_timestamp, timestamp): - imageData = rwUtils.convertTensor2IMGBase64Only(image) - entry = {"image": imageData} - - if use_timestamp: - entry["timestamp"] = round(timestamp, 2) - elif use_frame: - frame_value = frame_position - if isinstance(frame_value, str): - frame_value = frame_value.strip() - if frame_value: - entry["frame"] = frame_value - - return entry - - -NODE_CLASS_MAPPINGS = { - "RunwareVideoInputsFrameImages": RunwareVideoInputsFrameImages, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareVideoInputsFrameImages": "Runware Video Inputs Frame Images", -} diff --git a/modules/videoInputsReferenceImagesMultipleImagesConnector.py b/modules/videoInputsReferenceImagesMultipleImagesConnector.py deleted file mode 100644 index 13076bf..0000000 --- a/modules/videoInputsReferenceImagesMultipleImagesConnector.py +++ /dev/null @@ -1,46 +0,0 @@ -from typing import List -from .utils import runwareUtils as rwUtils - - -class RunwareVideoInputsReferenceImagesMultipleImagesConnector: - """Collect up to 4 images for one referenceImages entry.""" - - MAX_IMAGES = 4 - - @classmethod - def INPUT_TYPES(cls): - optionalInputs = {} - for i in range(1, cls.MAX_IMAGES + 1): - optionalInputs[f"Image{i}"] = ("IMAGE", { - "tooltip": f"Optional image {i} for this reference group.", - }) - return { - "required": {}, - "optional": optionalInputs, - } - - DESCRIPTION = ( - "Collect up to 4 images for one referenceImages item. " - "Connect this output to Images1/Images2/... on Runware Video Inference Inputs Reference Images." - ) - FUNCTION = "createImages" - RETURN_TYPES = ("RUNWAREVIDEOINPUTSREFERENCEMULTIIMAGES",) - RETURN_NAMES = ("Images",) - CATEGORY = "Runware" - - def createImages(self, **kwargs) -> tuple[List[str]]: - images: List[str] = [] - for i in range(1, self.MAX_IMAGES + 1): - image = kwargs.get(f"Image{i}") - if image is not None: - images.append(rwUtils.convertTensor2IMG(image)) - return (images,) - - -NODE_CLASS_MAPPINGS = { - "RunwareVideoInputsReferenceImagesMultipleImagesConnector": RunwareVideoInputsReferenceImagesMultipleImagesConnector, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareVideoInputsReferenceImagesMultipleImagesConnector": "Runware Video Inference Inputs Reference Images Multiple Images Connector", -} diff --git a/modules/videoInputsReferences.py b/modules/videoInputsReferences.py deleted file mode 100644 index 6b4e848..0000000 --- a/modules/videoInputsReferences.py +++ /dev/null @@ -1,107 +0,0 @@ -from .utils import runwareUtils as rwUtils -from typing import List, Dict, Any - - -class videoInputsReferences: - """Video Inputs References node for configuring reference images with types""" - - MAX_REFERENCES = 10 - MAX_GROUPED_REFERENCES = 4 - - @classmethod - def INPUT_TYPES(cls): - optionalInputs = {} - - for i in range(1, cls.MAX_REFERENCES + 1): - ordinal = rwUtils.getOrdinal(i) - optionalInputs[f"Image{i}"] = ("IMAGE", { - "tooltip": f"{ordinal.capitalize()} single reference image (mutually exclusive with Images{i}).", - }) - if i <= cls.MAX_GROUPED_REFERENCES: - optionalInputs[f"Images{i}"] = ("RUNWAREVIDEOINPUTSREFERENCEMULTIIMAGES", { - "tooltip": f"{ordinal.capitalize()} reference image group from the Multiple Images Connector (mutually exclusive with Image{i}).", - }) - optionalInputs[f"Tag{i}"] = ("STRING", { - "tooltip": f"Optional tag for the {ordinal} reference (e.g., @image{i}, @Actor-1).", - "default": "", - }) - optionalInputs[f"Type{i}"] = ("STRING", { - "tooltip": f"Type for the {ordinal} reference (e.g., image or grid). Leave empty to omit.", - "default": "", - }) - optionalInputs[f"Audio{i}"] = ("STRING", { - "tooltip": f"Optional audio URL/mediaUUID for the {ordinal} reference.", - "default": "", - }) - - return { - "required": {}, - "optional": optionalInputs - } - - DESCRIPTION = ( - "Configure up to 10 reference image entries for video inference inputs. " - "For slots 1-4, provide either ImageN (single image) or ImagesN (connector output), not both." - ) - FUNCTION = "createReferences" - RETURN_TYPES = ("RUNWAREVIDEOINPUTSREFERENCEIMAGES",) - RETURN_NAMES = ("Video Inputs Reference Images",) - CATEGORY = "Runware" - - def createReferences(self, **kwargs) -> tuple[List[Any]]: - """Create list of reference entries from provided parameters.""" - references: List[Any] = [] - - for i in range(1, self.MAX_REFERENCES + 1): - imageKey = f"Image{i}" - imagesKey = f"Images{i}" - tagKey = f"Tag{i}" - typeKey = f"Type{i}" - audioKey = f"Audio{i}" - - image = kwargs.get(imageKey) - images = kwargs.get(imagesKey) - refTag = (kwargs.get(tagKey) or "").strip() - refType = kwargs.get(typeKey, "") - refAudio = (kwargs.get(audioKey) or "").strip() - - has_image = image is not None - has_images = isinstance(images, list) and len(images) > 0 - if has_image and has_images: - raise ValueError( - f"Reference {i}: use either {imageKey} or {imagesKey}, not both." - ) - - if has_image or has_images: - reference = self._createReference(image, images, refTag, refType, refAudio) - references.append(reference) - - return (references,) - - def _createReference(self, image, images, refTag: str, refType: str, refAudio: str): - """Create reference entry.""" - entry: Dict[str, Any] = {} - if image is not None: - entry["image"] = rwUtils.convertTensor2IMG(image) - elif isinstance(images, list) and len(images) > 0: - entry["images"] = images - else: - return entry - - if refTag: - entry["tag"] = refTag - if isinstance(refType, str) and refType.strip(): - entry["type"] = refType.strip() - if refAudio: - entry["audio"] = refAudio - return entry - - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareVideoInputsReferences": videoInputsReferences, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareVideoInputsReferences": "Runware Video Inference Inputs Reference Images", -} diff --git a/modules/videoModelSearch.py b/modules/videoModelSearch.py deleted file mode 100644 index 5ed008b..0000000 --- a/modules/videoModelSearch.py +++ /dev/null @@ -1,616 +0,0 @@ -class videoModelSearch: - """Video Model Search node for searching and selecting video models""" - - # Define the video models by architecture with their default dimensions - VIDEO_MODELS = { - "KlingAI": [ - "klingai:1@2 (KlingAI V1.0 Pro)", - "klingai:1@1 (KlingAI V1 Standard)", - "klingai:2@2 (KlingAI V1.5 Pro)", - "klingai:2@1 (KlingAI V1.5 Standard)", - "klingai:3@1 (KlingAI V1.6 Standard)", - "klingai:3@2 (KlingAI V1.6 Pro)", - "klingai:4@3 (KlingAI V2.1 Master)", - "klingai:5@1 (KlingAI V2.1 Standard (I2V))", - "klingai:5@2 (KlingAI V2.1 Pro (I2V))", - "klingai:5@3 (KlingAI V2.0 Master)", - "klingai:6@1 (KlingAI 2.5 Turbo Pro)", - "klingai:7@1 (KlingAI Lip-Sync)", - "klingai:kling@o1 (Kling VIDEO O1)", - "klingai:kling-video@2.6-pro (Kling VIDEO 2.6 Pro)", - "klingai:kling-video@3-pro (Kling VIDEO 3.0 Pro)", - "klingai:kling-video@3-standard (Kling VIDEO 3.0 Standard)", - "klingai:kling-video@3.0-turbo (Kling VIDEO 3.0 Turbo)", - "klingai:kling-video@3-4k (Kling VIDEO 3.0 4K)", - "klingai:kling-video@o3-pro (Kling VIDEO O3 Pro)", - "klingai:kling-video@o3-standard (Kling VIDEO O3 Standard)", - "klingai:kling-video@o3-4k (Kling VIDEO O3 4K)", - "klingai:avatar@2.0-standard (KlingAI Avatar 2.0 Standard)", - "klingai:avatar@2.0-pro (KlingAI Avatar 2.0 Pro)", - ], - "Google": [ - "google:2@0 (Veo 2.0)", - "google:3@0 (Veo 3.0)", - "google:3@1 (Veo 3.0 Fast)", - "google:3@2 (Veo 3.1)", - "google:3@3 (Veo 3.1 Fast)", - "google:veo@3.1-lite (Veo 3.1 Lite)", - "google:gemini@omni-flash (Gemini Omni Flash)", - ], - "Bytedance": [ - "bytedance:2@1 (Seedance 1.0 Pro)", - "bytedance:1@1 (Seedance 1.0 Lite)", - "bytedance:5@1 (OmniHuman 1)", - "bytedance:5@2 (OmniHuman 1.5)", - "bytedance:seedance@1.5-pro (Seedance 1.5 Pro)", - "bytedance:seedance@2.0-fast (Seedance 2.0 Fast)", - "bytedance:seedance@2.0 (Seedance 2.0)", - "bytedance:seedance@2.0-mini (Seedance 2.0 Mini)", - ], - "MiniMax": [ - "minimax:1@1 (MiniMax 01 Base)", - "minimax:2@1 (MiniMax 01 Director)", - "minimax:2@3 (MiniMax I2V 01 Live)", - "minimax:3@1 (MiniMax 02 Hailuo)", - "minimax:4@1 (MiniMax Hailuo 2.3)", - "minimax:4@2 (MiniMax Hailuo 2.3 Fast)", - ], - "PixVerse": [ - "pixverse:1@1 (PixVerse v3.5)", - "pixverse:1@2 (PixVerse v4)", - "pixverse:1@3 (PixVerse v4.5)", - "pixverse:1@5-fast (PixVerse v5 Fast)", - "pixverse:1@6 (PixVerse v5.5)", - "pixverse:1@7 (PixVerse v5.6)", - "pixverse:1@8 (PixVerse v6)", - "pixverse:lipsync@1 (PixVerse LipSync)", - "pixverse:modify@0 (PixVerse Modify)", - ], - "Vidu": [ - "vidu:1@0 (Vidu Q1 Classic)", - "vidu:1@1 (Vidu Q1)", - "vidu:1@5 (Vidu 1.5)", - "vidu:2@0 (Vidu 2.0)", - "vidu:4@1 (Vidu Q3)", - "vidu:4@2 (Vidu Q3 Turbo)", - ], - "Alibaba": [ - "runware:200@1 (Wan 2.1 1.3B)", - "runware:200@2 (Wan 2.1 14B)", - "runware:200@6 (Wan 2.2)", - "runware:200@8 (Wan 2.2 A14B Animate)", - "alibaba:wan@2.6 (Wan 2.6)", - "alibaba:wan@2.6-flash (Wan 2.6 Flash)", - "alibaba:wan@2.7 (Wan 2.7)", - "alibaba:happyhorse@1.0 (Alibaba Happy Horse 1.0)", - "alibaba:happyhorse@1.1 (Alibaba Happy Horse 1.1)", - ], - "OpenAI": [ - "openai:3@1 (OpenAI Sora 3.1)", - "openai:3@0 (OpenAI Sora 3.0)", - ], - "Lightricks": [ - "lightricks:2@0 (LTX Fast)", - "lightricks:2@1 (LTX Pro)", - "lightricks:3@1 (LTX-2 Retake)", - "lightricks:ltx@2 (LTX-2)", - "lightricks:ltx@2.3 (LTX 2.3)", - "lightricks:ltx@2.3-fast (LTX 2.3 Fast)", - "lightricks:ltx@2.3-open (LTX-2.3 Open)", - ], - "Ovi": [ - "runware:190@1 (Ovi)", - ], - "Runway": [ - "runway:aleph@2.0 (Runway Aleph 2.0)", - "runway:2@1 (Runway Aleph)", - "runway:1@1 (Runway Gen-4 Turbo)", - "runway:1@2 (Runway Gen-4.5)", - ], - "Luma": [ - "lumaai:1@1 (Luma Ray 1.6)", - "lumaai:2@1 (Luma Ray 2)", - "lumaai:2@2 (Luma Ray 2 Flash)", - "luma:ray@3.2 (Luma Ray 3.2)", - ], - "Sync": [ - "sync:lipsync-2@1 (Sync LipSync 2)", - "sync:lipsync-2-pro@1 (Sync LipSync 2 Pro)", - "sync:react-1@1 (Sync React-1)", - "sync:3@0 (sync-3)", - ], - "Bria": [ - "bria:60@1 (Bria Video Eraser)", - ], - "Creatify": [ - "creatify:aurora@fast (Creatify Aurora Avatar Model API (720p))", - "creatify:aurora@0 (Creatify Aurora Avatar Model API (720p))", - ], - "HeyGen": [ - "heygen:avatar@4 (HeyGen Avatar IV)", - "heygen:video-agent@0 (HeyGen Video Agent)", - "heygen:avatar@5 (HeyGen Avatar V)", - ], - "Hunyuan": [ - "runware:hunyuanvideo@1.5 (HunyuanVideo-1.5)", - ], - "Kandinsky": [ - "runware:210@1 (Kandinsky 5.0 Lite)", - ], - "xAI": [ - "xai:grok-imagine@video-1.5 (Grok Imagine Video 1.5)", - "xai:grok-imagine@video-1.5-preview (Grok Imagine Video 1.5 Preview)", - "xai:grok-imagine@video (Grok Imagine Video)", - ], - "VEED": [ - "veed:fabric@1.0 (VEED Fabric 1.0)", - ], - "Pruna": [ - "prunaai:p-video@0 (P-Video)", - "prunaai:p-video@avatar (P-Video Avatar)", - "prunaai:p-video@animate (P-Video Animate)", - "prunaai:p-video@replace (P-Video Replace)", - ], - "SkyReels": [ - "skywork:skyreels@v4 (SkyReels V4)", - ], - } - - # Model dimensions mapping - MODEL_DIMENSIONS = { - # KlingAI Models - "klingai:1@2": {"width": 1280, "height": 720}, - "klingai:1@1": {"width": 1280, "height": 720}, - "klingai:2@2": {"width": 1920, "height": 1080}, - "klingai:2@1": {"width": 1280, "height": 720}, - "klingai:3@1": {"width": 1280, "height": 720}, - "klingai:3@2": {"width": 1920, "height": 1080}, - "klingai:4@3": {"width": 1280, "height": 720}, - "klingai:5@1": {"width": 1280, "height": 720}, - "klingai:5@2": {"width": 1920, "height": 1080}, - "klingai:5@3": {"width": 1920, "height": 1080}, - "klingai:6@1": {"width": 1920, "height": 1080}, - "klingai:7@1": {"width": 0, "height": 0}, - "klingai:kling@o1": {"width": 1440, "height": 1440}, - "klingai:kling-video@2.6-pro": {"width": 1920, "height": 1080}, - "klingai:kling-video@3-pro": {"width": 1920, "height": 1080}, - "klingai:kling-video@3-standard": {"width": 1920, "height": 1080}, - "klingai:kling-video@3.0-turbo": {"width": 1920, "height": 1080}, - "klingai:kling-video@3-4k": {"width": 3840, "height": 2160}, - "klingai:kling-video@o3-pro": {"width": 1920, "height": 1080}, - "klingai:kling-video@o3-standard": {"width": 1920, "height": 1080}, - "klingai:kling-video@o3-4k": {"width": 3840, "height": 2160}, - "klingai:avatar@2.0-standard": {"width": 0, "height": 0}, - "klingai:avatar@2.0-pro": {"width": 0, "height": 0}, - - # Veo Models - "google:2@0": {"width": 1280, "height": 720}, - "google:3@0": {"width": 1280, "height": 720}, - "google:3@1": {"width": 1280, "height": 720}, - "google:3@2": {"width": 1280, "height": 720}, - "google:3@3": {"width": 1280, "height": 720}, - "google:veo@3.1-lite": {"width": 1280, "height": 720}, - "google:gemini@omni-flash": {"width": 1280, "height": 720}, - - # Bytedance Models - "bytedance:2@1": {"width": 864, "height": 480}, - "bytedance:1@1": {"width": 864, "height": 480}, - "bytedance:5@1": {"width": 1024, "height": 1024}, - "bytedance:5@2": {"width": 1024, "height": 1024}, - "bytedance:seedance@1.5-pro": {"width": 864, "height": 496}, - "bytedance:seedance@2.0-fast": {"width": 864, "height": 496}, - "bytedance:seedance@2.0": {"width": 864, "height": 496}, - "bytedance:seedance@2.0-mini": {"width": 864, "height": 496}, - - # MiniMax Models - "minimax:1@1": {"width": 1366, "height": 768}, - "minimax:2@1": {"width": 1366, "height": 768}, - "minimax:2@3": {"width": 1366, "height": 768}, - "minimax:3@1": {"width": 1366, "height": 768}, - "minimax:4@1": {"width": 1366, "height": 768}, - "minimax:4@2": {"width": 1366, "height": 768}, - - # PixVerse Models - "pixverse:1@1": {"width": 640, "height": 360}, - "pixverse:1@2": {"width": 640, "height": 360}, - "pixverse:1@3": {"width": 640, "height": 360}, - "pixverse:1@5-fast": {"width": 640, "height": 360}, - "pixverse:1@6": {"width": 640, "height": 360}, - "pixverse:1@7": {"width": 640, "height": 360}, - "pixverse:1@8": {"width": 640, "height": 360}, - "pixverse:lipsync@1": {"width": 640, "height": 360}, - "pixverse:modify@0": {"width": 640, "height": 360}, - - # Vidu Models - "vidu:1@0": {"width": 1920, "height": 1080}, - "vidu:1@1": {"width": 1920, "height": 1080}, - "vidu:1@5": {"width": 1920, "height": 1080}, - "vidu:2@0": {"width": 1920, "height": 1080}, - "vidu:4@1": {"width": 1920, "height": 1080}, - "vidu:4@2": {"width": 1920, "height": 1080}, - - # Wan Models - "runware:200@1": {"width": 853, "height": 480}, - "runware:200@2": {"width": 853, "height": 480}, - "runware:200@6": {"width": 1280, "height": 720}, - "runware:200@8": {"width": 1104, "height": 832}, - "alibaba:wan@2.6": {"width": 1280, "height": 720}, - "alibaba:wan@2.6-flash": {"width": 1280, "height": 720}, - "alibaba:wan@2.7": {"width": 1280, "height": 720}, - "alibaba:happyhorse@1.0": {"width": 1280, "height": 720}, - "alibaba:happyhorse@1.1": {"width": 1280, "height": 720}, - - # OpenAI Models - "openai:3@1": {"width": 1280, "height": 720}, - "openai:3@0": {"width": 1280, "height": 720}, - - # Lightricks Models - "lightricks:2@0": {"width": 1920, "height": 1080}, - "lightricks:2@1": {"width": 1920, "height": 1080}, - "lightricks:3@1": {"width": 0, "height": 0}, - "lightricks:ltx@2": {"width": 1024, "height": 1024}, - "lightricks:ltx@2.3": {"width": 1920, "height": 1080}, - "lightricks:ltx@2.3-fast": {"width": 1920, "height": 1080}, - "lightricks:ltx@2.3-open": {"width": 1024, "height": 1024}, - - # Ovi Models - "runware:190@1": {"width": 0, "height": 0}, - - # Runway Models - "runway:aleph@2.0": {"width": 0, "height": 0}, - "runway:2@1": {"width": 1280, "height": 720}, - "runway:1@1": {"width": 1280, "height": 720}, - "runway:1@2": {"width": 1280, "height": 720}, - - # Luma Models - "lumaai:1@1": {"width": 1080, "height": 720}, - "lumaai:2@1": {"width": 1080, "height": 720}, - "lumaai:2@2": {"width": 1080, "height": 720}, - "luma:ray@3.2": {"width": 1280, "height": 720}, - - # Sync Models - "sync:lipsync-2@1": {"width": 0, "height": 0}, - "sync:lipsync-2-pro@1": {"width": 0, "height": 0}, - "sync:react-1@1": {"width": 0, "height": 0}, - "sync:3@0": {"width": 1280, "height": 720}, - - # Bria Models - "bria:60@1": {"width": 0, "height": 0}, - - # Creatify Models - "creatify:aurora@fast": {"width": 1280, "height": 720}, - "creatify:aurora@0": {"width": 1280, "height": 720}, - - # Hunyuan Models - "runware:hunyuanvideo@1.5": {"width": 848, "height": 480}, - - # Kandinsky Models - "runware:210@1": {"width": 512, "height": 512}, - - # xAI Models - "xai:grok-imagine@video-1.5": {"width": 480, "height": 480}, - "xai:grok-imagine@video-1.5-preview": {"width": 480, "height": 480}, - "xai:grok-imagine@video": {"width": 480, "height": 480}, - - # VEED Models (preserves input aspect ratio; resolution = shorter side) - "veed:fabric@1.0": {"width": 1280, "height": 720}, - - # Pruna Models (720p) - "prunaai:p-video@0": {"width": 1280, "height": 720}, - "prunaai:p-video@avatar": {"width": 1280, "height": 720}, - "prunaai:p-video@animate": {"width": 1280, "height": 720}, - "prunaai:p-video@replace": {"width": 1280, "height": 720}, - - # HeyGen Models (Model ID: heygen-avatar-iv, heygen-avatar-v) - "heygen:avatar@4": {"width": 1280, "height": 720}, - "heygen:video-agent@0": {"width": 1280, "height": 720}, - "heygen:avatar@5": {"width": 1280, "height": 720}, - - # SkyReels Models - "skywork:skyreels@v4": {"width": 1280, "height": 720}, - } - - # Model resolutions mapping - MODEL_RESOLUTIONS = { - # KlingAI Models - "klingai:1@2": "720p", - "klingai:1@1": "720p", - "klingai:2@2": "1080p", - "klingai:2@1": "720p", - "klingai:3@1": "720p", - "klingai:3@2": "1080p", - "klingai:4@3": "720p", - "klingai:5@1": "720p", - "klingai:5@2": "1080p", - "klingai:5@3": "1080p", - "klingai:6@1": "1080p", - "klingai:7@1": None, # No resolution support - "klingai:kling@o1": None, # No standard resolution (1440x1440) - "klingai:kling-video@2.6-pro": "1080p", - "klingai:kling-video@3-pro": "1080p", - "klingai:kling-video@3-standard": "1080p", - "klingai:kling-video@3.0-turbo": "1080p", - "klingai:kling-video@3-4k": None, # No 4K option in current resolution dropdown - "klingai:kling-video@o3-pro": "1080p", - "klingai:kling-video@o3-standard": "1080p", - "klingai:kling-video@o3-4k": None, # No 4K option in current resolution dropdown - "klingai:avatar@2.0-standard": None, # No resolution support - "klingai:avatar@2.0-pro": None, # No resolution support - - # Veo Models - "google:2@0": "720p", - "google:3@0": "720p", - "google:3@1": "720p", - "google:3@2": "720p", - "google:3@3": "720p", - "google:veo@3.1-lite": "720p", - "google:gemini@omni-flash": "720p", - - # Bytedance Models - "bytedance:2@1": "480p", - "bytedance:1@1": "480p", - "bytedance:5@1": None, # No resolution support (fixed 1024x1024) - "bytedance:5@2": None, # No resolution support (fixed 1024x1024) - "bytedance:seedance@1.5-pro": "480p", - "bytedance:seedance@2.0-fast": "480p", - "bytedance:seedance@2.0": "480p", - "bytedance:seedance@2.0-mini": "480p", - - # MiniMax Models (support both 768p and 720p, using 768p as primary) - "minimax:1@1": "768p", - "minimax:2@1": "768p", - "minimax:2@3": "768p", - "minimax:3@1": "768p", - "minimax:4@1": "768p", - "minimax:4@2": "768p", - - # PixVerse Models - "pixverse:1@1": "360p", - "pixverse:1@2": "360p", - "pixverse:1@3": "360p", - "pixverse:1@5-fast": "360p", - "pixverse:1@6": "360p", - "pixverse:1@7": "360p", - "pixverse:1@8": "360p", - "pixverse:lipsync@1": "360p", - "pixverse:modify@0": "360p", - - # Vidu Models - "vidu:1@0": "1080p", - "vidu:1@1": "1080p", - "vidu:1@5": "1080p", - "vidu:2@0": "1080p", - "vidu:4@1": "1080p", - "vidu:4@2": "1080p", - - # Wan Models - "runware:200@1": "480p", - "runware:200@2": "480p", - "runware:200@6": "720p", - "runware:200@8": "720p", - "alibaba:wan@2.6": "720p", - "alibaba:wan@2.6-flash": "720p", - "alibaba:wan@2.7": "720p", - "alibaba:happyhorse@1.0": "720p", - "alibaba:happyhorse@1.1": "720p", - - # OpenAI Models - "openai:3@1": "720p", - "openai:3@0": "720p", - - # Lightricks Models - "lightricks:2@0": "1080p", - "lightricks:2@1": "1080p", - "lightricks:3@1": None, # No resolution support - "lightricks:ltx@2": None, # No resolution support (fixed 1024x1024) - "lightricks:ltx@2.3": "1080p", - "lightricks:ltx@2.3-fast": "1080p", - "lightricks:ltx@2.3-open": None, # No resolution support (fixed 1024x1024) - - # Ovi Models - "runware:190@1": None, # No resolution support - - # Runway Models - "runway:aleph@2.0": None, # Output ratio matches input video - "runway:2@1": "720p", - "runway:1@1": "720p", - "runway:1@2": "720p", - - # Luma Models - "lumaai:1@1": "720p", - "lumaai:2@1": "720p", - "lumaai:2@2": "720p", - "luma:ray@3.2": "720p", - - # Sync Models - "sync:lipsync-2@1": "720p", - "sync:lipsync-2-pro@1": "720p", - "sync:react-1@1": "720p", - "sync:3@0": "720p", - - # Bria Models - "bria:60@1": "720p", - - # Creatify Models - "creatify:aurora@fast": "720p", - "creatify:aurora@0": "720p", - - # Hunyuan Models - "runware:hunyuanvideo@1.5": "480p", - - # Kandinsky Models - "runware:210@1": None, # No resolution support (fixed 512x512) - - # xAI Models - "xai:grok-imagine@video-1.5": "480p", - "xai:grok-imagine@video-1.5-preview": "480p", - "xai:grok-imagine@video": "480p", - - # VEED Models - "veed:fabric@1.0": "720p", - - # Pruna Models - "prunaai:p-video@0": "720p", - "prunaai:p-video@avatar": "720p", - "prunaai:p-video@animate": "720p", - "prunaai:p-video@replace": "720p", - - # HeyGen Models - "heygen:avatar@4": "720p", - "heygen:video-agent@0": "720p", - "heygen:avatar@5": "720p", - - # SkyReels Models - "skywork:skyreels@v4": "720p", - } - - MODEL_ARCHITECTURES = [ - "All", - "KlingAI", - "Google", - "Bytedance", - "MiniMax", - "PixVerse", - "Vidu", - "Wan", # Backward-compatible alias for existing workflows - "Alibaba", - "OpenAI", - "Lightricks", - "Ovi", - "Runway", - "Luma", - "Sync", - "Bria", - "Creatify", - "HeyGen", - "Hunyuan", - "Kandinsky", - "xAI", - "VEED", - "Pruna", - "SkyReels", - ] - - DEFAULT_DIMENSIONS = {"width": 1024, "height": 576} - - @classmethod - def INPUT_TYPES(cls): - allModels = cls._getAllModels() - defaultModel = "klingai:5@3 (KlingAI V2.0 Master)" - defaultModelCode = defaultModel.split(" (")[0] - defaultDims = cls.MODEL_DIMENSIONS.get(defaultModelCode, cls.DEFAULT_DIMENSIONS) - defaultResolution = cls.MODEL_RESOLUTIONS.get(defaultModelCode, None) - - return { - "required": { - "Model Search": ("STRING", { - "tooltip": "Search For Specific Video Model By Name Or Civit AIR Code (eg: KlingAI, Veo).", - }), - "Model Architecture": (cls.MODEL_ARCHITECTURES, { - "tooltip": "Choose Video Model Architecture To Filter Results.", - "default": "KlingAI", - }), - "VideoList": (allModels, { - "tooltip": "Video Model Results Will Show UP Here So You Could Choose From.", - "default": defaultModel, - }), - "Use Search Value": ("BOOLEAN", { - "tooltip": "When Enabled, the value you've set in the search input will be used instead.\n\nThis is useful in case the model search API is down or you prefer to set the model manually.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useCustomDimensions": (["Model Default", "Custom", "Disabled"], { - "tooltip": "Model Default: Use model's recommended resolution. Custom: Use custom Width/Height values. Disabled: Don't pass width/height to API.", - "default": "Model Default", - }), - "Width": ("INT", { - "default": defaultDims["width"], - "min": 0, - "max": 4096, - "step": 1, - "tooltip": "Custom Width For The Selected Model. Defaults To Model's Recommended Width.", - }), - "Height": ("INT", { - "default": defaultDims["height"], - "min": 0, - "max": 4096, - "step": 1, - "tooltip": "Custom Height For The Selected Model. Defaults To Model's Recommended Height.", - }), - "useResolution": ("BOOLEAN", { - "tooltip": "Enable to include resolution parameter in API request. Disable if your model doesn't support resolution.", - "default": False, - }), - "resolution": (["360p", "480p", "720p", "768p", "1080p"], { - "tooltip": "Select a standard resolution for Video Inference. Only used when 'Use Resolution' is enabled.", - "default": defaultResolution if defaultResolution else "720p", - }), - }, - } - - @classmethod - def _getAllModels(cls): - """Get all models from all architectures""" - allModels = [] - for models in cls.VIDEO_MODELS.values(): - allModels.extend(models) - return allModels - - DESCRIPTION = "Directly Search and Connect Video Models to Runware Video Inference Nodes In ComfyUI." - FUNCTION = "videoModelSearch" - RETURN_TYPES = ("RUNWAREVIDEOMODEL",) - RETURN_NAMES = ("Runware Video Model",) - CATEGORY = "Runware" - - @classmethod - def VALIDATE_INPUTS(cls, VideoList): - return True - - def videoModelSearch(self, **kwargs): - """Search and return video model with dimensions""" - enableSearchValue = kwargs.get("Use Search Value", False) - searchInput = kwargs.get("Model Search") - customWidth = kwargs.get("Width", 0) - customHeight = kwargs.get("Height", 0) - useCustomDimensions = kwargs.get("useCustomDimensions", "Model Default") - useResolution = kwargs.get("useResolution", False) - resolution = kwargs.get("resolution", "720p") - - if enableSearchValue: - modelAirCode = searchInput - else: - currentModel = kwargs.get("VideoList") - modelAirCode = currentModel.split(" (")[0] - - dimensions = self.MODEL_DIMENSIONS.get(modelAirCode, self.DEFAULT_DIMENSIONS) - modelResolution = self.MODEL_RESOLUTIONS.get(modelAirCode, None) - - if useCustomDimensions == "Custom": - # Use custom dimensions from Width/Height widgets - width = customWidth - height = customHeight - elif useCustomDimensions == "Disabled": - # Don't pass width/height (use None in dict) - width = None - height = None - else: # "Model Default" - # Use model default dimensions - width = dimensions["width"] - height = dimensions["height"] - - resultDict = { - "model": modelAirCode, - "useCustomDimensions": useCustomDimensions, - "width": width, - "height": height, - } - - # Add resolution if enabled and model supports it - if useResolution and modelResolution is not None: - resultDict["resolution"] = resolution - resultDict["useResolution"] = True - else: - resultDict["useResolution"] = False - - return (resultDict,) diff --git a/modules/videoOutputs.py b/modules/videoOutputs.py deleted file mode 100644 index 5e3ca5b..0000000 --- a/modules/videoOutputs.py +++ /dev/null @@ -1,75 +0,0 @@ -from .utils import runwareUtils as rwUtils - - -class RunwareVideoInferenceOutputs: - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Output": ( - "RUNWARETASK", - { - "tooltip": "Connect the OUTPUT from Runware Video Inference.", - }, - ), - }, - "optional": { - "draftId": ("STRING", { - "placeholder": "Draft ID will appear here after generation.", - "tooltip": "This field will be automatically populated with the draft ID from the video inference output.", - }), - "videoId": ("STRING", { - "placeholder": "Video ID will appear here after generation.", - "tooltip": "This field will be automatically populated with the video ID from the video inference output.", - }), - }, - "hidden": {"node_id": "UNIQUE_ID"}, - } - - DESCRIPTION = "Extracts Runware video inference outputs such as draftId and videoId." - FUNCTION = "get_outputs" - RETURN_TYPES = ("STRING", "STRING") - RETURN_NAMES = ("draftID", "videoID") - CATEGORY = "Runware" - OUTPUT_NODE = True # Ensure node executes even if outputs aren't used - - def get_outputs(self, Output, draftId=None, videoId=None, **kwargs): - draft_id = "" - video_id = "" - - try: - data_list = None - - # Handle different possible response shapes defensively - if isinstance(Output, dict): - if "data" in Output: - data_list = Output.get("data", []) - elif "response" in Output and isinstance(Output["response"], dict): - data_list = Output["response"].get("data", []) - - if data_list and len(data_list) > 0: - first = data_list[0] - outputs = first.get("outputs") or {} - if isinstance(outputs, dict): - # draftId is used by some providers - draft_id = outputs.get("draftId", "") or outputs.get("draftID", "") - # videoId / videoID used by other providers - video_id = outputs.get("videoId", "") or outputs.get("videoID", "") - - # Send to frontend so values appear in textboxes (like Media Upload) - rwUtils.sendVideoOutputs(draft_id, video_id, kwargs.get("node_id")) - - except Exception as e: - print(f"[Runware Video Outputs] Failed to parse outputs: {e}") - - return (draft_id, video_id) - - -NODE_CLASS_MAPPINGS = { - "RunwareVideoInferenceOutputs": RunwareVideoInferenceOutputs, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareVideoInferenceOutputs": "Runware Video Inference Outputs", -} - diff --git a/modules/videoSettings.py b/modules/videoSettings.py deleted file mode 100644 index 8f8befb..0000000 --- a/modules/videoSettings.py +++ /dev/null @@ -1,449 +0,0 @@ -""" -Runware Video Inference Settings Node -Provides settings (draft, audio, voicePrompt, safetyFilter, promptUpsampling, voiceDescription, style, thinking, multiClip, shotType, promptExtend, syncMode, mode, emotion, temperature, occlusionDetection, fit, caption, loop, hdr, exrExport, edit, sourcePosition, tts, activeSpeakerDetection, segments, etc.) for Runware Video Inference. -""" - -from typing import Dict, Any - - -class RunwareVideoSettings: - """Runware Video Inference Settings Node""" - - @classmethod - def INPUT_TYPES(cls): - return { - "required": {}, - "optional": { - "useDraft": ("BOOLEAN", { - "tooltip": "Enable to include draft (lower-quality preview mode) in video inference settings.", - "default": False, - }), - "draft": ("BOOLEAN", { - "tooltip": "Draft mode for lower-quality preview. Only used when 'Use Draft' is enabled.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useAudio": ("BOOLEAN", { - "tooltip": "Enable to include audio (save video with audio) in video inference settings.", - "default": False, - }), - "audio": ("BOOLEAN", { - "tooltip": "Save the video with audio. Only used when 'Use Audio' is enabled.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "usePromptUpsampling": ("BOOLEAN", { - "tooltip": "Enable to include promptUpsampling (enhance prompt automatically) in video inference settings.", - "default": False, - }), - "promptUpsampling": ("BOOLEAN", { - "tooltip": "Enhance prompt automatically for better results. Only used when 'Use Prompt Upsampling' is enabled.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useBackgroundColor": ("BOOLEAN", { - "tooltip": "Enable to set background color. Required when background.type = color.", - "default": False, - }), - "backgroundColor": ("STRING", { - "tooltip": "Hex color code (e.g. #ff0000). Required when background.type = color. Only used when 'Use Background Color' is enabled.", - "default": "", - }), - "useRemoveBackground": ("BOOLEAN", { - "tooltip": "Enable to remove the avatar background. Video avatars must be trained with matting enabled.", - "default": False, - }), - "removeBackground": ("BOOLEAN", { - "tooltip": "Remove the avatar background. Only used when 'Use Remove Background' is enabled.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useExpressiveness": ("BOOLEAN", { - "tooltip": "Enable to set avatar expressiveness level. Applies to photo avatars only.", - "default": False, - }), - "expressiveness": (["low", "medium", "high"], { - "tooltip": "Avatar expressiveness level. Applies to photo avatars only. Only used when 'Use Expressiveness' is enabled.", - "default": "low", - }), - "useVoiceDescription": ("BOOLEAN", { - "tooltip": "Enable to include voiceDescription in video inference settings.", - "default": False, - }), - "voiceDescription": ("STRING", { - "default": "", - "multiline": True, - "tooltip": "Voice description text (max 10000 characters). Not supported when inputs.audio is given.", - }), - "useStyle": ("BOOLEAN", { - "tooltip": "Enable to include style (visual style of the video) in video inference settings.", - "default": False, - }), - "style": (["anime", "3d_animation", "clay", "comic", "cyberpunk"], { - "tooltip": "Visual style of the video. Only used when 'Use Style' is enabled.", - "default": "anime", - }), - "useThinking": ("BOOLEAN", { - "tooltip": "Enable to include thinking in video inference settings.", - "default": False, - }), - "thinking": (["enabled", "disabled", "auto"], { - "tooltip": "Thinking mode. Only used when 'Use Thinking' is enabled.", - "default": "auto", - }), - "useMultiClip": ("BOOLEAN", { - "tooltip": "Enable to include multiClip (multi-clip generation with dynamic camera changes; transition endpoint).", - "default": False, - }), - "multiClip": ("BOOLEAN", { - "tooltip": "Multi-clip generation with dynamic camera changes. Available on transition endpoint. Only used when 'Use Multi Clip' is enabled.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useShotType": ("BOOLEAN", { - "tooltip": "Enable to include shotType in video inference settings.", - "default": False, - }), - "shotType": (["single", "multi"], { - "tooltip": "Shot type: single (one continuous shot) or multi (multiple switching shots). Parameter priority: shot_type > prompt. Only used when 'Use Shot Type' is enabled.", - "default": "single", - }), - "usePromptExtend": ("BOOLEAN", { - "tooltip": "Enable to include promptExtend in video inference settings.", - "default": False, - }), - "promptExtend": ("BOOLEAN", { - "tooltip": "Prompt extend flag. Only used when 'Use Prompt Extend' is enabled.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useSyncMode": ("BOOLEAN", { - "tooltip": "Enable to include syncMode in video inference settings.", - "default": False, - }), - "syncMode": (["bounce", "cut_off", "silence", "remap"], { - "tooltip": "Controls how mismatched audio/video lengths are handled. Default provider behavior is usually cropping to shorter duration. Only used when 'Use Sync Mode' is enabled.", - "default": "cut_off", - }), - "tts": ("RUNWAREVIDEOINFERENCESETTINGSTTS", { - "tooltip": "Connect Runware Video Inference Settings TTS for settings.tts (stability, similarityBoost). Sync / ElevenLabs-style optional tuning.", - }), - "activeSpeakerDetection": ("RUNWAREVIDEOINFERENCESETTINGSACTIVESPEAKERDETECTION", { - "tooltip": "Connect Runware Video Inference Settings Active Speaker Detection for settings.activeSpeakerDetection (autoDetect, frameNumber, coordinates).", - }), - "useMode": ("BOOLEAN", { - "tooltip": "Enable to include mode in video inference settings.", - "default": False, - }), - "mode": (["lips", "face", "head"], { - "tooltip": "Sync processing mode. Only used when 'Use Mode' is enabled.", - "default": "lips", - }), - "useEmotion": ("BOOLEAN", { - "tooltip": "Enable to include emotion in video inference settings.", - "default": False, - }), - "emotion": (["happy", "sad", "angry", "disgusted", "surprised", "neutral"], { - "tooltip": "Target emotion for generation. Only used when 'Use Emotion' is enabled.", - "default": "neutral", - }), - "useTemperature": ("BOOLEAN", { - "tooltip": "Enable to include temperature in video inference settings.", - "default": False, - }), - "temperature": ("FLOAT", { - "tooltip": "Sampling temperature. Only used when 'Use Temperature' is enabled.", - "default": 0.7, - "min": 0.0, - "max": 5.0, - "step": 0.01, - }), - "useOcclusionDetection": ("BOOLEAN", { - "tooltip": "Enable to include occlusionDetection in video inference settings.", - "default": False, - }), - "occlusionDetection": ("BOOLEAN", { - "tooltip": "Enable occlusion detection. Only used when 'Use Occlusion Detection' is enabled.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "useKeyframeId": ("BOOLEAN", { - "tooltip": "Enable to include settings.keyframe.keyframe_id in video inference settings.", - "default": False, - }), - "keyframeId": ("INT", { - "tooltip": "Keyframe ID for settings.keyframe.keyframe_id. Only used when 'Use Keyframe ID' is enabled.", - "default": 0, - "min": 0, - "max": 2147483647, - "step": 1, - }), - "segments": ("RUNWAREVIDEOINFERENCESETTINGSSEGMENTS", { - "tooltip": "Connect Runware Video Inference Settings Segments for settings.segments[] (startTime, endTime, audio, audioStartTime, audioEndTime).", - }), - "useVoicePrompt": ("BOOLEAN", { - "tooltip": "Enable to include voicePrompt (delivery style instructions) in video inference settings.", - "default": False, - }), - "voicePrompt": ("STRING", { - "default": "Say the following.", - "multiline": True, - "tooltip": "Speaking style, tone, pacing or emotion instructions for delivery. Only used when 'Use Voice Prompt' is enabled.", - }), - "useSafetyFilter": ("BOOLEAN", { - "tooltip": "Enable to include safetyFilter in video inference settings.", - "default": False, - }), - "safetyFilter": ("BOOLEAN", { - "tooltip": "When false, enables safety filtering on prompts and input images. Only used when 'Use Safety Filter' is enabled.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "useFit": ("BOOLEAN", { - "tooltip": "Enable to include fit (avatar scaling on output canvas) in video inference settings.", - "default": False, - }), - "fit": (["auto", "cover", "contain"], { - "tooltip": "How the avatar is scaled to the output canvas. cover: scale to fill (may crop edges). contain: scale to fit entirely (may show background). auto: server picks based on source and canvas orientations. Only used when 'Use Fit' is enabled.", - "default": "auto", - }), - "useCaption": ("BOOLEAN", { - "tooltip": "Enable to include caption in video inference settings.", - "default": False, - }), - "caption": ("BOOLEAN", { - "tooltip": "Caption flag. Only used when 'Use Caption' is enabled.", - "default": False, - "label_on": "true", - "label_off": "false", - }), - "usePreserveAudio": ("BOOLEAN", { - "tooltip": "Enable to include preserveAudio in video inference settings.", - "default": False, - }), - "preserveAudio": ("BOOLEAN", { - "tooltip": "Preserve source audio in output video. Only used when 'Use Preserve Audio' is enabled.", - "default": True, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useSourceAudioSync": ("BOOLEAN", { - "tooltip": "Enable to include sourceAudioSync in video inference settings.", - "default": False, - }), - "sourceAudioSync": ("BOOLEAN", { - "tooltip": "When true, the source audio is used during generation (affects lip and motion sync).", - "default": True, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useTurbo": ("BOOLEAN", { - "tooltip": "Enable to include turbo in video inference settings.", - "default": False, - }), - "turbo": ("BOOLEAN", { - "tooltip": "Turbo mode: faster generation for slightly lower quality.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useLoop": ("BOOLEAN", { - "tooltip": "Enable to include loop in video inference settings.", - "default": False, - }), - "loop": ("BOOLEAN", { - "tooltip": "Loop the video. Type video only; rejected with 10s, hdr, end_frame, or keyframes. Only used when 'Use Loop' is enabled.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useHdr": ("BOOLEAN", { - "tooltip": "Enable to include hdr in video inference settings.", - "default": False, - }), - "hdr": ("BOOLEAN", { - "tooltip": "HDR output. Requires 720p/1080p; incompatible with 10s or loop. Bills at a higher rate. Only used when 'Use HDR' is enabled.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "useExrExport": ("BOOLEAN", { - "tooltip": "Enable to include exrExport in video inference settings.", - "default": False, - }), - "exrExport": ("BOOLEAN", { - "tooltip": "Export EXR. Requires hdr to be true. Only used when 'Use EXR Export' is enabled.", - "default": False, - "label_on": "Enabled", - "label_off": "Disabled", - }), - "edit": ("RUNWAREVIDEOINFERENCESETTINGSEDIT", { - "tooltip": "Connect Runware Video Inference Settings Edit for settings.edit (autoControls, strength, controls).", - }), - "sourcePosition": ("RUNWAREVIDEOINFERENCESETTINGSSOURCEPOSITION", { - "tooltip": "Connect Runware Video Inference Settings Source Position for settings.sourcePosition (width, height, x, y). Requires inputs.video and output width/height.", - }), - } - } - - RETURN_TYPES = ("RUNWAREVIDEOSETTINGS",) - RETURN_NAMES = ("settings",) - FUNCTION = "createSettings" - CATEGORY = "Runware" - DESCRIPTION = ( - "Configure video inference settings (draft, audio, voicePrompt, safetyFilter, promptUpsampling, voiceDescription, style, thinking, multiClip, shotType, promptExtend, syncMode, mode, emotion, temperature, occlusionDetection, fit, caption, loop, hdr, exrExport, edit, sourcePosition, tts, activeSpeakerDetection, segments, etc.) for Runware Video Inference. " - "Connect to Runware Video Inference node." - ) - - def createSettings(self, **kwargs) -> tuple[Dict[str, Any]]: - """Create settings dict for Video Inference API""" - use_draft = kwargs.get("useDraft", False) - draft = kwargs.get("draft", False) - use_audio = kwargs.get("useAudio", False) - audio = kwargs.get("audio", False) - use_preserve_audio = kwargs.get("usePreserveAudio", False) - preserve_audio = kwargs.get("preserveAudio", True) - use_source_audio_sync = kwargs.get("useSourceAudioSync", False) - source_audio_sync = kwargs.get("sourceAudioSync", True) - use_turbo = kwargs.get("useTurbo", False) - turbo = kwargs.get("turbo", False) - use_loop = kwargs.get("useLoop", False) - loop = kwargs.get("loop", False) - use_hdr = kwargs.get("useHdr", False) - hdr = kwargs.get("hdr", False) - use_exr_export = kwargs.get("useExrExport", False) - exr_export = kwargs.get("exrExport", False) - use_voice_prompt = kwargs.get("useVoicePrompt", False) - voice_prompt = (kwargs.get("voicePrompt") or "").strip() - use_safety_filter = kwargs.get("useSafetyFilter", False) - safety_filter = kwargs.get("safetyFilter", False) - use_fit = kwargs.get("useFit", False) - fit = kwargs.get("fit", "auto") - use_caption = kwargs.get("useCaption", False) - caption = kwargs.get("caption", False) - use_prompt_upsampling = kwargs.get("usePromptUpsampling", False) - prompt_upsampling = kwargs.get("promptUpsampling", False) - use_background_color = kwargs.get("useBackgroundColor", False) - background_color = (kwargs.get("backgroundColor") or "").strip() - use_remove_background = kwargs.get("useRemoveBackground", False) - remove_background = kwargs.get("removeBackground", False) - use_expressiveness = kwargs.get("useExpressiveness", False) - expressiveness = kwargs.get("expressiveness", "low") - use_voice_description = kwargs.get("useVoiceDescription", False) - voice_description = (kwargs.get("voiceDescription") or "").strip() - use_style = kwargs.get("useStyle", False) - style = kwargs.get("style", "anime") - use_thinking = kwargs.get("useThinking", False) - thinking = kwargs.get("thinking", "auto") - use_multi_clip = kwargs.get("useMultiClip", False) - multi_clip = kwargs.get("multiClip", False) - use_shot_type = kwargs.get("useShotType", False) - shot_type = kwargs.get("shotType", "single") - use_prompt_extend = kwargs.get("usePromptExtend", False) - prompt_extend = kwargs.get("promptExtend", False) - use_sync_mode = kwargs.get("useSyncMode", False) - sync_mode = kwargs.get("syncMode", "cut_off") - tts_cfg = kwargs.get("tts", None) - active_speaker_cfg = kwargs.get("activeSpeakerDetection", None) - use_mode = kwargs.get("useMode", False) - mode = kwargs.get("mode", "lips") - use_emotion = kwargs.get("useEmotion", False) - emotion = kwargs.get("emotion", "neutral") - use_temperature = kwargs.get("useTemperature", False) - temperature = kwargs.get("temperature", 0.7) - use_occlusion_detection = kwargs.get("useOcclusionDetection", False) - occlusion_detection = kwargs.get("occlusionDetection", False) - use_keyframe_id = kwargs.get("useKeyframeId", False) - keyframe_id = kwargs.get("keyframeId", 0) - segments_cfg = kwargs.get("segments", None) - edit_cfg = kwargs.get("edit", None) - source_position_cfg = kwargs.get("sourcePosition", None) - - settings: Dict[str, Any] = {} - - if use_draft: - settings["draft"] = bool(draft) - if use_audio: - settings["audio"] = bool(audio) - if use_preserve_audio: - settings["preserveAudio"] = bool(preserve_audio) - if use_source_audio_sync: - settings["sourceAudioSync"] = bool(source_audio_sync) - if use_turbo: - settings["turbo"] = bool(turbo) - if use_loop: - settings["loop"] = bool(loop) - if use_hdr: - settings["hdr"] = bool(hdr) - if use_exr_export: - settings["exrExport"] = bool(exr_export) - if use_voice_prompt and voice_prompt: - settings["voicePrompt"] = voice_prompt - if use_safety_filter: - settings["safetyFilter"] = bool(safety_filter) - if use_fit: - settings["fit"] = str(fit) - if use_caption: - settings["caption"] = bool(caption) - if use_prompt_upsampling: - settings["promptUpsampling"] = bool(prompt_upsampling) - if use_background_color and background_color: - settings["backgroundColor"] = background_color - if use_remove_background: - settings["removeBackground"] = bool(remove_background) - if use_expressiveness: - settings["expressiveness"] = expressiveness - if use_voice_description and voice_description: - settings["voiceDescription"] = voice_description - if use_style: - settings["style"] = style - if use_thinking: - settings["thinking"] = thinking - if use_multi_clip: - settings["multiClip"] = bool(multi_clip) - if use_shot_type: - settings["shotType"] = shot_type - if use_prompt_extend: - settings["promptExtend"] = bool(prompt_extend) - if use_sync_mode: - settings["syncMode"] = sync_mode - if use_mode: - settings["mode"] = mode - if use_emotion: - settings["emotion"] = emotion - if use_temperature: - settings["temperature"] = float(temperature) - if use_occlusion_detection: - settings["occlusionDetection"] = bool(occlusion_detection) - if use_keyframe_id: - settings["keyframe"] = int(keyframe_id) - - if tts_cfg is not None and isinstance(tts_cfg, dict) and len(tts_cfg) > 0: - settings["tts"] = tts_cfg - if active_speaker_cfg is not None and isinstance(active_speaker_cfg, dict) and len(active_speaker_cfg) > 0: - settings["activeSpeakerDetection"] = active_speaker_cfg - if segments_cfg is not None and isinstance(segments_cfg, list) and len(segments_cfg) > 0: - settings["segments"] = segments_cfg - if edit_cfg is not None and isinstance(edit_cfg, dict) and len(edit_cfg) > 0: - settings["edit"] = edit_cfg - if source_position_cfg is not None and isinstance(source_position_cfg, dict) and len(source_position_cfg) > 0: - settings["sourcePosition"] = source_position_cfg - - return (settings,) - - -NODE_CLASS_MAPPINGS = { - "RunwareVideoSettings": RunwareVideoSettings, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareVideoSettings": "Runware Video Inference Settings", -} diff --git a/modules/videoTranscription.py b/modules/videoTranscription.py deleted file mode 100644 index b192fd5..0000000 --- a/modules/videoTranscription.py +++ /dev/null @@ -1,136 +0,0 @@ -from .utils import runwareUtils as rwUtils -import comfy.model_management - - -class videoTranscription: - RUNWARE_VIDEO_TRANSCRIPTION_MODELS = { - "Memories Video Captioning": "memories:1@1", - "Memories Age Detection": "memories:2@1", - } - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "prompt": ("STRING", { - "multiline": True, - "default": "", - "placeholder": "Video transcription will appear here automatically.", - "tooltip": "The video transcription will be loaded here automatically." - }), - "video": ("STRING", { - "default": "", - "placeholder": "Enter video URL, file path, or Runware video UUID", - "tooltip": "The video to transcribe. Can be a URL, file path, or Runware video UUID." - }), - "model": (list(cls.RUNWARE_VIDEO_TRANSCRIPTION_MODELS.keys()), { - "default": "Memories Video Captioning", - "tooltip": "Choose the model to use for video transcription." - }), - }, - "hidden": { "node_id": "UNIQUE_ID" } - } - - DESCRIPTION = "Transcribe spoken audio and visual context from videos into accurate text with speaker labeling and optional chapter summaries." - - FUNCTION = "transcribeVideo" - RETURN_TYPES = ("STRING",) - RETURN_NAMES = ("Video Caption",) - CATEGORY = "Runware" - OUTPUT_NODE = True - - def transcribeVideo(self, **kwargs): - video = kwargs.get("video", "") - modelKey = kwargs.get("model", "Memories Video Captioning") - model = self.RUNWARE_VIDEO_TRANSCRIPTION_MODELS.get(modelKey, modelKey) - - if not video or not video.strip(): - raise Exception("Video URL, file path, or UUID is required") - - # Create task parameters with correct structure - task_params = { - "taskType": "caption", - "taskUUID": rwUtils.genRandUUID(), - "model": model, - "inputs": { - "video": video - } - } - - # Send the task - genConfig = [task_params] - - # Debug: Print the request being sent - print(f"[DEBUG] Sending Video Transcription Request:") - print(f"[DEBUG] Request Payload: {rwUtils.safe_json_dumps(genConfig, indent=2)}") - - try: - genResult = rwUtils.inferenecRequest(genConfig) - - # Debug: Print the response received - print(f"[DEBUG] Received Video Transcription Response:") - print(f"[DEBUG] Response: {rwUtils.safe_json_dumps(genResult, indent=2)}") - except Exception as e: - raise e - - # Get task UUID for polling - taskUUID = task_params["taskUUID"] - - # Poll for result - while True: - # Check for interrupt before each poll - comfy.model_management.throw_exception_if_processing_interrupted() - - # Poll for result - pollResult = rwUtils.pollVideoResult(taskUUID) - print(f"[Debugging] Poll result: {pollResult}") - - # Check for errors first - if pollResult and "errors" in pollResult and len(pollResult["errors"]) > 0: - error_info = pollResult["errors"][0] - error_message = error_info.get("message", "Unknown error") - raise Exception(f"Video transcription failed: {error_message}") - - # Check if we have data - if pollResult and "data" in pollResult and len(pollResult["data"]) > 0: - data = pollResult["data"][0] - - # Check status - if "status" in data: - status = data["status"] - - if status == "success": - # Handle both text (video captioning) and structuredData (age detection) outputs - outputText = None - - if "text" in data: - # Video captioning result - outputText = data["text"] - elif "structuredData" in data: - # Age detection result - format as readable text - structuredData = data["structuredData"] - ageGroup = structuredData.get("ageGroup", "Unknown") - confidence = structuredData.get("confidence", 0.0) - outputText = f"Age Group: {ageGroup}\nConfidence: {confidence:.2%}" - - if outputText: - # Send transcription result - rwUtils.sendVideoTranscription(outputText, kwargs.get("node_id")) - return (outputText,) - else: - raise Exception("No valid output (text or structuredData) in successful response") - elif status == "processing": - # Continue polling - pass - else: - # Error or other status - raise Exception(f"Unexpected status: {status}") - - # Check for interrupt before waiting - comfy.model_management.throw_exception_if_processing_interrupted() - - # Wait before next poll - for _ in range(10): # 10 x 0.1 second = 1 second total - comfy.model_management.throw_exception_if_processing_interrupted() - rwUtils.time.sleep(0.1) - diff --git a/modules/videoUpscaler.py b/modules/videoUpscaler.py deleted file mode 100644 index 7188d4d..0000000 --- a/modules/videoUpscaler.py +++ /dev/null @@ -1,227 +0,0 @@ -from .utils import runwareUtils as rwUtils -import comfy.model_management - -class videoUpscaler: - RUNWARE_VUPSCALER_MODELS = { - "Bria Video Upscaler": "bria:50@1", - "Bytedance Video Upscaler": "bytedance:50@1", - "Topaz Labs Starlight Precise 2.5": "topazlabs:starlight-precise@2.5", - } - - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "Video": ("STRING", { - "tooltip": "MediaUUID from Runware Media Upload node for the video to upscale." - }), - "Model": (list(cls.RUNWARE_VUPSCALER_MODELS.keys()), { - "tooltip": "Select the video upscaler model to use.", - "default": "Bria Video Upscaler", - }), - "useUpscaleFactor": ("BOOLEAN", { - "label_on": "Yes", - "label_off": "No", - "tooltip": "Enable to explicitly set the upscale factor for the request.", - "default": False, - }), - "useFps": ("BOOLEAN", { - "label_on": "Yes", - "label_off": "No", - "tooltip": "Enable to explicitly set FPS for the output video.", - "default": False, - }), - "useDimension": (["none", "custom"], { - "tooltip": "Choose whether to send custom width and height.", - "default": "none", - }), - }, - "optional": { - "upscaleFactor": ([2, 4], { - "tooltip": "Integer scale factor for upscaling (2x or 4x).", - "default": 2, - }), - "fps": ("INT", { - "default": 24, - "min": 1, - "max": 240, - "step": 1, - "tooltip": "Output frames per second (1-240). Used when useFps is enabled.", - }), - "width": ("INT", { - "default": 1920, - "min": 1, - "max": 8192, - "step": 1, - "tooltip": "Custom output width in pixels. Used when useDimension is custom.", - }), - "height": ("INT", { - "default": 1080, - "min": 1, - "max": 8192, - "step": 1, - "tooltip": "Custom output height in pixels. Used when useDimension is custom.", - }), - "Output Format": (["mp4", "webm"], { - "default": "mp4", - "tooltip": "Choose the output video format.", - }), - } - } - - DESCRIPTION = "Enhance the resolution and quality of your videos using Runware's advanced upscaling API." - FUNCTION = "upscale" - RETURN_TYPES = ("VIDEO",) - RETURN_NAMES = ("VIDEO",) - CATEGORY = "Runware" - - def upscale(self, **kwargs): - video_uuid = kwargs.get("Video") - useUpscaleFactor = kwargs.get("useUpscaleFactor", False) - upscaleFactor = kwargs.get("upscaleFactor") - useFps = kwargs.get("useFps", False) - fps = kwargs.get("fps", 24) - useDimension = kwargs.get("useDimension", "none") - width = kwargs.get("width", 1920) - height = kwargs.get("height", 1080) - modelName = kwargs.get("Model", "Bria Video Upscaler") - outputFormat = kwargs.get("Output Format", "mp4") - - # Validate mediaUUID - if not video_uuid or video_uuid.strip() == "": - raise ValueError("Video mediaUUID is required") - - # Get the model AIR code - modelAIR = self.RUNWARE_VUPSCALER_MODELS.get(modelName, "bria:50@1") - - # Build the API request - task_payload = { - "taskType": "upscale", - "taskUUID": rwUtils.genRandUUID(), - "inputs": { - "video": video_uuid - }, - "outputFormat": outputFormat.upper(), - "model": modelAIR, - "includeCost": True - } - - if useUpscaleFactor: - if upscaleFactor in (2, 4): - task_payload["upscaleFactor"] = upscaleFactor - else: - raise ValueError("upscaleFactor must be 2 or 4 when useUpscaleFactor is enabled.") - - if useFps: - if isinstance(fps, int) and 1 <= fps <= 240: - task_payload["fps"] = fps - else: - raise ValueError("fps must be an integer between 1 and 240 when useFps is enabled.") - - if useDimension == "custom": - if isinstance(width, int) and isinstance(height, int) and width > 0 and height > 0: - task_payload["width"] = width - task_payload["height"] = height - else: - raise ValueError("width and height must be positive integers when useDimension is custom.") - elif useDimension != "none": - raise ValueError("useDimension must be either 'none' or 'custom'.") - - genConfig = [task_payload] - - try: - # Debug: Print the request being sent - print(f"[DEBUG] Sending Video Upscale Request:") - print(f"[DEBUG] Request Payload: {rwUtils.safe_json_dumps(genConfig, indent=2)}") - - genResult = rwUtils.inferenecRequest(genConfig) - - # Debug: Print the response received - print(f"[DEBUG] Received Video Upscale Response:") - print(f"[DEBUG] Response: {rwUtils.safe_json_dumps(genResult, indent=2)}") - - # Check for errors - if "errors" in genResult: - error_message = genResult["errors"][0]["message"] - raise Exception(f"Video upscale failed: {error_message}") - - # Extract task UUID for polling - taskUUID = genConfig[0]["taskUUID"] - max_poll_seconds = 2400 # 40 minutes - started_at = rwUtils.time.time() - - # Poll for video completion - while True: - if rwUtils.time.time() - started_at > max_poll_seconds: - raise TimeoutError( - f"Video upscale timed out after {max_poll_seconds} seconds. " - f"Task UUID: {taskUUID}" - ) - - # Check for interrupt before each poll - comfy.model_management.throw_exception_if_processing_interrupted() - - # Poll for video result - pollResult = rwUtils.pollVideoResult(taskUUID) - print(f"[Debugging] Poll result: {pollResult}") - - if not isinstance(pollResult, dict): - # Keep polling if transport layer returned empty/invalid payload. - for _ in range(10): - comfy.model_management.throw_exception_if_processing_interrupted() - rwUtils.time.sleep(0.1) - continue - - # Check for errors first - if pollResult and "errors" in pollResult and len(pollResult["errors"]) > 0: - error_info = pollResult["errors"][0] - error_message = error_info.get("message", "Unknown error") - raise Exception(f"Video upscale failed: {error_message}") - - if pollResult and "data" in pollResult and len(pollResult["data"]) > 0: - video_data = pollResult["data"][0] - - # Check status directly - if "status" in video_data: - status = video_data["status"] - - if status == "success": - if "mediaURL" in video_data or "videoURL" in video_data or "videoBase64Data" in video_data: - out_width = width if useDimension == "custom" else video_data.get("width", 1920) - out_height = height if useDimension == "custom" else video_data.get("height", 1080) - videos = rwUtils.convertVideoB64List(pollResult, out_width, out_height) - # SaveVideo expects a single video object, not a tuple - return (videos[0],) if len(videos) > 0 else (None,) - raise Exception( - "Video upscale returned success without mediaURL/videoURL/videoBase64Data. " - f"Response: {rwUtils.safe_json_dumps(video_data, indent=2)}" - ) - if status in ("failed", "error", "cancelled", "canceled"): - raise Exception( - "Video upscale failed with terminal status " - f"'{status}'. Response: {rwUtils.safe_json_dumps(video_data, indent=2)}" - ) - - # If status is "processing" (or unknown transient), continue polling - - # Check for interrupt before waiting - comfy.model_management.throw_exception_if_processing_interrupted() - - # Wait before next poll - for _ in range(10): # 10 x 0.1 second = 1 second total - comfy.model_management.throw_exception_if_processing_interrupted() - rwUtils.time.sleep(0.1) - - except Exception as e: - print(f"[Error] Video upscale failed: {str(e)}") - raise e - -# Node class mappings -NODE_CLASS_MAPPINGS = { - "RunwareVideoUpscaler": videoUpscaler, -} - -NODE_DISPLAY_NAME_MAPPINGS = { - "RunwareVideoUpscaler": "Runware Video Upscaler", -} - diff --git a/nodes.json b/nodes.json new file mode 100644 index 0000000..2520360 --- /dev/null +++ b/nodes.json @@ -0,0 +1 @@ +{"models": [{"key": "Runware_llama_3_1_8b_prompt_enhancer", "name": "Llama 3.1 8B Prompt Enhancer", "model": "runware:llama-3-1-8b@prompt-enhancer", "task_type": "promptEnhance", "creator": "runware", "input_types": {"required": {"prompt": ["STRING", {"tooltip": "The text prompt to enhance.", "multiline": true, "rw_cat": "core"}]}, "optional": {"promptMaxLength": ["BOOLEAN", {"default": false, "rw_gates": "promptMaxLength_value", "tooltip": "Enable to set promptMaxLength. Off uses the model's default.", "rw_cat": "core"}], "promptMaxLength_value": ["INT", {"min": 12, "max": 400, "tooltip": "Maximum length of the enhanced prompt.", "default": 12, "rw_cat": "core"}], "promptVersions": ["INT", {"default": 1, "min": 1, "max": 5, "tooltip": "Number of enhanced prompt variations to generate.", "rw_cat": "core"}]}}, "param_plan": {"prompt": {"path": ["prompt"], "kind": "scalar"}, "promptMaxLength": {"path": ["promptMaxLength"], "kind": "gate", "value_key": "promptMaxLength_value"}, "promptMaxLength_value": {"path": ["promptMaxLength"], "kind": "skip"}, "promptVersions": {"path": ["promptVersions"], "kind": "scalar"}}}, {"key": "Runware_dia2_2b", "name": "Dia2 2B", "model": "runware:dia2@2b", "task_type": "audioInference", "creator": "runware", "input_types": {"required": {"speech": ["RUNWARE_SPEECH", {"rw_socket_fields": ["text"], "rw_cat": "inputs"}]}, "optional": {"audioSettings": ["RUNWARE_AUDIOSETTINGS"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 3, "min": 1, "max": 30, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.audioTemperature": ["FLOAT", {"default": 0.8, "min": 0, "max": 5, "tooltip": "Sampling temperature for audio token generation. Lower = cleaner audio, higher = more expressive. 0 = greedy decoding.", "rw_cat": "settings"}], "settings.includePrefix": ["BOOLEAN", {"default": false, "tooltip": "Whether to include prefix audio in the final output or trim it.", "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 0.6, "min": 0, "max": 5, "tooltip": "Sampling temperature for text token generation. Lower = more coherent, higher = more variety. 0 = greedy decoding.", "rw_cat": "settings"}], "settings.topK": ["INT", {"default": 50, "min": 1, "max": 500, "tooltip": "Top-K sampling for both text and audio tokens. Limits selection to K most likely tokens per step.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP3", "WAV", "FLAC", "OGG"], {"default": "MP3", "tooltip": "File format for the generated audio.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.audios"}]}}, "param_plan": {"negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "seed": {"path": ["seed"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "speech": {"path": ["speech"], "kind": "feature"}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.audioTemperature": {"path": ["settings", "audioTemperature"], "kind": "scalar"}, "settings.includePrefix": {"path": ["settings", "includePrefix"], "kind": "scalar", "omit_value": false}, "settings.topK": {"path": ["settings", "topK"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "audioSettings": {"path": ["audioSettings"], "kind": "feature"}}}, {"key": "Runware_birefnet_v1_base_cod", "name": "BiRefNet v1 Base \u2013 COD", "model": "runware:112@2", "task_type": "removeBackground", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_controlnet_preprocess_lineart", "name": "ControlNet Preprocess Lineart", "model": "runware:controlnet-preprocess@lineart", "task_type": "controlNetPreprocess", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_birefnet_portrait", "name": "BiRefNet Portrait", "model": "runware:112@10", "task_type": "removeBackground", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_ovi", "name": "Ovi", "model": "runware:190@1", "task_type": "videoInference", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 30, "min": 1, "max": 100, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "fps": ["INT", {"default": 24, "max": 120, "tooltip": "Frames per second for video generation. Higher values create smoother motion but require more processing time.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "advancedFeatures": ["BOOLEAN", {"default": false, "tooltip": "Enable to set advancedFeatures. Off uses the model's default.", "rw_cat": "settings"}], "advancedFeatures.audioCFGScale": ["FLOAT", {"default": 4, "min": 0, "max": 10, "tooltip": "Classifier-free guidance scale for the audio diffusion process. Higher values increase adherence to the text prompt.", "rw_cat": "settings"}], "advancedFeatures.audioNegativePrompt": ["STRING", {"tooltip": "Text describing elements to avoid in the generated audio.", "multiline": true, "default": "", "rw_cat": "settings"}], "advancedFeatures.slgLayer": ["BOOLEAN", {"default": false, "rw_gates": "advancedFeatures.slgLayer_value", "tooltip": "Enable to set advancedFeatures.slgLayer. Off uses the model's default.", "rw_cat": "settings"}], "advancedFeatures.slgLayer_value": ["INT", {"min": 0, "max": 30, "tooltip": "Skip-layer guidance layer index. Set to null to disable.", "default": 0, "rw_cat": "settings"}], "advancedFeatures.videoCFGScale": ["FLOAT", {"default": 5, "min": 0, "max": 10, "tooltip": "Classifier-free guidance scale for the video diffusion process. Higher values increase adherence to the text prompt.", "rw_cat": "settings"}], "advancedFeatures.videoNegativePrompt": ["STRING", {"tooltip": "Text describing elements to avoid in the generated video.", "multiline": true, "default": "", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "fps": {"path": ["fps"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "advancedFeatures": {"path": ["advancedFeatures"], "kind": "group_gate"}, "advancedFeatures.audioCFGScale": {"path": ["advancedFeatures", "audioCFGScale"], "kind": "scalar", "gated_by": "advancedFeatures"}, "advancedFeatures.audioNegativePrompt": {"path": ["advancedFeatures", "audioNegativePrompt"], "kind": "scalar", "omit_empty": true, "gated_by": "advancedFeatures"}, "advancedFeatures.slgLayer": {"path": ["advancedFeatures", "slgLayer"], "kind": "gate", "value_key": "advancedFeatures.slgLayer_value", "gated_by": "advancedFeatures"}, "advancedFeatures.slgLayer_value": {"path": ["advancedFeatures", "slgLayer"], "kind": "skip", "gated_by": "advancedFeatures"}, "advancedFeatures.videoCFGScale": {"path": ["advancedFeatures", "videoCFGScale"], "kind": "scalar", "gated_by": "advancedFeatures"}, "advancedFeatures.videoNegativePrompt": {"path": ["advancedFeatures", "videoNegativePrompt"], "kind": "scalar", "omit_empty": true, "gated_by": "advancedFeatures"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_dia_1_6b", "name": "Dia 1.6B", "model": "runware:dia@1.6b", "task_type": "audioInference", "creator": "runware", "input_types": {"required": {"speech": ["RUNWARE_SPEECH", {"rw_socket_fields": ["text"], "rw_cat": "inputs"}]}, "optional": {"audioSettings": ["RUNWARE_AUDIOSETTINGS"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 10, "min": 1, "max": 30, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.temperature": ["FLOAT", {"default": 1.2, "min": 0, "max": 5, "tooltip": "Controls overall confidence in outputs. Higher values produce more creative results with more artifacts. Lower values are more consistent with fewer outputs.", "rw_cat": "settings"}], "settings.topP": ["FLOAT", {"default": 0.95, "min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP3", "WAV", "FLAC", "OGG"], {"default": "MP3", "tooltip": "File format for the generated audio.", "rw_cat": "output"}]}}, "param_plan": {"negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "seed": {"path": ["seed"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "speech": {"path": ["speech"], "kind": "feature"}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.topP": {"path": ["settings", "topP"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "audioSettings": {"path": ["audioSettings"], "kind": "feature"}}}, {"key": "Runware_flux_1_dev_srpo", "name": "FLUX.1 [dev] SRPO", "model": "runware:111@1", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "controlNet": ["RUNWARE_CONTROLNET", {"rw_socket_models": ["runware:25@1", "runware:26@1", "runware:27@1", "runware:28@1", "runware:29@1", "runware:30@1", "runware:31@1", "runware:98@1"], "rw_socket_fields": ["controlMode", "endStep", "endStepPercentage", "guideImage", "model", "startStep", "startStepPercentage", "weight"], "rw_socket_enums": {"controlMode": ["balanced", "controlnet", "prompt"]}, "rw_cat": "inputs"}], "ipAdapters": ["RUNWARE_IPADAPTERS", {"rw_socket_models": ["runware:56@1", "runware:56@2", "runware:56@3", "runware:56@4"], "rw_socket_fields": ["guideImages", "model", "weight"], "rw_cat": "inputs"}], "pulid": ["RUNWARE_PULID"], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "fbCache", "fbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "trueCFGScale": ["BOOLEAN", {"default": false, "rw_gates": "trueCFGScale_value", "tooltip": "Enable to set trueCFGScale. Off uses the model's default.", "rw_cat": "core"}], "trueCFGScale_value": ["FLOAT", {"tooltip": "True Classifier-Free Guidance scale. Higher values increase prompt adherence at the cost of quality.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "promptWeighting": [["(default)", "sdEmbeds"], {"tooltip": "Syntax used for prompt weighting.", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "layerDiffuse": ["BOOLEAN", {"default": false, "tooltip": "LayerDiffuse for transparent image generation.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: hiresFix"}]}}, "param_plan": {"acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "promptWeighting": {"path": ["promptWeighting"], "kind": "scalar", "omit_value": "(default)"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "controlNet": {"path": ["controlNet"], "kind": "feature"}, "ipAdapters": {"path": ["ipAdapters"], "kind": "feature"}, "layerDiffuse": {"path": ["layerDiffuse"], "kind": "scalar", "omit_value": false}, "pulid": {"path": ["pulid"], "kind": "feature"}, "trueCFGScale": {"path": ["trueCFGScale"], "kind": "gate", "value_key": "trueCFGScale_value"}, "trueCFGScale_value": {"path": ["trueCFGScale"], "kind": "skip"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_mediapipe_face_short", "name": "MediaPipe Face Short", "model": "runware:35@7", "task_type": "imageMasking", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"settings.confidence": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Confidence threshold for detections. Only detections above this score are included.", "rw_cat": "settings"}], "settings.maskBlur": ["INT", {"default": 5, "min": 0, "max": 100, "tooltip": "Blur radius for mask edges, creating smooth transitions.", "rw_cat": "settings"}], "settings.maskPadding": ["INT", {"default": 10, "min": 0, "max": 200, "tooltip": "Pixel amount to extend (positive) or shrink (negative) the mask area.", "rw_cat": "settings"}], "settings.maxDetections": ["INT", {"default": 6, "min": 1, "max": 20, "tooltip": "Maximum number of detections. Prioritizes highest confidence scores if exceeded.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "settings.confidence": {"path": ["settings", "confidence"], "kind": "scalar"}, "settings.maxDetections": {"path": ["settings", "maxDetections"], "kind": "scalar"}, "settings.maskPadding": {"path": ["settings", "maskPadding"], "kind": "scalar"}, "settings.maskBlur": {"path": ["settings", "maskBlur"], "kind": "scalar"}}}, {"key": "Runware_yolov8n_hand", "name": "YOLOv8n Hand", "model": "runware:35@3", "task_type": "imageMasking", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"settings.confidence": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Confidence threshold for detections. Only detections above this score are included.", "rw_cat": "settings"}], "settings.maskBlur": ["INT", {"default": 5, "min": 0, "max": 100, "tooltip": "Blur radius for mask edges, creating smooth transitions.", "rw_cat": "settings"}], "settings.maskPadding": ["INT", {"default": 10, "min": 0, "max": 200, "tooltip": "Pixel amount to extend (positive) or shrink (negative) the mask area.", "rw_cat": "settings"}], "settings.maxDetections": ["INT", {"default": 6, "min": 1, "max": 20, "tooltip": "Maximum number of detections. Prioritizes highest confidence scores if exceeded.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "settings.confidence": {"path": ["settings", "confidence"], "kind": "scalar"}, "settings.maxDetections": {"path": ["settings", "maxDetections"], "kind": "scalar"}, "settings.maskPadding": {"path": ["settings", "maskPadding"], "kind": "scalar"}, "settings.maskBlur": {"path": ["settings", "maskBlur"], "kind": "scalar"}}}, {"key": "Runware_vit_age_classifier", "name": "ViT Age Classifier", "model": "runware:153@1", "task_type": "caption", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_ace_step_v1_5_base", "name": "ACE-Step v1.5 Base", "model": "runware:ace-step@v1.5-base", "task_type": "audioInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"audioSettings": ["RUNWARE_AUDIOSETTINGS"], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "default": "", "rw_cat": "core"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 100, "min": 1, "max": 300, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 10, "min": 1, "max": 30, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Fraction of steps using the input source instead of generated output.", "rw_cat": "core"}], "duration": ["FLOAT", {"default": 60, "min": 30, "max": 300, "step": 0.1, "tooltip": "Length of the generated audio track in seconds.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.bpm": ["BOOLEAN", {"default": false, "rw_gates": "settings.bpm_value", "tooltip": "Enable to set settings.bpm. Off uses the model's default.", "rw_cat": "settings"}], "settings.bpm_value": ["INT", {"min": 30, "max": 300, "tooltip": "Beats per minute. If not set, the model decides automatically.", "default": 30, "rw_cat": "settings"}], "settings.guidanceType": [["apg", "cfg"], {"default": "apg", "tooltip": "Controls how guidance is applied during generation.", "rw_cat": "settings"}], "settings.keyScale": ["STRING", {"tooltip": "Musical key and scale in '{Note}{Accidental} {Mode}' format (e.g. 'C major', 'F# minor', 'Bb major').", "default": "", "rw_cat": "settings"}], "settings.lyrics": ["STRING", {"tooltip": "Song lyrics, typically formatted like a lyrics website.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.repaintingStart": ["BOOLEAN", {"default": false, "rw_gates": "settings.repaintingStart_value", "tooltip": "Enable to set settings.repaintingStart. Off uses the model's default.", "rw_cat": "settings"}], "settings.repaintingStart_value": ["FLOAT", {"min": -300, "max": 300, "tooltip": "Start time in seconds for repaint region. Requires input audio. Negative values prepend audio before the start.", "default": -300.0, "rw_cat": "settings"}], "settings.repaintingEnd": ["BOOLEAN", {"default": false, "rw_gates": "settings.repaintingEnd_value", "tooltip": "Enable to set settings.repaintingEnd. Off uses the model's default.", "rw_cat": "settings"}], "settings.repaintingEnd_value": ["FLOAT", {"min": 0, "max": 300, "tooltip": "End time in seconds for repaint region. Requires input audio. Values beyond audio duration append new audio.", "default": 0.0, "rw_cat": "settings"}], "settings.timeSignature": [["(default)", 2, 3, 4, 6], {"tooltip": "Beats per measure. If not set, the model decides automatically.", "default": "(default)", "rw_cat": "settings"}], "settings.vocalLanguage": [["unknown", "ar", "az", "bg", "bn", "ca", "cs", "da", "de", "el", "en", "es", "fa", "fi", "fr", "he", "hi", "hr", "ht", "hu", "id", "is", "it", "ja", "ko", "la", "lt", "ms", "ne", "nl", "no", "pa", "pl", "pt", "ro", "ru", "sa", "sk", "sr", "sv", "sw", "ta", "te", "th", "tl", "tr", "uk", "ur", "vi", "yue", "zh"], {"default": "en", "tooltip": "ISO 639-1 language code for vocals. `unknown` for instrumental or auto detection.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP3", "WAV", "FLAC", "OGG"], {"default": "MP3", "tooltip": "File format for the generated audio.", "rw_cat": "output"}]}}, "param_plan": {"audio": {"path": ["inputs", "audio"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "settings.bpm": {"path": ["settings", "bpm"], "kind": "gate", "value_key": "settings.bpm_value"}, "settings.bpm_value": {"path": ["settings", "bpm"], "kind": "skip"}, "settings.guidanceType": {"path": ["settings", "guidanceType"], "kind": "scalar"}, "settings.keyScale": {"path": ["settings", "keyScale"], "kind": "scalar", "omit_empty": true}, "settings.lyrics": {"path": ["settings", "lyrics"], "kind": "scalar", "omit_empty": true}, "settings.repaintingEnd": {"path": ["settings", "repaintingEnd"], "kind": "gate", "value_key": "settings.repaintingEnd_value"}, "settings.repaintingEnd_value": {"path": ["settings", "repaintingEnd"], "kind": "skip"}, "settings.repaintingStart": {"path": ["settings", "repaintingStart"], "kind": "gate", "value_key": "settings.repaintingStart_value"}, "settings.repaintingStart_value": {"path": ["settings", "repaintingStart"], "kind": "skip"}, "settings.timeSignature": {"path": ["settings", "timeSignature"], "kind": "scalar", "omit_value": "(default)"}, "settings.vocalLanguage": {"path": ["settings", "vocalLanguage"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "audioSettings": {"path": ["audioSettings"], "kind": "feature"}}}, {"key": "Runware_controlnet_preprocess_normalbae", "name": "ControlNet Preprocess NormalBae", "model": "runware:controlnet-preprocess@normalbae", "task_type": "controlNetPreprocess", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_controlnet_preprocess_mlsd", "name": "ControlNet Preprocess MLSD", "model": "runware:controlnet-preprocess@mlsd", "task_type": "controlNetPreprocess", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_mediapipe_nose_mesh", "name": "MediaPipe Nose Mesh", "model": "runware:35@13", "task_type": "imageMasking", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"settings.confidence": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Confidence threshold for detections. Only detections above this score are included.", "rw_cat": "settings"}], "settings.maskBlur": ["INT", {"default": 5, "min": 0, "max": 100, "tooltip": "Blur radius for mask edges, creating smooth transitions.", "rw_cat": "settings"}], "settings.maskPadding": ["INT", {"default": 10, "min": 0, "max": 200, "tooltip": "Pixel amount to extend (positive) or shrink (negative) the mask area.", "rw_cat": "settings"}], "settings.maxDetections": ["INT", {"default": 6, "min": 1, "max": 20, "tooltip": "Maximum number of detections. Prioritizes highest confidence scores if exceeded.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "settings.confidence": {"path": ["settings", "confidence"], "kind": "scalar"}, "settings.maxDetections": {"path": ["settings", "maxDetections"], "kind": "scalar"}, "settings.maskPadding": {"path": ["settings", "maskPadding"], "kind": "scalar"}, "settings.maskBlur": {"path": ["settings", "maskBlur"], "kind": "scalar"}}}, {"key": "Runware_hidream_i1_fast", "name": "HiDream-I1 Fast", "model": "runware:97@3", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "fbCache", "fbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"default": 1024, "min": 128, "max": 2048, "step": 16, "tooltip": "Width of the generated media in pixels.", "rw_cat": "core"}], "height": ["INT", {"default": 1024, "min": 128, "max": 2048, "step": 16, "tooltip": "Height of the generated media in pixels.", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 16, "min": 1, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bria_rmbg_v2_0_open", "name": "Runware Bria Rmbg V2 0 Open", "model": "runware:110@1", "task_type": "removeBackground", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_runware_qwen_image_style_lora_training", "name": "Qwen-Image Style LoRA Training", "model": "runware:qwen-image@style-lora-training", "task_type": "training", "creator": "runware", "input_types": {"required": {"importModel": ["RUNWARE_IMPORTMODEL"], "dataset": ["STRING", {"tooltip": "Training dataset as a ZIP file (UUID or URL).", "rw_cat": "core"}]}, "optional": {"learningRate": ["FLOAT", {"default": 0.0005, "min": 1e-05, "max": 0.01, "tooltip": "Step size applied at each training update. Lower values learn more slowly but can improve stability.", "rw_cat": "core"}], "trainingSteps": ["INT", {"default": 300, "min": 10, "max": 4000, "tooltip": "Total number of optimization steps to run during training.", "rw_cat": "core"}], "triggerWord": ["STRING", {"tooltip": "Word or phrase used to activate the trained concept at inference time.", "default": "", "rw_cat": "core"}]}}, "param_plan": {"dataset": {"path": ["inputs", "dataset"], "kind": "scalar"}, "importModel": {"path": ["importModel"], "kind": "feature"}, "learningRate": {"path": ["learningRate"], "kind": "scalar"}, "trainingSteps": {"path": ["trainingSteps"], "kind": "scalar"}, "triggerWord": {"path": ["triggerWord"], "kind": "scalar", "omit_empty": true}}}, {"key": "Runware_controlnet_preprocess_tile", "name": "ControlNet Preprocess Tile", "model": "runware:controlnet-preprocess@tile", "task_type": "controlNetPreprocess", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_yolov8s_face", "name": "YOLOv8s Face", "model": "runware:35@2", "task_type": "imageMasking", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"settings.confidence": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Confidence threshold for detections. Only detections above this score are included.", "rw_cat": "settings"}], "settings.maskBlur": ["INT", {"default": 5, "min": 0, "max": 100, "tooltip": "Blur radius for mask edges, creating smooth transitions.", "rw_cat": "settings"}], "settings.maskPadding": ["INT", {"default": 10, "min": 0, "max": 200, "tooltip": "Pixel amount to extend (positive) or shrink (negative) the mask area.", "rw_cat": "settings"}], "settings.maxDetections": ["INT", {"default": 6, "min": 1, "max": 20, "tooltip": "Maximum number of detections. Prioritizes highest confidence scores if exceeded.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "settings.confidence": {"path": ["settings", "confidence"], "kind": "scalar"}, "settings.maxDetections": {"path": ["settings", "maxDetections"], "kind": "scalar"}, "settings.maskPadding": {"path": ["settings", "maskPadding"], "kind": "scalar"}, "settings.maskBlur": {"path": ["settings", "maskBlur"], "kind": "scalar"}}}, {"key": "Runware_real_esrgan", "name": "Real-ESRGAN", "model": "runware:504@1", "task_type": "upscale", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"upscaleFactor": [["(default)", 2, 4], {"tooltip": "Factor by which to upscale the generated image. A value of 2 doubles width and height.", "default": "(default)", "rw_cat": "core"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"upscaleFactor": {"path": ["upscaleFactor"], "kind": "scalar", "omit_value": "(default)"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_controlnet_preprocess_lineart_anime", "name": "ControlNet Preprocess Lineart Anime", "model": "runware:controlnet-preprocess@lineart-anime", "task_type": "controlNetPreprocess", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_mediapipe_nose_lips_mesh", "name": "MediaPipe Nose + Lips Mesh", "model": "runware:35@12", "task_type": "imageMasking", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"settings.confidence": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Confidence threshold for detections. Only detections above this score are included.", "rw_cat": "settings"}], "settings.maskBlur": ["INT", {"default": 5, "min": 0, "max": 100, "tooltip": "Blur radius for mask edges, creating smooth transitions.", "rw_cat": "settings"}], "settings.maskPadding": ["INT", {"default": 10, "min": 0, "max": 200, "tooltip": "Pixel amount to extend (positive) or shrink (negative) the mask area.", "rw_cat": "settings"}], "settings.maxDetections": ["INT", {"default": 6, "min": 1, "max": 20, "tooltip": "Maximum number of detections. Prioritizes highest confidence scores if exceeded.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "settings.confidence": {"path": ["settings", "confidence"], "kind": "scalar"}, "settings.maxDetections": {"path": ["settings", "maxDetections"], "kind": "scalar"}, "settings.maskPadding": {"path": ["settings", "maskPadding"], "kind": "scalar"}, "settings.maskBlur": {"path": ["settings", "maskBlur"], "kind": "scalar"}}}, {"key": "Runware_birefnet_general_resolution_512x512_fp16", "name": "BiRefNet General 512\u00d7512 FP16", "model": "runware:112@6", "task_type": "removeBackground", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_clarity", "name": "Clarity", "model": "runware:500@1", "task_type": "upscale", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"upscaleFactor": [["(default)", 2], {"tooltip": "Factor by which to upscale the generated image. A value of 2 doubles width and height.", "default": "(default)", "rw_cat": "core"}], "settings.CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "settings.CFGScale_value", "tooltip": "Enable to set settings.CFGScale. Off uses the model's default.", "rw_cat": "settings"}], "settings.CFGScale_value": ["FLOAT", {"min": 0, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "settings"}], "settings.controlNetWeight": ["FLOAT", {"default": 1, "min": -4, "max": 4, "step": 0.01, "tooltip": "Strength of the ControlNet influence. A value of 0 means no influence. Higher values increase the influence, and negative values can be used to steer away from the guide image.", "rw_cat": "settings"}], "settings.negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "settings"}], "settings.seed": ["BOOLEAN", {"default": false, "rw_gates": "settings.seed_value", "tooltip": "Enable to set settings.seed. Off uses the model's default.", "rw_cat": "settings"}], "settings.seed_value": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "settings"}], "settings.steps": ["BOOLEAN", {"default": false, "rw_gates": "settings.steps_value", "tooltip": "Enable to set settings.steps. Off uses the model's default.", "rw_cat": "settings"}], "settings.steps_value": ["INT", {"min": 1, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "settings"}], "settings.strength": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"upscaleFactor": {"path": ["upscaleFactor"], "kind": "scalar", "omit_value": "(default)"}, "settings.positivePrompt": {"path": ["settings", "positivePrompt"], "kind": "scalar", "omit_empty": true}, "settings.negativePrompt": {"path": ["settings", "negativePrompt"], "kind": "scalar", "omit_empty": true}, "settings.seed": {"path": ["settings", "seed"], "kind": "gate", "value_key": "settings.seed_value"}, "settings.seed_value": {"path": ["settings", "seed"], "kind": "skip"}, "settings.steps": {"path": ["settings", "steps"], "kind": "gate", "value_key": "settings.steps_value"}, "settings.steps_value": {"path": ["settings", "steps"], "kind": "skip"}, "settings.scheduler": {"path": ["settings", "scheduler"], "kind": "scalar", "omit_value": "(default)"}, "settings.CFGScale": {"path": ["settings", "CFGScale"], "kind": "gate", "value_key": "settings.CFGScale_value"}, "settings.CFGScale_value": {"path": ["settings", "CFGScale"], "kind": "skip"}, "settings.strength": {"path": ["settings", "strength"], "kind": "scalar"}, "settings.controlNetWeight": {"path": ["settings", "controlNetWeight"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_ace_step_v1_5_turbo", "name": "ACE-Step v1.5 Turbo", "model": "runware:ace-step@v1.5-turbo", "task_type": "audioInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"audioSettings": ["RUNWARE_AUDIOSETTINGS"], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 10, "min": 1, "max": 20, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Fraction of steps using the input source instead of generated output.", "rw_cat": "core"}], "duration": ["FLOAT", {"default": 60, "min": 30, "max": 300, "step": 0.1, "tooltip": "Length of the generated audio track in seconds.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.bpm": ["BOOLEAN", {"default": false, "rw_gates": "settings.bpm_value", "tooltip": "Enable to set settings.bpm. Off uses the model's default.", "rw_cat": "settings"}], "settings.bpm_value": ["INT", {"min": 30, "max": 300, "tooltip": "Beats per minute. If not set, the model decides automatically.", "default": 30, "rw_cat": "settings"}], "settings.keyScale": ["STRING", {"tooltip": "Musical key and scale in '{Note}{Accidental} {Mode}' format (e.g. 'C major', 'F# minor', 'Bb major').", "default": "", "rw_cat": "settings"}], "settings.lyrics": ["STRING", {"tooltip": "Song lyrics, typically formatted like a lyrics website.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.repaintingStart": ["BOOLEAN", {"default": false, "rw_gates": "settings.repaintingStart_value", "tooltip": "Enable to set settings.repaintingStart. Off uses the model's default.", "rw_cat": "settings"}], "settings.repaintingStart_value": ["FLOAT", {"min": -300, "max": 300, "tooltip": "Start time in seconds for repaint region. Requires input audio. Negative values prepend audio before the start.", "default": -300.0, "rw_cat": "settings"}], "settings.repaintingEnd": ["BOOLEAN", {"default": false, "rw_gates": "settings.repaintingEnd_value", "tooltip": "Enable to set settings.repaintingEnd. Off uses the model's default.", "rw_cat": "settings"}], "settings.repaintingEnd_value": ["FLOAT", {"min": 0, "max": 300, "tooltip": "End time in seconds for repaint region. Requires input audio. Values beyond audio duration append new audio.", "default": 0.0, "rw_cat": "settings"}], "settings.timeSignature": [["(default)", 2, 3, 4, 6], {"tooltip": "Beats per measure. If not set, the model decides automatically.", "default": "(default)", "rw_cat": "settings"}], "settings.vocalLanguage": [["unknown", "ar", "az", "bg", "bn", "ca", "cs", "da", "de", "el", "en", "es", "fa", "fi", "fr", "he", "hi", "hr", "ht", "hu", "id", "is", "it", "ja", "ko", "la", "lt", "ms", "ne", "nl", "no", "pa", "pl", "pt", "ro", "ru", "sa", "sk", "sr", "sv", "sw", "ta", "te", "th", "tl", "tr", "uk", "ur", "vi", "yue", "zh"], {"default": "en", "tooltip": "ISO 639-1 language code for vocals. `unknown` for instrumental or auto detection.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP3", "WAV", "FLAC", "OGG"], {"default": "MP3", "tooltip": "File format for the generated audio.", "rw_cat": "output"}]}}, "param_plan": {"audio": {"path": ["inputs", "audio"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "settings.bpm": {"path": ["settings", "bpm"], "kind": "gate", "value_key": "settings.bpm_value"}, "settings.bpm_value": {"path": ["settings", "bpm"], "kind": "skip"}, "settings.keyScale": {"path": ["settings", "keyScale"], "kind": "scalar", "omit_empty": true}, "settings.lyrics": {"path": ["settings", "lyrics"], "kind": "scalar", "omit_empty": true}, "settings.repaintingEnd": {"path": ["settings", "repaintingEnd"], "kind": "gate", "value_key": "settings.repaintingEnd_value"}, "settings.repaintingEnd_value": {"path": ["settings", "repaintingEnd"], "kind": "skip"}, "settings.repaintingStart": {"path": ["settings", "repaintingStart"], "kind": "gate", "value_key": "settings.repaintingStart_value"}, "settings.repaintingStart_value": {"path": ["settings", "repaintingStart"], "kind": "skip"}, "settings.timeSignature": {"path": ["settings", "timeSignature"], "kind": "scalar", "omit_value": "(default)"}, "settings.vocalLanguage": {"path": ["settings", "vocalLanguage"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "audioSettings": {"path": ["audioSettings"], "kind": "feature"}}}, {"key": "Runware_controlnet_preprocess_seg", "name": "ControlNet Preprocess Seg", "model": "runware:controlnet-preprocess@seg", "task_type": "controlNetPreprocess", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_yolov8n_person_seg", "name": "YOLOv8n Person Seg", "model": "runware:35@4", "task_type": "imageMasking", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"settings.confidence": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Confidence threshold for detections. Only detections above this score are included.", "rw_cat": "settings"}], "settings.maskBlur": ["INT", {"default": 5, "min": 0, "max": 100, "tooltip": "Blur radius for mask edges, creating smooth transitions.", "rw_cat": "settings"}], "settings.maskPadding": ["INT", {"default": 10, "min": 0, "max": 200, "tooltip": "Pixel amount to extend (positive) or shrink (negative) the mask area.", "rw_cat": "settings"}], "settings.maxDetections": ["INT", {"default": 6, "min": 1, "max": 20, "tooltip": "Maximum number of detections. Prioritizes highest confidence scores if exceeded.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "settings.confidence": {"path": ["settings", "confidence"], "kind": "scalar"}, "settings.maxDetections": {"path": ["settings", "maxDetections"], "kind": "scalar"}, "settings.maskPadding": {"path": ["settings", "maskPadding"], "kind": "scalar"}, "settings.maskBlur": {"path": ["settings", "maskBlur"], "kind": "scalar"}}}, {"key": "Runware_yolov8s_person_seg", "name": "YOLOv8s Person Seg", "model": "runware:35@5", "task_type": "imageMasking", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"settings.confidence": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Confidence threshold for detections. Only detections above this score are included.", "rw_cat": "settings"}], "settings.maskBlur": ["INT", {"default": 5, "min": 0, "max": 100, "tooltip": "Blur radius for mask edges, creating smooth transitions.", "rw_cat": "settings"}], "settings.maskPadding": ["INT", {"default": 10, "min": 0, "max": 200, "tooltip": "Pixel amount to extend (positive) or shrink (negative) the mask area.", "rw_cat": "settings"}], "settings.maxDetections": ["INT", {"default": 6, "min": 1, "max": 20, "tooltip": "Maximum number of detections. Prioritizes highest confidence scores if exceeded.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "settings.confidence": {"path": ["settings", "confidence"], "kind": "scalar"}, "settings.maxDetections": {"path": ["settings", "maxDetections"], "kind": "scalar"}, "settings.maskPadding": {"path": ["settings", "maskPadding"], "kind": "scalar"}, "settings.maskBlur": {"path": ["settings", "maskBlur"], "kind": "scalar"}}}, {"key": "Runware_ace_step_v1_5_xl_base", "name": "ACE-Step v1.5 XL Base", "model": "runware:ace-step@v1.5-xl-base", "task_type": "audioInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"audioSettings": ["RUNWARE_AUDIOSETTINGS"], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "default": "", "rw_cat": "core"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 100, "min": 1, "max": 300, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 10, "min": 1, "max": 30, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Fraction of steps using the input source instead of generated output.", "rw_cat": "core"}], "duration": ["FLOAT", {"default": 60, "min": 30, "max": 300, "step": 0.1, "tooltip": "Length of the generated audio track in seconds.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "advancedFeatures": ["BOOLEAN", {"default": false, "tooltip": "Enable to set advancedFeatures. Off uses the model's default.", "rw_cat": "settings"}], "settings.bpm": ["BOOLEAN", {"default": false, "rw_gates": "settings.bpm_value", "tooltip": "Enable to set settings.bpm. Off uses the model's default.", "rw_cat": "settings"}], "settings.bpm_value": ["INT", {"min": 30, "max": 300, "tooltip": "Beats per minute. If not set, the model decides automatically.", "default": 30, "rw_cat": "settings"}], "settings.cfgIntervalStart": ["FLOAT", {"default": 0, "min": 0, "max": 1, "step": 0.01, "tooltip": "Diffusion ratio where CFG begins (0.0 = first step).", "rw_cat": "settings"}], "settings.cfgIntervalEnd": ["FLOAT", {"default": 1, "min": 0, "max": 1, "step": 0.01, "tooltip": "Diffusion ratio where CFG ends (1.0 = last step).", "rw_cat": "settings"}], "settings.guidanceType": [["apg", "cfg"], {"default": "apg", "tooltip": "Controls how guidance is applied during generation.", "rw_cat": "settings"}], "settings.keyScale": ["STRING", {"tooltip": "Musical key and scale in '{Note}{Accidental} {Mode}' format (e.g. 'C major', 'F# minor', 'Bb major').", "default": "", "rw_cat": "settings"}], "settings.lyrics": ["STRING", {"tooltip": "Song lyrics, typically formatted like a lyrics website.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.repaintingStart": ["BOOLEAN", {"default": false, "rw_gates": "settings.repaintingStart_value", "tooltip": "Enable to set settings.repaintingStart. Off uses the model's default.", "rw_cat": "settings"}], "settings.repaintingStart_value": ["FLOAT", {"min": -300, "max": 300, "tooltip": "Start time in seconds for repaint region. Requires input audio. Negative values prepend audio before the start.", "default": -300.0, "rw_cat": "settings"}], "settings.repaintingEnd": ["BOOLEAN", {"default": false, "rw_gates": "settings.repaintingEnd_value", "tooltip": "Enable to set settings.repaintingEnd. Off uses the model's default.", "rw_cat": "settings"}], "settings.repaintingEnd_value": ["FLOAT", {"min": 0, "max": 300, "tooltip": "End time in seconds for repaint region. Requires input audio. Values beyond audio duration append new audio.", "default": 0.0, "rw_cat": "settings"}], "settings.timeSignature": [["(default)", 2, 3, 4, 6], {"tooltip": "Beats per measure. If not set, the model decides automatically.", "default": "(default)", "rw_cat": "settings"}], "settings.vocalLanguage": [["unknown", "ar", "az", "bg", "bn", "ca", "cs", "da", "de", "el", "en", "es", "fa", "fi", "fr", "he", "hi", "hr", "ht", "hu", "id", "is", "it", "ja", "ko", "la", "lt", "ms", "ne", "nl", "no", "pa", "pl", "pt", "ro", "ru", "sa", "sk", "sr", "sv", "sw", "ta", "te", "th", "tl", "tr", "uk", "ur", "vi", "yue", "zh"], {"default": "en", "tooltip": "ISO 639-1 language code for vocals. `unknown` for instrumental or auto detection.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP3", "WAV", "FLAC", "OGG"], {"default": "MP3", "tooltip": "File format for the generated audio.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: advancedFeatures.modularScheduler"}]}}, "param_plan": {"audio": {"path": ["inputs", "audio"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "settings.bpm": {"path": ["settings", "bpm"], "kind": "gate", "value_key": "settings.bpm_value"}, "settings.bpm_value": {"path": ["settings", "bpm"], "kind": "skip"}, "settings.cfgIntervalEnd": {"path": ["settings", "cfgIntervalEnd"], "kind": "scalar"}, "settings.cfgIntervalStart": {"path": ["settings", "cfgIntervalStart"], "kind": "scalar"}, "settings.guidanceType": {"path": ["settings", "guidanceType"], "kind": "scalar"}, "settings.keyScale": {"path": ["settings", "keyScale"], "kind": "scalar", "omit_empty": true}, "settings.lyrics": {"path": ["settings", "lyrics"], "kind": "scalar", "omit_empty": true}, "settings.repaintingEnd": {"path": ["settings", "repaintingEnd"], "kind": "gate", "value_key": "settings.repaintingEnd_value"}, "settings.repaintingEnd_value": {"path": ["settings", "repaintingEnd"], "kind": "skip"}, "settings.repaintingStart": {"path": ["settings", "repaintingStart"], "kind": "gate", "value_key": "settings.repaintingStart_value"}, "settings.repaintingStart_value": {"path": ["settings", "repaintingStart"], "kind": "skip"}, "settings.timeSignature": {"path": ["settings", "timeSignature"], "kind": "scalar", "omit_value": "(default)"}, "settings.vocalLanguage": {"path": ["settings", "vocalLanguage"], "kind": "scalar"}, "advancedFeatures": {"path": ["advancedFeatures"], "kind": "group_gate"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "audioSettings": {"path": ["audioSettings"], "kind": "feature"}}}, {"key": "Runware_ace_step_v1_5_xl_sft", "name": "ACE-Step v1.5 XL SFT", "model": "runware:ace-step@v1.5-xl-sft", "task_type": "audioInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"audioSettings": ["RUNWARE_AUDIOSETTINGS"], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "default": "", "rw_cat": "core"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 100, "min": 1, "max": 300, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 10, "min": 1, "max": 30, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Fraction of steps using the input source instead of generated output.", "rw_cat": "core"}], "duration": ["FLOAT", {"default": 60, "min": 30, "max": 300, "step": 0.1, "tooltip": "Length of the generated audio track in seconds.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "advancedFeatures": ["BOOLEAN", {"default": false, "tooltip": "Enable to set advancedFeatures. Off uses the model's default.", "rw_cat": "settings"}], "settings.bpm": ["BOOLEAN", {"default": false, "rw_gates": "settings.bpm_value", "tooltip": "Enable to set settings.bpm. Off uses the model's default.", "rw_cat": "settings"}], "settings.bpm_value": ["INT", {"min": 30, "max": 300, "tooltip": "Beats per minute. If not set, the model decides automatically.", "default": 30, "rw_cat": "settings"}], "settings.cfgIntervalStart": ["FLOAT", {"default": 0, "min": 0, "max": 1, "step": 0.01, "tooltip": "Diffusion ratio where CFG begins (0.0 = first step).", "rw_cat": "settings"}], "settings.cfgIntervalEnd": ["FLOAT", {"default": 1, "min": 0, "max": 1, "step": 0.01, "tooltip": "Diffusion ratio where CFG ends (1.0 = last step).", "rw_cat": "settings"}], "settings.guidanceType": [["apg", "cfg"], {"default": "apg", "tooltip": "Controls how guidance is applied during generation.", "rw_cat": "settings"}], "settings.keyScale": ["STRING", {"tooltip": "Musical key and scale in '{Note}{Accidental} {Mode}' format (e.g. 'C major', 'F# minor', 'Bb major').", "default": "", "rw_cat": "settings"}], "settings.lyrics": ["STRING", {"tooltip": "Song lyrics, typically formatted like a lyrics website.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.repaintingStart": ["BOOLEAN", {"default": false, "rw_gates": "settings.repaintingStart_value", "tooltip": "Enable to set settings.repaintingStart. Off uses the model's default.", "rw_cat": "settings"}], "settings.repaintingStart_value": ["FLOAT", {"min": -300, "max": 300, "tooltip": "Start time in seconds for repaint region. Requires input audio. Negative values prepend audio before the start.", "default": -300.0, "rw_cat": "settings"}], "settings.repaintingEnd": ["BOOLEAN", {"default": false, "rw_gates": "settings.repaintingEnd_value", "tooltip": "Enable to set settings.repaintingEnd. Off uses the model's default.", "rw_cat": "settings"}], "settings.repaintingEnd_value": ["FLOAT", {"min": 0, "max": 300, "tooltip": "End time in seconds for repaint region. Requires input audio. Values beyond audio duration append new audio.", "default": 0.0, "rw_cat": "settings"}], "settings.timeSignature": [["(default)", 2, 3, 4, 6], {"tooltip": "Beats per measure. If not set, the model decides automatically.", "default": "(default)", "rw_cat": "settings"}], "settings.vocalLanguage": [["unknown", "ar", "az", "bg", "bn", "ca", "cs", "da", "de", "el", "en", "es", "fa", "fi", "fr", "he", "hi", "hr", "ht", "hu", "id", "is", "it", "ja", "ko", "la", "lt", "ms", "ne", "nl", "no", "pa", "pl", "pt", "ro", "ru", "sa", "sk", "sr", "sv", "sw", "ta", "te", "th", "tl", "tr", "uk", "ur", "vi", "yue", "zh"], {"default": "en", "tooltip": "ISO 639-1 language code for vocals. `unknown` for instrumental or auto detection.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP3", "WAV", "FLAC", "OGG"], {"default": "MP3", "tooltip": "File format for the generated audio.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: advancedFeatures.modularScheduler"}]}}, "param_plan": {"audio": {"path": ["inputs", "audio"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "settings.bpm": {"path": ["settings", "bpm"], "kind": "gate", "value_key": "settings.bpm_value"}, "settings.bpm_value": {"path": ["settings", "bpm"], "kind": "skip"}, "settings.cfgIntervalEnd": {"path": ["settings", "cfgIntervalEnd"], "kind": "scalar"}, "settings.cfgIntervalStart": {"path": ["settings", "cfgIntervalStart"], "kind": "scalar"}, "settings.guidanceType": {"path": ["settings", "guidanceType"], "kind": "scalar"}, "settings.keyScale": {"path": ["settings", "keyScale"], "kind": "scalar", "omit_empty": true}, "settings.lyrics": {"path": ["settings", "lyrics"], "kind": "scalar", "omit_empty": true}, "settings.repaintingEnd": {"path": ["settings", "repaintingEnd"], "kind": "gate", "value_key": "settings.repaintingEnd_value"}, "settings.repaintingEnd_value": {"path": ["settings", "repaintingEnd"], "kind": "skip"}, "settings.repaintingStart": {"path": ["settings", "repaintingStart"], "kind": "gate", "value_key": "settings.repaintingStart_value"}, "settings.repaintingStart_value": {"path": ["settings", "repaintingStart"], "kind": "skip"}, "settings.timeSignature": {"path": ["settings", "timeSignature"], "kind": "scalar", "omit_value": "(default)"}, "settings.vocalLanguage": {"path": ["settings", "vocalLanguage"], "kind": "scalar"}, "advancedFeatures": {"path": ["advancedFeatures"], "kind": "group_gate"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "audioSettings": {"path": ["audioSettings"], "kind": "feature"}}}, {"key": "Runware_controlnet_preprocess_canny", "name": "ControlNet Preprocess Canny", "model": "runware:controlnet-preprocess@canny", "task_type": "controlNetPreprocess", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"settings.highThresholdCanny": ["INT", {"default": 200, "min": 1, "max": 255, "tooltip": "High threshold for Canny edge detection.", "rw_cat": "settings"}], "settings.lowThresholdCanny": ["INT", {"default": 100, "min": 0, "max": 255, "tooltip": "Low threshold for Canny edge detection.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"settings.highThresholdCanny": {"path": ["settings", "highThresholdCanny"], "kind": "scalar"}, "settings.lowThresholdCanny": {"path": ["settings", "lowThresholdCanny"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_hidream_i1_dev", "name": "HiDream-I1 Dev", "model": "runware:97@2", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "fbCache", "fbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"default": 1024, "min": 128, "max": 2048, "step": 16, "tooltip": "Width of the generated media in pixels.", "rw_cat": "core"}], "height": ["INT", {"default": 1024, "min": 128, "max": 2048, "step": 16, "tooltip": "Height of the generated media in pixels.", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 28, "min": 1, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_open_age_detection", "name": "Open Age Detection", "model": "runware:154@1", "task_type": "caption", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_qwen2_5_vl_7b_age_detector", "name": "Qwen2.5-VL-7B Age Detector", "model": "runware:152@50", "task_type": "caption", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_hidream_i1_full", "name": "HiDream-I1 Full", "model": "runware:97@1", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "fbCache", "fbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"default": 1024, "min": 128, "max": 2048, "step": 16, "tooltip": "Width of the generated media in pixels.", "rw_cat": "core"}], "height": ["INT", {"default": 1024, "min": 128, "max": 2048, "step": 16, "tooltip": "Height of the generated media in pixels.", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 30, "min": 1, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_controlnet_preprocess_scribble", "name": "ControlNet Preprocess Scribble", "model": "runware:controlnet-preprocess@scribble", "task_type": "controlNetPreprocess", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_birefnet_v1_base", "name": "BiRefNet v1 Base", "model": "runware:112@1", "task_type": "removeBackground", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_mediapipe_eyes_lips_mesh", "name": "MediaPipe Eyes + Lips Mesh", "model": "runware:35@10", "task_type": "imageMasking", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"settings.confidence": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Confidence threshold for detections. Only detections above this score are included.", "rw_cat": "settings"}], "settings.maskBlur": ["INT", {"default": 5, "min": 0, "max": 100, "tooltip": "Blur radius for mask edges, creating smooth transitions.", "rw_cat": "settings"}], "settings.maskPadding": ["INT", {"default": 10, "min": 0, "max": 200, "tooltip": "Pixel amount to extend (positive) or shrink (negative) the mask area.", "rw_cat": "settings"}], "settings.maxDetections": ["INT", {"default": 6, "min": 1, "max": 20, "tooltip": "Maximum number of detections. Prioritizes highest confidence scores if exceeded.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "settings.confidence": {"path": ["settings", "confidence"], "kind": "scalar"}, "settings.maxDetections": {"path": ["settings", "maxDetections"], "kind": "scalar"}, "settings.maskPadding": {"path": ["settings", "maskPadding"], "kind": "scalar"}, "settings.maskBlur": {"path": ["settings", "maskBlur"], "kind": "scalar"}}}, {"key": "Runware_rembg_v1_4", "name": "RemBG v1.4", "model": "runware:109@1", "task_type": "removeBackground", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"settings.alphaMatting": ["BOOLEAN", {"default": false, "tooltip": "Enable alpha matting to refine edges of the foreground object.", "rw_cat": "settings"}], "settings.alphaMattingBackgroundThreshold": ["INT", {"default": 10, "min": 1, "max": 255, "tooltip": "Threshold used in alpha matting to refine background areas. Higher values remove more background but increase computation time.", "rw_cat": "settings"}], "settings.alphaMattingErodeSize": ["INT", {"default": 10, "min": 1, "max": 255, "tooltip": "Size of the erosion operation used to smooth the edges of the foreground object.", "rw_cat": "settings"}], "settings.alphaMattingForegroundThreshold": ["INT", {"default": 240, "min": 1, "max": 255, "tooltip": "Threshold used in alpha matting to distinguish foreground from background. Affects edge sharpness.", "rw_cat": "settings"}], "settings.postProcessMask": ["BOOLEAN", {"default": false, "tooltip": "Enable additional post-processing to improve mask accuracy.", "rw_cat": "settings"}], "settings.returnOnlyMask": ["BOOLEAN", {"default": false, "tooltip": "Return only the mask instead of the processed image.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: settings.rgba"}]}}, "param_plan": {"settings.alphaMatting": {"path": ["settings", "alphaMatting"], "kind": "scalar", "omit_value": false}, "settings.alphaMattingBackgroundThreshold": {"path": ["settings", "alphaMattingBackgroundThreshold"], "kind": "scalar"}, "settings.alphaMattingErodeSize": {"path": ["settings", "alphaMattingErodeSize"], "kind": "scalar"}, "settings.alphaMattingForegroundThreshold": {"path": ["settings", "alphaMattingForegroundThreshold"], "kind": "scalar"}, "settings.postProcessMask": {"path": ["settings", "postProcessMask"], "kind": "scalar", "omit_value": false}, "settings.returnOnlyMask": {"path": ["settings", "returnOnlyMask"], "kind": "scalar", "omit_value": false}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_swinir", "name": "SwinIR", "model": "runware:503@1", "task_type": "upscale", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"upscaleFactor": [["(default)", 2, 4], {"tooltip": "Factor by which to upscale the generated image. A value of 2 doubles width and height.", "default": "(default)", "rw_cat": "core"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"upscaleFactor": {"path": ["upscaleFactor"], "kind": "scalar", "omit_value": "(default)"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_birefnet_dis", "name": "BiRefNet Dis", "model": "runware:112@3", "task_type": "removeBackground", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_ace_step_v1_5_xl_turbo", "name": "ACE-Step v1.5 XL Turbo", "model": "runware:ace-step@v1.5-xl-turbo", "task_type": "audioInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"audioSettings": ["RUNWARE_AUDIOSETTINGS"], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 8, "min": 1, "max": 20, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Fraction of steps using the input source instead of generated output.", "rw_cat": "core"}], "duration": ["FLOAT", {"default": 60, "min": 30, "max": 300, "step": 0.1, "tooltip": "Length of the generated audio track in seconds.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "advancedFeatures": ["BOOLEAN", {"default": false, "tooltip": "Enable to set advancedFeatures. Off uses the model's default.", "rw_cat": "settings"}], "settings.bpm": ["BOOLEAN", {"default": false, "rw_gates": "settings.bpm_value", "tooltip": "Enable to set settings.bpm. Off uses the model's default.", "rw_cat": "settings"}], "settings.bpm_value": ["INT", {"min": 30, "max": 300, "tooltip": "Beats per minute. If not set, the model decides automatically.", "default": 30, "rw_cat": "settings"}], "settings.keyScale": ["STRING", {"tooltip": "Musical key and scale in '{Note}{Accidental} {Mode}' format (e.g. 'C major', 'F# minor', 'Bb major').", "default": "", "rw_cat": "settings"}], "settings.lyrics": ["STRING", {"tooltip": "Song lyrics, typically formatted like a lyrics website.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.repaintingStart": ["BOOLEAN", {"default": false, "rw_gates": "settings.repaintingStart_value", "tooltip": "Enable to set settings.repaintingStart. Off uses the model's default.", "rw_cat": "settings"}], "settings.repaintingStart_value": ["FLOAT", {"min": -300, "max": 300, "tooltip": "Start time in seconds for repaint region. Requires input audio. Negative values prepend audio before the start.", "default": -300.0, "rw_cat": "settings"}], "settings.repaintingEnd": ["BOOLEAN", {"default": false, "rw_gates": "settings.repaintingEnd_value", "tooltip": "Enable to set settings.repaintingEnd. Off uses the model's default.", "rw_cat": "settings"}], "settings.repaintingEnd_value": ["FLOAT", {"min": 0, "max": 300, "tooltip": "End time in seconds for repaint region. Requires input audio. Values beyond audio duration append new audio.", "default": 0.0, "rw_cat": "settings"}], "settings.timeSignature": [["(default)", 2, 3, 4, 6], {"tooltip": "Beats per measure. If not set, the model decides automatically.", "default": "(default)", "rw_cat": "settings"}], "settings.vocalLanguage": [["unknown", "ar", "az", "bg", "bn", "ca", "cs", "da", "de", "el", "en", "es", "fa", "fi", "fr", "he", "hi", "hr", "ht", "hu", "id", "is", "it", "ja", "ko", "la", "lt", "ms", "ne", "nl", "no", "pa", "pl", "pt", "ro", "ru", "sa", "sk", "sr", "sv", "sw", "ta", "te", "th", "tl", "tr", "uk", "ur", "vi", "yue", "zh"], {"default": "en", "tooltip": "ISO 639-1 language code for vocals. `unknown` for instrumental or auto detection.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP3", "WAV", "FLAC", "OGG"], {"default": "MP3", "tooltip": "File format for the generated audio.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: advancedFeatures.modularScheduler"}]}}, "param_plan": {"audio": {"path": ["inputs", "audio"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "settings.bpm": {"path": ["settings", "bpm"], "kind": "gate", "value_key": "settings.bpm_value"}, "settings.bpm_value": {"path": ["settings", "bpm"], "kind": "skip"}, "settings.keyScale": {"path": ["settings", "keyScale"], "kind": "scalar", "omit_empty": true}, "settings.lyrics": {"path": ["settings", "lyrics"], "kind": "scalar", "omit_empty": true}, "settings.repaintingEnd": {"path": ["settings", "repaintingEnd"], "kind": "gate", "value_key": "settings.repaintingEnd_value"}, "settings.repaintingEnd_value": {"path": ["settings", "repaintingEnd"], "kind": "skip"}, "settings.repaintingStart": {"path": ["settings", "repaintingStart"], "kind": "gate", "value_key": "settings.repaintingStart_value"}, "settings.repaintingStart_value": {"path": ["settings", "repaintingStart"], "kind": "skip"}, "settings.timeSignature": {"path": ["settings", "timeSignature"], "kind": "scalar", "omit_value": "(default)"}, "settings.vocalLanguage": {"path": ["settings", "vocalLanguage"], "kind": "scalar"}, "advancedFeatures": {"path": ["advancedFeatures"], "kind": "group_gate"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "audioSettings": {"path": ["audioSettings"], "kind": "feature"}}}, {"key": "Runware_controlnet_preprocess_openpose", "name": "ControlNet Preprocess OpenPose", "model": "runware:controlnet-preprocess@openpose", "task_type": "controlNetPreprocess", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"settings.includeHandsAndFaceOpenPose": ["BOOLEAN", {"default": false, "tooltip": "Include hands and face in the pose outline when using OpenPose.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"settings.includeHandsAndFaceOpenPose": {"path": ["settings", "includeHandsAndFaceOpenPose"], "kind": "scalar", "omit_value": false}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_runware_flux_1_dev_style_lora_training", "name": "FLUX.1 [dev] Style LoRA Training", "model": "runware:flux-1-dev@style-lora-training", "task_type": "training", "creator": "runware", "input_types": {"required": {"importModel": ["RUNWARE_IMPORTMODEL"], "dataset": ["STRING", {"tooltip": "Training dataset as a ZIP file (UUID or URL).", "rw_cat": "core"}]}, "optional": {"learningRate": ["FLOAT", {"default": 0.0005, "min": 1e-05, "max": 0.01, "tooltip": "Step size applied at each training update. Lower values learn more slowly but can improve stability.", "rw_cat": "core"}], "trainingSteps": ["INT", {"default": 100, "min": 10, "max": 4000, "tooltip": "Total number of optimization steps to run during training.", "rw_cat": "core"}], "triggerWord": ["STRING", {"tooltip": "Word or phrase used to activate the trained concept at inference time.", "default": "", "rw_cat": "core"}]}}, "param_plan": {"dataset": {"path": ["inputs", "dataset"], "kind": "scalar"}, "importModel": {"path": ["importModel"], "kind": "feature"}, "learningRate": {"path": ["learningRate"], "kind": "scalar"}, "trainingSteps": {"path": ["trainingSteps"], "kind": "scalar"}, "triggerWord": {"path": ["triggerWord"], "kind": "scalar", "omit_empty": true}}}, {"key": "Runware_controlnet_preprocess_depth", "name": "ControlNet Preprocess Depth", "model": "runware:controlnet-preprocess@depth", "task_type": "controlNetPreprocess", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_ccsr", "name": "CCSR", "model": "runware:501@1", "task_type": "upscale", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"upscaleFactor": [["(default)", 2], {"tooltip": "Factor by which to upscale the generated image. A value of 2 doubles width and height.", "default": "(default)", "rw_cat": "core"}], "settings.CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "settings.CFGScale_value", "tooltip": "Enable to set settings.CFGScale. Off uses the model's default.", "rw_cat": "settings"}], "settings.CFGScale_value": ["FLOAT", {"min": 0, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "settings"}], "settings.controlNetWeight": ["FLOAT", {"default": 1, "min": -4, "max": 4, "step": 0.01, "tooltip": "Strength of the ControlNet influence. A value of 0 means no influence. Higher values increase the influence, and negative values can be used to steer away from the guide image.", "rw_cat": "settings"}], "settings.negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.seed": ["BOOLEAN", {"default": false, "rw_gates": "settings.seed_value", "tooltip": "Enable to set settings.seed. Off uses the model's default.", "rw_cat": "settings"}], "settings.seed_value": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "settings"}], "settings.steps": ["BOOLEAN", {"default": false, "rw_gates": "settings.steps_value", "tooltip": "Enable to set settings.steps. Off uses the model's default.", "rw_cat": "settings"}], "settings.steps_value": ["INT", {"min": 20, "max": 60, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 20, "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"upscaleFactor": {"path": ["upscaleFactor"], "kind": "scalar", "omit_value": "(default)"}, "settings.positivePrompt": {"path": ["settings", "positivePrompt"], "kind": "scalar", "omit_empty": true}, "settings.negativePrompt": {"path": ["settings", "negativePrompt"], "kind": "scalar", "omit_empty": true}, "settings.seed": {"path": ["settings", "seed"], "kind": "gate", "value_key": "settings.seed_value"}, "settings.seed_value": {"path": ["settings", "seed"], "kind": "skip"}, "settings.steps": {"path": ["settings", "steps"], "kind": "gate", "value_key": "settings.steps_value"}, "settings.steps_value": {"path": ["settings", "steps"], "kind": "skip"}, "settings.CFGScale": {"path": ["settings", "CFGScale"], "kind": "gate", "value_key": "settings.CFGScale_value"}, "settings.CFGScale_value": {"path": ["settings", "CFGScale"], "kind": "skip"}, "settings.controlNetWeight": {"path": ["settings", "controlNetWeight"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_object_eraser", "name": "Object Eraser", "model": "runware:300@1", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"], "mask": ["IMAGE"]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 4, "min": 1, "max": 5, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 1, "min": 1, "max": 10, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "mask": {"path": ["inputs", "mask"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_runware_z_image_style_lora_training", "name": "Z-Image Style LoRA Training", "model": "runware:z-image@style-lora-training", "task_type": "training", "creator": "runware", "input_types": {"required": {"importModel": ["RUNWARE_IMPORTMODEL"], "dataset": ["STRING", {"tooltip": "Training dataset as a ZIP file (UUID or URL).", "rw_cat": "core"}]}, "optional": {"learningRate": ["FLOAT", {"default": 0.0005, "min": 1e-05, "max": 0.01, "tooltip": "Step size applied at each training update. Lower values learn more slowly but can improve stability.", "rw_cat": "core"}], "trainingSteps": ["INT", {"default": 300, "min": 10, "max": 4000, "tooltip": "Total number of optimization steps to run during training.", "rw_cat": "core"}], "triggerWord": ["STRING", {"tooltip": "Word or phrase used to activate the trained concept at inference time.", "default": "", "rw_cat": "core"}]}}, "param_plan": {"dataset": {"path": ["inputs", "dataset"], "kind": "scalar"}, "importModel": {"path": ["importModel"], "kind": "feature"}, "learningRate": {"path": ["learningRate"], "kind": "scalar"}, "trainingSteps": {"path": ["trainingSteps"], "kind": "scalar"}, "triggerWord": {"path": ["triggerWord"], "kind": "scalar", "omit_empty": true}}}, {"key": "Runware_kandinsky_5_0_image_lite", "name": "Kandinsky 5.0 Image Lite", "model": "runware:kandinsky-5.0-image-lite@1", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"step": 16, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"step": 16, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "fbCache", "fbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 20, "min": 10, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "scheduler": [["(default)", "DPM++ 2M Karras", "DPM++ SDE Karras", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "Euler", "Euler a", "Euler Trailing", "LCM", "DDIM", "DDPM", "PNDM", "UniPC"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 7, "min": 2, "max": 10, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_mediapipe_face_mesh_eyes_only", "name": "MediaPipe Face Mesh Eyes Only", "model": "runware:35@9", "task_type": "imageMasking", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"settings.confidence": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Confidence threshold for detections. Only detections above this score are included.", "rw_cat": "settings"}], "settings.maskBlur": ["INT", {"default": 5, "min": 0, "max": 100, "tooltip": "Blur radius for mask edges, creating smooth transitions.", "rw_cat": "settings"}], "settings.maskPadding": ["INT", {"default": 10, "min": 0, "max": 200, "tooltip": "Pixel amount to extend (positive) or shrink (negative) the mask area.", "rw_cat": "settings"}], "settings.maxDetections": ["INT", {"default": 6, "min": 1, "max": 20, "tooltip": "Maximum number of detections. Prioritizes highest confidence scores if exceeded.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "settings.confidence": {"path": ["settings", "confidence"], "kind": "scalar"}, "settings.maxDetections": {"path": ["settings", "maxDetections"], "kind": "scalar"}, "settings.maskPadding": {"path": ["settings", "maskPadding"], "kind": "scalar"}, "settings.maskBlur": {"path": ["settings", "maskBlur"], "kind": "scalar"}}}, {"key": "Runware_mediapipe_nose_eyes_mesh", "name": "MediaPipe Nose + Eyes Mesh", "model": "runware:35@11", "task_type": "imageMasking", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"settings.confidence": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Confidence threshold for detections. Only detections above this score are included.", "rw_cat": "settings"}], "settings.maskBlur": ["INT", {"default": 5, "min": 0, "max": 100, "tooltip": "Blur radius for mask edges, creating smooth transitions.", "rw_cat": "settings"}], "settings.maskPadding": ["INT", {"default": 10, "min": 0, "max": 200, "tooltip": "Pixel amount to extend (positive) or shrink (negative) the mask area.", "rw_cat": "settings"}], "settings.maxDetections": ["INT", {"default": 6, "min": 1, "max": 20, "tooltip": "Maximum number of detections. Prioritizes highest confidence scores if exceeded.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "settings.confidence": {"path": ["settings", "confidence"], "kind": "scalar"}, "settings.maxDetections": {"path": ["settings", "maxDetections"], "kind": "scalar"}, "settings.maskPadding": {"path": ["settings", "maskPadding"], "kind": "scalar"}, "settings.maskBlur": {"path": ["settings", "maskBlur"], "kind": "scalar"}}}, {"key": "Runware_mediapipe_eyes_mesh", "name": "MediaPipe Eyes Mesh", "model": "runware:35@15", "task_type": "imageMasking", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"settings.confidence": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Confidence threshold for detections. Only detections above this score are included.", "rw_cat": "settings"}], "settings.maskBlur": ["INT", {"default": 5, "min": 0, "max": 100, "tooltip": "Blur radius for mask edges, creating smooth transitions.", "rw_cat": "settings"}], "settings.maskPadding": ["INT", {"default": 10, "min": 0, "max": 200, "tooltip": "Pixel amount to extend (positive) or shrink (negative) the mask area.", "rw_cat": "settings"}], "settings.maxDetections": ["INT", {"default": 6, "min": 1, "max": 20, "tooltip": "Maximum number of detections. Prioritizes highest confidence scores if exceeded.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "settings.confidence": {"path": ["settings", "confidence"], "kind": "scalar"}, "settings.maxDetections": {"path": ["settings", "maxDetections"], "kind": "scalar"}, "settings.maskPadding": {"path": ["settings", "maskPadding"], "kind": "scalar"}, "settings.maskBlur": {"path": ["settings", "maskBlur"], "kind": "scalar"}}}, {"key": "Runware_yolov8n_face", "name": "YOLOv8n Face", "model": "runware:35@1", "task_type": "imageMasking", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"settings.confidence": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Confidence threshold for detections. Only detections above this score are included.", "rw_cat": "settings"}], "settings.maskBlur": ["INT", {"default": 5, "min": 0, "max": 100, "tooltip": "Blur radius for mask edges, creating smooth transitions.", "rw_cat": "settings"}], "settings.maskPadding": ["INT", {"default": 10, "min": 0, "max": 200, "tooltip": "Pixel amount to extend (positive) or shrink (negative) the mask area.", "rw_cat": "settings"}], "settings.maxDetections": ["INT", {"default": 6, "min": 1, "max": 20, "tooltip": "Maximum number of detections. Prioritizes highest confidence scores if exceeded.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "settings.confidence": {"path": ["settings", "confidence"], "kind": "scalar"}, "settings.maxDetections": {"path": ["settings", "maxDetections"], "kind": "scalar"}, "settings.maskPadding": {"path": ["settings", "maskPadding"], "kind": "scalar"}, "settings.maskBlur": {"path": ["settings", "maskBlur"], "kind": "scalar"}}}, {"key": "Runware_controlnet_preprocess_softedge", "name": "ControlNet Preprocess SoftEdge", "model": "runware:controlnet-preprocess@softedge", "task_type": "controlNetPreprocess", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_stable_diffusion_latent_upscaler", "name": "Stable Diffusion Latent Upscaler", "model": "runware:502@1", "task_type": "upscale", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"upscaleFactor": [["(default)", 2], {"tooltip": "Factor by which to upscale the generated image. A value of 2 doubles width and height.", "default": "(default)", "rw_cat": "core"}], "settings.CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "settings.CFGScale_value", "tooltip": "Enable to set settings.CFGScale. Off uses the model's default.", "rw_cat": "settings"}], "settings.CFGScale_value": ["FLOAT", {"min": 3, "max": 12, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 3.0, "rw_cat": "settings"}], "settings.clipSkip": ["BOOLEAN", {"default": false, "rw_gates": "settings.clipSkip_value", "tooltip": "Enable to set settings.clipSkip. Off uses the model's default.", "rw_cat": "settings"}], "settings.clipSkip_value": ["INT", {"min": 0, "max": 2, "tooltip": "Number of layers to skip in the CLIP model.", "default": 0, "rw_cat": "settings"}], "settings.negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.seed": ["BOOLEAN", {"default": false, "rw_gates": "settings.seed_value", "tooltip": "Enable to set settings.seed. Off uses the model's default.", "rw_cat": "settings"}], "settings.seed_value": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "settings"}], "settings.steps": ["BOOLEAN", {"default": false, "rw_gates": "settings.steps_value", "tooltip": "Enable to set settings.steps. Off uses the model's default.", "rw_cat": "settings"}], "settings.steps_value": ["INT", {"min": 20, "max": 60, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 20, "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"upscaleFactor": {"path": ["upscaleFactor"], "kind": "scalar", "omit_value": "(default)"}, "settings.positivePrompt": {"path": ["settings", "positivePrompt"], "kind": "scalar", "omit_empty": true}, "settings.negativePrompt": {"path": ["settings", "negativePrompt"], "kind": "scalar", "omit_empty": true}, "settings.seed": {"path": ["settings", "seed"], "kind": "gate", "value_key": "settings.seed_value"}, "settings.seed_value": {"path": ["settings", "seed"], "kind": "skip"}, "settings.steps": {"path": ["settings", "steps"], "kind": "gate", "value_key": "settings.steps_value"}, "settings.steps_value": {"path": ["settings", "steps"], "kind": "skip"}, "settings.CFGScale": {"path": ["settings", "CFGScale"], "kind": "gate", "value_key": "settings.CFGScale_value"}, "settings.CFGScale_value": {"path": ["settings", "CFGScale"], "kind": "skip"}, "settings.clipSkip": {"path": ["settings", "clipSkip"], "kind": "gate", "value_key": "settings.clipSkip_value"}, "settings.clipSkip_value": {"path": ["settings", "clipSkip"], "kind": "skip"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_birefnet_massive_tr_dis5k_tr_tes", "name": "BiRefNet Massive TR DIS5K TR TES", "model": "runware:112@8", "task_type": "removeBackground", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_birefnet_hrsod_dhu", "name": "BiRefNet HRSOD DHU", "model": "runware:112@7", "task_type": "removeBackground", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_mediapipe_face_mesh", "name": "MediaPipe Face Mesh", "model": "runware:35@8", "task_type": "imageMasking", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"settings.confidence": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Confidence threshold for detections. Only detections above this score are included.", "rw_cat": "settings"}], "settings.maskBlur": ["INT", {"default": 5, "min": 0, "max": 100, "tooltip": "Blur radius for mask edges, creating smooth transitions.", "rw_cat": "settings"}], "settings.maskPadding": ["INT", {"default": 10, "min": 0, "max": 200, "tooltip": "Pixel amount to extend (positive) or shrink (negative) the mask area.", "rw_cat": "settings"}], "settings.maxDetections": ["INT", {"default": 6, "min": 1, "max": 20, "tooltip": "Maximum number of detections. Prioritizes highest confidence scores if exceeded.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "settings.confidence": {"path": ["settings", "confidence"], "kind": "scalar"}, "settings.maxDetections": {"path": ["settings", "maxDetections"], "kind": "scalar"}, "settings.maskPadding": {"path": ["settings", "maskPadding"], "kind": "scalar"}, "settings.maskBlur": {"path": ["settings", "maskBlur"], "kind": "scalar"}}}, {"key": "Runware_controlnet_preprocess_shuffle", "name": "ControlNet Preprocess Shuffle", "model": "runware:controlnet-preprocess@shuffle", "task_type": "controlNetPreprocess", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_mediapipe_lips_mesh", "name": "MediaPipe Lips Mesh", "model": "runware:35@14", "task_type": "imageMasking", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"settings.confidence": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Confidence threshold for detections. Only detections above this score are included.", "rw_cat": "settings"}], "settings.maskBlur": ["INT", {"default": 5, "min": 0, "max": 100, "tooltip": "Blur radius for mask edges, creating smooth transitions.", "rw_cat": "settings"}], "settings.maskPadding": ["INT", {"default": 10, "min": 0, "max": 200, "tooltip": "Pixel amount to extend (positive) or shrink (negative) the mask area.", "rw_cat": "settings"}], "settings.maxDetections": ["INT", {"default": 6, "min": 1, "max": 20, "tooltip": "Maximum number of detections. Prioritizes highest confidence scores if exceeded.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "settings.confidence": {"path": ["settings", "confidence"], "kind": "scalar"}, "settings.maxDetections": {"path": ["settings", "maxDetections"], "kind": "scalar"}, "settings.maskPadding": {"path": ["settings", "maskPadding"], "kind": "scalar"}, "settings.maskBlur": {"path": ["settings", "maskBlur"], "kind": "scalar"}}}, {"key": "Runware_mediapipe_face_full", "name": "MediaPipe Face Full", "model": "runware:35@6", "task_type": "imageMasking", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"settings.confidence": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Confidence threshold for detections. Only detections above this score are included.", "rw_cat": "settings"}], "settings.maskBlur": ["INT", {"default": 5, "min": 0, "max": 100, "tooltip": "Blur radius for mask edges, creating smooth transitions.", "rw_cat": "settings"}], "settings.maskPadding": ["INT", {"default": 10, "min": 0, "max": 200, "tooltip": "Pixel amount to extend (positive) or shrink (negative) the mask area.", "rw_cat": "settings"}], "settings.maxDetections": ["INT", {"default": 6, "min": 1, "max": 20, "tooltip": "Maximum number of detections. Prioritizes highest confidence scores if exceeded.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "settings.confidence": {"path": ["settings", "confidence"], "kind": "scalar"}, "settings.maxDetections": {"path": ["settings", "maxDetections"], "kind": "scalar"}, "settings.maskPadding": {"path": ["settings", "maskPadding"], "kind": "scalar"}, "settings.maskBlur": {"path": ["settings", "maskBlur"], "kind": "scalar"}}}, {"key": "Runware_birefnet_general", "name": "BiRefNet General", "model": "runware:112@5", "task_type": "removeBackground", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_birefnet_matting", "name": "BiRefNet Matting", "model": "runware:112@9", "task_type": "removeBackground", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_twinflow_z_image_turbo", "name": "TwinFlow Z-Image-Turbo", "model": "runware:twinflow-z-image-turbo@0", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"default": 1024, "step": 16, "tooltip": "Width of the generated media in pixels.", "rw_cat": "core"}], "height": ["INT", {"default": 1024, "step": 16, "tooltip": "Height of the generated media in pixels.", "rw_cat": "core"}]}, "optional": {"lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "fbCache", "fbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 4, "min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 0, "min": 0, "max": 50, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "acceleration": [["(default)", "none", "low", "medium", "high"], {"default": "(default)", "tooltip": "Optimization level.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "acceleration": {"path": ["acceleration"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_minimax_m2_7_highspeed", "name": "MiniMax M2.7 Highspeed", "model": "minimax:m2.7@highspeed", "task_type": "textInference", "creator": "minimax", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"seed": ["INT", {"min": 0, "max": 4294967295, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.maxTokens": ["INT", {"default": 32768, "min": 1, "max": 196608, "tooltip": "Maximum number of tokens to generate in the response.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 1, "min": 0, "max": 1, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "settings.topP": ["FLOAT", {"default": 0.95, "min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "rw_cat": "settings"}], "outputFormat": [["TEXT"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: tools"}]}}, "param_plan": {"seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.topP": {"path": ["settings", "topP"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_minimax_m2_7", "name": "MiniMax M2.7", "model": "minimax:m2.7@0", "task_type": "textInference", "creator": "minimax", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"seed": ["INT", {"min": 0, "max": 4294967295, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.maxTokens": ["INT", {"default": 32768, "min": 1, "max": 196608, "tooltip": "Maximum number of tokens to generate in the response.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 1, "min": 0, "max": 1, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "settings.topP": ["FLOAT", {"default": 0.95, "min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "rw_cat": "settings"}], "outputFormat": [["TEXT"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: tools"}]}}, "param_plan": {"seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.topP": {"path": ["settings", "topP"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_minimax_m3", "name": "MiniMax M3", "model": "minimax:m3@0", "task_type": "textInference", "creator": "minimax", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.maxTokens": ["INT", {"default": 128000, "min": 1, "max": 512000, "tooltip": "Maximum number of tokens to generate in the response.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "settings.topP": ["FLOAT", {"default": 0.95, "min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "rw_cat": "settings"}], "outputFormat": [["TEXT"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: tools"}]}}, "param_plan": {"settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.topP": {"path": ["settings", "topP"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_minimax_music_2_6", "name": "MiniMax Music 2.6", "model": "minimax:music@2.6", "task_type": "audioInference", "creator": "minimax", "input_types": {"required": {}, "optional": {"audioSettings": ["RUNWARE_AUDIOSETTINGS"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 1000000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.instrumental": ["BOOLEAN", {"default": false, "tooltip": "Generate instrumental output without vocals.", "rw_cat": "settings"}], "settings.lyrics": ["STRING", {"tooltip": "Structured lyrics with section tags such as [Intro], [Verse], [Chorus], [Bridge], [Outro], and [Inst]. For instrumental generation, a tag-only skeleton is acceptable.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.lyricsOptimizer": ["BOOLEAN", {"default": false, "tooltip": "Optimize provided lyrics or generate them from the prompt when omitted.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP3", "WAV", "FLAC", "OGG"], {"default": "MP3", "tooltip": "File format for the generated audio.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.instrumental": {"path": ["settings", "instrumental"], "kind": "scalar", "omit_value": false}, "settings.lyrics": {"path": ["settings", "lyrics"], "kind": "scalar", "omit_empty": true}, "settings.lyricsOptimizer": {"path": ["settings", "lyricsOptimizer"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "audioSettings": {"path": ["audioSettings"], "kind": "feature"}}}, {"key": "Runware_minimax_hailuo_2_3", "name": "MiniMax Hailuo 2.3", "model": "minimax:4@1", "task_type": "videoInference", "creator": "minimax", "input_types": {"required": {}, "optional": {"frameImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "duration": ["BOOLEAN", {"default": false, "rw_gates": "duration_value", "tooltip": "Enable to set duration. Off uses the model's default.", "rw_cat": "core"}], "duration_value": ["FLOAT", {"tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "default": 0.0, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.minimax.promptOptimizer": ["BOOLEAN", {"default": false, "tooltip": "Enable automatic prompt optimization. Affects reproducibility.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "gate", "value_key": "duration_value"}, "duration_value": {"path": ["duration"], "kind": "skip"}, "providerSettings.minimax.promptOptimizer": {"path": ["providerSettings", "minimax", "promptOptimizer"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_minimax_speech_2_8", "name": "MiniMax Speech 2.8", "model": "minimax:speech@2.8", "task_type": "audioInference", "creator": "minimax", "input_types": {"required": {"speech": ["RUNWARE_SPEECH", {"rw_socket_fields": ["text", "voice"], "rw_socket_enums": {"voice": ["English_expressive_narrator", "English_radiant_girl", "English_magnetic_voiced_man", "English_compelling_lady1", "English_Aussie_Bloke", "English_captivating_female1", "English_Upbeat_Woman", "English_Trustworth_Man", "English_CalmWoman", "English_UpsetGirl", "English_Gentle-voiced_man", "English_Whispering_girl", "English_Diligent_Man", "English_Graceful_Lady", "English_ReservedYoungMan", "English_PlayfulGirl", "English_ManWithDeepVoice", "English_MaturePartner", "English_FriendlyPerson", "English_MatureBoss", "English_Debator", "English_LovelyGirl", "English_Steadymentor", "English_Deep-VoicedGentleman", "English_Wiselady", "English_CaptivatingStoryteller", "English_DecentYoungMan", "English_SentimentalLady", "English_ImposingManner", "English_SadTeen", "English_PassionateWarrior", "English_WiseScholar", "English_Soft-spokenGirl", "English_SereneWoman", "English_ConfidentWoman", "English_PatientMan", "English_Comedian", "English_BossyLeader", "English_Strong-WilledBoy", "English_StressedLady", "English_AssertiveQueen", "English_AnimeCharacter", "English_Jovialman", "English_WhimsicalGirl", "English_Kind-heartedGirl", "Chinese (Mandarin)_Reliable_Executive", "Chinese (Mandarin)_News_Anchor", "Chinese (Mandarin)_Unrestrained_Young_Man", "Chinese (Mandarin)_Mature_Woman", "Arrogant_Miss", "Robot_Armor", "Chinese (Mandarin)_Kind-hearted_Antie", "Chinese (Mandarin)_HK_Flight_Attendant", "Chinese (Mandarin)_Humorous_Elder", "Chinese (Mandarin)_Gentleman", "Chinese (Mandarin)_Warm_Bestie", "Chinese (Mandarin)_Stubborn_Friend", "Chinese (Mandarin)_Sweet_Lady", "Chinese (Mandarin)_Southern_Young_Man", "Chinese (Mandarin)_Wise_Women", "Chinese (Mandarin)_Gentle_Youth", "Chinese (Mandarin)_Warm_Girl", "Chinese (Mandarin)_Male_Announcer", "Chinese (Mandarin)_Kind-hearted_Elder", "Chinese (Mandarin)_Cute_Spirit", "Chinese (Mandarin)_Radio_Host", "Chinese (Mandarin)_Lyrical_Voice", "Chinese (Mandarin)_Straightforward_Boy", "Chinese (Mandarin)_Sincere_Adult", "Chinese (Mandarin)_Gentle_Senior", "Chinese (Mandarin)_Crisp_Girl", "Chinese (Mandarin)_Pure-hearted_Boy", "Chinese (Mandarin)_Soft_Girl", "Chinese (Mandarin)_IntellectualGirl", "Chinese (Mandarin)_Warm_HeartedGirl", "Chinese (Mandarin)_Laid_BackGirl", "Chinese (Mandarin)_ExplorativeGirl", "Chinese (Mandarin)_Warm-HeartedAunt", "Chinese (Mandarin)_BashfulGirl", "Japanese_IntellectualSenior", "Japanese_DecisivePrincess", "Japanese_LoyalKnight", "Japanese_DominantMan", "Japanese_SeriousCommander", "Japanese_ColdQueen", "Japanese_DependableWoman", "Japanese_GentleButler", "Japanese_KindLady", "Japanese_CalmLady", "Japanese_OptimisticYouth", "Japanese_GenerousIzakayaOwner", "Japanese_SportyStudent", "Japanese_InnocentBoy", "Japanese_GracefulMaiden", "Cantonese_ProfessionalHost (F)", "Cantonese_GentleLady", "Cantonese_ProfessionalHost (M)", "Cantonese_PlayfulMan", "Cantonese_CuteGirl", "Cantonese_KindWoman", "Korean_AirheadedGirl", "Korean_AthleticGirl", "Korean_AthleticStudent", "Korean_BraveAdventurer", "Korean_BraveFemaleWarrior", "Korean_BraveYouth", "Korean_CalmGentleman", "Korean_CalmLady", "Korean_CaringWoman", "Korean_CharmingElderSister", "Korean_CharmingSister", "Korean_CheerfulBoyfriend", "Korean_CheerfulCoolJunior", "Korean_CheerfulLittleSister", "Korean_ChildhoodFriendGirl", "Korean_CockyGuy", "Korean_ColdGirl", "Korean_ColdYoungMan", "Korean_ConfidentBoss", "Korean_ConsiderateSenior", "Korean_DecisiveQueen", "Korean_DominantMan", "Korean_ElegantPrincess", "Korean_EnchantingSister", "Korean_EnthusiasticTeen", "Korean_FriendlyBigSister", "Korean_GentleBoss", "Korean_GentleWoman", "Korean_HaughtyLady", "Korean_InnocentBoy", "Korean_IntellectualMan", "Korean_IntellectualSenior", "Korean_LonelyWarrior", "Korean_MatureLady", "Korean_MysteriousGirl", "Korean_OptimisticYouth", "Korean_PlayboyCharmer", "Korean_PossessiveMan", "Korean_QuirkyGirl", "Korean_ReliableSister", "Korean_ReliableYouth", "Korean_SassyGirl", "Korean_ShyGirl", "Korean_SoothingLady", "Korean_StrictBoss", "Korean_SweetGirl", "Korean_ThoughtfulWoman", "Korean_WiseElf", "Korean_WiseTeacher", "Spanish_SereneWoman", "Spanish_MaturePartner", "Spanish_CaptivatingStoryteller", "Spanish_Narrator", "Spanish_WiseScholar", "Spanish_Kind-heartedGirl", "Spanish_DeterminedManager", "Spanish_BossyLeader", "Spanish_ReservedYoungMan", "Spanish_ConfidentWoman", "Spanish_ThoughtfulMan", "Spanish_Strong-WilledBoy", "Spanish_SophisticatedLady", "Spanish_RationalMan", "Spanish_AnimeCharacter", "Spanish_Deep-tonedMan", "Spanish_Fussyhostess", "Spanish_SincereTeen", "Spanish_FrankLady", "Spanish_Comedian", "Spanish_Debator", "Spanish_ToughBoss", "Spanish_Wiselady", "Spanish_Steadymentor", "Spanish_Jovialman", "Spanish_SantaClaus", "Spanish_Rudolph", "Spanish_Intonategirl", "Spanish_Arnold", "Spanish_Ghost", "Spanish_HumorousElder", "Spanish_EnergeticBoy", "Spanish_WhimsicalGirl", "Spanish_StrictBoss", "Spanish_ReliableMan", "Spanish_SereneElder", "Spanish_AngryMan", "Spanish_AssertiveQueen", "Spanish_CaringGirlfriend", "Spanish_PowerfulSoldier", "Spanish_PassionateWarrior", "Spanish_ChattyGirl", "Spanish_RomanticHusband", "Spanish_CompellingGirl", "Spanish_PowerfulVeteran", "Spanish_SensibleManager", "Spanish_ThoughtfulLady", "Portuguese_SentimentalLady", "Portuguese_BossyLeader", "Portuguese_Wiselady", "Portuguese_Strong-WilledBoy", "Portuguese_Deep-VoicedGentleman", "Portuguese_UpsetGirl", "Portuguese_PassionateWarrior", "Portuguese_AnimeCharacter", "Portuguese_ConfidentWoman", "Portuguese_AngryMan", "Portuguese_CaptivatingStoryteller", "Portuguese_Godfather", "Portuguese_ReservedYoungMan", "Portuguese_SmartYoungGirl", "Portuguese_Kind-heartedGirl", "Portuguese_Pompouslady", "Portuguese_Grinch", "Portuguese_Debator", "Portuguese_SweetGirl", "Portuguese_AttractiveGirl", "Portuguese_ThoughtfulMan", "Portuguese_PlayfulGirl", "Portuguese_GorgeousLady", "Portuguese_LovelyLady", "Portuguese_SereneWoman", "Portuguese_SadTeen", "Portuguese_MaturePartner", "Portuguese_Comedian", "Portuguese_NaughtySchoolgirl", "Portuguese_Narrator", "Portuguese_ToughBoss", "Portuguese_Fussyhostess", "Portuguese_Dramatist", "Portuguese_Steadymentor", "Portuguese_Jovialman", "Portuguese_CharmingQueen", "Portuguese_SantaClaus", "Portuguese_Rudolph", "Portuguese_Arnold", "Portuguese_CharmingSanta", "Portuguese_CharmingLady", "Portuguese_Ghost", "Portuguese_HumorousElder", "Portuguese_CalmLeader", "Portuguese_GentleTeacher", "Portuguese_EnergeticBoy", "Portuguese_ReliableMan", "Portuguese_SereneElder", "Portuguese_GrimReaper", "Portuguese_AssertiveQueen", "Portuguese_WhimsicalGirl", "Portuguese_StressedLady", "Portuguese_FriendlyNeighbor", "Portuguese_CaringGirlfriend", "Portuguese_PowerfulSoldier", "Portuguese_FascinatingBoy", "Portuguese_RomanticHusband", "Portuguese_StrictBoss", "Portuguese_InspiringLady", "Portuguese_PlayfulSpirit", "Portuguese_ElegantGirl", "Portuguese_CompellingGirl", "Portuguese_PowerfulVeteran", "Portuguese_SensibleManager", "Portuguese_ThoughtfulLady", "Portuguese_TheatricalActor", "Portuguese_FragileBoy", "Portuguese_ChattyGirl", "Portuguese_Conscientiousinstructor", "Portuguese_RationalMan", "Portuguese_WiseScholar", "Portuguese_FrankLady", "Portuguese_DeterminedManager", "French_Male_Speech_New", "French_Female_News Anchor", "French_CasualMan", "French_MovieLeadFemale", "French_FemaleAnchor", "French_MaleNarrator", "Indonesian_SweetGirl", "Indonesian_ReservedYoungMan", "Indonesian_CharmingGirl", "Indonesian_CalmWoman", "Indonesian_ConfidentWoman", "Indonesian_CaringMan", "Indonesian_BossyLeader", "Indonesian_DeterminedBoy", "Indonesian_GentleGirl", "German_FriendlyMan", "German_SweetLady", "German_PlayfulMan", "Russian_HandsomeChildhoodFriend", "Russian_BrightHeroine", "Russian_AmbitiousWoman", "Russian_ReliableMan", "Russian_CrazyQueen", "Russian_PessimisticGirl", "Russian_AttractiveGuy", "Russian_Bad-temperedBoy", "Italian_BraveHeroine", "Italian_Narrator", "Italian_WanderingSorcerer", "Italian_DiligentLeader", "Dutch_kindhearted_girl", "Dutch_bossy_leader", "Vietnamese_kindhearted_girl", "Arabic_CalmWoman", "Arabic_FriendlyGuy", "Turkish_CalmWoman", "Turkish_Trustworthyman", "Ukrainian_CalmWoman", "Ukrainian_WiseScholar", "Thai_male_1_sample8", "Thai_male_2_sample2", "Thai_female_1_sample1", "Thai_female_2_sample2", "Polish_male_1_sample4", "Polish_male_2_sample3", "Polish_female_1_sample1", "Polish_female_2_sample3", "Romanian_male_1_sample2", "Romanian_male_2_sample1", "Romanian_female_1_sample4", "Romanian_female_2_sample1", "greek_male_1a_v1", "Greek_female_1_sample1", "Greek_female_2_sample3", "czech_male_1_v1", "czech_female_5_v7", "czech_female_2_v2", "finnish_male_3_v1", "finnish_male_1_v2", "finnish_female_4_v1", "hindi_male_1_v2", "hindi_female_2_v1", "hindi_female_1_v2"]}, "rw_cat": "inputs"}]}, "optional": {"audioSettings": ["RUNWARE_AUDIOSETTINGS"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.languageBoost": [["zh", "yue", "en", "ar", "ru", "es", "fr", "pt", "de", "tr", "nl", "uk", "vi", "id", "ja", "it", "ko", "th", "pl", "ro", "el", "cs", "fi", "hi", "bg", "da", "he", "ms", "fa", "sk", "sv", "hr", "fil", "hu", "no", "sl", "ca", "nn", "ta", "af", "auto"], {"default": "auto", "tooltip": "Language detection and override for Speech synthesis.", "rw_cat": "settings"}], "settings.turbo": ["BOOLEAN", {"default": false, "tooltip": "Enable faster, lower-cost generation with potentially reduced quality.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP3", "WAV", "FLAC", "OGG"], {"default": "MP3", "tooltip": "File format for the generated audio.", "rw_cat": "output"}]}}, "param_plan": {"audioSettings": {"path": ["audioSettings"], "kind": "feature"}, "speech": {"path": ["speech"], "kind": "feature"}, "settings.languageBoost": {"path": ["settings", "languageBoost"], "kind": "scalar"}, "settings.turbo": {"path": ["settings", "turbo"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}}}, {"key": "Runware_minimax_01_live", "name": "MiniMax 01 Live", "model": "minimax:2@3", "task_type": "videoInference", "creator": "minimax", "input_types": {"required": {}, "optional": {"frameImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.minimax.promptOptimizer": ["BOOLEAN", {"default": false, "tooltip": "Enable automatic prompt optimization. Affects reproducibility.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "providerSettings.minimax.promptOptimizer": {"path": ["providerSettings", "minimax", "promptOptimizer"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_minimax_01_director", "name": "MiniMax 01 Director", "model": "minimax:2@1", "task_type": "videoInference", "creator": "minimax", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.minimax.promptOptimizer": ["BOOLEAN", {"default": false, "tooltip": "Enable automatic prompt optimization. Affects reproducibility.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "providerSettings.minimax.promptOptimizer": {"path": ["providerSettings", "minimax", "promptOptimizer"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_minimax_hailuo_2_3_fast", "name": "MiniMax Hailuo 2.3 Fast", "model": "minimax:4@2", "task_type": "videoInference", "creator": "minimax", "input_types": {"required": {"frameImages": ["IMAGE"]}, "optional": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "duration": ["BOOLEAN", {"default": false, "rw_gates": "duration_value", "tooltip": "Enable to set duration. Off uses the model's default.", "rw_cat": "core"}], "duration_value": ["FLOAT", {"tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "default": 0.0, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.minimax.promptOptimizer": ["BOOLEAN", {"default": false, "tooltip": "Enable automatic prompt optimization. Affects reproducibility.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "gate", "value_key": "duration_value"}, "duration_value": {"path": ["duration"], "kind": "skip"}, "providerSettings.minimax.promptOptimizer": {"path": ["providerSettings", "minimax", "promptOptimizer"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_minimax_hailuo_02", "name": "MiniMax Hailuo 02", "model": "minimax:3@1", "task_type": "videoInference", "creator": "minimax", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "duration": ["BOOLEAN", {"default": false, "rw_gates": "duration_value", "tooltip": "Enable to set duration. Off uses the model's default.", "rw_cat": "core"}], "duration_value": ["FLOAT", {"tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "default": 0.0, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.minimax.promptOptimizer": ["BOOLEAN", {"default": false, "tooltip": "Enable automatic prompt optimization. Affects reproducibility.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "gate", "value_key": "duration_value"}, "duration_value": {"path": ["duration"], "kind": "skip"}, "providerSettings.minimax.promptOptimizer": {"path": ["providerSettings", "minimax", "promptOptimizer"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_minimax_m2_5", "name": "MiniMax M2.5", "model": "minimax:m2.5@0", "task_type": "textInference", "creator": "minimax", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"seed": ["INT", {"min": 0, "max": 4294967295, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.frequencyPenalty": ["FLOAT", {"default": 0, "min": 0, "max": 2, "step": 0.01, "tooltip": "Penalizes tokens based on their frequency in the output so far. A value of 0.0 disables the penalty.", "rw_cat": "settings"}], "settings.maxTokens": ["INT", {"default": 8192, "min": 1, "max": 196608, "tooltip": "Maximum number of tokens to generate in the response.", "rw_cat": "settings"}], "settings.minP": ["FLOAT", {"default": 0, "min": 0, "max": 1, "step": 0.01, "tooltip": "Minimum probability threshold. Tokens with probability below this value are excluded from sampling.", "rw_cat": "settings"}], "settings.presencePenalty": ["FLOAT", {"default": 0, "min": 0, "max": 2, "step": 0.01, "tooltip": "Encourages the model to introduce new topics. A value of 0.0 disables the penalty.", "rw_cat": "settings"}], "settings.repetitionPenalty": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Penalizes tokens that have already appeared in the output. A value of 1.0 disables the penalty.", "rw_cat": "settings"}], "settings.splitThinking": ["BOOLEAN", {"default": false, "tooltip": "When enabled, the model's internal reasoning is separated from the main response and returned in a dedicated `reasoningContent` field.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "settings.topK": ["INT", {"default": 40, "min": 1, "max": 100, "tooltip": "Top-K sampling parameter that limits the number of highest-probability tokens considered at each step.", "rw_cat": "settings"}], "settings.topP": ["FLOAT", {"default": 0.95, "min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "rw_cat": "settings"}], "outputFormat": [["TEXT"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: settings.stopSequences, tools"}]}}, "param_plan": {"seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.topP": {"path": ["settings", "topP"], "kind": "scalar"}, "settings.frequencyPenalty": {"path": ["settings", "frequencyPenalty"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "settings.minP": {"path": ["settings", "minP"], "kind": "scalar"}, "settings.presencePenalty": {"path": ["settings", "presencePenalty"], "kind": "scalar"}, "settings.repetitionPenalty": {"path": ["settings", "repetitionPenalty"], "kind": "scalar"}, "settings.splitThinking": {"path": ["settings", "splitThinking"], "kind": "scalar", "omit_value": false}, "settings.topK": {"path": ["settings", "topK"], "kind": "scalar"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_minimax_01", "name": "MiniMax 01", "model": "minimax:1@1", "task_type": "videoInference", "creator": "minimax", "input_types": {"required": {}, "optional": {"referenceImages": ["IMAGE"], "frameImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.minimax.promptOptimizer": ["BOOLEAN", {"default": false, "tooltip": "Enable automatic prompt optimization. Affects reproducibility.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "providerSettings.minimax.promptOptimizer": {"path": ["providerSettings", "minimax", "promptOptimizer"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_minimax_music_cover", "name": "MiniMax Music Cover", "model": "minimax:music@cover", "task_type": "audioInference", "creator": "minimax", "input_types": {"required": {"audio": ["STRING", {"tooltip": "Audio input (UUID or URL). The provided audio file must be between 6 seconds and 6 minutes in duration.", "rw_cat": "core"}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"audioSettings": ["RUNWARE_AUDIOSETTINGS"], "seed": ["INT", {"min": 0, "max": 1000000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.lyrics": ["STRING", {"tooltip": "Structured lyrics with section tags such as [Intro], [Verse], [Chorus], [Bridge], [Outro], and [Inst]. For instrumental generation, a tag-only skeleton is acceptable.", "multiline": true, "default": "", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP3", "WAV", "FLAC", "OGG"], {"default": "MP3", "tooltip": "File format for the generated audio.", "rw_cat": "output"}]}}, "param_plan": {"audio": {"path": ["inputs", "audio"], "kind": "scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.lyrics": {"path": ["settings", "lyrics"], "kind": "scalar", "omit_empty": true}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "audioSettings": {"path": ["audioSettings"], "kind": "feature"}}}, {"key": "Runware_deepseek_v4_flash", "name": "DeepSeek-V4-Flash", "model": "deepseek:v4@flash", "task_type": "textInference", "creator": "deepseek", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.frequencyPenalty": ["FLOAT", {"default": 0, "min": 0, "max": 2, "step": 0.01, "tooltip": "Penalizes tokens based on their frequency in the output so far. A value of 0.0 disables the penalty.", "rw_cat": "settings"}], "settings.maxTokens": ["INT", {"default": 32768, "min": 1, "max": 1048576, "tooltip": "Maximum number of tokens to generate in the response.", "rw_cat": "settings"}], "settings.presencePenalty": ["FLOAT", {"default": 0, "min": 0, "max": 2, "step": 0.01, "tooltip": "Encourages the model to introduce new topics. A value of 0.0 disables the penalty.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "settings.thinkingLevel": [["off", "high", "max"], {"default": "off", "tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "settings.topP": ["FLOAT", {"default": 1, "min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "rw_cat": "settings"}], "outputFormat": [["TEXT", "JSON"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: settings.stopSequences, jsonSchema, tools"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.topP": {"path": ["settings", "topP"], "kind": "scalar"}, "settings.frequencyPenalty": {"path": ["settings", "frequencyPenalty"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "settings.presencePenalty": {"path": ["settings", "presencePenalty"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_deepseek_v4_pro", "name": "DeepSeek-V4-Pro", "model": "deepseek:v4@pro", "task_type": "textInference", "creator": "deepseek", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.frequencyPenalty": ["FLOAT", {"default": 0, "min": 0, "max": 2, "step": 0.01, "tooltip": "Penalizes tokens based on their frequency in the output so far. A value of 0.0 disables the penalty.", "rw_cat": "settings"}], "settings.maxTokens": ["INT", {"default": 32768, "min": 1, "max": 100000, "tooltip": "Maximum number of tokens to generate in the response.", "rw_cat": "settings"}], "settings.presencePenalty": ["FLOAT", {"default": 0, "min": 0, "max": 2, "step": 0.01, "tooltip": "Encourages the model to introduce new topics. A value of 0.0 disables the penalty.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "settings.thinkingLevel": [["off", "high", "max"], {"default": "off", "tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "settings.topP": ["FLOAT", {"default": 1, "min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "rw_cat": "settings"}], "outputFormat": [["TEXT"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: settings.stopSequences, tools"}]}}, "param_plan": {"seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.topP": {"path": ["settings", "topP"], "kind": "scalar"}, "settings.frequencyPenalty": {"path": ["settings", "frequencyPenalty"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "settings.presencePenalty": {"path": ["settings", "presencePenalty"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_prunaai_p_video", "name": "P-Video", "model": "prunaai:p-video@0", "task_type": "videoInference", "creator": "prunaai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "default": "", "rw_cat": "core"}], "size": [["None (model default)", "720p (from input)", "1080p (from input)", "720p (16:9)", "720p (9:16)", "720p (4:3)", "720p (3:4)", "720p (3:2)", "720p (2:3)", "720p (1:1)", "1080p (16:9)", "1080p (9:16)", "1080p (4:3)", "1080p (3:4)", "1080p (3:2)", "1080p (2:3)", "1080p (1:1)"], {"default": "720p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": ["INT", {"default": 5, "min": 1, "max": 10, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "fps": [[24, 48], {"default": 24, "tooltip": "Frames per second for video generation. Higher values create smoother motion but require more processing time.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.audio": ["BOOLEAN", {"default": true, "tooltip": "Include audio in the generated video output.", "rw_cat": "settings"}], "settings.draft": ["BOOLEAN", {"default": false, "tooltip": "Enable draft mode for lower-resolution preview generation.", "rw_cat": "settings"}], "settings.promptUpsampling": ["BOOLEAN", {"default": true, "tooltip": "Automatically enhance the prompt for improved results.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "audio": {"path": ["inputs", "audio"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "fps": {"path": ["fps"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.audio": {"path": ["settings", "audio"], "kind": "scalar"}, "settings.draft": {"path": ["settings", "draft"], "kind": "scalar", "omit_value": false}, "settings.promptUpsampling": {"path": ["settings", "promptUpsampling"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (9:16)": {"width": 720, "height": 1280}, "720p (4:3)": {"width": 960, "height": 720}, "720p (3:4)": {"width": 720, "height": 960}, "720p (3:2)": {"width": 1080, "height": 720}, "720p (2:3)": {"width": 720, "height": 1080}, "720p (1:1)": {"width": 720, "height": 720}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (9:16)": {"width": 1080, "height": 1920}, "1080p (4:3)": {"width": 1440, "height": 1080}, "1080p (3:4)": {"width": 1080, "height": 1440}, "1080p (3:2)": {"width": 1620, "height": 1080}, "1080p (2:3)": {"width": 1080, "height": 1620}, "1080p (1:1)": {"width": 1080, "height": 1080}}}}}, {"key": "Runware_prunaai_p_image", "name": "P-Image", "model": "prunaai:1@1", "task_type": "imageInference", "creator": "prunaai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 256, "max": 1440, "step": 16, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 256, "max": 1440, "step": 16, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_prunaai_p_video_animate", "name": "P-Video-Animate", "model": "prunaai:p-video@animate", "task_type": "videoInference", "creator": "prunaai", "input_types": {"required": {"referenceImages": ["IMAGE"], "referenceVideos": ["RUNWARE_REFERENCEVIDEOS"]}, "optional": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "resolution": [["720p", "1080p"], {"default": "720p", "tooltip": "Resolution preset for the output. When used with input media, automatically matches the aspect ratio from the input.", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "fps": [["(default)", 24, 48], {"tooltip": "Frames per second for video generation. Higher values create smoother motion but require more processing time.", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.preserveAudio": ["BOOLEAN", {"default": true, "tooltip": "Preserve the source video audio track in the output.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "referenceVideos": {"path": ["inputs", "referenceVideos"], "kind": "feature"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "resolution": {"path": ["resolution"], "kind": "scalar"}, "fps": {"path": ["fps"], "kind": "scalar", "omit_value": "(default)"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.preserveAudio": {"path": ["settings", "preserveAudio"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_prunaai_p_image_upscale", "name": "P-Image Upscale", "model": "prunaai:p-image@upscale", "task_type": "upscale", "creator": "prunaai", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"upscaleFactor": ["BOOLEAN", {"default": false, "rw_gates": "upscaleFactor_value", "tooltip": "Enable to set upscaleFactor. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "upscaleFactor_value": ["INT", {"min": 2, "max": 16, "tooltip": "Factor by which to upscale the generated image. A value of 2 doubles width and height.", "default": 2, "rw_cat": "core"}], "targetMegapixels": ["BOOLEAN", {"default": false, "rw_gates": "targetMegapixels_value", "tooltip": "Enable to set targetMegapixels. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "targetMegapixels_value": ["INT", {"min": 1, "max": 128, "tooltip": "Target resolution in megapixels. Output is capped at 128 MP.", "default": 1, "rw_cat": "core"}], "settings.enhanceDetails": ["BOOLEAN", {"default": false, "tooltip": "Enhances fine textures and small details. May increase contrast and introduce minor deviations from the original.", "rw_cat": "settings"}], "settings.realism": ["BOOLEAN", {"default": false, "tooltip": "Improves realism in the upscaled image. May deviate more from the original. Recommended for AI-generated images.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"upscaleFactor": {"path": ["upscaleFactor"], "kind": "gate", "value_key": "upscaleFactor_value"}, "upscaleFactor_value": {"path": ["upscaleFactor"], "kind": "skip"}, "settings.enhanceDetails": {"path": ["settings", "enhanceDetails"], "kind": "scalar", "omit_value": false}, "settings.realism": {"path": ["settings", "realism"], "kind": "scalar", "omit_value": false}, "targetMegapixels": {"path": ["targetMegapixels"], "kind": "gate", "value_key": "targetMegapixels_value"}, "targetMegapixels_value": {"path": ["targetMegapixels"], "kind": "skip"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_prunaai_p_image_try_on", "name": "P-Image-Try-On", "model": "prunaai:p-image@try-on", "task_type": "imageInference", "creator": "prunaai", "input_types": {"required": {"referenceImages": ["RUNWARE_REFERENCEIMAGES", {"rw_socket_fields": ["image", "role"], "rw_socket_enums": {"role": ["person", "garment", "pose"]}, "rw_cat": "inputs"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "positivePrompt": ["STRING", {"tooltip": "Experimental guidance for non-flatlay garment images, for example which garment from which image to use.", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.preserveInputSize": ["BOOLEAN", {"default": true, "tooltip": "Return the output at the original input resolution. When disabled, the output keeps the model's internal working resolution, which may differ from the input because inputs are dynamically resized for quality and speed.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "settings.turbo": ["BOOLEAN", {"default": false, "tooltip": "Enable turbo mode for faster generation. May reduce subtle details in complex tasks.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "feature"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.preserveInputSize": {"path": ["settings", "preserveInputSize"], "kind": "scalar"}, "settings.turbo": {"path": ["settings", "turbo"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_prunaai_p_image_edit", "name": "P-Image-Edit", "model": "prunaai:2@1", "task_type": "imageInference", "creator": "prunaai", "input_types": {"required": {"referenceImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.prunaai.turbo": ["BOOLEAN", {"default": false, "tooltip": "Enable turbo mode for faster generation. May reduce subtle details in complex tasks.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "providerSettings.prunaai.turbo": {"path": ["providerSettings", "prunaai", "turbo"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_prunaai_p_video_avatar", "name": "P-Video-Avatar", "model": "prunaai:p-video@avatar", "task_type": "videoInference", "creator": "prunaai", "input_types": {"required": {"frameImages": ["IMAGE"]}, "optional": {"speech": ["RUNWARE_SPEECH", {"rw_socket_fields": ["language", "text", "voice"], "rw_socket_enums": {"voice": ["Zephyr (Female)", "Puck (Male)", "Charon (Male)", "Kore (Female)", "Fenrir (Male)", "Leda (Female)", "Orus (Male)", "Aoede (Female)", "Callirrhoe (Female)", "Autonoe (Female)", "Enceladus (Male)", "Iapetus (Male)", "Umbriel (Male)", "Algenib (Male)", "Despina (Female)", "Erinome (Female)", "Laomedeia (Female)", "Achernar (Female)", "Algieba (Male)", "Schedar (Male)", "Gacrux (Female)", "Pulcherrima (Female)", "Achird (Male)", "Zubenelgenubi (Male)", "Vindemiatrix (Female)", "Sadachbia (Male)", "Sadaltager (Male)", "Sulafat (Female)", "Alnilam (Male)", "Rasalgethi (Male)"], "language": ["en", "en-US", "en-GB", "es", "es-ES", "fr", "fr-FR", "de", "de-DE", "it", "it-IT", "pt-BR", "ja", "ja-JP", "ko", "ko-KR", "hi", "hi-IN"]}, "rw_cat": "inputs"}], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "default": "", "rw_cat": "core"}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "resolution": [["720p", "1080p"], {"default": "720p", "tooltip": "Resolution preset for the output. When used with input media, automatically matches the aspect ratio from the input.", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.promptUpsampling": ["BOOLEAN", {"default": false, "tooltip": "Automatically enhance the prompt for improved results.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "settings.safetyFilter": ["BOOLEAN", {"default": true, "tooltip": "Content safety filtering on prompts and input image.", "rw_cat": "settings"}], "settings.voicePrompt": ["STRING", {"default": "Say the following.", "tooltip": "Speaking style, tone, pacing, or emotion instructions for delivery.", "multiline": true, "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "audio": {"path": ["inputs", "audio"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "resolution": {"path": ["resolution"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "speech": {"path": ["speech"], "kind": "feature"}, "settings.promptUpsampling": {"path": ["settings", "promptUpsampling"], "kind": "scalar"}, "settings.safetyFilter": {"path": ["settings", "safetyFilter"], "kind": "scalar"}, "settings.voicePrompt": {"path": ["settings", "voicePrompt"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_prunaai_p_video_replace", "name": "P-Video-Replace", "model": "prunaai:p-video@replace", "task_type": "videoInference", "creator": "prunaai", "input_types": {"required": {"referenceImages": ["IMAGE"], "video": ["STRING", {"tooltip": "Video input (UUID or URL).", "rw_cat": "core"}]}, "optional": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "resolution": [["720p", "1080p"], {"default": "720p", "tooltip": "Resolution preset for the output. When used with input media, automatically matches the aspect ratio from the input.", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "fps": [["(default)", 24, 48], {"tooltip": "Frames per second for video generation. Higher values create smoother motion but require more processing time.", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.preserveAudio": ["BOOLEAN", {"default": true, "tooltip": "Preserve the source video audio track in the output.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "settings.sourceAudioSync": ["BOOLEAN", {"default": true, "tooltip": "Drive lip and motion sync from the source video audio. Independent of `preserveAudio`, which controls audio in the final output.", "rw_cat": "settings"}], "settings.turbo": ["BOOLEAN", {"default": false, "tooltip": "Enable turbo mode for faster generation. May reduce subtle details in complex tasks.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "video": {"path": ["inputs", "video"], "kind": "scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "resolution": {"path": ["resolution"], "kind": "scalar"}, "fps": {"path": ["fps"], "kind": "scalar", "omit_value": "(default)"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.preserveAudio": {"path": ["settings", "preserveAudio"], "kind": "scalar"}, "settings.sourceAudioSync": {"path": ["settings", "sourceAudioSync"], "kind": "scalar"}, "settings.turbo": {"path": ["settings", "turbo"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_rundiffusion_juggernaut_lightning_flux", "name": "Juggernaut Lightning Flux", "model": "rundiffusion:110@101", "task_type": "imageInference", "creator": "rundiffusion", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "controlNet": ["RUNWARE_CONTROLNET", {"rw_socket_models": ["runware:25@1", "runware:26@1", "runware:27@1", "runware:28@1", "runware:29@1", "runware:30@1", "runware:31@1", "runware:98@1"], "rw_socket_fields": ["controlMode", "endStep", "endStepPercentage", "guideImage", "model", "startStep", "startStepPercentage", "weight"], "rw_socket_enums": {"controlMode": ["balanced", "controlnet", "prompt"]}, "rw_cat": "inputs"}], "ipAdapters": ["RUNWARE_IPADAPTERS", {"rw_socket_models": ["runware:56@1", "runware:56@2", "runware:56@3", "runware:56@4"], "rw_socket_fields": ["guideImages", "model", "weight"], "rw_cat": "inputs"}], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "fbCache", "fbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "trueCFGScale": ["BOOLEAN", {"default": false, "rw_gates": "trueCFGScale_value", "tooltip": "Enable to set trueCFGScale. Off uses the model's default.", "rw_cat": "core"}], "trueCFGScale_value": ["FLOAT", {"tooltip": "True Classifier-Free Guidance scale. Higher values increase prompt adherence at the cost of quality.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "promptWeighting": [["(default)", "sdEmbeds"], {"tooltip": "Syntax used for prompt weighting.", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: hiresFix"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "promptWeighting": {"path": ["promptWeighting"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "controlNet": {"path": ["controlNet"], "kind": "feature"}, "ipAdapters": {"path": ["ipAdapters"], "kind": "feature"}, "trueCFGScale": {"path": ["trueCFGScale"], "kind": "gate", "value_key": "trueCFGScale_value"}, "trueCFGScale_value": {"path": ["trueCFGScale"], "kind": "skip"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_rundiffusion_juggernaut_z", "name": "Juggernaut Z", "model": "rundiffusion:200@100", "task_type": "imageInference", "creator": "rundiffusion", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 16, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 16, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "fbCache", "fbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 35, "min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "scheduler": [["DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"default": "FlowMatchEulerDiscreteScheduler", "tooltip": "Scheduler to use for the diffusion process.", "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 6, "min": 0, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"steps": {"path": ["steps"], "kind": "scalar"}, "scheduler": {"path": ["scheduler"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_rundiffusion_juggernaut_base_flux", "name": "Juggernaut Base Flux", "model": "rundiffusion:120@100", "task_type": "imageInference", "creator": "rundiffusion", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "controlNet": ["RUNWARE_CONTROLNET", {"rw_socket_models": ["runware:25@1", "runware:26@1", "runware:27@1", "runware:28@1", "runware:29@1", "runware:30@1", "runware:31@1", "runware:98@1"], "rw_socket_fields": ["controlMode", "endStep", "endStepPercentage", "guideImage", "model", "startStep", "startStepPercentage", "weight"], "rw_socket_enums": {"controlMode": ["balanced", "controlnet", "prompt"]}, "rw_cat": "inputs"}], "ipAdapters": ["RUNWARE_IPADAPTERS", {"rw_socket_models": ["runware:56@1", "runware:56@2", "runware:56@3", "runware:56@4"], "rw_socket_fields": ["guideImages", "model", "weight"], "rw_cat": "inputs"}], "pulid": ["RUNWARE_PULID"], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "trueCFGScale": ["BOOLEAN", {"default": false, "rw_gates": "trueCFGScale_value", "tooltip": "Enable to set trueCFGScale. Off uses the model's default.", "rw_cat": "core"}], "trueCFGScale_value": ["FLOAT", {"tooltip": "True Classifier-Free Guidance scale. Higher values increase prompt adherence at the cost of quality.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "promptWeighting": [["(default)", "sdEmbeds"], {"tooltip": "Syntax used for prompt weighting.", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "layerDiffuse": ["BOOLEAN", {"default": false, "tooltip": "LayerDiffuse for transparent image generation.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: hiresFix"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "promptWeighting": {"path": ["promptWeighting"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "controlNet": {"path": ["controlNet"], "kind": "feature"}, "ipAdapters": {"path": ["ipAdapters"], "kind": "feature"}, "layerDiffuse": {"path": ["layerDiffuse"], "kind": "scalar", "omit_value": false}, "pulid": {"path": ["pulid"], "kind": "feature"}, "trueCFGScale": {"path": ["trueCFGScale"], "kind": "gate", "value_key": "trueCFGScale_value"}, "trueCFGScale_value": {"path": ["trueCFGScale"], "kind": "skip"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_rundiffusion_juggernaut_pro_flux", "name": "Juggernaut Pro Flux", "model": "rundiffusion:130@100", "task_type": "imageInference", "creator": "rundiffusion", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "controlNet": ["RUNWARE_CONTROLNET", {"rw_socket_models": ["runware:25@1", "runware:26@1", "runware:27@1", "runware:28@1", "runware:29@1", "runware:30@1", "runware:31@1", "runware:98@1"], "rw_socket_fields": ["controlMode", "endStep", "endStepPercentage", "guideImage", "model", "startStep", "startStepPercentage", "weight"], "rw_socket_enums": {"controlMode": ["balanced", "controlnet", "prompt"]}, "rw_cat": "inputs"}], "ipAdapters": ["RUNWARE_IPADAPTERS", {"rw_socket_models": ["runware:56@1", "runware:56@2", "runware:56@3", "runware:56@4"], "rw_socket_fields": ["guideImages", "model", "weight"], "rw_cat": "inputs"}], "pulid": ["RUNWARE_PULID"], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "trueCFGScale": ["BOOLEAN", {"default": false, "rw_gates": "trueCFGScale_value", "tooltip": "Enable to set trueCFGScale. Off uses the model's default.", "rw_cat": "core"}], "trueCFGScale_value": ["FLOAT", {"tooltip": "True Classifier-Free Guidance scale. Higher values increase prompt adherence at the cost of quality.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "promptWeighting": [["(default)", "sdEmbeds"], {"tooltip": "Syntax used for prompt weighting.", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "layerDiffuse": ["BOOLEAN", {"default": false, "tooltip": "LayerDiffuse for transparent image generation.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: hiresFix"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "promptWeighting": {"path": ["promptWeighting"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "controlNet": {"path": ["controlNet"], "kind": "feature"}, "ipAdapters": {"path": ["ipAdapters"], "kind": "feature"}, "layerDiffuse": {"path": ["layerDiffuse"], "kind": "scalar", "omit_value": false}, "pulid": {"path": ["pulid"], "kind": "feature"}, "trueCFGScale": {"path": ["trueCFGScale"], "kind": "gate", "value_key": "trueCFGScale_value"}, "trueCFGScale_value": {"path": ["trueCFGScale"], "kind": "skip"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_sync_react_1", "name": "react-1", "model": "sync:react-1@1", "task_type": "videoInference", "creator": "sync", "input_types": {"required": {"video": ["STRING", {"tooltip": "Video input (UUID or URL).", "rw_cat": "core"}], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "rw_cat": "core"}]}, "optional": {"numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.sync.activeSpeakerDetection.autoDetect": ["BOOLEAN", {"default": false, "tooltip": "Automatically detect and target the active speaker.", "rw_cat": "settings"}], "providerSettings.sync.editRegion": [["face", "lips", "head"], {"default": "face", "tooltip": "Region of the subject to animate during re-animation.", "rw_cat": "settings"}], "providerSettings.sync.emotionPrompt": [["(default)", "happy", "sad", "angry", "disgusted", "surprised", "neutral"], {"tooltip": "Emotional tone for performance re-animation.", "default": "(default)", "rw_cat": "settings"}], "providerSettings.sync.occlusionDetectionEnabled": ["BOOLEAN", {"default": false, "tooltip": "Enable occlusion handling for obstructed faces.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "providerSettings.sync.syncMode": [["bounce", "loop", "cut_off", "silence", "remap"], {"default": "bounce", "tooltip": "Synchronization strategy when audio and video durations don't match.", "rw_cat": "settings"}], "providerSettings.sync.temperature": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Expressiveness of lip sync and facial movements.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"video": {"path": ["inputs", "video"], "kind": "scalar"}, "audio": {"path": ["inputs", "audio"], "kind": "scalar"}, "providerSettings.sync.activeSpeakerDetection.autoDetect": {"path": ["providerSettings", "sync", "activeSpeakerDetection", "autoDetect"], "kind": "scalar", "omit_value": false}, "providerSettings.sync.editRegion": {"path": ["providerSettings", "sync", "editRegion"], "kind": "scalar"}, "providerSettings.sync.emotionPrompt": {"path": ["providerSettings", "sync", "emotionPrompt"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.sync.occlusionDetectionEnabled": {"path": ["providerSettings", "sync", "occlusionDetectionEnabled"], "kind": "scalar", "omit_value": false}, "providerSettings.sync.syncMode": {"path": ["providerSettings", "sync", "syncMode"], "kind": "scalar"}, "providerSettings.sync.temperature": {"path": ["providerSettings", "sync", "temperature"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_sync_lipsync_2", "name": "lipsync-2", "model": "sync:lipsync-2@1", "task_type": "videoInference", "creator": "sync", "input_types": {"required": {"video": ["STRING", {"tooltip": "Video input (UUID or URL).", "rw_cat": "core"}], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "rw_cat": "core"}]}, "optional": {"numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.sync.activeSpeakerDetection.autoDetect": ["BOOLEAN", {"default": false, "tooltip": "Automatically detect and target the active speaker.", "rw_cat": "settings"}], "providerSettings.sync.occlusionDetectionEnabled": ["BOOLEAN", {"default": false, "tooltip": "Enable occlusion handling for obstructed faces.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "providerSettings.sync.syncMode": [["bounce", "loop", "cut_off", "silence", "remap"], {"default": "bounce", "tooltip": "Synchronization strategy when audio and video durations don't match.", "rw_cat": "settings"}], "providerSettings.sync.temperature": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Expressiveness of lip sync and facial movements.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: providerSettings.sync.segments"}]}}, "param_plan": {"video": {"path": ["inputs", "video"], "kind": "scalar"}, "audio": {"path": ["inputs", "audio"], "kind": "scalar"}, "providerSettings.sync.activeSpeakerDetection.autoDetect": {"path": ["providerSettings", "sync", "activeSpeakerDetection", "autoDetect"], "kind": "scalar", "omit_value": false}, "providerSettings.sync.occlusionDetectionEnabled": {"path": ["providerSettings", "sync", "occlusionDetectionEnabled"], "kind": "scalar", "omit_value": false}, "providerSettings.sync.syncMode": {"path": ["providerSettings", "sync", "syncMode"], "kind": "scalar"}, "providerSettings.sync.temperature": {"path": ["providerSettings", "sync", "temperature"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_sync_3", "name": "Runware Sync 3", "model": "sync:lipsync@3", "task_type": "videoInference", "creator": "sync", "input_types": {"required": {"video": ["STRING", {"tooltip": "Video input (UUID or URL).", "rw_cat": "core"}]}, "optional": {"speech": ["RUNWARE_SPEECH", {"rw_socket_fields": ["text", "voice"], "rw_cat": "inputs"}], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "default": "", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.activeSpeakerDetection.autoDetect": ["BOOLEAN", {"default": false, "tooltip": "Automatically detect and target the active speaker.", "rw_cat": "settings"}], "settings.emotion": [["(default)", "happy", "sad", "angry", "disgusted", "surprised", "neutral"], {"tooltip": "Emotional tone for performance re-animation.", "default": "(default)", "rw_cat": "settings"}], "settings.activeSpeakerDetection.frameNumber": ["BOOLEAN", {"default": false, "rw_gates": "settings.activeSpeakerDetection.frameNumber_value", "tooltip": "Enable to set settings.activeSpeakerDetection.frameNumber. Off uses the model's default.", "rw_cat": "settings"}], "settings.activeSpeakerDetection.frameNumber_value": ["INT", {"min": 0, "tooltip": "Frame index corresponding to the provided face coordinates.", "default": 0, "rw_cat": "settings"}], "settings.mode": [["(default)", "lips", "face", "head"], {"tooltip": "Controls the region of facial animation applied during lip sync.", "default": "(default)", "rw_cat": "settings"}], "settings.occlusionDetection": ["BOOLEAN", {"default": false, "tooltip": "Enable occlusion handling for obstructed faces.", "rw_cat": "settings"}], "settings.tts.provider": ["STRING", {"default": "elevenlabs", "tooltip": "Name of the TTS provider.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "settings.tts.similarityBoost": ["BOOLEAN", {"default": false, "rw_gates": "settings.tts.similarityBoost_value", "tooltip": "Enable to set settings.tts.similarityBoost. Off uses the model's default.", "rw_cat": "settings"}], "settings.tts.similarityBoost_value": ["FLOAT", {"min": 0, "max": 1, "tooltip": "Voice similarity enforcement for the TTS provider. Higher values make the voice more closely match the target.", "default": 0.0, "rw_cat": "settings"}], "settings.tts.stability": ["BOOLEAN", {"default": false, "rw_gates": "settings.tts.stability_value", "tooltip": "Enable to set settings.tts.stability. Off uses the model's default.", "rw_cat": "settings"}], "settings.tts.stability_value": ["FLOAT", {"min": 0, "max": 1, "tooltip": "Voice stability for the TTS provider. Higher values produce more consistent output.", "default": 0.0, "rw_cat": "settings"}], "settings.syncMode": [["bounce", "cut_off", "silence", "remap"], {"default": "cut_off", "tooltip": "Synchronization strategy when audio and video durations don't match.", "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Expressiveness of lip sync and facial movements.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: settings.activeSpeakerDetection.boundingBoxes, settings.activeSpeakerDetection.coordinates, settings.segments"}]}}, "param_plan": {"video": {"path": ["inputs", "video"], "kind": "scalar"}, "audio": {"path": ["inputs", "audio"], "kind": "scalar", "omit_empty": true}, "speech": {"path": ["speech"], "kind": "feature"}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.activeSpeakerDetection.autoDetect": {"path": ["settings", "activeSpeakerDetection", "autoDetect"], "kind": "scalar", "omit_value": false}, "settings.activeSpeakerDetection.frameNumber": {"path": ["settings", "activeSpeakerDetection", "frameNumber"], "kind": "gate", "value_key": "settings.activeSpeakerDetection.frameNumber_value"}, "settings.activeSpeakerDetection.frameNumber_value": {"path": ["settings", "activeSpeakerDetection", "frameNumber"], "kind": "skip"}, "settings.emotion": {"path": ["settings", "emotion"], "kind": "scalar", "omit_value": "(default)"}, "settings.mode": {"path": ["settings", "mode"], "kind": "scalar", "omit_value": "(default)"}, "settings.occlusionDetection": {"path": ["settings", "occlusionDetection"], "kind": "scalar", "omit_value": false}, "settings.syncMode": {"path": ["settings", "syncMode"], "kind": "scalar"}, "settings.tts.provider": {"path": ["settings", "tts", "provider"], "kind": "scalar"}, "settings.tts.stability": {"path": ["settings", "tts", "stability"], "kind": "gate", "value_key": "settings.tts.stability_value"}, "settings.tts.stability_value": {"path": ["settings", "tts", "stability"], "kind": "skip"}, "settings.tts.similarityBoost": {"path": ["settings", "tts", "similarityBoost"], "kind": "gate", "value_key": "settings.tts.similarityBoost_value"}, "settings.tts.similarityBoost_value": {"path": ["settings", "tts", "similarityBoost"], "kind": "skip"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_sync_lipsync_2_pro", "name": "lipsync-2-pro", "model": "sync:lipsync-2-pro@1", "task_type": "videoInference", "creator": "sync", "input_types": {"required": {"video": ["STRING", {"tooltip": "Video input (UUID or URL).", "rw_cat": "core"}], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "rw_cat": "core"}]}, "optional": {"numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.sync.activeSpeakerDetection.autoDetect": ["BOOLEAN", {"default": false, "tooltip": "Automatically detect and target the active speaker.", "rw_cat": "settings"}], "providerSettings.sync.occlusionDetectionEnabled": ["BOOLEAN", {"default": false, "tooltip": "Enable occlusion handling for obstructed faces.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "providerSettings.sync.syncMode": [["bounce", "loop", "cut_off", "silence", "remap"], {"default": "bounce", "tooltip": "Synchronization strategy when audio and video durations don't match.", "rw_cat": "settings"}], "providerSettings.sync.temperature": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Expressiveness of lip sync and facial movements.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: providerSettings.sync.segments"}]}}, "param_plan": {"video": {"path": ["inputs", "video"], "kind": "scalar"}, "audio": {"path": ["inputs", "audio"], "kind": "scalar"}, "providerSettings.sync.activeSpeakerDetection.autoDetect": {"path": ["providerSettings", "sync", "activeSpeakerDetection", "autoDetect"], "kind": "scalar", "omit_value": false}, "providerSettings.sync.occlusionDetectionEnabled": {"path": ["providerSettings", "sync", "occlusionDetectionEnabled"], "kind": "scalar", "omit_value": false}, "providerSettings.sync.syncMode": {"path": ["providerSettings", "sync", "syncMode"], "kind": "scalar"}, "providerSettings.sync.temperature": {"path": ["providerSettings", "sync", "temperature"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_picsart_image_vectorizer", "name": "Picsart Image Vectorizer", "model": "picsart:1@1", "task_type": "vectorize", "creator": "picsart", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["SVG"], {"default": "SVG", "tooltip": "File format for the vectorized output.", "rw_cat": "output"}]}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}}}, {"key": "Runware_meta_llava_1_6_mistral_7b", "name": "LLaVA-1.6-Mistral-7B", "model": "runware:150@2", "task_type": "caption", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"prompt": ["STRING", {"tooltip": "Instructions or questions to guide the image analysis.", "multiline": true, "default": "", "rw_cat": "core"}]}}, "param_plan": {"prompt": {"path": ["prompt"], "kind": "scalar", "omit_empty": true}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_meta_sam_3d_objects", "name": "SAM 3D Objects", "model": "meta:sam@3d", "task_type": "3dInference", "creator": "meta", "input_types": {"required": {"image": ["IMAGE"], "mask": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["GLB"], {"default": "GLB", "tooltip": "File format for the generated 3D model.", "rw_cat": "output"}]}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "mask": {"path": ["inputs", "mask"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}}}, {"key": "Runware_vidu_q1", "name": "Vidu Q1", "model": "vidu:1@1", "task_type": "videoInference", "creator": "vidu", "input_types": {"required": {}, "optional": {"frameImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": [[4, 5], {"default": 5, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.vidu.bgm": ["BOOLEAN", {"default": false, "tooltip": "Enable background music generation.", "rw_cat": "settings"}], "providerSettings.vidu.movementAmplitude": [["auto", "small", "medium", "large"], {"default": "auto", "tooltip": "Movement intensity in the generated video.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "providerSettings.vidu.style": [["general", "anime"], {"default": "general", "tooltip": "Visual style.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.vidu.bgm": {"path": ["providerSettings", "vidu", "bgm"], "kind": "scalar", "omit_value": false}, "providerSettings.vidu.movementAmplitude": {"path": ["providerSettings", "vidu", "movementAmplitude"], "kind": "scalar"}, "providerSettings.vidu.style": {"path": ["providerSettings", "vidu", "style"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_vidu_q2_turbo", "name": "Vidu Q2 Turbo", "model": "vidu:3@2", "task_type": "videoInference", "creator": "vidu", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "frameImages": ["IMAGE"], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": ["FLOAT", {"default": 5, "min": 1, "max": 8, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.vidu.bgm": ["BOOLEAN", {"default": false, "tooltip": "Enable background music generation.", "rw_cat": "settings"}], "providerSettings.vidu.movementAmplitude": [["auto", "small", "medium", "large"], {"default": "auto", "tooltip": "Movement intensity in the generated video.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.vidu.bgm": {"path": ["providerSettings", "vidu", "bgm"], "kind": "scalar", "omit_value": false}, "providerSettings.vidu.movementAmplitude": {"path": ["providerSettings", "vidu", "movementAmplitude"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_vidu_1_5", "name": "Vidu 1.5", "model": "vidu:1@5", "task_type": "videoInference", "creator": "vidu", "input_types": {"required": {}, "optional": {"referenceImages": ["IMAGE"], "frameImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": [[4, 8], {"default": 4, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.vidu.bgm": ["BOOLEAN", {"default": false, "tooltip": "Enable background music generation.", "rw_cat": "settings"}], "providerSettings.vidu.movementAmplitude": [["auto", "small", "medium", "large"], {"default": "auto", "tooltip": "Movement intensity in the generated video.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "providerSettings.vidu.style": [["general", "anime"], {"default": "general", "tooltip": "Visual style.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.vidu.bgm": {"path": ["providerSettings", "vidu", "bgm"], "kind": "scalar", "omit_value": false}, "providerSettings.vidu.movementAmplitude": {"path": ["providerSettings", "vidu", "movementAmplitude"], "kind": "scalar"}, "providerSettings.vidu.style": {"path": ["providerSettings", "vidu", "style"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_vidu_q1_image", "name": "Vidu Q1", "model": "vidu:q1@image", "task_type": "imageInference", "creator": "vidu", "input_types": {"required": {"referenceImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_vidu_2_0", "name": "Vidu 2.0", "model": "vidu:2@0", "task_type": "videoInference", "creator": "vidu", "input_types": {"required": {}, "optional": {"referenceImages": ["IMAGE"], "frameImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": [[4, 8], {"default": 4, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.vidu.bgm": ["BOOLEAN", {"default": false, "tooltip": "Enable background music generation.", "rw_cat": "settings"}], "providerSettings.vidu.movementAmplitude": [["auto", "small", "medium", "large"], {"default": "auto", "tooltip": "Movement intensity in the generated video.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.vidu.bgm": {"path": ["providerSettings", "vidu", "bgm"], "kind": "scalar", "omit_value": false}, "providerSettings.vidu.movementAmplitude": {"path": ["providerSettings", "vidu", "movementAmplitude"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_vidu_q3_turbo", "name": "Vidu Q3 Turbo", "model": "vidu:4@2", "task_type": "videoInference", "creator": "vidu", "input_types": {"required": {"width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": ["INT", {"default": 5, "min": 1, "max": 16, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.vidu.audio": ["BOOLEAN", {"default": false, "tooltip": "Enable audio generation.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.vidu.audio": {"path": ["providerSettings", "vidu", "audio"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_vidu_q1_classic", "name": "Vidu Q1 Classic", "model": "vidu:1@0", "task_type": "videoInference", "creator": "vidu", "input_types": {"required": {}, "optional": {"frameImages": ["IMAGE"], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.vidu.movementAmplitude": [["auto", "small", "medium", "large"], {"default": "auto", "tooltip": "Movement intensity in the generated video.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.vidu.movementAmplitude": {"path": ["providerSettings", "vidu", "movementAmplitude"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_vidu_q3", "name": "Vidu Q3", "model": "vidu:4@1", "task_type": "videoInference", "creator": "vidu", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "size": [["None (model default)", "360p (from input)", "540p (from input)", "720p (from input)", "1080p (from input)", "360p (16:9)", "360p (4:3)", "360p (1:1)", "360p (3:4)", "360p (9:16)", "540p (16:9)", "540p (4:3)", "540p (1:1)", "540p (3:4)", "540p (9:16)", "720p (16:9)", "720p (4:3)", "720p (1:1)", "720p (3:4)", "720p (9:16)", "1080p (16:9)", "1080p (4:3)", "1080p (1:1)", "1080p (3:4)", "1080p (9:16)"], {"default": "720p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 1, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 1, "control_after_generate": true, "rw_cat": "core"}], "duration": ["INT", {"default": 5, "min": 1, "max": 16, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.vidu.audio": ["BOOLEAN", {"default": false, "tooltip": "Enable audio generation.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.vidu.audio": {"path": ["providerSettings", "vidu", "audio"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "360p (from input)": {"resolution": "360p"}, "540p (from input)": {"resolution": "540p"}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "360p (16:9)": {"width": 640, "height": 352}, "360p (4:3)": {"width": 544, "height": 400}, "360p (1:1)": {"width": 480, "height": 480}, "360p (3:4)": {"width": 400, "height": 544}, "360p (9:16)": {"width": 352, "height": 640}, "540p (16:9)": {"width": 960, "height": 528}, "540p (4:3)": {"width": 816, "height": 608}, "540p (1:1)": {"width": 720, "height": 720}, "540p (3:4)": {"width": 608, "height": 816}, "540p (9:16)": {"width": 528, "height": 960}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (4:3)": {"width": 1104, "height": 816}, "720p (1:1)": {"width": 960, "height": 960}, "720p (3:4)": {"width": 816, "height": 1104}, "720p (9:16)": {"width": 720, "height": 1280}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (4:3)": {"width": 1674, "height": 1238}, "1080p (1:1)": {"width": 1440, "height": 1440}, "1080p (3:4)": {"width": 1238, "height": 1674}, "1080p (9:16)": {"width": 1080, "height": 1920}}}}}, {"key": "Runware_vidu_q2_pro", "name": "Vidu Q2 Pro", "model": "vidu:3@1", "task_type": "videoInference", "creator": "vidu", "input_types": {"required": {}, "optional": {"referenceImages": ["IMAGE"], "frameImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": ["FLOAT", {"default": 5, "min": 1, "max": 8, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.vidu.bgm": ["BOOLEAN", {"default": false, "tooltip": "Enable background music generation.", "rw_cat": "settings"}], "providerSettings.vidu.movementAmplitude": [["auto", "small", "medium", "large"], {"default": "auto", "tooltip": "Movement intensity in the generated video.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.vidu.bgm": {"path": ["providerSettings", "vidu", "bgm"], "kind": "scalar", "omit_value": false}, "providerSettings.vidu.movementAmplitude": {"path": ["providerSettings", "vidu", "movementAmplitude"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_stabilityai_stable_diffusion_3", "name": "Stable Diffusion 3", "model": "runware:5@1", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"default": 1024, "min": 128, "max": 2048, "step": 16, "tooltip": "Width of the generated media in pixels.", "rw_cat": "core"}], "height": ["INT", {"default": 1024, "min": 128, "max": 2048, "step": 16, "tooltip": "Height of the generated media in pixels.", "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "controlNet": ["RUNWARE_CONTROLNET", {"rw_socket_models": ["runware:32@1", "runware:33@1"], "rw_socket_fields": ["controlMode", "endStep", "endStepPercentage", "guideImage", "model", "startStep", "startStepPercentage", "weight"], "rw_socket_enums": {"controlMode": ["balanced", "controlnet", "prompt"]}, "rw_cat": "inputs"}], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 28, "min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 30, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "clipSkip": ["BOOLEAN", {"default": false, "rw_gates": "clipSkip_value", "tooltip": "Enable to set clipSkip. Off uses the model's default.", "rw_cat": "core"}], "clipSkip_value": ["INT", {"min": 0, "max": 4, "tooltip": "Number of layers to skip in the CLIP model.", "default": 0, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "clipSkip": {"path": ["clipSkip"], "kind": "gate", "value_key": "clipSkip_value"}, "clipSkip_value": {"path": ["clipSkip"], "kind": "skip"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "controlNet": {"path": ["controlNet"], "kind": "feature"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_stabilityai_stable_diffusion_xl_v1_0_vae_fix", "name": "Stable Diffusion XL v1.0 VAE Fix", "model": "civitai:101055@128078", "task_type": "imageInference", "creator": "civitai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"default": 1024, "min": 128, "max": 2048, "step": 8, "tooltip": "Width of the generated media in pixels.", "rw_cat": "core"}], "height": ["INT", {"default": 1024, "min": 128, "max": 2048, "step": 8, "tooltip": "Height of the generated media in pixels.", "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "controlNet": ["RUNWARE_CONTROLNET", {"rw_socket_models": ["runware:20@1", "runware:3@1"], "rw_socket_fields": ["controlMode", "endStep", "endStepPercentage", "guideImage", "model", "startStep", "startStepPercentage", "weight"], "rw_socket_enums": {"controlMode": ["balanced", "controlnet", "prompt"]}, "rw_cat": "inputs"}], "ipAdapters": ["RUNWARE_IPADAPTERS", {"rw_socket_models": ["runware:55@1", "runware:55@2", "runware:55@3", "runware:55@4"], "rw_socket_fields": ["combineMethod", "embedScaling", "guideImages", "model", "weight", "weightComposition", "weightType"], "rw_socket_enums": {"weightType": ["normal", "ease_in", "ease_out", "ease_in_out", "weak_input", "weak_output", "weak_middle", "strong_middle", "style_transfer", "composition", "strong_style_transfer", "style_and_composition", "strong_style_and_composition"], "embedScaling": ["only_v", "kv", "kv_penalty_c", "k_mean_v_penalty_c"], "combineMethod": ["concat", "add", "subtract", "average", "norm_average"]}, "rw_cat": "inputs"}], "embeddings": ["RUNWARE_EMBEDDINGS", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "refiner": ["RUNWARE_REFINER", {"rw_socket_models": ["runware:101055@128080"], "rw_cat": "inputs"}], "photoMaker": ["RUNWARE_PHOTOMAKER"], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "deepCache", "deepCacheBranchId", "deepCacheInterval", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 30, "min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 30, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "clipSkip": ["BOOLEAN", {"default": false, "rw_gates": "clipSkip_value", "tooltip": "Enable to set clipSkip. Off uses the model's default.", "rw_cat": "core"}], "clipSkip_value": ["INT", {"min": 0, "max": 4, "tooltip": "Number of layers to skip in the CLIP model.", "default": 0, "rw_cat": "core"}], "vae": ["STRING", {"tooltip": "VAE model identifier. Overrides the default VAE included with the base model.", "default": "", "rw_cat": "core"}], "promptWeighting": [["(default)", "compel", "sdEmbeds"], {"tooltip": "Syntax used for prompt weighting.", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: hiresFix"}]}}, "param_plan": {"width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "seed": {"path": ["seed"], "kind": "scalar"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "clipSkip": {"path": ["clipSkip"], "kind": "gate", "value_key": "clipSkip_value"}, "clipSkip_value": {"path": ["clipSkip"], "kind": "skip"}, "vae": {"path": ["vae"], "kind": "scalar", "omit_empty": true}, "promptWeighting": {"path": ["promptWeighting"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "controlNet": {"path": ["controlNet"], "kind": "feature"}, "ipAdapters": {"path": ["ipAdapters"], "kind": "feature"}, "refiner": {"path": ["refiner"], "kind": "feature"}, "embeddings": {"path": ["embeddings"], "kind": "feature"}, "photoMaker": {"path": ["photoMaker"], "kind": "feature"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_alibaba_qwen_image_layered", "name": "Qwen-Image-Layered", "model": "alibaba:qwen-image@layered", "task_type": "imageInference", "creator": "alibaba", "input_types": {"required": {"referenceImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "fbCache", "fbCacheThreshold"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 5, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 5, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 10, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "settings.trueCFGScale": ["BOOLEAN", {"default": false, "rw_gates": "settings.trueCFGScale_value", "tooltip": "Enable to set settings.trueCFGScale. Off uses the model's default.", "rw_cat": "settings"}], "settings.trueCFGScale_value": ["FLOAT", {"tooltip": "True Classifier-Free Guidance scale. Higher values increase prompt adherence at the cost of quality.", "default": 0.0, "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["TIFF"], {"default": "TIFF", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "settings.trueCFGScale": {"path": ["settings", "trueCFGScale"], "kind": "gate", "value_key": "settings.trueCFGScale_value"}, "settings.trueCFGScale_value": {"path": ["settings", "trueCFGScale"], "kind": "skip"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_alibaba_qwen2_5_vl_3b_instruct", "name": "Qwen2.5-VL-3B-Instruct", "model": "runware:152@1", "task_type": "caption", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"prompt": ["STRING", {"tooltip": "Instructions or questions to guide the image analysis.", "multiline": true, "default": "", "rw_cat": "core"}]}}, "param_plan": {"prompt": {"path": ["prompt"], "kind": "scalar", "omit_empty": true}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_alibaba_wan2_6", "name": "Wan2.6", "model": "alibaba:wan@2.6", "task_type": "videoInference", "creator": "alibaba", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "referenceVideos": ["RUNWARE_REFERENCEVIDEOS"], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "default": "", "rw_cat": "core"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "size": [["None (model default)", "720p (from input)", "1080p (from input)", "720p (16:9)", "720p (9:16)", "720p (1:1)", "720p (4:3)", "720p (3:4)", "1080p (16:9)", "1080p (9:16)", "1080p (1:1)", "1080p (4:3)", "1080p (3:4)"], {"default": "720p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": [[5, 10, 15], {"default": 5, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.alibaba.audio": ["BOOLEAN", {"default": true, "tooltip": "Generate native audio aligned with visual content.", "rw_cat": "settings"}], "providerSettings.alibaba.promptExtend": ["BOOLEAN", {"default": true, "tooltip": "Enable LLM-based prompt rewriting to expand and clarify inputs. Affects reproducibility.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "providerSettings.alibaba.shotType": [["single", "multi"], {"default": "single", "tooltip": "Shot composition style.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "referenceVideos": {"path": ["inputs", "referenceVideos"], "kind": "feature"}, "audio": {"path": ["inputs", "audio"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.alibaba.audio": {"path": ["providerSettings", "alibaba", "audio"], "kind": "scalar"}, "providerSettings.alibaba.promptExtend": {"path": ["providerSettings", "alibaba", "promptExtend"], "kind": "scalar"}, "providerSettings.alibaba.shotType": {"path": ["providerSettings", "alibaba", "shotType"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (9:16)": {"width": 720, "height": 1280}, "720p (1:1)": {"width": 960, "height": 960}, "720p (4:3)": {"width": 1088, "height": 832}, "720p (3:4)": {"width": 832, "height": 1088}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (9:16)": {"width": 1080, "height": 1920}, "1080p (1:1)": {"width": 1440, "height": 1440}, "1080p (4:3)": {"width": 1632, "height": 1248}, "1080p (3:4)": {"width": 1248, "height": 1632}}}}}, {"key": "Runware_alibaba_qwen3_tts_1_7b_customvoice", "name": "Qwen3-TTS 1.7B CustomVoice", "model": "alibaba:qwen@3-tts-1.7b-customvoice", "task_type": "audioInference", "creator": "alibaba", "input_types": {"required": {"speech": ["RUNWARE_SPEECH", {"rw_socket_fields": ["language", "speed", "text", "voice"], "rw_socket_enums": {"voice": ["aiden", "dylan", "eric", "ono_anna", "ryan", "serena", "sohee", "uncle_fu", "vivian"], "language": ["Auto", "Chinese", "English", "Japanese", "Korean", "German", "French", "Russian", "Portuguese", "Spanish", "Italian"]}, "rw_cat": "inputs"}]}, "optional": {"audioSettings": ["RUNWARE_AUDIOSETTINGS"], "positivePrompt": ["STRING", {"tooltip": "Optional style or emotion hint for the voice. Example: 'Speak with great enthusiasm'.", "multiline": true, "default": "", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.maxNewTokens": ["INT", {"default": 2048, "tooltip": "Audio output token cap. Higher values allow longer audio but risk hangs.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP3", "WAV", "FLAC", "OGG"], {"default": "MP3", "tooltip": "File format for the generated audio.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "speech": {"path": ["speech"], "kind": "feature"}, "settings.maxNewTokens": {"path": ["settings", "maxNewTokens"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "audioSettings": {"path": ["audioSettings"], "kind": "feature"}}}, {"key": "Runware_alibaba_wan2_7_image", "name": "Wan2.7 Image", "model": "alibaba:wan@2.7-image", "task_type": "imageInference", "creator": "alibaba", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 768, "max": 2048, "step": 16, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 768, "max": 2048, "step": 16, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "settings.sequential": ["BOOLEAN", {"default": false, "tooltip": "Enables image set output mode for generating multiple related images.", "rw_cat": "settings"}], "settings.thinking": ["BOOLEAN", {"default": true, "tooltip": "Enables thinking mode for improved quality at the cost of increased generation time.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: settings.colorPalette, settings.editRegions"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.sequential": {"path": ["settings", "sequential"], "kind": "scalar", "omit_value": false}, "settings.thinking": {"path": ["settings", "thinking"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_alibaba_qwen3_5_27b", "name": "Qwen3.5-27B", "model": "alibaba:qwen@3.5-27b", "task_type": "textInference", "creator": "alibaba", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"images": ["IMAGE"], "seed": ["INT", {"min": 0, "max": 4294967295, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.frequencyPenalty": ["FLOAT", {"default": 0, "min": 0, "max": 2, "step": 0.01, "tooltip": "Penalizes tokens based on their frequency in the output so far. A value of 0.0 disables the penalty.", "rw_cat": "settings"}], "settings.maxTokens": ["BOOLEAN", {"default": false, "rw_gates": "settings.maxTokens_value", "tooltip": "Enable to set settings.maxTokens. Off uses the model's default.", "rw_cat": "settings"}], "settings.maxTokens_value": ["INT", {"min": 1, "max": 65536, "tooltip": "Maximum number of tokens to generate in the response.", "default": 1, "rw_cat": "settings"}], "settings.minP": ["FLOAT", {"default": 0, "min": 0, "max": 1, "step": 0.01, "tooltip": "Minimum probability threshold. Tokens with probability below this value are excluded from sampling.", "rw_cat": "settings"}], "settings.presencePenalty": ["FLOAT", {"default": 0, "min": 0, "max": 2, "step": 0.01, "tooltip": "Encourages the model to introduce new topics. A value of 0.0 disables the penalty.", "rw_cat": "settings"}], "settings.repetitionPenalty": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Penalizes tokens that have already appeared in the output. A value of 1.0 disables the penalty.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 0.6, "min": 0, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "settings.thinkingLevel": [["off", "high"], {"default": "high", "tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "rw_cat": "settings"}], "settings.topK": ["INT", {"default": 20, "min": 1, "max": 100, "tooltip": "Top-K sampling parameter that limits the number of highest-probability tokens considered at each step.", "rw_cat": "settings"}], "settings.topP": ["FLOAT", {"default": 0.95, "min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "rw_cat": "settings"}], "outputFormat": [["TEXT"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.videos, settings.stopSequences"}]}}, "param_plan": {"images": {"path": ["inputs", "images"], "kind": "image_array"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.topP": {"path": ["settings", "topP"], "kind": "scalar"}, "settings.frequencyPenalty": {"path": ["settings", "frequencyPenalty"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "gate", "value_key": "settings.maxTokens_value"}, "settings.maxTokens_value": {"path": ["settings", "maxTokens"], "kind": "skip"}, "settings.minP": {"path": ["settings", "minP"], "kind": "scalar"}, "settings.presencePenalty": {"path": ["settings", "presencePenalty"], "kind": "scalar"}, "settings.repetitionPenalty": {"path": ["settings", "repetitionPenalty"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar"}, "settings.topK": {"path": ["settings", "topK"], "kind": "scalar"}, "messages": {"path": ["messages"], "kind": "feature"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_alibaba_z_image", "name": "Z-Image", "model": "runware:z-image@0", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 16, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 16, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "fbCache", "fbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_alibaba_qwen_image", "name": "Qwen-Image", "model": "runware:108@1", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 256, "max": 2048, "step": 8, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 256, "max": 2048, "step": 8, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "fbCache", "fbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 20, "min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 1, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 1.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "settings.trueCFGScale": ["BOOLEAN", {"default": false, "rw_gates": "settings.trueCFGScale_value", "tooltip": "Enable to set settings.trueCFGScale. Off uses the model's default.", "rw_cat": "settings"}], "settings.trueCFGScale_value": ["FLOAT", {"tooltip": "True Classifier-Free Guidance scale. Higher values increase prompt adherence at the cost of quality.", "default": 0.0, "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "settings.trueCFGScale": {"path": ["settings", "trueCFGScale"], "kind": "gate", "value_key": "settings.trueCFGScale_value"}, "settings.trueCFGScale_value": {"path": ["settings", "trueCFGScale"], "kind": "skip"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_alibaba_wan2_7", "name": "Wan2.7", "model": "alibaba:wan@2.7", "task_type": "videoInference", "creator": "alibaba", "input_types": {"required": {}, "optional": {"referenceImages": ["IMAGE"], "frameImages": ["IMAGE"], "referenceVideos": ["RUNWARE_REFERENCEVIDEOS"], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "default": "", "rw_cat": "core"}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "size": [["None (model default)", "720p (from input)", "1080p (from input)", "720p (16:9)", "720p (9:16)", "720p (1:1)", "720p (~4:3)", "720p (~3:4)", "1080p (16:9)", "1080p (9:16)", "1080p (1:1)", "1080p (~4:3)", "1080p (~3:4)"], {"default": "1080p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": ["INT", {"default": 5, "min": 2, "max": 15, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.audio": ["BOOLEAN", {"default": true, "tooltip": "Generate native audio aligned with visual content.", "rw_cat": "settings"}], "settings.promptExtend": ["BOOLEAN", {"default": true, "tooltip": "Enable LLM-based prompt rewriting to expand and clarify inputs. Affects reproducibility.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "settings.shotType": [["single", "multi"], {"default": "single", "tooltip": "Shot composition style.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "referenceVideos": {"path": ["inputs", "referenceVideos"], "kind": "feature"}, "audio": {"path": ["inputs", "audio"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.audio": {"path": ["settings", "audio"], "kind": "scalar"}, "settings.promptExtend": {"path": ["settings", "promptExtend"], "kind": "scalar"}, "settings.shotType": {"path": ["settings", "shotType"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (9:16)": {"width": 720, "height": 1280}, "720p (1:1)": {"width": 960, "height": 960}, "720p (~4:3)": {"width": 1088, "height": 832}, "720p (~3:4)": {"width": 832, "height": 1088}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (9:16)": {"width": 1080, "height": 1920}, "1080p (1:1)": {"width": 1440, "height": 1440}, "1080p (~4:3)": {"width": 1632, "height": 1248}, "1080p (~3:4)": {"width": 1248, "height": 1632}}}}}, {"key": "Runware_alibaba_qwen2_5_vl_7b_instruct", "name": "Qwen2.5-VL-7B-Instruct", "model": "runware:152@2", "task_type": "caption", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"prompt": ["STRING", {"tooltip": "Instructions or questions to guide the image analysis.", "multiline": true, "default": "", "rw_cat": "core"}]}}, "param_plan": {"prompt": {"path": ["prompt"], "kind": "scalar", "omit_empty": true}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_alibaba_qwen3_tts_1_7b_voicedesign", "name": "Qwen3-TTS 1.7B VoiceDesign", "model": "alibaba:qwen@3-tts-1.7b-voicedesign", "task_type": "audioInference", "creator": "alibaba", "input_types": {"required": {"speech": ["RUNWARE_SPEECH", {"rw_socket_fields": ["language", "speed", "text", "voice"], "rw_socket_enums": {"voice": ["design"], "language": ["Auto", "Chinese", "English", "Japanese", "Korean", "German", "French", "Russian", "Portuguese", "Spanish", "Italian"]}, "rw_cat": "inputs"}], "positivePrompt": ["STRING", {"tooltip": "Natural language voice description. Example: 'A warm, cheerful male voice with moderate pace'.", "multiline": true, "rw_cat": "core"}]}, "optional": {"audioSettings": ["RUNWARE_AUDIOSETTINGS"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.maxNewTokens": ["INT", {"default": 2048, "tooltip": "Audio output token cap. Higher values allow longer audio but risk hangs.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP3", "WAV", "FLAC", "OGG"], {"default": "MP3", "tooltip": "File format for the generated audio.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "speech": {"path": ["speech"], "kind": "feature"}, "settings.maxNewTokens": {"path": ["settings", "maxNewTokens"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "audioSettings": {"path": ["audioSettings"], "kind": "feature"}}}, {"key": "Runware_alibaba_wan2_5_preview", "name": "Wan2.5-Preview", "model": "runware:201@1", "task_type": "videoInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "default": "", "rw_cat": "core"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "size": [["None (model default)", "480p (from input)", "720p (from input)", "1080p (from input)", "480p (16:9)", "480p (9:16)", "480p (1:1)", "720p (16:9)", "720p (9:16)", "720p (1:1)", "720p (17:13)", "720p (13:17)", "1080p (16:9)", "1080p (9:16)", "1080p (1:1)", "1080p (17:13)", "1080p (13:17)"], {"default": "480p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": [[5, 10], {"default": 5, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: providerSettings"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "audio": {"path": ["inputs", "audio"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "480p (from input)": {"resolution": "480p"}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "480p (16:9)": {"width": 832, "height": 480}, "480p (9:16)": {"width": 480, "height": 832}, "480p (1:1)": {"width": 624, "height": 624}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (9:16)": {"width": 720, "height": 1280}, "720p (1:1)": {"width": 960, "height": 960}, "720p (17:13)": {"width": 1088, "height": 832}, "720p (13:17)": {"width": 832, "height": 1088}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (9:16)": {"width": 1080, "height": 1920}, "1080p (1:1)": {"width": 1440, "height": 1440}, "1080p (17:13)": {"width": 1632, "height": 1248}, "1080p (13:17)": {"width": 1248, "height": 1632}}}}}, {"key": "Runware_alibaba_wan2_6_image", "name": "Wan2.6 Image", "model": "alibaba:wan@2.6-image", "task_type": "imageInference", "creator": "alibaba", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 1, "max": 4096, "step": 1, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 1, "max": 4096, "step": 1, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.alibaba.promptExtend": ["BOOLEAN", {"default": true, "tooltip": "Enable LLM-based prompt rewriting to expand and clarify inputs. Affects reproducibility.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "providerSettings.alibaba.promptExtend": {"path": ["providerSettings", "alibaba", "promptExtend"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_alibaba_happyhorse_1_1", "name": "HappyHorse 1.1", "model": "alibaba:happyhorse@1.1", "task_type": "videoInference", "creator": "alibaba", "input_types": {"required": {}, "optional": {"referenceImages": ["IMAGE"], "frameImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "size": [["None (model default)", "720p (from input)", "1080p (from input)", "720p (16:9)", "720p (9:16)", "720p (1:1)", "720p (~4:3)", "720p (~3:4)", "1080p (16:9)", "1080p (9:16)", "1080p (1:1)", "1080p (~4:3)", "1080p (~3:4)"], {"default": "720p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": ["INT", {"default": 5, "min": 3, "max": 15, "step": 1, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (9:16)": {"width": 720, "height": 1280}, "720p (1:1)": {"width": 960, "height": 960}, "720p (~4:3)": {"width": 1088, "height": 832}, "720p (~3:4)": {"width": 832, "height": 1088}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (9:16)": {"width": 1080, "height": 1920}, "1080p (1:1)": {"width": 1440, "height": 1440}, "1080p (~4:3)": {"width": 1632, "height": 1248}, "1080p (~3:4)": {"width": 1248, "height": 1632}}}}}, {"key": "Runware_alibaba_z_image_turbo", "name": "Z-Image-Turbo", "model": "runware:z-image@turbo", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 16, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 16, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "controlNet": ["RUNWARE_CONTROLNET", {"rw_socket_models": ["runware:z-image@turbo-controlnet"], "rw_socket_fields": ["controlMode", "endStep", "endStepPercentage", "guideImage", "model", "startStep", "startStepPercentage", "weight"], "rw_socket_enums": {"controlMode": ["balanced", "controlnet", "prompt"]}, "rw_cat": "inputs"}], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "fbCache", "fbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "controlNet": {"path": ["controlNet"], "kind": "feature"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_alibaba_qwen_image_2_0", "name": "Qwen-Image-2.0", "model": "alibaba:qwen-image@2.0", "task_type": "imageInference", "creator": "alibaba", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"min": 1, "max": 4096, "step": 1, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 1, "max": 4096, "step": 1, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.alibaba.promptExtend": ["BOOLEAN", {"default": true, "tooltip": "Enable LLM-based prompt rewriting to expand and clarify inputs. Affects reproducibility.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "providerSettings.alibaba.promptExtend": {"path": ["providerSettings", "alibaba", "promptExtend"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_alibaba_wan2_7_image_pro", "name": "Wan2.7 Image Pro", "model": "alibaba:wan@2.7-image-pro", "task_type": "imageInference", "creator": "alibaba", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 768, "max": 4096, "step": 16, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 768, "max": 4096, "step": 16, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "settings.sequential": ["BOOLEAN", {"default": false, "tooltip": "Enables image set output mode for generating multiple related images.", "rw_cat": "settings"}], "settings.thinking": ["BOOLEAN", {"default": true, "tooltip": "Enables thinking mode for improved quality at the cost of increased generation time.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: settings.colorPalette, settings.editRegions"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.sequential": {"path": ["settings", "sequential"], "kind": "scalar", "omit_value": false}, "settings.thinking": {"path": ["settings", "thinking"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_alibaba_qwen_image_edit_plus", "name": "Qwen-Image-Edit-Plus", "model": "runware:108@22", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"referenceImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 512, "max": 2048, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 512, "max": 2048, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "fbCache", "fbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 1, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 1.0, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "settings.trueCFGScale": ["BOOLEAN", {"default": false, "rw_gates": "settings.trueCFGScale_value", "tooltip": "Enable to set settings.trueCFGScale. Off uses the model's default.", "rw_cat": "settings"}], "settings.trueCFGScale_value": ["FLOAT", {"tooltip": "True Classifier-Free Guidance scale. Higher values increase prompt adherence at the cost of quality.", "default": 0.0, "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "settings.trueCFGScale": {"path": ["settings", "trueCFGScale"], "kind": "gate", "value_key": "settings.trueCFGScale_value"}, "settings.trueCFGScale_value": {"path": ["settings", "trueCFGScale"], "kind": "skip"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_alibaba_qwen3_tts_1_7b_base", "name": "Qwen3-TTS 1.7B Base", "model": "alibaba:qwen@3-tts-1.7b-base", "task_type": "audioInference", "creator": "alibaba", "input_types": {"required": {"speech": ["RUNWARE_SPEECH", {"rw_socket_fields": ["language", "speed", "text", "voice"], "rw_socket_enums": {"voice": ["clone"], "language": ["Auto", "Chinese", "English", "Japanese", "Korean", "German", "French", "Russian", "Portuguese", "Spanish", "Italian"]}, "rw_cat": "inputs"}], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "rw_cat": "core"}]}, "optional": {"audioSettings": ["RUNWARE_AUDIOSETTINGS"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.maxNewTokens": ["INT", {"default": 2048, "tooltip": "Audio output token cap. Higher values allow longer audio but risk hangs.", "rw_cat": "settings"}], "settings.transcript": ["STRING", {"tooltip": "Transcript of the reference audio. Required for ICL mode, optional for x-vector-only mode.", "default": "", "rw_cat": "settings"}], "settings.xVectorOnly": ["BOOLEAN", {"default": false, "tooltip": "If true, uses speaker embedding only (no transcript needed, lower similarity). If false, uses ICL mode (requires transcript, higher quality).", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP3", "WAV", "FLAC", "OGG"], {"default": "MP3", "tooltip": "File format for the generated audio.", "rw_cat": "output"}]}}, "param_plan": {"audio": {"path": ["inputs", "audio"], "kind": "scalar"}, "speech": {"path": ["speech"], "kind": "feature"}, "settings.maxNewTokens": {"path": ["settings", "maxNewTokens"], "kind": "scalar"}, "settings.transcript": {"path": ["settings", "transcript"], "kind": "scalar", "omit_empty": true}, "settings.xVectorOnly": {"path": ["settings", "xVectorOnly"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "audioSettings": {"path": ["audioSettings"], "kind": "feature"}}}, {"key": "Runware_alibaba_wan2_6_flash", "name": "Wan2.6 Flash", "model": "alibaba:wan@2.6-flash", "task_type": "videoInference", "creator": "alibaba", "input_types": {"required": {"frameImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "default": "", "rw_cat": "core"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "size": [["None (model default)", "720p (from input)", "1080p (from input)", "720p (16:9)", "720p (9:16)", "720p (1:1)", "720p (4:3)", "720p (3:4)", "1080p (16:9)", "1080p (9:16)", "1080p (1:1)", "1080p (4:3)", "1080p (3:4)"], {"default": "720p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": ["INT", {"default": 5, "min": 2, "max": 15, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.alibaba.audio": ["BOOLEAN", {"default": true, "tooltip": "Generate native audio aligned with visual content.", "rw_cat": "settings"}], "providerSettings.alibaba.promptExtend": ["BOOLEAN", {"default": true, "tooltip": "Enable LLM-based prompt rewriting to expand and clarify inputs. Affects reproducibility.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "providerSettings.alibaba.shotType": [["single", "multi"], {"default": "single", "tooltip": "Shot composition style.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "audio": {"path": ["inputs", "audio"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.alibaba.audio": {"path": ["providerSettings", "alibaba", "audio"], "kind": "scalar"}, "providerSettings.alibaba.promptExtend": {"path": ["providerSettings", "alibaba", "promptExtend"], "kind": "scalar"}, "providerSettings.alibaba.shotType": {"path": ["providerSettings", "alibaba", "shotType"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (9:16)": {"width": 720, "height": 1280}, "720p (1:1)": {"width": 960, "height": 960}, "720p (4:3)": {"width": 1088, "height": 832}, "720p (3:4)": {"width": 832, "height": 1088}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (9:16)": {"width": 1080, "height": 1920}, "1080p (1:1)": {"width": 1440, "height": 1440}, "1080p (4:3)": {"width": 1632, "height": 1248}, "1080p (3:4)": {"width": 1248, "height": 1632}}}}}, {"key": "Runware_alibaba_qwen_image_2512", "name": "Qwen-Image-2512", "model": "alibaba:qwen-image@2512", "task_type": "imageInference", "creator": "alibaba", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 256, "max": 2048, "step": 16, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 256, "max": 2048, "step": 16, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "fbCache", "fbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 3, "min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "settings.trueCFGScale": ["BOOLEAN", {"default": false, "rw_gates": "settings.trueCFGScale_value", "tooltip": "Enable to set settings.trueCFGScale. Off uses the model's default.", "rw_cat": "settings"}], "settings.trueCFGScale_value": ["FLOAT", {"tooltip": "True Classifier-Free Guidance scale. Higher values increase prompt adherence at the cost of quality.", "default": 0.0, "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "settings.trueCFGScale": {"path": ["settings", "trueCFGScale"], "kind": "gate", "value_key": "settings.trueCFGScale_value"}, "settings.trueCFGScale_value": {"path": ["settings", "trueCFGScale"], "kind": "skip"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_alibaba_wan2_5_preview_image", "name": "Wan2.5-Preview Image", "model": "runware:201@10", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "width": ["INT", {"min": 1, "max": 4096, "step": 1, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 1, "max": 4096, "step": 1, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: providerSettings"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_alibaba_qwen_image_2_0_pro", "name": "Qwen-Image-2.0-Pro", "model": "alibaba:qwen-image@2.0-pro", "task_type": "imageInference", "creator": "alibaba", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"min": 1, "max": 4096, "step": 1, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 1, "max": 4096, "step": 1, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.alibaba.promptExtend": ["BOOLEAN", {"default": true, "tooltip": "Enable LLM-based prompt rewriting to expand and clarify inputs. Affects reproducibility.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "providerSettings.alibaba.promptExtend": {"path": ["providerSettings", "alibaba", "promptExtend"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_alibaba_qwen3_5_397b", "name": "Qwen3.5-397B", "model": "alibaba:qwen@3.5-397b", "task_type": "textInference", "creator": "alibaba", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"images": ["IMAGE"], "seed": ["INT", {"min": 0, "max": 4294967295, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.frequencyPenalty": ["FLOAT", {"default": 0, "min": 0, "max": 2, "step": 0.01, "tooltip": "Penalizes tokens based on their frequency in the output so far. A value of 0.0 disables the penalty.", "rw_cat": "settings"}], "settings.maxTokens": ["BOOLEAN", {"default": false, "rw_gates": "settings.maxTokens_value", "tooltip": "Enable to set settings.maxTokens. Off uses the model's default.", "rw_cat": "settings"}], "settings.maxTokens_value": ["INT", {"min": 1, "max": 65536, "tooltip": "Maximum number of tokens to generate in the response.", "default": 1, "rw_cat": "settings"}], "settings.minP": ["FLOAT", {"default": 0, "min": 0, "max": 1, "step": 0.01, "tooltip": "Minimum probability threshold. Tokens with probability below this value are excluded from sampling.", "rw_cat": "settings"}], "settings.presencePenalty": ["FLOAT", {"default": 0, "min": 0, "max": 2, "step": 0.01, "tooltip": "Encourages the model to introduce new topics. A value of 0.0 disables the penalty.", "rw_cat": "settings"}], "settings.repetitionPenalty": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Penalizes tokens that have already appeared in the output. A value of 1.0 disables the penalty.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 0.6, "min": 0, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "settings.thinkingLevel": [["off", "high"], {"default": "high", "tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "rw_cat": "settings"}], "settings.topK": ["INT", {"default": 20, "min": 1, "max": 100, "tooltip": "Top-K sampling parameter that limits the number of highest-probability tokens considered at each step.", "rw_cat": "settings"}], "settings.topP": ["FLOAT", {"default": 0.95, "min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "rw_cat": "settings"}], "outputFormat": [["TEXT"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.videos, settings.stopSequences"}]}}, "param_plan": {"images": {"path": ["inputs", "images"], "kind": "image_array"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.topP": {"path": ["settings", "topP"], "kind": "scalar"}, "settings.frequencyPenalty": {"path": ["settings", "frequencyPenalty"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "gate", "value_key": "settings.maxTokens_value"}, "settings.maxTokens_value": {"path": ["settings", "maxTokens"], "kind": "skip"}, "settings.minP": {"path": ["settings", "minP"], "kind": "scalar"}, "settings.presencePenalty": {"path": ["settings", "presencePenalty"], "kind": "scalar"}, "settings.repetitionPenalty": {"path": ["settings", "repetitionPenalty"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar"}, "settings.topK": {"path": ["settings", "topK"], "kind": "scalar"}, "messages": {"path": ["messages"], "kind": "feature"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_alibaba_qwen_image_edit", "name": "Qwen-Image-Edit", "model": "runware:108@20", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"referenceImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "fbCache", "fbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 16, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 16, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 8, "min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 1, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 1.0, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "settings.trueCFGScale": ["BOOLEAN", {"default": false, "rw_gates": "settings.trueCFGScale_value", "tooltip": "Enable to set settings.trueCFGScale. Off uses the model's default.", "rw_cat": "settings"}], "settings.trueCFGScale_value": ["FLOAT", {"tooltip": "True Classifier-Free Guidance scale. Higher values increase prompt adherence at the cost of quality.", "default": 0.0, "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "settings.trueCFGScale": {"path": ["settings", "trueCFGScale"], "kind": "gate", "value_key": "settings.trueCFGScale_value"}, "settings.trueCFGScale_value": {"path": ["settings", "trueCFGScale"], "kind": "skip"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_alibaba_happyhorse_1_0", "name": "HappyHorse-1.0", "model": "alibaba:happyhorse@1.0", "task_type": "videoInference", "creator": "alibaba", "input_types": {"required": {}, "optional": {"referenceImages": ["IMAGE"], "frameImages": ["IMAGE"], "video": ["STRING", {"tooltip": "Video input (UUID or URL). Source video for prompt-based editing. Dimensions are inherited from the input video.", "default": "", "rw_cat": "core"}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "size": [["None (model default)", "720p (from input)", "1080p (from input)", "720p (16:9)", "720p (9:16)", "720p (1:1)", "720p (~4:3)", "720p (~3:4)", "1080p (16:9)", "1080p (9:16)", "1080p (1:1)", "1080p (~4:3)", "1080p (~3:4)"], {"default": "1080p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": ["INT", {"default": 5, "min": 3, "max": 15, "step": 1, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.audio": [["auto", "origin"], {"default": "auto", "tooltip": "Controls audio handling for video editing.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "video": {"path": ["inputs", "video"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.audio": {"path": ["settings", "audio"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (9:16)": {"width": 720, "height": 1280}, "720p (1:1)": {"width": 960, "height": 960}, "720p (~4:3)": {"width": 1088, "height": 832}, "720p (~3:4)": {"width": 832, "height": 1088}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (9:16)": {"width": 1080, "height": 1920}, "1080p (1:1)": {"width": 1440, "height": 1440}, "1080p (~4:3)": {"width": 1632, "height": 1248}, "1080p (~3:4)": {"width": 1248, "height": 1632}}}}}, {"key": "Runware_fish_audio_s2_1_pro", "name": "Fish Audio S2.1 Pro", "model": "fishaudio:s2.1@pro", "task_type": "audioInference", "creator": "fishaudio", "input_types": {"required": {"speech": ["RUNWARE_SPEECH", {"rw_socket_fields": ["speed", "text", "voice", "voices", "volume"], "rw_socket_enums": {"voice": ["98655a12fa944e26b274c535e5e03842", "b347db033a6549378b48d00acb0d06cd", "bf322df2096a46f18c579d0baa36f41d", "933563129e564b19a115bedd57b7406a", "536d3a5e000945adb7038665781a4aca", "e3cd384158934cc9a01029cd7d278634", "79d0bd3e4e5444b18f7b6d89b5927bf1", "9a9cf47702da476aa4629e2506d4a857"]}, "rw_cat": "inputs"}]}, "optional": {"audioSettings": ["RUNWARE_AUDIOSETTINGS"], "referenceVoices": ["RUNWARE_REFERENCEVOICES", {"rw_socket_fields": ["audio", "text"], "rw_cat": "inputs"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.chunkLength": ["INT", {"default": 300, "min": 100, "max": 300, "tooltip": "Text segment size for processing.", "rw_cat": "settings"}], "settings.conditionOnPreviousChunks": ["BOOLEAN", {"default": true, "tooltip": "Previous audio context for voice consistency across chunks.", "rw_cat": "settings"}], "settings.earlyStopThreshold": ["FLOAT", {"default": 1, "min": 0, "max": 1, "tooltip": "Early stopping threshold for batch processing.", "rw_cat": "settings"}], "settings.latency": [["low", "normal", "balanced"], {"default": "normal", "tooltip": "Latency / quality trade-off.", "rw_cat": "settings"}], "settings.maxTokens": ["INT", {"default": 1024, "min": 1, "max": 4294967295, "tooltip": "Maximum audio tokens to generate per text chunk.", "rw_cat": "settings"}], "settings.minChunkLength": ["INT", {"default": 50, "min": 0, "max": 100, "tooltip": "Minimum characters before splitting into a new chunk.", "rw_cat": "settings"}], "settings.normalize": ["BOOLEAN", {"default": true, "tooltip": "Text normalization for English and Chinese. Improves stability for numbers.", "rw_cat": "settings"}], "settings.normalizeLoudness": ["BOOLEAN", {"default": true, "tooltip": "Normalize output loudness for consistent perceived volume.", "rw_cat": "settings"}], "settings.repetitionPenalty": ["FLOAT", {"default": 1.2, "min": 0, "max": 2, "step": 0.01, "tooltip": "Penalty for repeating audio patterns.", "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 0.7, "min": 0, "max": 1, "step": 0.01, "tooltip": "Expressiveness of the generated speech.", "rw_cat": "settings"}], "settings.topP": ["FLOAT", {"default": 0.7, "min": 0.0001, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP3", "WAV", "FLAC", "OGG"], {"default": "MP3", "tooltip": "File format for the generated audio.", "rw_cat": "output"}]}}, "param_plan": {"referenceVoices": {"path": ["inputs", "referenceVoices"], "kind": "feature"}, "speech": {"path": ["speech"], "kind": "feature"}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.topP": {"path": ["settings", "topP"], "kind": "scalar"}, "settings.chunkLength": {"path": ["settings", "chunkLength"], "kind": "scalar"}, "settings.conditionOnPreviousChunks": {"path": ["settings", "conditionOnPreviousChunks"], "kind": "scalar"}, "settings.earlyStopThreshold": {"path": ["settings", "earlyStopThreshold"], "kind": "scalar"}, "settings.latency": {"path": ["settings", "latency"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "settings.minChunkLength": {"path": ["settings", "minChunkLength"], "kind": "scalar"}, "settings.normalize": {"path": ["settings", "normalize"], "kind": "scalar"}, "settings.normalizeLoudness": {"path": ["settings", "normalizeLoudness"], "kind": "scalar"}, "settings.repetitionPenalty": {"path": ["settings", "repetitionPenalty"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "audioSettings": {"path": ["audioSettings"], "kind": "feature"}}}, {"key": "Runware_mirelo_sfx_1_5", "name": "Mirelo SFX 1.5", "model": "mirelo:1@1", "task_type": "audioInference", "creator": "mirelo", "input_types": {"required": {}, "optional": {"audioSettings": ["RUNWARE_AUDIOSETTINGS"], "video": ["STRING", {"tooltip": "Video input (UUID or URL). Max 10 seconds.", "default": "", "rw_cat": "core"}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 25, "min": 5, "max": 30, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "duration": ["FLOAT", {"default": 10, "min": 1, "max": 10, "tooltip": "Length of the generated audio track in seconds.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.startOffset": ["BOOLEAN", {"default": false, "rw_gates": "settings.startOffset_value", "tooltip": "Enable to set settings.startOffset. Off uses the model's default.", "rw_cat": "settings"}], "settings.startOffset_value": ["INT", {"min": 0, "max": 10, "tooltip": "Start time offset in seconds within the input video.", "default": 0, "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP3", "WAV", "FLAC", "OGG", "MP4", "MOV", "WEBM"], {"default": "MP3", "tooltip": "File format for the generated output. Prompt-based generation produces audio (MP3, WAV, FLAC, OGG). Providing a video input produces video (MP4, MOV, WEBM).", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "video": {"path": ["inputs", "video"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "settings.startOffset": {"path": ["settings", "startOffset"], "kind": "gate", "value_key": "settings.startOffset_value"}, "settings.startOffset_value": {"path": ["settings", "startOffset"], "kind": "skip"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "audioSettings": {"path": ["audioSettings"], "kind": "feature"}}}, {"key": "Runware_pixverse_v6", "name": "PixVerse V6", "model": "pixverse:1@8", "task_type": "videoInference", "creator": "pixverse", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "video": ["STRING", {"tooltip": "Video input (UUID or URL). Source video for video-to-video generation. Dimensions and duration are derived from the input video.", "default": "", "rw_cat": "core"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "size": [["None (model default)", "360p (from input)", "540p (from input)", "720p (from input)", "1080p (from input)", "360p (16:9)", "360p (4:3)", "360p (1:1)", "360p (3:4)", "360p (9:16)", "540p (16:9)", "540p (4:3)", "540p (1:1)", "540p (3:4)", "540p (9:16)", "720p (16:9)", "720p (4:3)", "720p (1:1)", "720p (3:4)", "720p (9:16)", "1080p (16:9)", "1080p (4:3)", "1080p (1:1)", "1080p (3:4)", "1080p (9:16)"], {"default": "720p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": ["FLOAT", {"default": 5, "min": 1, "max": 15, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.audio": ["BOOLEAN", {"default": false, "tooltip": "Enable audio generation.", "rw_cat": "settings"}], "settings.multiClip": ["BOOLEAN", {"default": false, "tooltip": "Enable multi-shot generation with varying camera angles.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "settings.style": [["(default)", "anime", "3d_animation", "clay", "comic", "cyberpunk"], {"tooltip": "Artistic style aesthetic for video generation.", "default": "(default)", "rw_cat": "settings"}], "settings.thinking": [["enabled", "disabled", "auto"], {"default": "auto", "tooltip": "Enhanced reasoning mode.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "video": {"path": ["inputs", "video"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.audio": {"path": ["settings", "audio"], "kind": "scalar", "omit_value": false}, "settings.multiClip": {"path": ["settings", "multiClip"], "kind": "scalar", "omit_value": false}, "settings.style": {"path": ["settings", "style"], "kind": "scalar", "omit_value": "(default)"}, "settings.thinking": {"path": ["settings", "thinking"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "360p (from input)": {"resolution": "360p"}, "540p (from input)": {"resolution": "540p"}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "360p (16:9)": {"width": 640, "height": 360}, "360p (4:3)": {"width": 480, "height": 360}, "360p (1:1)": {"width": 360, "height": 360}, "360p (3:4)": {"width": 360, "height": 480}, "360p (9:16)": {"width": 360, "height": 640}, "540p (16:9)": {"width": 960, "height": 540}, "540p (4:3)": {"width": 720, "height": 540}, "540p (1:1)": {"width": 540, "height": 540}, "540p (3:4)": {"width": 540, "height": 720}, "540p (9:16)": {"width": 540, "height": 960}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (4:3)": {"width": 960, "height": 720}, "720p (1:1)": {"width": 720, "height": 720}, "720p (3:4)": {"width": 720, "height": 960}, "720p (9:16)": {"width": 720, "height": 1280}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (4:3)": {"width": 1440, "height": 1080}, "1080p (1:1)": {"width": 1080, "height": 1080}, "1080p (3:4)": {"width": 1080, "height": 1440}, "1080p (9:16)": {"width": 1080, "height": 1920}}}}}, {"key": "Runware_pixverse_v5_fast", "name": "PixVerse V5 Fast", "model": "pixverse:1@5-fast", "task_type": "videoInference", "creator": "pixverse", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "size": [["None (model default)", "360p (from input)", "540p (from input)", "720p (from input)", "1080p (from input)", "360p (16:9)", "360p (4:3)", "360p (1:1)", "360p (3:4)", "360p (9:16)", "540p (16:9)", "540p (4:3)", "540p (1:1)", "540p (3:4)", "540p (9:16)", "720p (16:9)", "720p (4:3)", "720p (1:1)", "720p (3:4)", "720p (9:16)", "1080p (16:9)", "1080p (4:3)", "1080p (1:1)", "1080p (3:4)", "1080p (9:16)"], {"default": "720p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": [["(default)", 5, 8], {"tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "duration": {"path": ["duration"], "kind": "scalar", "omit_value": "(default)"}, "seed": {"path": ["seed"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "360p (from input)": {"resolution": "360p"}, "540p (from input)": {"resolution": "540p"}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "360p (16:9)": {"width": 640, "height": 360}, "360p (4:3)": {"width": 480, "height": 360}, "360p (1:1)": {"width": 360, "height": 360}, "360p (3:4)": {"width": 360, "height": 480}, "360p (9:16)": {"width": 360, "height": 640}, "540p (16:9)": {"width": 960, "height": 540}, "540p (4:3)": {"width": 720, "height": 540}, "540p (1:1)": {"width": 540, "height": 540}, "540p (3:4)": {"width": 540, "height": 720}, "540p (9:16)": {"width": 540, "height": 960}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (4:3)": {"width": 960, "height": 720}, "720p (1:1)": {"width": 720, "height": 720}, "720p (3:4)": {"width": 720, "height": 960}, "720p (9:16)": {"width": 720, "height": 1280}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (4:3)": {"width": 1440, "height": 1080}, "1080p (1:1)": {"width": 1080, "height": 1080}, "1080p (3:4)": {"width": 1080, "height": 1440}, "1080p (9:16)": {"width": 1080, "height": 1920}}}}}, {"key": "Runware_pixverse_v4", "name": "PixVerse V4", "model": "pixverse:1@2", "task_type": "videoInference", "creator": "pixverse", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "size": [["None (model default)", "360p (from input)", "540p (from input)", "720p (from input)", "1080p (from input)", "360p (16:9)", "360p (4:3)", "360p (1:1)", "360p (3:4)", "360p (9:16)", "540p (16:9)", "540p (4:3)", "540p (1:1)", "540p (3:4)", "540p (9:16)", "720p (16:9)", "720p (4:3)", "720p (1:1)", "720p (3:4)", "720p (9:16)", "1080p (16:9)", "1080p (4:3)", "1080p (1:1)", "1080p (3:4)", "1080p (9:16)", "640x360", "480x360", "360x360", "360x480", "360x640", "960x540", "720x540", "540x540", "540x720", "540x960", "1280x720", "960x720", "720x720", "720x960", "720x1280"], {"default": "720p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": [["(default)", 5, 8], {"tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.pixverse.cameraMovement": [["(default)", "horizontal_left", "horizontal_right", "vertical_up", "vertical_down", "zoom_in", "zoom_out", "auto_camera", "crane_up", "quickly_zoom_in", "quickly_zoom_out", "smooth_zoom_in", "camera_rotation", "robo_arm", "super_dolly_out", "whip_pan", "hitchcock", "left_follow", "right_follow", "pan_left", "pan_right", "fix_bg"], {"tooltip": "Cinematic camera movement.", "default": "(default)", "rw_cat": "settings"}], "providerSettings.pixverse.effect": [["(default)", "bikini up", "the tigers touch", "jiggle jiggle", "hug your love", "kiss me ai", "subject 3 fever", "fin-tastic mermaid", "lets ymca", "skeleton dance", "kungfu club", "boom drop", "vroom vroom step", "creepy devil smile", "pubg winner hit", "360 microwave", "eye zoom challenge", "muscle surge", "punch face", "balloon belly", "kiss kiss"], {"tooltip": "Visual effect template.", "default": "(default)", "rw_cat": "settings"}], "providerSettings.pixverse.motionMode": [["normal", "fast"], {"default": "normal", "tooltip": "Motion intensity in the generated video.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "providerSettings.pixverse.style": [["(default)", "anime", "3d_animation", "clay", "comic", "cyberpunk"], {"tooltip": "Artistic style aesthetic for video generation.", "default": "(default)", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "duration": {"path": ["duration"], "kind": "scalar", "omit_value": "(default)"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.pixverse.cameraMovement": {"path": ["providerSettings", "pixverse", "cameraMovement"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.pixverse.effect": {"path": ["providerSettings", "pixverse", "effect"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.pixverse.motionMode": {"path": ["providerSettings", "pixverse", "motionMode"], "kind": "scalar"}, "providerSettings.pixverse.style": {"path": ["providerSettings", "pixverse", "style"], "kind": "scalar", "omit_value": "(default)"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "360p (from input)": {"resolution": "360p"}, "540p (from input)": {"resolution": "540p"}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "360p (16:9)": {"width": 640, "height": 360}, "360p (4:3)": {"width": 480, "height": 360}, "360p (1:1)": {"width": 360, "height": 360}, "360p (3:4)": {"width": 360, "height": 480}, "360p (9:16)": {"width": 360, "height": 640}, "540p (16:9)": {"width": 960, "height": 540}, "540p (4:3)": {"width": 720, "height": 540}, "540p (1:1)": {"width": 540, "height": 540}, "540p (3:4)": {"width": 540, "height": 720}, "540p (9:16)": {"width": 540, "height": 960}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (4:3)": {"width": 960, "height": 720}, "720p (1:1)": {"width": 720, "height": 720}, "720p (3:4)": {"width": 720, "height": 960}, "720p (9:16)": {"width": 720, "height": 1280}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (4:3)": {"width": 1440, "height": 1080}, "1080p (1:1)": {"width": 1080, "height": 1080}, "1080p (3:4)": {"width": 1080, "height": 1440}, "1080p (9:16)": {"width": 1080, "height": 1920}, "640x360": {"width": 640, "height": 360}, "480x360": {"width": 480, "height": 360}, "360x360": {"width": 360, "height": 360}, "360x480": {"width": 360, "height": 480}, "360x640": {"width": 360, "height": 640}, "960x540": {"width": 960, "height": 540}, "720x540": {"width": 720, "height": 540}, "540x540": {"width": 540, "height": 540}, "540x720": {"width": 540, "height": 720}, "540x960": {"width": 540, "height": 960}, "1280x720": {"width": 1280, "height": 720}, "960x720": {"width": 960, "height": 720}, "720x720": {"width": 720, "height": 720}, "720x960": {"width": 720, "height": 960}, "720x1280": {"width": 720, "height": 1280}}}}}, {"key": "Runware_pixverse_v5_6", "name": "PixVerse V5.6", "model": "pixverse:1@7", "task_type": "videoInference", "creator": "pixverse", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "size": [["None (model default)", "360p (from input)", "540p (from input)", "720p (from input)", "1080p (from input)", "360p (16:9)", "360p (4:3)", "360p (1:1)", "360p (3:4)", "360p (9:16)", "540p (16:9)", "540p (4:3)", "540p (1:1)", "540p (3:4)", "540p (9:16)", "720p (16:9)", "720p (4:3)", "720p (1:1)", "720p (3:4)", "720p (9:16)", "1080p (16:9)", "1080p (4:3)", "1080p (1:1)", "1080p (3:4)", "1080p (9:16)"], {"default": "720p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": ["BOOLEAN", {"default": false, "rw_gates": "duration_value", "tooltip": "Enable to set duration. Off uses the model's default.", "rw_cat": "core"}], "duration_value": ["FLOAT", {"tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "default": 0.0, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.pixverse.audio": ["BOOLEAN", {"default": false, "tooltip": "Enable audio generation.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "providerSettings.pixverse.style": [["(default)", "anime", "3d_animation", "clay", "comic", "cyberpunk"], {"tooltip": "Artistic style aesthetic for video generation.", "default": "(default)", "rw_cat": "settings"}], "providerSettings.pixverse.thinking": [["enabled", "disabled", "auto"], {"default": "auto", "tooltip": "Enhanced reasoning mode.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "duration": {"path": ["duration"], "kind": "gate", "value_key": "duration_value"}, "duration_value": {"path": ["duration"], "kind": "skip"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.pixverse.audio": {"path": ["providerSettings", "pixverse", "audio"], "kind": "scalar", "omit_value": false}, "providerSettings.pixverse.style": {"path": ["providerSettings", "pixverse", "style"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.pixverse.thinking": {"path": ["providerSettings", "pixverse", "thinking"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "360p (from input)": {"resolution": "360p"}, "540p (from input)": {"resolution": "540p"}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "360p (16:9)": {"width": 640, "height": 360}, "360p (4:3)": {"width": 480, "height": 360}, "360p (1:1)": {"width": 360, "height": 360}, "360p (3:4)": {"width": 360, "height": 480}, "360p (9:16)": {"width": 360, "height": 640}, "540p (16:9)": {"width": 960, "height": 540}, "540p (4:3)": {"width": 720, "height": 540}, "540p (1:1)": {"width": 540, "height": 540}, "540p (3:4)": {"width": 540, "height": 720}, "540p (9:16)": {"width": 540, "height": 960}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (4:3)": {"width": 960, "height": 720}, "720p (1:1)": {"width": 720, "height": 720}, "720p (3:4)": {"width": 720, "height": 960}, "720p (9:16)": {"width": 720, "height": 1280}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (4:3)": {"width": 1440, "height": 1080}, "1080p (1:1)": {"width": 1080, "height": 1080}, "1080p (3:4)": {"width": 1080, "height": 1440}, "1080p (9:16)": {"width": 1080, "height": 1920}}}}}, {"key": "Runware_pixverse_v5", "name": "PixVerse V5", "model": "pixverse:1@5", "task_type": "videoInference", "creator": "pixverse", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "size": [["None (model default)", "360p (from input)", "540p (from input)", "720p (from input)", "1080p (from input)", "360p (16:9)", "360p (4:3)", "360p (1:1)", "360p (3:4)", "360p (9:16)", "540p (16:9)", "540p (4:3)", "540p (1:1)", "540p (3:4)", "540p (9:16)", "720p (16:9)", "720p (4:3)", "720p (1:1)", "720p (3:4)", "720p (9:16)", "1080p (16:9)", "1080p (4:3)", "1080p (1:1)", "1080p (3:4)", "1080p (9:16)"], {"default": "720p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": [["(default)", 5, 8], {"tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.pixverse.effect": [["(default)", "bikini up", "the tigers touch", "jiggle jiggle", "hug your love", "kiss me ai", "subject 3 fever", "fin-tastic mermaid", "lets ymca", "skeleton dance", "kungfu club", "boom drop", "vroom vroom step", "creepy devil smile", "pubg winner hit", "360 microwave", "eye zoom challenge", "muscle surge", "punch face", "balloon belly", "kiss kiss"], {"tooltip": "Visual effect template.", "default": "(default)", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "providerSettings.pixverse.style": [["(default)", "anime", "3d_animation", "clay", "comic", "cyberpunk"], {"tooltip": "Artistic style aesthetic for video generation.", "default": "(default)", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "duration": {"path": ["duration"], "kind": "scalar", "omit_value": "(default)"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.pixverse.effect": {"path": ["providerSettings", "pixverse", "effect"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.pixverse.style": {"path": ["providerSettings", "pixverse", "style"], "kind": "scalar", "omit_value": "(default)"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "360p (from input)": {"resolution": "360p"}, "540p (from input)": {"resolution": "540p"}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "360p (16:9)": {"width": 640, "height": 360}, "360p (4:3)": {"width": 480, "height": 360}, "360p (1:1)": {"width": 360, "height": 360}, "360p (3:4)": {"width": 360, "height": 480}, "360p (9:16)": {"width": 360, "height": 640}, "540p (16:9)": {"width": 960, "height": 540}, "540p (4:3)": {"width": 720, "height": 540}, "540p (1:1)": {"width": 540, "height": 540}, "540p (3:4)": {"width": 540, "height": 720}, "540p (9:16)": {"width": 540, "height": 960}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (4:3)": {"width": 960, "height": 720}, "720p (1:1)": {"width": 720, "height": 720}, "720p (3:4)": {"width": 720, "height": 960}, "720p (9:16)": {"width": 720, "height": 1280}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (4:3)": {"width": 1440, "height": 1080}, "1080p (1:1)": {"width": 1080, "height": 1080}, "1080p (3:4)": {"width": 1080, "height": 1440}, "1080p (9:16)": {"width": 1080, "height": 1920}}}}}, {"key": "Runware_pixverse_v3_5", "name": "PixVerse V3.5", "model": "pixverse:1@1", "task_type": "videoInference", "creator": "pixverse", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "size": [["None (model default)", "360p (from input)", "540p (from input)", "720p (from input)", "1080p (from input)", "360p (16:9)", "360p (4:3)", "360p (1:1)", "360p (3:4)", "360p (9:16)", "540p (16:9)", "540p (4:3)", "540p (1:1)", "540p (3:4)", "540p (9:16)", "720p (16:9)", "720p (4:3)", "720p (1:1)", "720p (3:4)", "720p (9:16)", "1080p (16:9)", "1080p (4:3)", "1080p (1:1)", "1080p (3:4)", "1080p (9:16)", "640x360", "480x360", "360x360", "270x360", "360x640", "960x540", "720x540", "540x540", "405x540", "540x960", "1280x720", "960x720", "720x720", "540x720", "720x1280"], {"default": "720p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": [["(default)", 5, 8], {"tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.pixverse.effect": [["(default)", "bikini up", "the tigers touch", "jiggle jiggle", "hug your love", "kiss me ai", "subject 3 fever", "fin-tastic mermaid", "lets ymca", "skeleton dance", "kungfu club", "boom drop", "vroom vroom step", "creepy devil smile", "pubg winner hit", "360 microwave", "eye zoom challenge", "muscle surge", "punch face", "balloon belly", "kiss kiss"], {"tooltip": "Visual effect template.", "default": "(default)", "rw_cat": "settings"}], "providerSettings.pixverse.motionMode": [["normal", "fast"], {"default": "normal", "tooltip": "Motion intensity in the generated video.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "providerSettings.pixverse.style": [["(default)", "anime", "3d_animation", "clay", "comic", "cyberpunk"], {"tooltip": "Artistic style aesthetic for video generation.", "default": "(default)", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "duration": {"path": ["duration"], "kind": "scalar", "omit_value": "(default)"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.pixverse.effect": {"path": ["providerSettings", "pixverse", "effect"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.pixverse.motionMode": {"path": ["providerSettings", "pixverse", "motionMode"], "kind": "scalar"}, "providerSettings.pixverse.style": {"path": ["providerSettings", "pixverse", "style"], "kind": "scalar", "omit_value": "(default)"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "360p (from input)": {"resolution": "360p"}, "540p (from input)": {"resolution": "540p"}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "360p (16:9)": {"width": 640, "height": 360}, "360p (4:3)": {"width": 480, "height": 360}, "360p (1:1)": {"width": 360, "height": 360}, "360p (3:4)": {"width": 270, "height": 360}, "360p (9:16)": {"width": 360, "height": 640}, "540p (16:9)": {"width": 960, "height": 540}, "540p (4:3)": {"width": 720, "height": 540}, "540p (1:1)": {"width": 540, "height": 540}, "540p (3:4)": {"width": 405, "height": 540}, "540p (9:16)": {"width": 540, "height": 960}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (4:3)": {"width": 960, "height": 720}, "720p (1:1)": {"width": 720, "height": 720}, "720p (3:4)": {"width": 540, "height": 720}, "720p (9:16)": {"width": 720, "height": 1280}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (4:3)": {"width": 1440, "height": 1080}, "1080p (1:1)": {"width": 1080, "height": 1080}, "1080p (3:4)": {"width": 810, "height": 1080}, "1080p (9:16)": {"width": 1080, "height": 1920}, "640x360": {"width": 640, "height": 360}, "480x360": {"width": 480, "height": 360}, "360x360": {"width": 360, "height": 360}, "270x360": {"width": 270, "height": 360}, "360x640": {"width": 360, "height": 640}, "960x540": {"width": 960, "height": 540}, "720x540": {"width": 720, "height": 540}, "540x540": {"width": 540, "height": 540}, "405x540": {"width": 405, "height": 540}, "540x960": {"width": 540, "height": 960}, "1280x720": {"width": 1280, "height": 720}, "960x720": {"width": 960, "height": 720}, "720x720": {"width": 720, "height": 720}, "540x720": {"width": 540, "height": 720}, "720x1280": {"width": 720, "height": 1280}}}}}, {"key": "Runware_pixverse_v5_5", "name": "PixVerse V5.5", "model": "pixverse:1@6", "task_type": "videoInference", "creator": "pixverse", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "size": [["None (model default)", "360p (from input)", "540p (from input)", "720p (from input)", "1080p (from input)", "360p (16:9)", "360p (4:3)", "360p (1:1)", "360p (3:4)", "360p (9:16)", "540p (16:9)", "540p (4:3)", "540p (1:1)", "540p (3:4)", "540p (9:16)", "720p (16:9)", "720p (4:3)", "720p (1:1)", "720p (3:4)", "720p (9:16)", "1080p (16:9)", "1080p (4:3)", "1080p (1:1)", "1080p (3:4)", "1080p (9:16)"], {"default": "720p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": ["BOOLEAN", {"default": false, "rw_gates": "duration_value", "tooltip": "Enable to set duration. Off uses the model's default.", "rw_cat": "core"}], "duration_value": ["FLOAT", {"tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "default": 0.0, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.pixverse.audio": ["BOOLEAN", {"default": false, "tooltip": "Enable audio generation.", "rw_cat": "settings"}], "providerSettings.pixverse.multiClip": ["BOOLEAN", {"default": false, "tooltip": "Enable multi-shot generation with varying camera angles.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "providerSettings.pixverse.style": [["(default)", "anime", "3d_animation", "clay", "comic", "cyberpunk"], {"tooltip": "Artistic style aesthetic for video generation.", "default": "(default)", "rw_cat": "settings"}], "providerSettings.pixverse.thinking": [["enabled", "disabled", "auto"], {"default": "auto", "tooltip": "Enhanced reasoning mode.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "duration": {"path": ["duration"], "kind": "gate", "value_key": "duration_value"}, "duration_value": {"path": ["duration"], "kind": "skip"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.pixverse.audio": {"path": ["providerSettings", "pixverse", "audio"], "kind": "scalar", "omit_value": false}, "providerSettings.pixverse.multiClip": {"path": ["providerSettings", "pixverse", "multiClip"], "kind": "scalar", "omit_value": false}, "providerSettings.pixverse.style": {"path": ["providerSettings", "pixverse", "style"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.pixverse.thinking": {"path": ["providerSettings", "pixverse", "thinking"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "360p (from input)": {"resolution": "360p"}, "540p (from input)": {"resolution": "540p"}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "360p (16:9)": {"width": 640, "height": 360}, "360p (4:3)": {"width": 480, "height": 360}, "360p (1:1)": {"width": 360, "height": 360}, "360p (3:4)": {"width": 360, "height": 480}, "360p (9:16)": {"width": 360, "height": 640}, "540p (16:9)": {"width": 960, "height": 540}, "540p (4:3)": {"width": 720, "height": 540}, "540p (1:1)": {"width": 540, "height": 540}, "540p (3:4)": {"width": 540, "height": 720}, "540p (9:16)": {"width": 540, "height": 960}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (4:3)": {"width": 960, "height": 720}, "720p (1:1)": {"width": 720, "height": 720}, "720p (3:4)": {"width": 720, "height": 960}, "720p (9:16)": {"width": 720, "height": 1280}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (4:3)": {"width": 1440, "height": 1080}, "1080p (1:1)": {"width": 1080, "height": 1080}, "1080p (3:4)": {"width": 1080, "height": 1440}, "1080p (9:16)": {"width": 1080, "height": 1920}}}}}, {"key": "Runware_pixverse_modify", "name": "PixVerse Modify", "model": "pixverse:modify@0", "task_type": "videoInference", "creator": "pixverse", "input_types": {"required": {"video": ["STRING", {"tooltip": "Video input (UUID or URL). Max 29.9 seconds.", "rw_cat": "core"}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "masks": ["IMAGE"], "resolution": [["360p", "540p", "720p"], {"default": "360p", "tooltip": "Resolution preset for the output. When used with input media, automatically matches the aspect ratio from the input.", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.keyframe": ["BOOLEAN", {"default": false, "rw_gates": "settings.keyframe_value", "tooltip": "Enable to set settings.keyframe. Off uses the model's default.", "rw_cat": "settings"}], "settings.keyframe_value": ["INT", {"min": 0, "tooltip": "Frame index in the input video used as anchor for editing.", "default": 0, "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "video": {"path": ["inputs", "video"], "kind": "scalar"}, "masks": {"path": ["inputs", "masks"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "resolution": {"path": ["resolution"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.keyframe": {"path": ["settings", "keyframe"], "kind": "gate", "value_key": "settings.keyframe_value"}, "settings.keyframe_value": {"path": ["settings", "keyframe"], "kind": "skip"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_pixverse_lipsync", "name": "PixVerse LipSync", "model": "pixverse:lipsync@1", "task_type": "videoInference", "creator": "pixverse", "input_types": {"required": {"referenceVideos": ["RUNWARE_REFERENCEVIDEOS"]}, "optional": {"speech": ["RUNWARE_SPEECH", {"rw_socket_fields": ["text", "voice"], "rw_socket_enums": {"voice": ["Emily", "James", "Isabella", "Liam", "Chloe", "Adrian", "Harper", "Ava", "Sophia", "Julia", "Mason", "Jack", "Oliver", "Ethan", "auto"]}, "rw_cat": "inputs"}], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "default": "", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceVideos": {"path": ["inputs", "referenceVideos"], "kind": "feature"}, "audio": {"path": ["inputs", "audio"], "kind": "scalar", "omit_empty": true}, "speech": {"path": ["speech"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_pixverse_v4_5", "name": "PixVerse V4.5", "model": "pixverse:1@3", "task_type": "videoInference", "creator": "pixverse", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "size": [["None (model default)", "360p (from input)", "540p (from input)", "720p (from input)", "1080p (from input)", "360p (16:9)", "360p (4:3)", "360p (1:1)", "360p (3:4)", "360p (9:16)", "540p (16:9)", "540p (4:3)", "540p (1:1)", "540p (3:4)", "540p (9:16)", "720p (16:9)", "720p (4:3)", "720p (1:1)", "720p (3:4)", "720p (9:16)", "1080p (16:9)", "1080p (4:3)", "1080p (1:1)", "1080p (3:4)", "1080p (9:16)", "640x360", "480x360", "360x360", "360x480", "360x640", "960x540", "720x540", "540x540", "540x720", "540x960", "1280x720", "960x720", "720x720", "720x960", "720x1280"], {"default": "720p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": [["(default)", 5, 8], {"tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.pixverse.cameraMovement": [["(default)", "horizontal_left", "horizontal_right", "vertical_up", "vertical_down", "zoom_in", "zoom_out", "auto_camera", "crane_up", "quickly_zoom_in", "quickly_zoom_out", "smooth_zoom_in", "camera_rotation", "robo_arm", "super_dolly_out", "whip_pan", "hitchcock", "left_follow", "right_follow", "pan_left", "pan_right", "fix_bg"], {"tooltip": "Cinematic camera movement.", "default": "(default)", "rw_cat": "settings"}], "providerSettings.pixverse.effect": [["(default)", "bikini up", "the tigers touch", "jiggle jiggle", "hug your love", "kiss me ai", "subject 3 fever", "fin-tastic mermaid", "lets ymca", "skeleton dance", "kungfu club", "boom drop", "vroom vroom step", "creepy devil smile", "pubg winner hit", "360 microwave", "eye zoom challenge", "muscle surge", "punch face", "balloon belly", "kiss kiss"], {"tooltip": "Visual effect template.", "default": "(default)", "rw_cat": "settings"}], "providerSettings.pixverse.motionMode": [["normal", "fast"], {"default": "normal", "tooltip": "Motion intensity in the generated video.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "providerSettings.pixverse.style": [["(default)", "anime", "3d_animation", "clay", "comic", "cyberpunk"], {"tooltip": "Artistic style aesthetic for video generation.", "default": "(default)", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "duration": {"path": ["duration"], "kind": "scalar", "omit_value": "(default)"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.pixverse.cameraMovement": {"path": ["providerSettings", "pixverse", "cameraMovement"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.pixverse.effect": {"path": ["providerSettings", "pixverse", "effect"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.pixverse.motionMode": {"path": ["providerSettings", "pixverse", "motionMode"], "kind": "scalar"}, "providerSettings.pixverse.style": {"path": ["providerSettings", "pixverse", "style"], "kind": "scalar", "omit_value": "(default)"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "360p (from input)": {"resolution": "360p"}, "540p (from input)": {"resolution": "540p"}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "360p (16:9)": {"width": 640, "height": 360}, "360p (4:3)": {"width": 480, "height": 360}, "360p (1:1)": {"width": 360, "height": 360}, "360p (3:4)": {"width": 360, "height": 480}, "360p (9:16)": {"width": 360, "height": 640}, "540p (16:9)": {"width": 960, "height": 540}, "540p (4:3)": {"width": 720, "height": 540}, "540p (1:1)": {"width": 540, "height": 540}, "540p (3:4)": {"width": 540, "height": 720}, "540p (9:16)": {"width": 540, "height": 960}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (4:3)": {"width": 960, "height": 720}, "720p (1:1)": {"width": 720, "height": 720}, "720p (3:4)": {"width": 720, "height": 960}, "720p (9:16)": {"width": 720, "height": 1280}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (4:3)": {"width": 1440, "height": 1080}, "1080p (1:1)": {"width": 1080, "height": 1080}, "1080p (3:4)": {"width": 1080, "height": 1440}, "1080p (9:16)": {"width": 1080, "height": 1920}, "640x360": {"width": 640, "height": 360}, "480x360": {"width": 480, "height": 360}, "360x360": {"width": 360, "height": 360}, "360x480": {"width": 360, "height": 480}, "360x640": {"width": 360, "height": 640}, "960x540": {"width": 960, "height": 540}, "720x540": {"width": 720, "height": 540}, "540x540": {"width": 540, "height": 540}, "540x720": {"width": 540, "height": 720}, "540x960": {"width": 540, "height": 960}, "1280x720": {"width": 1280, "height": 720}, "960x720": {"width": 960, "height": 720}, "720x720": {"width": 720, "height": 720}, "720x960": {"width": 720, "height": 960}, "720x1280": {"width": 720, "height": 1280}}}}}, {"key": "Runware_inworld_tts_1_5_mini", "name": "Inworld TTS-1.5 Mini", "model": "inworld:tts@1.5-mini", "task_type": "audioInference", "creator": "inworld", "input_types": {"required": {"speech": ["RUNWARE_SPEECH", {"rw_socket_fields": ["speed", "text", "voice"], "rw_socket_enums": {"voice": ["Loretta", "Darlene", "Marlene", "Hank", "Evelyn", "Celeste", "Pippa", "Tessa", "Liam", "Callum", "Hamish", "Abby", "Graham", "Rupert", "Mortimer", "Snik", "Anjali", "Saanvi", "Arjun", "Claire", "Oliver", "Simon", "Elliot", "James", "Serena", "Gareth", "Vinny", "Lauren", "Jessica", "Ethan", "Tyler", "Jason", "Chloe", "Veronica", "Victoria", "Miranda", "Sebastian", "Victor", "Malcolm", "Kayla", "Nate", "Jake", "Brian", "Amina", "Kelsey", "Derek", "Grant", "Evan", "Alex", "Ashley", "Craig", "Deborah", "Dennis", "Edward", "Elizabeth", "Hades", "Julia", "Pixie", "Mark", "Olivia", "Priya", "Ronald", "Sarah", "Shaun", "Theodore", "Timothy", "Wendy", "Dominus", "Hana", "Clive", "Carter", "Blake", "Luna"]}, "rw_cat": "inputs"}]}, "optional": {"audioSettings": ["RUNWARE_AUDIOSETTINGS"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.temperature": ["FLOAT", {"default": 1.1, "min": 0.1, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "settings.textNormalization": ["BOOLEAN", {"default": false, "tooltip": "Expands numbers, dates, abbreviations before speech generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP3", "WAV", "FLAC", "OGG"], {"default": "MP3", "tooltip": "File format for the generated audio.", "rw_cat": "output"}]}}, "param_plan": {"audioSettings": {"path": ["audioSettings"], "kind": "feature"}, "speech": {"path": ["speech"], "kind": "feature"}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.textNormalization": {"path": ["settings", "textNormalization"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}}}, {"key": "Runware_inworld_tts_2", "name": "Inworld Realtime TTS-2", "model": "inworld:tts@2", "task_type": "audioInference", "creator": "inworld", "input_types": {"required": {"speech": ["RUNWARE_SPEECH", {"rw_socket_fields": ["language", "speed", "text", "voice"], "rw_socket_enums": {"voice": ["Loretta", "Darlene", "Marlene", "Hank", "Evelyn", "Celeste", "Pippa", "Tessa", "Liam", "Callum", "Hamish", "Abby", "Graham", "Rupert", "Mortimer", "Snik", "Anjali", "Saanvi", "Arjun", "Claire", "Oliver", "Simon", "Elliot", "James", "Serena", "Gareth", "Vinny", "Lauren", "Jessica", "Ethan", "Tyler", "Jason", "Chloe", "Veronica", "Victoria", "Miranda", "Sebastian", "Victor", "Malcolm", "Nate", "Brian", "Amina", "Kelsey", "Derek", "Evan", "Kayla", "Jake", "Grant", "Tristan", "Nadia", "Selene", "Marcus", "Riley", "Damon", "Cedric", "Mia", "Naomi", "Jonah", "Levi", "Avery", "Brandon", "Conrad", "Bianca", "Lucian", "Trevor", "Alex", "Ashley", "Craig", "Deborah", "Dennis", "Edward", "Elizabeth", "Hades", "Julia", "Pixie", "Mark", "Olivia", "Priya", "Ronald", "Sarah", "Shaun", "Theodore", "Timothy", "Wendy", "Dominus", "Hana", "Clive", "Carter", "Blake", "Luna", "Reed", "Duncan", "Felix", "Eleanor", "Sophie", "Asuka", "Satoshi", "Yichen", "Xiaoyin", "Xinyi", "Jing", "Hyunwoo", "Minji", "Seojun", "Yoona", "Svetlana", "Elena", "Dmitry", "Nikolai", "Gianni", "Orietta", "Diego", "Lupita", "Miguel", "Rafael", "Johanna", "Josef", "Alain", "H\u00e9l\u00e8ne", "Mathieu", "\u00c9tienne", "Nour", "Omar", "Szymon", "Wojciech", "Erik", "Katrien", "Lennart", "Lore", "Riya", "Manoj", "Yael", "Oren"], "language": ["en", "ja", "zh", "ko", "ru", "it", "es", "de", "fr", "ar", "pl", "nl", "hi", "he"]}, "rw_cat": "inputs"}]}, "optional": {"audioSettings": ["RUNWARE_AUDIOSETTINGS"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.textNormalization": ["BOOLEAN", {"default": false, "tooltip": "Expands numbers, dates, abbreviations before speech generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP3", "WAV", "FLAC", "OGG"], {"default": "MP3", "tooltip": "File format for the generated audio.", "rw_cat": "output"}]}}, "param_plan": {"speech": {"path": ["speech"], "kind": "feature"}, "settings.textNormalization": {"path": ["settings", "textNormalization"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "audioSettings": {"path": ["audioSettings"], "kind": "feature"}}}, {"key": "Runware_inworld_tts_1_5_max", "name": "Inworld TTS-1.5 Max", "model": "inworld:tts@1.5-max", "task_type": "audioInference", "creator": "inworld", "input_types": {"required": {"speech": ["RUNWARE_SPEECH", {"rw_socket_fields": ["speed", "text", "voice"], "rw_socket_enums": {"voice": ["Loretta", "Darlene", "Marlene", "Hank", "Evelyn", "Celeste", "Pippa", "Tessa", "Liam", "Callum", "Hamish", "Abby", "Graham", "Rupert", "Mortimer", "Snik", "Anjali", "Saanvi", "Arjun", "Claire", "Oliver", "Simon", "Elliot", "James", "Serena", "Gareth", "Vinny", "Lauren", "Jessica", "Ethan", "Tyler", "Jason", "Chloe", "Veronica", "Victoria", "Miranda", "Sebastian", "Victor", "Malcolm", "Kayla", "Nate", "Jake", "Brian", "Amina", "Kelsey", "Derek", "Grant", "Evan", "Alex", "Ashley", "Craig", "Deborah", "Dennis", "Edward", "Elizabeth", "Hades", "Julia", "Pixie", "Mark", "Olivia", "Priya", "Ronald", "Sarah", "Shaun", "Theodore", "Timothy", "Wendy", "Dominus", "Hana", "Clive", "Carter", "Blake", "Luna"]}, "rw_cat": "inputs"}]}, "optional": {"audioSettings": ["RUNWARE_AUDIOSETTINGS"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.temperature": ["FLOAT", {"default": 1.1, "min": 0.1, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "settings.textNormalization": ["BOOLEAN", {"default": false, "tooltip": "Expands numbers, dates, abbreviations before speech generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP3", "WAV", "FLAC", "OGG"], {"default": "MP3", "tooltip": "File format for the generated audio.", "rw_cat": "output"}]}}, "param_plan": {"audioSettings": {"path": ["audioSettings"], "kind": "feature"}, "speech": {"path": ["speech"], "kind": "feature"}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.textNormalization": {"path": ["settings", "textNormalization"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}}}, {"key": "Runware_luma_uni_1", "name": "UNI-1", "model": "luma:uni@1", "task_type": "imageInference", "creator": "luma", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "settings.search": ["BOOLEAN", {"default": false, "tooltip": "When enabled, the model searches the web for visual references before generating. This improves accuracy for prompts that reference real-world subjects, landmarks, or products.", "rw_cat": "settings"}], "settings.style": [["auto", "manga"], {"default": "auto", "tooltip": "Applies a style preset to the generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "settings.search": {"path": ["settings", "search"], "kind": "scalar", "omit_value": false}, "settings.style": {"path": ["settings", "style"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_luma_uni_1_max", "name": "UNI-1 Max", "model": "luma:uni@1-max", "task_type": "imageInference", "creator": "luma", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "settings.search": ["BOOLEAN", {"default": false, "tooltip": "When enabled, the model searches the web for visual references before generating. This improves accuracy for prompts that reference real-world subjects, landmarks, or products.", "rw_cat": "settings"}], "settings.style": [["auto", "manga"], {"default": "auto", "tooltip": "Applies a style preset to the generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "settings.search": {"path": ["settings", "search"], "kind": "scalar", "omit_value": false}, "settings.style": {"path": ["settings", "style"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_luma_ray3_2", "name": "Ray3.2", "model": "luma:ray@3.2", "task_type": "videoInference", "creator": "luma", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "settings.sourcePosition.height": ["FLOAT", {"max": 2, "tooltip": "Height of the source video, as a fraction of the canvas height.", "default": 0.0, "rw_cat": "settings"}], "settings.sourcePosition.width": ["FLOAT", {"max": 2, "tooltip": "Width of the source video, as a fraction of the canvas width.", "default": 0.0, "rw_cat": "settings"}], "settings.sourcePosition.x": ["FLOAT", {"min": -2, "max": 2, "tooltip": "Horizontal position of the source video, as a fraction of the canvas width.", "default": -2.0, "rw_cat": "settings"}], "settings.sourcePosition.y": ["FLOAT", {"min": -2, "max": 2, "tooltip": "Vertical position of the source video, as a fraction of the canvas height.", "default": -2.0, "rw_cat": "settings"}]}, "optional": {"frameImages": ["IMAGE"], "video": ["STRING", {"tooltip": "Source video to edit or reframe (UUID or URL). Editing preserves the source aspect ratio; reframing places it on a new canvas.", "default": "", "rw_cat": "core"}], "size": [["None (model default)", "360p (from input)", "540p (from input)", "720p (from input)", "1080p (from input)", "360p (9:16)", "360p (3:4)", "360p (1:1)", "360p (4:3)", "360p (16:9)", "360p (21:9)", "540p (9:16)", "540p (3:4)", "540p (1:1)", "540p (4:3)", "540p (16:9)", "540p (21:9)", "720p (9:16)", "720p (3:4)", "720p (1:1)", "720p (4:3)", "720p (16:9)", "720p (21:9)", "1080p (9:16)", "1080p (3:4)", "1080p (1:1)", "1080p (4:3)", "1080p (16:9)", "1080p (21:9)"], {"default": "720p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "duration": [[5, 10], {"default": 5, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.edit.autoControls": ["BOOLEAN", {"default": false, "tooltip": "Derive the full conditioning schedule automatically from the source video.", "rw_cat": "settings"}], "settings.edit.controls.depthBlur": ["BOOLEAN", {"default": false, "rw_gates": "settings.edit.controls.depthBlur_value", "tooltip": "Enable to set settings.edit.controls.depthBlur. Off uses the model's default.", "rw_cat": "settings"}], "settings.edit.controls.depthBlur_value": ["FLOAT", {"min": 0, "max": 1, "tooltip": "Scene-geometry depth blur. Higher values allow more freedom.", "default": 0.0, "rw_cat": "settings"}], "settings.exrExport": ["BOOLEAN", {"default": false, "tooltip": "Also export an OpenEXR frame sequence alongside the MP4.", "rw_cat": "settings"}], "settings.edit.controls.face": ["BOOLEAN", {"default": false, "tooltip": "Enable face-identity conditioning.", "rw_cat": "settings"}], "settings.hdr": ["BOOLEAN", {"default": false, "tooltip": "Render in high dynamic range.", "rw_cat": "settings"}], "settings.loop": ["BOOLEAN", {"default": false, "tooltip": "Loop the generated video seamlessly.", "rw_cat": "settings"}], "settings.edit.controls.normalsAugmentation": ["BOOLEAN", {"default": false, "rw_gates": "settings.edit.controls.normalsAugmentation_value", "tooltip": "Enable to set settings.edit.controls.normalsAugmentation. Off uses the model's default.", "rw_cat": "settings"}], "settings.edit.controls.normalsAugmentation_value": ["FLOAT", {"min": 0, "max": 1, "tooltip": "Surface-geometry normals augmentation. Higher values allow more reinterpretation.", "default": 0.0, "rw_cat": "settings"}], "settings.edit.controls.poseStrength": [["(default)", "precise", "coarse"], {"tooltip": "Skeleton conditioning strength.", "default": "(default)", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "settings.edit.strength": [["(default)", "adhere_1", "adhere_2", "adhere_3", "flex_1", "flex_2", "flex_3", "reimagine_1", "reimagine_2", "reimagine_3"], {"tooltip": "Preservation preset, from strict adherence to free reinterpretation.", "default": "(default)", "rw_cat": "settings"}], "settings.edit.controls.trajectorySparsity": ["BOOLEAN", {"default": false, "rw_gates": "settings.edit.controls.trajectorySparsity_value", "tooltip": "Enable to set settings.edit.controls.trajectorySparsity. Off uses the model's default.", "rw_cat": "settings"}], "settings.edit.controls.trajectorySparsity_value": ["FLOAT", {"min": 0, "max": 1, "tooltip": "Motion-anchoring sparsity. Higher values use fewer anchors.", "default": 0.0, "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "video": {"path": ["inputs", "video"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "settings.edit.strength": {"path": ["settings", "edit", "strength"], "kind": "scalar", "omit_value": "(default)"}, "settings.edit.autoControls": {"path": ["settings", "edit", "autoControls"], "kind": "scalar", "omit_value": false}, "settings.edit.controls.depthBlur": {"path": ["settings", "edit", "controls", "depthBlur"], "kind": "gate", "value_key": "settings.edit.controls.depthBlur_value"}, "settings.edit.controls.depthBlur_value": {"path": ["settings", "edit", "controls", "depthBlur"], "kind": "skip"}, "settings.edit.controls.face": {"path": ["settings", "edit", "controls", "face"], "kind": "scalar", "omit_value": false}, "settings.edit.controls.normalsAugmentation": {"path": ["settings", "edit", "controls", "normalsAugmentation"], "kind": "gate", "value_key": "settings.edit.controls.normalsAugmentation_value"}, "settings.edit.controls.normalsAugmentation_value": {"path": ["settings", "edit", "controls", "normalsAugmentation"], "kind": "skip"}, "settings.edit.controls.poseStrength": {"path": ["settings", "edit", "controls", "poseStrength"], "kind": "scalar", "omit_value": "(default)"}, "settings.edit.controls.trajectorySparsity": {"path": ["settings", "edit", "controls", "trajectorySparsity"], "kind": "gate", "value_key": "settings.edit.controls.trajectorySparsity_value"}, "settings.edit.controls.trajectorySparsity_value": {"path": ["settings", "edit", "controls", "trajectorySparsity"], "kind": "skip"}, "settings.exrExport": {"path": ["settings", "exrExport"], "kind": "scalar", "omit_value": false}, "settings.hdr": {"path": ["settings", "hdr"], "kind": "scalar", "omit_value": false}, "settings.loop": {"path": ["settings", "loop"], "kind": "scalar", "omit_value": false}, "settings.sourcePosition.width": {"path": ["settings", "sourcePosition", "width"], "kind": "scalar"}, "settings.sourcePosition.height": {"path": ["settings", "sourcePosition", "height"], "kind": "scalar"}, "settings.sourcePosition.x": {"path": ["settings", "sourcePosition", "x"], "kind": "scalar"}, "settings.sourcePosition.y": {"path": ["settings", "sourcePosition", "y"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "360p (from input)": {"resolution": "360p"}, "540p (from input)": {"resolution": "540p"}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "360p (9:16)": {"width": 360, "height": 640}, "360p (3:4)": {"width": 360, "height": 480}, "360p (1:1)": {"width": 480, "height": 480}, "360p (4:3)": {"width": 480, "height": 360}, "360p (16:9)": {"width": 640, "height": 360}, "360p (21:9)": {"width": 840, "height": 360}, "540p (9:16)": {"width": 540, "height": 960}, "540p (3:4)": {"width": 540, "height": 720}, "540p (1:1)": {"width": 720, "height": 720}, "540p (4:3)": {"width": 720, "height": 540}, "540p (16:9)": {"width": 960, "height": 540}, "540p (21:9)": {"width": 1260, "height": 540}, "720p (9:16)": {"width": 720, "height": 1280}, "720p (3:4)": {"width": 720, "height": 960}, "720p (1:1)": {"width": 960, "height": 960}, "720p (4:3)": {"width": 960, "height": 720}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (21:9)": {"width": 1680, "height": 720}, "1080p (9:16)": {"width": 1080, "height": 1920}, "1080p (3:4)": {"width": 1080, "height": 1440}, "1080p (1:1)": {"width": 1440, "height": 1440}, "1080p (4:3)": {"width": 1440, "height": 1080}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (21:9)": {"width": 2520, "height": 1080}}}}}, {"key": "Runware_recraft_v4_1_pro", "name": "Recraft V4.1 Pro", "model": "recraft:v4.1-pro@0", "task_type": "imageInference", "creator": "recraft", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: settings.backgroundColor.rgb, settings.colors"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_recraft_vectorize", "name": "Recraft Vectorize", "model": "recraft:1@1", "task_type": "vectorize", "creator": "recraft", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["SVG"], {"default": "SVG", "tooltip": "File format for the vectorized output.", "rw_cat": "output"}]}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}}}, {"key": "Runware_recraft_v4_1_utility", "name": "Recraft V4.1 Utility", "model": "recraft:v4.1-utility@0", "task_type": "imageInference", "creator": "recraft", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: settings.backgroundColor.rgb, settings.colors"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_recraft_v4_1", "name": "Recraft V4.1", "model": "recraft:v4.1@0", "task_type": "imageInference", "creator": "recraft", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: settings.backgroundColor.rgb, settings.colors"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_recraft_v4_vector", "name": "Recraft V4 Vector", "model": "recraft:v4@vector", "task_type": "vectorize", "creator": "recraft", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["SVG"], {"default": "SVG", "tooltip": "File format for the vectorized output.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: providerSettings.recraft.backgroundColor.rgb, providerSettings.recraft.colors"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}}}, {"key": "Runware_recraft_v4_pro", "name": "Recraft V4 Pro", "model": "recraft:v4-pro@0", "task_type": "imageInference", "creator": "recraft", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: providerSettings.recraft.backgroundColor.rgb, providerSettings.recraft.colors"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_recraft_v4", "name": "Recraft V4", "model": "recraft:v4@0", "task_type": "imageInference", "creator": "recraft", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: providerSettings.recraft.backgroundColor.rgb, providerSettings.recraft.colors"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_recraft_v4_pro_vector", "name": "Recraft V4 Pro Vector", "model": "recraft:v4-pro@vector", "task_type": "vectorize", "creator": "recraft", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["SVG"], {"default": "SVG", "tooltip": "File format for the vectorized output.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: providerSettings.recraft.backgroundColor.rgb, providerSettings.recraft.colors"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}}}, {"key": "Runware_recraft_v4_1_utility_pro", "name": "Recraft V4.1 Utility Pro", "model": "recraft:v4.1-utility-pro@0", "task_type": "imageInference", "creator": "recraft", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: settings.backgroundColor.rgb, settings.colors"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_tripo_v3_1", "name": "Tripo 3D v3.1", "model": "tripo:v3.1@0", "task_type": "3dInference", "creator": "tripo", "input_types": {"required": {}, "optional": {"images": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 1, "max": 20240919, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 1, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.autoSize": ["BOOLEAN", {"default": false, "tooltip": "Scales the model to real-world dimensions in meters.", "rw_cat": "settings"}], "settings.compress": [["geometry", "meshopt"], {"default": "meshopt", "tooltip": "Compression method for the output mesh.", "rw_cat": "settings"}], "settings.exportUv": ["BOOLEAN", {"default": true, "tooltip": "Enables UV unwrapping on the output mesh.", "rw_cat": "settings"}], "settings.faceLimit": ["BOOLEAN", {"default": false, "rw_gates": "settings.faceLimit_value", "tooltip": "Enable to set settings.faceLimit. Off uses the model's default.", "rw_cat": "settings"}], "settings.faceLimit_value": ["INT", {"min": 500, "max": 20000, "tooltip": "Maximum number of faces (polygons) in the output mesh. If not set, determined adaptively. Range depends on mode: 1000\u201320000 for low-poly, 500\u201310000 for quad.", "default": 500, "rw_cat": "settings"}], "settings.generateParts": ["BOOLEAN", {"default": false, "tooltip": "Generates segmented 3D models with individually editable parts.", "rw_cat": "settings"}], "settings.geometryQuality": [["standard", "detailed"], {"default": "standard", "tooltip": "Controls the geometric detail level of the output mesh.", "rw_cat": "settings"}], "settings.imageAutoFix": ["BOOLEAN", {"default": false, "tooltip": "Optimizes the input image for better 3D generation results.", "rw_cat": "settings"}], "settings.orientation": [["default", "align_image"], {"default": "default", "tooltip": "Controls model orientation.", "rw_cat": "settings"}], "settings.pbr": ["BOOLEAN", {"default": true, "tooltip": "Enables physically-based rendering materials.", "rw_cat": "settings"}], "settings.quad": ["BOOLEAN", {"default": false, "tooltip": "Enables quad mesh output.", "rw_cat": "settings"}], "settings.smartLowPoly": ["BOOLEAN", {"default": false, "tooltip": "Generates low-poly meshes optimized for simple inputs. May fail on complex models.", "rw_cat": "settings"}], "settings.texture": ["BOOLEAN", {"default": true, "tooltip": "Enables texturing on the generated model. Set to false for a base model without textures.", "rw_cat": "settings"}], "settings.textureAlignment": [["(default)", "original_image", "geometry"], {"tooltip": "Controls texture alignment priority.", "default": "(default)", "rw_cat": "settings"}], "settings.textureQuality": [["standard", "detailed"], {"default": "standard", "tooltip": "Resolution quality for generated textures.", "rw_cat": "settings"}], "settings.textureSeed": ["BOOLEAN", {"default": false, "rw_gates": "settings.textureSeed_value", "tooltip": "Enable to set settings.textureSeed. Off uses the model's default.", "rw_cat": "settings"}], "settings.textureSeed_value": ["INT", {"min": 0, "max": 20240919, "tooltip": "Seed for texture generation reproducibility.", "default": 0, "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["GLB", "FBX"], {"default": "GLB", "tooltip": "File format for the generated 3D model.", "rw_cat": "output"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "images": {"path": ["inputs", "images"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.autoSize": {"path": ["settings", "autoSize"], "kind": "scalar", "omit_value": false}, "settings.compress": {"path": ["settings", "compress"], "kind": "scalar"}, "settings.exportUv": {"path": ["settings", "exportUv"], "kind": "scalar"}, "settings.faceLimit": {"path": ["settings", "faceLimit"], "kind": "gate", "value_key": "settings.faceLimit_value"}, "settings.faceLimit_value": {"path": ["settings", "faceLimit"], "kind": "skip"}, "settings.generateParts": {"path": ["settings", "generateParts"], "kind": "scalar", "omit_value": false}, "settings.geometryQuality": {"path": ["settings", "geometryQuality"], "kind": "scalar"}, "settings.imageAutoFix": {"path": ["settings", "imageAutoFix"], "kind": "scalar", "omit_value": false}, "settings.orientation": {"path": ["settings", "orientation"], "kind": "scalar"}, "settings.pbr": {"path": ["settings", "pbr"], "kind": "scalar"}, "settings.quad": {"path": ["settings", "quad"], "kind": "scalar", "omit_value": false}, "settings.smartLowPoly": {"path": ["settings", "smartLowPoly"], "kind": "scalar", "omit_value": false}, "settings.texture": {"path": ["settings", "texture"], "kind": "scalar"}, "settings.textureAlignment": {"path": ["settings", "textureAlignment"], "kind": "scalar", "omit_value": "(default)"}, "settings.textureQuality": {"path": ["settings", "textureQuality"], "kind": "scalar"}, "settings.textureSeed": {"path": ["settings", "textureSeed"], "kind": "gate", "value_key": "settings.textureSeed_value"}, "settings.textureSeed_value": {"path": ["settings", "textureSeed"], "kind": "skip"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}}}, {"key": "Runware_bfl_flux_2_klein_9b", "name": "FLUX.2 [klein] 9B", "model": "runware:400@2", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 16, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 16, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 4, "min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 3.5, "min": 1, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "acceleration": [["(default)", "none", "low", "medium", "high"], {"default": "(default)", "tooltip": "Optimization level.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "acceleration": {"path": ["acceleration"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bfl_flux_virtual_try_on", "name": "FLUX Virtual Try-On", "model": "bfl:flux@vto", "task_type": "imageInference", "creator": "bfl", "input_types": {"required": {"referenceImages": ["RUNWARE_REFERENCEIMAGES", {"rw_socket_fields": ["image", "role"], "rw_socket_enums": {"role": ["person", "garment"]}, "rw_cat": "inputs"}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 4, "min": 1, "max": 4, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "feature"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bfl_flux_2_klein_4b", "name": "FLUX.2 [klein] 4B", "model": "runware:400@4", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 16, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 16, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 4, "min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 3.5, "min": 1, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "acceleration": [["(default)", "none", "low", "medium", "high"], {"default": "(default)", "tooltip": "Optimization level.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "acceleration": {"path": ["acceleration"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bfl_flux_2_flex", "name": "FLUX.2 [flex]", "model": "bfl:6@1", "task_type": "imageInference", "creator": "bfl", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 256, "max": 2048, "step": 16, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 256, "max": 2048, "step": 16, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 2.5, "min": 1.5, "max": 5, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.bfl.promptUpsampling": ["BOOLEAN", {"default": false, "tooltip": "Enable automatic enhancement and expansion of the input prompt.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.bfl.safetyTolerance": ["INT", {"default": 2, "min": 0, "max": 5, "tooltip": "Tolerance level for content moderation. Lower values are stricter; higher values are more permissive.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "providerSettings.bfl.promptUpsampling": {"path": ["providerSettings", "bfl", "promptUpsampling"], "kind": "scalar", "omit_value": false}, "providerSettings.bfl.safetyTolerance": {"path": ["providerSettings", "bfl", "safetyTolerance"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bfl_flux_2_max", "name": "FLUX.2 [max]", "model": "bfl:7@1", "task_type": "imageInference", "creator": "bfl", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "width": ["INT", {"default": 1024, "min": 256, "max": 2048, "step": 16, "tooltip": "Width of the generated media in pixels.", "rw_cat": "core"}], "height": ["INT", {"default": 1024, "min": 256, "max": 2048, "step": 16, "tooltip": "Height of the generated media in pixels.", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.bfl.promptUpsampling": ["BOOLEAN", {"default": false, "tooltip": "Enable automatic enhancement and expansion of the input prompt.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.bfl.safetyTolerance": ["INT", {"default": 2, "min": 0, "max": 5, "tooltip": "Tolerance level for content moderation. Lower values are stricter; higher values are more permissive.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.bfl.promptUpsampling": {"path": ["providerSettings", "bfl", "promptUpsampling"], "kind": "scalar", "omit_value": false}, "providerSettings.bfl.safetyTolerance": {"path": ["providerSettings", "bfl", "safetyTolerance"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bfl_flux_1_kontext_pro", "name": "FLUX.1 Kontext [pro]", "model": "bfl:3@1", "task_type": "imageInference", "creator": "bfl", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.bfl.promptUpsampling": ["BOOLEAN", {"default": false, "tooltip": "Enable automatic enhancement and expansion of the input prompt.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.bfl.safetyTolerance": ["INT", {"default": 2, "min": 0, "max": 5, "tooltip": "Tolerance level for content moderation. Lower values are stricter; higher values are more permissive.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.bfl.promptUpsampling": {"path": ["providerSettings", "bfl", "promptUpsampling"], "kind": "scalar", "omit_value": false}, "providerSettings.bfl.safetyTolerance": {"path": ["providerSettings", "bfl", "safetyTolerance"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bfl_flux_erase", "name": "FLUX Erase", "model": "bfl:flux@erase", "task_type": "imageInference", "creator": "bfl", "input_types": {"required": {"image": ["IMAGE"], "mask": ["IMAGE"]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.dilatePixels": ["INT", {"default": 10, "min": 0, "max": 25, "tooltip": "Expands the mask boundary by this many pixels before erasing. Helps the model fully cover object edges and catch details the mask may have missed, such as thin outlines, soft edges, or partial shadows. For masks generated by SAM or similar segmentation tools, start with 10. For soft-edged subjects like hair, fur, or smoke, use 15-20.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "mask": {"path": ["inputs", "mask"], "kind": "image_scalar"}, "settings.dilatePixels": {"path": ["settings", "dilatePixels"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bfl_flux_1_kontext_max", "name": "FLUX.1 Kontext [max]", "model": "bfl:4@1", "task_type": "imageInference", "creator": "bfl", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.bfl.promptUpsampling": ["BOOLEAN", {"default": false, "tooltip": "Enable automatic enhancement and expansion of the input prompt.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.bfl.safetyTolerance": ["INT", {"default": 2, "min": 0, "max": 5, "tooltip": "Tolerance level for content moderation. Lower values are stricter; higher values are more permissive.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.bfl.promptUpsampling": {"path": ["providerSettings", "bfl", "promptUpsampling"], "kind": "scalar", "omit_value": false}, "providerSettings.bfl.safetyTolerance": {"path": ["providerSettings", "bfl", "safetyTolerance"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bfl_flux_1_fill_dev", "name": "FLUX.1 Fill [dev]", "model": "runware:102@1", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"acePlusPlus.images": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "controlNet": ["RUNWARE_CONTROLNET", {"rw_socket_models": ["runware:25@1", "runware:26@1", "runware:27@1", "runware:28@1", "runware:29@1", "runware:30@1", "runware:31@1", "runware:98@1"], "rw_socket_fields": ["controlMode", "endStep", "endStepPercentage", "guideImage", "model", "startStep", "startStepPercentage", "weight"], "rw_socket_enums": {"controlMode": ["balanced", "controlnet", "prompt"]}, "rw_cat": "inputs"}], "ipAdapters": ["RUNWARE_IPADAPTERS", {"rw_socket_models": ["runware:56@1", "runware:56@2", "runware:56@3", "runware:56@4"], "rw_socket_fields": ["guideImages", "model", "weight"], "rw_cat": "inputs"}], "pulid": ["RUNWARE_PULID"], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "acePlusPlus.masks": ["IMAGE"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "trueCFGScale": ["BOOLEAN", {"default": false, "rw_gates": "trueCFGScale_value", "tooltip": "Enable to set trueCFGScale. Off uses the model's default.", "rw_cat": "core"}], "trueCFGScale_value": ["FLOAT", {"tooltip": "True Classifier-Free Guidance scale. Higher values increase prompt adherence at the cost of quality.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "promptWeighting": [["(default)", "sdEmbeds"], {"tooltip": "Syntax used for prompt weighting.", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "layerDiffuse": ["BOOLEAN", {"default": false, "tooltip": "LayerDiffuse for transparent image generation.", "rw_cat": "core"}], "acePlusPlus.repaintingScale": ["FLOAT", {"default": 0, "min": 0, "max": 1, "step": 0.01, "tooltip": "Balances original character identity (0.0) vs prompt adherence (1.0). Lower values preserve stronger character resemblance.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "acePlusPlus.type": [["portrait", "subject", "local_editing"], {"default": "portrait", "tooltip": "Task mode for ACE++ generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: hiresFix"}]}}, "param_plan": {"acePlusPlus.type": {"path": ["acePlusPlus", "type"], "kind": "scalar"}, "acePlusPlus.images": {"path": ["acePlusPlus", "images"], "kind": "image_array"}, "acePlusPlus.masks": {"path": ["acePlusPlus", "masks"], "kind": "image_array"}, "acePlusPlus.repaintingScale": {"path": ["acePlusPlus", "repaintingScale"], "kind": "scalar"}, "seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "promptWeighting": {"path": ["promptWeighting"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "controlNet": {"path": ["controlNet"], "kind": "feature"}, "ipAdapters": {"path": ["ipAdapters"], "kind": "feature"}, "layerDiffuse": {"path": ["layerDiffuse"], "kind": "scalar", "omit_value": false}, "pulid": {"path": ["pulid"], "kind": "feature"}, "trueCFGScale": {"path": ["trueCFGScale"], "kind": "gate", "value_key": "trueCFGScale_value"}, "trueCFGScale_value": {"path": ["trueCFGScale"], "kind": "skip"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bfl_flux_2_klein_4b_base", "name": "FLUX.2 [klein] 4B Base", "model": "runware:400@5", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 16, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 16, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 28, "min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 3.5, "min": 1, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "acceleration": [["(default)", "none", "low", "medium", "high"], {"default": "(default)", "tooltip": "Optimization level.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "acceleration": {"path": ["acceleration"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bfl_flux_outpainting", "name": "FLUX Outpainting", "model": "bfl:flux@outpainting", "task_type": "imageInference", "creator": "bfl", "input_types": {"required": {"image": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["bottom", "left", "right", "top"], "rw_cat": "inputs"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.autoCrop": ["BOOLEAN", {"default": false, "tooltip": "If true, crop the reference image to the canvas bounds when it extends beyond the edges. Defaults to false (out-of-bounds placements return 422).", "rw_cat": "settings"}], "settings.mode": [["high", "fast"], {"default": "high", "tooltip": "Generation mode trading quality for speed.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "settings.autoCrop": {"path": ["settings", "autoCrop"], "kind": "scalar", "omit_value": false}, "settings.mode": {"path": ["settings", "mode"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bfl_flux_1_1_pro_ultra", "name": "FLUX.1.1 [pro] Ultra", "model": "bfl:2@2", "task_type": "imageInference", "creator": "bfl", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.bfl.promptUpsampling": ["BOOLEAN", {"default": false, "tooltip": "Enable automatic enhancement and expansion of the input prompt.", "rw_cat": "settings"}], "providerSettings.bfl.raw": ["BOOLEAN", {"default": false, "tooltip": "Enable raw mode to produce images closer to direct model output without post-processing.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.bfl.safetyTolerance": ["INT", {"default": 2, "min": 0, "max": 5, "tooltip": "Tolerance level for content moderation. Lower values are stricter; higher values are more permissive.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.bfl.promptUpsampling": {"path": ["providerSettings", "bfl", "promptUpsampling"], "kind": "scalar", "omit_value": false}, "providerSettings.bfl.raw": {"path": ["providerSettings", "bfl", "raw"], "kind": "scalar", "omit_value": false}, "providerSettings.bfl.safetyTolerance": {"path": ["providerSettings", "bfl", "safetyTolerance"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bfl_flux_2_klein_9b_base", "name": "FLUX.2 [klein] 9B Base", "model": "runware:400@3", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 16, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 16, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 28, "min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 3.5, "min": 1, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "acceleration": [["(default)", "none", "low", "medium", "high"], {"default": "(default)", "tooltip": "Optimization level.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "acceleration": {"path": ["acceleration"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bfl_flux_1_kontext_dev", "name": "FLUX.1 Kontext [dev]", "model": "runware:106@1", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "fbCache", "fbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "trueCFGScale": ["BOOLEAN", {"default": false, "rw_gates": "trueCFGScale_value", "tooltip": "Enable to set trueCFGScale. Off uses the model's default.", "rw_cat": "core"}], "trueCFGScale_value": ["FLOAT", {"tooltip": "True Classifier-Free Guidance scale. Higher values increase prompt adherence at the cost of quality.", "default": 0.0, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "trueCFGScale": {"path": ["trueCFGScale"], "kind": "gate", "value_key": "trueCFGScale_value"}, "trueCFGScale_value": {"path": ["trueCFGScale"], "kind": "skip"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bfl_flux_1_schnell", "name": "FLUX.1 [schnell]", "model": "runware:100@1", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "fbCache", "fbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "trueCFGScale": ["BOOLEAN", {"default": false, "rw_gates": "trueCFGScale_value", "tooltip": "Enable to set trueCFGScale. Off uses the model's default.", "rw_cat": "core"}], "trueCFGScale_value": ["FLOAT", {"tooltip": "True Classifier-Free Guidance scale. Higher values increase prompt adherence at the cost of quality.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "promptWeighting": [["(default)", "sdEmbeds"], {"tooltip": "Syntax used for prompt weighting.", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: hiresFix"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "promptWeighting": {"path": ["promptWeighting"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "trueCFGScale": {"path": ["trueCFGScale"], "kind": "gate", "value_key": "trueCFGScale_value"}, "trueCFGScale_value": {"path": ["trueCFGScale"], "kind": "skip"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bfl_flux_1_dev", "name": "FLUX.1 [dev]", "model": "runware:101@1", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "controlNet": ["RUNWARE_CONTROLNET", {"rw_socket_models": ["runware:25@1", "runware:26@1", "runware:27@1", "runware:28@1", "runware:29@1", "runware:30@1", "runware:31@1", "runware:98@1"], "rw_socket_fields": ["controlMode", "endStep", "endStepPercentage", "guideImage", "model", "startStep", "startStepPercentage", "weight"], "rw_socket_enums": {"controlMode": ["balanced", "controlnet", "prompt"]}, "rw_cat": "inputs"}], "ipAdapters": ["RUNWARE_IPADAPTERS", {"rw_socket_models": ["runware:56@1", "runware:56@2", "runware:56@3", "runware:56@4"], "rw_socket_fields": ["guideImages", "model", "weight"], "rw_cat": "inputs"}], "pulid": ["RUNWARE_PULID"], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "trueCFGScale": ["BOOLEAN", {"default": false, "rw_gates": "trueCFGScale_value", "tooltip": "Enable to set trueCFGScale. Off uses the model's default.", "rw_cat": "core"}], "trueCFGScale_value": ["FLOAT", {"tooltip": "True Classifier-Free Guidance scale. Higher values increase prompt adherence at the cost of quality.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "promptWeighting": [["(default)", "sdEmbeds"], {"tooltip": "Syntax used for prompt weighting.", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "layerDiffuse": ["BOOLEAN", {"default": false, "tooltip": "LayerDiffuse for transparent image generation.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: hiresFix"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "promptWeighting": {"path": ["promptWeighting"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "controlNet": {"path": ["controlNet"], "kind": "feature"}, "ipAdapters": {"path": ["ipAdapters"], "kind": "feature"}, "layerDiffuse": {"path": ["layerDiffuse"], "kind": "scalar", "omit_value": false}, "pulid": {"path": ["pulid"], "kind": "feature"}, "trueCFGScale": {"path": ["trueCFGScale"], "kind": "gate", "value_key": "trueCFGScale_value"}, "trueCFGScale_value": {"path": ["trueCFGScale"], "kind": "skip"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bfl_flux_1_1_pro", "name": "FLUX.1.1 [pro]", "model": "bfl:2@1", "task_type": "imageInference", "creator": "bfl", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 256, "max": 1440, "step": 32, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 256, "max": 1440, "step": 32, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.bfl.promptUpsampling": ["BOOLEAN", {"default": false, "tooltip": "Enable automatic enhancement and expansion of the input prompt.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.bfl.safetyTolerance": ["INT", {"default": 2, "min": 0, "max": 5, "tooltip": "Tolerance level for content moderation. Lower values are stricter; higher values are more permissive.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.bfl.promptUpsampling": {"path": ["providerSettings", "bfl", "promptUpsampling"], "kind": "scalar", "omit_value": false}, "providerSettings.bfl.safetyTolerance": {"path": ["providerSettings", "bfl", "safetyTolerance"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bfl_flux_2_pro", "name": "FLUX.2 [pro]", "model": "bfl:5@1", "task_type": "imageInference", "creator": "bfl", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 256, "max": 2048, "step": 16, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 256, "max": 2048, "step": 16, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.bfl.safetyTolerance": ["INT", {"default": 2, "min": 0, "max": 5, "tooltip": "Tolerance level for content moderation. Lower values are stricter; higher values are more permissive.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.bfl.safetyTolerance": {"path": ["providerSettings", "bfl", "safetyTolerance"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bfl_flux_2_klein_9b_kv", "name": "FLUX.2 [klein] 9B KV", "model": "runware:400@6", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 16, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 16, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 4, "min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 3.5, "min": 1, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "acceleration": [["(default)", "none", "low", "medium", "high"], {"default": "(default)", "tooltip": "Optimization level.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "acceleration": {"path": ["acceleration"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bfl_flux_1_expand_pro", "name": "FLUX.1 Expand [pro]", "model": "bfl:1@3", "task_type": "imageInference", "creator": "bfl", "input_types": {"required": {"seedImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["bottom", "left", "right", "top"], "rw_cat": "inputs"}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "steps": ["INT", {"default": 50, "min": 15, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 60, "min": 1.5, "max": 100, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.bfl.promptUpsampling": ["BOOLEAN", {"default": false, "tooltip": "Enable automatic enhancement and expansion of the input prompt.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.bfl.safetyTolerance": ["INT", {"default": 2, "min": 0, "max": 5, "tooltip": "Tolerance level for content moderation. Lower values are stricter; higher values are more permissive.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "providerSettings.bfl.promptUpsampling": {"path": ["providerSettings", "bfl", "promptUpsampling"], "kind": "scalar", "omit_value": false}, "providerSettings.bfl.safetyTolerance": {"path": ["providerSettings", "bfl", "safetyTolerance"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bfl_flux_1_fill_pro", "name": "FLUX.1 Fill [pro]", "model": "bfl:1@2", "task_type": "imageInference", "creator": "bfl", "input_types": {"required": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 50, "min": 15, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 60, "min": 1.5, "max": 100, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.bfl.promptUpsampling": ["BOOLEAN", {"default": false, "tooltip": "Enable automatic enhancement and expansion of the input prompt.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.bfl.safetyTolerance": ["INT", {"default": 2, "min": 0, "max": 5, "tooltip": "Tolerance level for content moderation. Lower values are stricter; higher values are more permissive.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "providerSettings.bfl.promptUpsampling": {"path": ["providerSettings", "bfl", "promptUpsampling"], "kind": "scalar", "omit_value": false}, "providerSettings.bfl.safetyTolerance": {"path": ["providerSettings", "bfl", "safetyTolerance"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bfl_flux_2_dev", "name": "FLUX.2 [dev]", "model": "runware:400@1", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 512, "max": 2048, "step": 16, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 512, "max": 2048, "step": 16, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 4, "min": 1, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "acceleration": [["(default)", "none", "low", "medium", "high"], {"default": "(default)", "tooltip": "Optimization level.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "acceleration": {"path": ["acceleration"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_tencent_hunyuan_3d_3_1_rapid", "name": "Hunyuan 3D 3.1 Rapid", "model": "tencent:hunyuan-3d@3.1-rapid", "task_type": "3dInference", "creator": "tencent", "input_types": {"required": {}, "optional": {"image": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.geometryOnly": ["BOOLEAN", {"default": false, "tooltip": "Generate a texture-free geometry model (white model).", "rw_cat": "settings"}], "settings.pbr": ["BOOLEAN", {"default": false, "tooltip": "Enable PBR (Physically Based Rendering) material generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["GLB"], {"default": "GLB", "tooltip": "File format for the generated 3D model.", "rw_cat": "output"}]}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "settings.geometryOnly": {"path": ["settings", "geometryOnly"], "kind": "scalar", "omit_value": false}, "settings.pbr": {"path": ["settings", "pbr"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}}}, {"key": "Runware_tencent_hunyuan_3d_3_1_pro", "name": "Hunyuan 3D 3.1 Pro", "model": "tencent:hunyuan-3d@3.1-pro", "task_type": "3dInference", "creator": "tencent", "input_types": {"required": {}, "optional": {"images": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.faceCount": ["INT", {"default": 500000, "min": 3000, "max": 1500000, "tooltip": "Number of faces (polygons) in the generated 3D model.", "rw_cat": "settings"}], "settings.generateType": [["Normal", "Geometry"], {"default": "Normal", "tooltip": "Generation mode for 3D model creation.", "rw_cat": "settings"}], "settings.pbr": ["BOOLEAN", {"default": false, "tooltip": "Enable PBR (Physically Based Rendering) material generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["GLB"], {"default": "GLB", "tooltip": "File format for the generated 3D model.", "rw_cat": "output"}]}}, "param_plan": {"images": {"path": ["inputs", "images"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "settings.faceCount": {"path": ["settings", "faceCount"], "kind": "scalar"}, "settings.generateType": {"path": ["settings", "generateType"], "kind": "scalar"}, "settings.pbr": {"path": ["settings", "pbr"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}}}, {"key": "Runware_tencent_hunyuanimage_3_0", "name": "HunyuanImage-3.0", "model": "runware:180@1", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"default": 1024, "step": 16, "tooltip": "Width of the generated media in pixels.", "rw_cat": "core"}], "height": ["INT", {"default": 1024, "step": 16, "tooltip": "Height of the generated media in pixels.", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 20, "min": 1, "max": 100, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 7, "min": 1.1, "max": 50, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "acceleration": [["(default)", "none", "high"], {"default": "(default)", "tooltip": "Optimization level.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "acceleration": {"path": ["acceleration"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_anthropic_claude_sonnet_4_6", "name": "Claude Sonnet 4.6", "model": "anthropic:claude@sonnet-4.6", "task_type": "textInference", "creator": "anthropic", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"images": ["IMAGE"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.maxTokens": ["INT", {"default": 4096, "min": 1, "max": 65536, "tooltip": "Maximum number of tokens to generate in the response.", "rw_cat": "settings"}], "settings.cache.scope": [["system", "system+history"], {"default": "system+history", "tooltip": "Controls which parts of the request are cached.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.thinkingLevel": [["(default)", "off", "low", "medium", "high", "max", "adaptive"], {"tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "default": "(default)", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "outputFormat": [["TEXT"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "settings.cache.ttl": [["5m", "1h"], {"default": "5m", "tooltip": "Time-to-live for the cache.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.documents, settings.stopSequences, tools"}]}}, "param_plan": {"images": {"path": ["inputs", "images"], "kind": "image_array"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.cache.scope": {"path": ["settings", "cache", "scope"], "kind": "scalar"}, "settings.cache.ttl": {"path": ["settings", "cache", "ttl"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar", "omit_value": "(default)"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_anthropic_claude_opus_4_7", "name": "Claude Opus 4.7", "model": "anthropic:claude@opus-4.7", "task_type": "textInference", "creator": "anthropic", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"images": ["IMAGE"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.maxTokens": ["INT", {"default": 4096, "min": 1, "max": 128000, "tooltip": "Maximum number of tokens to generate in the response.", "rw_cat": "settings"}], "settings.cache.scope": [["system", "system+history"], {"default": "system+history", "tooltip": "Controls which parts of the request are cached.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.thinkingLevel": [["(default)", "off", "low", "medium", "high", "max", "xhigh", "adaptive"], {"tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "default": "(default)", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "outputFormat": [["TEXT"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "settings.cache.ttl": [["5m", "1h"], {"default": "5m", "tooltip": "Time-to-live for the cache.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.documents, settings.stopSequences, tools"}]}}, "param_plan": {"images": {"path": ["inputs", "images"], "kind": "image_array"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.cache.scope": {"path": ["settings", "cache", "scope"], "kind": "scalar"}, "settings.cache.ttl": {"path": ["settings", "cache", "ttl"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar", "omit_value": "(default)"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_anthropic_claude_opus_4_8", "name": "Claude Opus 4.8", "model": "anthropic:claude@opus-4.8", "task_type": "textInference", "creator": "anthropic", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"images": ["IMAGE"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.maxTokens": ["INT", {"default": 4096, "min": 1, "max": 128000, "tooltip": "Maximum number of tokens to generate in the response.", "rw_cat": "settings"}], "settings.cache.scope": [["system", "system+history"], {"default": "system+history", "tooltip": "Controls which parts of the request are cached.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.thinkingLevel": [["(default)", "off", "low", "medium", "high", "max", "xhigh", "adaptive"], {"tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "default": "(default)", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "outputFormat": [["TEXT"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "settings.cache.ttl": [["5m", "1h"], {"default": "5m", "tooltip": "Time-to-live for the cache.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.documents, settings.stopSequences, tools"}]}}, "param_plan": {"images": {"path": ["inputs", "images"], "kind": "image_array"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.cache.scope": {"path": ["settings", "cache", "scope"], "kind": "scalar"}, "settings.cache.ttl": {"path": ["settings", "cache", "ttl"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar", "omit_value": "(default)"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_anthropic_claude_haiku_4_5", "name": "Claude Haiku 4.5", "model": "anthropic:claude@haiku-4.5", "task_type": "textInference", "creator": "anthropic", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"images": ["IMAGE"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.maxTokens": ["INT", {"default": 4096, "min": 1, "max": 64000, "tooltip": "Maximum number of tokens to generate in the response.", "rw_cat": "settings"}], "settings.cache.scope": [["system", "system+history"], {"default": "system+history", "tooltip": "Controls which parts of the request are cached.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.thinkingLevel": [["(default)", "off", "low", "medium", "high"], {"tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "default": "(default)", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "outputFormat": [["TEXT"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "settings.cache.ttl": [["5m", "1h"], {"default": "5m", "tooltip": "Time-to-live for the cache.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.documents, settings.stopSequences, tools"}]}}, "param_plan": {"images": {"path": ["inputs", "images"], "kind": "image_array"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.cache.scope": {"path": ["settings", "cache", "scope"], "kind": "scalar"}, "settings.cache.ttl": {"path": ["settings", "cache", "ttl"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar", "omit_value": "(default)"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_anthropic_claude_fable_5", "name": "Claude Fable 5", "model": "anthropic:claude@fable-5", "task_type": "textInference", "creator": "anthropic", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"images": ["IMAGE"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.maxTokens": ["BOOLEAN", {"default": false, "rw_gates": "settings.maxTokens_value", "tooltip": "Enable to set settings.maxTokens. Off uses the model's default.", "rw_cat": "settings"}], "settings.maxTokens_value": ["INT", {"min": 1, "max": 128000, "tooltip": "Maximum number of tokens to generate in the response.", "default": 1, "rw_cat": "settings"}], "settings.cache.scope": [["system", "system+history"], {"default": "system+history", "tooltip": "Controls which parts of the request are cached.", "rw_cat": "settings"}], "settings.splitThinking": ["BOOLEAN", {"default": true, "tooltip": "When enabled, the model's internal reasoning is separated from the main response and returned in a dedicated `reasoningContent` field.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.thinkingLevel": [["low", "medium", "high", "xhigh", "max", "adaptive"], {"default": "high", "tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "outputFormat": [["TEXT", "JSON"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "settings.cache.ttl": [["5m", "1h"], {"default": "5m", "tooltip": "Time-to-live for the cache.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.documents, settings.stopSequences, jsonSchema, tools"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "images": {"path": ["inputs", "images"], "kind": "image_array"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.cache.scope": {"path": ["settings", "cache", "scope"], "kind": "scalar"}, "settings.cache.ttl": {"path": ["settings", "cache", "ttl"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "gate", "value_key": "settings.maxTokens_value"}, "settings.maxTokens_value": {"path": ["settings", "maxTokens"], "kind": "skip"}, "settings.splitThinking": {"path": ["settings", "splitThinking"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_bria_rmbg_v2_0", "name": "Bria RMBG v2.0", "model": "bria:2@1", "task_type": "removeBackground", "creator": "bria", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"providerSettings.bria.preserveAlpha": ["BOOLEAN", {"default": false, "tooltip": "Enable alpha channel preservation in output. Only affects images that already contain an alpha channel.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"providerSettings.bria.preserveAlpha": {"path": ["providerSettings", "bria", "preserveAlpha"], "kind": "scalar", "omit_value": false}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_bria_video_increase_resolution", "name": "Bria Video Increase Resolution", "model": "bria:50@1", "task_type": "upscale", "creator": "bria", "input_types": {"required": {"video": ["STRING", {"tooltip": "Video input (UUID or URL).", "rw_cat": "core"}]}, "optional": {"upscaleFactor": [[2, 4], {"default": 2, "tooltip": "Factor by which to upscale the generated image. A value of 2 doubles width and height.", "rw_cat": "core"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"upscaleFactor": {"path": ["upscaleFactor"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "video": {"path": ["inputs", "video"], "kind": "scalar"}}}, {"key": "Runware_bria_image_replace_background", "name": "Bria Image Replace Background", "model": "bria:11@1", "task_type": "imageInference", "creator": "bria", "input_types": {"required": {"image": ["IMAGE"], "width": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.bria.enhanceReferenceImages": ["BOOLEAN", {"default": true, "tooltip": "Apply additional enhancement to reference images.", "rw_cat": "settings"}], "providerSettings.bria.forceBackgroundDetection": ["BOOLEAN", {"default": false, "tooltip": "Force background detection even with existing alpha channel.", "rw_cat": "settings"}], "providerSettings.bria.mode": [["base", "high_control", "fast"], {"default": "base", "tooltip": "Background generation behavior controlling quality, prompt adherence and speed.", "rw_cat": "settings"}], "providerSettings.bria.originalQuality": ["BOOLEAN", {"default": true, "tooltip": "Retain original image resolution. When disabled, output is scaled to 1MP while preserving the original aspect ratio.", "rw_cat": "settings"}], "providerSettings.bria.refinePrompt": ["BOOLEAN", {"default": true, "tooltip": "Automatically refine and optimize prompt.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.bria.enhanceReferenceImages": {"path": ["providerSettings", "bria", "enhanceReferenceImages"], "kind": "scalar"}, "providerSettings.bria.forceBackgroundDetection": {"path": ["providerSettings", "bria", "forceBackgroundDetection"], "kind": "scalar", "omit_value": false}, "providerSettings.bria.mode": {"path": ["providerSettings", "bria", "mode"], "kind": "scalar"}, "providerSettings.bria.originalQuality": {"path": ["providerSettings", "bria", "originalQuality"], "kind": "scalar"}, "providerSettings.bria.refinePrompt": {"path": ["providerSettings", "bria", "refinePrompt"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bria_fibo", "name": "Bria FIBO", "model": "bria:20@1", "task_type": "imageInference", "creator": "bria", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"image": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 50, "min": 20, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "CFGScale": [[3, 4, 5], {"default": 5, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.bria.ipSignal": ["BOOLEAN", {"default": false, "tooltip": "Flag potential IP-related content in prompt or output.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "providerSettings.bria.ipSignal": {"path": ["providerSettings", "bria", "ipSignal"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bria_image_increase_resolution", "name": "Bria Image Increase Resolution", "model": "bria:52@1", "task_type": "upscale", "creator": "bria", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"upscaleFactor": [[2, 4], {"default": 2, "tooltip": "Factor by which to upscale the generated image. A value of 2 doubles width and height.", "rw_cat": "core"}], "providerSettings.bria.preserveAlpha": ["BOOLEAN", {"default": false, "tooltip": "Enable alpha channel preservation in output. Only affects images that already contain an alpha channel.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"upscaleFactor": {"path": ["upscaleFactor"], "kind": "scalar"}, "providerSettings.bria.preserveAlpha": {"path": ["providerSettings", "bria", "preserveAlpha"], "kind": "scalar", "omit_value": false}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_bria_video_background_removal", "name": "Bria Video Background Removal", "model": "bria:51@1", "task_type": "removeBackground", "creator": "bria", "input_types": {"required": {"video": ["STRING", {"tooltip": "Video input (UUID or URL).", "rw_cat": "core"}]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: providerSettings.bria.rgba"}]}}, "param_plan": {"ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "video": {"path": ["inputs", "video"], "kind": "scalar"}}}, {"key": "Runware_bria_video_eraser", "name": "Bria Video Eraser", "model": "bria:60@1", "task_type": "videoInference", "creator": "bria", "input_types": {"required": {"video": ["STRING", {"tooltip": "Video input (UUID or URL).", "rw_cat": "core"}]}, "optional": {"numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "mask": ["STRING", {"tooltip": "Mask video specifying areas to erase (UUID or URL).", "default": "", "rw_cat": "core"}], "providerSettings.bria.autoTrim": ["BOOLEAN", {"default": false, "tooltip": "Automatically trim videos exceeding 5 seconds.", "rw_cat": "settings"}], "providerSettings.bria.mask.foreground": ["BOOLEAN", {"default": false, "tooltip": "Enable automatic foreground object detection.", "rw_cat": "settings"}], "providerSettings.bria.mask.frameIndex": ["BOOLEAN", {"default": false, "rw_gates": "providerSettings.bria.mask.frameIndex_value", "tooltip": "Enable to set providerSettings.bria.mask.frameIndex. Off uses the model's default.", "rw_cat": "settings"}], "providerSettings.bria.mask.frameIndex_value": ["INT", {"min": 0, "tooltip": "Frame number for key points.", "default": 0, "rw_cat": "settings"}], "providerSettings.bria.preserveAudio": ["BOOLEAN", {"default": true, "tooltip": "Preserve original audio track.", "rw_cat": "settings"}], "providerSettings.bria.mask.prompt": ["STRING", {"tooltip": "Text description of object to remove.", "multiline": true, "default": "", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: providerSettings.bria.mask.keyPoints"}]}}, "param_plan": {"video": {"path": ["inputs", "video"], "kind": "scalar"}, "mask": {"path": ["inputs", "mask"], "kind": "scalar", "omit_empty": true}, "providerSettings.bria.autoTrim": {"path": ["providerSettings", "bria", "autoTrim"], "kind": "scalar", "omit_value": false}, "providerSettings.bria.mask.foreground": {"path": ["providerSettings", "bria", "mask", "foreground"], "kind": "scalar", "omit_value": false}, "providerSettings.bria.mask.prompt": {"path": ["providerSettings", "bria", "mask", "prompt"], "kind": "scalar", "omit_empty": true}, "providerSettings.bria.mask.frameIndex": {"path": ["providerSettings", "bria", "mask", "frameIndex"], "kind": "gate", "value_key": "providerSettings.bria.mask.frameIndex_value"}, "providerSettings.bria.mask.frameIndex_value": {"path": ["providerSettings", "bria", "mask", "frameIndex"], "kind": "skip"}, "providerSettings.bria.preserveAudio": {"path": ["providerSettings", "bria", "preserveAudio"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_bria_fibo_edit", "name": "Bria FIBO Edit", "model": "bria:21@1", "task_type": "imageInference", "creator": "bria", "input_types": {"required": {"image": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "mask": ["IMAGE"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 50, "min": 20, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "CFGScale": [[3, 4, 5], {"default": 5, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.bria.ipSignal": ["BOOLEAN", {"default": false, "tooltip": "Flag potential IP-related content in prompt or output.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "mask": {"path": ["inputs", "mask"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "providerSettings.bria.ipSignal": {"path": ["providerSettings", "bria", "ipSignal"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bria_fibo_lite", "name": "Bria FIBO Lite", "model": "bria:20@3", "task_type": "imageInference", "creator": "bria", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"image": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "CFGScale": [[3, 4, 5], {"default": 5, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.bria.ipSignal": ["BOOLEAN", {"default": false, "tooltip": "Flag potential IP-related content in prompt or output.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "providerSettings.bria.ipSignal": {"path": ["providerSettings", "bria", "ipSignal"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bria_3_2", "name": "Bria 3.2", "model": "bria:10@1", "task_type": "imageInference", "creator": "bria", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 20, "min": 20, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.bria.contentModeration": ["BOOLEAN", {"default": true, "tooltip": "Apply content moderation to inputs and outputs.", "rw_cat": "settings"}], "providerSettings.bria.enhanceImage": ["BOOLEAN", {"default": false, "tooltip": "Generate images with richer details and sharper textures.", "rw_cat": "settings"}], "providerSettings.bria.ipSignal": ["BOOLEAN", {"default": false, "tooltip": "Flag potential IP-related content in prompt or output.", "rw_cat": "settings"}], "providerSettings.bria.medium": [["(default)", "photography", "art"], {"tooltip": "Artistic medium.", "default": "(default)", "rw_cat": "settings"}], "providerSettings.bria.promptEnhancement": ["BOOLEAN", {"default": false, "tooltip": "Expand prompt with descriptive variations.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "providerSettings.bria.contentModeration": {"path": ["providerSettings", "bria", "contentModeration"], "kind": "scalar"}, "providerSettings.bria.enhanceImage": {"path": ["providerSettings", "bria", "enhanceImage"], "kind": "scalar", "omit_value": false}, "providerSettings.bria.ipSignal": {"path": ["providerSettings", "bria", "ipSignal"], "kind": "scalar", "omit_value": false}, "providerSettings.bria.medium": {"path": ["providerSettings", "bria", "medium"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.bria.promptEnhancement": {"path": ["providerSettings", "bria", "promptEnhancement"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bria_fibo_edit_tools", "name": "Bria Fibo Edit Tools", "model": "bria:21@2", "task_type": "imageInference", "creator": "bria", "input_types": {"required": {"image": ["IMAGE"], "providerSettings.bria.edit": [["colorize", "relight", "restore", "blend", "reseason", "sketch_to_image", "expand"], {"tooltip": "The specific editing workflow to apply.", "rw_cat": "settings"}]}, "optional": {"outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["bottom", "left", "right", "top"], "rw_cat": "inputs"}], "watermark": ["RUNWARE_WATERMARK"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.bria.color": [["(default)", "contemporary color", "vivid color", "black and white colors", "sepia vintage"], {"tooltip": "Color style for the colorize operation.", "default": "(default)", "rw_cat": "settings"}], "providerSettings.bria.contentModeration": ["BOOLEAN", {"default": true, "tooltip": "Apply content moderation to inputs and outputs.", "rw_cat": "settings"}], "providerSettings.bria.lightDirection": [["(default)", "front", "side", "bottom", "top-down"], {"tooltip": "Direction of the light for the relight operation.", "default": "(default)", "rw_cat": "settings"}], "providerSettings.bria.lightType": [["(default)", "midday", "blue hour light", "low-angle sunlight", "sunrise light", "spotlight on subject", "keep background settings", "overcast light", "soft overcast daylight lighting", "cloud-filtered lighting", "fog-diffused lighting", "moonlight lighting", "starlight lighting nighttime", "soft bokeh lighting", "harsh studio lighting keep background setting"], {"tooltip": "Type of lightning to apply in the relight operation.", "default": "(default)", "rw_cat": "settings"}], "providerSettings.bria.preserveAlpha": ["BOOLEAN", {"default": false, "tooltip": "Enable alpha channel preservation in output. Only affects images that already contain an alpha channel.", "rw_cat": "settings"}], "providerSettings.bria.promptContentModeration": ["BOOLEAN", {"default": true, "tooltip": "Scan input prompt for restricted terms.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.bria.season": [["(default)", "spring", "summer", "autumn", "winter"], {"tooltip": "Target season for the reseason operation.", "default": "(default)", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "providerSettings.bria.color": {"path": ["providerSettings", "bria", "color"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.bria.contentModeration": {"path": ["providerSettings", "bria", "contentModeration"], "kind": "scalar"}, "providerSettings.bria.edit": {"path": ["providerSettings", "bria", "edit"], "kind": "scalar"}, "providerSettings.bria.lightDirection": {"path": ["providerSettings", "bria", "lightDirection"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.bria.lightType": {"path": ["providerSettings", "bria", "lightType"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.bria.preserveAlpha": {"path": ["providerSettings", "bria", "preserveAlpha"], "kind": "scalar", "omit_value": false}, "providerSettings.bria.promptContentModeration": {"path": ["providerSettings", "bria", "promptContentModeration"], "kind": "scalar"}, "providerSettings.bria.season": {"path": ["providerSettings", "bria", "season"], "kind": "scalar", "omit_value": "(default)"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_lightricks_ltx_2_fast", "name": "LTX-2 Fast", "model": "lightricks:2@1", "task_type": "videoInference", "creator": "lightricks", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "duration": [[6, 8, 10], {"default": 6, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "fps": [[25, 50], {"default": 25, "tooltip": "Frames per second for video generation. Higher values create smoother motion but require more processing time.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.lightricks.generateAudio": ["BOOLEAN", {"default": false, "tooltip": "Generate synchronized audio.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "fps": {"path": ["fps"], "kind": "scalar"}, "providerSettings.lightricks.generateAudio": {"path": ["providerSettings", "lightricks", "generateAudio"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_lightricks_ltx_2_3", "name": "LTX-2.3", "model": "lightricks:ltx@2.3", "task_type": "videoInference", "creator": "lightricks", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "duration": ["FLOAT", {"min": 1, "max": 20, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "default": 1.0, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "transformer", "weight"], "rw_socket_enums": {"transformer": ["high", "low", "both"]}, "rw_cat": "inputs"}], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL). Enables audio-to-video conditioning. The audio is merged with the generated video and trimmed to fit the video duration. Maximum duration 30 seconds.", "default": "", "rw_cat": "core"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 40, "min": 1, "max": 100, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 4, "min": 1, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "fps": ["INT", {"default": 25, "min": 1, "max": 120, "tooltip": "Frames per second for video generation. Higher values create smoother motion but require more processing time.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.enhancePrompt": ["BOOLEAN", {"default": true, "tooltip": "Enable automatic prompt enhancement for cinematic results.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "audio": {"path": ["inputs", "audio"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "fps": {"path": ["fps"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "lora": {"path": ["lora"], "kind": "feature"}, "settings.enhancePrompt": {"path": ["settings", "enhancePrompt"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_lightricks_ltx_2_pro", "name": "LTX-2 Pro", "model": "lightricks:2@0", "task_type": "videoInference", "creator": "lightricks", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL). Duration must be between 2 and 20 seconds.", "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 1, "max": 50, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 1.0, "rw_cat": "core"}], "duration": [[6, 8, 10], {"default": 6, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "fps": [[24, 25, 50], {"default": 25, "tooltip": "Frames per second for video generation. Higher values create smoother motion but require more processing time.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.lightricks.generateAudio": ["BOOLEAN", {"default": false, "tooltip": "Generate synchronized audio.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "audio": {"path": ["inputs", "audio"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "fps": {"path": ["fps"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "providerSettings.lightricks.generateAudio": {"path": ["providerSettings", "lightricks", "generateAudio"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_lightricks_ltx_2", "name": "LTX-2", "model": "lightricks:ltx@2", "task_type": "videoInference", "creator": "lightricks", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "duration": ["INT", {"min": 1, "max": 20, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "default": 1, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "steps": ["INT", {"default": 40, "min": 1, "max": 100, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 4, "min": 1, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "fps": ["INT", {"default": 25, "min": 1, "max": 120, "tooltip": "Frames per second for video generation. Higher values create smoother motion but require more processing time.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.enhancePrompt": ["BOOLEAN", {"default": true, "tooltip": "Enable automatic prompt enhancement for cinematic results.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "fps": {"path": ["fps"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "settings.enhancePrompt": {"path": ["settings", "enhancePrompt"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_lightricks_ltx_2_retake", "name": "LTX-2 Retake", "model": "lightricks:3@1", "task_type": "videoInference", "creator": "lightricks", "input_types": {"required": {"video": ["STRING", {"tooltip": "Video input (UUID or URL).", "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.lightricks.duration": ["BOOLEAN", {"default": false, "rw_gates": "providerSettings.lightricks.duration_value", "tooltip": "Enable to set providerSettings.lightricks.duration. Off uses the model's default.", "rw_cat": "settings"}], "providerSettings.lightricks.duration_value": ["INT", {"min": 2, "max": 16, "tooltip": "Duration in seconds to regenerate. Combined with `startTime` must not exceed input video length.", "default": 2, "rw_cat": "settings"}], "providerSettings.lightricks.mode": [["replace_audio", "replace_video", "replace_audio_and_video"], {"default": "replace_audio_and_video", "tooltip": "Track replacement mode for the edited segment.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "providerSettings.lightricks.startTime": ["BOOLEAN", {"default": false, "rw_gates": "providerSettings.lightricks.startTime_value", "tooltip": "Enable to set providerSettings.lightricks.startTime. Off uses the model's default.", "rw_cat": "settings"}], "providerSettings.lightricks.startTime_value": ["INT", {"min": 0, "tooltip": "Start time in seconds for the regenerated segment. Must be within input video duration.", "default": 0, "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "video": {"path": ["inputs", "video"], "kind": "scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "providerSettings.lightricks.duration": {"path": ["providerSettings", "lightricks", "duration"], "kind": "gate", "value_key": "providerSettings.lightricks.duration_value"}, "providerSettings.lightricks.duration_value": {"path": ["providerSettings", "lightricks", "duration"], "kind": "skip"}, "providerSettings.lightricks.mode": {"path": ["providerSettings", "lightricks", "mode"], "kind": "scalar"}, "providerSettings.lightricks.startTime": {"path": ["providerSettings", "lightricks", "startTime"], "kind": "gate", "value_key": "providerSettings.lightricks.startTime_value"}, "providerSettings.lightricks.startTime_value": {"path": ["providerSettings", "lightricks", "startTime"], "kind": "skip"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_lightricks_ltx_2_3_fast", "name": "LTX-2.3 Fast", "model": "lightricks:ltx@2.3-fast", "task_type": "videoInference", "creator": "lightricks", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "duration": ["FLOAT", {"min": 1, "max": 20, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "default": 1.0, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "transformer", "weight"], "rw_socket_enums": {"transformer": ["high", "low", "both"]}, "rw_cat": "inputs"}], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL). Enables audio-to-video conditioning. The audio is merged with the generated video and trimmed to fit the video duration. Maximum duration 30 seconds.", "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "fps": ["INT", {"default": 25, "min": 1, "max": 120, "tooltip": "Frames per second for video generation. Higher values create smoother motion but require more processing time.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.enhancePrompt": ["BOOLEAN", {"default": true, "tooltip": "Enable automatic prompt enhancement for cinematic results.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "audio": {"path": ["inputs", "audio"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "fps": {"path": ["fps"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "lora": {"path": ["lora"], "kind": "feature"}, "settings.enhancePrompt": {"path": ["settings", "enhancePrompt"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_imagineart_1_5_pro", "name": "ImagineArt 1.5 Pro", "model": "imagineart:1.5-pro@0", "task_type": "imageInference", "creator": "imagineart", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_imagineart_1_5", "name": "ImagineArt 1.5", "model": "imagineart:1@5", "task_type": "imageInference", "creator": "imagineart", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_imagineart_2_0", "name": "ImagineArt 2.0", "model": "imagineart:2.0@0", "task_type": "imageInference", "creator": "imagineart", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "size": [["None (model default)", "1K (from input)", "1.5K (from input)", "2K (from input)", "1K (1:1)", "1K (3:1)", "1K (1:3)", "1K (16:9)", "1K (9:16)", "1K (4:3)", "1K (3:4)", "1K (3:2)", "1K (2:3)", "1K (21:9)", "1K (4:5)", "1K (5:4)", "1K (4:1)", "1K (1:4)", "1.5K (1:1)", "1.5K (3:1)", "1.5K (1:3)", "1.5K (16:9)", "1.5K (9:16)", "1.5K (4:3)", "1.5K (3:4)", "1.5K (3:2)", "1.5K (2:3)", "1.5K (~21:9)", "1.5K (~4:5)", "1.5K (~5:4)", "2K (1:1)", "2K (3:1)", "2K (1:3)", "2K (16:9)", "2K (9:16)", "2K (4:3)", "2K (3:4)", "2K (3:2)", "2K (2:3)", "2K (21:9)", "2K (4:5)", "2K (5:4)", "1536x1536", "2496x832", "832x2496", "2048x1152", "1152x2048", "1664x1248", "1248x1664", "1728x1152", "1152x1728", "2160x928", "1472x1856", "1856x1472", "1024x1024", "1680x560", "560x1680", "1360x768", "768x1360", "1024x768", "768x1024", "1152x768", "768x1152", "1488x640", "848x1072", "1072x848", "2048x512", "512x2048", "2048x2048", "3552x1184", "1184x3552", "2816x1584", "1584x2816", "2368x1776", "1776x2368", "2496x1664", "1664x2496", "3136x1344", "1856x2320", "2320x1856"], {"default": "1K (1:1)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "settings.thinkingLevel": [["high", "low"], {"default": "high", "tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "1K (from input)": {"resolution": "1K"}, "1.5K (from input)": {"resolution": "1.5K"}, "2K (from input)": {"resolution": "2K"}, "1K (1:1)": {"width": 1024, "height": 1024}, "1K (3:1)": {"width": 1680, "height": 560}, "1K (1:3)": {"width": 560, "height": 1680}, "1K (16:9)": {"width": 1360, "height": 768}, "1K (9:16)": {"width": 768, "height": 1360}, "1K (4:3)": {"width": 1024, "height": 768}, "1K (3:4)": {"width": 768, "height": 1024}, "1K (3:2)": {"width": 1152, "height": 768}, "1K (2:3)": {"width": 768, "height": 1152}, "1K (21:9)": {"width": 1488, "height": 640}, "1K (4:5)": {"width": 848, "height": 1072}, "1K (5:4)": {"width": 1072, "height": 848}, "1K (4:1)": {"width": 2048, "height": 512}, "1K (1:4)": {"width": 512, "height": 2048}, "1.5K (1:1)": {"width": 1536, "height": 1536}, "1.5K (3:1)": {"width": 2496, "height": 832}, "1.5K (1:3)": {"width": 832, "height": 2496}, "1.5K (16:9)": {"width": 2048, "height": 1152}, "1.5K (9:16)": {"width": 1152, "height": 2048}, "1.5K (4:3)": {"width": 1664, "height": 1248}, "1.5K (3:4)": {"width": 1248, "height": 1664}, "1.5K (3:2)": {"width": 1728, "height": 1152}, "1.5K (2:3)": {"width": 1152, "height": 1728}, "1.5K (~21:9)": {"width": 2160, "height": 928}, "1.5K (~4:5)": {"width": 1472, "height": 1856}, "1.5K (~5:4)": {"width": 1856, "height": 1472}, "2K (1:1)": {"width": 2048, "height": 2048}, "2K (3:1)": {"width": 3552, "height": 1184}, "2K (1:3)": {"width": 1184, "height": 3552}, "2K (16:9)": {"width": 2816, "height": 1584}, "2K (9:16)": {"width": 1584, "height": 2816}, "2K (4:3)": {"width": 2368, "height": 1776}, "2K (3:4)": {"width": 1776, "height": 2368}, "2K (3:2)": {"width": 2496, "height": 1664}, "2K (2:3)": {"width": 1664, "height": 2496}, "2K (21:9)": {"width": 3136, "height": 1344}, "2K (4:5)": {"width": 1856, "height": 2320}, "2K (5:4)": {"width": 2320, "height": 1856}, "1536x1536": {"width": 1536, "height": 1536}, "2496x832": {"width": 2496, "height": 832}, "832x2496": {"width": 832, "height": 2496}, "2048x1152": {"width": 2048, "height": 1152}, "1152x2048": {"width": 1152, "height": 2048}, "1664x1248": {"width": 1664, "height": 1248}, "1248x1664": {"width": 1248, "height": 1664}, "1728x1152": {"width": 1728, "height": 1152}, "1152x1728": {"width": 1152, "height": 1728}, "2160x928": {"width": 2160, "height": 928}, "1472x1856": {"width": 1472, "height": 1856}, "1856x1472": {"width": 1856, "height": 1472}, "1024x1024": {"width": 1024, "height": 1024}, "1680x560": {"width": 1680, "height": 560}, "560x1680": {"width": 560, "height": 1680}, "1360x768": {"width": 1360, "height": 768}, "768x1360": {"width": 768, "height": 1360}, "1024x768": {"width": 1024, "height": 768}, "768x1024": {"width": 768, "height": 1024}, "1152x768": {"width": 1152, "height": 768}, "768x1152": {"width": 768, "height": 1152}, "1488x640": {"width": 1488, "height": 640}, "848x1072": {"width": 848, "height": 1072}, "1072x848": {"width": 1072, "height": 848}, "2048x512": {"width": 2048, "height": 512}, "512x2048": {"width": 512, "height": 2048}, "2048x2048": {"width": 2048, "height": 2048}, "3552x1184": {"width": 3552, "height": 1184}, "1184x3552": {"width": 1184, "height": 3552}, "2816x1584": {"width": 2816, "height": 1584}, "1584x2816": {"width": 1584, "height": 2816}, "2368x1776": {"width": 2368, "height": 1776}, "1776x2368": {"width": 1776, "height": 2368}, "2496x1664": {"width": 2496, "height": 1664}, "1664x2496": {"width": 1664, "height": 2496}, "3136x1344": {"width": 3136, "height": 1344}, "1856x2320": {"width": 1856, "height": 2320}, "2320x1856": {"width": 2320, "height": 1856}}}}}, {"key": "Runware_meshy_6", "name": "Meshy-6", "model": "meshy:meshy@6", "task_type": "3dInference", "creator": "meshy", "input_types": {"required": {}, "optional": {"referenceImages": ["IMAGE"], "images": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.autoSize": ["BOOLEAN", {"default": false, "tooltip": "AI-based real-world height estimation to resize the model accordingly.", "rw_cat": "settings"}], "settings.decimation": [["(default)", 1, 2, 3, 4], {"tooltip": "Adaptive decimation level.", "default": "(default)", "rw_cat": "settings"}], "settings.hdTexture": ["BOOLEAN", {"default": false, "tooltip": "Base colour texture at 4K (4096\u00d74096) resolution. PBR maps are always generated at 2K regardless.", "rw_cat": "settings"}], "settings.imageEnhancement": ["BOOLEAN", {"default": true, "tooltip": "Input image optimization for better generation results. Set to false to preserve the exact appearance of the input.", "rw_cat": "settings"}], "settings.meshType": [["standard", "lowpoly"], {"default": "standard", "tooltip": "Mesh generation type for the output 3D model.", "rw_cat": "settings"}], "settings.moderation": ["BOOLEAN", {"default": false, "tooltip": "Input content screening for potentially harmful material before generation proceeds.", "rw_cat": "settings"}], "settings.origin": [["bottom", "center"], {"default": "bottom", "tooltip": "Origin point position for the generated model.", "rw_cat": "settings"}], "settings.pbr": ["BOOLEAN", {"default": false, "tooltip": "PBR map generation (metallic, roughness, normal) in addition to base colour. Includes an emission map.", "rw_cat": "settings"}], "settings.polyCount": ["INT", {"default": 30000, "min": 100, "max": 300000, "tooltip": "Target polygon count. Actual count may deviate based on geometry complexity.", "rw_cat": "settings"}], "settings.pose": [["none", "a-pose", "t-pose"], {"default": "none", "tooltip": "Pose preset for the generated model.", "rw_cat": "settings"}], "settings.remesh": ["BOOLEAN", {"default": false, "tooltip": "Remesh phase toggle. When false, returns the highest-precision triangular mesh without decimation.", "rw_cat": "settings"}], "settings.removeLighting": ["BOOLEAN", {"default": true, "tooltip": "Highlight and shadow removal from the base colour texture, producing a cleaner result for custom lighting.", "rw_cat": "settings"}], "settings.symmetry": [["off", "auto", "on"], {"default": "auto", "tooltip": "Symmetry behaviour during generation.", "rw_cat": "settings"}], "settings.texture": ["BOOLEAN", {"default": true, "tooltip": "Texture generation toggle. When false, returns a mesh only.", "rw_cat": "settings"}], "settings.texturePrompt": ["STRING", {"tooltip": "Additional text prompt to guide the texturing process.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.topology": [["triangle", "quad"], {"default": "triangle", "tooltip": "Mesh topology for the output model.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["GLB"], {"default": "GLB", "tooltip": "File format for the generated 3D model.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "images": {"path": ["inputs", "images"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "settings.autoSize": {"path": ["settings", "autoSize"], "kind": "scalar", "omit_value": false}, "settings.decimation": {"path": ["settings", "decimation"], "kind": "scalar", "omit_value": "(default)"}, "settings.hdTexture": {"path": ["settings", "hdTexture"], "kind": "scalar", "omit_value": false}, "settings.imageEnhancement": {"path": ["settings", "imageEnhancement"], "kind": "scalar"}, "settings.meshType": {"path": ["settings", "meshType"], "kind": "scalar"}, "settings.moderation": {"path": ["settings", "moderation"], "kind": "scalar", "omit_value": false}, "settings.origin": {"path": ["settings", "origin"], "kind": "scalar"}, "settings.pbr": {"path": ["settings", "pbr"], "kind": "scalar", "omit_value": false}, "settings.polyCount": {"path": ["settings", "polyCount"], "kind": "scalar"}, "settings.pose": {"path": ["settings", "pose"], "kind": "scalar"}, "settings.remesh": {"path": ["settings", "remesh"], "kind": "scalar", "omit_value": false}, "settings.removeLighting": {"path": ["settings", "removeLighting"], "kind": "scalar"}, "settings.symmetry": {"path": ["settings", "symmetry"], "kind": "scalar"}, "settings.texture": {"path": ["settings", "texture"], "kind": "scalar"}, "settings.texturePrompt": {"path": ["settings", "texturePrompt"], "kind": "scalar", "omit_empty": true}, "settings.topology": {"path": ["settings", "topology"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}}}, {"key": "Runware_exactly_photo_extreme_contrast", "name": "Exactly Extreme Contrast", "model": "exactly:photo@extreme-contrast", "task_type": "imageInference", "creator": "exactly", "input_types": {"required": {"referenceImages": ["RUNWARE_REFERENCEIMAGES", {"rw_socket_fields": ["image", "type"], "rw_socket_enums": {"type": ["instruct"]}, "rw_cat": "inputs"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "feature"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_exactly_photo_grain_film_look", "name": "Exactly Grain Film Look", "model": "exactly:photo@grain-film-look", "task_type": "imageInference", "creator": "exactly", "input_types": {"required": {"referenceImages": ["RUNWARE_REFERENCEIMAGES", {"rw_socket_fields": ["image", "type"], "rw_socket_enums": {"type": ["instruct"]}, "rw_cat": "inputs"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "feature"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_exactly_photo_warm_light", "name": "Exactly Warm Light", "model": "exactly:photo@warm-light", "task_type": "imageInference", "creator": "exactly", "input_types": {"required": {"referenceImages": ["RUNWARE_REFERENCEIMAGES", {"rw_socket_fields": ["image", "type"], "rw_socket_enums": {"type": ["instruct"]}, "rw_cat": "inputs"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "feature"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_exactly_illustrative_training", "name": "Exactly Illustrative Training", "model": "exactly:illustrative@training", "task_type": "training", "creator": "exactly", "input_types": {"required": {"importModel": ["RUNWARE_IMPORTMODEL"], "dataset": ["STRING", {"tooltip": "Training dataset as a ZIP file (UUID or URL). Supported image formats: JPEG, PNG, WebP. Images are automatically converted to JPEG and downscaled to 4096px on the long side. Max 50MB per image.", "rw_cat": "core"}]}, "optional": {}}, "param_plan": {"dataset": {"path": ["inputs", "dataset"], "kind": "scalar"}, "importModel": {"path": ["importModel"], "kind": "feature"}}}, {"key": "Runware_exactly_photo_journey", "name": "Exactly Journey", "model": "exactly:photo@journey", "task_type": "imageInference", "creator": "exactly", "input_types": {"required": {"referenceImages": ["RUNWARE_REFERENCEIMAGES", {"rw_socket_fields": ["image", "type"], "rw_socket_enums": {"type": ["instruct"]}, "rw_cat": "inputs"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "feature"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_exactly_photo_bright_pulse", "name": "Exactly Bright Pulse", "model": "exactly:photo@bright-pulse", "task_type": "imageInference", "creator": "exactly", "input_types": {"required": {"referenceImages": ["RUNWARE_REFERENCEIMAGES", {"rw_socket_fields": ["image", "type"], "rw_socket_enums": {"type": ["instruct"]}, "rw_cat": "inputs"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "feature"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_exactly_photo_distant_reality", "name": "Exactly Distant Reality", "model": "exactly:photo@distant-reality", "task_type": "imageInference", "creator": "exactly", "input_types": {"required": {"referenceImages": ["RUNWARE_REFERENCEIMAGES", {"rw_socket_fields": ["image", "type"], "rw_socket_enums": {"type": ["instruct"]}, "rw_cat": "inputs"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "feature"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bytedance_seedream_4_0", "name": "Seedream 4.0", "model": "bytedance:5@0", "task_type": "imageInference", "creator": "bytedance", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.bytedance.maxSequentialImages": ["BOOLEAN", {"default": false, "rw_gates": "providerSettings.bytedance.maxSequentialImages_value", "tooltip": "Enable to set providerSettings.bytedance.maxSequentialImages. Off uses the model's default.", "rw_cat": "settings"}], "providerSettings.bytedance.maxSequentialImages_value": ["INT", {"min": 1, "max": 15, "tooltip": "Maximum number of sequential images to generate. Combined total of reference images plus sequential images cannot exceed 15. The model may generate fewer images than requested depending on prompt complexity.", "default": 1, "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.bytedance.maxSequentialImages": {"path": ["providerSettings", "bytedance", "maxSequentialImages"], "kind": "gate", "value_key": "providerSettings.bytedance.maxSequentialImages_value"}, "providerSettings.bytedance.maxSequentialImages_value": {"path": ["providerSettings", "bytedance", "maxSequentialImages"], "kind": "skip"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bytedance_seedance_2_0_fast", "name": "Seedance 2.0 Fast", "model": "bytedance:seedance@2.0-fast", "task_type": "videoInference", "creator": "bytedance", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "frameImages": ["IMAGE"], "referenceVideos": ["RUNWARE_REFERENCEVIDEOS"], "size": [["None (model default)", "480p (from input)", "720p (from input)", "480p (16:9)", "480p (4:3)", "480p (1:1)", "480p (3:4)", "480p (9:16)", "480p (21:9)", "720p (16:9)", "720p (4:3)", "720p (1:1)", "720p (3:4)", "720p (9:16)", "720p (21:9)"], {"default": "720p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "duration": ["INT", {"default": 5, "min": 4, "max": 15, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.audio": ["BOOLEAN", {"default": true, "tooltip": "Generate synchronized audio.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.referenceAudios"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "referenceVideos": {"path": ["inputs", "referenceVideos"], "kind": "feature"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "settings.audio": {"path": ["settings", "audio"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "480p (from input)": {"resolution": "480p"}, "720p (from input)": {"resolution": "720p"}, "480p (16:9)": {"width": 864, "height": 496}, "480p (4:3)": {"width": 752, "height": 560}, "480p (1:1)": {"width": 640, "height": 640}, "480p (3:4)": {"width": 560, "height": 752}, "480p (9:16)": {"width": 496, "height": 864}, "480p (21:9)": {"width": 992, "height": 432}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (4:3)": {"width": 1112, "height": 834}, "720p (1:1)": {"width": 960, "height": 960}, "720p (3:4)": {"width": 834, "height": 1112}, "720p (9:16)": {"width": 720, "height": 1280}, "720p (21:9)": {"width": 1470, "height": 630}}}}}, {"key": "Runware_bytedance_seedance_1_5_pro", "name": "Seedance 1.5 Pro", "model": "bytedance:seedance@1.5-pro", "task_type": "videoInference", "creator": "bytedance", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "size": [["None (model default)", "480p (from input)", "720p (from input)", "1080p (from input)", "480p (16:9)", "480p (4:3)", "480p (1:1)", "480p (3:4)", "480p (9:16)", "480p (21:9)", "720p (16:9)", "720p (4:3)", "720p (1:1)", "720p (3:4)", "720p (9:16)", "720p (21:9)", "1080p (16:9)", "1080p (4:3)", "1080p (1:1)", "1080p (3:4)", "1080p (9:16)", "1080p (21:9)", "864x496", "752x560", "640x640", "560x752", "496x864", "992x432"], {"default": "480p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": ["BOOLEAN", {"default": false, "rw_gates": "duration_value", "tooltip": "Enable to set duration. Off uses the model's default.", "rw_cat": "core"}], "duration_value": ["FLOAT", {"tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "default": 0.0, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "draftId": ["STRING", {"tooltip": "Draft ID from a previous draft mode generation. Provide this to produce full quality output from an approved 480p draft preview.", "default": "", "rw_cat": "core"}], "providerSettings.bytedance.audio": ["BOOLEAN", {"default": true, "tooltip": "Generate synchronized audio. Affects pricing.", "rw_cat": "settings"}], "providerSettings.bytedance.cameraFixed": ["BOOLEAN", {"default": false, "tooltip": "Fix the camera position and angle, preventing any panning, tilting, or zooming effects.", "rw_cat": "settings"}], "providerSettings.bytedance.draft": ["BOOLEAN", {"default": false, "tooltip": "Enable draft mode for rapid iteration. Generates a fast 480p preview. Use the returned draft ID with draftId to produce full quality output from an approved draft.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "draftId": {"path": ["inputs", "draftId"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "gate", "value_key": "duration_value"}, "duration_value": {"path": ["duration"], "kind": "skip"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.bytedance.audio": {"path": ["providerSettings", "bytedance", "audio"], "kind": "scalar"}, "providerSettings.bytedance.cameraFixed": {"path": ["providerSettings", "bytedance", "cameraFixed"], "kind": "scalar", "omit_value": false}, "providerSettings.bytedance.draft": {"path": ["providerSettings", "bytedance", "draft"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "480p (from input)": {"resolution": "480p"}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "480p (16:9)": {"width": 864, "height": 496}, "480p (4:3)": {"width": 752, "height": 560}, "480p (1:1)": {"width": 640, "height": 640}, "480p (3:4)": {"width": 560, "height": 752}, "480p (9:16)": {"width": 496, "height": 864}, "480p (21:9)": {"width": 992, "height": 432}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (4:3)": {"width": 1112, "height": 834}, "720p (1:1)": {"width": 960, "height": 960}, "720p (3:4)": {"width": 834, "height": 1112}, "720p (9:16)": {"width": 720, "height": 1280}, "720p (21:9)": {"width": 1470, "height": 630}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (4:3)": {"width": 1664, "height": 1248}, "1080p (1:1)": {"width": 1440, "height": 1440}, "1080p (3:4)": {"width": 1248, "height": 1664}, "1080p (9:16)": {"width": 1080, "height": 1920}, "1080p (21:9)": {"width": 2205, "height": 945}, "864x496": {"width": 864, "height": 496}, "752x560": {"width": 752, "height": 560}, "640x640": {"width": 640, "height": 640}, "560x752": {"width": 560, "height": 752}, "496x864": {"width": 496, "height": 864}, "992x432": {"width": 992, "height": 432}}}}}, {"key": "Runware_bytedance_omnihuman_1_5", "name": "OmniHuman-1.5", "model": "bytedance:5@2", "task_type": "videoInference", "creator": "bytedance", "input_types": {"required": {"image": ["IMAGE"], "audio": ["STRING", {"tooltip": "The audio file used to drive the animation (UUID or URL).", "rw_cat": "core"}]}, "optional": {"mask": ["IMAGE"], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.bytedance.fastMode": ["BOOLEAN", {"default": false, "tooltip": "Enable accelerated generation by optimizing the processing pipeline.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "audio": {"path": ["inputs", "audio"], "kind": "scalar"}, "mask": {"path": ["inputs", "mask"], "kind": "image_scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.bytedance.fastMode": {"path": ["providerSettings", "bytedance", "fastMode"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_bytedance_seedream_4_5", "name": "Seedream 4.5", "model": "bytedance:seedream@4.5", "task_type": "imageInference", "creator": "bytedance", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "size": [["None (model default)", "2K (from input)", "4K (from input)", "Custom (set width and height)"], {"default": "Custom (set width and height)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "width": ["INT", {"min": 256, "max": 16383, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 256, "max": 16383, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.bytedance.maxSequentialImages": ["BOOLEAN", {"default": false, "rw_gates": "providerSettings.bytedance.maxSequentialImages_value", "tooltip": "Enable to set providerSettings.bytedance.maxSequentialImages. Off uses the model's default.", "rw_cat": "settings"}], "providerSettings.bytedance.maxSequentialImages_value": ["INT", {"min": 1, "max": 15, "tooltip": "Maximum number of sequential images to generate. Combined total of reference images plus sequential images cannot exceed 15. The model may generate fewer images than requested depending on prompt complexity.", "default": 1, "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.bytedance.maxSequentialImages": {"path": ["providerSettings", "bytedance", "maxSequentialImages"], "kind": "gate", "value_key": "providerSettings.bytedance.maxSequentialImages_value"}, "providerSettings.bytedance.maxSequentialImages_value": {"path": ["providerSettings", "bytedance", "maxSequentialImages"], "kind": "skip"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "2K (from input)": {"resolution": "2K"}, "4K (from input)": {"resolution": "4K"}, "Custom (set width and height)": {}}}}}, {"key": "Runware_bytedance_omnihuman_1", "name": "OmniHuman-1", "model": "bytedance:5@1", "task_type": "videoInference", "creator": "bytedance", "input_types": {"required": {"referenceImages": ["IMAGE"], "audio": ["STRING", {"tooltip": "The audio file used to drive the animation (UUID or URL).", "rw_cat": "core"}]}, "optional": {"numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "audio": {"path": ["inputs", "audio"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_bytedance_seedance_1_0_pro_fast", "name": "Seedance 1.0 Pro Fast", "model": "bytedance:2@2", "task_type": "videoInference", "creator": "bytedance", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "size": [["None (model default)", "480p (from input)", "720p (from input)", "1080p (from input)", "480p (16:9)", "480p (4:3)", "480p (1:1)", "480p (3:4)", "480p (9:16)", "480p (21:9)", "720p (16:9)", "720p (4:3)", "720p (1:1)", "720p (3:4)", "720p (9:16)", "720p (21:9)", "1080p (16:9)", "1080p (4:3)", "1080p (1:1)", "1080p (3:4)", "1080p (9:16)", "1080p (21:9)"], {"default": "480p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": ["FLOAT", {"default": 5, "min": 1.2, "max": 12, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.bytedance.cameraFixed": ["BOOLEAN", {"default": false, "tooltip": "Fix the camera position and angle, preventing any panning, tilting, or zooming effects.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.bytedance.cameraFixed": {"path": ["providerSettings", "bytedance", "cameraFixed"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "480p (from input)": {"resolution": "480p"}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "480p (16:9)": {"width": 864, "height": 480}, "480p (4:3)": {"width": 736, "height": 544}, "480p (1:1)": {"width": 640, "height": 640}, "480p (3:4)": {"width": 544, "height": 736}, "480p (9:16)": {"width": 480, "height": 864}, "480p (21:9)": {"width": 960, "height": 416}, "720p (16:9)": {"width": 1248, "height": 704}, "720p (4:3)": {"width": 1120, "height": 832}, "720p (1:1)": {"width": 960, "height": 960}, "720p (3:4)": {"width": 832, "height": 1120}, "720p (9:16)": {"width": 704, "height": 1248}, "720p (21:9)": {"width": 1504, "height": 640}, "1080p (16:9)": {"width": 1920, "height": 1088}, "1080p (4:3)": {"width": 1664, "height": 1248}, "1080p (1:1)": {"width": 1440, "height": 1440}, "1080p (3:4)": {"width": 1248, "height": 1664}, "1080p (9:16)": {"width": 1088, "height": 1920}, "1080p (21:9)": {"width": 2176, "height": 928}}}}}, {"key": "Runware_bytedance_seed_audio_1_0", "name": "Seed Audio 1.0", "model": "bytedance:seed-audio@1.0", "task_type": "audioInference", "creator": "bytedance", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing the voice, environment, background music, sound effects, and dialogue to synthesize. In audio-reference mode, reference clips in array order as `@Audio1`, `@Audio2`, and `@Audio3`.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "audioSettings": ["RUNWARE_AUDIOSETTINGS"], "speech": ["RUNWARE_SPEECH", {"rw_socket_fields": ["pitch", "speed", "volume"], "rw_cat": "inputs"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP3", "WAV", "FLAC", "OGG"], {"default": "MP3", "tooltip": "File format for the generated audio.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.referenceAudios"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "speech": {"path": ["speech"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "audioSettings": {"path": ["audioSettings"], "kind": "feature"}}}, {"key": "Runware_bytedance_video_upscaler", "name": "ByteDance Video Upscaler", "model": "bytedance:50@1", "task_type": "upscale", "creator": "bytedance", "input_types": {"required": {"video": ["STRING", {"tooltip": "Video input (UUID or URL).", "rw_cat": "core"}]}, "optional": {"ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"video": {"path": ["inputs", "video"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}}}, {"key": "Runware_bytedance_video_enhancement_pro", "name": "BytePlus Video Enhancement Pro", "model": "bytedance:video-enhancement@pro", "task_type": "upscale", "creator": "bytedance", "input_types": {"required": {"video": ["STRING", {"tooltip": "Video input (UUID or URL).", "rw_cat": "core"}]}, "optional": {"resolution": [["(default)", "240p", "360p", "480p", "540p", "720p", "1080p", "2k", "4k"], {"tooltip": "Resolution preset for the output. When used with input media, automatically matches the aspect ratio from the input.", "default": "(default)", "rw_cat": "core"}], "fps": ["BOOLEAN", {"default": false, "rw_gates": "fps_value", "tooltip": "Enable to set fps. Off uses the model's default.", "rw_cat": "core"}], "fps_value": ["FLOAT", {"min": 15, "max": 120, "tooltip": "Frames per second for video generation. Higher values create smoother motion but require more processing time.", "default": 15.0, "rw_cat": "core"}], "settings.bitrate": [["low", "medium", "high"], {"default": "medium", "tooltip": "Controls the output average bitrate, affecting quality and file size.", "rw_cat": "settings"}], "settings.resolutionLimit": ["BOOLEAN", {"default": false, "rw_gates": "settings.resolutionLimit_value", "tooltip": "Enable to set settings.resolutionLimit. Off uses the model's default.", "rw_cat": "settings"}], "settings.resolutionLimit_value": ["INT", {"min": 128, "max": 2160, "tooltip": "Pixel limit for the short side of the target resolution. Scales proportionally, maintaining aspect ratio.", "default": 128, "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"video": {"path": ["inputs", "video"], "kind": "scalar"}, "resolution": {"path": ["resolution"], "kind": "scalar", "omit_value": "(default)"}, "fps": {"path": ["fps"], "kind": "gate", "value_key": "fps_value"}, "fps_value": {"path": ["fps"], "kind": "skip"}, "settings.bitrate": {"path": ["settings", "bitrate"], "kind": "scalar"}, "settings.resolutionLimit": {"path": ["settings", "resolutionLimit"], "kind": "gate", "value_key": "settings.resolutionLimit_value"}, "settings.resolutionLimit_value": {"path": ["settings", "resolutionLimit"], "kind": "skip"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}}}, {"key": "Runware_bytedance_seedance_2_0", "name": "Seedance 2.0", "model": "bytedance:seedance@2.0", "task_type": "videoInference", "creator": "bytedance", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "frameImages": ["IMAGE"], "referenceVideos": ["RUNWARE_REFERENCEVIDEOS"], "size": [["None (model default)", "480p (from input)", "720p (from input)", "1080p (from input)", "4k (from input)", "480p (16:9)", "480p (4:3)", "480p (1:1)", "480p (3:4)", "480p (9:16)", "480p (21:9)", "720p (16:9)", "720p (4:3)", "720p (1:1)", "720p (3:4)", "720p (9:16)", "720p (21:9)", "1080p (16:9)", "1080p (4:3)", "1080p (1:1)", "1080p (3:4)", "1080p (9:16)", "1080p (21:9)", "4k (16:9)", "4k (4:3)", "4k (1:1)", "4k (3:4)", "4k (9:16)", "4k (21:9)"], {"default": "720p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "duration": ["INT", {"default": 5, "min": 4, "max": 15, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.audio": ["BOOLEAN", {"default": true, "tooltip": "Generate synchronized audio.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.referenceAudios"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "referenceVideos": {"path": ["inputs", "referenceVideos"], "kind": "feature"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "settings.audio": {"path": ["settings", "audio"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "480p (from input)": {"resolution": "480p"}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "4k (from input)": {"resolution": "4k"}, "480p (16:9)": {"width": 864, "height": 496}, "480p (4:3)": {"width": 752, "height": 560}, "480p (1:1)": {"width": 640, "height": 640}, "480p (3:4)": {"width": 560, "height": 752}, "480p (9:16)": {"width": 496, "height": 864}, "480p (21:9)": {"width": 992, "height": 432}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (4:3)": {"width": 1112, "height": 834}, "720p (1:1)": {"width": 960, "height": 960}, "720p (3:4)": {"width": 834, "height": 1112}, "720p (9:16)": {"width": 720, "height": 1280}, "720p (21:9)": {"width": 1470, "height": 630}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (4:3)": {"width": 1664, "height": 1248}, "1080p (1:1)": {"width": 1440, "height": 1440}, "1080p (3:4)": {"width": 1248, "height": 1664}, "1080p (9:16)": {"width": 1080, "height": 1920}, "1080p (21:9)": {"width": 2206, "height": 946}, "4k (16:9)": {"width": 3840, "height": 2160}, "4k (4:3)": {"width": 3326, "height": 2494}, "4k (1:1)": {"width": 2880, "height": 2880}, "4k (3:4)": {"width": 2496, "height": 3328}, "4k (9:16)": {"width": 2160, "height": 3840}, "4k (21:9)": {"width": 4398, "height": 1886}}}}}, {"key": "Runware_bytedance_seedream_5_0_lite", "name": "Seedream 5.0 Lite", "model": "bytedance:seedream@5.0-lite", "task_type": "imageInference", "creator": "bytedance", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.bytedance.maxSequentialImages": ["BOOLEAN", {"default": false, "rw_gates": "providerSettings.bytedance.maxSequentialImages_value", "tooltip": "Enable to set providerSettings.bytedance.maxSequentialImages. Off uses the model's default.", "rw_cat": "settings"}], "providerSettings.bytedance.maxSequentialImages_value": ["INT", {"min": 1, "max": 15, "tooltip": "Maximum number of sequential images to generate. Combined total of reference images plus sequential images cannot exceed 15. The model may generate fewer images than requested depending on prompt complexity.", "default": 1, "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "providerSettings.bytedance.maxSequentialImages": {"path": ["providerSettings", "bytedance", "maxSequentialImages"], "kind": "gate", "value_key": "providerSettings.bytedance.maxSequentialImages_value"}, "providerSettings.bytedance.maxSequentialImages_value": {"path": ["providerSettings", "bytedance", "maxSequentialImages"], "kind": "skip"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_bytedance_seedance_2_0_mini", "name": "Seedance 2.0 Mini", "model": "bytedance:seedance@2.0-mini", "task_type": "videoInference", "creator": "bytedance", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "frameImages": ["IMAGE"], "referenceVideos": ["RUNWARE_REFERENCEVIDEOS"], "size": [["None (model default)", "480p (from input)", "720p (from input)", "480p (16:9)", "480p (4:3)", "480p (1:1)", "480p (3:4)", "480p (9:16)", "480p (21:9)", "720p (16:9)", "720p (4:3)", "720p (1:1)", "720p (3:4)", "720p (9:16)", "720p (21:9)"], {"default": "720p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "duration": ["INT", {"default": 5, "min": 4, "max": 15, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.audio": ["BOOLEAN", {"default": true, "tooltip": "Generate synchronized audio.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.referenceAudios"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "referenceVideos": {"path": ["inputs", "referenceVideos"], "kind": "feature"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "settings.audio": {"path": ["settings", "audio"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "480p (from input)": {"resolution": "480p"}, "720p (from input)": {"resolution": "720p"}, "480p (16:9)": {"width": 864, "height": 496}, "480p (4:3)": {"width": 752, "height": 560}, "480p (1:1)": {"width": 640, "height": 640}, "480p (3:4)": {"width": 560, "height": 752}, "480p (9:16)": {"width": 496, "height": 864}, "480p (21:9)": {"width": 992, "height": 432}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (4:3)": {"width": 1112, "height": 834}, "720p (1:1)": {"width": 960, "height": 960}, "720p (3:4)": {"width": 834, "height": 1112}, "720p (9:16)": {"width": 720, "height": 1280}, "720p (21:9)": {"width": 1470, "height": 630}}}}}, {"key": "Runware_bytedance_video_enhancement_standard", "name": "BytePlus Video Enhancement Standard", "model": "bytedance:video-enhancement@standard", "task_type": "upscale", "creator": "bytedance", "input_types": {"required": {"video": ["STRING", {"tooltip": "Video input (UUID or URL).", "rw_cat": "core"}]}, "optional": {"resolution": [["(default)", "240p", "360p", "480p", "540p", "720p", "1080p", "2k", "4k"], {"tooltip": "Resolution preset for the output. When used with input media, automatically matches the aspect ratio from the input.", "default": "(default)", "rw_cat": "core"}], "fps": ["BOOLEAN", {"default": false, "rw_gates": "fps_value", "tooltip": "Enable to set fps. Off uses the model's default.", "rw_cat": "core"}], "fps_value": ["FLOAT", {"min": 15, "max": 120, "tooltip": "Frames per second for video generation. Higher values create smoother motion but require more processing time.", "default": 15.0, "rw_cat": "core"}], "settings.bitrate": [["low", "medium", "high"], {"default": "medium", "tooltip": "Controls the output average bitrate, affecting quality and file size.", "rw_cat": "settings"}], "settings.resolutionLimit": ["BOOLEAN", {"default": false, "rw_gates": "settings.resolutionLimit_value", "tooltip": "Enable to set settings.resolutionLimit. Off uses the model's default.", "rw_cat": "settings"}], "settings.resolutionLimit_value": ["INT", {"min": 128, "max": 2160, "tooltip": "Pixel limit for the short side of the target resolution. Scales proportionally, maintaining aspect ratio.", "default": 128, "rw_cat": "settings"}], "settings.style": [["common", "ugc", "short_series", "aigc", "old_film"], {"default": "common", "tooltip": "Video enhancement scenario preset.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"video": {"path": ["inputs", "video"], "kind": "scalar"}, "resolution": {"path": ["resolution"], "kind": "scalar", "omit_value": "(default)"}, "fps": {"path": ["fps"], "kind": "gate", "value_key": "fps_value"}, "fps_value": {"path": ["fps"], "kind": "skip"}, "settings.bitrate": {"path": ["settings", "bitrate"], "kind": "scalar"}, "settings.resolutionLimit": {"path": ["settings", "resolutionLimit"], "kind": "gate", "value_key": "settings.resolutionLimit_value"}, "settings.resolutionLimit_value": {"path": ["settings", "resolutionLimit"], "kind": "skip"}, "settings.style": {"path": ["settings", "style"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}}}, {"key": "Runware_bytedance_seedance_1_0_pro", "name": "Seedance 1.0 Pro", "model": "bytedance:2@1", "task_type": "videoInference", "creator": "bytedance", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "size": [["None (model default)", "480p (from input)", "1080p (from input)", "480p (16:9)", "480p (4:3)", "480p (1:1)", "480p (3:4)", "480p (9:16)", "480p (9:21)", "480p (21:9)", "1080p (16:9)", "1080p (4:3)", "1080p (1:1)", "1080p (3:4)", "1080p (9:16)", "1080p (9:21)", "1080p (21:9)"], {"default": "480p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": ["FLOAT", {"default": 5, "min": 1.2, "max": 12, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.bytedance.cameraFixed": ["BOOLEAN", {"default": false, "tooltip": "Fix the camera position and angle, preventing any panning, tilting, or zooming effects.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.bytedance.cameraFixed": {"path": ["providerSettings", "bytedance", "cameraFixed"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "480p (from input)": {"resolution": "480p"}, "1080p (from input)": {"resolution": "1080p"}, "480p (16:9)": {"width": 864, "height": 480}, "480p (4:3)": {"width": 736, "height": 544}, "480p (1:1)": {"width": 640, "height": 640}, "480p (3:4)": {"width": 544, "height": 736}, "480p (9:16)": {"width": 480, "height": 864}, "480p (9:21)": {"width": 416, "height": 960}, "480p (21:9)": {"width": 960, "height": 416}, "1080p (16:9)": {"width": 1920, "height": 1088}, "1080p (4:3)": {"width": 1664, "height": 1248}, "1080p (1:1)": {"width": 1440, "height": 1440}, "1080p (3:4)": {"width": 1248, "height": 1664}, "1080p (9:16)": {"width": 1088, "height": 1920}, "1080p (9:21)": {"width": 928, "height": 2176}, "1080p (21:9)": {"width": 2176, "height": 928}}}}}, {"key": "Runware_zai_glm_4_7", "name": "GLM-4.7", "model": "zai:glm@4.7", "task_type": "textInference", "creator": "zai", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"seed": ["INT", {"min": 0, "max": 4294967295, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.frequencyPenalty": ["FLOAT", {"default": 0, "min": 0, "max": 2, "step": 0.01, "tooltip": "Penalizes tokens based on their frequency in the output so far. A value of 0.0 disables the penalty.", "rw_cat": "settings"}], "settings.maxTokens": ["INT", {"default": 32768, "min": 1, "max": 131072, "tooltip": "Maximum number of tokens to generate in the response.", "rw_cat": "settings"}], "settings.minP": ["FLOAT", {"default": 0, "min": 0, "max": 1, "step": 0.01, "tooltip": "Minimum probability threshold. Tokens with probability below this value are excluded from sampling.", "rw_cat": "settings"}], "settings.presencePenalty": ["FLOAT", {"default": 0, "min": 0, "max": 2, "step": 0.01, "tooltip": "Encourages the model to introduce new topics. A value of 0.0 disables the penalty.", "rw_cat": "settings"}], "settings.repetitionPenalty": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Penalizes tokens that have already appeared in the output. A value of 1.0 disables the penalty.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "settings.thinkingLevel": [["none", "low", "medium", "high"], {"default": "none", "tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "rw_cat": "settings"}], "settings.topK": ["INT", {"default": -1, "min": 1, "tooltip": "Top-K sampling parameter that limits the number of highest-probability tokens considered at each step.", "rw_cat": "settings"}], "settings.topP": ["FLOAT", {"default": 0.95, "min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "rw_cat": "settings"}], "outputFormat": [["TEXT"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: settings.stopSequences"}]}}, "param_plan": {"seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.topP": {"path": ["settings", "topP"], "kind": "scalar"}, "settings.frequencyPenalty": {"path": ["settings", "frequencyPenalty"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "settings.minP": {"path": ["settings", "minP"], "kind": "scalar"}, "settings.presencePenalty": {"path": ["settings", "presencePenalty"], "kind": "scalar"}, "settings.repetitionPenalty": {"path": ["settings", "repetitionPenalty"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar"}, "settings.topK": {"path": ["settings", "topK"], "kind": "scalar"}, "messages": {"path": ["messages"], "kind": "feature"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_zai_glm_5_1", "name": "GLM-5.1", "model": "zai:glm@5.1", "task_type": "textInference", "creator": "zai", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.frequencyPenalty": ["BOOLEAN", {"default": false, "rw_gates": "settings.frequencyPenalty_value", "tooltip": "Enable to set settings.frequencyPenalty. Off uses the model's default.", "rw_cat": "settings"}], "settings.frequencyPenalty_value": ["FLOAT", {"min": -2, "max": 2, "step": 0.01, "tooltip": "Penalizes tokens based on their frequency in the output so far. A value of 0.0 disables the penalty.", "default": -2.0, "rw_cat": "settings"}], "settings.maxTokens": ["INT", {"default": 65536, "min": 1, "max": 131072, "tooltip": "Maximum number of tokens to generate in the response.", "rw_cat": "settings"}], "settings.presencePenalty": ["BOOLEAN", {"default": false, "rw_gates": "settings.presencePenalty_value", "tooltip": "Enable to set settings.presencePenalty. Off uses the model's default.", "rw_cat": "settings"}], "settings.presencePenalty_value": ["FLOAT", {"min": -2, "max": 2, "step": 0.01, "tooltip": "Encourages the model to introduce new topics. A value of 0.0 disables the penalty.", "default": -2.0, "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 1, "min": 0, "max": 1, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "settings.thinkingLevel": [["none", "high"], {"default": "none", "tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "settings.topP": ["BOOLEAN", {"default": false, "rw_gates": "settings.topP_value", "tooltip": "Enable to set settings.topP. Off uses the model's default.", "rw_cat": "settings"}], "settings.topP_value": ["FLOAT", {"min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "default": 0.0, "rw_cat": "settings"}], "outputFormat": [["TEXT"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: settings.stopSequences, tools"}]}}, "param_plan": {"seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.topP": {"path": ["settings", "topP"], "kind": "gate", "value_key": "settings.topP_value"}, "settings.topP_value": {"path": ["settings", "topP"], "kind": "skip"}, "settings.frequencyPenalty": {"path": ["settings", "frequencyPenalty"], "kind": "gate", "value_key": "settings.frequencyPenalty_value"}, "settings.frequencyPenalty_value": {"path": ["settings", "frequencyPenalty"], "kind": "skip"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "settings.presencePenalty": {"path": ["settings", "presencePenalty"], "kind": "gate", "value_key": "settings.presencePenalty_value"}, "settings.presencePenalty_value": {"path": ["settings", "presencePenalty"], "kind": "skip"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_ideogram_3_0_replace_background", "name": "Ideogram 3.0 Replace Background", "model": "ideogram:4@5", "task_type": "imageInference", "creator": "ideogram", "input_types": {"required": {"seedImage": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "providerSettings.ideogram.styleReferenceImages": ["IMAGE"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.ideogram.magicPrompt": [["AUTO", "ON", "OFF"], {"default": "AUTO", "tooltip": "Automatic prompt enhancement.", "rw_cat": "settings"}], "providerSettings.ideogram.renderingSpeed": [["TURBO", "DEFAULT", "QUALITY"], {"default": "DEFAULT", "tooltip": "Generation speed/quality tradeoff.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.ideogram.styleCode": ["STRING", {"tooltip": "Predefined style code (8-char hex).", "default": "", "rw_cat": "settings"}], "providerSettings.ideogram.stylePreset": [["(default)", "80S_ILLUSTRATION", "90S_NOSTALGIA", "ABSTRACT_ORGANIC", "ANALOG_NOSTALGIA", "ART_BRUT", "ART_DECO", "ART_POSTER", "AURA", "AVANT_GARDE", "BAUHAUS", "BLUEPRINT", "BLURRY_MOTION", "BRIGHT_ART", "C4D_CARTOON", "CHILDRENS_BOOK", "COLLAGE", "COLORING_BOOK_I", "COLORING_BOOK_II", "CUBISM", "DARK_AURA", "DOODLE", "DOUBLE_EXPOSURE", "DRAMATIC_CINEMA", "EDITORIAL", "EMOTIONAL_MINIMAL", "ETHEREAL_PARTY", "EXPIRED_FILM", "FLAT_ART", "FLAT_VECTOR", "FOREST_REVERIE", "GEO_MINIMALIST", "GLASS_PRISM", "GOLDEN_HOUR", "GRAFFITI_I", "GRAFFITI_II", "HALFTONE_PRINT", "HIGH_CONTRAST", "HIPPIE_ERA", "ICONIC", "JAPANDI_FUSION", "JAZZY", "LONG_EXPOSURE", "MAGAZINE_EDITORIAL", "MINIMAL_ILLUSTRATION", "MIXED_MEDIA", "MONOCHROME", "NIGHTLIFE", "OIL_PAINTING", "OLD_CARTOONS", "PAINT_GESTURE", "POP_ART", "RETRO_ETCHING", "RIVIERA_POP", "SPOTLIGHT_80S", "STYLIZED_RED", "SURREAL_COLLAGE", "TRAVEL_POSTER", "VINTAGE_GEO", "VINTAGE_POSTER", "WATERCOLOR", "WEIRD", "WOODBLOCK_PRINT"], {"tooltip": "Artistic style preset.", "default": "(default)", "rw_cat": "settings"}], "providerSettings.ideogram.styleType": [["AUTO", "GENERAL", "REALISTIC", "DESIGN", "RENDER_3D", "ANIME", "FICTION"], {"default": "AUTO", "tooltip": "Visual style and rendering approach.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "providerSettings.ideogram.magicPrompt": {"path": ["providerSettings", "ideogram", "magicPrompt"], "kind": "scalar"}, "providerSettings.ideogram.renderingSpeed": {"path": ["providerSettings", "ideogram", "renderingSpeed"], "kind": "scalar"}, "providerSettings.ideogram.styleCode": {"path": ["providerSettings", "ideogram", "styleCode"], "kind": "scalar", "omit_empty": true}, "providerSettings.ideogram.stylePreset": {"path": ["providerSettings", "ideogram", "stylePreset"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.ideogram.styleReferenceImages": {"path": ["providerSettings", "ideogram", "styleReferenceImages"], "kind": "image_array"}, "providerSettings.ideogram.styleType": {"path": ["providerSettings", "ideogram", "styleType"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_ideogram_2_0_remix", "name": "Ideogram 2.0 Remix", "model": "ideogram:3@2", "task_type": "imageInference", "creator": "ideogram", "input_types": {"required": {"referenceImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "providerSettings.ideogram.styleReferenceImages": ["IMAGE"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.ideogram.magicPrompt": [["AUTO", "ON", "OFF"], {"default": "AUTO", "tooltip": "Automatic prompt enhancement.", "rw_cat": "settings"}], "providerSettings.ideogram.colorPalette.name": [["(default)", "EMBER", "FRESH", "JUNGLE", "MAGIC", "MELON", "MOSAIC", "PASTEL", "ULTRAMARINE"], {"tooltip": "Preset color palette name.", "default": "(default)", "rw_cat": "settings"}], "providerSettings.ideogram.remixStrength": ["INT", {"default": 50, "min": 1, "max": 100, "tooltip": "Transformation intensity for Remix models. Higher values create more dramatic changes.", "rw_cat": "settings"}], "providerSettings.ideogram.renderingSpeed": [["TURBO", "DEFAULT", "QUALITY"], {"default": "DEFAULT", "tooltip": "Generation speed/quality tradeoff.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.ideogram.styleType": [["AUTO", "GENERAL", "REALISTIC", "DESIGN", "RENDER_3D", "ANIME", "FICTION"], {"default": "AUTO", "tooltip": "Visual style and rendering approach.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: providerSettings.ideogram.colorPalette.members"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "providerSettings.ideogram.colorPalette.name": {"path": ["providerSettings", "ideogram", "colorPalette", "name"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.ideogram.magicPrompt": {"path": ["providerSettings", "ideogram", "magicPrompt"], "kind": "scalar"}, "providerSettings.ideogram.remixStrength": {"path": ["providerSettings", "ideogram", "remixStrength"], "kind": "scalar"}, "providerSettings.ideogram.renderingSpeed": {"path": ["providerSettings", "ideogram", "renderingSpeed"], "kind": "scalar"}, "providerSettings.ideogram.styleReferenceImages": {"path": ["providerSettings", "ideogram", "styleReferenceImages"], "kind": "image_array"}, "providerSettings.ideogram.styleType": {"path": ["providerSettings", "ideogram", "styleType"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_ideogram_3_0_reframe", "name": "Ideogram 3.0 Reframe", "model": "ideogram:4@4", "task_type": "imageInference", "creator": "ideogram", "input_types": {"required": {"seedImage": ["IMAGE"], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "providerSettings.ideogram.styleReferenceImages": ["IMAGE"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.ideogram.magicPrompt": [["AUTO", "ON", "OFF"], {"default": "AUTO", "tooltip": "Automatic prompt enhancement.", "rw_cat": "settings"}], "providerSettings.ideogram.renderingSpeed": [["TURBO", "DEFAULT", "QUALITY"], {"default": "DEFAULT", "tooltip": "Generation speed/quality tradeoff.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.ideogram.styleCode": ["STRING", {"tooltip": "Predefined style code (8-char hex).", "default": "", "rw_cat": "settings"}], "providerSettings.ideogram.stylePreset": [["(default)", "80S_ILLUSTRATION", "90S_NOSTALGIA", "ABSTRACT_ORGANIC", "ANALOG_NOSTALGIA", "ART_BRUT", "ART_DECO", "ART_POSTER", "AURA", "AVANT_GARDE", "BAUHAUS", "BLUEPRINT", "BLURRY_MOTION", "BRIGHT_ART", "C4D_CARTOON", "CHILDRENS_BOOK", "COLLAGE", "COLORING_BOOK_I", "COLORING_BOOK_II", "CUBISM", "DARK_AURA", "DOODLE", "DOUBLE_EXPOSURE", "DRAMATIC_CINEMA", "EDITORIAL", "EMOTIONAL_MINIMAL", "ETHEREAL_PARTY", "EXPIRED_FILM", "FLAT_ART", "FLAT_VECTOR", "FOREST_REVERIE", "GEO_MINIMALIST", "GLASS_PRISM", "GOLDEN_HOUR", "GRAFFITI_I", "GRAFFITI_II", "HALFTONE_PRINT", "HIGH_CONTRAST", "HIPPIE_ERA", "ICONIC", "JAPANDI_FUSION", "JAZZY", "LONG_EXPOSURE", "MAGAZINE_EDITORIAL", "MINIMAL_ILLUSTRATION", "MIXED_MEDIA", "MONOCHROME", "NIGHTLIFE", "OIL_PAINTING", "OLD_CARTOONS", "PAINT_GESTURE", "POP_ART", "RETRO_ETCHING", "RIVIERA_POP", "SPOTLIGHT_80S", "STYLIZED_RED", "SURREAL_COLLAGE", "TRAVEL_POSTER", "VINTAGE_GEO", "VINTAGE_POSTER", "WATERCOLOR", "WEIRD", "WOODBLOCK_PRINT"], {"tooltip": "Artistic style preset.", "default": "(default)", "rw_cat": "settings"}], "providerSettings.ideogram.styleType": [["AUTO", "GENERAL", "REALISTIC", "DESIGN", "RENDER_3D", "ANIME", "FICTION"], {"default": "AUTO", "tooltip": "Visual style and rendering approach.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "providerSettings.ideogram.magicPrompt": {"path": ["providerSettings", "ideogram", "magicPrompt"], "kind": "scalar"}, "providerSettings.ideogram.renderingSpeed": {"path": ["providerSettings", "ideogram", "renderingSpeed"], "kind": "scalar"}, "providerSettings.ideogram.styleCode": {"path": ["providerSettings", "ideogram", "styleCode"], "kind": "scalar", "omit_empty": true}, "providerSettings.ideogram.stylePreset": {"path": ["providerSettings", "ideogram", "stylePreset"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.ideogram.styleReferenceImages": {"path": ["providerSettings", "ideogram", "styleReferenceImages"], "kind": "image_array"}, "providerSettings.ideogram.styleType": {"path": ["providerSettings", "ideogram", "styleType"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_ideogram_2_0", "name": "Ideogram 2.0", "model": "ideogram:3@1", "task_type": "imageInference", "creator": "ideogram", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "providerSettings.ideogram.styleReferenceImages": ["IMAGE"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.ideogram.magicPrompt": [["AUTO", "ON", "OFF"], {"default": "AUTO", "tooltip": "Automatic prompt enhancement.", "rw_cat": "settings"}], "providerSettings.ideogram.colorPalette.name": [["(default)", "EMBER", "FRESH", "JUNGLE", "MAGIC", "MELON", "MOSAIC", "PASTEL", "ULTRAMARINE"], {"tooltip": "Preset color palette name.", "default": "(default)", "rw_cat": "settings"}], "providerSettings.ideogram.renderingSpeed": [["TURBO", "DEFAULT", "QUALITY"], {"default": "DEFAULT", "tooltip": "Generation speed/quality tradeoff.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.ideogram.styleType": [["AUTO", "GENERAL", "REALISTIC", "DESIGN", "RENDER_3D", "ANIME", "FICTION"], {"default": "AUTO", "tooltip": "Visual style and rendering approach.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: providerSettings.ideogram.colorPalette.members"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "providerSettings.ideogram.colorPalette.name": {"path": ["providerSettings", "ideogram", "colorPalette", "name"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.ideogram.magicPrompt": {"path": ["providerSettings", "ideogram", "magicPrompt"], "kind": "scalar"}, "providerSettings.ideogram.renderingSpeed": {"path": ["providerSettings", "ideogram", "renderingSpeed"], "kind": "scalar"}, "providerSettings.ideogram.styleReferenceImages": {"path": ["providerSettings", "ideogram", "styleReferenceImages"], "kind": "image_array"}, "providerSettings.ideogram.styleType": {"path": ["providerSettings", "ideogram", "styleType"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_ideogram_4_0_remix", "name": "Ideogram 4.0 Remix", "model": "ideogram:4@remix", "task_type": "imageInference", "creator": "ideogram", "input_types": {"required": {"seedImage": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. Off uses the model's default.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input. When omitted, the strength is chosen automatically from the prompt. Supplying a value overrides that automatic choice.", "default": 0.0, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.copyrightDetection": ["BOOLEAN", {"default": false, "tooltip": "Opt into post-generation copyright detection using Hive likeness and logo checks.", "rw_cat": "settings"}], "settings.renderingSpeed": [["TURBO", "DEFAULT", "QUALITY"], {"default": "DEFAULT", "tooltip": "Generation speed/quality tradeoff.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "settings.copyrightDetection": {"path": ["settings", "copyrightDetection"], "kind": "scalar", "omit_value": false}, "settings.renderingSpeed": {"path": ["settings", "renderingSpeed"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_ideogram_3_0_remix", "name": "Ideogram 3.0 Remix", "model": "ideogram:4@2", "task_type": "imageInference", "creator": "ideogram", "input_types": {"required": {"referenceImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "providerSettings.ideogram.characterReferenceImages": ["IMAGE"], "providerSettings.ideogram.characterReferenceImagesMask": ["IMAGE"], "providerSettings.ideogram.styleReferenceImages": ["IMAGE"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.ideogram.magicPrompt": [["AUTO", "ON", "OFF"], {"default": "AUTO", "tooltip": "Automatic prompt enhancement.", "rw_cat": "settings"}], "providerSettings.ideogram.remixStrength": ["INT", {"default": 50, "min": 1, "max": 100, "tooltip": "Transformation intensity for Remix models. Higher values create more dramatic changes.", "rw_cat": "settings"}], "providerSettings.ideogram.renderingSpeed": [["TURBO", "DEFAULT", "QUALITY"], {"default": "DEFAULT", "tooltip": "Generation speed/quality tradeoff.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.ideogram.styleCode": ["STRING", {"tooltip": "Predefined style code (8-char hex).", "default": "", "rw_cat": "settings"}], "providerSettings.ideogram.stylePreset": [["(default)", "80S_ILLUSTRATION", "90S_NOSTALGIA", "ABSTRACT_ORGANIC", "ANALOG_NOSTALGIA", "ART_BRUT", "ART_DECO", "ART_POSTER", "AURA", "AVANT_GARDE", "BAUHAUS", "BLUEPRINT", "BLURRY_MOTION", "BRIGHT_ART", "C4D_CARTOON", "CHILDRENS_BOOK", "COLLAGE", "COLORING_BOOK_I", "COLORING_BOOK_II", "CUBISM", "DARK_AURA", "DOODLE", "DOUBLE_EXPOSURE", "DRAMATIC_CINEMA", "EDITORIAL", "EMOTIONAL_MINIMAL", "ETHEREAL_PARTY", "EXPIRED_FILM", "FLAT_ART", "FLAT_VECTOR", "FOREST_REVERIE", "GEO_MINIMALIST", "GLASS_PRISM", "GOLDEN_HOUR", "GRAFFITI_I", "GRAFFITI_II", "HALFTONE_PRINT", "HIGH_CONTRAST", "HIPPIE_ERA", "ICONIC", "JAPANDI_FUSION", "JAZZY", "LONG_EXPOSURE", "MAGAZINE_EDITORIAL", "MINIMAL_ILLUSTRATION", "MIXED_MEDIA", "MONOCHROME", "NIGHTLIFE", "OIL_PAINTING", "OLD_CARTOONS", "PAINT_GESTURE", "POP_ART", "RETRO_ETCHING", "RIVIERA_POP", "SPOTLIGHT_80S", "STYLIZED_RED", "SURREAL_COLLAGE", "TRAVEL_POSTER", "VINTAGE_GEO", "VINTAGE_POSTER", "WATERCOLOR", "WEIRD", "WOODBLOCK_PRINT"], {"tooltip": "Artistic style preset.", "default": "(default)", "rw_cat": "settings"}], "providerSettings.ideogram.styleType": [["AUTO", "GENERAL", "REALISTIC", "DESIGN", "RENDER_3D", "ANIME", "FICTION"], {"default": "AUTO", "tooltip": "Visual style and rendering approach.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "providerSettings.ideogram.characterReferenceImages": {"path": ["providerSettings", "ideogram", "characterReferenceImages"], "kind": "image_array"}, "providerSettings.ideogram.characterReferenceImagesMask": {"path": ["providerSettings", "ideogram", "characterReferenceImagesMask"], "kind": "image_array"}, "providerSettings.ideogram.magicPrompt": {"path": ["providerSettings", "ideogram", "magicPrompt"], "kind": "scalar"}, "providerSettings.ideogram.remixStrength": {"path": ["providerSettings", "ideogram", "remixStrength"], "kind": "scalar"}, "providerSettings.ideogram.renderingSpeed": {"path": ["providerSettings", "ideogram", "renderingSpeed"], "kind": "scalar"}, "providerSettings.ideogram.styleCode": {"path": ["providerSettings", "ideogram", "styleCode"], "kind": "scalar", "omit_empty": true}, "providerSettings.ideogram.stylePreset": {"path": ["providerSettings", "ideogram", "stylePreset"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.ideogram.styleReferenceImages": {"path": ["providerSettings", "ideogram", "styleReferenceImages"], "kind": "image_array"}, "providerSettings.ideogram.styleType": {"path": ["providerSettings", "ideogram", "styleType"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_ideogram_layerize_text", "name": "Ideogram Layerize Text", "model": "ideogram:layerize-text@0", "task_type": "imageInference", "creator": "ideogram", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "positivePrompt": ["STRING", {"tooltip": "An optional text description of the image. If not provided, a description will be auto-generated from the image.", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "seed": {"path": ["seed"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_ideogram_3_0_edit", "name": "Ideogram 3.0 Edit", "model": "ideogram:4@3", "task_type": "imageInference", "creator": "ideogram", "input_types": {"required": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "providerSettings.ideogram.characterReferenceImages": ["IMAGE"], "providerSettings.ideogram.characterReferenceImagesMask": ["IMAGE"], "providerSettings.ideogram.styleReferenceImages": ["IMAGE"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.ideogram.magicPrompt": [["AUTO", "ON", "OFF"], {"default": "AUTO", "tooltip": "Automatic prompt enhancement.", "rw_cat": "settings"}], "providerSettings.ideogram.renderingSpeed": [["TURBO", "DEFAULT", "QUALITY"], {"default": "DEFAULT", "tooltip": "Generation speed/quality tradeoff.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.ideogram.styleCode": ["STRING", {"tooltip": "Predefined style code (8-char hex).", "default": "", "rw_cat": "settings"}], "providerSettings.ideogram.stylePreset": [["(default)", "80S_ILLUSTRATION", "90S_NOSTALGIA", "ABSTRACT_ORGANIC", "ANALOG_NOSTALGIA", "ART_BRUT", "ART_DECO", "ART_POSTER", "AURA", "AVANT_GARDE", "BAUHAUS", "BLUEPRINT", "BLURRY_MOTION", "BRIGHT_ART", "C4D_CARTOON", "CHILDRENS_BOOK", "COLLAGE", "COLORING_BOOK_I", "COLORING_BOOK_II", "CUBISM", "DARK_AURA", "DOODLE", "DOUBLE_EXPOSURE", "DRAMATIC_CINEMA", "EDITORIAL", "EMOTIONAL_MINIMAL", "ETHEREAL_PARTY", "EXPIRED_FILM", "FLAT_ART", "FLAT_VECTOR", "FOREST_REVERIE", "GEO_MINIMALIST", "GLASS_PRISM", "GOLDEN_HOUR", "GRAFFITI_I", "GRAFFITI_II", "HALFTONE_PRINT", "HIGH_CONTRAST", "HIPPIE_ERA", "ICONIC", "JAPANDI_FUSION", "JAZZY", "LONG_EXPOSURE", "MAGAZINE_EDITORIAL", "MINIMAL_ILLUSTRATION", "MIXED_MEDIA", "MONOCHROME", "NIGHTLIFE", "OIL_PAINTING", "OLD_CARTOONS", "PAINT_GESTURE", "POP_ART", "RETRO_ETCHING", "RIVIERA_POP", "SPOTLIGHT_80S", "STYLIZED_RED", "SURREAL_COLLAGE", "TRAVEL_POSTER", "VINTAGE_GEO", "VINTAGE_POSTER", "WATERCOLOR", "WEIRD", "WOODBLOCK_PRINT"], {"tooltip": "Artistic style preset.", "default": "(default)", "rw_cat": "settings"}], "providerSettings.ideogram.styleType": [["AUTO", "GENERAL", "REALISTIC", "DESIGN", "RENDER_3D", "ANIME", "FICTION"], {"default": "AUTO", "tooltip": "Visual style and rendering approach.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "providerSettings.ideogram.characterReferenceImages": {"path": ["providerSettings", "ideogram", "characterReferenceImages"], "kind": "image_array"}, "providerSettings.ideogram.characterReferenceImagesMask": {"path": ["providerSettings", "ideogram", "characterReferenceImagesMask"], "kind": "image_array"}, "providerSettings.ideogram.magicPrompt": {"path": ["providerSettings", "ideogram", "magicPrompt"], "kind": "scalar"}, "providerSettings.ideogram.renderingSpeed": {"path": ["providerSettings", "ideogram", "renderingSpeed"], "kind": "scalar"}, "providerSettings.ideogram.styleCode": {"path": ["providerSettings", "ideogram", "styleCode"], "kind": "scalar", "omit_empty": true}, "providerSettings.ideogram.stylePreset": {"path": ["providerSettings", "ideogram", "stylePreset"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.ideogram.styleReferenceImages": {"path": ["providerSettings", "ideogram", "styleReferenceImages"], "kind": "image_array"}, "providerSettings.ideogram.styleType": {"path": ["providerSettings", "ideogram", "styleType"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_ideogram_3_0", "name": "Ideogram 3.0", "model": "ideogram:4@1", "task_type": "imageInference", "creator": "ideogram", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "providerSettings.ideogram.characterReferenceImages": ["IMAGE"], "providerSettings.ideogram.characterReferenceImagesMask": ["IMAGE"], "providerSettings.ideogram.styleReferenceImages": ["IMAGE"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "upscaleFactor": [["(default)", 1, 2, 4], {"default": "(default)", "tooltip": "Factor by which to upscale the generated image. A value of 2 doubles width and height.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.ideogram.magicPrompt": [["AUTO", "ON", "OFF"], {"default": "AUTO", "tooltip": "Automatic prompt enhancement.", "rw_cat": "settings"}], "providerSettings.ideogram.renderingSpeed": [["TURBO", "DEFAULT", "QUALITY"], {"default": "DEFAULT", "tooltip": "Generation speed/quality tradeoff.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.ideogram.stylePreset": [["(default)", "80S_ILLUSTRATION", "90S_NOSTALGIA", "ABSTRACT_ORGANIC", "ANALOG_NOSTALGIA", "ART_BRUT", "ART_DECO", "ART_POSTER", "AURA", "AVANT_GARDE", "BAUHAUS", "BLUEPRINT", "BLURRY_MOTION", "BRIGHT_ART", "C4D_CARTOON", "CHILDRENS_BOOK", "COLLAGE", "COLORING_BOOK_I", "COLORING_BOOK_II", "CUBISM", "DARK_AURA", "DOODLE", "DOUBLE_EXPOSURE", "DRAMATIC_CINEMA", "EDITORIAL", "EMOTIONAL_MINIMAL", "ETHEREAL_PARTY", "EXPIRED_FILM", "FLAT_ART", "FLAT_VECTOR", "FOREST_REVERIE", "GEO_MINIMALIST", "GLASS_PRISM", "GOLDEN_HOUR", "GRAFFITI_I", "GRAFFITI_II", "HALFTONE_PRINT", "HIGH_CONTRAST", "HIPPIE_ERA", "ICONIC", "JAPANDI_FUSION", "JAZZY", "LONG_EXPOSURE", "MAGAZINE_EDITORIAL", "MINIMAL_ILLUSTRATION", "MIXED_MEDIA", "MONOCHROME", "NIGHTLIFE", "OIL_PAINTING", "OLD_CARTOONS", "PAINT_GESTURE", "POP_ART", "RETRO_ETCHING", "RIVIERA_POP", "SPOTLIGHT_80S", "STYLIZED_RED", "SURREAL_COLLAGE", "TRAVEL_POSTER", "VINTAGE_GEO", "VINTAGE_POSTER", "WATERCOLOR", "WEIRD", "WOODBLOCK_PRINT"], {"tooltip": "Artistic style preset.", "default": "(default)", "rw_cat": "settings"}], "providerSettings.ideogram.styleType": [["AUTO", "GENERAL", "REALISTIC", "DESIGN", "RENDER_3D", "ANIME", "FICTION"], {"default": "AUTO", "tooltip": "Visual style and rendering approach.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "upscaleFactor": {"path": ["upscaleFactor"], "kind": "scalar", "omit_value": "(default)"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.ideogram.characterReferenceImages": {"path": ["providerSettings", "ideogram", "characterReferenceImages"], "kind": "image_array"}, "providerSettings.ideogram.characterReferenceImagesMask": {"path": ["providerSettings", "ideogram", "characterReferenceImagesMask"], "kind": "image_array"}, "providerSettings.ideogram.magicPrompt": {"path": ["providerSettings", "ideogram", "magicPrompt"], "kind": "scalar"}, "providerSettings.ideogram.renderingSpeed": {"path": ["providerSettings", "ideogram", "renderingSpeed"], "kind": "scalar"}, "providerSettings.ideogram.stylePreset": {"path": ["providerSettings", "ideogram", "stylePreset"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.ideogram.styleReferenceImages": {"path": ["providerSettings", "ideogram", "styleReferenceImages"], "kind": "image_array"}, "providerSettings.ideogram.styleType": {"path": ["providerSettings", "ideogram", "styleType"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_ideogram_2a_remix", "name": "Ideogram 2a Remix", "model": "ideogram:2@2", "task_type": "imageInference", "creator": "ideogram", "input_types": {"required": {"referenceImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "providerSettings.ideogram.styleReferenceImages": ["IMAGE"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.ideogram.magicPrompt": [["AUTO", "ON", "OFF"], {"default": "AUTO", "tooltip": "Automatic prompt enhancement.", "rw_cat": "settings"}], "providerSettings.ideogram.remixStrength": ["INT", {"default": 50, "min": 1, "max": 100, "tooltip": "Transformation intensity for Remix models. Higher values create more dramatic changes.", "rw_cat": "settings"}], "providerSettings.ideogram.renderingSpeed": [["TURBO", "DEFAULT", "QUALITY"], {"default": "DEFAULT", "tooltip": "Generation speed/quality tradeoff.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.ideogram.styleType": [["AUTO", "GENERAL", "REALISTIC", "DESIGN", "ANIME"], {"default": "AUTO", "tooltip": "Visual style and rendering approach.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "providerSettings.ideogram.magicPrompt": {"path": ["providerSettings", "ideogram", "magicPrompt"], "kind": "scalar"}, "providerSettings.ideogram.remixStrength": {"path": ["providerSettings", "ideogram", "remixStrength"], "kind": "scalar"}, "providerSettings.ideogram.renderingSpeed": {"path": ["providerSettings", "ideogram", "renderingSpeed"], "kind": "scalar"}, "providerSettings.ideogram.styleReferenceImages": {"path": ["providerSettings", "ideogram", "styleReferenceImages"], "kind": "image_array"}, "providerSettings.ideogram.styleType": {"path": ["providerSettings", "ideogram", "styleType"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_ideogram_2a", "name": "Ideogram 2a", "model": "ideogram:2@1", "task_type": "imageInference", "creator": "ideogram", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "providerSettings.ideogram.styleReferenceImages": ["IMAGE"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.ideogram.magicPrompt": [["AUTO", "ON", "OFF"], {"default": "AUTO", "tooltip": "Automatic prompt enhancement.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.ideogram.styleType": [["AUTO", "GENERAL", "REALISTIC", "DESIGN", "ANIME"], {"default": "AUTO", "tooltip": "Visual style and rendering approach.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "providerSettings.ideogram.magicPrompt": {"path": ["providerSettings", "ideogram", "magicPrompt"], "kind": "scalar"}, "providerSettings.ideogram.styleReferenceImages": {"path": ["providerSettings", "ideogram", "styleReferenceImages"], "kind": "image_array"}, "providerSettings.ideogram.styleType": {"path": ["providerSettings", "ideogram", "styleType"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_ideogram_4_0", "name": "Ideogram 4.0", "model": "ideogram:4@0", "task_type": "imageInference", "creator": "ideogram", "input_types": {"required": {"settings.structuredPrompt.high_level_description": ["STRING", {"tooltip": "One or two sentences describing the full image, including subject and style.", "rw_cat": "settings"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output. Automatically expanded into a structured prompt before generation.", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.structuredPrompt.style_description.aesthetics": ["STRING", {"tooltip": "Overall aesthetic direction.", "default": "", "rw_cat": "settings"}], "settings.structuredPrompt.style_description.art_style": ["STRING", {"tooltip": "Art style for non-photographic images.", "default": "", "rw_cat": "settings"}], "settings.structuredPrompt.compositional_deconstruction.background": ["STRING", {"tooltip": "Environment, framing, and lighting context.", "default": "", "rw_cat": "settings"}], "settings.copyrightDetection": ["BOOLEAN", {"default": false, "tooltip": "Opt into post-generation copyright detection using Hive likeness and logo checks.", "rw_cat": "settings"}], "settings.structuredPrompt.style_description.lighting": ["STRING", {"tooltip": "Lighting setup and mood.", "default": "", "rw_cat": "settings"}], "settings.structuredPrompt.style_description.medium": ["STRING", {"tooltip": "Artistic medium or capture format.", "default": "", "rw_cat": "settings"}], "settings.structuredPrompt.style_description.photo": ["STRING", {"tooltip": "Photographic style for photo-realistic images.", "default": "", "rw_cat": "settings"}], "settings.renderingSpeed": [["TURBO", "DEFAULT", "QUALITY"], {"default": "DEFAULT", "tooltip": "Generation speed/quality tradeoff.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: settings.structuredPrompt.compositional_deconstruction.elements, settings.structuredPrompt.style_description.color_palette"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "settings.copyrightDetection": {"path": ["settings", "copyrightDetection"], "kind": "scalar", "omit_value": false}, "settings.renderingSpeed": {"path": ["settings", "renderingSpeed"], "kind": "scalar"}, "settings.structuredPrompt.compositional_deconstruction.background": {"path": ["settings", "structuredPrompt", "compositional_deconstruction", "background"], "kind": "scalar", "omit_empty": true}, "settings.structuredPrompt.high_level_description": {"path": ["settings", "structuredPrompt", "high_level_description"], "kind": "scalar"}, "settings.structuredPrompt.style_description.aesthetics": {"path": ["settings", "structuredPrompt", "style_description", "aesthetics"], "kind": "scalar", "omit_empty": true}, "settings.structuredPrompt.style_description.art_style": {"path": ["settings", "structuredPrompt", "style_description", "art_style"], "kind": "scalar", "omit_empty": true}, "settings.structuredPrompt.style_description.lighting": {"path": ["settings", "structuredPrompt", "style_description", "lighting"], "kind": "scalar", "omit_empty": true}, "settings.structuredPrompt.style_description.medium": {"path": ["settings", "structuredPrompt", "style_description", "medium"], "kind": "scalar", "omit_empty": true}, "settings.structuredPrompt.style_description.photo": {"path": ["settings", "structuredPrompt", "style_description", "photo"], "kind": "scalar", "omit_empty": true}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_krea_2_turbo", "name": "Krea 2 Turbo", "model": "krea:krea@2-turbo", "task_type": "imageInference", "creator": "krea", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.creativity": [["raw", "low", "medium", "high"], {"default": "medium", "tooltip": "Creativity level. Controls how closely the model follows the prompt versus generating its own interpretation.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: settings.moodboards"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.creativity": {"path": ["settings", "creativity"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_krea_2_medium", "name": "Krea 2 Medium", "model": "krea:krea@2-medium", "task_type": "imageInference", "creator": "krea", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.creativity": [["raw", "low", "medium", "high"], {"default": "medium", "tooltip": "Creativity level. Controls how closely the model follows the prompt versus generating its own interpretation.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: settings.moodboards"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.creativity": {"path": ["settings", "creativity"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_krea_flux_1_krea_dev", "name": "FLUX.1 Krea [dev]", "model": "runware:107@1", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "controlNet": ["RUNWARE_CONTROLNET", {"rw_socket_models": ["runware:25@1", "runware:26@1", "runware:27@1", "runware:28@1", "runware:29@1", "runware:30@1", "runware:31@1", "runware:98@1"], "rw_socket_fields": ["controlMode", "endStep", "endStepPercentage", "guideImage", "model", "startStep", "startStepPercentage", "weight"], "rw_socket_enums": {"controlMode": ["balanced", "controlnet", "prompt"]}, "rw_cat": "inputs"}], "ipAdapters": ["RUNWARE_IPADAPTERS", {"rw_socket_models": ["runware:56@1", "runware:56@2", "runware:56@3", "runware:56@4"], "rw_socket_fields": ["guideImages", "model", "weight"], "rw_cat": "inputs"}], "pulid": ["RUNWARE_PULID"], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "trueCFGScale": ["BOOLEAN", {"default": false, "rw_gates": "trueCFGScale_value", "tooltip": "Enable to set trueCFGScale. Off uses the model's default.", "rw_cat": "core"}], "trueCFGScale_value": ["FLOAT", {"tooltip": "True Classifier-Free Guidance scale. Higher values increase prompt adherence at the cost of quality.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "promptWeighting": [["(default)", "sdEmbeds"], {"tooltip": "Syntax used for prompt weighting.", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "layerDiffuse": ["BOOLEAN", {"default": false, "tooltip": "LayerDiffuse for transparent image generation.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: hiresFix"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "promptWeighting": {"path": ["promptWeighting"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "controlNet": {"path": ["controlNet"], "kind": "feature"}, "ipAdapters": {"path": ["ipAdapters"], "kind": "feature"}, "layerDiffuse": {"path": ["layerDiffuse"], "kind": "scalar", "omit_value": false}, "pulid": {"path": ["pulid"], "kind": "feature"}, "trueCFGScale": {"path": ["trueCFGScale"], "kind": "gate", "value_key": "trueCFGScale_value"}, "trueCFGScale_value": {"path": ["trueCFGScale"], "kind": "skip"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_krea_2_large", "name": "Krea 2 Large", "model": "krea:krea@2-large", "task_type": "imageInference", "creator": "krea", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.creativity": [["raw", "low", "medium", "high"], {"default": "medium", "tooltip": "Creativity level. Controls how closely the model follows the prompt versus generating its own interpretation.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: settings.moodboards"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.creativity": {"path": ["settings", "creativity"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_heygen_avatar_v", "name": "HeyGen Avatar V", "model": "heygen:avatar@5", "task_type": "videoInference", "creator": "heygen", "input_types": {"required": {"avatar": [["Abigail_sitting_sofa_front", "Abigail_sitting_sofa_side", "Abigail_standing_office_front", "Abigail_standing_office_side", "Amelia_lying_lounge_front", "Amelia_lying_lounge_side", "Amelia_sitting_business_training_front", "Amelia_sitting_business_training_side", "Amelia_sitting_yoga_front", "Amelia_sitting_yoga_side", "Amelia_standing_business_training_front", "Amelia_standing_business_training_side", "Amelia_standing_lounge_front", "Amelia_standing_lounge_side", "Amelia_standing_yoga_front", "Amelia_standing_yoga_side", "Anja_sitting_sofa_front", "Anja_sitting_sofa_side", "Anja_standing_office_front", "Anja_standing_office_side", "Ann_Doctor_Sitting_public", "Ann_Doctor_Standing2_public", "Ann_Therapist_public", "Annie_Bar_Sitting_Front_public", "Annie_Bar_Sitting_Side_public", "Annie_Bar_Standing_Front_2_public", "Annie_Bar_Standing_Front_3_public", "Annie_Bar_Standing_Front_public", "Annie_Bar_Standing_Side_2_public", "Annie_Bar_Standing_Side_3_public", "Annie_Bar_Standing_Side_public", "Annie_Business_Casual_Standing_Front_2_public", "Annie_Business_Casual_Standing_Front_public", "Annie_Business_Casual_Standing_Side_2_public", "Annie_Business_Casual_Standing_Side_public", "Annie_Casual_Sitting_Front_2_public", "Annie_Casual_Sitting_Front_public", "Annie_Casual_Sitting_Side_2_public", "Annie_Casual_Sitting_Side_public", "Annie_Casual_Standing_Front_2_public", "Annie_Casual_Standing_Front_public", "Annie_Casual_Standing_Side_2_public", "Annie_Casual_Standing_Side_public", "Annie_Desk_Sitting_Front_2_public", "Annie_Desk_Sitting_Front_public", "Annie_Desk_Sitting_Side_2_public", "Annie_Desk_Sitting_Side_public", "Annie_Lounge_Standing_Front_public", "Annie_Lounge_Standing_Side_public", "Annie_Office_Sitting_Front_2_public", "Annie_Office_Sitting_Front_public", "Annie_Office_Sitting_Side_2_public", "Annie_Office_Sitting_Side_public", "Annie_Office_Standing_Front_public", "Annie_Office_Standing_Side_public", "Annie_Sofa_Sitting_Front_3_public", "Annie_Sofa_Sitting_Front_public", "Annie_Sofa_Sitting_Side1_public", "Annie_Sofa_Sitting_Side_2_public", "Annie_Sofa_Sitting_Side_3_public", "Annie_Sofa_Sitting_Side_public", "Annie_Studio_Pink_Sitting_Front_public", "Annie_Studio_Pink_Sitting_Side_public", "Annie_Studio_Pink_Standing_Front_public", "Annie_Studio_Pink_Standing_Side_public", "Artur_sitting_office_front", "Artur_sitting_office_side", "Artur_sitting_sofacasual_front", "Artur_sitting_sofacasual_side", "Artur_standing_office_front", "Artur_standing_office_side", "Artur_standing_sofacasual_front", "Artur_standing_sofacasual_side", "Aubrey_sitting_sofa_front", "Aubrey_sitting_sofa_side", "Aubrey_standing_night_scene_front", "Aubrey_standing_outdoor_sport_front", "Aubrey_standing_outdoor_sport_side", "Blanka_lying_outfoorreading_front", "Blanka_lying_outfoorreading_side", "Blanka_sitting_lounge_front", "Blanka_sitting_lounge_side", "Blanka_sitting_picnic_front", "Blanka_sitting_picnic_side", "Blanka_standing_outfoorbusiness_front", "Blanka_standing_outfoorbusiness_side", "Bojan_lying_lounge_front", "Bojan_lying_lounge_side", "Bojan_sitting_businesstraining_front", "Bojan_sitting_businesstraining_side", "Bojan_sitting_sport_front", "Bojan_sitting_sport_side", "Bojan_standing_businesstraining_front", "Bojan_standing_businesstraining_side", "Bojan_standing_lounge_front", "Bojan_standing_lounge_side", "Bojan_standing_sport_front", "Bojan_standing_sport_side", "Brandon_Business_Sitting_Front_public", "Brandon_Business_Sitting_Side_public", "Brandon_Business_Standing_Front_public", "Brandon_Business_Standing_Side_public", "Brandon_Casual_Sitting_Front_public", "Brandon_Casual_Sitting_Side_public", "Brandon_Kitchen_Standing_Front_public", "Brandon_Kitchen_Standing_Side_public", "Brandon_Lobby_Sitting_Front_public", "Brandon_Lobby_Sitting_Side_public", "Brandon_Lobby_Standing_Front_public", "Brandon_Lobby_Standing_Side_public", "Brandon_Office_Sitting_Front_public", "Brandon_Office_Sitting_Side_public", "Brandon_Office_Standing_Front_public", "Brandon_Office_Standing_Side_public", "Brandon_Sofa_Sitting_Front_public", "Brandon_Sofa_Sitting_Side_public", "Brent_sitting_office_front", "Brent_sitting_office_side", "Brent_sitting_sofa_front", "Brent_sitting_sofa_side", "Brent_standing_office_front", "Brent_standing_office_side", "Brent_standing_sofa_front", "Brent_standing_sofa_side", "Bryan_FitnessCoach_public", "Bryan_IT_Sitting_public", "Caroline_Business_Sitting_Front_public", "Caroline_Business_Sitting_Side_public", "Caroline_Business_Standing_Front_public", "Caroline_Business_Standing_Side_public", "Caroline_Casual_Sitting_Front_public", "Caroline_Casual_Sitting_Side_public", "Caroline_Kitchen_Standing_Front_public", "Caroline_Kitchen_Standing_Side_public", "Caroline_Lobby_Sitting_Front_public", "Caroline_Lobby_Sitting_Side_public", "Caroline_Lobby_Standing_Front_public", "Caroline_Lobby_Standing_Side_public", "Caroline_Office_Sitting_Front_public", "Caroline_Office_Sitting_Side_public", "Caroline_Office_Standing_Front_public", "Caroline_Office_Standing_Side_public", "Caroline_Sofa_Sitting_Front_public", "Caroline_Sofa_Sitting_Side_public", "Chloe_standing_lounge_front", "Chloe_standing_lounge_side", "Chloe_standing_outdoor_side", "Conrad_sitting_house_side", "Conrad_sitting_sofa_front", "Conrad_standing_house_front", "Conrad_standing_sofa_side", "Derya_sitting_indoor_front", "Derya_sitting_indoor_side", "Derya_sitting_office_front", "Derya_sitting_office_side", "Derya_standing_indoor_front", "Derya_standing_indoor_side", "Derya_standing_office_front", "Derya_standing_office_side", "Dexter_Doctor_Sitting2_public", "Dexter_Doctor_Standing2_public", "Dexter_Lawyer_Sitting_public", "Elenora_FitnessCoach2_public", "Elenora_FitnessCoach_public", "Elenora_IT_Sitting_public", "Emanuel_sitting_Sofa_side", "Emanuel_sitting_sofa_front", "Emanuel_standing_office_front", "Emanuel_standing_office_side", "Emilia_sitting_outdooryoga2_front", "Emilia_sitting_outdooryoga_front", "Emilia_sitting_outdooryoga_side", "Emilia_sitting_picnic_front", "Emilia_sitting_picnic_side", "Emilia_standing_outdoorbusiness_front", "Emilia_standing_outdoorbusiness_side", "Eric_public_lite1_20230601", "Fernando_sitting_businessindoor_front", "Fernando_sitting_businessindoor_side", "Fernando_sitting_outdoorchair_front", "Fernando_sitting_outdoorchair_front_close", "Fernando_sitting_outdoorchair_side", "Fernando_sitting_outdoortable_front", "Fernando_sitting_outdoortable_side", "Fernando_standing_outdoor_front", "Fernando_standing_outdoor_side", "Gala_lying_bedroom_front", "Gala_lying_sofa_front", "Gala_lying_sofa_side", "Gala_sitting_businesssofa_front", "Gala_sitting_businesssofa_side", "Gala_sitting_casualsofawithipad_front", "Gala_sitting_casualsofawithipad_side", "Gala_sitting_casualsofawithipad_side_close", "Gala_sitting_office_front", "Gala_sitting_office_side", "Gala_sitting_sofa_front", "Gala_sitting_sofa_front_close", "Gala_sitting_sofa_side", "Gala_sitting_sofa_side_close", "Gala_standing_businesssofa_front", "Gala_standing_businesssofa_front_close", "Gala_standing_businesssofa_side", "Gala_standing_businesssofa_side_close", "Georgia_sitting_office_front", "Georgia_sitting_office_side", "Georgia_standing_casual_front", "Georgia_standing_casual_side", "Gerardo_sitting_indoor_front", "Gerardo_sitting_indoor_side", "Gerardo_sitting_sofa_front", "Gerardo_sitting_sofa_side", "Gerardo_standing_nightscene2_front", "Gerardo_standing_nightscene_front", "Gerardo_standing_outdoorsport_front", "Gerardo_standing_outdoorsport_side", "Giulia_sitting_office_front", "Giulia_sitting_office_side", "Giulia_sitting_sofa_front", "Giulia_sitting_sofa_side", "Giulia_standing_office_front", "Giulia_standing_office_side", "Giulia_standing_sofa_front", "Giulia_standing_sofa_side", "Ida_sitting_lounge_front", "Ida_sitting_lounge_side", "Ida_sitting_sofa_front", "Ida_sitting_sofa_side", "Ida_standing_lounge_front", "Ida_standing_lounge_side", "Ida_standing_sofa_front", "Ida_standing_sofa_side", "Jocelyn_sitting_office_front", "Jocelyn_sitting_office_side", "Jocelyn_sitting_sofa_front", "Jocelyn_sitting_sofa_side", "Jocelyn_standing_office_front", "Jocelyn_standing_office_side", "Jocelyn_standing_sofa_front", "Jocelyn_standing_sofa_side", "Joel_sitting_couch_front", "Joel_sitting_couch_side", "Joel_standing_gym_front", "Joel_standing_gym_side", "Joel_standing_mountain_front", "Joel_standing_mountain_side", "Jonas_sitting_gym_front", "Jonas_sitting_gym_side", "Jonas_standing_gym_front", "Jonas_standing_gym_side", "Juan_sitting_office_front", "Juan_sitting_office_side", "Juan_sitting_sofa_front", "Juan_sitting_sofa_side", "Juan_sitting_sofacasual_front", "Juan_standing_office_front", "Juan_standing_office_side", "Juan_standing_sofa_front", "Juan_standing_sofa_side", "Juan_standing_sofacasual_front", "Judita_sitting_yoga_front", "Judita_sitting_yoga_side", "Judita_standing_yoga_front", "Judita_standing_yoga_side", "Judy_Doctor_Sitting2_public", "Judy_Doctor_Standing2_public", "Judy_Lawyer_Sitting2_public", "Judy_Teacher_Sitting2_public", "Judy_Teacher_Sitting_public", "Judy_Teacher_Standing_public", "June_HR_public", "June_sitting_office_front", "June_sitting_office_side", "June_sitting_sofacasual_side", "June_standing_office_side", "June_standing_sofacasual_side", "Kavya_sitting_sofa_front", "Kavya_sitting_sofa_side", "Kavya_standing_indoor_front", "Kavya_standing_indoor_side", "Kavya_standing_outdoor_side", "Kavya_standing_outdoorsport_front", "Kavya_standing_outdoorsport_side", "Leos_sitting_office_front", "Leos_sitting_office_side", "Leos_sitting_sofa_front", "Leos_sitting_sofa_side", "Leos_standing_office_front", "Leos_standing_office_side", "Leos_standing_sofa_front", "Leos_standing_sofa_side", "Leszek_sitting_lounge_front", "Leszek_sitting_lounge_side", "Leszek_sitting_sofa_front", "Leszek_sitting_sofa_side", "Leszek_standing_outdoorbusiness_front", "Leszek_standing_outdoorbusiness_side", "Leszek_standing_outdoorcasual_front", "Leszek_standing_outdoorcasual_side", "Lily_public_lite1_20230601", "Martina_sitting_office_front", "Martina_sitting_office_side", "Martina_sitting_sofa_front", "Martina_sitting_sofa_side", "Martina_standing_office_front", "Martina_standing_office_side", "Martina_standing_sofa_front", "Martina_standing_sofa_side", "Masha_sitting_office_front", "Masha_sitting_office_side", "Masha_sitting_sofacasual_front", "Masha_sitting_sofacasual_side", "Masha_standing_office_front", "Masha_standing_office_side", "Masha_standing_sofacasual_front", "Masha_standing_sofacasual_side", "Matteo_sitting_office_front", "Matteo_sitting_office_side", "Matteo_sitting_sofa_front", "Matteo_sitting_sofa_side", "Matteo_standing_office_front", "Matteo_standing_office_side", "Matteo_standing_sofa_front", "Matteo_standing_sofa_side", "Max_sitting_indoor_front", "Max_sitting_indoor_side", "Max_standing_outdoorsport_front", "Max_standing_outdoorsport_side", "Mido-lite-20221128", "Milena_sitting_office_front", "Milena_sitting_office_side", "Milena_sitting_sofa_front", "Milena_sitting_sofa_side", "Milena_standing_office_front", "Milena_standing_office_side", "Milena_standing_sofa_front", "Milena_standing_sofa_side", "Miles_sitting_sofa_front", "Miles_sitting_sofa_side", "Miles_standing_outdoor_front", "Miles_standing_outdoor_side", "Miles_standing_sofa_front", "Miles_standing_sofa_side", "Mireia_sitting_businessindoor_front", "Mireia_sitting_businessindoor_side", "Mireia_sitting_outdoorchair_front", "Mireia_sitting_outdoortable_front", "Mireia_sitting_outdoortable_side", "Mireia_standing_outdoor_front", "Mireia_standing_outdoor_side", "Miyu_sitting_office_front", "Miyu_sitting_office_side", "Miyu_sitting_sofabusiness_front", "Miyu_sitting_sofabusiness_side", "Miyu_sitting_sofacasual_front", "Miyu_sitting_sofacasual_side", "Miyu_standing_office_front", "Miyu_standing_office_side", "Miyu_standing_sofacasual_front", "Miyu_standing_sofacasual_side", "Noah_sitting_lobby_front", "Noah_sitting_lobby_side", "Noah_sitting_office_front", "Noah_sitting_office_side", "Noah_sitting_sofa_front", "Noah_sitting_sofa_side", "Noah_standing_lobby_front", "Noah_standing_lobby_side", "Noah_standing_office_front", "Noah_standing_office_side", "Noah_standing_sofa_front", "Noah_standing_sofa_side", "Oxana_sitting_gym_front", "Oxana_sitting_gym_side", "Oxana_sitting_office_front", "Oxana_sitting_office_side", "Oxana_sitting_sofa_front", "Oxana_sitting_sofa_side", "Oxana_sitting_yoga_front", "Oxana_sitting_yoga_side", "Oxana_standing_gym_front", "Oxana_standing_gym_side", "Oxana_standing_office_front", "Oxana_standing_office_side", "Oxana_standing_sofa_front", "Oxana_standing_sofa_side", "Oxana_standing_yoga_front", "Oxana_standing_yoga_side", "Patrizio_sitting_office_front", "Patrizio_sitting_office_side", "Patrizio_sitting_sofa_front", "Patrizio_sitting_sofa_side", "Patrizio_standing_businesstraining_front", "Patrizio_standing_businesstraining_side", "Patrizio_standing_office_side", "Piper_sitting_businesssofa_front", "Piper_sitting_businesssofa_side", "Piper_standing_education_front", "Piper_standing_education_side", "Rasmus_sitting_lounge_front", "Rasmus_sitting_lounge_side", "Rasmus_sitting_sofa_front", "Rasmus_sitting_sofa_side", "Rasmus_standing_lounge_front", "Rasmus_standing_lounge_side", "Rasmus_standing_sofa_front", "Rasmus_standing_sofa_side", "Raul_Sitting_businesssofa_front", "Raul_Sitting_businesssofa_front_close", "Raul_sitting_businesssofa_side", "Raul_sitting_casualsofanoipad_front", "Raul_sitting_casualsofanoipad_side", "Raul_sitting_casualsofawithipad_front", "Raul_sitting_casualsofawithipad_side", "Raul_sitting_office_front", "Raul_sitting_office_side", "Raul_sitting_sofa_front", "Raul_sitting_sofa_front_close", "Raul_sitting_sofa_side", "Raul_sitting_sofa_side_close", "Raul_standing_businesssofa_side", "Raul_standing_casualsofa_front", "Raul_standing_casualsofa_front_close", "Raul_standing_casualsofa_side", "Raul_standing_casualsofa_side_close", "Raul_standing_office_front", "Ren_sitting_office_front", "Ren_sitting_office_side", "Ren_sitting_sofabusiness_front", "Ren_sitting_sofabusiness_side", "Ren_sitting_sofacasual_front", "Ren_sitting_sofacasual_side", "Ren_standing_office_front", "Ren_standing_office_side", "Ren_standing_sofacasual_front", "Ren_standing_sofacasual_side", "Riley_siting_casual_front", "Riley_sitting_casual_side", "Riley_sitting_office_front", "Riley_sitting_office_side", "Roman_standing_outdoorsport_front", "Roman_standing_outdoorsport_side", "Sabine_sitting_office_front", "Sabine_sitting_sofa_side", "Sabine_standing_office_front", "Sabine_standing_office_side", "Santa_Fireplace_Front_public", "Santa_Fireplace_Side_public", "Scarlett_siiting_fireplace_front", "Scarlett_sitting_couch2_front", "Scarlett_sitting_couch2_side", "Scarlett_sitting_couch_front", "Scarlett_sitting_couch_side", "Scarlett_sitting_fireplace_side", "Scarlett_sitting_yoga_front", "Scarlett_sitting_yoga_side", "Scarlett_standing_hall_front", "Scarlett_standing_hall_side", "Shawn_Therapist_public", "SilasHR_public", "Silas_CustomerSupport_public", "Silas_sitting_lounge_front", "Silas_sitting_lounge_side", "Silas_sitting_sofa_side", "Silas_sitting_sofa_side_close", "Teodor_sitting_office_front", "Teodor_sitting_office_side", "Teodor_sitting_sofa_front", "Teodor_sitting_sofa_side", "Teodor_standing_office_front", "Teodor_standing_office_side", "Teodor_standing_sofa_front", "Teodor_standing_sofa_side", "Timothy_sitting_casual_front", "Timothy_sitting_casual_side", "Timothy_sitting_office_front", "Timothy_sitting_office_side", "Veit_sitting_sofa_front", "Veit_sitting_sofa_side", "Veit_standing_office_front", "Veit_standing_office_side", "Vemon_sitting_office_front", "Vemon_sitting_office_side", "Vemon_standing_office_front", "Vemon_standing_office_side", "Verena_sitting_sofa_front", "Verena_sitting_sofa_side", "Verena_standing_office_front", "Verena_standing_office_side", "Vernon_sitting_lounge_side", "Vernon_standing_lounge_front", "Vernon_standing_lounge_side", "Vince_sitting_businesssofa_front", "Vince_sitting_businesssofa_side", "Vince_sitting_sofacasual_front", "Vince_sitting_sofacasual_side", "Vince_standing_businesstraining_front", "Vince_standing_businesstraining_side", "Vince_standing_sofacasual_front", "Vince_standing_sofacasual_side"], {"tooltip": "HeyGen avatar ID for a photo or video avatar.", "rw_cat": "core"}]}, "optional": {"background": ["IMAGE"], "speech": ["RUNWARE_SPEECH", {"rw_socket_fields": ["language", "pitch", "speed", "text", "voice", "volume"], "rw_socket_enums": {"voice": ["chill_brian_male_english", "allison_female_english", "ivy_female_english", "john_doe_male_english", "mark_male_english_5d8c37", "monika_sogam_female_english", "hope_female_english_42d00d", "archer_male_english_453c20", "brittney_female_english", "patrick_male_english", "david_castlemore_male_english", "michael_c_male_english", "adam_stone_male_english", "alex_male_english", "james_male_english", "juniper_female_english", "cassidy_female_english", "jessica_anne_bogart_female_english", "arabella_female_english", "andrew_male_english_6be738", "spuds_oxley_male_english", "terry_male_english", "jenny_female_english", "radio_rick_male_english", "denise_female_english", "tim_in_car_excited_male_english", "iskander_male_english", "thompson_male_english", "delicate_daisy_excited_female_english", "kingston_male_english", "george_ugc_1_male_english", "bold_blake_male_english", "jane_female_english_662f98", "expressive_evan_male_english_6638ff", "marianne_ia_female_english", "aaron_male_english", "modern_recipe_host_voice_1_male_english", "willow_female_english", "cute_chloe_friendly_female_english", "rafael_male_english", "june_lifelike_female_english_68deda", "crisp_chloe_female_english", "slick_simon_male_english", "nassim_informative_male_english", "baritone_ben_male_english", "maxwell_male_english", "ellie_faye_excited_female_english", "milani_female_english_6a5abd", "feisty_fiona_excited_female_english", "professor_dean_male_english", "rose_ugc_1_mp4_female_english", "shona_female_english", "hudson_wilder_male_english", "ann_ia_female_english_6bc024", "alastair_kensington_male_english", "oxley_male_english", "christina_female_english", "andrew_rizz_male_english", "peyton_female_english", "gerardo_outdoor_male_english", "chloe_lifelike_female_english", "ann_ia_female_english_6eafa4", "stephanie_female_english_6edde9", "anthony_ia_male_english", "signal_voice_1_male_english", "luca_male_english_6HiVde", "lisa_voice_1_unknown_english", "t_w_tucker_male_english", "jack_sullivan_serious_male_english", "winter_female_english", "mireia_lifelike_female_english", "georgia_female_english", "stella_female_english", "masha_lifelike_female_english", "charming_charles_friendly_male_english", "sophie_vale_excited_female_english", "serenity_female_english", "june_lifelike_female_english_748d08", "ralph_male_english", "bethany_female_english_758fe6", "dominic_male_english", "mason_finn_male_english_75af67", "leena_female_english", "veteran_victor_male_english", "tamara_female_english", "nik_public_male_english", "storyteller_ollie_serious_male_english", "calm_chloe_female_english", "brenda_ugc_3_mp4_female_english", "sevik_male_english", "reilly_female_english", "raul_male_english", "imposing_ian_male_english", "georgia_lifelike_friendly_female_english", "relaxed_ray_male_english", "dexter_professional_male_english", "peppy_priya_excited_female_english", "relaxed_rick_male_english", "autumn_ugc_2_female_english", "instructive_isabelle_excited_female_english", "edwin_male_english", "rupert_blackwood_male_english", "ginny_female_english", "milo_baxter_male_english", "baltazar_voice_1_unknown_english", "reliable_nora_female_english", "news_reporter_voice_1_unknown_english", "gentle_gemma_female_english_7c66cd", "julie_female_english", "aya_voice_1_unknown_english", "melody_mae_female_english", "clarity_catherine_female_english", "lovely_lucy_female_english", "tee_female_english", "nicholas_male_english_96d72b", "lillian_female_english", "chike_obi_male_english", "william_prescott_soothing_male_english", "hargrove_male_english", "william_prescott_friendly_male_english", "william_prescott_serious_male_english", "harrison_cole_male_english", "harlan_male_english", "quentin_informative_male_english", "uncle_amos_male_english", "assertive_adam_male_english", "coach_cooper_male_english", "rina_female_english", "nathan_reed_male_english", "jansen_female_english", "carl_hudson_male_english", "lehka_female_english", "keisha_female_english", "teen_tara_female_english", "husky_harold_serious_male_english", "thanos_broadcaster_male_english_9ceb5d", "avery_lane_female_english", "barnaby_thorne_serious_male_english", "catherine_excited_female_english", "malcolm_jr_excited_male_english", "taylor_female_english", "madison_female_english", "tiffany_excited_female_english", "noble_nigel_male_english_9ec46d", "jay_voice_1_male_english", "kelly_female_english", "hazel_everly_female_english", "dylan_male_english", "elder_brooks_broadcaster_male_english", "cordial_christopher_male_english", "great_voice_1_male_english", "henry_worthington_male_english", "hada_female_english", "dale_male_english", "hannah_female_english", "haley_female_english", "elisa_voice_1_unknown_english", "rhosyn_female_english", "saskia_female_english", "max_outdoor_male_english", "georgia_lifelike_excited_female_english", "jayden_male_english", "miles_lifelike_male_english", "dynamic_devin_male_english", "calvin_male_english", "barbara_female_english", "choi_female_english", "marcel_ugc_1_mp4_male_english", "katya_ia_female_english", "melvin_male_english", "victor_hayes_serious_male_english", "uno_voice_1_male_english", "daran_outside_walking_excited_male_english", "connor_male_english", "leslie_female_english", "morgan_female_english_a96402", "amaris_female_english", "custom_voice_voice_1_unknown_english_A98UML", "rupert_blackwood_broadcaster_male_english", "jibran_male_english_aac0f7", "bill_male_english", "raviy_male_english", "myriam_female_english", "kenzo_male_english", "oliver_bennett_male_english", "serene_samuel_male_english", "youssef_male_english", "warm_young_adult_female_english", "rika_ia_female_english", "nancy_female_english", "jessica_female_english", "spunky_sam_male_english", "stella_2_female_english_ace0c7", "max_lifelike_male_english", "radiant_raven_female_english", "leonardo_male_english", "zara_okeke_female_english", "kind_kathleen_female_english", "sophia_voice_3_female_english", "dom_male_english", "thomas_blake_male_english", "kavya_female_english", "aly_female_english", "piper_lifelike_female_english", "byron_professional_male_english", "lovely_luna_female_english", "shawn_lifelike_male_english", "william_prescott_male_english", "evelyn_harper_friendly_female_english", "mature_morgan_male_english", "claire_lawson_excited_female_english", "roisin_female_english", "shirley_professional_female_english", "leonie_female_english", "neo_male_english", "lush_leonard_male_english", "wayne_liang_2_male_english", "emery_female_english", "kavya_outdoor_female_english", "artur_lifelike_male_english", "steve_male_english", "rey_male_english", "claire_female_english_e66d40", "george_ugc_3_male_english", "jada_female_english", "wesley_male_english", "karolina_female_english", "iris_female_english", "hada_excited_female_english", "ricardo_male_english", "hunter_male_english", "mabel_forsythe_female_english", "kristoff_male_english", "kwame_the_great_male_english", "tahlia_brooks_friendly_female_english", "tyler_kurk_informative_male_english", "biblico_voice_1_male_english", "jace_male_english", "kwame_the_great_serious_male_english", "julia_female_english", "gerardo_male_english", "shirley_female_english", "denyse_female_english", "barnaby_thorne_male_english", "asher_male_english", "catherine_female_english", "scarlett_lifelike_female_english", "mendoza_female_english", "sensual_sapphira_excited_female_english", "greg_male_english", "aswas_voice_1_unknown_english", "nina_voice_1_unknown_english", "melchor_voice_1_unknown_english_eHTH85", "tck_voice_1_female_english", "lucas_voice_1_male_english", "shah_voice_3_male_english", "dilai_voice_1_female_english_EqyAD9", "shah_voice_1_male_english", "voice_1_unknown_english_exlth8", "margaret_female_english", "peppy_priya_friendly_female_english", "kwaku_male_english", "june_female_english", "confident_connor_male_english", "olsson_female_english", "izzy_female_english", "chase_male_english", "yumi_female_english", "ten_voice_1_male_english", "rhonda_female_english", "lovely_luna_excited_female_english", "spunky_sandra_excited_female_english", "justo_male_english", "chill_chase_male_english", "lucien_male_english", "yogi_scott_male_english", "erin_female_english", "jin_professional_female_english", "myra_female_english", "timothy_lifelike_male_english", "archer_male_english_f6e122", "evelyn_harper_excited_female_english", "graham_male_english", "sebastian_male_english_f79b2a", "vibrant_vince_male_english", "mysterious_michael_broadcaster_male_english", "meilin_female_english", "lori_female_english", "alvarez_female_english", "victor_hayes_male_english", "narrative_nora_broadcaster_female_english", "alba_female_english", "vibrant_violet_friendly_female_english", "baritone_bryce_male_english", "margaret_thatcher_serious_female_english", "warrior_rohan_male_english", "journey_female_english", "dr_sterling_male_english", "pedro_ia_male_english", "professor_dean_angry_male_english", "arianna_female_english", "nadim_male_english", "malcolm_jr_male_english", "cute_chloe_female_english_fc3a1b", "levi_male_english", "sina_female_english", "mysterious_michael_male_english", "lulu_lollipop_female_english", "jon_male_english", "judy_professional_female_english_fd9c68", "ryan_male_english", "robin_female_english", "milani_female_english_fe1eb4", "arthur_blackwood_male_english", "dynamic_daisy_female_english_1b4dd4", "bd_male_english", "marcel_ugc_3_mp4_male_english", "gregory_male_english", "kaison_male_english", "hi_voice_1_male_english", "thanos_excited_male_english", "cute_chloe_excited_female_english", "calm_eva_soothing_female_english", "kurt_male_english", "michael_male_english", "lush_leonard_serious_male_english", "jayla_female_english_1f2f09", "sunny_male_english", "bastien_male_english", "mark_voice_1_unknown_english", "bruce_male_english", "quinn_female_english_207e0f", "douglas_male_english", "zesty_zeke_male_english", "adeline_female_english", "vince_lifelike_male_english", "alec_best_voice_male_english", "vivacious_vince_male_english", "abigail_female_english", "chill_chase_friendly_male_english", "nevaeh_female_english", "leif_male_english", "arnav_male_english", "finn_male_english", "epic_eli_male_english", "epic_eli_excited_male_english", "engaging_evan_male_english", "gentle_gabe_male_english", "tristan_male_english", "mikkel_male_english", "an_ugc_3_female_english", "frances_female_english", "regal_roger_male_english", "bo_male_english", "william_prescott_angry_male_english", "baraka_mwangi_male_english", "bethany_female_english_250a27", "elise_female_english", "larry_male_english", "energetic_mikey_male_english", "isabelle_female_english", "karen_female_english", "leyla_female_english", "jeyla_female_english", "pragmatic_peter_male_english", "ellie_faye_serious_female_english", "deepened_dave_male_english", "intense_isaac_male_english", "vivian_hartley_female_english", "feisty_fiona_broadcaster_female_english", "melina_voice_1_female_english", "dynamic_derek_broadcaster_male_english", "warm_william_serious_male_english", "margaret_thatcher_female_english", "luna_bright_female_english", "ross_male_english", "composed_carla_female_english", "refined_rupert_male_english", "sebastian_male_english_2bed55", "zoya_female_english", "maya_female_english_2cca78", "kyle_male_english", "lively_liam_serious_male_english", "supply_voice_1_unknown_english", "adriana_female_english", "declan_male_english", "lea_female_english", "radiant_riley_female_english_2e28aa", "sporty_shane_male_english", "ann_professional_female_english", "cliff_male_english", "charlie_female_english", "husky_harold_male_english_2eb11e", "tao_avatar_by_heygen_voice_1_female_english", "rugged_ron_male_english", "derya_lifelike_serious_female_english", "gruff_greg_male_english", "lucas_male_english", "playful_priti_female_english", "griffin_steele_male_english", "lp_voice_1_unknown_english", "oso_peloso_voice_1_unknown_english", "kaitlyn_female_english", "ross_ugc_1_mp4_male_english", "bentley_male_english", "harriet_female_english", "george_ugc_4_male_english", "surfer_girl_female_english", "tck_voice_1_male_english", "jessica_voice_1_unknown_english", "archimedes_voice_1_male_english", "centa_new_voice_1_male_english", "lucas_voice_1_unknown_english", "tuta_voice_1_male_english", "abhishek_voice_1_male_english", "toto_voice_1_female_english", "biobloom_male_pro_voice_1_unknown_english", "ally_voice_1_unknown_english", "voice_1_female_english_aWRKid", "emma_voice_1_female_english", "lincoln_male_english", "olivia_female_english_b07347", "jennifer_ugc_2_mp4_female_english", "ryan_carter_male_english", "magical_riya_female_english", "professor_percy_male_english", "cute_chloe_female_english_b24662", "kendra_female_english", "vesperi_female_english", "derya_lifelike_female_english", "jayla_female_english_b37f74", "thanos_male_english", "ethan_grant_male_english", "anisa_female_english", "judy_female_english", "gritty_george_male_english", "daphne_female_english_b4efe5", "juniper_male_english", "fena_female_english", "cody_male_english_b54cd1", "robert_informative_male_english", "ella_hastings_excited_female_english", "benedict_shaw_male_english", "tony_male_english", "diana_female_english_b5f67a", "maya_female_english_b6313b", "fabian_male_english", "graham_ia_male_english", "gane_female_english", "annie_neutral_female_english", "derya_lifelike_soothing_female_english", "malcolm_jr_friendly_male_english", "nyah_female_english", "stirring_samuel_male_english", "bryan_informative_male_english", "kyra_female_english", "faria_female_english", "sloane_female_english", "david_carder_voice_1_male_english", "sensual_sapphira_friendly_female_english", "ji_soo_voice_1_female_english", "bojan_male_english", "oskar_male_english", "katherine_female_english", "lila_quinn_female_english", "mike_male_english", "fernando_male_english", "daniela_voice_1_unknown_english", "sonja_female_english", "hank_male_english", "anders_male_english", "zihan_male_english", "grim_gregory_male_english", "linda_female_english", "annie_soothing_female_english", "theo_male_english", "kwame_the_great_angry_male_english", "lovely_luna_friendly_female_english", "bryan_professional_male_english_bd9106", "noble_nathan_male_english", "yuna_female_english", "callum_male_english", "logan_hayes_soothing_male_english", "lehka_excited_female_english", "bryan_professional_male_english_beda79", "betania_female_english_bf3ceb", "olivia_female_english_bfa319", "dynamic_derek_excited_male_english", "loly_voice_1_female_english", "ellie_female_english", "neo_voice_1_female_english", "hpt_nam_2_voice_1_male_english", "atlas_voice_1_male_english", "mark_male_english_c022ff", "tranquil_tim_male_english", "mathis_male_english", "albert_male_english", "hudson_male_english", "frdo_le_jurassien_male_english", "morgan_female_english_c0c5cc", "silvia_female_english_c1d64d", "affable_alex_male_english", "samuel_male_english", "yogi_scott_friendly_male_english", "sir_henry_male_english", "bradley_informative_male_english", "jonas_male_english", "onat_male_english", "abigail_lifelike_female_english", "kathy_female_english", "silvia_female_english_c45c98", "owen_male_english_c46978", "brit_narrator_male_english", "barry_male_english", "teresa_female_english", "tariq_male_english", "george_male_english", "fresh_faith_female_english", "ricky_male_english_c701a9", "rex_male_english", "matt_male_english", "chaim_male_english", "marcel_ugc_4_mp4_male_english", "hada_lifelike_female_english", "tijs_male_english", "arthur_male_english", "peppy_priya_female_english", "reliable_nora_excited_female_english", "breezy_bob_male_english", "annie_calm_female_english", "dynamic_daisy_female_english_4d2044", "patel_male_english", "eleanor_grey_female_english", "vibrant_violet_female_english", "aiden_male_english", "tessa_female_english", "sajan_male_english", "mason_finn_male_english_4f0de4", "baron_deep_male_english", "arman_male_english", "ashley_female_english", "ramisa_female_english", "georgia_lifelike_female_english", "annelore_female_english", "brandon_male_english", "kevin_male_english", "gabriela_female_english_517a8d", "ann_professional_public_female_english", "grace_female_english", "quinn_female_english_52231d", "brenda_ugc_2_mp4_female_english", "bouncy_bailey_excited_female_english", "ross_ugc_4_mp4_male_english", "sturdy_simon_male_english", "bryce_male_english", "owen_male_english_53c5db", "nour_female_english", "autumn_ugc_1_female_english", "gravelly_grant_male_english", "armando_lifelike_male_english", "alden_male_english", "monica_harris_female_english", "joel_outdoor_male_english", "assertive_adam_excited_male_english", "college_girl_lexi_female_english", "genesis_female_english", "joy_female_english_550dbf", "diana_female_english_55a250", "xavier_male_english", "quinn_male_english", "mellow_mandy_female_english", "ethan_west_male_english", "noble_nigel_friendly_male_english", "anastasia_ia_female_english", "sandoval_female_english", "holden_male_english", "joel_lifelike_male_english", "ryanhoover_male_english", "marcus_male_english", "aubrey_outdoor_female_english", "fortress_finn_male_english", "sadie_female_english", "georgia_lifelike_broadcaster_female_english", "pam_female_english", "intense_isaac_serious_male_english", "ellie_faye_soothing_female_english", "aria_james_female_english", "emory_female_english", "blunt_ben_male_english", "gritty_george_broadcaster_male_english", "silas_lifelike_male_english_5c8379", "pamela_female_english", "raya_female_english", "travis_male_english", "elegant_evan_male_english", "holly_female_english", "barnaby_thorne_excited_male_english", "oliver_hart_excited_male_english", "lila_whisper_female_english", "mr_thunder_male_english", "rita_female_english", "brooklyn_female_english_5eb15f", "emma_female_english", "gravelly_gwen_female_english", "imani_female_english", "claire_lawson_broadcaster_female_english", "morgan_female_english_5f8bdd", "ellie_faye_female_english", "obamcharm_voice_2_unknown_english", "mistica_misteriosa_3_voice_1_female_english", "shawn_ia_male_english", "elenora_professional_female_english", "bouncy_bailey_female_english", "david_boles_informative_male_english", "armando_male_english", "allen_male_english", "crisanto_male_english", "grace_elder_female_english", "helen_female_english", "canyon_rivers_male_english", "derya_lifelike_excited_female_english", "mellow_marcus_male_english", "jack_sterling_broadcaster_male_english", "brenda_ugc_1_mp4_female_english", "reid_male_english", "reagan_female_english", "anchorman_tony_male_english", "jane_female_english_c83c9f", "damian_male_english", "tahlia_brooks_female_english", "hazel_female_english", "bennett_male_english", "gabrielle_female_english", "catherine_soothing_female_english", "sergio_male_english", "zain_female_english_cac50a", "wayne_ia_male_english", "instructive_isabelle_female_english", "ruben_male_english", "jett_male_english", "leszek_male_english", "julian_male_english", "9_voice_1_unknown_english", "joanne_female_english", "freya_female_english", "hope_informative_female_english", "elora_female_english", "jinwoo_male_english", "emre_male_english", "zuri_female_english", "yogi_scott_soothing_male_english", "harmony_harper_female_english", "aparna_voice_1_female_english", "albert_keinstein_voice_3_male_english", "boda_voice_1_male_english", "akhil_voice_1_male_english", "annie_pvc_versatile_female_english", "silas_lifelike_male_english_d03bf9", "alexis_female_english", "giulia_female_english", "polished_piper_female_english", "fola_female_english", "epic_eli_friendly_male_english", "casual_chris_male_english", "obi_male_english", "evan_male_english", "darrell_male_english", "susannah_female_english", "ellie_faye_friendly_female_english", "nelly_female_english", "serene_simon_excited_male_english", "plain_joe_male_english", "jasmine_female_english", "hugo_male_english", "silvia_voice_1_female_english", "andrew_male_english_d642ce", "jovial_jack_male_english", "captivating_clark_male_english", "darlene_female_english", "esposito_female_english", "connie_professional_female_english", "percy_b_shelley_voice_1_male_english", "dynamic_derek_male_english_d84493", "calistina_female_english", "ernest_male_english", "thanos_friendly_male_english", "kaleb_male_english", "thaddeus_ia_male_english", "betty_female_english_da3cad", "elder_brooks_male_english", "orson_male_english", "ed_engineer_voice_1_male_english", "lively_liam_male_english", "lucy_female_english", "jason_male_english_db7868", "derya_lifelike_friendly_female_english", "victor_male_english", "varrick_male_english", "ella_hastings_female_english", "instructor_ishaan_male_english", "lush_leonard_friendly_male_english", "colton_male_english", "kennedy_female_english", "ameila_female_english", "minho_male_english", "wyatt_male_english", "sven_male_english", "lian_male_english", "corsaro_female_english", "clint_male_english", "eva_voice_1_unknown_english", "sally_sourcing_voice_1_female_english", "custom_voice_voice_1_female_english", "ai_voice_1_male_english", "annelise_female_english", "yola_professional_female_english", "leos_lifelike_male_english", "ruth_female_english", "emanuel_male_english", "mr_evil_male_english", "charming_charlie_excited_male_english", "brayden_male_english", "wizie_girl_voice_1_female_english", "mentis_voice_1_male_english", "sal_supplier_voice_1_male_english", "fausetonic_voice_1_female_english", "santa_voice_1_unknown_english", "yash_voice_1_unknown_english", "voice_1_female_english_gllmNj", "tennyson_voice_1_male_english", "anand_voice_1_male_english", "argos_voz_male_english", "haemin_voice_1_unknown_english", "tech_podcast_aesthetic_voice_1_male_english", "test_1_voice_1_female_english", "michelle_voice_1_female_english_h2DYdw", "tim_voice_1_unknown_english", "jolie_voice_2_female_english", "pete_voice_2_male_english", "urea_voice_1_female_english", "kalamah_voice_1_female_english", "zanele_voice_1_male_english", "technical_townhall_host_voice_1_female_english", "david_carter_voice_1_male_english", "grumpy_gravel_68_male_english", "sarah_voice_1_unknown_english", "voice_1_unknown_english_isOAZh", "john_voice_1_male_english", "sofia_voice_1_female_english", "imaan_voice_1_female_english", "monemacer_voice_1_unknown_english", "doctor_voice_1_unknown_english", "line_voice_1_female_english", "gato_voice_1_male_english", "voice_1_female_english_JSoUd4", "jonn_voice_1_male_english", "my_avatar_voice_1_male_english", "sunmi_voice_1_female_english", "fiona_voice_1_female_english", "aiko_female_english", "marc_voice_1_unknown_english", "zain_voice_1_male_english_KTFmHV", "araj_voice_1_male_english", "enge_voice_1_unknown_english", "young_lady_voice_1_female_english", "voice_1_unknown_english_Lh04Cq", "annie_voice_3_female_english", "jeyla_voice_1_female_english", "shivani_voice_3_female_english", "raman_voice_1_male_english", "ellie_operation_voice_1_female_english", "daniel_voice_3_unknown_english", "aakash_voice_1_female_english", "danny_voice_1_male_english", "shirley_voice_1_female_english", "mona_voice_1_unknown_english", "rae_voice_1_unknown_english", "elena_rossi_voice_1_female_english", "the_wilderness_trapper_voice_1_male_english", "sal_supplier_male_english", "lyra2_voice_1_female_english_nt01na", "linda_voice_1_female_english", "argos_voice_1_male_english", "sue_voice_1_female_english", "maryann_voice_1_female_english", "sara_voice_2_female_english", "juliet_bilikov_voice_1_female_english", "terra_voice_1_female_english", "custom_voice_voice_1_unknown_english_PiqKSP", "voice_3_female_english", "ripple_ron_voice_1_male_english", "bruce_voice_1_unknown_english", "karren_voice_1_female_english", "flava_voice_1_unknown_english", "anna_voice_1_female_english", "synergen_voice_1_female_english", "sehrina_voice_1_female_english", "bozhena_voice_1_unknown_english", "babbo_natale_voice_1_male_english", "alex_wild_voice_3_male_english", "mirror_selfie_voice_1_unknown_english", "podcaster_voice_1_male_english", "lexy_voice_1_unknown_english", "zanele_voice_1_female_english", "ed_engineer_male_english", "charles_voice_1_unknown_english", "kalamah_voice_2_female_english", "mark_voice_1_male_english", "nidhi_1_female_english", "urea_voice_1_unknown_english", "blake_voice_1_male_english", "e_voice_1_female_english", "boda_voice_2_male_english", "melchor_voice_1_unknown_english_SzFSpl", "flava_voice_3_male_english", "thommy_voice_1_male_english", "nayyara_voice_1_unknown_english", "clu_voice_1_male_english_theSuq", "news_voice_1_male_english", "voice_1_female_english_U9FnQt", "denis_voice_3_male_english", "nima_juli_female_english", "matias_voice_1_male_english", "sophie_female_english", "gonalo_voice_1_unknown_english", "clu_voice_1_male_english_vElehP", "recidivista_unknown_english", "imelda_voice_1_unknown_english", "la_cubana_voice_1_female_english", "bruno_voice_1_male_english", "elias_voice_1_male_english", "remona_voice_1_unknown_english", "carlos_voice_1_male_english", "3_voice_1_female_english", "sara_voice_1_female_english", "mc_lp_phc_voice_1_unknown_english", "bill_voice_1_unknown_english", "storyteller_voice_1_female_english", "danil_voice_1_male_english", "shivani_voice_1_unknown_english", "demo_voice_1_female_english", "ossus_avatar_voice_1_unknown_english", "manuela_2_voice_1_female_english", "teacher_voice_1_unknown_english", "lyra2_voice_1_female_english_y0iMe4", "lisa_female_english", "dialagent_voice_1_unknown_english", "diego_voice_1_female_english", "sdsad_voice_1_female_english", "coleridge_voice_1_male_english", "xdynomoney_voice_1_male_english", "soft_glam_look_voice_1_unknown_english", "mimi_voice_1_female_english", "lisa_voice_1_female_english", "mirror_voice_1_male_english", "zain_female_english_004773", "aria_female_english", "caryns_female_english", "klara_female_english", "shaun_male_english", "senthil_male_english", "cody_male_english_01f98e", "saffron_female_english", "blanka_lifelike_female_english", "rami_male_english", "rhodes_female_english", "michelle_voice_1_female_english_02X8sH", "autumn_ugc_3_female_english", "reassuring_rupert_male_english", "rose_ugc_2_mp4_female_english", "derya_lifelike_broadcaster_female_english", "dynamic_derek_male_english_0516c2", "augustus_male_english", "thanos_broadcaster_male_english_054af4", "marcia_female_english", "camden_male_english", "rumi_female_english", "william_prescott_broadcaster_male_english", "sammy_female_english", "ben_male_english", "smooth_dev_male_english", "peppy_stella_female_english", "silas_male_english", "aditya_male_english", "christy_female_english", "elio_male_english", "ida_lifelike_female_english", "jeff_male_english", "tahlia_brooks_excited_female_english", "ben_hart_male_english", "skylar_female_english", "relaxed_reece_male_english", "daniel_male_english", "melani_female_english", "clover_female_english", "alex_wright_informative_male_english", "confident_connor_excited_male_english", "paisley_female_english", "palma_female_english", "leigh_female_english", "radiant_riley_friendly_female_english", "marcus_professional_male_english", "charming_charles_male_english", "nichalia_schwartz_informative_female_english", "georgia_lifelike_soothing_female_english", "axel_voice_1_unknown_english", "lucy_voice_1_unknown_english", "zain_voice_1_male_english_0mQ33G", "toto_voice_3_female_english", "kristy_female_english", "gerardo_lifelike_male_english", "delicate_daisy_female_english", "ross_ugc_3_mp4_male_english", "iker_male_english", "atlas_male_english", "canyon_rivers_broadcaster_male_english", "reginald_hawke_male_english", "fresh_finn_male_english", "grandpa_joe_male_english", "leonard_male_english", "mellow_michael_male_english", "william_prescott_excited_male_english", "jane_female_english_142e37", "menon_male_english", "lily_female_english_149796", "travis_friendly_male_english", "april_female_english", "serene_simon_male_english", "tiffany_friendly_female_english", "brianna_female_english", "knox_male_english", "an_ugc_1_female_english", "dustin_male_english", "evelyn_harper_female_english", "laurel_female_english", "seema_professional_female_english", "morris_male_english", "jibran_male_english_16b83d", "clive_male_english", "soothing_sage_male_english", "noah_lewis_male_english", "autumn_ugc_4_female_english", "affable_aaron_male_english", "griffin_male_english", "calm_eva_female_english", "solveig_female_english", "sawyer_male_english", "dynamic_dylan_male_english", "norman_male_english", "alexander_male_english", "warrior_rohan_broadcaster_male_english", "norman_serious_male_english", "samantha_female_english", "mature_morgan_excited_male_english", "voice_1_female_english_1az9h5", "rose_ugc_3_mp4_female_english", "relaxed_reece_broadcaster_male_english", "veronica_female_english", "warm_william_male_english", "ariana_female_english", "adventure_alex_excited_female_english", "lush_leonard_excited_male_english", "ethan_male_english", "jude_male_english", "claire_lawson_friendly_female_english", "annie_lifelike_female_english", "joy_female_english_3314e5", "madelyn_female_english", "krista_female_english", "rowain_male_english", "idris_male_english", "kristen_female_english", "obamcharm_voice_1_male_english", "alyssa_female_english", "catherine_friendly_female_english", "gentleman_george_male_english", "theatrical_thomas_male_english", "norman_friendly_male_english", "gentle_gemma_excited_female_english", "zosia_female_english", "sophie_blake_friendly_female_english", "brandon_public_male_english", "energetic_edmund_male_english", "aurora_female_english", "aubrey_lifelike_female_english", "wendy_female_english", "solemn_scott_male_english", "legendary_lawrence_male_english", "eric_male_english", "lily_female_english_39f19a", "ricky_male_english_3a270e", "adventure_alex_friendly_female_english", "fresh_faith_excited_female_english", "chukwu_female_english", "sullivan_male_english", "esmond_male_english", "narrative_nora_serious_female_english", "geoff_male_english", "harmonious_hannah_female_english", "expressive_evan_male_english_3c2a9d", "raspy_rupert_male_english", "melina_female_english", "devlin_male_english", "sophie_vale_serious_female_english", "jennifer_ugc_3_mp4_female_english", "luciana_female_english", "monica_female_english", "echoing_eric_male_english", "adventure_alex_female_english", "annie_excited_female_english", "lush_leonard_broadcaster_male_english", "james_hawthorne_male_english", "kumar_male_english", "callahan_male_english", "quiet_quinn_male_english", "roland_male_english", "betty_female_english_3f7ca7", "nico_male_english", "prueba_voice_1_unknown_english", "voice_3_male_english", "zoe_female_english", "malik_male_english", "caroline_public_female_english", "george_ugc_male_english", "obi_broadcaster_male_english", "norman_broadcaster_male_english", "logan_hayes_male_english", "sarita_female_english", "husky_harold_male_english_42edca", "antea_female_english", "emmett_male_english", "oxana_female_english", "leah_female_english", "david_male_english", "mabel_forsythe_serious_female_english", "amit_male_english", "amina_ia_female_english", "okafor_male_english", "luca_male_english_48a24f", "rachel_female_english", "elder_ambrose_male_english", "harper_female_english", "nick_male_english", "justo_professional_male_english", "jolie_voice_1_unknown_english", "vinan_female_english", "empathetic_eli_male_english", "plain_joe_broadcaster_male_english", "lauren_female_english", "silvia_female_english_7df8d9", "dj_troy_male_english", "daniel_hayes_male_english", "stella_zhu_female_english", "judy_professional_female_english_7ffb69", "mr_cristmas_voice_1_unknown_english", "dilai_voice_1_female_english_7UIMGg", "mimimi_voice_1_female_english", "maximilian_male_english", "stephanie_female_english_80b0df", "deep_douglas_male_english", "ann_female_english", "ezran_male_english", "shawn_male_english", "daphne_female_english_812d4e", "claire_lawson_female_english", "affable_alice_female_english", "tahlia_female_english", "jennifer_ugc_1_mp4_female_english", "anxious_allen_male_english", "jack_sterling_friendly_male_english", "zayne_male_english", "nina_female_english", "oliver_hart_male_english", "lea_in_car_friendly_female_english", "santa_public_male_english", "reliable_tom_male_english", "georgia_lifelike_serious_female_english", "august_professional_male_english", "diora_female_english", "lesly_female_english", "gala_excited_female_english", "elisabetta_female_english", "barb_female_english", "finlay_male_english", "fleur_female_english", "chester_male_english", "alexa_female_english", "freja_female_english", "nicholas_male_english_89732a", "pierce_male_english", "cecil_male_english", "soothed_samuel_male_english", "gritty_griffin_male_english", "gabriela_female_english_8b1fe3", "riley_lifelike_male_english", "carolyn_female_english", "sage_spencer_male_english", "betania_female_english_8bfb4e", "henry_male_english", "gary_male_english", "jack_sterling_serious_male_english", "bright_beatrice_female_english", "an_ugc_4_female_english", "shane_male_english", "naya_female_english", "daran_outside_sitting_2_excited_male_english", "storyteller_ollie_male_english", "madeline_female_english", "javier_male_english", "professor_dean_serious_male_english", "radiant_riley_female_english_8f0350", "jocelyn_female_english", "grand_richard_male_english", "brooks_male_english", "tough_timothy_male_english", "sally_sourcing_female_english", "v_voice_1_female_english", "little_annie_female_english", "swift_sam_male_english", "lively_liam_friendly_male_english", "deep_douglas_serious_male_english", "william_axel_male_english", "lia_female_english", "sophie_blake_female_english", "adele_female_english", "feisty_fiona_female_english", "kenny_male_english", "playful_paige_female_english", "jack_sullivan_male_english", "chill_chase_excited_male_english", "ross_ugc_2_mp4_male_english", "marek_male_english", "araj_male_english", "elder_brooks_friendly_male_english", "noble_nicholas_male_english", "hope_female_english_94e5f7", "savannah_female_english", "optimist_ollie_male_english", "celestine_female_english", "zaire_male_english", "narrative_nolan_male_english", "eliza_1_female_english", "becca_5_female_english", "daran_inside_sitting_male_english", "juliet_4_female_english", "tonya_4_female_english", "janelle_5_female_english", "kira_3_female_english", "amber_4_female_english", "clara_5_female_english", "lea_in_car_2_female_english", "stella_5_female_english", "lucas_inside_standing_male_english", "dora_3_female_english", "janelle_1_female_english", "lucas_inside_black_hoodie_male_english", "lila_4_female_english", "eliza_5_female_english", "daran_outside_sitting_2_male_english", "dora_5_female_english", "lea_on_balcony_female_english", "kira_2_female_english", "kelsey_5_female_english", "kim_inside_sitting_female_english", "kelsey_2_female_english", "juliet_3_female_english", "amber_1_female_english", "stella_2_female_english_f541fb", "avery_4_female_english", "juliet_5_female_english", "ariella_5_female_english", "kelsey_4_female_english", "amber_5_female_english", "ariella_3_female_english", "jacob_2_male_english", "kira_4_female_english", "juliet_2_female_english", "tim_outside_sitting_male_english", "juliet_1_female_english", "tim_at_cafe_male_english", "kelsey_3_female_english", "gail_outside_walking_female_english", "kelsey_1_female_english", "jacob_4_male_english", "dora_2_female_english", "jacob_5_male_english", "nash_4_male_english", "dora_1_female_english", "daran_outside_walking_male_english", "belinda_3_female_english", "lukas_in_car_male_english", "lea_inside_sitting_female_english", "lea_outside_walking_female_english", "daran_outside_sitting_male_english", "gail_inside_standing_female_english", "avery_5_female_english", "belinda_2_female_english", "jacob_1_male_english", "lea_inside_beige_top_female_english", "kim_gym_walking_female_english", "eliza_3_female_english", "ariella_2_female_english", "becca_2_female_english", "janelle_2_female_english", "tim_in_car_male_english", "stella_4_female_english", "becca_4_female_english", "eliza_2_female_english", "jacob_3_male_english", "lea_inside_female_english", "tim_laying_inside_male_english", "tonya_5_female_english", "tonya_2_female_english", "belinda_4_female_english", "becca_3_female_english", "janelle_4_female_english", "avery_1_female_english", "tim_outside_at_cafe_male_english", "lila_3_female_english", "eliza_4_female_english", "becca_1_female_english", "nash_2_male_english", "janelle_3_female_english", "clara_1_female_english", "lucas_outside_at_cafe_male_english", "daran_inside_booth_male_english", "lila_1_female_english", "avery_2_female_english", "belinda_1_female_english", "jackson_narration_angry_male_english", "scarlett_professional_female_english", "jackson_narration_male_english", "alexander_narration_male_english", "glenn_natural_male_english", "lester_natural_male_english", "levi_friendly_male_english", "claire_cheerful_female_english", "charlotte_narration_female_english", "dylan_cheerful_male_english", "caleb_cheerful_male_english", "warren_narration_male_english", "samuel_narration_male_english", "douglas_professional_male_english", "mason_natural_male_english", "hailey_calm_female_english", "kenneth_natural_male_english", "jeffery_natural_male_english", "audrey_cheerful_female_english", "troy_natural_male_english", "harry_narration_male_english", "arnold_cheerful_male_english", "ethan_professional_male_english", "julian_narration_male_english", "sophia_narration_friendly_female_english", "adam_natural_male_english", "grace_natural_female_english", "paul_natural_male_english", "benjamin_professional_male_english", "alison_cheerful_female_english", "bruce_natural_male_english", "dean_natural_male_english", "roy_natural_male_english", "dennis_cheerful_male_english", "keith_cheerful_male_english", "noah_bennett_male_english", "noble_nigel_male_english_337466", "chloe_rivers_female_english", "carter_lee_male_english", "grace_parker_female_english", "assertive_adam_friendly_male_english", "ethan_cole_male_english", "assertive_adam_serious_male_english", "timid_tommy_male_english", "bubbly_bella_female_english", "bold_ben_male_english", "millennial_molly_female_english", "zane_the_zany_friendly_male_english", "whispering_will_soothing_male_english", "sage_sawyer_friendly_male_english", "vivacious_veronica_excited_female_english", "daisy_female_english", "evangeline_wilder_female_english", "relaxed_rachel_female_english", "hushed_heather_female_english", "zippy_zoe_female_english", "bright_bella_female_english", "brooklyn_excited_female_english", "maverick_stone_male_english", "sarah_stone_female_english", "calm_caleb_male_english", "pixie_piper_excited_female_english", "catalina_professional_female_english", "assertive_anna_female_english", "claire_female_english_768069", "pleasant_pete_friendly_male_english", "breezy_beatrice_excited_female_english", "miss_loreta_female_english", "zippy_zoe_excited_female_english", "valley_girl_vicky_female_english", "formal_fiona_excited_female_english", "whispering_will_male_english", "vivacious_veronica_female_english", "nervous_nick_male_english", "classic_christopher_male_english", "spirited_sophie_serious_female_english", "kiara_female_english", "breezy_beatrice_serious_female_english", "evangeline_wilder_excited_female_english", "kai_chen_male_english", "lively_lily_female_english", "pixie_piper_female_english", "spirited_suraj_male_english", "jason_broadcaster_male_english", "millennial_molly_excited_female_english", "lively_liam_excited_male_english", "formal_fiona_female_english", "gentle_george_male_english", "trendy_tyrone_male_english", "earnest_edward_male_english", "pixie_piper_friendly_female_english", "energetic_ella_broadcaster_female_english", "robo_rex_male_english", "alistair_blackwood_male_english", "barrister_bennett_male_english", "meadow_lark_female_english", "zane_brooks_male_english", "luminous_lara_female_english", "relaxed_rachel_excited_female_english", "bright_bella_excited_female_english", "breezy_beatrice_female_english", "claire_excited_female_english", "energetic_elijah_male_english", "gentle_gemma_female_english_7f0f09", "smiley_stacy_female_english", "rugged_rob_male_english", "energetic_ella_female_english", "gerald_male_english", "zane_the_zany_broadcaster_male_english", "spirited_sophie_excited_female_english", "pleasant_pete_male_english", "spirited_sophie_friendly_female_english", "stately_simon_male_english", "spirited_sophie_female_english", "zane_the_zany_male_english", "sage_silas_male_english", "jason_male_english_cc24de", "alfie_male_english", "evangeline_wilder_friendly_female_english", "zane_the_zany_excited_male_english", "jason_friendly_male_english", "sage_sawyer_male_english", "brooklyn_female_english_d9546f", "ethan_brooks_male_english", "millennial_molly_friendly_female_english", "kira_1_female_english", "algieba_male_english", "laomedeia_female_english", "cerise_cheerful_female_english", "rudi_friendly_male_english", "keanan_natural_male_english", "jahmai_friendly_male_english", "wilder_natural_male_english", "tony_professional_male_english", "jenny_professional_female_english", "ryan_professional_male_english", "sara_cheerful_female_english", "christopher_calm_male_english", "bella_friendly_female_english", "eric_newscaster_male_english", "liam_professional_male_english", "sherry_friendly_female_english", "michelle_natural_female_english", "johan_friendly_male_english", "tracy_cheerful_male_english", "josie_cheerful_female_english", "delbert_cheerful_male_english", "ana_cheerful_female_english", "davis_professional_male_english", "isabella_cheerful_female_english", "sonia_warm_female_english", "luke_professional_male_english", "clara_professional_female_english", "wayne_natural_male_english", "natasha_professional_female_english", "leah_natural_female_english", "amber_friendly_female_english", "luna_natural_female_english", "neerja_newscaster_female_english", "emily_natural_female_english", "kuya_jerry_male_filipino", "violet_female_", "august_male_", "sbastien_male_french", "satoshi_male_japanese", "dynamic_derya_female_turkish", "y_voice_3_female_unknown", "galle_female_french", "pedro_lima_male_portuguese", "sara_martin_female_spanish", "etienne_lefebvre_male_french", "mc_anh_c_male_vietnamese", "savvy_stefano_male_italian", "string_voice_3_male_unknown", "tech_podcast_aesthetic_voice_3_unknown_unknown", "darnell_male_", "seb_male_indonesian", "ana_carvalho_friendly_female_portuguese", "camila_vega_female_spanish", "screaming_george_male_german", "sofia_brazil_excited_female_portuguese", "tran_kim_hung_male_vietnamese", "brent_male_", "barb_female_", "harper_female_", "muskaan_female_hindi_6dffed", "jean_petit_male_french", "ashley_female_", "sana_female_arabic", "lively_laura_female_spanish", "antonio_male_spanish", "larisa_actrisa_female_russian", "conrad_male_", "jokesh_male_", "yaroslava_female_ukrainian", "marcel_male_french_722e1d", "lise_laurent_female_french", "curious_diego_friendly_male_spanish", "serene_marco_male_italian", "martin_li_male_chinese", "marie_female_french", "enrique_m_nieto_male_spanish", "lex_male_", "audrey_female_french_7459d7", "diego_martinez_male_spanish", "david_voice_3_unknown_unknown", "amit_gupta_male_italian", "murmuring_matteo_male_italian", "amina_voice_2_unknown_unknown", "thomas_male_unknown", "vibrant_victor_friendly_male_spanish", "steady_surya_male_indonesian", "thomas_hansen_male_danish", "shelley_female_japanese", "giovanni_rossi_male_italian_7b6722", "poised_pilar_female_spanish", "ranga_male_hindi_7cc104", "khanhlq_male_vietnamese", "lucrezia_voice_2_female_unknown", "jase_male_", "voice_2_male_unknown", "mo_male_arabic", "steadfast_stefan_excited_male_german", "dudu_female_", "karl_weber_male_german", "tho_lan_male_french", "luca_brasi_male_japanese", "uploaded_avatar_voice_2_male_unknown", "vit_dng_male_vietnamese", "borges_male_portuguese", "david_voice_2_unknown_unknown", "alexander_kensington_male_portuguese", "quiet_dieter_serious_male_german", "daran_male_", "jaxon_male_unknown", "mellow_manuel_male_spanish", "dexter_male_", "aubrey_female_", "demi_female_unknown", "arjun_male_hindi", "radiant_rio_male_indonesian", "tiago_male_portuguese", "nolan_male_unknown", "arabella_female_portuguese", "amina_voice_1_unknown_unknown", "rami_idris_male_arabic", "rick_male_hindi", "amelia_female_", "marcus_male__a17f4c", "martin_dupont_aimable_male_french", "nichalia_schwartz_female_japanese", "luca_sabia_friendly_female_spanish", "marco_male_en", "rafael_cruz_excited_male_spanish", "gentle_gita_female_hindi", "jeevan_male_portuguese", "scarlett_female_", "haseeb_male_french", "ate_lyn_female_filipino", "carmelo_la_rosa_male_hindi", "shakuntala_female_hindi", "nadia_female_russian", "izzy_female_", "gentle_greta_soothing_female_german", "gravitas_giovanni_excited_male_italian", "david_voice_1_unknown_unknown", "manav_male_hindi", "serene_sofia_female_portuguese", "abrar_sabbah_female_arabic", "tahlia_female_", "wolf_spencer_male_german", "saanu_female_hindi_ae132a", "milena_female_bulgarian", "hushed_hiba_female_arabic", "camilla_female_unknown", "mario_male_spanish", "pleasant_petra_excited_female_german", "fajar_hadi_male_indonesian", "dash_voice_1_male_unknown", "dng_hong_male_vietnamese", "camila_vega_excited_female_spanish", "bintang_male_indonesian", "diran_male_", "ishibashi_male_japanese_ea9245", "devi_female_hindi", "hinata_male_japanese", "kanika_female_hindi_ebb41c", "lea_brandt_female_german", "jhenny_female_spanish", "mauricio_male_spanish", "gentle_greta_friendly_female_german", "serena_narrador_female_spanish", "david_studio_male_hungarian", "jodie_female_", "violetta_female_italian_f004a8", "riya_rao_female_hindi_f09ffc", "jacob_male_unknown", "lucrezia_voice_1_female_unknown", "sanna_hartfield_female_swedish_f28d58", "antoine_male_french", "tijs_male_dutch", "azzla_male_vietnamese", "milena_female_", "nguyn_luci_male_vietnamese", "monika_sogam_female_hindi", "gentle_greta_female_german", "nicolas_p_male_french", "eric_sijbesma_male_dutch_f72854", "jann_male_dutch_f89d03", "will_male_portuguese", "maarten_de_vries_male_dutch", "lizy_female_spanish", "zephlyn_male_japanese", "guillaume_male_french", "kenzo_male_japanese", "lucas_male_dutch", "lena_von_berlin_female_german", "aaditya_k_male_hindi", "fernando_martinez_male_portuguese", "huyen_female_vietnamese", "calm_cinta_female_indonesian", "humanis_voice_2_female_unknown", "ranga_male_hindi_1b4b76", "amy_female_chinese", "aahana_verma_female_hindi", "aneta_female_polish", "young_olivier_male_french", "news_host_voice_2_female_unknown", "cavit_pancar_male_turkish", "manu_male_hindi_1dd92b", "aravinda_c_male_italian", "ranbir_m_male_hindi_1e028a", "vivian_voice_2_female_unknown", "camila_vega_friendly_female_spanish", "mellow_mara_female_spanish", "quiet_dewa_male_indonesian", "leon_stern_male_german_1fead5", "voice_3_male_unknown", "joanne_van_zwolgen_male_dutch", "nicolas_male_french_20ddf9", "lena_suzuki_female_polish", "greta_stein_female_german", "voce_minatore_audiolibro_male_italian", "amelia_female_spanish", "liberty_x_female_german", "mile_noir_male_french", "maria_female_polish", "doga_male_german", "theos_male_greek", "eric_sijbesma_male_dutch_263c00", "string_voice_1_male_unknown", "cornelius_male_spanish", "minh_quang_male_vietnamese", "aida_female_portuguese", "mateo_plcido_male_spanish", "artur_male_", "saanu_female_hindi_28f6d8", "marcel_male_french_297206", "solemn_sachin_male_hindi", "thomas_male_french", "rafael_cruz_male_spanish", "dr_clark_male_", "mila_female_german", "curious_diego_excited_male_spanish", "jann_male_dutch_2c708d", "lena_von_berlin_excited_female_german", "vietnam_dangtungduy_male_vietnamese", "vivian_voice_3_female_unknown", "enrique_mondragn_male_spanish", "tienne_moreau_friendly_male_french", "casual_fernando_male_spanish", "olivia_female_", "ray_male_en", "melanie_female_dutch", "ana_carvalho_excited_female_portuguese", "carlos_claro_male_spanish", "pedro_lima_friendly_male_portuguese", "guillaume_male_italian", "lively_laura_excited_female_spanish", "danny_male_spanish", "narrator_mateo_friendly_male_spanish", "seor_fernando_excited_male_spanish", "johnny_kid_male_italian", "ben_male_german", "dmitry_male_german", "eager_eko_male_indonesian", "ishibashi_male_japanese_b3367f", "mc_ni_ting_male_vietnamese", "haytham_male_arabic", "jessica_anne_bogart_female_german", "tienne_moreau_excited_male_french", "saira_female_hindi", "kanika_female_hindi_b80cfd", "lina_female_", "attila_male_hungarian", "matteo_male_", "putra_male_indonesian", "oleg_male_russian", "anas_male_arabic", "marianne_v3_voice_2_female_unknown", "grim_gkhan_male_turkey", "tienne_moreau_male_french", "christian_avils_male_spanish", "antonio_farina_male_german", "tranquil_tessa_female_spanish", "decisive_dylan_male_german", "marco_santini_male_italian", "bahar_female_", "chris_basetta_male_italian_bcba53", "lea_female_german", "violetta_female_italian_bf0470", "bradley_male_italian", "juliana_voice_1_female_es", "diego_martinez_excited_male_spanish", "martin_dupont_male_french", "vijay_male_portuguese", "gentle_gabriel_male_spanish", "christoffer_weiss_male_finnish", "crisp_kumar_male_hindi", "adam_male_german", "curious_diego_male_spanish", "linda_fiore_female_italian_c3b0f4", "andrei_male_russian", "humanis_voice_3_female_unknown", "sully_male_japanese", "marcotrox_male_german", "luca_brasi_gentile_male_italian", "daniela_female_spanish", "lana_female_", "aida_female_italian", "young_yumna_female_hindi", "martin_osborne_male_japanese", "chloe_female_french", "luki_zajo_male_slovak", "voice_1_male_unknown", "patrick_male_portuguese", "archer_male_italian", "maisha_female_", "petra_vlaams_female_dutch", "muskaan_female_hindi_4df129", "masha_female_", "nguyn_ngn_female_vietnamese", "henry_male_", "dash_voice_2_male_unknown", "byron_male_", "hansc_male_dutch_50f5d0", "huyentrang_female_vietnamese", "david_male_hungarian", "andrea_loco_male_portuguese", "ruhaan_male_hindi", "carlos_male_", "mathias_male_portuguese", "navya_voice_3_female_unknown", "james_gao_male_chinese", "mia_female_", "vira_female_ukrainian", "araj_male_", "archie_male_japanese", "violante_female_", "tech_podcast_aesthetic_voice_1_unknown_unknown", "sinnbad_male_hindi", "ly_hai_male_vietnamese", "vihan_a_male_hindi", "camille_martin_female_french", "dynamic_dev_male_hindi", "manoel_dias_cotafcil_male_portuguese", "phil_male_german", "leila_voice_3_female_unknown", "vibrant_viktor_male_german", "norman_male_", "serge_de_beer_male_dutch_5c2254", "seor_fernando_male_spanish", "tom_male_", "audrey_female_french_5d078a", "leonie_female_german_5d2520", "david_martin_male_spanish_5d2964", "riya_rao_female_hindi_5d2fe6", "beth_female_unknown", "efrayn_male_spanish_5eb6da", "hale_male_italian", "dmitry_male_russian", "lively_laura_friendly_female_spanish", "tomasz_friendly_male_polish", "matt_male_", "rumi_female_", "tranquil_tulin_female_turkish", "hakeem_hassan_male_arabic", "anika_mehra_female_hindi", "raju_male_hindi", "narrator_mateo_male_spanish", "tim_male_unknown", "adriano_male_portuguese", "gravitas_giovanni_male_italian", "carmelo_la_rosa_male_italian", "bold_kasia_female_polish", "danish_khan_male_japanese", "mathias_male_danish", "agustin_male_spanish", "trung_caha_male_vietnamese", "marcotrox_male_italian", "hushed_hiba_friendly_female_arabic", "morgan_female_", "thunderblade_male_french", "vivian_voice_1_female_unknown", "anika_female_hindi", "vivaan_mehta_female_hindi", "david_male_", "zane_hype_male_spanish", "felix_male_german", "adele_female_", "francis_male_", "viraj_male_hindi", "arjuna_male_indonesian", "jase_male_unknown", "niraj_male_hindi_d86b65", "bruce_male_", "bastiaan_male_dutch", "scholarly_sergio_male_spanish", "otto_male_german_da4db4", "string_voice_2_male_unknown", "efrayn_male_spanish_db19b5", "jin_female_", "lucrezia_voice_3_female_unknown", "mc_the_hao_male_vietnamese", "ranbir_m_male_hindi_de3de3", "gentle_greta_excited_female_german", "humanis_voice_1_female_unknown", "karo_yang_male_chinese", "lehka_modulated_female_hindi", "morioki_female_japanese", "christian_brison_male_dutch", "doga_male_turkish", "hushed_horatiu_male_romanian", "bob_voice_1_unknown_chinese", "bram_meijer_male_dutch", "mc_khnh_ly_female_vietnamese", "luk_balcer_male_dutch", "mathieu_male_french", "david_martin_male_spanish_e14c56", "linda_fiore_female_italian_ff6084", "gala_female_", "amy_voice_1_female_en", "tai_voice_1_male_thai", "toolseeker_voice_1_unknown_unknown", "lobna_voice_1_unknown_arabic", "mia_starset_female_norwegian", "william_shanks_male_spanish", "jora_slobod_male_romanian", "narrator_mateo_excited_male_spanish", "son_tran_male_vietnamese", "bold_kasia_excited_female_polish", "marc_aurle_male_french", "tuba_female_", "ghizlane_female_arabic", "bradford_male_portuguese", "charles_pestel_male_french", "moncellence_male_arabic", "w_clint_oxley_male_german", "peter_male_dutch", "ava_female_german", "lax_male_portuguese", "breezy_bagus_male_indonesian", "eric_sijbesma_male_dutch_0842b1", "kuya_chris_cruz_male_filipino", "leon_stern_male_german_0932ba", "otto_male_german_0971fe", "leonardo_male_", "luminous_laksh_male_hindi", "riya_mehta_female_hindi", "tiya_maria_makuwento_female_filipino", "aaron_male_italian", "pedro_lima_serious_male_portuguese", "ana_carvalho_female_portuguese", "hushed_hiba_excited_female_arabic", "steadfast_stefan_male_german", "sofia_brazil_friendly_female_portuguese", "jhenny_antiques_female_spanish", "chris_basetta_male_italian_101a52", "navya_voice_2_female_unknown", "nichalia_schwartz_female_german", "vibrant_victor_male_spanish", "deep_dieter_male_german", "nicolas_petit_male_french", "louis_boutin_male_french", "dash_voice_3_male_unknown", "pawel_male_polish", "news_host_voice_3_female_unknown", "mark_male_spanish", "leonie_female_german_148b50", "yuri_male_portuguese", "gnther_goodnight_male_german", "madeline_female_", "andi_male_indonesian", "reserved_rainer_male_german", "dodong_macoy_male_filipino", "leila_voice_2_female_unknown", "juan_carlos_male_spanish_17852e", "nicolas_male_french_179359", "mamicha_female_french", "judith_female_", "sanna_hartfield_female_swedish_1a4256", "liam_voice_1_unknown_unknown", "diana_female_", "hansc_male_dutch_3060fb", "roy_male_dutch", "anika_female_italian", "storyteller_satya_male_hindi", "bollywood_priyanka_female_hindi", "caroline_female_", "adam_male_czech", "bold_kasia_friendly_female_polish", "floyd_male_", "hanka_female_czech", "mahaputra_male_indonesian", "niraj_male_hindi_361c2d", "tomasz_male_polish", "loulou_female_french", "piper_female_", "cabalen_jeffrey_male_filipino", "anya_female_russian", "sofa_female_", "shaun_male_", "uno_voice_2_male_unknown", "heinrich_bass_serious_male_german", "hope_female_spanish", "carlos_claro_broadcaster_male_spanish", "luca_sabia_female_spanish", "mike_male_en", "calm_carlos_male_portuguese", "phillip_male_", "minhtrung_male_vietnamese", "susi_female_german", "beata_female_japanese", "social_santiago_male_spanish", "sam_female_", "serena_narrador_excited_female_spanish", "fernando_sanz_male_spanish", "laya_female_unknown", "carla_female_portuguese", "carmen_velzquez_female_spanish", "calm_siddharth_male_hindi", "naveen_male_hindi", "kristy_female_", "giovanni_rossi_male_italian_436da9", "oliver_male_czech", "seor_fernando_friendly_male_spanish", "quiet_dieter_male_german", "sunny_sofia_female_spanish", "steadfast_stefan_friendly_male_german", "hamid_male_arabic", "kamal_male_german", "magyar_frfi_male_hungarian", "harper_female_french", "mark_male_portuguese", "peter_male_slovak", "alex_nekrasov_male_ukrainian", "husky_hctor_male_spanish", "ivanna_female_italian", "bedtime_bjorn_male_german", "otto_mller_male_german", "navya_voice_1_female_unknown", "derya_female_", "kuya_pedro_meditasyon_male_filipino", "uploaded_avatar_voice_3_male_unknown", "martin_osborne_male_spanish_7d51b5", "beata_female_polish", "arcadias_male_russian", "luca_ortega_female_spanish", "christian_plasa_male_german", "nisha_kapoor_female_hindi", "leo_male_portuguese", "commanding_clemens_male_german", "ravi_female_hindi", "liam_voice_2_unknown_unknown", "emre_kadir_male_turkish", "eleni_female_greek", "manu_male_french", "ido_male_dutch", "tatiana_martin_female_spanish", "leila_voice_1_female_unknown", "danny_broadcaster_male_spanish", "martin_osborne_male_spanish_835561", "deniz_ylmaz_male_turkish", "sunny_sahil_male_hindi", "calm_cinta_excited_female_indonesian", "dominic_male_unknown", "russell_male_italian", "nirmala_female_hindi", "sara_martin_female_portuguese", "diego_martinez_broadcaster_male_spanish", "lena_fischer_female_german", "tech_podcast_aesthetic_voice_2_unknown_unknown", "pleasant_petra_female_german", "anton_male_ukrainian", "uno_voice_1_male_unknown", "cuong_male_vietnamese", "charming_ceyda_female_turkish", "liam_voice_3_unknown_unknown", "serge_de_beer_male_dutch_8ef998", "anjali_female_german", "juan_carlos_male_spanish_8f2c47", "koen_male_dutch", "pierre_narrateur_male_french", "uno_voice_3_male_unknown", "kyoko_female_japanese", "uploaded_avatar_voice_1_male_unknown", "kiko_hdz_male_spanish", "ben_male_", "huynhduong_male_vietnamese", "manu_male_hindi_93f070", "marcus_male__93f7f2", "news_host_voice_1_female_unknown", "ethan_male_", "sofia_brazil_female_portuguese", "santa_male_", "jhenny_female_japanese", "takumi_warm_male_japanese", "cristiano_friendly_male_portuguese", "ricardo_calm_male_portuguese", "aditi_calm_female_hindi", "camila_friendly_female_portuguese", "astrid_friendly_female_swedish", "arlet_natural_female_catalan", "ines_friendly_female_portuguese", "elin_warm_female_swedish", "mads_natural_male_danish", "naja_natural_female_danish", "aalia_natural_female_bangla", "jaidev_professional_male_hindi", "marcus_natural_male_swedish", "abhijit_natural_male_bangla", "aruna_natural_female_hindi", "fabian_male_german", "nathan_male_filipino", "luningnig_female_filipino", "bhavin_newscaster_male_hindi", "leon_male_german", "hemlata_natural_female_hindi", "lucia_friendly_female_spanish", "adriana_natural_female_portuguese", "paulo_natural_male_portuguese", "hugo_friendly_male_swedish", "tilda_natural_female_swedish", "roland_natural_male_swedish", "alicia_natural_female_swedish", "von_friendly_male_swedish", "norain_natural_male_malay", "adi_natural_male_indonesian", "razif_natural_male_malay", "miriam_natural_female_hebrew", "tomass_natural_male_latvian", "norazila_natural_female_malay", "ruth_calm_female_hebrew", "intan_natural_female_malay", "citra_warm_female_indonesian", "somsak_gently_female_thai", "nhung_gently_female_vietnamese", "sarah_natural_female_hebrew", "slamet_natural_male_indonesian", "aiman_natural_male_malay", "julia_warm_female_spanish", "claudia_natural_female_catalan", "storm_kindly_female_vietnamese", "mia_professional_female_spanish", "chau_natural_female_vietnamese", "murat_male_turkish", "amir_natural_male_malay", "mateo_warm_male_spanish", "avigail_calm_female_hebrew", "aharon_calm_male_hebrew", "isaac_natural_male_hebrew", "ratna_warm_female_indonesian", "isaiah_serious_male_hebrew", "mustafa_male_turkish", "fatma_female_turkish", "aryeh_natural_male_hebrew", "hugo_newscaster_male_spanish", "dung_excited_male_vietnamese", "sofia_calm_female_spanish", "maria_serious_female_spanish", "ernestine_natural_male_dutch", "ernie_friendly_male_dutch", "gerard_natural_male_dutch", "harriet_natural_female_dutch", "hanna_natural_female_dutch", "rita_natural_female_swedish", "onyx_male_multilingual", "coral_female_multilingual", "nova_female_multilingual", "alloy_male_", "echo_male_", "ash_male_", "shimmer_female_multilingual", "sage_female_", "xiaoxin_professional_female_chinese", "brenda_professional_female_portuguese", "fatima_professional_female_arabic", "amal_natural_female_arabic", "salma_friendly_female_arabic", "dario_natural_male_spanish", "honza_professional_male_czech", "leonas_natural_male_lithuanian", "keita_newscaster_male_japanese", "jamal_newscaster_male_arabic", "gagan_natural_male_kannada", "omar_calm_male_arabic", "saleh_professional_male_arabic", "amala_warm_female_german", "pradeep_newscaster_male_bangla", "himari_natural_female_japanese", "blessica_natural_female_filipino", "fahed_calm_male_arabic", "sana_professional_female_arabic", "ahmet_male_turkish", "gadis_natural_female_indonesian", "colette_newscaster_female_dutch", "athina_natural_female_greek", "agnieszka_professional_female_polish", "zariyah_professional_female_arabic", "marek_natural_male_polish", "amina_newscaster_female_arabic", "taim_natural_male_arabic", "avril_natural_male_hebrew", "angelo_natural_male_filipino", "estrella_natural_female_spanish", "sapna_natural_female_kannada", "dmitry_professional_male_russian", "ingrid_natural_female_german", "ona_natural_female_lithuanian", "hila_natural_female_hebrew", "alain_professional_male_french", "shruti_female_telugu", "nestoras_natural_male_greek", "ardi_natural_male_indonesian", "amany_warm_female_arabic", "hamdan_natural_male_arabic", "ralf_professional_male_german", "iman_professional_female_arabic", "maryam_natural_female_arabic", "antonio_natural_male_portuguese", "moaz_professional_male_arabic", "laith_warm_male_arabic", "klarissa_professional_female_german", "diego_natural_male_italian", "emel_female_turkish", "hedi_friendly_male_arabic", "noura_natural_female_arabic", "denise_friendly_female_french", "lukas_natural_male_slovak", "mouna_newscaster_female_arabic", "ismael_serious_male_arabic", "viktoria_natural_female_slovak", "shakir_professional_male_arabic", "nabanita_natural_female_bangla", "gabriella_natural_female_italian", "vlasta_natural_female_czech", "yunyang_professional_male_chinese", "tamas_natural_male_hungarian", "hoai_natural_female_vietnamese", "mohan_male_telugu", "injoon_natural_male_korean", "hamed_natural_male_arabic", "rana_natural_female_arabic", "kalina_professional_female_bulgarian", "ali_newscaster_male_arabic", "bassel_friendly_male_arabic", "borislav_professional_male_bulgarian", "laila_friendly_female_arabic", "zofia_natural_female_polish", "dariya_professional_female_russian", "sunhi_natural_female_korean", "namminh_natural_male_vietnamese", "noemi_natural_female_hungarian", "joana_natural_female_catalan", "reem_friendly_female_arabic", "yunjhe_natural_male_chinese", "sakura_cheerful_female_japanese", "sylvie_professional_female_french", "elsa_cheerful_female_italian", "fernanda_natural_female_portuguese", "hiumaan_natural_female_chinese", "jonas_friendly_male_german", "dalia_friendly_female_spanish", "antoine_natural_male_french", "jorge_professional_male_spanish", "swara_friendly_female_hindi", "duarte_natural_male_portuguese", "donato_natural_male_portuguese", "leni_friendly_female_german", "wanlung_natural_male_chinese", "hsiaochen_friendly_female_chinese", "lorenzo_natural_male_spanish", "madhur_natural_male_hindi", "jan_natural_male_german", "ariane_natural_female_french", "fabrice_friendly_male_french", "catalina_warm_female_spanish", "gerard_professional_male_french", "elke_warm_female_german", "charline_natural_female_french", "paloma_natural_female_spanish", "kasper_newscaster_male_german", "xiaoshuang_cheerful_female_chinese", "maria_natural_female_portuguese", "alonso_professional_male_spanish", "xiaoxuan_serious_female_chinese", "celeste_professional_female_french", "yunye_calm_male_chinese", "xiaowen_cheerful_female_chinese", "louisa_natural_female_german", "elza_warm_female_portuguese", "yves_newscaster_male_french", "marcelo_warm_male_spanish", "hsiaoyu_natural_female_chinese", "klaus_natural_male_german", "henri_natural_male_french", "elena_natural_female_spanish", "killian_professional_male_german", "maja_newscaster_female_german", "tomas_natural_male_spanish", "fabio_newscaster_male_portuguese", "brigitte_natural_female_french", "humberto_professional_male_portuguese", "yvette_warm_female_french", "qiujing_warm_female_chinese", "alvaro_natural_male_spanish", "yunxi_friendly_male_chinese", "francisca_cheerful_female_portuguese", "salome_natural_female_spanish", "claude_friendly_male_french", "josephine_calm_female_french", "tanja_serious_female_german", "gunter_calm_male_german", "gonzalo_natural_male_spanish", "xiaomeng_warm_female_chinese", "gisela_natural_female_german", "xiaoyan_newscaster_female_chinese", "maurice_professional_male_french", "bernd_natural_male_german", "coralie_natural_female_french", "jerome_professional_male_french", "elvira_natural_female_spanish", "eloise_natural_female_french", "arnaud_professional_male_dutch", "dena_natural_female_dutch", "maarten_natural_male_dutch", "raquel_warm_female_portuguese", "sofia_cheerful_female_spanish", "osman_natural_male_malay", "yasmin_natural_female_malay", "xiaomo_friendly_female_chinese", "xiaocheng_natural_female_chinese", "xiaohan_peaceful_female_chinese", "xiaorui_cheerful_female_chinese", "hiugaai_natural_female_chinese", "jean_friendly_male_french", "sofie_natural_female_swedish", "manohar_natural_male_marathi", "sameera_natural_male_sinhala", "niranjan_natural_male_gujarati", "pernille_natural_female_norwegian", "marta_natural_female_spanish", "enric_natural_male_catalan", "salman_natural_male_urdu", "elias_natural_male_spanish", "nils_affinity_male_latvian", "polina_professional_female_ukrainian", "eka_natural_female_georgian", "anu_natural_female_estonian", "thilini_natural_female_sinhala", "alba_natural_female_catalan", "rehema_natural_female_kiswahili", "valluvar_natural_male_tamil", "alina_natural_female_romanian", "gabrijela_calm_female_croatian", "iselin_natural_female_norwegian", "gul_natural_female_urdu", "selma_natural_female_finnish", "niwat_natural_male_thai", "arnau_natural_male_spanish", "ostap_professional_male_ukrainian", "valentina_natural_female_spanish", "hemkala_natural_female_nepali", "noora_natural_female_finnish", "sagar_natural_male_nepali", "laia_friendly_female_spanish", "aarohi_natural_female_marathi", "kert_natural_male_estonian", "asad_natural_male_urdu", "dilara_female_persian", "jeppe_natural_male_danish", "emil_natural_male_romanian", "vera_friendly_female_spanish", "paola_cheerful_female_spanish", "achara_friendly_female_thai", "pallavi_natural_female_tamil", "srecko_natural_male_croatian", "mattias_natural_male_swedish", "christel_natural_female_danish", "dhwani_natural_female_gujarati", "finn_natural_male_norwegian", "farid_male_persian", "everita_gently_female_latvian", "irene_natural_female_spanish", "giorgi_natural_male_georgian", "harri_natural_male_finnish", "larissa_friendly_female_spanish", "premwadee_natural_female_thai", "abril_natural_female_spanish", "pierina_natural_female_italian", "uzma_natural_female_urdu", "lorena_natural_female_spanish", "benigno_natural_male_italian", "daudi_natural_male_kiswahili", "daran_outside_sitting_2_male_multilingual", "lukas_in_car_male_multilingual", "lea_in_car_female_multilingual", "lea_on_balcony_female_multilingual", "lea_in_car_2_female_multilingual", "lucas_inside_black_hoodie_male_multilingual", "daran_in_car_male_multilingual", "daran_inside_booth_male_multilingual_fe5b9e", "lea_inside_sitting_female_multilingual", "lea_inside_female_multilingual", "daran_outside_sitting_male_multilingual", "gail_inside_standing_female_multilingual", "lucas_outside_at_cafe_male_multilingual", "daran_inside_2_with_mic_male_multilingual", "gail_outside_walking_female_multilingual", "lea_outside_walking_female_multilingual_c4be40", "daran_inside_booth_male_multilingual_3833c2", "gail_in_car_female_multilingual", "daran_outside_walking_male_multilingual", "tim_outside_sitting_male_multilingual", "lea_outside_walking_female_multilingual_1753e5", "lea_inside_sitting_down_female_multilingual", "paul_broadcaster_male_multilingual", "paul_soothing_male_multilingual", "theo_soothing_male_multilingual", "ceecee_serious_female_multilingual", "rex_soothing_male_multilingual", "melissa_friendly_female_multilingual", "ceecee_soothing_female_multilingual", "ceecee_excited_female_multilingual", "rex_friendly_male_multilingual", "melissa_broadcaster_female_multilingual", "rex_broadcaster_male_multilingual", "melissa_serious_female_multilingual", "melissa_excited_female_multilingual", "elizabeth_excited_female_multilingual", "rex_excited_male_multilingual", "elizabeth_broadcaster_female_multilingual", "christine_serious_female_multilingual", "elizabeth_friendly_female_multilingual", "paul_serious_male_multilingual", "theo_friendly_male_multilingual", "paul_friendly_male_multilingual", "theo_serious_male_multilingual", "theo_broadcaster_male_multilingual", "christine_friendly_female_multilingual", "melissa_soothing_female_multilingual", "ceecee_broadcaster_female_multilingual", "paul_excited_male_multilingual", "christine_broadcaster_female_multilingual", "rex_serious_male_multilingual", "christine_soothing_female_multilingual", "ceecee_friendly_female_multilingual", "elizabeth_serious_female_multilingual", "christine_excited_female_multilingual", "theo_excited_male_multilingual", "elizabeth_soothing_female_multilingual"], "language": ["af-ZA", "sq-AL", "am-ET", "ar", "ar-DZ", "ar-BH", "ar-EG", "ar-IQ", "ar-JO", "ar-KW", "ar-LB", "ar-LY", "ar-MA", "ar-OM", "ar-QA", "ar-SA", "ar-SY", "ar-TN", "ar-AE", "ar-001", "ar-YE", "hy-AM", "az-AZ", "bn-BD", "eu-ES", "be-BY", "bn-IN", "bs-BA", "bg", "bg-BG", "my-MM", "ca-ES", "zh", "zh-HK", "zh-CN-shandong", "zh-CN", "zh-CN-liaoning", "zh-CN-sichuan", "zh-TW", "wuu-CN", "zh-CN-henan", "zh-CN-shaanxi", "hr", "hr-HR", "cs", "cs-CZ", "da", "da-DK", "nl", "nl-BE", "nl-NL", "en", "en-AU", "en-CA", "en-HK", "en-IN", "en-IE", "en-KE", "en-NZ", "en-NG", "en-PH", "en-SG", "en-ZA", "en-TZ", "en-GB", "en-US", "et-EE", "fil", "ceb-PH", "fil-PH", "fi", "fi-FI", "fr", "fr-BE", "fr-CA", "fr-FR", "fr-CH", "gl-ES", "ka-GE", "de", "de-AT", "de-DE", "de-CH", "el", "el-GR", "gu-IN", "ht-HT", "he-IL", "hi", "hi-IN", "hu-HU", "is-IS", "id", "id-ID", "ga-IE", "it", "it-IT", "ja", "ja-JP", "jv-ID", "kn-IN", "kk-KZ", "km-KH", "ko", "ko-KR", "lo-LA", "la-VA", "lv-LV", "lt-LT", "lb-LU", "mk-MK", "mg-MG", "ms", "ms-MY", "ml-IN", "mt-MT", "mr-IN", "mn-MN", "ne-NP", "nb-NO", "nn-NO", "or-IN", "ps-AF", "fa-IR", "pl", "pl-PL", "pt", "pt-BR", "pt-PT", "pa-IN", "ro", "ro-RO", "ru", "ru-RU", "sr-LATN-RS", "si-LK", "sk", "sk-SK", "sl-SI", "so-SO", "es", "es-AR", "es-BO", "es-CL", "es-CO", "es-CR", "es-CU", "es-DO", "es-EC", "es-SV", "es-GQ", "es-GT", "es-HN", "es-419", "es-MX", "es-NI", "es-PA", "es-PY", "es-PE", "es-PR", "es-ES", "es-US", "es-UY", "es-VE", "su-ID", "sw-KE", "sw-TZ", "sv", "sv-SE", "ta", "ta-IN", "ta-MY", "ta-SG", "ta-LK", "te-IN", "th-TH", "tr", "tr-TR", "uk", "uk-UA", "ur-IN", "ur-PK", "uz-UZ", "vi-VN", "cy-GB", "zu-ZA"]}, "rw_cat": "inputs"}], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "default": "", "rw_cat": "core"}], "size": [["None (model default)", "720p (from input)", "1080p (from input)", "4K (from input)", "720p (16:9)", "720p (9:16)", "720p (1:1)", "720p (5:4)", "720p (4:5)", "1080p (16:9)", "1080p (9:16)", "1080p (1:1)", "1080p (5:4)", "1080p (4:5)", "4K (16:9)", "4K (9:16)", "4K (1:1)", "4K (5:4)", "4K (4:5)"], {"default": "1080p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.backgroundColor": ["STRING", {"tooltip": "Hex color code for solid background (e.g. #ff0000).", "default": "", "rw_cat": "settings"}], "settings.caption": ["BOOLEAN", {"default": false, "tooltip": "Enable captions. When true, returns a sidecar SRT file and burns captions into the rendered video.", "rw_cat": "settings"}], "settings.fit": [["(default)", "cover", "contain"], {"tooltip": "How the avatar is scaled to the output canvas. 'cover' scales to fill (may crop edges), 'contain' scales to fit entirely (may show background). When omitted, the server picks the best option based on source and canvas orientations.", "default": "(default)", "rw_cat": "settings"}], "settings.removeBackground": ["BOOLEAN", {"default": false, "tooltip": "Remove the avatar background. Video avatars must be trained with matting enabled.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"audio": {"path": ["inputs", "audio"], "kind": "scalar", "omit_empty": true}, "avatar": {"path": ["inputs", "avatar"], "kind": "scalar"}, "background": {"path": ["inputs", "background"], "kind": "image_scalar"}, "speech": {"path": ["speech"], "kind": "feature"}, "settings.backgroundColor": {"path": ["settings", "backgroundColor"], "kind": "scalar", "omit_empty": true}, "settings.caption": {"path": ["settings", "caption"], "kind": "scalar", "omit_value": false}, "settings.fit": {"path": ["settings", "fit"], "kind": "scalar", "omit_value": "(default)"}, "settings.removeBackground": {"path": ["settings", "removeBackground"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "4K (from input)": {"resolution": "4K"}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (9:16)": {"width": 720, "height": 1280}, "720p (1:1)": {"width": 720, "height": 720}, "720p (5:4)": {"width": 900, "height": 720}, "720p (4:5)": {"width": 720, "height": 900}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (9:16)": {"width": 1080, "height": 1920}, "1080p (1:1)": {"width": 1080, "height": 1080}, "1080p (5:4)": {"width": 1350, "height": 1080}, "1080p (4:5)": {"width": 1080, "height": 1350}, "4K (16:9)": {"width": 3840, "height": 2160}, "4K (9:16)": {"width": 2160, "height": 3840}, "4K (1:1)": {"width": 2160, "height": 2160}, "4K (5:4)": {"width": 2700, "height": 2160}, "4K (4:5)": {"width": 2160, "height": 2700}}}}}, {"key": "Runware_heygen_video_agent", "name": "HeyGen Video Agent", "model": "heygen:video-agent@0", "task_type": "videoInference", "creator": "heygen", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"image": ["IMAGE"], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "duration": ["BOOLEAN", {"default": false, "rw_gates": "duration_value", "tooltip": "Enable to set duration. Off uses the model's default.", "rw_cat": "core"}], "duration_value": ["INT", {"min": 5, "max": 300, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "default": 5, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "avatar": [["(default)", "Abigail_expressive_2024112501", "Abigail_sitting_sofa_front", "Abigail_sitting_sofa_side", "Abigail_standing_office_front", "Abigail_standing_office_side", "Aditya_public_1", "Aditya_public_2", "Aditya_public_3", "Aditya_public_4", "Aditya_public_5", "Adrian_public_20240312", "Adrian_public_2_20240312", "Adrian_public_3_20240312", "Adriana_BizTalk_Front_public", "Adriana_BizTalk_Side_public", "Adriana_Business_Front_2_public", "Adriana_Business_Front_public", "Adriana_Business_Side_public", "Adriana_Nurse_Front_2_public", "Adriana_Nurse_Front_public", "Adriana_Nurse_Side_2_public", "Adriana_Nurse_Side_public", "Adriana_Nurse_Sitting_Side_public", "Adriana_SuitSofa_Front_public", "Aiko_public", "Albert_public_1", "Albert_public_2", "Albert_public_3", "Albert_public_4", "Albert_public_5", "Albert_public_6", "Amanda_Maintenance_Front", "Amanda_Maintenance_Left", "Amanda_Maintenance_Right", "Amanda_in_Blue_Shirt_Front", "Amanda_in_Blue_Shirt_Left", "Amanda_in_Blue_Shirt_Right", "Amanda_in_Grey_Shirt_Front", "Amanda_in_Grey_Shirt_Left", "Amanda_in_Grey_Shirt_Right", "Amelia_lying_lounge_front", "Amelia_lying_lounge_side", "Amelia_sitting_business_training_front", "Amelia_sitting_business_training_side", "Amelia_sitting_yoga_front", "Amelia_sitting_yoga_side", "Amelia_standing_business_training_front", "Amelia_standing_business_training_side", "Amelia_standing_lounge_front", "Amelia_standing_lounge_side", "Amelia_standing_yoga_front", "Amelia_standing_yoga_side", "Andrew_public_pro1_20230614", "Andrew_public_pro2_20230614", "Andrew_public_pro3_20230614", "Andrew_public_pro4_20230614", "Anja_sitting_sofa_front", "Anja_sitting_sofa_side", "Anja_standing_office_front", "Anja_standing_office_side", "Ann_Business_Front_public", "Ann_Business_Sitting_public", "Ann_Casual_Front_public", "Ann_Casual_Lying_public", "Ann_Casual_Sitting_2_public", "Ann_Casual_Sitting_public", "Ann_Doctor_Sitting_public", "Ann_Doctor_Standing2_public", "Ann_Sweater_Front_public", "Ann_Sweater_Side_public", "Ann_Therapist_public", "Anna_public_20240108", "Anna_public_2_20240108", "Anna_public_3_20240108", "Annelise_public_1", "Annelise_public_2", "Annelise_public_3", "Annelise_public_4", "Annelore_public_1", "Annelore_public_2", "Annelore_public_3", "Annelore_public_4", "Annelore_public_5", "Annie_Bar_Sitting_Front_public", "Annie_Bar_Sitting_Side_public", "Annie_Bar_Standing_Front_2_public", "Annie_Bar_Standing_Front_3_public", "Annie_Bar_Standing_Front_public", "Annie_Bar_Standing_Side_2_public", "Annie_Bar_Standing_Side_3_public", "Annie_Bar_Standing_Side_public", "Annie_Business_Casual_Standing_Front_2_public", "Annie_Business_Casual_Standing_Front_public", "Annie_Business_Casual_Standing_Side_2_public", "Annie_Business_Casual_Standing_Side_public", "Annie_Casual_Sitting_Front_2_public", "Annie_Casual_Sitting_Front_public", "Annie_Casual_Sitting_Side_2_public", "Annie_Casual_Sitting_Side_public", "Annie_Casual_Standing_Front_2_public", "Annie_Casual_Standing_Front_public", "Annie_Casual_Standing_Side_2_public", "Annie_Casual_Standing_Side_public", "Annie_Desk_Sitting_Front_2_public", "Annie_Desk_Sitting_Front_public", "Annie_Desk_Sitting_Side_2_public", "Annie_Desk_Sitting_Side_public", "Annie_Lounge_Standing_Front_public", "Annie_Lounge_Standing_Side_public", "Annie_Office_Sitting_Front_2_public", "Annie_Office_Sitting_Front_public", "Annie_Office_Sitting_Side_2_public", "Annie_Office_Sitting_Side_public", "Annie_Office_Standing_Front_public", "Annie_Office_Standing_Side_public", "Annie_Sofa_Sitting_Front_3_public", "Annie_Sofa_Sitting_Front_public", "Annie_Sofa_Sitting_Side1_public", "Annie_Sofa_Sitting_Side_2_public", "Annie_Sofa_Sitting_Side_3_public", "Annie_Sofa_Sitting_Side_public", "Annie_Studio_Pink_Sitting_Front_public", "Annie_Studio_Pink_Sitting_Side_public", "Annie_Studio_Pink_Standing_Front_public", "Annie_Studio_Pink_Standing_Side_public", "Annie_expressive10_public", "Annie_expressive11_public", "Annie_expressive12_public", "Annie_expressive2_public", "Annie_expressive3_public", "Annie_expressive4_public", "Annie_expressive5_public", "Annie_expressive6_public", "Annie_expressive7_public", "Annie_expressive8_public", "Annie_expressive9_public", "Annie_expressive_public", "Armando_Casual_Front_public", "Armando_Casual_Side_public", "Armando_Suit_Front_public", "Armando_Suit_Side_public", "Armando_Sweater_Front2_public", "Armando_Sweater_Front_public", "Armando_Sweater_Side2_public", "Armando_Sweater_Side_public", "Artur_sitting_office_front", "Artur_sitting_office_side", "Artur_sitting_sofacasual_front", "Artur_sitting_sofacasual_side", "Artur_standing_office_front", "Artur_standing_office_side", "Artur_standing_sofacasual_front", "Artur_standing_sofacasual_side", "Aubrey_expressive_2024112701", "Aubrey_sitting_sofa_front", "Aubrey_sitting_sofa_side", "Aubrey_standing_night_scene_front", "Aubrey_standing_outdoor_sport_front", "Aubrey_standing_outdoor_sport_side", "August_Casual_Front2_public", "August_Casual_Front_public", "August_Cool_Sitting_public", "August_Cool_Style_public", "August_Employee_Front_public", "August_Hoodies_Front2_public", "August_Hoodies_Front_public", "Aurelien_public_pro1_20230601", "Aurelien_public_pro2_20230601", "Aurelien_public_pro3_20230601", "Aurelien_public_pro4_20230601", "Bahar_Business_Front_public", "Bahar_Business_Side_public", "Bahar_Business_Sitting_Front_public", "Bahar_Business_Sitting_Side_public", "Bahar_Casual_Sitting_Front2_public", "Bahar_Casual_Sitting_Front_public", "Bahar_Casual_Sitting_Side2_public", "Bahar_Casual_Sitting_Side_public", "Bahar_Denim_Casual_Front_public", "Bahar_Denim_Casual_Side_public", "Bahar_Denim_Front_public", "Bahar_Denim_Side_public", "Bahar_Jacket_Casual_Front_public", "Bahar_Jacket_Casual_Side_public", "Bahar_Jacket_Front_public", "Bahar_Jacket_Side_public", "Bahar_Suit_Front_public", "Bahar_Suit_Side_public", "Bahar_expressive_2024112501", "Bastien_public_1", "Bastien_public_2", "Bastien_public_3", "Bastien_public_4", "Blanka_lying_outfoorreading_front", "Blanka_lying_outfoorreading_side", "Blanka_sitting_lounge_front", "Blanka_sitting_lounge_side", "Blanka_sitting_picnic_front", "Blanka_sitting_picnic_side", "Blanka_standing_outfoorbusiness_front", "Blanka_standing_outfoorbusiness_side", "Bojan_lying_lounge_front", "Bojan_lying_lounge_side", "Bojan_sitting_businesstraining_front", "Bojan_sitting_businesstraining_side", "Bojan_sitting_sport_front", "Bojan_sitting_sport_side", "Bojan_standing_businesstraining_front", "Bojan_standing_businesstraining_side", "Bojan_standing_lounge_front", "Bojan_standing_lounge_side", "Bojan_standing_sport_front", "Bojan_standing_sport_side", "Bradley_Blue_Polo_Front", "Bradley_Blue_Polo_Left", "Bradley_Blue_Polo_Right", "Bradley_Blue_Shirt_Front", "Bradley_Blue_Shirt_Left", "Bradley_Blue_Shirt_Right", "Bradley_Doctor_Front", "Bradley_Doctor_Left", "Bradley_Doctor_Right", "Brandon_Business_Sitting_Front_public", "Brandon_Business_Sitting_Side_public", "Brandon_Business_Standing_Front_public", "Brandon_Business_Standing_Side_public", "Brandon_Casual_Sitting_Front_public", "Brandon_Casual_Sitting_Side_public", "Brandon_Kitchen_Standing_Front_public", "Brandon_Kitchen_Standing_Side_public", "Brandon_Lobby_Sitting_Front_public", "Brandon_Lobby_Sitting_Side_public", "Brandon_Lobby_Standing_Front_public", "Brandon_Lobby_Standing_Side_public", "Brandon_Office_Sitting_Front_public", "Brandon_Office_Sitting_Side_public", "Brandon_Office_Standing_Front_public", "Brandon_Office_Standing_Side_public", "Brandon_Sofa_Sitting_Front_public", "Brandon_Sofa_Sitting_Side_public", "Brandon_expressive2_public", "Brandon_expressive3_public", "Brandon_expressive_public", "Brent_sitting_office_front", "Brent_sitting_office_side", "Brent_sitting_sofa_front", "Brent_sitting_sofa_side", "Brent_standing_office_front", "Brent_standing_office_side", "Brent_standing_sofa_front", "Brent_standing_sofa_side", "Briana_public_20240110", "Briana_public_2_20240110", "Briana_public_3_20240110", "Bruce_public", "Bryan_Casual_Front_public", "Bryan_Casual_Side_public", "Bryan_FitnessCoach_public", "Bryan_IT_Sitting_public", "Bryan_PlaidShirt_Front_public", "Bryan_PlaidShirt_Side_public", "Bryan_Suit_Front_public", "Bryan_Suit_Side_public", "Bryce_public_1", "Bryce_public_2", "Bryce_public_3", "Bryce_public_4", "Bryce_public_5", "Byron_Business_Front_2_public", "Byron_Business_Front_public", "Byron_Business_Side_2_public", "Byron_Business_Side_public", "Byron_Business_Sitting_Front_public", "Byron_Business_Sitting_Size_public", "Byron_Casual_Front_2_public", "Byron_Casual_Front_public", "Byron_Casual_Side_2_public", "Byron_Casual_Side_public", "Byron_Casual_Sitting_Front_public", "Byron_Casual_Sitting_Side_public", "Byron_Jacket_Front_public", "Byron_Jacket_Side_public", "Byron_Sitting_Front_public", "Byron_Sitting_Side_public", "Byron_Suit_Front_public", "Byron_Suit_Side_public", "Candace_Beige_Dress_Front", "Candace_Beige_Dress_Left", "Candace_Beige_Dress_Right", "Candace_Doctor_Front", "Candace_Doctor_Left", "Candace_Doctor_Right", "Candace_Pink_Blazer_Front", "Candace_Pink_Blazer_Left", "Candace_Pink_Blazer_Right", "Carla_in_Doctor_Front", "Carla_in_Doctor_Left", "Carla_in_Doctor_Right", "Carla_in_Dress_Left", "Carla_in_Shirt_Front", "Carla_in_Shirt_Left", "Carla_in_Shirt_Right", "Carlotta_BizTalk_Front_public", "Carlotta_BizTalk_Side_public", "Carlotta_Business_Front_public", "Carlotta_Business_Side_public", "Carlotta_Casual_Front_public", "Carlotta_Casual_Side_public", "Carlotta_Casual_Sitting_Front_public", "Carlotta_Casual_Sitting_Side_public", "Carlotta_Half_Front_public", "Carlotta_Pink_Jumpsuit_Front_2_public", "Carlotta_Pink_Jumpsuit_Front_public", "Carlotta_Pink_Jumpsuit_Side_2_public", "Carlotta_Pink_Jumpsuit_Side_public", "Carlotta_Pink_Jumpsuit_Sitting_Front_public", "Carlotta_Pink_Jumpsuit_Sitting_Side_public", "Caroline_Business_Sitting_Front_public", "Caroline_Business_Sitting_Side_public", "Caroline_Business_Standing_Front_public", "Caroline_Business_Standing_Side_public", "Caroline_Casual_Sitting_Front_public", "Caroline_Casual_Sitting_Side_public", "Caroline_Kitchen_Standing_Front_public", "Caroline_Kitchen_Standing_Side_public", "Caroline_Lobby_Sitting_Front_public", "Caroline_Lobby_Sitting_Side_public", "Caroline_Lobby_Standing_Front_public", "Caroline_Lobby_Standing_Side_public", "Caroline_Office_Sitting_Front_public", "Caroline_Office_Sitting_Side_public", "Caroline_Office_Standing_Front_public", "Caroline_Office_Standing_Side_public", "Caroline_Sofa_Sitting_Front_public", "Caroline_Sofa_Sitting_Side_public", "Caroline_expressive2_public", "Caroline_expressive3_public", "Caroline_expressive4_public", "Caroline_expressive_public", "Chad_Maintenance_Front", "Chad_Maintenance_Left", "Chad_Maintenance_Right", "Chad_in_Blue_Shirt_Front", "Chad_in_Blue_Shirt_Left", "Chad_in_Blue_Shirt_Right", "Chad_in_Grey_Shirt_Front", "Chad_in_Grey_Shirt_Left", "Chad_in_Grey_Shirt_Right", "Chakir_headscarf_Front", "Chakir_headscarf_Left", "Chakir_headscarf_Right", "Chakir_in_white_Shirt_Front", "Chakir_in_white_Shirt_Left", "Chakir_in_white_Shirt_Right", "Chloe_expressive_2024120201", "Chloe_standing_lounge_front", "Chloe_standing_lounge_side", "Chloe_standing_outdoor_side", "Colin_Business_Front2_public", "Colin_Business_Front_public", "Colin_Jacket_Front_public", "Colin_Sitting_Cool_Style2_public", "Colin_Sitting_Cool_Style_public", "Colin_Suit_Front_public", "Colin_Sweater_Front_public", "Colin_Sweater_Sitting_Front_public", "Connie_Business_Front_public", "Connie_Business_Sitting_Front_public", "Connie_Casual_Sitting_Front_public", "Connie_Casual_Sitting_Side_public", "Connie_Education_Front_public", "Connie_Education_Side_2_public", "Connie_Education_Side_public", "Connie_Skirt_Front_public", "Connie_Skirt_Side_public", "Connie_Skirt_Sitting_Front_public", "Connie_Skirt_Sitting_Side_public", "Connie_Suit_Front_public", "Conrad_sitting_house_side", "Conrad_sitting_sofa_front", "Conrad_standing_house_front", "Conrad_standing_sofa_side", "Crisanto_Business_Front_public", "Crisanto_Business_Side_public", "Crisanto_Chef_Front_2_public", "Crisanto_Chef_Front_public", "Crisanto_Chef_Side_2_public", "Crisanto_Chef_Side_public", "Crisanto_Chef_Sitting_public", "Crisanto_Education_Front_public", "Crisanto_Education_Side_public", "Crisanto_Nurse_Front_2_public", "Crisanto_Nurse_Front_public", "Crisanto_Nurse_Side_2_public", "Crisanto_Nurse_Side_public", "Crisanto_Nurse_Sitting_Front_public", "Crisanto_Nurse_Sitting_Side_public", "Crisanto_Suit_Front_public", "Crisanto_Suit_Side_public", "Daisy-inTshirt-20220819", "Daisy-inshirt-20220818", "Daisy-inskirt-20220818", "Daisy-insuit-20220818", "Daphne_public_1", "Daphne_public_2", "Daphne_public_3", "Daphne_public_4", "Daphne_public_5", "Daphne_public_6", "Darnell_Blue_Shirt_Front", "Darnell_Blue_Shirt_Left", "Darnell_Blue_Shirt_Right", "Darnell_Bordeaux_Polo_Front", "Darnell_Bordeaux_Polo_Left", "Darnell_Bordeaux_Polo_Right", "Darnell_Doktor_Front", "Darnell_Doktor_Left", "Darnell_Doktor_Right", "Derya_sitting_indoor_front", "Derya_sitting_indoor_side", "Derya_sitting_office_front", "Derya_sitting_office_side", "Derya_standing_indoor_front", "Derya_standing_indoor_side", "Derya_standing_office_front", "Derya_standing_office_side", "Dexter_Casual_Front_public", "Dexter_Casual_Side_public", "Dexter_Doctor_Sitting2_public", "Dexter_Doctor_Standing2_public", "Dexter_Lawyer_Sitting_public", "Dexter_Suit_Front_public", "Dexter_Suit_Side_public", "Dexter_Winter_Coat_Front_public", "Dexter_Winter_Coat_Side_public", "Diana_public_20240315", "Diana_public_2_20240315", "Diana_public_3_20240315", "Diora_public_1", "Diora_public_2", "Diora_public_3", "Diora_public_4", "Diora_public_5", "Diran_Casual_Front_public", "Diran_Casual_Side_public", "Diran_Jacket_Front_public", "Diran_Jacket_Side_public", "Diran_Macbook_Business_Front_public", "Diran_Macbook_Business_Side_public", "Diran_Macbook_Casual_Front_public", "Diran_Macbook_Casual_Side_public", "Diran_Macbook_Sitting_Front2_public", "Diran_Macbook_Sitting_Front_public", "Diran_Macbook_Sitting_Side2_public", "Diran_Macbook_Sitting_Side_public", "Diran_Suit_Front_public", "Diran_Suit_Side_public", "Diran_iPad_Front_public", "Diran_iPad_Side_public", "Diran_iPad_Sitting_Front_public", "Diran_iPad_Sitting_Side_public", "Elenora_Casual_Front_public", "Elenora_Casual_Side_public", "Elenora_FitnessCoach2_public", "Elenora_FitnessCoach_public", "Elenora_IT_Sitting_public", "Elenora_Suit_Front_public", "Elenora_Suit_Side_public", "Elenora_YellowDress_Front_public", "Elenora_YellowDress_Side_public", "Emanuel_sitting_Sofa_side", "Emanuel_sitting_sofa_front", "Emanuel_standing_office_front", "Emanuel_standing_office_side", "Emery_public_1", "Emery_public_2", "Emery_public_3", "Emery_public_4", "Emery_public_5", "Emery_public_6", "Emilia_sitting_outdooryoga2_front", "Emilia_sitting_outdooryoga_front", "Emilia_sitting_outdooryoga_side", "Emilia_sitting_picnic_front", "Emilia_sitting_picnic_side", "Emilia_standing_outdoorbusiness_front", "Emilia_standing_outdoorbusiness_side", "Eric_public_lite1_20230601", "Eric_public_pro1_20230601", "Eric_public_pro2_20230608", "Esmond_public_1", "Esmond_public_2", "Esmond_public_3", "Esmond_public_4", "Esmond_public_5", "Fernando_sitting_businessindoor_front", "Fernando_sitting_businessindoor_side", "Fernando_sitting_outdoorchair_front", "Fernando_sitting_outdoorchair_front_close", "Fernando_sitting_outdoorchair_side", "Fernando_sitting_outdoortable_front", "Fernando_sitting_outdoortable_side", "Fernando_standing_outdoor_front", "Fernando_standing_outdoor_side", "Fina_Business_Sitting_Front_public", "Fina_Business_Sitting_Side_public", "Fina_Casual_Front_2_public", "Fina_Casual_Front_public", "Fina_Casual_Side_2_public", "Fina_Casual_Side_public", "Fina_Casual_Sitting_Front_public", "Fina_Casual_Sitting_Side_public", "Fina_Denim_Front_public", "Fina_Denim_Side_public", "Fina_Denim_Sitting_Front_public", "Fina_Employee_Front_public", "Fina_Employee_Side_public", "Fina_Suit_Front_public", "Fina_Suit_Side_public", "Fina_Support_Front_public", "Fina_Support_Side_public", "Florin_Business_Sitting_Front_public", "Florin_Business_Sitting_Side_public", "Florin_Maintain_Front_2_public", "Florin_Maintain_Front_public", "Florin_Maintain_Side_2_public", "Florin_Maintain_Side_public", "Florin_Maintain_Siiting_Front_public", "Florin_Maintain_Siiting_Side_public", "Florin_Suit_Front_2_public", "Florin_Suit_Front_public", "Florin_Suit_Side_2_public", "Florin_Suit_Side_public", "Francis_in_Blazer_Front", "Francis_in_Blazer_Left", "Francis_in_Blazer_Right", "Francis_in_Doctor_Front", "Francis_in_Doctor_Left", "Francis_in_Doctor_Right", "Francis_in_Shirt_Front", "Francis_in_Shirt_Left", "Francis_in_Shirt_Right", "Fred_in_Blue_Long_Shirt_Front", "Fred_in_Blue_Long_Shirt_Left", "Fred_in_Blue_Long_Shirt_Right", "Fred_in_Blue_Short_Shirt_Front", "Fred_in_Blue_Short_Shirt_Left", "Fred_in_Blue_Short_Shirt_Right", "Freja_public_1", "Freja_public_2", "Freja_public_3", "Freja_public_5", "Freja_public_6", "Gabriel_public_20240308", "Gabriel_public_2_20240308", "Gabriel_public_3_20240308", "Gala_lying_bedroom_front", "Gala_lying_sofa_front", "Gala_lying_sofa_side", "Gala_sitting_businesssofa_front", "Gala_sitting_businesssofa_side", "Gala_sitting_casualsofawithipad_front", "Gala_sitting_casualsofawithipad_side", "Gala_sitting_casualsofawithipad_side_close", "Gala_sitting_office_front", "Gala_sitting_office_side", "Gala_sitting_sofa_front", "Gala_sitting_sofa_front_close", "Gala_sitting_sofa_side", "Gala_sitting_sofa_side_close", "Gala_standing_businesssofa_front", "Gala_standing_businesssofa_front_close", "Gala_standing_businesssofa_side", "Gala_standing_businesssofa_side_close", "Georgia_expressive_2024112701", "Georgia_sitting_office_front", "Georgia_sitting_office_side", "Georgia_standing_casual_front", "Georgia_standing_casual_side", "Gerardo_sitting_indoor_front", "Gerardo_sitting_indoor_side", "Gerardo_sitting_sofa_front", "Gerardo_sitting_sofa_side", "Gerardo_standing_nightscene2_front", "Gerardo_standing_nightscene_front", "Gerardo_standing_outdoorsport_front", "Gerardo_standing_outdoorsport_side", "Giulia_sitting_office_front", "Giulia_sitting_office_side", "Giulia_sitting_sofa_front", "Giulia_sitting_sofa_side", "Giulia_standing_office_front", "Giulia_standing_office_side", "Giulia_standing_sofa_front", "Giulia_standing_sofa_side", "Hada_Casual_Cup_Front_public", "Hada_Casual_Cup_Side_public", "Hada_Casual_Front_public", "Hada_Casual_Side_public", "Hada_Casual_Sitting_Front_2_public", "Hada_Casual_Sitting_Front_public", "Hada_Casual_Sitting_Side_2_public", "Hada_Casual_Sitting_Side_public", "Hada_LivelyGestures_Front_public", "Hada_LivelyGestures_Side_public", "Hada_LivelyGestures_Sitting_Front_public", "Hada_LivelyGestures_Sitting_Side_public", "Hada_Suit_Front_2_public", "Hada_Suit_Front_public", "Hada_Suit_Side2_public", "Hada_Suit_Side_public", "Hada_Suit_Sitting_Front_2_public", "Hada_Suit_Sitting_Front_public", "Hada_Suit_Sitting_Side_public", "Harrison_public_20240313", "Harrison_public_2_20240313", "Harrison_public_3_20240313", "Ian_public_20240315", "Ian_public_2_20240315", "Ian_public_3_20240315", "Ida_sitting_lounge_front", "Ida_sitting_lounge_side", "Ida_sitting_sofa_front", "Ida_sitting_sofa_side", "Ida_standing_lounge_front", "Ida_standing_lounge_side", "Ida_standing_sofa_front", "Ida_standing_sofa_side", "Iker_public_1", "Iker_public_2", "Iker_public_3", "Iker_public_4", "Iker_public_5", "Imelda_BizTalk_Front_public", "Imelda_BizTalk_Side_public", "Imelda_Business_Front_public", "Imelda_Business_Side_public", "Imelda_Business_Sitting_Front_2_public", "Imelda_Business_Sitting_Front_public", "Imelda_Business_Sitting_Side_2_public", "Imelda_Business_Sitting_Side_public", "Imelda_Casual_Front_public", "Imelda_Casual_Side_public", "Imelda_Coat_Front_2_public", "Imelda_Coat_Front_public", "Imelda_Coat_Side_public", "Imelda_Customer_Support_Front_public", "Imelda_Customer_Support_Side_public", "Imelda_Full_Side_public", "Imelda_Suit_Front_public", "Imelda_Suit_Side_public", "Ivan_public_20240312", "Ivan_public_2_20240312", "Ivan_public_3_20240312", "Ivan_public_4_20240312", "Jason_public_20240312", "Jason_public_2_20240312", "Jason_public_3_20240312", "Javi_Intense_Sitting_Speaking_Front_public", "Javi_Intense_Sitting_Speaking_Side_public", "Javi_Intense_Sitting_Speaking_public", "Javi_Intense_Speaking_Front_2_public", "Javi_Intense_Speaking_Front_3_public", "Javi_Intense_Speaking_Front_public", "Javi_Intense_Speaking_Side_3_public", "Javi_Intense_Speaking_Side_public", "Javi_in_Passionate_Gestures_2_public", "Javi_in_Passionate_Gestures_3_public", "Javi_in_Passionate_Gestures_public", "Jin_Blue_Casual_Front_public", "Jin_Blue_Casual_Side_public", "Jin_Business_Coffee_Mode_Front_public", "Jin_Business_Coffee_Mode_Side_public", "Jin_Business_Sitting_Front_public", "Jin_Business_Sitting_Side_public", "Jin_Casual_Coffee_Mode_Front_public", "Jin_Casual_Coffee_Mode_Side_public", "Jin_Casual_Sitting_Front_public", "Jin_Casual_Sitting_Side_public", "Jin_Suit_Front_public", "Jin_Suit_Side_public", "Jin_Vest_Front_public", "Jin_Vest_Side_public", "Jin_Vest_Sitting_Front_public", "Jin_Vest_Sitting_Side_public", "Jin_expressive_2024112501", "Jin_in_Education_Front_public", "Jin_in_Education_Side_public", "Jinwoo_public_1", "Jinwoo_public_2", "Jinwoo_public_3", "Jinwoo_public_4", "Jinwoo_public_5", "Jocelyn_sitting_office_front", "Jocelyn_sitting_office_side", "Jocelyn_sitting_sofa_front", "Jocelyn_sitting_sofa_side", "Jocelyn_standing_office_front", "Jocelyn_standing_office_side", "Jocelyn_standing_sofa_front", "Jocelyn_standing_sofa_side", "Joel_sitting_couch_front", "Joel_sitting_couch_side", "Joel_standing_gym_front", "Joel_standing_gym_side", "Joel_standing_mountain_front", "Joel_standing_mountain_side", "Jonas_expressive_2024112701", "Jonas_sitting_gym_front", "Jonas_sitting_gym_side", "Jonas_standing_gym_front", "Jonas_standing_gym_side", "Juan_sitting_office_front", "Juan_sitting_office_side", "Juan_sitting_sofa_front", "Juan_sitting_sofa_side", "Juan_sitting_sofacasual_front", "Juan_standing_office_front", "Juan_standing_office_side", "Juan_standing_sofa_front", "Juan_standing_sofa_side", "Juan_standing_sofacasual_front", "Judita_expressive_2024112701", "Judita_sitting_yoga_front", "Judita_sitting_yoga_side", "Judita_standing_yoga_front", "Judita_standing_yoga_side", "Judith_Business_Front2_public", "Judith_Business_Front_public", "Judith_Business_Sitting_Front_public", "Judith_Casual_Front_public", "Judith_Casual_Sitting_Front_public", "Judith_Suit_Front_public", "Judith_expressive_2024120201", "Judy_Business_Front_public", "Judy_Business_Side_public", "Judy_Business_Sitting_Front_public", "Judy_Casual_Front_public", "Judy_Casual_Side_public", "Judy_Casual_Sitting_public", "Judy_ConfidentSpeaking_Front_public", "Judy_ConfidentSpeaking_Side_public", "Judy_Doctor_Sitting2_public", "Judy_Doctor_Standing2_public", "Judy_Lawyer_Sitting2_public", "Judy_NurseSitting_Front_2_public", "Judy_NurseSitting_Front_public", "Judy_NurseSitting_Side_2_public", "Judy_NurseSitting_Side_public", "Judy_Nurse_Front2_public", "Judy_Nurse_Front_public", "Judy_Nurse_OnDuty_Front_public", "Judy_Nurse_OnDuty_Side_public", "Judy_Nurse_Side2_public", "Judy_Nurse_Side_public", "Judy_Suit_Front_public", "Judy_Suit_Side_public", "Judy_Teacher_Sitting2_public", "Judy_Teacher_Sitting_public", "Judy_Teacher_Standing_public", "June_HR_public", "June_expressive_2024112701", "June_sitting_office_front", "June_sitting_office_side", "June_sitting_sofacasual_side", "June_standing_office_side", "June_standing_sofacasual_side", "Justin_public_20240308", "Justin_public_2_20240308", "Justin_public_3_20240308", "Justo_Business_Front_2_public", "Justo_Business_Front_public", "Justo_Business_Side_2_public", "Justo_Business_Side_public", "Justo_Casual_Sitting_public", "Justo_CustomerService_Front_2_public", "Justo_CustomerService_Front_public", "Justo_CustomerService_Side_public", "Justo_CustomerService_Sitting_Front_public", "Justo_CustomerService_Sitting_Side_public", "Justo_EmployeeTraining_Front_public", "Justo_Suit_Casual_Front_public", "Justo_Suit_Casual_Side_public", "Karolin_public_20230109", "Karolin_public_2_20230109", "Karolin_public_3_20230109", "Kavya_sitting_sofa_front", "Kavya_sitting_sofa_side", "Kavya_standing_indoor_front", "Kavya_standing_indoor_side", "Kavya_standing_outdoor_side", "Kavya_standing_outdoorsport_front", "Kavya_standing_outdoorsport_side", "Kelly_Blue_Shirt_Front", "Kelly_Blue_Shirt_Left", "Kelly_Blue_Shirt_Right", "Kelly_Doctor_Front", "Kelly_Doctor_Left", "Kelly_Doctor_Right", "Kelly_Pink_Shirt_Front", "Kelly_Pink_Shirt_Left", "Kelly_Pink_Shirt_Right", "Klara_public_1", "Klara_public_2", "Klara_public_3", "Klara_public_4", "Klara_public_5", "Klara_public_6", "Kristin_public_20240108", "Kristin_public_2_20240108", "Kristin_public_3_20240108", "Leos_sitting_office_front", "Leos_sitting_office_side", "Leos_sitting_sofa_front", "Leos_sitting_sofa_side", "Leos_standing_office_front", "Leos_standing_office_side", "Leos_standing_sofa_front", "Leos_standing_sofa_side", "Leszek_sitting_lounge_front", "Leszek_sitting_lounge_side", "Leszek_sitting_sofa_front", "Leszek_sitting_sofa_side", "Leszek_standing_outdoorbusiness_front", "Leszek_standing_outdoorbusiness_side", "Leszek_standing_outdoorcasual_front", "Leszek_standing_outdoorcasual_side", "Lily_public_lite1_20230601", "Lily_public_pro1_20230614", "Lina_Casual_Front_2_public", "Lina_Casual_Front_public", "Lina_Casual_Side_2_public", "Lina_Casual_Side_public", "Lina_Casual_Sitting_Front_public", "Lina_Casual_Sitting_Side_public", "Lina_Dress_Front_public", "Lina_Dress_Side_2_public", "Lina_Dress_Side_public", "Lina_Dress_Sitting_Front_public", "Lina_Dress_Sitting_Side_public", "Lina_Sweater_Front_2_public", "Lina_Sweater_Front_public", "Lina_Sweater_Side_2_public", "Lina_Sweater_Side_public", "Lina_Sweater_Sitting_Front_2_public", "Lina_Sweater_Sitting_Front_public", "Lina_Sweater_Sitting_Side_2_public", "Lina_Sweater_Sitting_Side_public", "Lisa_public", "Luca_public", "Lucien_public_1", "Lucien_public_2", "Lucien_public_3", "Lucien_public_4", "Lucien_public_5", "Lucien_public_6", "Luke_public_20240306", "Luke_public_2_20240306", "Luke_public_3_20240306", "Marcus_Casual_Front_public", "Marcus_Casual_Side_public", "Marcus_Casual_Sitting_Front_2_public", "Marcus_Casual_Sitting_Front_public", "Marcus_Casual_Sitting_Side_2_public", "Marcus_Casual_Sitting_Side_public", "Marcus_Coffee_Front_2_public", "Marcus_Coffee_Front_public", "Marcus_Coffee_Side_2_public", "Marcus_Coffee_Side_public", "Marcus_Denim_Jacket_Front_public", "Marcus_Denim_Jacket_Side_public", "Marcus_Education_Front_public", "Marcus_Education_Side_public", "Marcus_Sitting_Front_public", "Marcus_Sitting_Side_public", "Marcus_Suit_Front_public", "Marcus_Suit_Side_public", "Marcus_expressive_2024120201", "Maria_public_20240111", "Maria_public_2_20240111", "Maria_public_3_20240111", "Martina_sitting_office_front", "Martina_sitting_office_side", "Martina_sitting_sofa_front", "Martina_sitting_sofa_side", "Martina_standing_office_front", "Martina_standing_office_side", "Martina_standing_sofa_front", "Martina_standing_sofa_side", "Masha_sitting_office_front", "Masha_sitting_office_side", "Masha_sitting_sofacasual_front", "Masha_sitting_sofacasual_side", "Masha_standing_office_front", "Masha_standing_office_side", "Masha_standing_sofacasual_front", "Masha_standing_sofacasual_side", "Mason_public_20240304", "Mason_public_2_20240304", "Mason_public_3_20240304", "Matteo_sitting_office_front", "Matteo_sitting_office_side", "Matteo_sitting_sofa_front", "Matteo_sitting_sofa_side", "Matteo_standing_office_front", "Matteo_standing_office_side", "Matteo_standing_sofa_front", "Matteo_standing_sofa_side", "Max_expressive_2024112701", "Max_sitting_indoor_front", "Max_sitting_indoor_side", "Max_standing_outdoorsport_front", "Max_standing_outdoorsport_side", "Mido-lite-20221128", "Mido-pro-flowershirt-20221208", "Mido-pro-greysweater-20221209", "Mido-pro-insuit-20221208", "Milena_sitting_office_front", "Milena_sitting_office_side", "Milena_sitting_sofa_front", "Milena_sitting_sofa_side", "Milena_standing_office_front", "Milena_standing_office_side", "Milena_standing_sofa_front", "Milena_standing_sofa_side", "Miles_expressive_2024112701", "Miles_sitting_sofa_front", "Miles_sitting_sofa_side", "Miles_standing_outdoor_front", "Miles_standing_outdoor_side", "Miles_standing_sofa_front", "Miles_standing_sofa_side", "Minho_public_1", "Minho_public_2", "Minho_public_3", "Minho_public_4", "Minho_public_5", "Minho_public_6", "Mireia_sitting_businessindoor_front", "Mireia_sitting_businessindoor_side", "Mireia_sitting_outdoorchair_front", "Mireia_sitting_outdoortable_front", "Mireia_sitting_outdoortable_side", "Mireia_standing_outdoor_front", "Mireia_standing_outdoor_side", "Miyu_sitting_office_front", "Miyu_sitting_office_side", "Miyu_sitting_sofabusiness_front", "Miyu_sitting_sofabusiness_side", "Miyu_sitting_sofacasual_front", "Miyu_sitting_sofacasual_side", "Miyu_standing_office_front", "Miyu_standing_office_side", "Miyu_standing_sofacasual_front", "Miyu_standing_sofacasual_side", "Nadim_public_1", "Nadim_public_2", "Nadim_public_3", "Nadim_public_4", "Nadim_public_5", "Neil_public_20240328", "Neil_public_2_20240328", "Neil_public_3_20240328", "Nico_public", "Noah_sitting_lobby_front", "Noah_sitting_lobby_side", "Noah_sitting_office_front", "Noah_sitting_office_side", "Noah_sitting_sofa_front", "Noah_sitting_sofa_side", "Noah_standing_lobby_front", "Noah_standing_lobby_side", "Noah_standing_office_front", "Noah_standing_office_side", "Noah_standing_sofa_front", "Noah_standing_sofa_side", "Nour_public_1", "Nour_public_2", "Nour_public_3", "Nour_public_4", "Nour_public_5", "Odelia_public_20240326", "Odelia_public_2_20240326", "Odelia_public_3_20240326", "Onat_Casual_Front_public", "Onat_Casual_Side_public", "Onat_Casual_Sitting_Front_public", "Onat_Casual_Sitting_Side_public", "Onat_Macbook_Front2_public", "Onat_Macbook_Front_public", "Onat_Macbook_Side2_public", "Onat_Macbook_Side_public", "Onat_Suit_Front_public", "Onat_Suit_Side_public", "Onat_Suit_Sitting_Front_public", "Onat_Suit_Sitting_Side_public", "Onat_expressive_2024120201", "Onat_iPad_Front_public", "Onat_iPad_Side_public", "Onat_iPad_Sitting_Front_public", "Onat_iPad_Sitting_Side_public", "Oxana_2_expressive_2024112701", "Oxana_expressive_2024112701", "Oxana_sitting_gym_front", "Oxana_sitting_gym_side", "Oxana_sitting_office_front", "Oxana_sitting_office_side", "Oxana_sitting_sofa_front", "Oxana_sitting_sofa_side", "Oxana_sitting_yoga_front", "Oxana_sitting_yoga_side", "Oxana_standing_gym_front", "Oxana_standing_gym_side", "Oxana_standing_office_front", "Oxana_standing_office_side", "Oxana_standing_sofa_front", "Oxana_standing_sofa_side", "Oxana_standing_yoga_front", "Oxana_standing_yoga_side", "Patrizio_sitting_office_front", "Patrizio_sitting_office_side", "Patrizio_sitting_sofa_front", "Patrizio_sitting_sofa_side", "Patrizio_standing_businesstraining_front", "Patrizio_standing_businesstraining_side", "Patrizio_standing_office_side", "Piper_sitting_businesssofa_front", "Piper_sitting_businesssofa_side", "Piper_standing_education_front", "Piper_standing_education_side", "Rasmus_sitting_lounge_front", "Rasmus_sitting_lounge_side", "Rasmus_sitting_sofa_front", "Rasmus_sitting_sofa_side", "Rasmus_standing_lounge_front", "Rasmus_standing_lounge_side", "Rasmus_standing_sofa_front", "Rasmus_standing_sofa_side", "Raul_Sitting_businesssofa_front", "Raul_Sitting_businesssofa_front_close", "Raul_expressive_2024112501", "Raul_sitting_businesssofa_side", "Raul_sitting_casualsofanoipad_front", "Raul_sitting_casualsofanoipad_side", "Raul_sitting_casualsofawithipad_front", "Raul_sitting_casualsofawithipad_side", "Raul_sitting_office_front", "Raul_sitting_office_side", "Raul_sitting_sofa_front", "Raul_sitting_sofa_front_close", "Raul_sitting_sofa_side", "Raul_sitting_sofa_side_close", "Raul_standing_businesssofa_side", "Raul_standing_casualsofa_front", "Raul_standing_casualsofa_front_close", "Raul_standing_casualsofa_side", "Raul_standing_casualsofa_side_close", "Raul_standing_office_front", "Rebecca_public", "Ren_expressive_2024112701", "Ren_sitting_office_front", "Ren_sitting_office_side", "Ren_sitting_sofabusiness_front", "Ren_sitting_sofabusiness_side", "Ren_sitting_sofacasual_front", "Ren_sitting_sofacasual_side", "Ren_standing_office_front", "Ren_standing_office_side", "Ren_standing_sofacasual_front", "Ren_standing_sofacasual_side", "Riley_expressive_2024112501", "Riley_siting_casual_front", "Riley_sitting_casual_side", "Riley_sitting_office_front", "Riley_sitting_office_side", "Roman_standing_outdoorsport_front", "Roman_standing_outdoorsport_side", "Sabine_sitting_office_front", "Sabine_sitting_sofa_side", "Sabine_standing_office_front", "Sabine_standing_office_side", "Salma_headscarf_Front", "Salma_headscarf_Left", "Salma_headscarf_Right", "SantaAvatar_Sitting_public", "Santa_Avatar_Present_Standing_public", "Santa_Avatar_Sitting_2_public", "Santa_Avatar_Sitting_Side_public", "Santa_Avatar_Standing_public", "Santa_Fireplace_Front_public", "Santa_Fireplace_Side_public", "Saskia_public_1", "Saskia_public_2", "Saskia_public_3", "Saskia_public_4", "Saskia_public_5", "Scarlett_siiting_fireplace_front", "Scarlett_sitting_couch2_front", "Scarlett_sitting_couch2_side", "Scarlett_sitting_couch_front", "Scarlett_sitting_couch_side", "Scarlett_sitting_fireplace_side", "Scarlett_sitting_yoga_front", "Scarlett_sitting_yoga_side", "Scarlett_standing_hall_front", "Scarlett_standing_hall_side", "Seema_Business_Front_public", "Seema_Business_Side_public", "Seema_Business_Sitting_Side_public", "Seema_Casual_Front_public", "Seema_Casual_Side_public", "Seema_Casual_Sitting_Front_public", "Seema_Casual_Sitting_Side_public", "Seema_Nurse_Front_2_public", "Seema_Nurse_Front_public", "Seema_Nurse_Side_2_public", "Seema_Nurse_Side_public", "Shawn_Business_Front_public", "Shawn_Business_Side_public", "Shawn_Casual_Sitting_Front_public", "Shawn_Casual_Sitting_Side_public", "Shawn_Sitting_Front_public", "Shawn_Sitting_Side_public", "Shawn_Suit_Front_public", "Shawn_Suit_Side_public", "Shawn_Therapist_public", "Shirley_Business_Front_public", "Shirley_Business_Side_public", "Shirley_Casual_Front_2_public", "Shirley_Casual_Front_public", "Shirley_Casual_Side_public", "Shirley_Casual_Sitting_Front_2_public", "Shirley_Casual_Sitting_Front_public", "Shirley_Casual_Sitting_Side_2_public", "Shirley_Casual_Sitting_Side_public", "Shirley_Education_Front_public", "Shirley_Education_Side_2_public", "Shirley_Education_Side_public", "Shirley_Sitting_Front_public", "Shirley_Sitting_Side_public", "Shirley_Skirt_Front_public", "Shirley_Skirt_Side_public", "Shirley_Suit_Front_public", "Shirley_Suit_Side_public", "SilasHR_public", "Silas_CustomerSupport_public", "Silas_expressive_2024120201", "Silas_sitting_lounge_front", "Silas_sitting_lounge_side", "Silas_sitting_sofa_side", "Silas_sitting_sofa_side_close", "Sloane_public_2", "Sloane_public_4", "Sloane_public_5", "Sophia_public_20240320", "Sophia_public_2_20240320", "Sophia_public_3_20240320", "Sophie_public", "Stacy_in_Doctor_Front", "Stacy_in_Doctor_Left", "Stacy_in_Doctor_Right", "Stacy_in_Dress_Front", "Stacy_in_Dress_Left", "Stacy_in_Dress_Right", "Stacy_in_Shirt_Front", "Stacy_in_Shirt_Left", "Stacy_in_Shirt_Right", "Susan_public_20240328", "Susan_public_2_20240328", "Susan_public_3_20240328", "Tahlia_public_1", "Tahlia_public_2", "Tahlia_public_3", "Tahlia_public_4", "Tahlia_public_5", "Teodor_expressive_2024112701", "Teodor_sitting_office_front", "Teodor_sitting_office_side", "Teodor_sitting_sofa_front", "Teodor_sitting_sofa_side", "Teodor_standing_office_front", "Teodor_standing_office_side", "Teodor_standing_sofa_front", "Teodor_standing_sofa_side", "Timothy_expressive_2024112701", "Timothy_sitting_casual_front", "Timothy_sitting_casual_side", "Timothy_sitting_office_front", "Timothy_sitting_office_side", "Tito_Casual_Front_2_public", "Tito_Casual_Front_public", "Tito_Casual_Side_2_public", "Tito_Casual_Side_public", "Tito_Casual_Sitting_Front_public", "Tito_Casual_Sitting_Side_public", "Tito_Coat_Front_2_public", "Tito_Coat_Front_public", "Tito_Coat_Full_Side_public", "Tito_Coat_Side_2_public", "Tito_Coat_Side_public", "Tito_Painter_Front_public", "Tito_Painter_Full_Side_public", "Tito_Painter_Side_public", "Tito_Painter_Sitting_Front_public", "Tito_Painter_Sitting_Side_public", "Travis_public_20240301", "Travis_public_2_20240301", "Travis_public_3_20240301", "Trevor_public_20240409", "Trevor_public_2_20240409", "Trevor_public_3_20240409", "Trevor_public_4_20240409", "Tuba_Business_Chair_Front_public", "Tuba_Business_Chair_Side_public", "Tuba_Business_Front_public", "Tuba_Business_Side_public", "Tuba_Business_Sofa_Front_public", "Tuba_Business_Sofa_Side_public", "Tuba_Casual_Front_public", "Tuba_Casual_Side_public", "Tuba_Casual_Sitting_Front_public", "Tuba_Casual_Sitting_Side_public", "Tuba_Macbook_Front_public", "Tuba_Macbook_Side_public", "Tyler-incasualsuit-20220721", "Tyler-inshirt-20220721", "Tyler-insuit-20220721", "Veit_sitting_sofa_front", "Veit_sitting_sofa_side", "Veit_standing_office_front", "Veit_standing_office_side", "Vemon_sitting_office_front", "Vemon_sitting_office_side", "Vemon_standing_office_front", "Vemon_standing_office_side", "Verena_sitting_sofa_front", "Verena_sitting_sofa_side", "Verena_standing_office_front", "Verena_standing_office_side", "Vernon_expressive_2024112501", "Vernon_sitting_lounge_side", "Vernon_standing_lounge_front", "Vernon_standing_lounge_side", "Vince_expressive_2024112701", "Vince_sitting_businesssofa_front", "Vince_sitting_businesssofa_side", "Vince_sitting_sofacasual_front", "Vince_sitting_sofacasual_side", "Vince_standing_businesstraining_front", "Vince_standing_businesstraining_side", "Vince_standing_sofacasual_front", "Vince_standing_sofacasual_side", "Violante_Brown_Suit_Front_2_public", "Violante_Brown_Suit_Front_public", "Violante_Business_Sitting_Front_public", "Violante_Business_Sitting_Side_public", "Violante_Casual_Sitting_Front_public", "Violante_Casual_Sitting_Side_public", "Violante_Sport_Front_2_public", "Violante_Sport_Front_public", "Violante_Sport_Side_public", "Violante_Sport_Sitting_Side_public", "Violante_Suit_Front_public", "Vivianna_public_20230110", "Wade_public_20240228", "Wade_public_2_20240228", "Wade_public_3_20240228", "Yola_Active_Speaking_Front_public", "Yola_Active_Speaking_Side_public", "Yola_Business_Front_public", "Yola_Business_Side_public", "Yola_Calm_Speaking_Front_public", "Yola_Calm_Speaking_Side_public", "Yola_Casual_Front_public", "Yola_Casual_Side_public", "Yola_Employee_Badge_Front_public", "Yola_Employee_Badge_Side_public", "Zosia_public_1", "Zosia_public_2", "Zosia_public_3", "Zosia_public_4", "Zosia_public_5", "candace_expressive_20240910", "chad_expressive_20240910", "francis_expressive_20240910", "nik_blue_expressive_20240910", "nik_expressive_20240910"], {"tooltip": "HeyGen avatar ID for a photo or video avatar.", "default": "(default)", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "avatar": {"path": ["inputs", "avatar"], "kind": "scalar", "omit_value": "(default)"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "gate", "value_key": "duration_value"}, "duration_value": {"path": ["duration"], "kind": "skip"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_heygen_avatar_iv", "name": "HeyGen Avatar IV", "model": "heygen:avatar@4", "task_type": "videoInference", "creator": "heygen", "input_types": {"required": {}, "optional": {"image": ["IMAGE"], "background": ["IMAGE"], "speech": ["RUNWARE_SPEECH", {"rw_socket_fields": ["language", "pitch", "speed", "text", "voice"], "rw_socket_enums": {"voice": ["chill_brian_male_english", "allison_female_english", "ivy_female_english", "john_doe_male_english", "mark_male_english_5d8c37", "monika_sogam_female_english", "hope_female_english_42d00d", "archer_male_english_453c20", "brittney_female_english", "patrick_male_english", "david_castlemore_male_english", "michael_c_male_english", "adam_stone_male_english", "alex_male_english", "james_male_english", "juniper_female_english", "cassidy_female_english", "jessica_anne_bogart_female_english", "arabella_female_english", "andrew_male_english_6be738", "spuds_oxley_male_english", "terry_male_english", "jenny_female_english", "radio_rick_male_english", "denise_female_english", "tim_in_car_excited_male_english", "iskander_male_english", "thompson_male_english", "delicate_daisy_excited_female_english", "kingston_male_english", "george_ugc_1_male_english", "bold_blake_male_english", "jane_female_english_662f98", "expressive_evan_male_english_6638ff", "marianne_ia_female_english", "aaron_male_english", "modern_recipe_host_voice_1_male_english", "willow_female_english", "cute_chloe_friendly_female_english", "rafael_male_english", "june_lifelike_female_english_68deda", "crisp_chloe_female_english", "slick_simon_male_english", "nassim_informative_male_english", "baritone_ben_male_english", "maxwell_male_english", "ellie_faye_excited_female_english", "milani_female_english_6a5abd", "feisty_fiona_excited_female_english", "professor_dean_male_english", "rose_ugc_1_mp4_female_english", "shona_female_english", "hudson_wilder_male_english", "ann_ia_female_english_6bc024", "alastair_kensington_male_english", "oxley_male_english", "christina_female_english", "andrew_rizz_male_english", "peyton_female_english", "gerardo_outdoor_male_english", "chloe_lifelike_female_english", "ann_ia_female_english_6eafa4", "stephanie_female_english_6edde9", "anthony_ia_male_english", "signal_voice_1_male_english", "luca_male_english_6HiVde", "lisa_voice_1_unknown_english", "t_w_tucker_male_english", "jack_sullivan_serious_male_english", "winter_female_english", "mireia_lifelike_female_english", "georgia_female_english", "stella_female_english", "masha_lifelike_female_english", "charming_charles_friendly_male_english", "sophie_vale_excited_female_english", "serenity_female_english", "june_lifelike_female_english_748d08", "ralph_male_english", "bethany_female_english_758fe6", "dominic_male_english", "mason_finn_male_english_75af67", "leena_female_english", "veteran_victor_male_english", "tamara_female_english", "nik_public_male_english", "storyteller_ollie_serious_male_english", "calm_chloe_female_english", "brenda_ugc_3_mp4_female_english", "sevik_male_english", "reilly_female_english", "raul_male_english", "imposing_ian_male_english", "georgia_lifelike_friendly_female_english", "relaxed_ray_male_english", "dexter_professional_male_english", "peppy_priya_excited_female_english", "relaxed_rick_male_english", "autumn_ugc_2_female_english", "instructive_isabelle_excited_female_english", "edwin_male_english", "rupert_blackwood_male_english", "ginny_female_english", "milo_baxter_male_english", "baltazar_voice_1_unknown_english", "reliable_nora_female_english", "news_reporter_voice_1_unknown_english", "gentle_gemma_female_english_7c66cd", "julie_female_english", "aya_voice_1_unknown_english", "melody_mae_female_english", "clarity_catherine_female_english", "lovely_lucy_female_english", "tee_female_english", "nicholas_male_english_96d72b", "lillian_female_english", "chike_obi_male_english", "william_prescott_soothing_male_english", "hargrove_male_english", "william_prescott_friendly_male_english", "william_prescott_serious_male_english", "harrison_cole_male_english", "harlan_male_english", "quentin_informative_male_english", "uncle_amos_male_english", "assertive_adam_male_english", "coach_cooper_male_english", "rina_female_english", "nathan_reed_male_english", "jansen_female_english", "carl_hudson_male_english", "lehka_female_english", "keisha_female_english", "teen_tara_female_english", "husky_harold_serious_male_english", "thanos_broadcaster_male_english_9ceb5d", "avery_lane_female_english", "barnaby_thorne_serious_male_english", "catherine_excited_female_english", "malcolm_jr_excited_male_english", "taylor_female_english", "madison_female_english", "tiffany_excited_female_english", "noble_nigel_male_english_9ec46d", "jay_voice_1_male_english", "kelly_female_english", "hazel_everly_female_english", "dylan_male_english", "elder_brooks_broadcaster_male_english", "cordial_christopher_male_english", "great_voice_1_male_english", "henry_worthington_male_english", "hada_female_english", "dale_male_english", "hannah_female_english", "haley_female_english", "elisa_voice_1_unknown_english", "rhosyn_female_english", "saskia_female_english", "max_outdoor_male_english", "georgia_lifelike_excited_female_english", "jayden_male_english", "miles_lifelike_male_english", "dynamic_devin_male_english", "calvin_male_english", "barbara_female_english", "choi_female_english", "marcel_ugc_1_mp4_male_english", "katya_ia_female_english", "melvin_male_english", "victor_hayes_serious_male_english", "uno_voice_1_male_english", "daran_outside_walking_excited_male_english", "connor_male_english", "leslie_female_english", "morgan_female_english_a96402", "amaris_female_english", "custom_voice_voice_1_unknown_english_A98UML", "rupert_blackwood_broadcaster_male_english", "jibran_male_english_aac0f7", "bill_male_english", "raviy_male_english", "myriam_female_english", "kenzo_male_english", "oliver_bennett_male_english", "serene_samuel_male_english", "youssef_male_english", "warm_young_adult_female_english", "rika_ia_female_english", "nancy_female_english", "jessica_female_english", "spunky_sam_male_english", "stella_2_female_english_ace0c7", "max_lifelike_male_english", "radiant_raven_female_english", "leonardo_male_english", "zara_okeke_female_english", "kind_kathleen_female_english", "sophia_voice_3_female_english", "dom_male_english", "thomas_blake_male_english", "kavya_female_english", "aly_female_english", "piper_lifelike_female_english", "byron_professional_male_english", "lovely_luna_female_english", "shawn_lifelike_male_english", "william_prescott_male_english", "evelyn_harper_friendly_female_english", "mature_morgan_male_english", "claire_lawson_excited_female_english", "roisin_female_english", "shirley_professional_female_english", "leonie_female_english", "neo_male_english", "lush_leonard_male_english", "wayne_liang_2_male_english", "emery_female_english", "kavya_outdoor_female_english", "artur_lifelike_male_english", "steve_male_english", "rey_male_english", "claire_female_english_e66d40", "george_ugc_3_male_english", "jada_female_english", "wesley_male_english", "karolina_female_english", "iris_female_english", "hada_excited_female_english", "ricardo_male_english", "hunter_male_english", "mabel_forsythe_female_english", "kristoff_male_english", "kwame_the_great_male_english", "tahlia_brooks_friendly_female_english", "tyler_kurk_informative_male_english", "biblico_voice_1_male_english", "jace_male_english", "kwame_the_great_serious_male_english", "julia_female_english", "gerardo_male_english", "shirley_female_english", "denyse_female_english", "barnaby_thorne_male_english", "asher_male_english", "catherine_female_english", "scarlett_lifelike_female_english", "mendoza_female_english", "sensual_sapphira_excited_female_english", "greg_male_english", "aswas_voice_1_unknown_english", "nina_voice_1_unknown_english", "melchor_voice_1_unknown_english_eHTH85", "tck_voice_1_female_english", "lucas_voice_1_male_english", "shah_voice_3_male_english", "dilai_voice_1_female_english_EqyAD9", "shah_voice_1_male_english", "voice_1_unknown_english_exlth8", "margaret_female_english", "peppy_priya_friendly_female_english", "kwaku_male_english", "june_female_english", "confident_connor_male_english", "olsson_female_english", "izzy_female_english", "chase_male_english", "yumi_female_english", "ten_voice_1_male_english", "rhonda_female_english", "lovely_luna_excited_female_english", "spunky_sandra_excited_female_english", "justo_male_english", "chill_chase_male_english", "lucien_male_english", "yogi_scott_male_english", "erin_female_english", "jin_professional_female_english", "myra_female_english", "timothy_lifelike_male_english", "archer_male_english_f6e122", "evelyn_harper_excited_female_english", "graham_male_english", "sebastian_male_english_f79b2a", "vibrant_vince_male_english", "mysterious_michael_broadcaster_male_english", "meilin_female_english", "lori_female_english", "alvarez_female_english", "victor_hayes_male_english", "narrative_nora_broadcaster_female_english", "alba_female_english", "vibrant_violet_friendly_female_english", "baritone_bryce_male_english", "margaret_thatcher_serious_female_english", "warrior_rohan_male_english", "journey_female_english", "dr_sterling_male_english", "pedro_ia_male_english", "professor_dean_angry_male_english", "arianna_female_english", "nadim_male_english", "malcolm_jr_male_english", "cute_chloe_female_english_fc3a1b", "levi_male_english", "sina_female_english", "mysterious_michael_male_english", "lulu_lollipop_female_english", "jon_male_english", "judy_professional_female_english_fd9c68", "ryan_male_english", "robin_female_english", "milani_female_english_fe1eb4", "arthur_blackwood_male_english", "dynamic_daisy_female_english_1b4dd4", "bd_male_english", "marcel_ugc_3_mp4_male_english", "gregory_male_english", "kaison_male_english", "hi_voice_1_male_english", "thanos_excited_male_english", "cute_chloe_excited_female_english", "calm_eva_soothing_female_english", "kurt_male_english", "michael_male_english", "lush_leonard_serious_male_english", "jayla_female_english_1f2f09", "sunny_male_english", "bastien_male_english", "mark_voice_1_unknown_english", "bruce_male_english", "quinn_female_english_207e0f", "douglas_male_english", "zesty_zeke_male_english", "adeline_female_english", "vince_lifelike_male_english", "alec_best_voice_male_english", "vivacious_vince_male_english", "abigail_female_english", "chill_chase_friendly_male_english", "nevaeh_female_english", "leif_male_english", "arnav_male_english", "finn_male_english", "epic_eli_male_english", "epic_eli_excited_male_english", "engaging_evan_male_english", "gentle_gabe_male_english", "tristan_male_english", "mikkel_male_english", "an_ugc_3_female_english", "frances_female_english", "regal_roger_male_english", "bo_male_english", "william_prescott_angry_male_english", "baraka_mwangi_male_english", "bethany_female_english_250a27", "elise_female_english", "larry_male_english", "energetic_mikey_male_english", "isabelle_female_english", "karen_female_english", "leyla_female_english", "jeyla_female_english", "pragmatic_peter_male_english", "ellie_faye_serious_female_english", "deepened_dave_male_english", "intense_isaac_male_english", "vivian_hartley_female_english", "feisty_fiona_broadcaster_female_english", "melina_voice_1_female_english", "dynamic_derek_broadcaster_male_english", "warm_william_serious_male_english", "margaret_thatcher_female_english", "luna_bright_female_english", "ross_male_english", "composed_carla_female_english", "refined_rupert_male_english", "sebastian_male_english_2bed55", "zoya_female_english", "maya_female_english_2cca78", "kyle_male_english", "lively_liam_serious_male_english", "supply_voice_1_unknown_english", "adriana_female_english", "declan_male_english", "lea_female_english", "radiant_riley_female_english_2e28aa", "sporty_shane_male_english", "ann_professional_female_english", "cliff_male_english", "charlie_female_english", "husky_harold_male_english_2eb11e", "tao_avatar_by_heygen_voice_1_female_english", "rugged_ron_male_english", "derya_lifelike_serious_female_english", "gruff_greg_male_english", "lucas_male_english", "playful_priti_female_english", "griffin_steele_male_english", "lp_voice_1_unknown_english", "oso_peloso_voice_1_unknown_english", "kaitlyn_female_english", "ross_ugc_1_mp4_male_english", "bentley_male_english", "harriet_female_english", "george_ugc_4_male_english", "surfer_girl_female_english", "tck_voice_1_male_english", "jessica_voice_1_unknown_english", "archimedes_voice_1_male_english", "centa_new_voice_1_male_english", "lucas_voice_1_unknown_english", "tuta_voice_1_male_english", "abhishek_voice_1_male_english", "toto_voice_1_female_english", "biobloom_male_pro_voice_1_unknown_english", "ally_voice_1_unknown_english", "voice_1_female_english_aWRKid", "emma_voice_1_female_english", "lincoln_male_english", "olivia_female_english_b07347", "jennifer_ugc_2_mp4_female_english", "ryan_carter_male_english", "magical_riya_female_english", "professor_percy_male_english", "cute_chloe_female_english_b24662", "kendra_female_english", "vesperi_female_english", "derya_lifelike_female_english", "jayla_female_english_b37f74", "thanos_male_english", "ethan_grant_male_english", "anisa_female_english", "judy_female_english", "gritty_george_male_english", "daphne_female_english_b4efe5", "juniper_male_english", "fena_female_english", "cody_male_english_b54cd1", "robert_informative_male_english", "ella_hastings_excited_female_english", "benedict_shaw_male_english", "tony_male_english", "diana_female_english_b5f67a", "maya_female_english_b6313b", "fabian_male_english", "graham_ia_male_english", "gane_female_english", "annie_neutral_female_english", "derya_lifelike_soothing_female_english", "malcolm_jr_friendly_male_english", "nyah_female_english", "stirring_samuel_male_english", "bryan_informative_male_english", "kyra_female_english", "faria_female_english", "sloane_female_english", "david_carder_voice_1_male_english", "sensual_sapphira_friendly_female_english", "ji_soo_voice_1_female_english", "bojan_male_english", "oskar_male_english", "katherine_female_english", "lila_quinn_female_english", "mike_male_english", "fernando_male_english", "daniela_voice_1_unknown_english", "sonja_female_english", "hank_male_english", "anders_male_english", "zihan_male_english", "grim_gregory_male_english", "linda_female_english", "annie_soothing_female_english", "theo_male_english", "kwame_the_great_angry_male_english", "lovely_luna_friendly_female_english", "bryan_professional_male_english_bd9106", "noble_nathan_male_english", "yuna_female_english", "callum_male_english", "logan_hayes_soothing_male_english", "lehka_excited_female_english", "bryan_professional_male_english_beda79", "betania_female_english_bf3ceb", "olivia_female_english_bfa319", "dynamic_derek_excited_male_english", "loly_voice_1_female_english", "ellie_female_english", "neo_voice_1_female_english", "hpt_nam_2_voice_1_male_english", "atlas_voice_1_male_english", "mark_male_english_c022ff", "tranquil_tim_male_english", "mathis_male_english", "albert_male_english", "hudson_male_english", "frdo_le_jurassien_male_english", "morgan_female_english_c0c5cc", "silvia_female_english_c1d64d", "affable_alex_male_english", "samuel_male_english", "yogi_scott_friendly_male_english", "sir_henry_male_english", "bradley_informative_male_english", "jonas_male_english", "onat_male_english", "abigail_lifelike_female_english", "kathy_female_english", "silvia_female_english_c45c98", "owen_male_english_c46978", "brit_narrator_male_english", "barry_male_english", "teresa_female_english", "tariq_male_english", "george_male_english", "fresh_faith_female_english", "ricky_male_english_c701a9", "rex_male_english", "matt_male_english", "chaim_male_english", "marcel_ugc_4_mp4_male_english", "hada_lifelike_female_english", "tijs_male_english", "arthur_male_english", "peppy_priya_female_english", "reliable_nora_excited_female_english", "breezy_bob_male_english", "annie_calm_female_english", "dynamic_daisy_female_english_4d2044", "patel_male_english", "eleanor_grey_female_english", "vibrant_violet_female_english", "aiden_male_english", "tessa_female_english", "sajan_male_english", "mason_finn_male_english_4f0de4", "baron_deep_male_english", "arman_male_english", "ashley_female_english", "ramisa_female_english", "georgia_lifelike_female_english", "annelore_female_english", "brandon_male_english", "kevin_male_english", "gabriela_female_english_517a8d", "ann_professional_public_female_english", "grace_female_english", "quinn_female_english_52231d", "brenda_ugc_2_mp4_female_english", "bouncy_bailey_excited_female_english", "ross_ugc_4_mp4_male_english", "sturdy_simon_male_english", "bryce_male_english", "owen_male_english_53c5db", "nour_female_english", "autumn_ugc_1_female_english", "gravelly_grant_male_english", "armando_lifelike_male_english", "alden_male_english", "monica_harris_female_english", "joel_outdoor_male_english", "assertive_adam_excited_male_english", "college_girl_lexi_female_english", "genesis_female_english", "joy_female_english_550dbf", "diana_female_english_55a250", "xavier_male_english", "quinn_male_english", "mellow_mandy_female_english", "ethan_west_male_english", "noble_nigel_friendly_male_english", "anastasia_ia_female_english", "sandoval_female_english", "holden_male_english", "joel_lifelike_male_english", "ryanhoover_male_english", "marcus_male_english", "aubrey_outdoor_female_english", "fortress_finn_male_english", "sadie_female_english", "georgia_lifelike_broadcaster_female_english", "pam_female_english", "intense_isaac_serious_male_english", "ellie_faye_soothing_female_english", "aria_james_female_english", "emory_female_english", "blunt_ben_male_english", "gritty_george_broadcaster_male_english", "silas_lifelike_male_english_5c8379", "pamela_female_english", "raya_female_english", "travis_male_english", "elegant_evan_male_english", "holly_female_english", "barnaby_thorne_excited_male_english", "oliver_hart_excited_male_english", "lila_whisper_female_english", "mr_thunder_male_english", "rita_female_english", "brooklyn_female_english_5eb15f", "emma_female_english", "gravelly_gwen_female_english", "imani_female_english", "claire_lawson_broadcaster_female_english", "morgan_female_english_5f8bdd", "ellie_faye_female_english", "obamcharm_voice_2_unknown_english", "mistica_misteriosa_3_voice_1_female_english", "shawn_ia_male_english", "elenora_professional_female_english", "bouncy_bailey_female_english", "david_boles_informative_male_english", "armando_male_english", "allen_male_english", "crisanto_male_english", "grace_elder_female_english", "helen_female_english", "canyon_rivers_male_english", "derya_lifelike_excited_female_english", "mellow_marcus_male_english", "jack_sterling_broadcaster_male_english", "brenda_ugc_1_mp4_female_english", "reid_male_english", "reagan_female_english", "anchorman_tony_male_english", "jane_female_english_c83c9f", "damian_male_english", "tahlia_brooks_female_english", "hazel_female_english", "bennett_male_english", "gabrielle_female_english", "catherine_soothing_female_english", "sergio_male_english", "zain_female_english_cac50a", "wayne_ia_male_english", "instructive_isabelle_female_english", "ruben_male_english", "jett_male_english", "leszek_male_english", "julian_male_english", "9_voice_1_unknown_english", "joanne_female_english", "freya_female_english", "hope_informative_female_english", "elora_female_english", "jinwoo_male_english", "emre_male_english", "zuri_female_english", "yogi_scott_soothing_male_english", "harmony_harper_female_english", "aparna_voice_1_female_english", "albert_keinstein_voice_3_male_english", "boda_voice_1_male_english", "akhil_voice_1_male_english", "annie_pvc_versatile_female_english", "silas_lifelike_male_english_d03bf9", "alexis_female_english", "giulia_female_english", "polished_piper_female_english", "fola_female_english", "epic_eli_friendly_male_english", "casual_chris_male_english", "obi_male_english", "evan_male_english", "darrell_male_english", "susannah_female_english", "ellie_faye_friendly_female_english", "nelly_female_english", "serene_simon_excited_male_english", "plain_joe_male_english", "jasmine_female_english", "hugo_male_english", "silvia_voice_1_female_english", "andrew_male_english_d642ce", "jovial_jack_male_english", "captivating_clark_male_english", "darlene_female_english", "esposito_female_english", "connie_professional_female_english", "percy_b_shelley_voice_1_male_english", "dynamic_derek_male_english_d84493", "calistina_female_english", "ernest_male_english", "thanos_friendly_male_english", "kaleb_male_english", "thaddeus_ia_male_english", "betty_female_english_da3cad", "elder_brooks_male_english", "orson_male_english", "ed_engineer_voice_1_male_english", "lively_liam_male_english", "lucy_female_english", "jason_male_english_db7868", "derya_lifelike_friendly_female_english", "victor_male_english", "varrick_male_english", "ella_hastings_female_english", "instructor_ishaan_male_english", "lush_leonard_friendly_male_english", "colton_male_english", "kennedy_female_english", "ameila_female_english", "minho_male_english", "wyatt_male_english", "sven_male_english", "lian_male_english", "corsaro_female_english", "clint_male_english", "eva_voice_1_unknown_english", "sally_sourcing_voice_1_female_english", "custom_voice_voice_1_female_english", "ai_voice_1_male_english", "annelise_female_english", "yola_professional_female_english", "leos_lifelike_male_english", "ruth_female_english", "emanuel_male_english", "mr_evil_male_english", "charming_charlie_excited_male_english", "brayden_male_english", "wizie_girl_voice_1_female_english", "mentis_voice_1_male_english", "sal_supplier_voice_1_male_english", "fausetonic_voice_1_female_english", "santa_voice_1_unknown_english", "yash_voice_1_unknown_english", "voice_1_female_english_gllmNj", "tennyson_voice_1_male_english", "anand_voice_1_male_english", "argos_voz_male_english", "haemin_voice_1_unknown_english", "tech_podcast_aesthetic_voice_1_male_english", "test_1_voice_1_female_english", "michelle_voice_1_female_english_h2DYdw", "tim_voice_1_unknown_english", "jolie_voice_2_female_english", "pete_voice_2_male_english", "urea_voice_1_female_english", "kalamah_voice_1_female_english", "zanele_voice_1_male_english", "technical_townhall_host_voice_1_female_english", "david_carter_voice_1_male_english", "grumpy_gravel_68_male_english", "sarah_voice_1_unknown_english", "voice_1_unknown_english_isOAZh", "john_voice_1_male_english", "sofia_voice_1_female_english", "imaan_voice_1_female_english", "monemacer_voice_1_unknown_english", "doctor_voice_1_unknown_english", "line_voice_1_female_english", "gato_voice_1_male_english", "voice_1_female_english_JSoUd4", "jonn_voice_1_male_english", "my_avatar_voice_1_male_english", "sunmi_voice_1_female_english", "fiona_voice_1_female_english", "aiko_female_english", "marc_voice_1_unknown_english", "zain_voice_1_male_english_KTFmHV", "araj_voice_1_male_english", "enge_voice_1_unknown_english", "young_lady_voice_1_female_english", "voice_1_unknown_english_Lh04Cq", "annie_voice_3_female_english", "jeyla_voice_1_female_english", "shivani_voice_3_female_english", "raman_voice_1_male_english", "ellie_operation_voice_1_female_english", "daniel_voice_3_unknown_english", "aakash_voice_1_female_english", "danny_voice_1_male_english", "shirley_voice_1_female_english", "mona_voice_1_unknown_english", "rae_voice_1_unknown_english", "elena_rossi_voice_1_female_english", "the_wilderness_trapper_voice_1_male_english", "sal_supplier_male_english", "lyra2_voice_1_female_english_nt01na", "linda_voice_1_female_english", "argos_voice_1_male_english", "sue_voice_1_female_english", "maryann_voice_1_female_english", "sara_voice_2_female_english", "juliet_bilikov_voice_1_female_english", "terra_voice_1_female_english", "custom_voice_voice_1_unknown_english_PiqKSP", "voice_3_female_english", "ripple_ron_voice_1_male_english", "bruce_voice_1_unknown_english", "karren_voice_1_female_english", "flava_voice_1_unknown_english", "anna_voice_1_female_english", "synergen_voice_1_female_english", "sehrina_voice_1_female_english", "bozhena_voice_1_unknown_english", "babbo_natale_voice_1_male_english", "alex_wild_voice_3_male_english", "mirror_selfie_voice_1_unknown_english", "podcaster_voice_1_male_english", "lexy_voice_1_unknown_english", "zanele_voice_1_female_english", "ed_engineer_male_english", "charles_voice_1_unknown_english", "kalamah_voice_2_female_english", "mark_voice_1_male_english", "nidhi_1_female_english", "urea_voice_1_unknown_english", "blake_voice_1_male_english", "e_voice_1_female_english", "boda_voice_2_male_english", "melchor_voice_1_unknown_english_SzFSpl", "flava_voice_3_male_english", "thommy_voice_1_male_english", "nayyara_voice_1_unknown_english", "clu_voice_1_male_english_theSuq", "news_voice_1_male_english", "voice_1_female_english_U9FnQt", "denis_voice_3_male_english", "nima_juli_female_english", "matias_voice_1_male_english", "sophie_female_english", "gonalo_voice_1_unknown_english", "clu_voice_1_male_english_vElehP", "recidivista_unknown_english", "imelda_voice_1_unknown_english", "la_cubana_voice_1_female_english", "bruno_voice_1_male_english", "elias_voice_1_male_english", "remona_voice_1_unknown_english", "carlos_voice_1_male_english", "3_voice_1_female_english", "sara_voice_1_female_english", "mc_lp_phc_voice_1_unknown_english", "bill_voice_1_unknown_english", "storyteller_voice_1_female_english", "danil_voice_1_male_english", "shivani_voice_1_unknown_english", "demo_voice_1_female_english", "ossus_avatar_voice_1_unknown_english", "manuela_2_voice_1_female_english", "teacher_voice_1_unknown_english", "lyra2_voice_1_female_english_y0iMe4", "lisa_female_english", "dialagent_voice_1_unknown_english", "diego_voice_1_female_english", "sdsad_voice_1_female_english", "coleridge_voice_1_male_english", "xdynomoney_voice_1_male_english", "soft_glam_look_voice_1_unknown_english", "mimi_voice_1_female_english", "lisa_voice_1_female_english", "mirror_voice_1_male_english", "zain_female_english_004773", "aria_female_english", "caryns_female_english", "klara_female_english", "shaun_male_english", "senthil_male_english", "cody_male_english_01f98e", "saffron_female_english", "blanka_lifelike_female_english", "rami_male_english", "rhodes_female_english", "michelle_voice_1_female_english_02X8sH", "autumn_ugc_3_female_english", "reassuring_rupert_male_english", "rose_ugc_2_mp4_female_english", "derya_lifelike_broadcaster_female_english", "dynamic_derek_male_english_0516c2", "augustus_male_english", "thanos_broadcaster_male_english_054af4", "marcia_female_english", "camden_male_english", "rumi_female_english", "william_prescott_broadcaster_male_english", "sammy_female_english", "ben_male_english", "smooth_dev_male_english", "peppy_stella_female_english", "silas_male_english", "aditya_male_english", "christy_female_english", "elio_male_english", "ida_lifelike_female_english", "jeff_male_english", "tahlia_brooks_excited_female_english", "ben_hart_male_english", "skylar_female_english", "relaxed_reece_male_english", "daniel_male_english", "melani_female_english", "clover_female_english", "alex_wright_informative_male_english", "confident_connor_excited_male_english", "paisley_female_english", "palma_female_english", "leigh_female_english", "radiant_riley_friendly_female_english", "marcus_professional_male_english", "charming_charles_male_english", "nichalia_schwartz_informative_female_english", "georgia_lifelike_soothing_female_english", "axel_voice_1_unknown_english", "lucy_voice_1_unknown_english", "zain_voice_1_male_english_0mQ33G", "toto_voice_3_female_english", "kristy_female_english", "gerardo_lifelike_male_english", "delicate_daisy_female_english", "ross_ugc_3_mp4_male_english", "iker_male_english", "atlas_male_english", "canyon_rivers_broadcaster_male_english", "reginald_hawke_male_english", "fresh_finn_male_english", "grandpa_joe_male_english", "leonard_male_english", "mellow_michael_male_english", "william_prescott_excited_male_english", "jane_female_english_142e37", "menon_male_english", "lily_female_english_149796", "travis_friendly_male_english", "april_female_english", "serene_simon_male_english", "tiffany_friendly_female_english", "brianna_female_english", "knox_male_english", "an_ugc_1_female_english", "dustin_male_english", "evelyn_harper_female_english", "laurel_female_english", "seema_professional_female_english", "morris_male_english", "jibran_male_english_16b83d", "clive_male_english", "soothing_sage_male_english", "noah_lewis_male_english", "autumn_ugc_4_female_english", "affable_aaron_male_english", "griffin_male_english", "calm_eva_female_english", "solveig_female_english", "sawyer_male_english", "dynamic_dylan_male_english", "norman_male_english", "alexander_male_english", "warrior_rohan_broadcaster_male_english", "norman_serious_male_english", "samantha_female_english", "mature_morgan_excited_male_english", "voice_1_female_english_1az9h5", "rose_ugc_3_mp4_female_english", "relaxed_reece_broadcaster_male_english", "veronica_female_english", "warm_william_male_english", "ariana_female_english", "adventure_alex_excited_female_english", "lush_leonard_excited_male_english", "ethan_male_english", "jude_male_english", "claire_lawson_friendly_female_english", "annie_lifelike_female_english", "joy_female_english_3314e5", "madelyn_female_english", "krista_female_english", "rowain_male_english", "idris_male_english", "kristen_female_english", "obamcharm_voice_1_male_english", "alyssa_female_english", "catherine_friendly_female_english", "gentleman_george_male_english", "theatrical_thomas_male_english", "norman_friendly_male_english", "gentle_gemma_excited_female_english", "zosia_female_english", "sophie_blake_friendly_female_english", "brandon_public_male_english", "energetic_edmund_male_english", "aurora_female_english", "aubrey_lifelike_female_english", "wendy_female_english", "solemn_scott_male_english", "legendary_lawrence_male_english", "eric_male_english", "lily_female_english_39f19a", "ricky_male_english_3a270e", "adventure_alex_friendly_female_english", "fresh_faith_excited_female_english", "chukwu_female_english", "sullivan_male_english", "esmond_male_english", "narrative_nora_serious_female_english", "geoff_male_english", "harmonious_hannah_female_english", "expressive_evan_male_english_3c2a9d", "raspy_rupert_male_english", "melina_female_english", "devlin_male_english", "sophie_vale_serious_female_english", "jennifer_ugc_3_mp4_female_english", "luciana_female_english", "monica_female_english", "echoing_eric_male_english", "adventure_alex_female_english", "annie_excited_female_english", "lush_leonard_broadcaster_male_english", "james_hawthorne_male_english", "kumar_male_english", "callahan_male_english", "quiet_quinn_male_english", "roland_male_english", "betty_female_english_3f7ca7", "nico_male_english", "prueba_voice_1_unknown_english", "voice_3_male_english", "zoe_female_english", "malik_male_english", "caroline_public_female_english", "george_ugc_male_english", "obi_broadcaster_male_english", "norman_broadcaster_male_english", "logan_hayes_male_english", "sarita_female_english", "husky_harold_male_english_42edca", "antea_female_english", "emmett_male_english", "oxana_female_english", "leah_female_english", "david_male_english", "mabel_forsythe_serious_female_english", "amit_male_english", "amina_ia_female_english", "okafor_male_english", "luca_male_english_48a24f", "rachel_female_english", "elder_ambrose_male_english", "harper_female_english", "nick_male_english", "justo_professional_male_english", "jolie_voice_1_unknown_english", "vinan_female_english", "empathetic_eli_male_english", "plain_joe_broadcaster_male_english", "lauren_female_english", "silvia_female_english_7df8d9", "dj_troy_male_english", "daniel_hayes_male_english", "stella_zhu_female_english", "judy_professional_female_english_7ffb69", "mr_cristmas_voice_1_unknown_english", "dilai_voice_1_female_english_7UIMGg", "mimimi_voice_1_female_english", "maximilian_male_english", "stephanie_female_english_80b0df", "deep_douglas_male_english", "ann_female_english", "ezran_male_english", "shawn_male_english", "daphne_female_english_812d4e", "claire_lawson_female_english", "affable_alice_female_english", "tahlia_female_english", "jennifer_ugc_1_mp4_female_english", "anxious_allen_male_english", "jack_sterling_friendly_male_english", "zayne_male_english", "nina_female_english", "oliver_hart_male_english", "lea_in_car_friendly_female_english", "santa_public_male_english", "reliable_tom_male_english", "georgia_lifelike_serious_female_english", "august_professional_male_english", "diora_female_english", "lesly_female_english", "gala_excited_female_english", "elisabetta_female_english", "barb_female_english", "finlay_male_english", "fleur_female_english", "chester_male_english", "alexa_female_english", "freja_female_english", "nicholas_male_english_89732a", "pierce_male_english", "cecil_male_english", "soothed_samuel_male_english", "gritty_griffin_male_english", "gabriela_female_english_8b1fe3", "riley_lifelike_male_english", "carolyn_female_english", "sage_spencer_male_english", "betania_female_english_8bfb4e", "henry_male_english", "gary_male_english", "jack_sterling_serious_male_english", "bright_beatrice_female_english", "an_ugc_4_female_english", "shane_male_english", "naya_female_english", "daran_outside_sitting_2_excited_male_english", "storyteller_ollie_male_english", "madeline_female_english", "javier_male_english", "professor_dean_serious_male_english", "radiant_riley_female_english_8f0350", "jocelyn_female_english", "grand_richard_male_english", "brooks_male_english", "tough_timothy_male_english", "sally_sourcing_female_english", "v_voice_1_female_english", "little_annie_female_english", "swift_sam_male_english", "lively_liam_friendly_male_english", "deep_douglas_serious_male_english", "william_axel_male_english", "lia_female_english", "sophie_blake_female_english", "adele_female_english", "feisty_fiona_female_english", "kenny_male_english", "playful_paige_female_english", "jack_sullivan_male_english", "chill_chase_excited_male_english", "ross_ugc_2_mp4_male_english", "marek_male_english", "araj_male_english", "elder_brooks_friendly_male_english", "noble_nicholas_male_english", "hope_female_english_94e5f7", "savannah_female_english", "optimist_ollie_male_english", "celestine_female_english", "zaire_male_english", "narrative_nolan_male_english", "eliza_1_female_english", "becca_5_female_english", "daran_inside_sitting_male_english", "juliet_4_female_english", "tonya_4_female_english", "janelle_5_female_english", "kira_3_female_english", "amber_4_female_english", "clara_5_female_english", "lea_in_car_2_female_english", "stella_5_female_english", "lucas_inside_standing_male_english", "dora_3_female_english", "janelle_1_female_english", "lucas_inside_black_hoodie_male_english", "lila_4_female_english", "eliza_5_female_english", "daran_outside_sitting_2_male_english", "dora_5_female_english", "lea_on_balcony_female_english", "kira_2_female_english", "kelsey_5_female_english", "kim_inside_sitting_female_english", "kelsey_2_female_english", "juliet_3_female_english", "amber_1_female_english", "stella_2_female_english_f541fb", "avery_4_female_english", "juliet_5_female_english", "ariella_5_female_english", "kelsey_4_female_english", "amber_5_female_english", "ariella_3_female_english", "jacob_2_male_english", "kira_4_female_english", "juliet_2_female_english", "tim_outside_sitting_male_english", "juliet_1_female_english", "tim_at_cafe_male_english", "kelsey_3_female_english", "gail_outside_walking_female_english", "kelsey_1_female_english", "jacob_4_male_english", "dora_2_female_english", "jacob_5_male_english", "nash_4_male_english", "dora_1_female_english", "daran_outside_walking_male_english", "belinda_3_female_english", "lukas_in_car_male_english", "lea_inside_sitting_female_english", "lea_outside_walking_female_english", "daran_outside_sitting_male_english", "gail_inside_standing_female_english", "avery_5_female_english", "belinda_2_female_english", "jacob_1_male_english", "lea_inside_beige_top_female_english", "kim_gym_walking_female_english", "eliza_3_female_english", "ariella_2_female_english", "becca_2_female_english", "janelle_2_female_english", "tim_in_car_male_english", "stella_4_female_english", "becca_4_female_english", "eliza_2_female_english", "jacob_3_male_english", "lea_inside_female_english", "tim_laying_inside_male_english", "tonya_5_female_english", "tonya_2_female_english", "belinda_4_female_english", "becca_3_female_english", "janelle_4_female_english", "avery_1_female_english", "tim_outside_at_cafe_male_english", "lila_3_female_english", "eliza_4_female_english", "becca_1_female_english", "nash_2_male_english", "janelle_3_female_english", "clara_1_female_english", "lucas_outside_at_cafe_male_english", "daran_inside_booth_male_english", "lila_1_female_english", "avery_2_female_english", "belinda_1_female_english", "jackson_narration_angry_male_english", "scarlett_professional_female_english", "jackson_narration_male_english", "alexander_narration_male_english", "glenn_natural_male_english", "lester_natural_male_english", "levi_friendly_male_english", "claire_cheerful_female_english", "charlotte_narration_female_english", "dylan_cheerful_male_english", "caleb_cheerful_male_english", "warren_narration_male_english", "samuel_narration_male_english", "douglas_professional_male_english", "mason_natural_male_english", "hailey_calm_female_english", "kenneth_natural_male_english", "jeffery_natural_male_english", "audrey_cheerful_female_english", "troy_natural_male_english", "harry_narration_male_english", "arnold_cheerful_male_english", "ethan_professional_male_english", "julian_narration_male_english", "sophia_narration_friendly_female_english", "adam_natural_male_english", "grace_natural_female_english", "paul_natural_male_english", "benjamin_professional_male_english", "alison_cheerful_female_english", "bruce_natural_male_english", "dean_natural_male_english", "roy_natural_male_english", "dennis_cheerful_male_english", "keith_cheerful_male_english", "noah_bennett_male_english", "noble_nigel_male_english_337466", "chloe_rivers_female_english", "carter_lee_male_english", "grace_parker_female_english", "assertive_adam_friendly_male_english", "ethan_cole_male_english", "assertive_adam_serious_male_english", "timid_tommy_male_english", "bubbly_bella_female_english", "bold_ben_male_english", "millennial_molly_female_english", "zane_the_zany_friendly_male_english", "whispering_will_soothing_male_english", "sage_sawyer_friendly_male_english", "vivacious_veronica_excited_female_english", "daisy_female_english", "evangeline_wilder_female_english", "relaxed_rachel_female_english", "hushed_heather_female_english", "zippy_zoe_female_english", "bright_bella_female_english", "brooklyn_excited_female_english", "maverick_stone_male_english", "sarah_stone_female_english", "calm_caleb_male_english", "pixie_piper_excited_female_english", "catalina_professional_female_english", "assertive_anna_female_english", "claire_female_english_768069", "pleasant_pete_friendly_male_english", "breezy_beatrice_excited_female_english", "miss_loreta_female_english", "zippy_zoe_excited_female_english", "valley_girl_vicky_female_english", "formal_fiona_excited_female_english", "whispering_will_male_english", "vivacious_veronica_female_english", "nervous_nick_male_english", "classic_christopher_male_english", "spirited_sophie_serious_female_english", "kiara_female_english", "breezy_beatrice_serious_female_english", "evangeline_wilder_excited_female_english", "kai_chen_male_english", "lively_lily_female_english", "pixie_piper_female_english", "spirited_suraj_male_english", "jason_broadcaster_male_english", "millennial_molly_excited_female_english", "lively_liam_excited_male_english", "formal_fiona_female_english", "gentle_george_male_english", "trendy_tyrone_male_english", "earnest_edward_male_english", "pixie_piper_friendly_female_english", "energetic_ella_broadcaster_female_english", "robo_rex_male_english", "alistair_blackwood_male_english", "barrister_bennett_male_english", "meadow_lark_female_english", "zane_brooks_male_english", "luminous_lara_female_english", "relaxed_rachel_excited_female_english", "bright_bella_excited_female_english", "breezy_beatrice_female_english", "claire_excited_female_english", "energetic_elijah_male_english", "gentle_gemma_female_english_7f0f09", "smiley_stacy_female_english", "rugged_rob_male_english", "energetic_ella_female_english", "gerald_male_english", "zane_the_zany_broadcaster_male_english", "spirited_sophie_excited_female_english", "pleasant_pete_male_english", "spirited_sophie_friendly_female_english", "stately_simon_male_english", "spirited_sophie_female_english", "zane_the_zany_male_english", "sage_silas_male_english", "jason_male_english_cc24de", "alfie_male_english", "evangeline_wilder_friendly_female_english", "zane_the_zany_excited_male_english", "jason_friendly_male_english", "sage_sawyer_male_english", "brooklyn_female_english_d9546f", "ethan_brooks_male_english", "millennial_molly_friendly_female_english", "kira_1_female_english", "algieba_male_english", "laomedeia_female_english", "cerise_cheerful_female_english", "rudi_friendly_male_english", "keanan_natural_male_english", "jahmai_friendly_male_english", "wilder_natural_male_english", "tony_professional_male_english", "jenny_professional_female_english", "ryan_professional_male_english", "sara_cheerful_female_english", "christopher_calm_male_english", "bella_friendly_female_english", "eric_newscaster_male_english", "liam_professional_male_english", "sherry_friendly_female_english", "michelle_natural_female_english", "johan_friendly_male_english", "tracy_cheerful_male_english", "josie_cheerful_female_english", "delbert_cheerful_male_english", "ana_cheerful_female_english", "davis_professional_male_english", "isabella_cheerful_female_english", "sonia_warm_female_english", "luke_professional_male_english", "clara_professional_female_english", "wayne_natural_male_english", "natasha_professional_female_english", "leah_natural_female_english", "amber_friendly_female_english", "luna_natural_female_english", "neerja_newscaster_female_english", "emily_natural_female_english", "kuya_jerry_male_filipino", "violet_female_", "august_male_", "sbastien_male_french", "satoshi_male_japanese", "dynamic_derya_female_turkish", "y_voice_3_female_unknown", "galle_female_french", "pedro_lima_male_portuguese", "sara_martin_female_spanish", "etienne_lefebvre_male_french", "mc_anh_c_male_vietnamese", "savvy_stefano_male_italian", "string_voice_3_male_unknown", "tech_podcast_aesthetic_voice_3_unknown_unknown", "darnell_male_", "seb_male_indonesian", "ana_carvalho_friendly_female_portuguese", "camila_vega_female_spanish", "screaming_george_male_german", "sofia_brazil_excited_female_portuguese", "tran_kim_hung_male_vietnamese", "brent_male_", "barb_female_", "harper_female_", "muskaan_female_hindi_6dffed", "jean_petit_male_french", "ashley_female_", "sana_female_arabic", "lively_laura_female_spanish", "antonio_male_spanish", "larisa_actrisa_female_russian", "conrad_male_", "jokesh_male_", "yaroslava_female_ukrainian", "marcel_male_french_722e1d", "lise_laurent_female_french", "curious_diego_friendly_male_spanish", "serene_marco_male_italian", "martin_li_male_chinese", "marie_female_french", "enrique_m_nieto_male_spanish", "lex_male_", "audrey_female_french_7459d7", "diego_martinez_male_spanish", "david_voice_3_unknown_unknown", "amit_gupta_male_italian", "murmuring_matteo_male_italian", "amina_voice_2_unknown_unknown", "thomas_male_unknown", "vibrant_victor_friendly_male_spanish", "steady_surya_male_indonesian", "thomas_hansen_male_danish", "shelley_female_japanese", "giovanni_rossi_male_italian_7b6722", "poised_pilar_female_spanish", "ranga_male_hindi_7cc104", "khanhlq_male_vietnamese", "lucrezia_voice_2_female_unknown", "jase_male_", "voice_2_male_unknown", "mo_male_arabic", "steadfast_stefan_excited_male_german", "dudu_female_", "karl_weber_male_german", "tho_lan_male_french", "luca_brasi_male_japanese", "uploaded_avatar_voice_2_male_unknown", "vit_dng_male_vietnamese", "borges_male_portuguese", "david_voice_2_unknown_unknown", "alexander_kensington_male_portuguese", "quiet_dieter_serious_male_german", "daran_male_", "jaxon_male_unknown", "mellow_manuel_male_spanish", "dexter_male_", "aubrey_female_", "demi_female_unknown", "arjun_male_hindi", "radiant_rio_male_indonesian", "tiago_male_portuguese", "nolan_male_unknown", "arabella_female_portuguese", "amina_voice_1_unknown_unknown", "rami_idris_male_arabic", "rick_male_hindi", "amelia_female_", "marcus_male__a17f4c", "martin_dupont_aimable_male_french", "nichalia_schwartz_female_japanese", "luca_sabia_friendly_female_spanish", "marco_male_en", "rafael_cruz_excited_male_spanish", "gentle_gita_female_hindi", "jeevan_male_portuguese", "scarlett_female_", "haseeb_male_french", "ate_lyn_female_filipino", "carmelo_la_rosa_male_hindi", "shakuntala_female_hindi", "nadia_female_russian", "izzy_female_", "gentle_greta_soothing_female_german", "gravitas_giovanni_excited_male_italian", "david_voice_1_unknown_unknown", "manav_male_hindi", "serene_sofia_female_portuguese", "abrar_sabbah_female_arabic", "tahlia_female_", "wolf_spencer_male_german", "saanu_female_hindi_ae132a", "milena_female_bulgarian", "hushed_hiba_female_arabic", "camilla_female_unknown", "mario_male_spanish", "pleasant_petra_excited_female_german", "fajar_hadi_male_indonesian", "dash_voice_1_male_unknown", "dng_hong_male_vietnamese", "camila_vega_excited_female_spanish", "bintang_male_indonesian", "diran_male_", "ishibashi_male_japanese_ea9245", "devi_female_hindi", "hinata_male_japanese", "kanika_female_hindi_ebb41c", "lea_brandt_female_german", "jhenny_female_spanish", "mauricio_male_spanish", "gentle_greta_friendly_female_german", "serena_narrador_female_spanish", "david_studio_male_hungarian", "jodie_female_", "violetta_female_italian_f004a8", "riya_rao_female_hindi_f09ffc", "jacob_male_unknown", "lucrezia_voice_1_female_unknown", "sanna_hartfield_female_swedish_f28d58", "antoine_male_french", "tijs_male_dutch", "azzla_male_vietnamese", "milena_female_", "nguyn_luci_male_vietnamese", "monika_sogam_female_hindi", "gentle_greta_female_german", "nicolas_p_male_french", "eric_sijbesma_male_dutch_f72854", "jann_male_dutch_f89d03", "will_male_portuguese", "maarten_de_vries_male_dutch", "lizy_female_spanish", "zephlyn_male_japanese", "guillaume_male_french", "kenzo_male_japanese", "lucas_male_dutch", "lena_von_berlin_female_german", "aaditya_k_male_hindi", "fernando_martinez_male_portuguese", "huyen_female_vietnamese", "calm_cinta_female_indonesian", "humanis_voice_2_female_unknown", "ranga_male_hindi_1b4b76", "amy_female_chinese", "aahana_verma_female_hindi", "aneta_female_polish", "young_olivier_male_french", "news_host_voice_2_female_unknown", "cavit_pancar_male_turkish", "manu_male_hindi_1dd92b", "aravinda_c_male_italian", "ranbir_m_male_hindi_1e028a", "vivian_voice_2_female_unknown", "camila_vega_friendly_female_spanish", "mellow_mara_female_spanish", "quiet_dewa_male_indonesian", "leon_stern_male_german_1fead5", "voice_3_male_unknown", "joanne_van_zwolgen_male_dutch", "nicolas_male_french_20ddf9", "lena_suzuki_female_polish", "greta_stein_female_german", "voce_minatore_audiolibro_male_italian", "amelia_female_spanish", "liberty_x_female_german", "mile_noir_male_french", "maria_female_polish", "doga_male_german", "theos_male_greek", "eric_sijbesma_male_dutch_263c00", "string_voice_1_male_unknown", "cornelius_male_spanish", "minh_quang_male_vietnamese", "aida_female_portuguese", "mateo_plcido_male_spanish", "artur_male_", "saanu_female_hindi_28f6d8", "marcel_male_french_297206", "solemn_sachin_male_hindi", "thomas_male_french", "rafael_cruz_male_spanish", "dr_clark_male_", "mila_female_german", "curious_diego_excited_male_spanish", "jann_male_dutch_2c708d", "lena_von_berlin_excited_female_german", "vietnam_dangtungduy_male_vietnamese", "vivian_voice_3_female_unknown", "enrique_mondragn_male_spanish", "tienne_moreau_friendly_male_french", "casual_fernando_male_spanish", "olivia_female_", "ray_male_en", "melanie_female_dutch", "ana_carvalho_excited_female_portuguese", "carlos_claro_male_spanish", "pedro_lima_friendly_male_portuguese", "guillaume_male_italian", "lively_laura_excited_female_spanish", "danny_male_spanish", "narrator_mateo_friendly_male_spanish", "seor_fernando_excited_male_spanish", "johnny_kid_male_italian", "ben_male_german", "dmitry_male_german", "eager_eko_male_indonesian", "ishibashi_male_japanese_b3367f", "mc_ni_ting_male_vietnamese", "haytham_male_arabic", "jessica_anne_bogart_female_german", "tienne_moreau_excited_male_french", "saira_female_hindi", "kanika_female_hindi_b80cfd", "lina_female_", "attila_male_hungarian", "matteo_male_", "putra_male_indonesian", "oleg_male_russian", "anas_male_arabic", "marianne_v3_voice_2_female_unknown", "grim_gkhan_male_turkey", "tienne_moreau_male_french", "christian_avils_male_spanish", "antonio_farina_male_german", "tranquil_tessa_female_spanish", "decisive_dylan_male_german", "marco_santini_male_italian", "bahar_female_", "chris_basetta_male_italian_bcba53", "lea_female_german", "violetta_female_italian_bf0470", "bradley_male_italian", "juliana_voice_1_female_es", "diego_martinez_excited_male_spanish", "martin_dupont_male_french", "vijay_male_portuguese", "gentle_gabriel_male_spanish", "christoffer_weiss_male_finnish", "crisp_kumar_male_hindi", "adam_male_german", "curious_diego_male_spanish", "linda_fiore_female_italian_c3b0f4", "andrei_male_russian", "humanis_voice_3_female_unknown", "sully_male_japanese", "marcotrox_male_german", "luca_brasi_gentile_male_italian", "daniela_female_spanish", "lana_female_", "aida_female_italian", "young_yumna_female_hindi", "martin_osborne_male_japanese", "chloe_female_french", "luki_zajo_male_slovak", "voice_1_male_unknown", "patrick_male_portuguese", "archer_male_italian", "maisha_female_", "petra_vlaams_female_dutch", "muskaan_female_hindi_4df129", "masha_female_", "nguyn_ngn_female_vietnamese", "henry_male_", "dash_voice_2_male_unknown", "byron_male_", "hansc_male_dutch_50f5d0", "huyentrang_female_vietnamese", "david_male_hungarian", "andrea_loco_male_portuguese", "ruhaan_male_hindi", "carlos_male_", "mathias_male_portuguese", "navya_voice_3_female_unknown", "james_gao_male_chinese", "mia_female_", "vira_female_ukrainian", "araj_male_", "archie_male_japanese", "violante_female_", "tech_podcast_aesthetic_voice_1_unknown_unknown", "sinnbad_male_hindi", "ly_hai_male_vietnamese", "vihan_a_male_hindi", "camille_martin_female_french", "dynamic_dev_male_hindi", "manoel_dias_cotafcil_male_portuguese", "phil_male_german", "leila_voice_3_female_unknown", "vibrant_viktor_male_german", "norman_male_", "serge_de_beer_male_dutch_5c2254", "seor_fernando_male_spanish", "tom_male_", "audrey_female_french_5d078a", "leonie_female_german_5d2520", "david_martin_male_spanish_5d2964", "riya_rao_female_hindi_5d2fe6", "beth_female_unknown", "efrayn_male_spanish_5eb6da", "hale_male_italian", "dmitry_male_russian", "lively_laura_friendly_female_spanish", "tomasz_friendly_male_polish", "matt_male_", "rumi_female_", "tranquil_tulin_female_turkish", "hakeem_hassan_male_arabic", "anika_mehra_female_hindi", "raju_male_hindi", "narrator_mateo_male_spanish", "tim_male_unknown", "adriano_male_portuguese", "gravitas_giovanni_male_italian", "carmelo_la_rosa_male_italian", "bold_kasia_female_polish", "danish_khan_male_japanese", "mathias_male_danish", "agustin_male_spanish", "trung_caha_male_vietnamese", "marcotrox_male_italian", "hushed_hiba_friendly_female_arabic", "morgan_female_", "thunderblade_male_french", "vivian_voice_1_female_unknown", "anika_female_hindi", "vivaan_mehta_female_hindi", "david_male_", "zane_hype_male_spanish", "felix_male_german", "adele_female_", "francis_male_", "viraj_male_hindi", "arjuna_male_indonesian", "jase_male_unknown", "niraj_male_hindi_d86b65", "bruce_male_", "bastiaan_male_dutch", "scholarly_sergio_male_spanish", "otto_male_german_da4db4", "string_voice_2_male_unknown", "efrayn_male_spanish_db19b5", "jin_female_", "lucrezia_voice_3_female_unknown", "mc_the_hao_male_vietnamese", "ranbir_m_male_hindi_de3de3", "gentle_greta_excited_female_german", "humanis_voice_1_female_unknown", "karo_yang_male_chinese", "lehka_modulated_female_hindi", "morioki_female_japanese", "christian_brison_male_dutch", "doga_male_turkish", "hushed_horatiu_male_romanian", "bob_voice_1_unknown_chinese", "bram_meijer_male_dutch", "mc_khnh_ly_female_vietnamese", "luk_balcer_male_dutch", "mathieu_male_french", "david_martin_male_spanish_e14c56", "linda_fiore_female_italian_ff6084", "gala_female_", "amy_voice_1_female_en", "tai_voice_1_male_thai", "toolseeker_voice_1_unknown_unknown", "lobna_voice_1_unknown_arabic", "mia_starset_female_norwegian", "william_shanks_male_spanish", "jora_slobod_male_romanian", "narrator_mateo_excited_male_spanish", "son_tran_male_vietnamese", "bold_kasia_excited_female_polish", "marc_aurle_male_french", "tuba_female_", "ghizlane_female_arabic", "bradford_male_portuguese", "charles_pestel_male_french", "moncellence_male_arabic", "w_clint_oxley_male_german", "peter_male_dutch", "ava_female_german", "lax_male_portuguese", "breezy_bagus_male_indonesian", "eric_sijbesma_male_dutch_0842b1", "kuya_chris_cruz_male_filipino", "leon_stern_male_german_0932ba", "otto_male_german_0971fe", "leonardo_male_", "luminous_laksh_male_hindi", "riya_mehta_female_hindi", "tiya_maria_makuwento_female_filipino", "aaron_male_italian", "pedro_lima_serious_male_portuguese", "ana_carvalho_female_portuguese", "hushed_hiba_excited_female_arabic", "steadfast_stefan_male_german", "sofia_brazil_friendly_female_portuguese", "jhenny_antiques_female_spanish", "chris_basetta_male_italian_101a52", "navya_voice_2_female_unknown", "nichalia_schwartz_female_german", "vibrant_victor_male_spanish", "deep_dieter_male_german", "nicolas_petit_male_french", "louis_boutin_male_french", "dash_voice_3_male_unknown", "pawel_male_polish", "news_host_voice_3_female_unknown", "mark_male_spanish", "leonie_female_german_148b50", "yuri_male_portuguese", "gnther_goodnight_male_german", "madeline_female_", "andi_male_indonesian", "reserved_rainer_male_german", "dodong_macoy_male_filipino", "leila_voice_2_female_unknown", "juan_carlos_male_spanish_17852e", "nicolas_male_french_179359", "mamicha_female_french", "judith_female_", "sanna_hartfield_female_swedish_1a4256", "liam_voice_1_unknown_unknown", "diana_female_", "hansc_male_dutch_3060fb", "roy_male_dutch", "anika_female_italian", "storyteller_satya_male_hindi", "bollywood_priyanka_female_hindi", "caroline_female_", "adam_male_czech", "bold_kasia_friendly_female_polish", "floyd_male_", "hanka_female_czech", "mahaputra_male_indonesian", "niraj_male_hindi_361c2d", "tomasz_male_polish", "loulou_female_french", "piper_female_", "cabalen_jeffrey_male_filipino", "anya_female_russian", "sofa_female_", "shaun_male_", "uno_voice_2_male_unknown", "heinrich_bass_serious_male_german", "hope_female_spanish", "carlos_claro_broadcaster_male_spanish", "luca_sabia_female_spanish", "mike_male_en", "calm_carlos_male_portuguese", "phillip_male_", "minhtrung_male_vietnamese", "susi_female_german", "beata_female_japanese", "social_santiago_male_spanish", "sam_female_", "serena_narrador_excited_female_spanish", "fernando_sanz_male_spanish", "laya_female_unknown", "carla_female_portuguese", "carmen_velzquez_female_spanish", "calm_siddharth_male_hindi", "naveen_male_hindi", "kristy_female_", "giovanni_rossi_male_italian_436da9", "oliver_male_czech", "seor_fernando_friendly_male_spanish", "quiet_dieter_male_german", "sunny_sofia_female_spanish", "steadfast_stefan_friendly_male_german", "hamid_male_arabic", "kamal_male_german", "magyar_frfi_male_hungarian", "harper_female_french", "mark_male_portuguese", "peter_male_slovak", "alex_nekrasov_male_ukrainian", "husky_hctor_male_spanish", "ivanna_female_italian", "bedtime_bjorn_male_german", "otto_mller_male_german", "navya_voice_1_female_unknown", "derya_female_", "kuya_pedro_meditasyon_male_filipino", "uploaded_avatar_voice_3_male_unknown", "martin_osborne_male_spanish_7d51b5", "beata_female_polish", "arcadias_male_russian", "luca_ortega_female_spanish", "christian_plasa_male_german", "nisha_kapoor_female_hindi", "leo_male_portuguese", "commanding_clemens_male_german", "ravi_female_hindi", "liam_voice_2_unknown_unknown", "emre_kadir_male_turkish", "eleni_female_greek", "manu_male_french", "ido_male_dutch", "tatiana_martin_female_spanish", "leila_voice_1_female_unknown", "danny_broadcaster_male_spanish", "martin_osborne_male_spanish_835561", "deniz_ylmaz_male_turkish", "sunny_sahil_male_hindi", "calm_cinta_excited_female_indonesian", "dominic_male_unknown", "russell_male_italian", "nirmala_female_hindi", "sara_martin_female_portuguese", "diego_martinez_broadcaster_male_spanish", "lena_fischer_female_german", "tech_podcast_aesthetic_voice_2_unknown_unknown", "pleasant_petra_female_german", "anton_male_ukrainian", "uno_voice_1_male_unknown", "cuong_male_vietnamese", "charming_ceyda_female_turkish", "liam_voice_3_unknown_unknown", "serge_de_beer_male_dutch_8ef998", "anjali_female_german", "juan_carlos_male_spanish_8f2c47", "koen_male_dutch", "pierre_narrateur_male_french", "uno_voice_3_male_unknown", "kyoko_female_japanese", "uploaded_avatar_voice_1_male_unknown", "kiko_hdz_male_spanish", "ben_male_", "huynhduong_male_vietnamese", "manu_male_hindi_93f070", "marcus_male__93f7f2", "news_host_voice_1_female_unknown", "ethan_male_", "sofia_brazil_female_portuguese", "santa_male_", "jhenny_female_japanese", "takumi_warm_male_japanese", "cristiano_friendly_male_portuguese", "ricardo_calm_male_portuguese", "aditi_calm_female_hindi", "camila_friendly_female_portuguese", "astrid_friendly_female_swedish", "arlet_natural_female_catalan", "ines_friendly_female_portuguese", "elin_warm_female_swedish", "mads_natural_male_danish", "naja_natural_female_danish", "aalia_natural_female_bangla", "jaidev_professional_male_hindi", "marcus_natural_male_swedish", "abhijit_natural_male_bangla", "aruna_natural_female_hindi", "fabian_male_german", "nathan_male_filipino", "luningnig_female_filipino", "bhavin_newscaster_male_hindi", "leon_male_german", "hemlata_natural_female_hindi", "lucia_friendly_female_spanish", "adriana_natural_female_portuguese", "paulo_natural_male_portuguese", "hugo_friendly_male_swedish", "tilda_natural_female_swedish", "roland_natural_male_swedish", "alicia_natural_female_swedish", "von_friendly_male_swedish", "norain_natural_male_malay", "adi_natural_male_indonesian", "razif_natural_male_malay", "miriam_natural_female_hebrew", "tomass_natural_male_latvian", "norazila_natural_female_malay", "ruth_calm_female_hebrew", "intan_natural_female_malay", "citra_warm_female_indonesian", "somsak_gently_female_thai", "nhung_gently_female_vietnamese", "sarah_natural_female_hebrew", "slamet_natural_male_indonesian", "aiman_natural_male_malay", "julia_warm_female_spanish", "claudia_natural_female_catalan", "storm_kindly_female_vietnamese", "mia_professional_female_spanish", "chau_natural_female_vietnamese", "murat_male_turkish", "amir_natural_male_malay", "mateo_warm_male_spanish", "avigail_calm_female_hebrew", "aharon_calm_male_hebrew", "isaac_natural_male_hebrew", "ratna_warm_female_indonesian", "isaiah_serious_male_hebrew", "mustafa_male_turkish", "fatma_female_turkish", "aryeh_natural_male_hebrew", "hugo_newscaster_male_spanish", "dung_excited_male_vietnamese", "sofia_calm_female_spanish", "maria_serious_female_spanish", "ernestine_natural_male_dutch", "ernie_friendly_male_dutch", "gerard_natural_male_dutch", "harriet_natural_female_dutch", "hanna_natural_female_dutch", "rita_natural_female_swedish", "onyx_male_multilingual", "coral_female_multilingual", "nova_female_multilingual", "alloy_male_", "echo_male_", "ash_male_", "shimmer_female_multilingual", "sage_female_", "xiaoxin_professional_female_chinese", "brenda_professional_female_portuguese", "fatima_professional_female_arabic", "amal_natural_female_arabic", "salma_friendly_female_arabic", "dario_natural_male_spanish", "honza_professional_male_czech", "leonas_natural_male_lithuanian", "keita_newscaster_male_japanese", "jamal_newscaster_male_arabic", "gagan_natural_male_kannada", "omar_calm_male_arabic", "saleh_professional_male_arabic", "amala_warm_female_german", "pradeep_newscaster_male_bangla", "himari_natural_female_japanese", "blessica_natural_female_filipino", "fahed_calm_male_arabic", "sana_professional_female_arabic", "ahmet_male_turkish", "gadis_natural_female_indonesian", "colette_newscaster_female_dutch", "athina_natural_female_greek", "agnieszka_professional_female_polish", "zariyah_professional_female_arabic", "marek_natural_male_polish", "amina_newscaster_female_arabic", "taim_natural_male_arabic", "avril_natural_male_hebrew", "angelo_natural_male_filipino", "estrella_natural_female_spanish", "sapna_natural_female_kannada", "dmitry_professional_male_russian", "ingrid_natural_female_german", "ona_natural_female_lithuanian", "hila_natural_female_hebrew", "alain_professional_male_french", "shruti_female_telugu", "nestoras_natural_male_greek", "ardi_natural_male_indonesian", "amany_warm_female_arabic", "hamdan_natural_male_arabic", "ralf_professional_male_german", "iman_professional_female_arabic", "maryam_natural_female_arabic", "antonio_natural_male_portuguese", "moaz_professional_male_arabic", "laith_warm_male_arabic", "klarissa_professional_female_german", "diego_natural_male_italian", "emel_female_turkish", "hedi_friendly_male_arabic", "noura_natural_female_arabic", "denise_friendly_female_french", "lukas_natural_male_slovak", "mouna_newscaster_female_arabic", "ismael_serious_male_arabic", "viktoria_natural_female_slovak", "shakir_professional_male_arabic", "nabanita_natural_female_bangla", "gabriella_natural_female_italian", "vlasta_natural_female_czech", "yunyang_professional_male_chinese", "tamas_natural_male_hungarian", "hoai_natural_female_vietnamese", "mohan_male_telugu", "injoon_natural_male_korean", "hamed_natural_male_arabic", "rana_natural_female_arabic", "kalina_professional_female_bulgarian", "ali_newscaster_male_arabic", "bassel_friendly_male_arabic", "borislav_professional_male_bulgarian", "laila_friendly_female_arabic", "zofia_natural_female_polish", "dariya_professional_female_russian", "sunhi_natural_female_korean", "namminh_natural_male_vietnamese", "noemi_natural_female_hungarian", "joana_natural_female_catalan", "reem_friendly_female_arabic", "yunjhe_natural_male_chinese", "sakura_cheerful_female_japanese", "sylvie_professional_female_french", "elsa_cheerful_female_italian", "fernanda_natural_female_portuguese", "hiumaan_natural_female_chinese", "jonas_friendly_male_german", "dalia_friendly_female_spanish", "antoine_natural_male_french", "jorge_professional_male_spanish", "swara_friendly_female_hindi", "duarte_natural_male_portuguese", "donato_natural_male_portuguese", "leni_friendly_female_german", "wanlung_natural_male_chinese", "hsiaochen_friendly_female_chinese", "lorenzo_natural_male_spanish", "madhur_natural_male_hindi", "jan_natural_male_german", "ariane_natural_female_french", "fabrice_friendly_male_french", "catalina_warm_female_spanish", "gerard_professional_male_french", "elke_warm_female_german", "charline_natural_female_french", "paloma_natural_female_spanish", "kasper_newscaster_male_german", "xiaoshuang_cheerful_female_chinese", "maria_natural_female_portuguese", "alonso_professional_male_spanish", "xiaoxuan_serious_female_chinese", "celeste_professional_female_french", "yunye_calm_male_chinese", "xiaowen_cheerful_female_chinese", "louisa_natural_female_german", "elza_warm_female_portuguese", "yves_newscaster_male_french", "marcelo_warm_male_spanish", "hsiaoyu_natural_female_chinese", "klaus_natural_male_german", "henri_natural_male_french", "elena_natural_female_spanish", "killian_professional_male_german", "maja_newscaster_female_german", "tomas_natural_male_spanish", "fabio_newscaster_male_portuguese", "brigitte_natural_female_french", "humberto_professional_male_portuguese", "yvette_warm_female_french", "qiujing_warm_female_chinese", "alvaro_natural_male_spanish", "yunxi_friendly_male_chinese", "francisca_cheerful_female_portuguese", "salome_natural_female_spanish", "claude_friendly_male_french", "josephine_calm_female_french", "tanja_serious_female_german", "gunter_calm_male_german", "gonzalo_natural_male_spanish", "xiaomeng_warm_female_chinese", "gisela_natural_female_german", "xiaoyan_newscaster_female_chinese", "maurice_professional_male_french", "bernd_natural_male_german", "coralie_natural_female_french", "jerome_professional_male_french", "elvira_natural_female_spanish", "eloise_natural_female_french", "arnaud_professional_male_dutch", "dena_natural_female_dutch", "maarten_natural_male_dutch", "raquel_warm_female_portuguese", "sofia_cheerful_female_spanish", "osman_natural_male_malay", "yasmin_natural_female_malay", "xiaomo_friendly_female_chinese", "xiaocheng_natural_female_chinese", "xiaohan_peaceful_female_chinese", "xiaorui_cheerful_female_chinese", "hiugaai_natural_female_chinese", "jean_friendly_male_french", "sofie_natural_female_swedish", "manohar_natural_male_marathi", "sameera_natural_male_sinhala", "niranjan_natural_male_gujarati", "pernille_natural_female_norwegian", "marta_natural_female_spanish", "enric_natural_male_catalan", "salman_natural_male_urdu", "elias_natural_male_spanish", "nils_affinity_male_latvian", "polina_professional_female_ukrainian", "eka_natural_female_georgian", "anu_natural_female_estonian", "thilini_natural_female_sinhala", "alba_natural_female_catalan", "rehema_natural_female_kiswahili", "valluvar_natural_male_tamil", "alina_natural_female_romanian", "gabrijela_calm_female_croatian", "iselin_natural_female_norwegian", "gul_natural_female_urdu", "selma_natural_female_finnish", "niwat_natural_male_thai", "arnau_natural_male_spanish", "ostap_professional_male_ukrainian", "valentina_natural_female_spanish", "hemkala_natural_female_nepali", "noora_natural_female_finnish", "sagar_natural_male_nepali", "laia_friendly_female_spanish", "aarohi_natural_female_marathi", "kert_natural_male_estonian", "asad_natural_male_urdu", "dilara_female_persian", "jeppe_natural_male_danish", "emil_natural_male_romanian", "vera_friendly_female_spanish", "paola_cheerful_female_spanish", "achara_friendly_female_thai", "pallavi_natural_female_tamil", "srecko_natural_male_croatian", "mattias_natural_male_swedish", "christel_natural_female_danish", "dhwani_natural_female_gujarati", "finn_natural_male_norwegian", "farid_male_persian", "everita_gently_female_latvian", "irene_natural_female_spanish", "giorgi_natural_male_georgian", "harri_natural_male_finnish", "larissa_friendly_female_spanish", "premwadee_natural_female_thai", "abril_natural_female_spanish", "pierina_natural_female_italian", "uzma_natural_female_urdu", "lorena_natural_female_spanish", "benigno_natural_male_italian", "daudi_natural_male_kiswahili", "daran_outside_sitting_2_male_multilingual", "lukas_in_car_male_multilingual", "lea_in_car_female_multilingual", "lea_on_balcony_female_multilingual", "lea_in_car_2_female_multilingual", "lucas_inside_black_hoodie_male_multilingual", "daran_in_car_male_multilingual", "daran_inside_booth_male_multilingual_fe5b9e", "lea_inside_sitting_female_multilingual", "lea_inside_female_multilingual", "daran_outside_sitting_male_multilingual", "gail_inside_standing_female_multilingual", "lucas_outside_at_cafe_male_multilingual", "daran_inside_2_with_mic_male_multilingual", "gail_outside_walking_female_multilingual", "lea_outside_walking_female_multilingual_c4be40", "daran_inside_booth_male_multilingual_3833c2", "gail_in_car_female_multilingual", "daran_outside_walking_male_multilingual", "tim_outside_sitting_male_multilingual", "lea_outside_walking_female_multilingual_1753e5", "lea_inside_sitting_down_female_multilingual", "paul_broadcaster_male_multilingual", "paul_soothing_male_multilingual", "theo_soothing_male_multilingual", "ceecee_serious_female_multilingual", "rex_soothing_male_multilingual", "melissa_friendly_female_multilingual", "ceecee_soothing_female_multilingual", "ceecee_excited_female_multilingual", "rex_friendly_male_multilingual", "melissa_broadcaster_female_multilingual", "rex_broadcaster_male_multilingual", "melissa_serious_female_multilingual", "melissa_excited_female_multilingual", "elizabeth_excited_female_multilingual", "rex_excited_male_multilingual", "elizabeth_broadcaster_female_multilingual", "christine_serious_female_multilingual", "elizabeth_friendly_female_multilingual", "paul_serious_male_multilingual", "theo_friendly_male_multilingual", "paul_friendly_male_multilingual", "theo_serious_male_multilingual", "theo_broadcaster_male_multilingual", "christine_friendly_female_multilingual", "melissa_soothing_female_multilingual", "ceecee_broadcaster_female_multilingual", "paul_excited_male_multilingual", "christine_broadcaster_female_multilingual", "rex_serious_male_multilingual", "christine_soothing_female_multilingual", "ceecee_friendly_female_multilingual", "elizabeth_serious_female_multilingual", "christine_excited_female_multilingual", "theo_excited_male_multilingual", "elizabeth_soothing_female_multilingual"], "language": ["af-ZA", "sq-AL", "am-ET", "ar", "ar-DZ", "ar-BH", "ar-EG", "ar-IQ", "ar-JO", "ar-KW", "ar-LB", "ar-LY", "ar-MA", "ar-OM", "ar-QA", "ar-SA", "ar-SY", "ar-TN", "ar-AE", "ar-001", "ar-YE", "hy-AM", "az-AZ", "bn-BD", "eu-ES", "be-BY", "bn-IN", "bs-BA", "bg", "bg-BG", "my-MM", "ca-ES", "zh", "zh-HK", "zh-CN-shandong", "zh-CN", "zh-CN-liaoning", "zh-CN-sichuan", "zh-TW", "wuu-CN", "zh-CN-henan", "zh-CN-shaanxi", "hr", "hr-HR", "cs", "cs-CZ", "da", "da-DK", "nl", "nl-BE", "nl-NL", "en", "en-AU", "en-CA", "en-HK", "en-IN", "en-IE", "en-KE", "en-NZ", "en-NG", "en-PH", "en-SG", "en-ZA", "en-TZ", "en-GB", "en-US", "et-EE", "fil", "ceb-PH", "fil-PH", "fi", "fi-FI", "fr", "fr-BE", "fr-CA", "fr-FR", "fr-CH", "gl-ES", "ka-GE", "de", "de-AT", "de-DE", "de-CH", "el", "el-GR", "gu-IN", "ht-HT", "he-IL", "hi", "hi-IN", "hu-HU", "is-IS", "id", "id-ID", "ga-IE", "it", "it-IT", "ja", "ja-JP", "jv-ID", "kn-IN", "kk-KZ", "km-KH", "ko", "ko-KR", "lo-LA", "la-VA", "lv-LV", "lt-LT", "lb-LU", "mk-MK", "mg-MG", "ms", "ms-MY", "ml-IN", "mt-MT", "mr-IN", "mn-MN", "ne-NP", "nb-NO", "nn-NO", "or-IN", "ps-AF", "fa-IR", "pl", "pl-PL", "pt", "pt-BR", "pt-PT", "pa-IN", "ro", "ro-RO", "ru", "ru-RU", "sr-LATN-RS", "si-LK", "sk", "sk-SK", "sl-SI", "so-SO", "es", "es-AR", "es-BO", "es-CL", "es-CO", "es-CR", "es-CU", "es-DO", "es-EC", "es-SV", "es-GQ", "es-GT", "es-HN", "es-419", "es-MX", "es-NI", "es-PA", "es-PY", "es-PE", "es-PR", "es-ES", "es-US", "es-UY", "es-VE", "su-ID", "sw-KE", "sw-TZ", "sv", "sv-SE", "ta", "ta-IN", "ta-MY", "ta-SG", "ta-LK", "te-IN", "th-TH", "tr", "tr-TR", "uk", "uk-UA", "ur-IN", "ur-PK", "uz-UZ", "vi-VN", "cy-GB", "zu-ZA"]}, "rw_cat": "inputs"}], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "default": "", "rw_cat": "core"}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "size": [["None (model default)", "720p (from input)", "1080p (from input)", "720p (16:9)", "720p (9:16)", "1080p (16:9)", "1080p (9:16)"], {"default": "1080p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "avatar": [["(default)", "Abigail_sitting_sofa_front", "Abigail_sitting_sofa_side", "Abigail_standing_office_front", "Abigail_standing_office_side", "Amelia_lying_lounge_front", "Amelia_lying_lounge_side", "Amelia_sitting_business_training_front", "Amelia_sitting_business_training_side", "Amelia_sitting_yoga_front", "Amelia_sitting_yoga_side", "Amelia_standing_business_training_front", "Amelia_standing_business_training_side", "Amelia_standing_lounge_front", "Amelia_standing_lounge_side", "Amelia_standing_yoga_front", "Amelia_standing_yoga_side", "Anja_sitting_sofa_front", "Anja_sitting_sofa_side", "Anja_standing_office_front", "Anja_standing_office_side", "Ann_Doctor_Sitting_public", "Ann_Doctor_Standing2_public", "Ann_Therapist_public", "Annie_Bar_Sitting_Front_public", "Annie_Bar_Sitting_Side_public", "Annie_Bar_Standing_Front_2_public", "Annie_Bar_Standing_Front_3_public", "Annie_Bar_Standing_Front_public", "Annie_Bar_Standing_Side_2_public", "Annie_Bar_Standing_Side_3_public", "Annie_Bar_Standing_Side_public", "Annie_Business_Casual_Standing_Front_2_public", "Annie_Business_Casual_Standing_Front_public", "Annie_Business_Casual_Standing_Side_2_public", "Annie_Business_Casual_Standing_Side_public", "Annie_Casual_Sitting_Front_2_public", "Annie_Casual_Sitting_Front_public", "Annie_Casual_Sitting_Side_2_public", "Annie_Casual_Sitting_Side_public", "Annie_Casual_Standing_Front_2_public", "Annie_Casual_Standing_Front_public", "Annie_Casual_Standing_Side_2_public", "Annie_Casual_Standing_Side_public", "Annie_Desk_Sitting_Front_2_public", "Annie_Desk_Sitting_Front_public", "Annie_Desk_Sitting_Side_2_public", "Annie_Desk_Sitting_Side_public", "Annie_Lounge_Standing_Front_public", "Annie_Lounge_Standing_Side_public", "Annie_Office_Sitting_Front_2_public", "Annie_Office_Sitting_Front_public", "Annie_Office_Sitting_Side_2_public", "Annie_Office_Sitting_Side_public", "Annie_Office_Standing_Front_public", "Annie_Office_Standing_Side_public", "Annie_Sofa_Sitting_Front_3_public", "Annie_Sofa_Sitting_Front_public", "Annie_Sofa_Sitting_Side1_public", "Annie_Sofa_Sitting_Side_2_public", "Annie_Sofa_Sitting_Side_3_public", "Annie_Sofa_Sitting_Side_public", "Annie_Studio_Pink_Sitting_Front_public", "Annie_Studio_Pink_Sitting_Side_public", "Annie_Studio_Pink_Standing_Front_public", "Annie_Studio_Pink_Standing_Side_public", "Artur_sitting_office_front", "Artur_sitting_office_side", "Artur_sitting_sofacasual_front", "Artur_sitting_sofacasual_side", "Artur_standing_office_front", "Artur_standing_office_side", "Artur_standing_sofacasual_front", "Artur_standing_sofacasual_side", "Aubrey_sitting_sofa_front", "Aubrey_sitting_sofa_side", "Aubrey_standing_night_scene_front", "Aubrey_standing_outdoor_sport_front", "Aubrey_standing_outdoor_sport_side", "Blanka_lying_outfoorreading_front", "Blanka_lying_outfoorreading_side", "Blanka_sitting_lounge_front", "Blanka_sitting_lounge_side", "Blanka_sitting_picnic_front", "Blanka_sitting_picnic_side", "Blanka_standing_outfoorbusiness_front", "Blanka_standing_outfoorbusiness_side", "Bojan_lying_lounge_front", "Bojan_lying_lounge_side", "Bojan_sitting_businesstraining_front", "Bojan_sitting_businesstraining_side", "Bojan_sitting_sport_front", "Bojan_sitting_sport_side", "Bojan_standing_businesstraining_front", "Bojan_standing_businesstraining_side", "Bojan_standing_lounge_front", "Bojan_standing_lounge_side", "Bojan_standing_sport_front", "Bojan_standing_sport_side", "Brandon_Business_Sitting_Front_public", "Brandon_Business_Sitting_Side_public", "Brandon_Business_Standing_Front_public", "Brandon_Business_Standing_Side_public", "Brandon_Casual_Sitting_Front_public", "Brandon_Casual_Sitting_Side_public", "Brandon_Kitchen_Standing_Front_public", "Brandon_Kitchen_Standing_Side_public", "Brandon_Lobby_Sitting_Front_public", "Brandon_Lobby_Sitting_Side_public", "Brandon_Lobby_Standing_Front_public", "Brandon_Lobby_Standing_Side_public", "Brandon_Office_Sitting_Front_public", "Brandon_Office_Sitting_Side_public", "Brandon_Office_Standing_Front_public", "Brandon_Office_Standing_Side_public", "Brandon_Sofa_Sitting_Front_public", "Brandon_Sofa_Sitting_Side_public", "Brent_sitting_office_front", "Brent_sitting_office_side", "Brent_sitting_sofa_front", "Brent_sitting_sofa_side", "Brent_standing_office_front", "Brent_standing_office_side", "Brent_standing_sofa_front", "Brent_standing_sofa_side", "Bryan_FitnessCoach_public", "Bryan_IT_Sitting_public", "Caroline_Business_Sitting_Front_public", "Caroline_Business_Sitting_Side_public", "Caroline_Business_Standing_Front_public", "Caroline_Business_Standing_Side_public", "Caroline_Casual_Sitting_Front_public", "Caroline_Casual_Sitting_Side_public", "Caroline_Kitchen_Standing_Front_public", "Caroline_Kitchen_Standing_Side_public", "Caroline_Lobby_Sitting_Front_public", "Caroline_Lobby_Sitting_Side_public", "Caroline_Lobby_Standing_Front_public", "Caroline_Lobby_Standing_Side_public", "Caroline_Office_Sitting_Front_public", "Caroline_Office_Sitting_Side_public", "Caroline_Office_Standing_Front_public", "Caroline_Office_Standing_Side_public", "Caroline_Sofa_Sitting_Front_public", "Caroline_Sofa_Sitting_Side_public", "Chloe_standing_lounge_front", "Chloe_standing_lounge_side", "Chloe_standing_outdoor_side", "Conrad_sitting_house_side", "Conrad_sitting_sofa_front", "Conrad_standing_house_front", "Conrad_standing_sofa_side", "Derya_sitting_indoor_front", "Derya_sitting_indoor_side", "Derya_sitting_office_front", "Derya_sitting_office_side", "Derya_standing_indoor_front", "Derya_standing_indoor_side", "Derya_standing_office_front", "Derya_standing_office_side", "Dexter_Doctor_Sitting2_public", "Dexter_Doctor_Standing2_public", "Dexter_Lawyer_Sitting_public", "Elenora_FitnessCoach2_public", "Elenora_FitnessCoach_public", "Elenora_IT_Sitting_public", "Emanuel_sitting_Sofa_side", "Emanuel_sitting_sofa_front", "Emanuel_standing_office_front", "Emanuel_standing_office_side", "Emilia_sitting_outdooryoga2_front", "Emilia_sitting_outdooryoga_front", "Emilia_sitting_outdooryoga_side", "Emilia_sitting_picnic_front", "Emilia_sitting_picnic_side", "Emilia_standing_outdoorbusiness_front", "Emilia_standing_outdoorbusiness_side", "Eric_public_lite1_20230601", "Fernando_sitting_businessindoor_front", "Fernando_sitting_businessindoor_side", "Fernando_sitting_outdoorchair_front", "Fernando_sitting_outdoorchair_front_close", "Fernando_sitting_outdoorchair_side", "Fernando_sitting_outdoortable_front", "Fernando_sitting_outdoortable_side", "Fernando_standing_outdoor_front", "Fernando_standing_outdoor_side", "Gala_lying_bedroom_front", "Gala_lying_sofa_front", "Gala_lying_sofa_side", "Gala_sitting_businesssofa_front", "Gala_sitting_businesssofa_side", "Gala_sitting_casualsofawithipad_front", "Gala_sitting_casualsofawithipad_side", "Gala_sitting_casualsofawithipad_side_close", "Gala_sitting_office_front", "Gala_sitting_office_side", "Gala_sitting_sofa_front", "Gala_sitting_sofa_front_close", "Gala_sitting_sofa_side", "Gala_sitting_sofa_side_close", "Gala_standing_businesssofa_front", "Gala_standing_businesssofa_front_close", "Gala_standing_businesssofa_side", "Gala_standing_businesssofa_side_close", "Georgia_sitting_office_front", "Georgia_sitting_office_side", "Georgia_standing_casual_front", "Georgia_standing_casual_side", "Gerardo_sitting_indoor_front", "Gerardo_sitting_indoor_side", "Gerardo_sitting_sofa_front", "Gerardo_sitting_sofa_side", "Gerardo_standing_nightscene2_front", "Gerardo_standing_nightscene_front", "Gerardo_standing_outdoorsport_front", "Gerardo_standing_outdoorsport_side", "Giulia_sitting_office_front", "Giulia_sitting_office_side", "Giulia_sitting_sofa_front", "Giulia_sitting_sofa_side", "Giulia_standing_office_front", "Giulia_standing_office_side", "Giulia_standing_sofa_front", "Giulia_standing_sofa_side", "Ida_sitting_lounge_front", "Ida_sitting_lounge_side", "Ida_sitting_sofa_front", "Ida_sitting_sofa_side", "Ida_standing_lounge_front", "Ida_standing_lounge_side", "Ida_standing_sofa_front", "Ida_standing_sofa_side", "Jocelyn_sitting_office_front", "Jocelyn_sitting_office_side", "Jocelyn_sitting_sofa_front", "Jocelyn_sitting_sofa_side", "Jocelyn_standing_office_front", "Jocelyn_standing_office_side", "Jocelyn_standing_sofa_front", "Jocelyn_standing_sofa_side", "Joel_sitting_couch_front", "Joel_sitting_couch_side", "Joel_standing_gym_front", "Joel_standing_gym_side", "Joel_standing_mountain_front", "Joel_standing_mountain_side", "Jonas_sitting_gym_front", "Jonas_sitting_gym_side", "Jonas_standing_gym_front", "Jonas_standing_gym_side", "Juan_sitting_office_front", "Juan_sitting_office_side", "Juan_sitting_sofa_front", "Juan_sitting_sofa_side", "Juan_sitting_sofacasual_front", "Juan_standing_office_front", "Juan_standing_office_side", "Juan_standing_sofa_front", "Juan_standing_sofa_side", "Juan_standing_sofacasual_front", "Judita_sitting_yoga_front", "Judita_sitting_yoga_side", "Judita_standing_yoga_front", "Judita_standing_yoga_side", "Judy_Doctor_Sitting2_public", "Judy_Doctor_Standing2_public", "Judy_Lawyer_Sitting2_public", "Judy_Teacher_Sitting2_public", "Judy_Teacher_Sitting_public", "Judy_Teacher_Standing_public", "June_HR_public", "June_sitting_office_front", "June_sitting_office_side", "June_sitting_sofacasual_side", "June_standing_office_side", "June_standing_sofacasual_side", "Kavya_sitting_sofa_front", "Kavya_sitting_sofa_side", "Kavya_standing_indoor_front", "Kavya_standing_indoor_side", "Kavya_standing_outdoor_side", "Kavya_standing_outdoorsport_front", "Kavya_standing_outdoorsport_side", "Leos_sitting_office_front", "Leos_sitting_office_side", "Leos_sitting_sofa_front", "Leos_sitting_sofa_side", "Leos_standing_office_front", "Leos_standing_office_side", "Leos_standing_sofa_front", "Leos_standing_sofa_side", "Leszek_sitting_lounge_front", "Leszek_sitting_lounge_side", "Leszek_sitting_sofa_front", "Leszek_sitting_sofa_side", "Leszek_standing_outdoorbusiness_front", "Leszek_standing_outdoorbusiness_side", "Leszek_standing_outdoorcasual_front", "Leszek_standing_outdoorcasual_side", "Lily_public_lite1_20230601", "Martina_sitting_office_front", "Martina_sitting_office_side", "Martina_sitting_sofa_front", "Martina_sitting_sofa_side", "Martina_standing_office_front", "Martina_standing_office_side", "Martina_standing_sofa_front", "Martina_standing_sofa_side", "Masha_sitting_office_front", "Masha_sitting_office_side", "Masha_sitting_sofacasual_front", "Masha_sitting_sofacasual_side", "Masha_standing_office_front", "Masha_standing_office_side", "Masha_standing_sofacasual_front", "Masha_standing_sofacasual_side", "Matteo_sitting_office_front", "Matteo_sitting_office_side", "Matteo_sitting_sofa_front", "Matteo_sitting_sofa_side", "Matteo_standing_office_front", "Matteo_standing_office_side", "Matteo_standing_sofa_front", "Matteo_standing_sofa_side", "Max_sitting_indoor_front", "Max_sitting_indoor_side", "Max_standing_outdoorsport_front", "Max_standing_outdoorsport_side", "Mido-lite-20221128", "Milena_sitting_office_front", "Milena_sitting_office_side", "Milena_sitting_sofa_front", "Milena_sitting_sofa_side", "Milena_standing_office_front", "Milena_standing_office_side", "Milena_standing_sofa_front", "Milena_standing_sofa_side", "Miles_sitting_sofa_front", "Miles_sitting_sofa_side", "Miles_standing_outdoor_front", "Miles_standing_outdoor_side", "Miles_standing_sofa_front", "Miles_standing_sofa_side", "Mireia_sitting_businessindoor_front", "Mireia_sitting_businessindoor_side", "Mireia_sitting_outdoorchair_front", "Mireia_sitting_outdoortable_front", "Mireia_sitting_outdoortable_side", "Mireia_standing_outdoor_front", "Mireia_standing_outdoor_side", "Miyu_sitting_office_front", "Miyu_sitting_office_side", "Miyu_sitting_sofabusiness_front", "Miyu_sitting_sofabusiness_side", "Miyu_sitting_sofacasual_front", "Miyu_sitting_sofacasual_side", "Miyu_standing_office_front", "Miyu_standing_office_side", "Miyu_standing_sofacasual_front", "Miyu_standing_sofacasual_side", "Noah_sitting_lobby_front", "Noah_sitting_lobby_side", "Noah_sitting_office_front", "Noah_sitting_office_side", "Noah_sitting_sofa_front", "Noah_sitting_sofa_side", "Noah_standing_lobby_front", "Noah_standing_lobby_side", "Noah_standing_office_front", "Noah_standing_office_side", "Noah_standing_sofa_front", "Noah_standing_sofa_side", "Oxana_sitting_gym_front", "Oxana_sitting_gym_side", "Oxana_sitting_office_front", "Oxana_sitting_office_side", "Oxana_sitting_sofa_front", "Oxana_sitting_sofa_side", "Oxana_sitting_yoga_front", "Oxana_sitting_yoga_side", "Oxana_standing_gym_front", "Oxana_standing_gym_side", "Oxana_standing_office_front", "Oxana_standing_office_side", "Oxana_standing_sofa_front", "Oxana_standing_sofa_side", "Oxana_standing_yoga_front", "Oxana_standing_yoga_side", "Patrizio_sitting_office_front", "Patrizio_sitting_office_side", "Patrizio_sitting_sofa_front", "Patrizio_sitting_sofa_side", "Patrizio_standing_businesstraining_front", "Patrizio_standing_businesstraining_side", "Patrizio_standing_office_side", "Piper_sitting_businesssofa_front", "Piper_sitting_businesssofa_side", "Piper_standing_education_front", "Piper_standing_education_side", "Rasmus_sitting_lounge_front", "Rasmus_sitting_lounge_side", "Rasmus_sitting_sofa_front", "Rasmus_sitting_sofa_side", "Rasmus_standing_lounge_front", "Rasmus_standing_lounge_side", "Rasmus_standing_sofa_front", "Rasmus_standing_sofa_side", "Raul_Sitting_businesssofa_front", "Raul_Sitting_businesssofa_front_close", "Raul_sitting_businesssofa_side", "Raul_sitting_casualsofanoipad_front", "Raul_sitting_casualsofanoipad_side", "Raul_sitting_casualsofawithipad_front", "Raul_sitting_casualsofawithipad_side", "Raul_sitting_office_front", "Raul_sitting_office_side", "Raul_sitting_sofa_front", "Raul_sitting_sofa_front_close", "Raul_sitting_sofa_side", "Raul_sitting_sofa_side_close", "Raul_standing_businesssofa_side", "Raul_standing_casualsofa_front", "Raul_standing_casualsofa_front_close", "Raul_standing_casualsofa_side", "Raul_standing_casualsofa_side_close", "Raul_standing_office_front", "Ren_sitting_office_front", "Ren_sitting_office_side", "Ren_sitting_sofabusiness_front", "Ren_sitting_sofabusiness_side", "Ren_sitting_sofacasual_front", "Ren_sitting_sofacasual_side", "Ren_standing_office_front", "Ren_standing_office_side", "Ren_standing_sofacasual_front", "Ren_standing_sofacasual_side", "Riley_siting_casual_front", "Riley_sitting_casual_side", "Riley_sitting_office_front", "Riley_sitting_office_side", "Roman_standing_outdoorsport_front", "Roman_standing_outdoorsport_side", "Sabine_sitting_office_front", "Sabine_sitting_sofa_side", "Sabine_standing_office_front", "Sabine_standing_office_side", "Santa_Fireplace_Front_public", "Santa_Fireplace_Side_public", "Scarlett_siiting_fireplace_front", "Scarlett_sitting_couch2_front", "Scarlett_sitting_couch2_side", "Scarlett_sitting_couch_front", "Scarlett_sitting_couch_side", "Scarlett_sitting_fireplace_side", "Scarlett_sitting_yoga_front", "Scarlett_sitting_yoga_side", "Scarlett_standing_hall_front", "Scarlett_standing_hall_side", "Shawn_Therapist_public", "SilasHR_public", "Silas_CustomerSupport_public", "Silas_sitting_lounge_front", "Silas_sitting_lounge_side", "Silas_sitting_sofa_side", "Silas_sitting_sofa_side_close", "Teodor_sitting_office_front", "Teodor_sitting_office_side", "Teodor_sitting_sofa_front", "Teodor_sitting_sofa_side", "Teodor_standing_office_front", "Teodor_standing_office_side", "Teodor_standing_sofa_front", "Teodor_standing_sofa_side", "Timothy_sitting_casual_front", "Timothy_sitting_casual_side", "Timothy_sitting_office_front", "Timothy_sitting_office_side", "Veit_sitting_sofa_front", "Veit_sitting_sofa_side", "Veit_standing_office_front", "Veit_standing_office_side", "Vemon_sitting_office_front", "Vemon_sitting_office_side", "Vemon_standing_office_front", "Vemon_standing_office_side", "Verena_sitting_sofa_front", "Verena_sitting_sofa_side", "Verena_standing_office_front", "Verena_standing_office_side", "Vernon_sitting_lounge_side", "Vernon_standing_lounge_front", "Vernon_standing_lounge_side", "Vince_sitting_businesssofa_front", "Vince_sitting_businesssofa_side", "Vince_sitting_sofacasual_front", "Vince_sitting_sofacasual_side", "Vince_standing_businesstraining_front", "Vince_standing_businesstraining_side", "Vince_standing_sofacasual_front", "Vince_standing_sofacasual_side", "casual_sitting_young_adult", "man_casual_young_adult", "man_casual_young_adult_2", "photo_45f4a824", "photo_ef83f695", "woman_business_formal", "woman_business_half_body", "woman_business_office", "woman_casual", "woman_casual_sitting", "woman_casual_standing", "woman_casual_young_adult", "woman_middle_aged_sitting"], {"tooltip": "HeyGen avatar ID for a photo or video avatar.", "default": "(default)", "rw_cat": "core"}], "settings.backgroundColor": ["STRING", {"tooltip": "Hex color code for solid background (e.g. #ff0000).", "default": "", "rw_cat": "settings"}], "settings.expressiveness": [["low", "medium", "high"], {"default": "low", "tooltip": "Controls the level of avatar expressiveness.", "rw_cat": "settings"}], "settings.removeBackground": ["BOOLEAN", {"default": false, "tooltip": "Remove the avatar background. Video avatars must be trained with matting enabled.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "audio": {"path": ["inputs", "audio"], "kind": "scalar", "omit_empty": true}, "avatar": {"path": ["inputs", "avatar"], "kind": "scalar", "omit_value": "(default)"}, "background": {"path": ["inputs", "background"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "speech": {"path": ["speech"], "kind": "feature"}, "settings.backgroundColor": {"path": ["settings", "backgroundColor"], "kind": "scalar", "omit_empty": true}, "settings.expressiveness": {"path": ["settings", "expressiveness"], "kind": "scalar"}, "settings.removeBackground": {"path": ["settings", "removeBackground"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (9:16)": {"width": 720, "height": 1280}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (9:16)": {"width": 1080, "height": 1920}}}}}, {"key": "Runware_skywork_skyreels_v4", "name": "SkyReels V4", "model": "skywork:skyreels@v4", "task_type": "videoInference", "creator": "skywork", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["RUNWARE_REFERENCEIMAGES", {"rw_socket_fields": ["audio", "images", "tag", "type"], "rw_socket_enums": {"type": ["grid", "image"]}, "rw_cat": "inputs"}], "frameImages": ["IMAGE"], "referenceVideos": ["RUNWARE_REFERENCEVIDEOS", {"rw_socket_fields": ["tag", "type", "video"], "rw_socket_enums": {"type": ["reference", "extend"]}, "rw_cat": "inputs"}], "size": [["None (model default)", "480p (from input)", "720p (from input)", "1080p (from input)", "480p (16:9)", "480p (9:16)", "480p (~4:3)", "480p (~3:4)", "480p (1:1)", "720p (16:9)", "720p (9:16)", "720p (~4:3)", "720p (~3:4)", "720p (1:1)", "1080p (16:9)", "1080p (9:16)", "1080p (~4:3)", "1080p (~3:4)", "1080p (1:1)"], {"default": "1080p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "duration": ["FLOAT", {"default": 5, "min": 3, "max": 15, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.audio": ["BOOLEAN", {"default": false, "tooltip": "Sound effect generation for the output video.", "rw_cat": "settings"}], "settings.promptExtend": ["BOOLEAN", {"default": true, "tooltip": "Automatic prompt expansion and refinement via LLM for higher visual fidelity and alignment.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "feature"}, "frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "referenceVideos": {"path": ["inputs", "referenceVideos"], "kind": "feature"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "settings.audio": {"path": ["settings", "audio"], "kind": "scalar", "omit_value": false}, "settings.promptExtend": {"path": ["settings", "promptExtend"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "480p (from input)": {"resolution": "480p"}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "480p (16:9)": {"width": 848, "height": 480}, "480p (9:16)": {"width": 480, "height": 848}, "480p (~4:3)": {"width": 736, "height": 560}, "480p (~3:4)": {"width": 560, "height": 736}, "480p (1:1)": {"width": 640, "height": 640}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (9:16)": {"width": 720, "height": 1280}, "720p (~4:3)": {"width": 1088, "height": 832}, "720p (~3:4)": {"width": 832, "height": 1088}, "720p (1:1)": {"width": 960, "height": 960}, "1080p (16:9)": {"width": 1920, "height": 1088}, "1080p (9:16)": {"width": 1088, "height": 1920}, "1080p (~4:3)": {"width": 1664, "height": 1248}, "1080p (~3:4)": {"width": 1248, "height": 1664}, "1080p (1:1)": {"width": 1440, "height": 1440}}}}}, {"key": "Runware_openai_sora_2", "name": "Sora 2", "model": "openai:3@1", "task_type": "videoInference", "creator": "openai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "duration": [["(default)", 4, 8, 12, 16, 20], {"tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "videoId": ["STRING", {"tooltip": "ID of a previously generated video. Used for remixing or extending.", "default": "", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "videoId": {"path": ["inputs", "videoId"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar", "omit_value": "(default)"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_openai_clip_vit_l_14", "name": "OpenAI CLIP ViT-L/14", "model": "runware:151@1", "task_type": "caption", "creator": "runware", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"prompt": ["STRING", {"tooltip": "Instructions or questions to guide the image analysis.", "multiline": true, "default": "", "rw_cat": "core"}]}}, "param_plan": {"prompt": {"path": ["prompt"], "kind": "scalar", "omit_empty": true}, "image": {"path": ["inputs", "image"], "kind": "image_scalar"}}}, {"key": "Runware_openai_gpt_5_nano", "name": "GPT-5 Nano", "model": "openai:gpt@5-nano", "task_type": "textInference", "creator": "openai", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"images": ["IMAGE"], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.maxTokens": ["INT", {"default": 32000, "min": 1, "max": 128000, "tooltip": "Maximum number of tokens to generate in the response.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.thinkingLevel": [["none", "low", "medium", "high"], {"default": "medium", "tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "outputFormat": [["TEXT", "JSON"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: jsonSchema, tools"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "images": {"path": ["inputs", "images"], "kind": "image_array"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_openai_gpt_image_1", "name": "GPT Image 1", "model": "openai:1@1", "task_type": "imageInference", "creator": "openai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.openai.background": [["auto", "opaque", "transparent"], {"default": "auto", "tooltip": "Background handling in generated images.", "rw_cat": "settings"}], "providerSettings.openai.moderation": [["auto", "low"], {"default": "auto", "tooltip": "Content moderation level.", "rw_cat": "settings"}], "providerSettings.openai.quality": [["auto", "high", "medium", "low"], {"default": "auto", "tooltip": "Image quality level.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "providerSettings.openai.background": {"path": ["providerSettings", "openai", "background"], "kind": "scalar"}, "providerSettings.openai.moderation": {"path": ["providerSettings", "openai", "moderation"], "kind": "scalar"}, "providerSettings.openai.quality": {"path": ["providerSettings", "openai", "quality"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_openai_gpt_image_1_mini", "name": "GPT Image 1 Mini", "model": "openai:1@2", "task_type": "imageInference", "creator": "openai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.openai.background": [["auto", "opaque", "transparent"], {"default": "auto", "tooltip": "Background handling in generated images.", "rw_cat": "settings"}], "providerSettings.openai.moderation": [["auto", "low"], {"default": "auto", "tooltip": "Content moderation level.", "rw_cat": "settings"}], "providerSettings.openai.quality": [["auto", "high", "medium", "low"], {"default": "auto", "tooltip": "Image quality level.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "providerSettings.openai.background": {"path": ["providerSettings", "openai", "background"], "kind": "scalar"}, "providerSettings.openai.moderation": {"path": ["providerSettings", "openai", "moderation"], "kind": "scalar"}, "providerSettings.openai.quality": {"path": ["providerSettings", "openai", "quality"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_openai_gpt_5_4_pro", "name": "GPT-5.4 Pro", "model": "openai:gpt@5.4-pro", "task_type": "textInference", "creator": "openai", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"images": ["IMAGE"], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.maxTokens": ["INT", {"default": 4096, "min": 1, "max": 128000, "tooltip": "Maximum number of tokens to generate in the response.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.thinkingLevel": [["(default)", "low", "medium", "high", "xhigh"], {"tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "default": "(default)", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "outputFormat": [["TEXT"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: tools"}]}}, "param_plan": {"images": {"path": ["inputs", "images"], "kind": "image_array"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar", "omit_value": "(default)"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_openai_gpt_5_4", "name": "GPT-5.4", "model": "openai:gpt@5.4", "task_type": "textInference", "creator": "openai", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"images": ["IMAGE"], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.maxTokens": ["INT", {"default": 4096, "min": 1, "max": 128000, "tooltip": "Maximum number of tokens to generate in the response.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "settings.thinkingLevel": [["(default)", "low", "medium", "high", "xhigh"], {"tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "default": "(default)", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "settings.topP": ["FLOAT", {"default": 0.95, "min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "rw_cat": "settings"}], "outputFormat": [["TEXT"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: tools"}]}}, "param_plan": {"images": {"path": ["inputs", "images"], "kind": "image_array"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.topP": {"path": ["settings", "topP"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar", "omit_value": "(default)"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_openai_gpt_image_2", "name": "GPT Image 2", "model": "openai:gpt-image@2", "task_type": "imageInference", "creator": "openai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 16, "max": 3840, "step": 16, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 16, "max": 3840, "step": 16, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.openai.moderation": [["auto", "low"], {"default": "auto", "tooltip": "Content moderation level.", "rw_cat": "settings"}], "providerSettings.openai.quality": [["auto", "high", "medium", "low"], {"default": "auto", "tooltip": "Image quality level.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "providerSettings.openai.moderation": {"path": ["providerSettings", "openai", "moderation"], "kind": "scalar"}, "providerSettings.openai.quality": {"path": ["providerSettings", "openai", "quality"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_openai_gpt_5_mini", "name": "GPT-5 Mini", "model": "openai:gpt@5-mini", "task_type": "textInference", "creator": "openai", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"images": ["IMAGE"], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.maxTokens": ["INT", {"default": 32000, "min": 1, "max": 128000, "tooltip": "Maximum number of tokens to generate in the response.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.thinkingLevel": [["none", "low", "medium", "high"], {"default": "medium", "tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "outputFormat": [["TEXT", "JSON"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: jsonSchema, tools"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "images": {"path": ["inputs", "images"], "kind": "image_array"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_openai_gpt_image_1_5", "name": "GPT Image 1.5", "model": "openai:4@1", "task_type": "imageInference", "creator": "openai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.openai.background": [["auto", "opaque", "transparent"], {"default": "auto", "tooltip": "Background handling in generated images.", "rw_cat": "settings"}], "providerSettings.openai.moderation": [["auto", "low"], {"default": "auto", "tooltip": "Content moderation level.", "rw_cat": "settings"}], "providerSettings.openai.quality": [["auto", "high", "medium", "low"], {"default": "auto", "tooltip": "Image quality level.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "providerSettings.openai.background": {"path": ["providerSettings", "openai", "background"], "kind": "scalar"}, "providerSettings.openai.moderation": {"path": ["providerSettings", "openai", "moderation"], "kind": "scalar"}, "providerSettings.openai.quality": {"path": ["providerSettings", "openai", "quality"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_openai_gpt_5_5", "name": "GPT-5.5", "model": "openai:gpt@5.5", "task_type": "textInference", "creator": "openai", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"images": ["IMAGE"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.maxTokens": ["INT", {"default": 4096, "min": 1, "max": 128000, "tooltip": "Maximum number of tokens to generate in the response.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.thinkingLevel": [["none", "low", "medium", "high", "xhigh"], {"default": "medium", "tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "outputFormat": [["TEXT", "JSON"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: jsonSchema, tools"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "images": {"path": ["inputs", "images"], "kind": "image_array"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_openai_sora_2_pro", "name": "Sora 2 Pro", "model": "openai:3@2", "task_type": "videoInference", "creator": "openai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "duration": [["(default)", 4, 8, 12, 16, 20], {"tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "videoId": ["STRING", {"tooltip": "ID of a previously generated video. Used for remixing or extending.", "default": "", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "videoId": {"path": ["inputs", "videoId"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar", "omit_value": "(default)"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_openai_gpt_5_4_mini", "name": "GPT-5.4 Mini", "model": "openai:gpt@5.4-mini", "task_type": "textInference", "creator": "openai", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"images": ["IMAGE"], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.maxTokens": ["INT", {"default": 4096, "min": 1, "max": 128000, "tooltip": "Maximum number of tokens to generate in the response.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "settings.thinkingLevel": [["(default)", "low", "medium", "high", "xhigh"], {"tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "default": "(default)", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "settings.topP": ["FLOAT", {"default": 0.95, "min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "rw_cat": "settings"}], "outputFormat": [["TEXT"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: tools"}]}}, "param_plan": {"images": {"path": ["inputs", "images"], "kind": "image_array"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.topP": {"path": ["settings", "topP"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar", "omit_value": "(default)"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_openai_gpt_5_4_nano", "name": "GPT-5.4 Nano", "model": "openai:gpt@5.4-nano", "task_type": "textInference", "creator": "openai", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"images": ["IMAGE"], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.maxTokens": ["INT", {"default": 4096, "min": 1, "max": 128000, "tooltip": "Maximum number of tokens to generate in the response.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "settings.thinkingLevel": [["(default)", "low", "medium", "high", "xhigh"], {"tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "default": "(default)", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "settings.topP": ["FLOAT", {"default": 0.95, "min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "rw_cat": "settings"}], "outputFormat": [["TEXT"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: tools"}]}}, "param_plan": {"images": {"path": ["inputs", "images"], "kind": "image_array"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.topP": {"path": ["settings", "topP"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar", "omit_value": "(default)"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_sourceful_riverflow_2_0_fast", "name": "Riverflow 2.0 Fast", "model": "sourceful:riverflow-2.0@fast", "task_type": "imageInference", "creator": "sourceful", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "superResolutionReferenceImages": ["IMAGE"], "size": [["None (model default)", "1K (from input)", "2K (from input)", "1K (1:1)", "1K (21:9)", "1K (16:9)", "1K (3:2)", "1K (4:3)", "1K (5:4)", "1K (4:5)", "1K (3:4)", "1K (2:3)", "1K (9:16)", "2K (1:1)", "2K (21:9)", "2K (16:9)", "2K (3:2)", "2K (4:3)", "2K (5:4)", "2K (4:5)", "2K (3:4)", "2K (2:3)", "2K (9:16)"], {"default": "1K (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "superResolutionReferenceImages": {"path": ["inputs", "superResolutionReferenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "1K (from input)": {"resolution": "1K"}, "2K (from input)": {"resolution": "2K"}, "1K (1:1)": {"width": 1024, "height": 1024}, "1K (21:9)": {"width": 1512, "height": 648}, "1K (16:9)": {"width": 1280, "height": 720}, "1K (3:2)": {"width": 1248, "height": 832}, "1K (4:3)": {"width": 1152, "height": 864}, "1K (5:4)": {"width": 1120, "height": 896}, "1K (4:5)": {"width": 896, "height": 1120}, "1K (3:4)": {"width": 864, "height": 1152}, "1K (2:3)": {"width": 832, "height": 1248}, "1K (9:16)": {"width": 720, "height": 1280}, "2K (1:1)": {"width": 2048, "height": 2048}, "2K (21:9)": {"width": 3024, "height": 1296}, "2K (16:9)": {"width": 2560, "height": 1440}, "2K (3:2)": {"width": 2496, "height": 1664}, "2K (4:3)": {"width": 2304, "height": 1728}, "2K (5:4)": {"width": 2240, "height": 1792}, "2K (4:5)": {"width": 1792, "height": 2240}, "2K (3:4)": {"width": 1728, "height": 2304}, "2K (2:3)": {"width": 1664, "height": 2496}, "2K (9:16)": {"width": 1440, "height": 2560}}}}}, {"key": "Runware_sourceful_riverflow_2_5_fast", "name": "Riverflow 2.5 Fast", "model": "sourceful:riverflow-2.5@fast", "task_type": "imageInference", "creator": "sourceful", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "size": [["None (model default)", "1K (from input)", "2K (from input)", "1K (1:1)", "1K (21:9)", "1K (16:9)", "1K (3:2)", "1K (4:3)", "1K (5:4)", "1K (4:5)", "1K (3:4)", "1K (2:3)", "1K (9:16)", "2K (1:1)", "2K (21:9)", "2K (16:9)", "2K (3:2)", "2K (4:3)", "2K (5:4)", "2K (4:5)", "2K (3:4)", "2K (2:3)", "2K (9:16)"], {"default": "1K (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.backgroundColor": ["STRING", {"tooltip": "Hex color composited when backgroundMode is solid.", "default": "", "rw_cat": "settings"}], "settings.backgroundMode": [["original", "transparent", "solid"], {"default": "original", "tooltip": "Background handling mode for the final output.", "rw_cat": "settings"}], "settings.enhancePrompt": ["BOOLEAN", {"default": false, "tooltip": "Enhance the prompt with use-case context before generation.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "settings.scoringPrompt": ["STRING", {"tooltip": "Free-text quality rubric used when scoring candidate outputs.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.thinkingLevel": [["low", "medium", "high"], {"default": "medium", "tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.fonts, settings.scoringRubric"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "settings.backgroundColor": {"path": ["settings", "backgroundColor"], "kind": "scalar", "omit_empty": true}, "settings.backgroundMode": {"path": ["settings", "backgroundMode"], "kind": "scalar"}, "settings.enhancePrompt": {"path": ["settings", "enhancePrompt"], "kind": "scalar", "omit_value": false}, "settings.scoringPrompt": {"path": ["settings", "scoringPrompt"], "kind": "scalar", "omit_empty": true}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "1K (from input)": {"resolution": "1K"}, "2K (from input)": {"resolution": "2K"}, "1K (1:1)": {"width": 1024, "height": 1024}, "1K (21:9)": {"width": 1344, "height": 576}, "1K (16:9)": {"width": 1024, "height": 576}, "1K (3:2)": {"width": 1152, "height": 768}, "1K (4:3)": {"width": 1024, "height": 768}, "1K (5:4)": {"width": 960, "height": 768}, "1K (4:5)": {"width": 768, "height": 960}, "1K (3:4)": {"width": 768, "height": 1024}, "1K (2:3)": {"width": 768, "height": 1152}, "1K (9:16)": {"width": 576, "height": 1024}, "2K (1:1)": {"width": 2048, "height": 2048}, "2K (21:9)": {"width": 2688, "height": 1152}, "2K (16:9)": {"width": 2048, "height": 1152}, "2K (3:2)": {"width": 2304, "height": 1536}, "2K (4:3)": {"width": 2048, "height": 1536}, "2K (5:4)": {"width": 1920, "height": 1536}, "2K (4:5)": {"width": 1536, "height": 1920}, "2K (3:4)": {"width": 1536, "height": 2048}, "2K (2:3)": {"width": 1536, "height": 2304}, "2K (9:16)": {"width": 1152, "height": 2048}}}}}, {"key": "Runware_sourceful_riverflow_2_5_pro", "name": "Riverflow 2.5 Pro", "model": "sourceful:riverflow-2.5@pro", "task_type": "imageInference", "creator": "sourceful", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "size": [["None (model default)", "1K (from input)", "2K (from input)", "4K (from input)", "1K (1:1)", "1K (21:9)", "1K (16:9)", "1K (3:2)", "1K (4:3)", "1K (5:4)", "1K (4:5)", "1K (3:4)", "1K (2:3)", "1K (9:16)", "2K (1:1)", "2K (21:9)", "2K (16:9)", "2K (3:2)", "2K (4:3)", "2K (5:4)", "2K (4:5)", "2K (3:4)", "2K (2:3)", "2K (9:16)", "4K (1:1)", "4K (21:9)", "4K (16:9)", "4K (3:2)", "4K (4:3)", "4K (5:4)", "4K (4:5)", "4K (3:4)", "4K (2:3)", "4K (9:16)"], {"default": "1K (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.backgroundColor": ["STRING", {"tooltip": "Hex color composited when backgroundMode is solid.", "default": "", "rw_cat": "settings"}], "settings.backgroundMode": [["original", "transparent", "solid"], {"default": "original", "tooltip": "Background handling mode for the final output.", "rw_cat": "settings"}], "settings.enhancePrompt": ["BOOLEAN", {"default": false, "tooltip": "Enhance the prompt with use-case context before generation.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "settings.scoringPrompt": ["STRING", {"tooltip": "Free-text quality rubric used when scoring candidate outputs.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.thinkingLevel": [["low", "medium", "high", "xhigh"], {"default": "medium", "tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.fonts, settings.scoringRubric"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "settings.backgroundColor": {"path": ["settings", "backgroundColor"], "kind": "scalar", "omit_empty": true}, "settings.backgroundMode": {"path": ["settings", "backgroundMode"], "kind": "scalar"}, "settings.enhancePrompt": {"path": ["settings", "enhancePrompt"], "kind": "scalar", "omit_value": false}, "settings.scoringPrompt": {"path": ["settings", "scoringPrompt"], "kind": "scalar", "omit_empty": true}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "1K (from input)": {"resolution": "1K"}, "2K (from input)": {"resolution": "2K"}, "4K (from input)": {"resolution": "4K"}, "1K (1:1)": {"width": 1024, "height": 1024}, "1K (21:9)": {"width": 1456, "height": 624}, "1K (16:9)": {"width": 1280, "height": 720}, "1K (3:2)": {"width": 1248, "height": 832}, "1K (4:3)": {"width": 1152, "height": 864}, "1K (5:4)": {"width": 1120, "height": 896}, "1K (4:5)": {"width": 896, "height": 1120}, "1K (3:4)": {"width": 864, "height": 1152}, "1K (2:3)": {"width": 832, "height": 1248}, "1K (9:16)": {"width": 720, "height": 1280}, "2K (1:1)": {"width": 2048, "height": 2048}, "2K (21:9)": {"width": 3024, "height": 1296}, "2K (16:9)": {"width": 2560, "height": 1440}, "2K (3:2)": {"width": 2496, "height": 1664}, "2K (4:3)": {"width": 2304, "height": 1728}, "2K (5:4)": {"width": 2240, "height": 1792}, "2K (4:5)": {"width": 1792, "height": 2240}, "2K (3:4)": {"width": 1728, "height": 2304}, "2K (2:3)": {"width": 1664, "height": 2496}, "2K (9:16)": {"width": 1440, "height": 2560}, "4K (1:1)": {"width": 2880, "height": 2880}, "4K (21:9)": {"width": 3808, "height": 1632}, "4K (16:9)": {"width": 3840, "height": 2160}, "4K (3:2)": {"width": 3504, "height": 2336}, "4K (4:3)": {"width": 3264, "height": 2448}, "4K (5:4)": {"width": 3200, "height": 2560}, "4K (4:5)": {"width": 2560, "height": 3200}, "4K (3:4)": {"width": 2448, "height": 3264}, "4K (2:3)": {"width": 2336, "height": 3504}, "4K (9:16)": {"width": 2160, "height": 3840}}}}}, {"key": "Runware_sourceful_riverflow_2_0_pro", "name": "Riverflow 2.0 Pro", "model": "sourceful:riverflow-2.0@pro", "task_type": "imageInference", "creator": "sourceful", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "superResolutionReferenceImages": ["IMAGE"], "size": [["None (model default)", "1K (from input)", "2K (from input)", "4K (from input)", "1K (1:1)", "1K (21:9)", "1K (16:9)", "1K (3:2)", "1K (4:3)", "1K (5:4)", "1K (4:5)", "1K (3:4)", "1K (2:3)", "1K (9:16)", "2K (1:1)", "2K (21:9)", "2K (16:9)", "2K (3:2)", "2K (4:3)", "2K (5:4)", "2K (4:5)", "2K (3:4)", "2K (2:3)", "2K (9:16)", "4K (1:1)", "4K (21:9)", "4K (16:9)", "4K (3:2)", "4K (4:3)", "4K (5:4)", "4K (4:5)", "4K (3:4)", "4K (2:3)", "4K (9:16)"], {"default": "1K (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "superResolutionReferenceImages": {"path": ["inputs", "superResolutionReferenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "1K (from input)": {"resolution": "1K"}, "2K (from input)": {"resolution": "2K"}, "4K (from input)": {"resolution": "4K"}, "1K (1:1)": {"width": 1024, "height": 1024}, "1K (21:9)": {"width": 1512, "height": 648}, "1K (16:9)": {"width": 1280, "height": 720}, "1K (3:2)": {"width": 1248, "height": 832}, "1K (4:3)": {"width": 1152, "height": 864}, "1K (5:4)": {"width": 1120, "height": 896}, "1K (4:5)": {"width": 896, "height": 1120}, "1K (3:4)": {"width": 864, "height": 1152}, "1K (2:3)": {"width": 832, "height": 1248}, "1K (9:16)": {"width": 720, "height": 1280}, "2K (1:1)": {"width": 2048, "height": 2048}, "2K (21:9)": {"width": 3024, "height": 1296}, "2K (16:9)": {"width": 2560, "height": 1440}, "2K (3:2)": {"width": 2496, "height": 1664}, "2K (4:3)": {"width": 2304, "height": 1728}, "2K (5:4)": {"width": 2240, "height": 1792}, "2K (4:5)": {"width": 1792, "height": 2240}, "2K (3:4)": {"width": 1728, "height": 2304}, "2K (2:3)": {"width": 1664, "height": 2496}, "2K (9:16)": {"width": 1440, "height": 2560}, "4K (1:1)": {"width": 4096, "height": 4096}, "4K (21:9)": {"width": 6048, "height": 2592}, "4K (16:9)": {"width": 5120, "height": 2880}, "4K (3:2)": {"width": 4992, "height": 3328}, "4K (4:3)": {"width": 4608, "height": 3456}, "4K (5:4)": {"width": 4480, "height": 3584}, "4K (4:5)": {"width": 3584, "height": 4480}, "4K (3:4)": {"width": 3456, "height": 4608}, "4K (2:3)": {"width": 3328, "height": 4992}, "4K (9:16)": {"width": 2880, "height": 5120}}}}}, {"key": "Runware_topazlabs_starlight_precise_2_5", "name": "Topaz Labs Starlight Precise 2.5", "model": "topazlabs:starlight-precise@2.5", "task_type": "upscale", "creator": "topazlabs", "input_types": {"required": {"video": ["STRING", {"tooltip": "Video input (UUID or URL).", "rw_cat": "core"}], "width": ["INT", {"min": 1, "max": 3840, "tooltip": "Target output width. The aspect ratio is preserved by computing an upscaling factor using the shorter edge.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 1, "max": 2160, "tooltip": "Target output height. The aspect ratio is preserved by computing an upscaling factor using the shorter edge.", "default": 1024, "rw_cat": "core"}]}, "optional": {"fps": ["BOOLEAN", {"default": false, "rw_gates": "fps_value", "tooltip": "Enable to set fps. Off uses the model's default.", "rw_cat": "core"}], "fps_value": ["FLOAT", {"min": 15, "max": 120, "tooltip": "Output frame rate. Minimum is 15 or the input video's frame rate, whichever is higher.", "default": 15.0, "rw_cat": "core"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"video": {"path": ["inputs", "video"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "fps": {"path": ["fps"], "kind": "gate", "value_key": "fps_value"}, "fps_value": {"path": ["fps"], "kind": "skip"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}}}, {"key": "Runware_microsoft_trellis_2", "name": "TRELLIS.2", "model": "microsoft:trellis-2@4b", "task_type": "3dInference", "creator": "microsoft", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "meshFile": ["STRING", {"tooltip": "3D model to re-texture (UUID or URL). Skips geometry generation and applies new textures using the reference image.", "default": "", "rw_cat": "core"}], "settings.alphaMode": [["OPAQUE", "BLEND", "MASK"], {"default": "OPAQUE", "tooltip": "Material alpha mode for the output mesh.", "rw_cat": "settings"}], "settings.decimationTarget": ["INT", {"default": 500000, "min": 5000, "max": 1000000, "tooltip": "Target polygon count for mesh simplification. Lower values produce lighter models at the cost of geometric detail.", "rw_cat": "settings"}], "settings.dracoCompression.enabled": ["BOOLEAN", {"default": false, "tooltip": "Compress the output GLB geometry with Draco.", "rw_cat": "settings"}], "settings.meshCluster.globalIterations": ["INT", {"default": 1, "min": 0, "max": 64, "tooltip": "Global iterations for chart clustering.", "rw_cat": "settings"}], "settings.shapeSlat.guidanceIntervalStart": ["FLOAT", {"default": 0.6, "min": 0, "max": 1, "tooltip": "Start of the sampling schedule fraction over which guidance is applied.", "rw_cat": "settings"}], "settings.sparseStructure.guidanceIntervalStart": ["FLOAT", {"default": 0.6, "min": 0, "max": 1, "tooltip": "Start of the sampling schedule fraction over which guidance is applied.", "rw_cat": "settings"}], "settings.texSlat.guidanceIntervalStart": ["FLOAT", {"default": 0.6, "min": 0, "max": 1, "tooltip": "Start of the sampling schedule fraction over which guidance is applied.", "rw_cat": "settings"}], "settings.shapeSlat.guidanceIntervalEnd": ["FLOAT", {"default": 1, "min": 0, "max": 1, "tooltip": "End of the sampling schedule fraction over which guidance is applied.", "rw_cat": "settings"}], "settings.sparseStructure.guidanceIntervalEnd": ["FLOAT", {"default": 1, "min": 0, "max": 1, "tooltip": "End of the sampling schedule fraction over which guidance is applied.", "rw_cat": "settings"}], "settings.texSlat.guidanceIntervalEnd": ["FLOAT", {"default": 0.9, "min": 0, "max": 1, "tooltip": "End of the sampling schedule fraction over which guidance is applied.", "rw_cat": "settings"}], "settings.shapeSlat.guidanceRescale": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "tooltip": "Dampens oversaturation from high guidance values. Lower values apply more correction.", "rw_cat": "settings"}], "settings.sparseStructure.guidanceRescale": ["FLOAT", {"default": 0.7, "min": 0, "max": 1, "tooltip": "Dampens oversaturation from high guidance values. Lower values apply more correction.", "rw_cat": "settings"}], "settings.texSlat.guidanceRescale": ["FLOAT", {"default": 0, "min": 0, "max": 1, "tooltip": "Dampens oversaturation from high guidance values. Lower values apply more correction.", "rw_cat": "settings"}], "settings.shapeSlat.guidanceStrength": ["FLOAT", {"default": 7.5, "min": 1, "max": 10, "tooltip": "How closely the output follows the input image. Higher values enforce stricter adherence to the visible geometry.", "rw_cat": "settings"}], "settings.sparseStructure.guidanceStrength": ["FLOAT", {"default": 7.5, "min": 1, "max": 10, "tooltip": "How closely the output follows the input image. Higher values enforce stricter adherence to the visible geometry.", "rw_cat": "settings"}], "settings.texSlat.guidanceStrength": ["FLOAT", {"default": 1, "min": 1, "max": 10, "tooltip": "How closely the output follows the input image. Higher values enforce stricter adherence to the visible geometry.", "rw_cat": "settings"}], "settings.dracoCompression.level": ["INT", {"default": 7, "min": 0, "max": 10, "tooltip": "Encoding effort for Draco compression. Higher values reduce file size further but encode more slowly.", "rw_cat": "settings"}], "settings.dracoCompression.quantizationNormal": ["INT", {"default": 14, "min": 8, "max": 30, "tooltip": "Quantization bits for vertex normals. Higher values produce smoother shading at the cost of file size.", "rw_cat": "settings"}], "settings.dracoCompression.quantizationPosition": ["INT", {"default": 16, "min": 8, "max": 30, "tooltip": "Quantization bits for vertex positions. Higher values preserve more positional detail at the cost of file size.", "rw_cat": "settings"}], "settings.dracoCompression.quantizationTexCoord": ["INT", {"default": 14, "min": 8, "max": 30, "tooltip": "Quantization bits for texture coordinates. Higher values keep textures sharper at UV seams at the cost of file size.", "rw_cat": "settings"}], "settings.meshCluster.refineIterations": ["INT", {"default": 0, "min": 0, "max": 64, "tooltip": "Local refinement iterations for chart clustering.", "rw_cat": "settings"}], "settings.remesh": ["BOOLEAN", {"default": true, "tooltip": "Whether to remesh the output for cleaner topology.", "rw_cat": "settings"}], "settings.remeshBand": ["FLOAT", {"default": 1, "min": 0, "max": 16, "tooltip": "Narrow-band width in voxels used for dual-contouring remeshing.", "rw_cat": "settings"}], "settings.remeshProject": ["FLOAT", {"default": 0, "min": 0, "max": 1, "tooltip": "Projection factor for snapping remeshed vertices back to the original surface.", "rw_cat": "settings"}], "settings.shapeSlat.rescaleT": ["FLOAT", {"default": 3, "min": 1, "max": 6, "tooltip": "Timestep rescaling factor for the sampling schedule. Controls how guidance strength is distributed across steps.", "rw_cat": "settings"}], "settings.sparseStructure.rescaleT": ["FLOAT", {"default": 5, "min": 1, "max": 6, "tooltip": "Timestep rescaling factor for the sampling schedule. Controls how guidance strength is distributed across steps.", "rw_cat": "settings"}], "settings.texSlat.rescaleT": ["FLOAT", {"default": 3, "min": 1, "max": 6, "tooltip": "Timestep rescaling factor for the sampling schedule. Controls how guidance strength is distributed across steps.", "rw_cat": "settings"}], "settings.resolution": [[512, 1024, 1536], {"default": 1024, "tooltip": "Voxel grid resolution for 3D generation. Higher values capture finer geometric detail.", "rw_cat": "settings"}], "settings.meshCluster.smoothStrength": ["INT", {"default": 1, "min": 0, "max": 10, "tooltip": "Smoothing strength applied during chart clustering.", "rw_cat": "settings"}], "settings.shapeSlat.steps": ["INT", {"default": 12, "min": 1, "max": 50, "tooltip": "Number of denoising steps. More steps improve quality but increase generation time.", "rw_cat": "settings"}], "settings.sparseStructure.steps": ["INT", {"default": 12, "min": 1, "max": 50, "tooltip": "Number of denoising steps. More steps improve quality but increase generation time.", "rw_cat": "settings"}], "settings.texSlat.steps": ["INT", {"default": 12, "min": 1, "max": 50, "tooltip": "Number of denoising steps. More steps improve quality but increase generation time.", "rw_cat": "settings"}], "settings.textureFormat": [["WEBP", "PNG"], {"default": "WEBP", "tooltip": "Texture format for the output mesh.", "rw_cat": "settings"}], "settings.textureSize": ["INT", {"default": 2048, "min": 1024, "max": 4096, "step": 1024, "tooltip": "Resolution of the output texture map in pixels. Higher values produce finer surface detail.", "rw_cat": "settings"}], "settings.meshCluster.thresholdConeHalfAngleRad": ["FLOAT", {"default": 1.5707963267948966, "min": 0, "max": 3.141592653589793, "tooltip": "Cone half-angle threshold in radians used during UV chart clustering.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["GLB"], {"default": "GLB", "tooltip": "File format for the generated 3D model.", "rw_cat": "output"}]}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "meshFile": {"path": ["inputs", "meshFile"], "kind": "scalar", "omit_empty": true}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.resolution": {"path": ["settings", "resolution"], "kind": "scalar"}, "settings.alphaMode": {"path": ["settings", "alphaMode"], "kind": "scalar"}, "settings.decimationTarget": {"path": ["settings", "decimationTarget"], "kind": "scalar"}, "settings.dracoCompression.enabled": {"path": ["settings", "dracoCompression", "enabled"], "kind": "scalar", "omit_value": false}, "settings.dracoCompression.level": {"path": ["settings", "dracoCompression", "level"], "kind": "scalar"}, "settings.dracoCompression.quantizationNormal": {"path": ["settings", "dracoCompression", "quantizationNormal"], "kind": "scalar"}, "settings.dracoCompression.quantizationPosition": {"path": ["settings", "dracoCompression", "quantizationPosition"], "kind": "scalar"}, "settings.dracoCompression.quantizationTexCoord": {"path": ["settings", "dracoCompression", "quantizationTexCoord"], "kind": "scalar"}, "settings.meshCluster.globalIterations": {"path": ["settings", "meshCluster", "globalIterations"], "kind": "scalar"}, "settings.meshCluster.refineIterations": {"path": ["settings", "meshCluster", "refineIterations"], "kind": "scalar"}, "settings.meshCluster.smoothStrength": {"path": ["settings", "meshCluster", "smoothStrength"], "kind": "scalar"}, "settings.meshCluster.thresholdConeHalfAngleRad": {"path": ["settings", "meshCluster", "thresholdConeHalfAngleRad"], "kind": "scalar"}, "settings.remesh": {"path": ["settings", "remesh"], "kind": "scalar"}, "settings.remeshBand": {"path": ["settings", "remeshBand"], "kind": "scalar"}, "settings.remeshProject": {"path": ["settings", "remeshProject"], "kind": "scalar"}, "settings.shapeSlat.steps": {"path": ["settings", "shapeSlat", "steps"], "kind": "scalar"}, "settings.shapeSlat.guidanceIntervalEnd": {"path": ["settings", "shapeSlat", "guidanceIntervalEnd"], "kind": "scalar"}, "settings.shapeSlat.guidanceIntervalStart": {"path": ["settings", "shapeSlat", "guidanceIntervalStart"], "kind": "scalar"}, "settings.shapeSlat.guidanceRescale": {"path": ["settings", "shapeSlat", "guidanceRescale"], "kind": "scalar"}, "settings.shapeSlat.guidanceStrength": {"path": ["settings", "shapeSlat", "guidanceStrength"], "kind": "scalar"}, "settings.shapeSlat.rescaleT": {"path": ["settings", "shapeSlat", "rescaleT"], "kind": "scalar"}, "settings.sparseStructure.steps": {"path": ["settings", "sparseStructure", "steps"], "kind": "scalar"}, "settings.sparseStructure.guidanceIntervalEnd": {"path": ["settings", "sparseStructure", "guidanceIntervalEnd"], "kind": "scalar"}, "settings.sparseStructure.guidanceIntervalStart": {"path": ["settings", "sparseStructure", "guidanceIntervalStart"], "kind": "scalar"}, "settings.sparseStructure.guidanceRescale": {"path": ["settings", "sparseStructure", "guidanceRescale"], "kind": "scalar"}, "settings.sparseStructure.guidanceStrength": {"path": ["settings", "sparseStructure", "guidanceStrength"], "kind": "scalar"}, "settings.sparseStructure.rescaleT": {"path": ["settings", "sparseStructure", "rescaleT"], "kind": "scalar"}, "settings.texSlat.steps": {"path": ["settings", "texSlat", "steps"], "kind": "scalar"}, "settings.texSlat.guidanceIntervalEnd": {"path": ["settings", "texSlat", "guidanceIntervalEnd"], "kind": "scalar"}, "settings.texSlat.guidanceIntervalStart": {"path": ["settings", "texSlat", "guidanceIntervalStart"], "kind": "scalar"}, "settings.texSlat.guidanceRescale": {"path": ["settings", "texSlat", "guidanceRescale"], "kind": "scalar"}, "settings.texSlat.guidanceStrength": {"path": ["settings", "texSlat", "guidanceStrength"], "kind": "scalar"}, "settings.texSlat.rescaleT": {"path": ["settings", "texSlat", "rescaleT"], "kind": "scalar"}, "settings.textureFormat": {"path": ["settings", "textureFormat"], "kind": "scalar"}, "settings.textureSize": {"path": ["settings", "textureSize"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}}}, {"key": "Runware_google_gemini_3_1_flash_tts", "name": "Gemini 3.1 Flash TTS", "model": "google:gemini@3.1-flash-tts", "task_type": "audioInference", "creator": "google", "input_types": {"required": {"speech": ["RUNWARE_SPEECH", {"rw_socket_fields": ["language", "text", "voice", "voices"], "rw_socket_enums": {"voice": ["Achernar", "Achird", "Algenib", "Algieba", "Alnilam", "Aoede", "Autonoe", "Callirrhoe", "Charon", "Despina", "Enceladus", "Erinome", "Fenrir", "Gacrux", "Iapetus", "Kore", "Laomedeia", "Leda", "Orus", "Puck", "Pulcherrima", "Rasalgethi", "Sadachbia", "Sadaltager", "Schedar", "Sulafat", "Umbriel", "Vindemiatrix", "Zephyr", "Zubenelgenubi"], "language": ["ar-EG", "bn-BD", "nl-NL", "en-IN", "en-US", "fr-FR", "de-DE", "hi-IN", "id-ID", "it-IT", "ja-JP", "ko-KR", "mr-IN", "pl-PL", "pt-BR", "ro-RO", "ru-RU", "es-ES", "ta-IN", "te-IN", "th-TH", "tr-TR", "uk-UA", "vi-VN", "af-ZA", "sq-AL", "am-ET", "ar-001", "hy-AM", "az-AZ", "eu-ES", "be-BY", "bg-BG", "my-MM", "ca-ES", "ceb-PH", "cmn-CN", "cmn-tw", "hr-HR", "cs-CZ", "da-DK", "en-AU", "en-GB", "et-EE", "fil-PH", "fi-FI", "fr-CA", "gl-ES", "ka-GE", "el-GR", "gu-IN", "ht-HT", "he-IL", "hu-HU", "is-IS", "jv-JV", "kn-IN", "kok-IN", "lo-LA", "la-VA", "lv-LV", "lt-LT", "lb-LU", "mk-MK", "mai-IN", "mg-MG", "ms-MY", "ml-IN", "mn-MN", "ne-NP", "nb-NO", "nn-NO", "or-IN", "ps-AF", "fa-IR", "pt-PT", "pa-IN", "sr-RS", "sd-IN", "si-LK", "sk-SK", "sl-SI", "es-419", "es-MX", "sw-KE", "sv-SE", "ur-PK"]}, "rw_cat": "inputs"}]}, "optional": {"audioSettings": ["RUNWARE_AUDIOSETTINGS"], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.temperature": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP3", "WAV", "FLAC", "OGG"], {"default": "MP3", "tooltip": "File format for the generated audio.", "rw_cat": "output"}]}}, "param_plan": {"seed": {"path": ["seed"], "kind": "scalar"}, "speech": {"path": ["speech"], "kind": "feature"}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "audioSettings": {"path": ["audioSettings"], "kind": "feature"}}}, {"key": "Runware_google_veo_3", "name": "Veo 3", "model": "google:3@0", "task_type": "videoInference", "creator": "google", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "size": [["None (model default)", "720p (from input)", "1080p (from input)", "720p (16:9)", "720p (9:16)", "1080p (16:9)", "1080p (9:16)"], {"default": "720p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 4294967295, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": [[4, 6, 8], {"default": 4, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.google.generateAudio": ["BOOLEAN", {"default": true, "tooltip": "Generate video with synchronized audio including ambient sounds and music.", "rw_cat": "settings"}], "providerSettings.google.resizeMode": [["(default)", "crop", "pad"], {"tooltip": "Resize mode for the input media.", "default": "(default)", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.google.generateAudio": {"path": ["providerSettings", "google", "generateAudio"], "kind": "scalar"}, "providerSettings.google.resizeMode": {"path": ["providerSettings", "google", "resizeMode"], "kind": "scalar", "omit_value": "(default)"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (9:16)": {"width": 720, "height": 1280}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (9:16)": {"width": 1080, "height": 1920}}}}}, {"key": "Runware_google_imagen_4_preview", "name": "Imagen 4 Preview", "model": "google:2@1", "task_type": "imageInference", "creator": "google", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_google_veo_3_1", "name": "Veo 3.1", "model": "google:3@2", "task_type": "videoInference", "creator": "google", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "frameImages": ["IMAGE"], "video": ["STRING", {"tooltip": "Video input (UUID or URL). Source video for extension.", "default": "", "rw_cat": "core"}], "size": [["None (model default)", "720p (from input)", "1080p (from input)", "4K (from input)", "720p (16:9)", "720p (9:16)", "1080p (16:9)", "1080p (9:16)", "4K (16:9)", "4K (9:16)"], {"default": "720p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 4294967295, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": [[4, 6, 7, 8], {"default": 4, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.google.generateAudio": ["BOOLEAN", {"default": true, "tooltip": "Generate video with synchronized audio including ambient sounds and music.", "rw_cat": "settings"}], "providerSettings.google.resizeMode": [["(default)", "crop", "pad"], {"tooltip": "Resize mode for the input media.", "default": "(default)", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "video": {"path": ["inputs", "video"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.google.generateAudio": {"path": ["providerSettings", "google", "generateAudio"], "kind": "scalar"}, "providerSettings.google.resizeMode": {"path": ["providerSettings", "google", "resizeMode"], "kind": "scalar", "omit_value": "(default)"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "4K (from input)": {"resolution": "4K"}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (9:16)": {"width": 720, "height": 1280}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (9:16)": {"width": 1080, "height": 1920}, "4K (16:9)": {"width": 3840, "height": 2160}, "4K (9:16)": {"width": 2160, "height": 3840}}}}}, {"key": "Runware_google_imagen_3", "name": "Imagen 3", "model": "google:1@1", "task_type": "imageInference", "creator": "google", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_google_gemini_3_5_flash", "name": "Gemini 3.5 Flash", "model": "google:gemini@3.5-flash", "task_type": "textInference", "creator": "google", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"images": ["IMAGE"], "seed": ["INT", {"min": 0, "max": 4294967295, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.frequencyPenalty": ["FLOAT", {"default": 0, "min": -2, "max": 2, "step": 0.01, "tooltip": "Penalizes tokens based on their frequency in the output so far. A value of 0.0 disables the penalty.", "rw_cat": "settings"}], "settings.maxTokens": ["INT", {"default": 65535, "min": 1, "max": 65535, "tooltip": "Maximum number of tokens to generate in the response.", "rw_cat": "settings"}], "providerSettings.google.mediaResolution": [["(default)", "low", "medium", "high"], {"tooltip": "Controls the token budget allocated to images and video frames. Higher values preserve more detail at the cost of additional tokens.", "default": "(default)", "rw_cat": "settings"}], "settings.presencePenalty": ["FLOAT", {"default": 0, "min": -2, "max": 2, "step": 0.01, "tooltip": "Encourages the model to introduce new topics. A value of 0.0 disables the penalty.", "rw_cat": "settings"}], "providerSettings.google.search": ["BOOLEAN", {"default": false, "tooltip": "Enable live web search grounding to incorporate real-world, up-to-date information into image generation.", "rw_cat": "settings"}], "providerSettings.google.searchLatitude": ["BOOLEAN", {"default": false, "rw_gates": "providerSettings.google.searchLatitude_value", "tooltip": "Enable to set providerSettings.google.searchLatitude. Off uses the model's default.", "rw_cat": "settings"}], "providerSettings.google.searchLatitude_value": ["FLOAT", {"min": -90, "max": 90, "tooltip": "Latitude for location-biased Google Search grounding.", "default": -90.0, "rw_cat": "settings"}], "providerSettings.google.searchLongitude": ["BOOLEAN", {"default": false, "rw_gates": "providerSettings.google.searchLongitude_value", "tooltip": "Enable to set providerSettings.google.searchLongitude. Off uses the model's default.", "rw_cat": "settings"}], "providerSettings.google.searchLongitude_value": ["FLOAT", {"min": -180, "max": 180, "tooltip": "Longitude for location-biased Google Search grounding.", "default": -180.0, "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "settings.thinkingLevel": [["off", "minimal", "low", "medium", "high"], {"default": "high", "tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "rw_cat": "settings"}], "providerSettings.google.thoughtSignature": ["STRING", {"tooltip": "Encrypted reasoning context returned from a previous response. Pass it back to maintain multi-turn reasoning continuity.", "multiline": true, "default": "", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "settings.topP": ["FLOAT", {"default": 0.95, "min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "rw_cat": "settings"}], "outputFormat": [["TEXT", "JSON"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.audios, inputs.documents, inputs.videos, settings.stopSequences, jsonSchema, tools"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "images": {"path": ["inputs", "images"], "kind": "image_array"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.topP": {"path": ["settings", "topP"], "kind": "scalar"}, "settings.frequencyPenalty": {"path": ["settings", "frequencyPenalty"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "settings.presencePenalty": {"path": ["settings", "presencePenalty"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar"}, "providerSettings.google.mediaResolution": {"path": ["providerSettings", "google", "mediaResolution"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.google.search": {"path": ["providerSettings", "google", "search"], "kind": "scalar", "omit_value": false}, "providerSettings.google.searchLatitude": {"path": ["providerSettings", "google", "searchLatitude"], "kind": "gate", "value_key": "providerSettings.google.searchLatitude_value"}, "providerSettings.google.searchLatitude_value": {"path": ["providerSettings", "google", "searchLatitude"], "kind": "skip"}, "providerSettings.google.searchLongitude": {"path": ["providerSettings", "google", "searchLongitude"], "kind": "gate", "value_key": "providerSettings.google.searchLongitude_value"}, "providerSettings.google.searchLongitude_value": {"path": ["providerSettings", "google", "searchLongitude"], "kind": "skip"}, "providerSettings.google.thoughtSignature": {"path": ["providerSettings", "google", "thoughtSignature"], "kind": "scalar", "omit_empty": true}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_google_veo_3_fast", "name": "Veo 3 Fast", "model": "google:3@1", "task_type": "videoInference", "creator": "google", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 4294967295, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": [[4, 6, 8], {"default": 4, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.google.generateAudio": ["BOOLEAN", {"default": true, "tooltip": "Generate video with synchronized audio including ambient sounds and music.", "rw_cat": "settings"}], "providerSettings.google.resizeMode": [["(default)", "crop", "pad"], {"tooltip": "Resize mode for the input media.", "default": "(default)", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.google.generateAudio": {"path": ["providerSettings", "google", "generateAudio"], "kind": "scalar"}, "providerSettings.google.resizeMode": {"path": ["providerSettings", "google", "resizeMode"], "kind": "scalar", "omit_value": "(default)"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_google_veo_2", "name": "Veo 2", "model": "google:2@0", "task_type": "videoInference", "creator": "google", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "video": ["STRING", {"tooltip": "Video input (UUID or URL). Source video for extension.", "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 4294967295, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": [[5, 6, 7, 8], {"default": 5, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.google.enhancePrompt": ["BOOLEAN", {"default": true, "tooltip": "Enable automatic prompt enhancement. Affects reproducibility.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "video": {"path": ["inputs", "video"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.google.enhancePrompt": {"path": ["providerSettings", "google", "enhancePrompt"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_google_nano_banana_2", "name": "Nano Banana 2", "model": "google:4@3", "task_type": "imageInference", "creator": "google", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "referenceVideos": ["RUNWARE_REFERENCEVIDEOS"], "watermark": ["RUNWARE_WATERMARK"], "size": [["None (model default)", "0.5K (from input)", "1K (from input)", "2K (from input)", "4K (from input)", "0.5K (1:1)", "0.5K (3:2)", "0.5K (2:3)", "0.5K (4:3)", "0.5K (3:4)", "0.5K (4:5)", "0.5K (5:4)", "0.5K (9:16)", "0.5K (16:9)", "0.5K (21:9)", "0.5K (4:1)", "0.5K (1:4)", "0.5K (8:1)", "0.5K (1:8)", "1K (1:1)", "1K (3:2)", "1K (2:3)", "1K (4:3)", "1K (3:4)", "1K (4:5)", "1K (5:4)", "1K (9:16)", "1K (16:9)", "1K (21:9)", "1K (4:1)", "1K (1:4)", "1K (8:1)", "1K (1:8)", "2K (1:1)", "2K (3:2)", "2K (2:3)", "2K (4:3)", "2K (3:4)", "2K (4:5)", "2K (5:4)", "2K (9:16)", "2K (16:9)", "2K (21:9)", "2K (4:1)", "2K (1:4)", "2K (8:1)", "2K (1:8)", "4K (1:1)", "4K (3:2)", "4K (2:3)", "4K (4:3)", "4K (3:4)", "4K (4:5)", "4K (5:4)", "4K (9:16)", "4K (16:9)", "4K (21:9)", "4K (4:1)", "4K (1:4)", "4K (8:1)", "4K (1:8)"], {"default": "0.5K (1:1)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.google.imageSearch": ["BOOLEAN", {"default": false, "tooltip": "Enable image search grounding to incorporate visual references from the web into image generation.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.google.safetyTolerance": [["high", "medium", "low", "none", "off"], {"default": "none", "tooltip": "Safety filter tolerance level. Use `off` to use Google's defaults.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.temperature": ["BOOLEAN", {"default": false, "rw_gates": "settings.temperature_value", "tooltip": "Enable to set settings.temperature. Off uses the model's default.", "rw_cat": "settings"}], "settings.temperature_value": ["FLOAT", {"min": 0, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "default": 0.0, "rw_cat": "settings"}], "settings.thinking": [["(default)", "MINIMAL", "HIGH"], {"tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "default": "(default)", "rw_cat": "settings"}], "settings.topP": ["BOOLEAN", {"default": false, "rw_gates": "settings.topP_value", "tooltip": "Enable to set settings.topP. Off uses the model's default.", "rw_cat": "settings"}], "settings.topP_value": ["FLOAT", {"min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "default": 0.0, "rw_cat": "settings"}], "providerSettings.google.webSearch": ["BOOLEAN", {"default": false, "tooltip": "Enable live web search grounding to incorporate real-world, up-to-date information into image generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "referenceVideos": {"path": ["inputs", "referenceVideos"], "kind": "feature"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "gate", "value_key": "settings.temperature_value"}, "settings.temperature_value": {"path": ["settings", "temperature"], "kind": "skip"}, "settings.topP": {"path": ["settings", "topP"], "kind": "gate", "value_key": "settings.topP_value"}, "settings.topP_value": {"path": ["settings", "topP"], "kind": "skip"}, "settings.thinking": {"path": ["settings", "thinking"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.google.imageSearch": {"path": ["providerSettings", "google", "imageSearch"], "kind": "scalar", "omit_value": false}, "providerSettings.google.safetyTolerance": {"path": ["providerSettings", "google", "safetyTolerance"], "kind": "scalar"}, "providerSettings.google.webSearch": {"path": ["providerSettings", "google", "webSearch"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "0.5K (from input)": {"resolution": "0.5K"}, "1K (from input)": {"resolution": "1K"}, "2K (from input)": {"resolution": "2K"}, "4K (from input)": {"resolution": "4K"}, "0.5K (1:1)": {"width": 512, "height": 512}, "0.5K (3:2)": {"width": 632, "height": 424}, "0.5K (2:3)": {"width": 424, "height": 632}, "0.5K (4:3)": {"width": 600, "height": 448}, "0.5K (3:4)": {"width": 448, "height": 600}, "0.5K (4:5)": {"width": 464, "height": 576}, "0.5K (5:4)": {"width": 576, "height": 464}, "0.5K (9:16)": {"width": 384, "height": 688}, "0.5K (16:9)": {"width": 688, "height": 384}, "0.5K (21:9)": {"width": 792, "height": 168}, "0.5K (4:1)": {"width": 1024, "height": 256}, "0.5K (1:4)": {"width": 256, "height": 1024}, "0.5K (8:1)": {"width": 1536, "height": 192}, "0.5K (1:8)": {"width": 192, "height": 1536}, "1K (1:1)": {"width": 1024, "height": 1024}, "1K (3:2)": {"width": 1264, "height": 848}, "1K (2:3)": {"width": 848, "height": 1264}, "1K (4:3)": {"width": 1200, "height": 896}, "1K (3:4)": {"width": 896, "height": 1200}, "1K (4:5)": {"width": 928, "height": 1152}, "1K (5:4)": {"width": 1152, "height": 928}, "1K (9:16)": {"width": 768, "height": 1376}, "1K (16:9)": {"width": 1376, "height": 768}, "1K (21:9)": {"width": 1584, "height": 672}, "1K (4:1)": {"width": 2048, "height": 512}, "1K (1:4)": {"width": 512, "height": 2048}, "1K (8:1)": {"width": 3072, "height": 384}, "1K (1:8)": {"width": 384, "height": 3072}, "2K (1:1)": {"width": 2048, "height": 2048}, "2K (3:2)": {"width": 2528, "height": 1696}, "2K (2:3)": {"width": 1696, "height": 2528}, "2K (4:3)": {"width": 2400, "height": 1792}, "2K (3:4)": {"width": 1792, "height": 2400}, "2K (4:5)": {"width": 1856, "height": 2304}, "2K (5:4)": {"width": 2304, "height": 1856}, "2K (9:16)": {"width": 1536, "height": 2752}, "2K (16:9)": {"width": 2752, "height": 1536}, "2K (21:9)": {"width": 3168, "height": 1344}, "2K (4:1)": {"width": 4096, "height": 1024}, "2K (1:4)": {"width": 1024, "height": 4096}, "2K (8:1)": {"width": 6144, "height": 768}, "2K (1:8)": {"width": 768, "height": 6144}, "4K (1:1)": {"width": 4096, "height": 4096}, "4K (3:2)": {"width": 5056, "height": 3392}, "4K (2:3)": {"width": 3392, "height": 5056}, "4K (4:3)": {"width": 4800, "height": 3584}, "4K (3:4)": {"width": 3584, "height": 4800}, "4K (4:5)": {"width": 3712, "height": 4608}, "4K (5:4)": {"width": 4608, "height": 3712}, "4K (9:16)": {"width": 3072, "height": 5504}, "4K (16:9)": {"width": 5504, "height": 3072}, "4K (21:9)": {"width": 6336, "height": 2688}, "4K (4:1)": {"width": 8192, "height": 2048}, "4K (1:4)": {"width": 2048, "height": 8192}, "4K (8:1)": {"width": 12288, "height": 1536}, "4K (1:8)": {"width": 1536, "height": 12288}}}}}, {"key": "Runware_google_gemini_3_1_flash_lite", "name": "Gemini 3.1 Flash Lite", "model": "google:gemini@3.1-flash-lite", "task_type": "textInference", "creator": "google", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"images": ["IMAGE"], "seed": ["INT", {"min": 0, "max": 4294967295, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.maxTokens": ["INT", {"default": 4096, "min": 1, "max": 65536, "tooltip": "Maximum number of tokens to generate in the response.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "settings.thinkingLevel": [["minimal", "low", "medium", "high"], {"default": "high", "tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "settings.topP": ["FLOAT", {"default": 0.95, "min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "rw_cat": "settings"}], "outputFormat": [["TEXT"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.audios, inputs.documents, inputs.videos, settings.stopSequences, tools"}]}}, "param_plan": {"images": {"path": ["inputs", "images"], "kind": "image_array"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.topP": {"path": ["settings", "topP"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_google_veo_3_1_fast", "name": "Veo 3.1 Fast", "model": "google:3@3", "task_type": "videoInference", "creator": "google", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "frameImages": ["IMAGE"], "video": ["STRING", {"tooltip": "Video input (UUID or URL). Source video for extension.", "default": "", "rw_cat": "core"}], "size": [["None (model default)", "720p (from input)", "1080p (from input)", "4K (from input)", "720p (16:9)", "720p (9:16)", "1080p (16:9)", "1080p (9:16)", "4K (16:9)", "4K (9:16)"], {"default": "720p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 4294967295, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": [[4, 6, 7, 8], {"default": 4, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.google.generateAudio": ["BOOLEAN", {"default": true, "tooltip": "Generate video with synchronized audio including ambient sounds and music.", "rw_cat": "settings"}], "providerSettings.google.resizeMode": [["(default)", "crop", "pad"], {"tooltip": "Resize mode for the input media.", "default": "(default)", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "video": {"path": ["inputs", "video"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.google.generateAudio": {"path": ["providerSettings", "google", "generateAudio"], "kind": "scalar"}, "providerSettings.google.resizeMode": {"path": ["providerSettings", "google", "resizeMode"], "kind": "scalar", "omit_value": "(default)"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "4K (from input)": {"resolution": "4K"}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (9:16)": {"width": 720, "height": 1280}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (9:16)": {"width": 1080, "height": 1920}, "4K (16:9)": {"width": 3840, "height": 2160}, "4K (9:16)": {"width": 2160, "height": 3840}}}}}, {"key": "Runware_google_gemini_3_flash", "name": "Gemini 3 Flash", "model": "google:gemini@3-flash", "task_type": "textInference", "creator": "google", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"images": ["IMAGE"], "seed": ["INT", {"min": 0, "max": 4294967295, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.maxTokens": ["INT", {"default": 4096, "min": 1, "max": 65536, "tooltip": "Maximum number of tokens to generate in the response.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "settings.thinkingLevel": [["minimal", "low", "medium", "high"], {"default": "high", "tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "settings.topP": ["FLOAT", {"default": 0.95, "min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "rw_cat": "settings"}], "outputFormat": [["TEXT"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.audios, inputs.documents, inputs.videos, settings.stopSequences, tools"}]}}, "param_plan": {"images": {"path": ["inputs", "images"], "kind": "image_array"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.topP": {"path": ["settings", "topP"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_google_nano_banana_pro", "name": "Nano Banana Pro", "model": "google:4@2", "task_type": "imageInference", "creator": "google", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "size": [["None (model default)", "1K (from input)", "2K (from input)", "4K (from input)", "1K (1:1)", "1K (3:2)", "1K (2:3)", "1K (4:3)", "1K (3:4)", "1K (4:5)", "1K (5:4)", "1K (9:16)", "1K (16:9)", "1K (21:9)", "2K (1:1)", "2K (3:2)", "2K (2:3)", "2K (4:3)", "2K (3:4)", "2K (4:5)", "2K (5:4)", "2K (9:16)", "2K (16:9)", "2K (21:9)", "4K (1:1)", "4K (3:2)", "4K (2:3)", "4K (4:3)", "4K (3:4)", "4K (4:5)", "4K (5:4)", "4K (9:16)", "4K (16:9)", "4K (21:9)"], {"default": "1K (1:1)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.google.safetyTolerance": [["high", "medium", "low", "none", "off"], {"default": "none", "tooltip": "Safety filter tolerance level. Use `off` to use Google's defaults.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.temperature": ["BOOLEAN", {"default": false, "rw_gates": "settings.temperature_value", "tooltip": "Enable to set settings.temperature. Off uses the model's default.", "rw_cat": "settings"}], "settings.temperature_value": ["FLOAT", {"min": 0, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "default": 0.0, "rw_cat": "settings"}], "settings.topP": ["BOOLEAN", {"default": false, "rw_gates": "settings.topP_value", "tooltip": "Enable to set settings.topP. Off uses the model's default.", "rw_cat": "settings"}], "settings.topP_value": ["FLOAT", {"min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "default": 0.0, "rw_cat": "settings"}], "providerSettings.google.webSearch": ["BOOLEAN", {"default": false, "tooltip": "Enable live web search grounding to incorporate real-world, up-to-date information into image generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "gate", "value_key": "settings.temperature_value"}, "settings.temperature_value": {"path": ["settings", "temperature"], "kind": "skip"}, "settings.topP": {"path": ["settings", "topP"], "kind": "gate", "value_key": "settings.topP_value"}, "settings.topP_value": {"path": ["settings", "topP"], "kind": "skip"}, "providerSettings.google.safetyTolerance": {"path": ["providerSettings", "google", "safetyTolerance"], "kind": "scalar"}, "providerSettings.google.webSearch": {"path": ["providerSettings", "google", "webSearch"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "1K (from input)": {"resolution": "1K"}, "2K (from input)": {"resolution": "2K"}, "4K (from input)": {"resolution": "4K"}, "1K (1:1)": {"width": 1024, "height": 1024}, "1K (3:2)": {"width": 1264, "height": 848}, "1K (2:3)": {"width": 848, "height": 1264}, "1K (4:3)": {"width": 1200, "height": 896}, "1K (3:4)": {"width": 896, "height": 1200}, "1K (4:5)": {"width": 928, "height": 1152}, "1K (5:4)": {"width": 1152, "height": 928}, "1K (9:16)": {"width": 768, "height": 1376}, "1K (16:9)": {"width": 1376, "height": 768}, "1K (21:9)": {"width": 1548, "height": 672}, "2K (1:1)": {"width": 2048, "height": 2048}, "2K (3:2)": {"width": 2528, "height": 1696}, "2K (2:3)": {"width": 1696, "height": 2528}, "2K (4:3)": {"width": 2400, "height": 1792}, "2K (3:4)": {"width": 1792, "height": 2400}, "2K (4:5)": {"width": 1856, "height": 2304}, "2K (5:4)": {"width": 2304, "height": 1856}, "2K (9:16)": {"width": 1536, "height": 2752}, "2K (16:9)": {"width": 2752, "height": 1536}, "2K (21:9)": {"width": 3168, "height": 1344}, "4K (1:1)": {"width": 4096, "height": 4096}, "4K (3:2)": {"width": 5056, "height": 3392}, "4K (2:3)": {"width": 3392, "height": 5056}, "4K (4:3)": {"width": 4800, "height": 3584}, "4K (3:4)": {"width": 3584, "height": 4800}, "4K (4:5)": {"width": 3712, "height": 4608}, "4K (5:4)": {"width": 4608, "height": 3712}, "4K (9:16)": {"width": 3072, "height": 5504}, "4K (16:9)": {"width": 5504, "height": 3072}, "4K (21:9)": {"width": 6336, "height": 2688}}}}}, {"key": "Runware_google_nano_banana_2_lite", "name": "Nano Banana 2 Lite", "model": "google:nano-banana@2-lite", "task_type": "imageInference", "creator": "google", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "referenceVideos": ["RUNWARE_REFERENCEVIDEOS"], "watermark": ["RUNWARE_WATERMARK"], "size": [["None (model default)", "1K (from input)", "1K (1:1)", "1K (3:2)", "1K (2:3)", "1K (4:3)", "1K (3:4)", "1K (4:5)", "1K (5:4)", "1K (9:16)", "1K (16:9)", "1K (21:9)", "1K (4:1)", "1K (1:4)", "1K (8:1)", "1K (1:8)"], {"default": "1K (1:1)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 2147483647, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.google.safetyTolerance": [["high", "medium", "low", "none", "off"], {"default": "none", "tooltip": "Safety filter tolerance level. Use `off` to use Google's defaults.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "settings.thinking": [["(default)", "MINIMAL", "HIGH"], {"tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "default": "(default)", "rw_cat": "settings"}], "settings.topP": ["FLOAT", {"default": 0.95, "min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "referenceVideos": {"path": ["inputs", "referenceVideos"], "kind": "feature"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.topP": {"path": ["settings", "topP"], "kind": "scalar"}, "settings.thinking": {"path": ["settings", "thinking"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.google.safetyTolerance": {"path": ["providerSettings", "google", "safetyTolerance"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "1K (from input)": {"resolution": "1K"}, "1K (1:1)": {"width": 1024, "height": 1024}, "1K (3:2)": {"width": 1264, "height": 848}, "1K (2:3)": {"width": 848, "height": 1264}, "1K (4:3)": {"width": 1200, "height": 896}, "1K (3:4)": {"width": 896, "height": 1200}, "1K (4:5)": {"width": 928, "height": 1152}, "1K (5:4)": {"width": 1152, "height": 928}, "1K (9:16)": {"width": 768, "height": 1376}, "1K (16:9)": {"width": 1376, "height": 768}, "1K (21:9)": {"width": 1584, "height": 672}, "1K (4:1)": {"width": 2048, "height": 512}, "1K (1:4)": {"width": 512, "height": 2048}, "1K (8:1)": {"width": 3072, "height": 384}, "1K (1:8)": {"width": 384, "height": 3072}}}}}, {"key": "Runware_google_nano_banana", "name": "Nano Banana", "model": "google:4@1", "task_type": "imageInference", "creator": "google", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "providerSettings.google.safetyTolerance": [["high", "medium", "low", "none", "off"], {"default": "none", "tooltip": "Safety filter tolerance level. Use `off` to use Google's defaults.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.temperature": ["BOOLEAN", {"default": false, "rw_gates": "settings.temperature_value", "tooltip": "Enable to set settings.temperature. Off uses the model's default.", "rw_cat": "settings"}], "settings.temperature_value": ["FLOAT", {"min": 0, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "default": 0.0, "rw_cat": "settings"}], "settings.topP": ["BOOLEAN", {"default": false, "rw_gates": "settings.topP_value", "tooltip": "Enable to set settings.topP. Off uses the model's default.", "rw_cat": "settings"}], "settings.topP_value": ["FLOAT", {"min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "default": 0.0, "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "gate", "value_key": "settings.temperature_value"}, "settings.temperature_value": {"path": ["settings", "temperature"], "kind": "skip"}, "settings.topP": {"path": ["settings", "topP"], "kind": "gate", "value_key": "settings.topP_value"}, "settings.topP_value": {"path": ["settings", "topP"], "kind": "skip"}, "providerSettings.google.safetyTolerance": {"path": ["providerSettings", "google", "safetyTolerance"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_google_veo_3_1_lite", "name": "Veo 3.1 Lite", "model": "google:veo@3.1-lite", "task_type": "videoInference", "creator": "google", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "size": [["None (model default)", "720p (from input)", "1080p (from input)", "720p (16:9)", "720p (9:16)", "1080p (16:9)", "1080p (9:16)"], {"default": "720p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "seed": ["INT", {"min": 0, "max": 4294967295, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": [[4, 6, 8], {"default": 4, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.google.generateAudio": ["BOOLEAN", {"default": true, "tooltip": "Generate video with synchronized audio including ambient sounds and music.", "rw_cat": "settings"}], "providerSettings.google.personGeneration": [["dont_allow", "allow_adult", "allow_all"], {"default": "allow_all", "tooltip": "Controls whether people can appear in the generated video.", "rw_cat": "settings"}], "providerSettings.google.resizeMode": [["(default)", "crop", "pad"], {"tooltip": "Resize mode for the input media.", "default": "(default)", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.google.generateAudio": {"path": ["providerSettings", "google", "generateAudio"], "kind": "scalar"}, "providerSettings.google.personGeneration": {"path": ["providerSettings", "google", "personGeneration"], "kind": "scalar"}, "providerSettings.google.resizeMode": {"path": ["providerSettings", "google", "resizeMode"], "kind": "scalar", "omit_value": "(default)"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (9:16)": {"width": 720, "height": 1280}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (9:16)": {"width": 1080, "height": 1920}}}}}, {"key": "Runware_google_gemini_3_1_pro", "name": "Gemini 3.1 Pro", "model": "google:gemini@3.1-pro", "task_type": "textInference", "creator": "google", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"images": ["IMAGE"], "seed": ["INT", {"min": 0, "max": 4294967295, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.maxTokens": ["INT", {"default": 4096, "min": 1, "max": 128000, "tooltip": "Maximum number of tokens to generate in the response.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "settings.thinkingLevel": [["low", "medium", "high"], {"default": "high", "tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "settings.topP": ["BOOLEAN", {"default": false, "rw_gates": "settings.topP_value", "tooltip": "Enable to set settings.topP. Off uses the model's default.", "rw_cat": "settings"}], "settings.topP_value": ["FLOAT", {"min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "default": 0.0, "rw_cat": "settings"}], "outputFormat": [["TEXT"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.audios, inputs.documents, inputs.videos, settings.stopSequences, tools"}]}}, "param_plan": {"images": {"path": ["inputs", "images"], "kind": "image_array"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.topP": {"path": ["settings", "topP"], "kind": "gate", "value_key": "settings.topP_value"}, "settings.topP_value": {"path": ["settings", "topP"], "kind": "skip"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_google_imagen_4_fast", "name": "Imagen 4 Fast", "model": "google:2@3", "task_type": "imageInference", "creator": "google", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_google_gemma_4_31b", "name": "Gemma 4 31B", "model": "google:gemma@4-31b", "task_type": "textInference", "creator": "google", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"images": ["IMAGE"], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.frequencyPenalty": ["FLOAT", {"default": 0, "min": 0, "max": 2, "step": 0.01, "tooltip": "Penalizes tokens based on their frequency in the output so far. A value of 0.0 disables the penalty.", "rw_cat": "settings"}], "settings.maxTokens": ["BOOLEAN", {"default": false, "rw_gates": "settings.maxTokens_value", "tooltip": "Enable to set settings.maxTokens. Off uses the model's default.", "rw_cat": "settings"}], "settings.maxTokens_value": ["INT", {"min": 1, "tooltip": "Maximum number of tokens to generate in the response.", "default": 1, "rw_cat": "settings"}], "settings.minP": ["FLOAT", {"default": 0, "min": 0, "max": 1, "step": 0.01, "tooltip": "Minimum probability threshold. Tokens with probability below this value are excluded from sampling.", "rw_cat": "settings"}], "settings.presencePenalty": ["FLOAT", {"default": 0, "min": -2, "max": 2, "step": 0.01, "tooltip": "Encourages the model to introduce new topics. A value of 0.0 disables the penalty.", "rw_cat": "settings"}], "settings.repetitionPenalty": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Penalizes tokens that have already appeared in the output. A value of 1.0 disables the penalty.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.temperature": ["BOOLEAN", {"default": false, "rw_gates": "settings.temperature_value", "tooltip": "Enable to set settings.temperature. Off uses the model's default.", "rw_cat": "settings"}], "settings.temperature_value": ["FLOAT", {"min": 0, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "default": 0.0, "rw_cat": "settings"}], "settings.thinkingLevel": [["off", "high"], {"default": "high", "tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "rw_cat": "settings"}], "settings.topK": ["BOOLEAN", {"default": false, "rw_gates": "settings.topK_value", "tooltip": "Enable to set settings.topK. Off uses the model's default.", "rw_cat": "settings"}], "settings.topK_value": ["INT", {"min": 1, "max": 100, "tooltip": "Top-K sampling parameter that limits the number of highest-probability tokens considered at each step.", "default": 1, "rw_cat": "settings"}], "settings.topP": ["BOOLEAN", {"default": false, "rw_gates": "settings.topP_value", "tooltip": "Enable to set settings.topP. Off uses the model's default.", "rw_cat": "settings"}], "settings.topP_value": ["FLOAT", {"min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "default": 0.0, "rw_cat": "settings"}], "outputFormat": [["TEXT"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.videos, settings.stopSequences"}]}}, "param_plan": {"images": {"path": ["inputs", "images"], "kind": "image_array"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "gate", "value_key": "settings.temperature_value"}, "settings.temperature_value": {"path": ["settings", "temperature"], "kind": "skip"}, "settings.topP": {"path": ["settings", "topP"], "kind": "gate", "value_key": "settings.topP_value"}, "settings.topP_value": {"path": ["settings", "topP"], "kind": "skip"}, "settings.frequencyPenalty": {"path": ["settings", "frequencyPenalty"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "gate", "value_key": "settings.maxTokens_value"}, "settings.maxTokens_value": {"path": ["settings", "maxTokens"], "kind": "skip"}, "settings.minP": {"path": ["settings", "minP"], "kind": "scalar"}, "settings.presencePenalty": {"path": ["settings", "presencePenalty"], "kind": "scalar"}, "settings.repetitionPenalty": {"path": ["settings", "repetitionPenalty"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar"}, "settings.topK": {"path": ["settings", "topK"], "kind": "gate", "value_key": "settings.topK_value"}, "settings.topK_value": {"path": ["settings", "topK"], "kind": "skip"}, "messages": {"path": ["messages"], "kind": "feature"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_google_gemini_omni_flash", "name": "Gemini Omni Flash", "model": "google:gemini@omni-flash", "task_type": "videoInference", "creator": "google", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output. The output aspect ratio (`16:9`, `9:16`) and duration can also be given in the prompt as an alternative to the `width`/`height` and `duration` parameters.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "frameImages": ["IMAGE"], "video": ["STRING", {"tooltip": "Video input (UUID or URL). Source video to be edited.", "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "duration": ["BOOLEAN", {"default": false, "rw_gates": "duration_value", "tooltip": "Enable to set duration. Off uses the model's default.", "rw_cat": "core"}], "duration_value": ["INT", {"min": 3, "max": 10, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "default": 3, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "videoId": ["STRING", {"tooltip": "ID of a previously generated video. Pass it back to iterate on it in a follow-up turn, building on the earlier result.", "default": "", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "settings.topP": ["FLOAT", {"default": 0.95, "min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "video": {"path": ["inputs", "video"], "kind": "scalar", "omit_empty": true}, "videoId": {"path": ["inputs", "videoId"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "gate", "value_key": "duration_value"}, "duration_value": {"path": ["duration"], "kind": "skip"}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.topP": {"path": ["settings", "topP"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_google_imagen_3_fast", "name": "Imagen 3 Fast", "model": "google:1@2", "task_type": "imageInference", "creator": "google", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_google_imagen_4_ultra", "name": "Imagen 4 Ultra", "model": "google:2@2", "task_type": "imageInference", "creator": "google", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_veed_fabric_1_0", "name": "VEED Fabric 1.0", "model": "veed:fabric@1.0", "task_type": "videoInference", "creator": "veed", "input_types": {"required": {"image": ["IMAGE"]}, "optional": {"speech": ["RUNWARE_SPEECH", {"rw_socket_fields": ["text"], "rw_cat": "inputs"}], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "default": "", "rw_cat": "core"}], "resolution": [["(default)", "720p", "480p"], {"tooltip": "Resolution preset for the output. When used with input media, automatically matches the aspect ratio from the input.", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "settings.voiceDescription": ["STRING", {"tooltip": "Additional voice style description. The primary voice is auto-generated from the image. Use simple descriptors like 'British accent' or a detailed description.", "multiline": true, "default": "", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "audio": {"path": ["inputs", "audio"], "kind": "scalar", "omit_empty": true}, "resolution": {"path": ["resolution"], "kind": "scalar", "omit_value": "(default)"}, "speech": {"path": ["speech"], "kind": "feature"}, "settings.voiceDescription": {"path": ["settings", "voiceDescription"], "kind": "scalar", "omit_empty": true}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_klingai_1_6_pro", "name": "KlingAI 1.6 Pro", "model": "klingai:3@2", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "duration": [[5, 10], {"default": 5, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_klingai_video_2_6_standard", "name": "Kling VIDEO 2.6 Standard", "model": "klingai:kling-video@2.6-standard", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {}, "optional": {"referenceImages": ["IMAGE"], "referenceVideos": ["RUNWARE_REFERENCEVIDEOS"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.klingai.characterOrientation": [["(default)", "image", "video"], {"tooltip": "Source for character orientation reference.", "default": "(default)", "rw_cat": "settings"}], "providerSettings.klingai.keepOriginalSound": ["BOOLEAN", {"default": false, "tooltip": "Maintain the original sound from the reference video.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "referenceVideos": {"path": ["inputs", "referenceVideos"], "kind": "feature"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "providerSettings.klingai.characterOrientation": {"path": ["providerSettings", "klingai", "characterOrientation"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.klingai.keepOriginalSound": {"path": ["providerSettings", "klingai", "keepOriginalSound"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_klingai_video_3_0_omni_pro", "name": "Kling VIDEO 3.0 Omni Pro", "model": "klingai:kling-video@o3-pro", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {}, "optional": {"referenceImages": ["IMAGE"], "frameImages": ["IMAGE"], "referenceVideos": ["RUNWARE_REFERENCEVIDEOS"], "video": ["STRING", {"tooltip": "Video input (UUID or URL). Source video for prompt-based editing. Dimensions and duration match the input video.", "default": "", "rw_cat": "core"}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "size": [["None (model default)", "1080p (from input)", "1080p (16:9)", "1080p (1:1)", "1080p (9:16)"], {"default": "1080p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "duration": ["BOOLEAN", {"default": false, "rw_gates": "duration_value", "tooltip": "Enable to set duration. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "duration_value": ["INT", {"default": 5, "min": 3, "max": 15, "step": 1, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.klingai.keepOriginalSound": ["BOOLEAN", {"default": false, "tooltip": "Maintain the original sound from the reference video.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "providerSettings.klingai.sound": ["BOOLEAN", {"default": false, "tooltip": "Enable native audio generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.elements, providerSettings.klingai.multiPrompt"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "video": {"path": ["inputs", "video"], "kind": "scalar", "omit_empty": true}, "referenceVideos": {"path": ["inputs", "referenceVideos"], "kind": "feature"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "duration": {"path": ["duration"], "kind": "gate", "value_key": "duration_value"}, "duration_value": {"path": ["duration"], "kind": "skip"}, "providerSettings.klingai.keepOriginalSound": {"path": ["providerSettings", "klingai", "keepOriginalSound"], "kind": "scalar", "omit_value": false}, "providerSettings.klingai.sound": {"path": ["providerSettings", "klingai", "sound"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "1080p (from input)": {"resolution": "1080p"}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (1:1)": {"width": 1440, "height": 1440}, "1080p (9:16)": {"width": 1080, "height": 1920}}}}}, {"key": "Runware_klingai_avatar_2_0_standard", "name": "KlingAI Avatar 2.0 Standard", "model": "klingai:avatar@2.0-standard", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {"image": ["IMAGE"], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "rw_cat": "core"}]}, "optional": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "audio": {"path": ["inputs", "audio"], "kind": "scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_klingai_image_o3", "name": "Kling IMAGE O3", "model": "klingai:kling-image@o3", "task_type": "imageInference", "creator": "klingai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_klingai_video_2_6_pro", "name": "Kling VIDEO 2.6 Pro", "model": "klingai:kling-video@2.6-pro", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {}, "optional": {"referenceImages": ["IMAGE"], "frameImages": ["IMAGE"], "referenceVideos": ["RUNWARE_REFERENCEVIDEOS"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "duration": [[5, 10], {"default": 5, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.klingai.characterOrientation": [["(default)", "image", "video"], {"tooltip": "Source for character orientation reference.", "default": "(default)", "rw_cat": "settings"}], "providerSettings.klingai.keepOriginalSound": ["BOOLEAN", {"default": false, "tooltip": "Maintain the original sound from the reference video.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "providerSettings.klingai.sound": ["BOOLEAN", {"default": false, "tooltip": "Enable native audio generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "referenceVideos": {"path": ["inputs", "referenceVideos"], "kind": "feature"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "providerSettings.klingai.characterOrientation": {"path": ["providerSettings", "klingai", "characterOrientation"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.klingai.keepOriginalSound": {"path": ["providerSettings", "klingai", "keepOriginalSound"], "kind": "scalar", "omit_value": false}, "providerSettings.klingai.sound": {"path": ["providerSettings", "klingai", "sound"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_klingai_video_o1_pro", "name": "Kling VIDEO O1 Pro", "model": "klingai:kling@o1", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "frameImages": ["IMAGE"], "referenceVideos": ["RUNWARE_REFERENCEVIDEOS"], "video": ["STRING", {"tooltip": "Video input (UUID or URL). Source video for prompt-based editing. Dimensions and duration match the input video.", "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "duration": ["BOOLEAN", {"default": false, "rw_gates": "duration_value", "tooltip": "Enable to set duration. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "duration_value": ["INT", {"default": 5, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.klingai.keepOriginalSound": ["BOOLEAN", {"default": false, "tooltip": "Maintain the original sound from the reference video.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "video": {"path": ["inputs", "video"], "kind": "scalar", "omit_empty": true}, "referenceVideos": {"path": ["inputs", "referenceVideos"], "kind": "feature"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "gate", "value_key": "duration_value"}, "duration_value": {"path": ["duration"], "kind": "skip"}, "providerSettings.klingai.keepOriginalSound": {"path": ["providerSettings", "klingai", "keepOriginalSound"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_klingai_2_0_master", "name": "KlingAI 2.0 Master", "model": "klingai:4@3", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "duration": [[5, 10], {"default": 5, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_klingai_video_3_0_omni_4k", "name": "Kling VIDEO 3.0 Omni 4K", "model": "klingai:kling-video@o3-4k", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {}, "optional": {"frameImages": ["IMAGE"], "referenceVideos": ["RUNWARE_REFERENCEVIDEOS"], "video": ["STRING", {"tooltip": "Video input (UUID or URL). Source video for prompt-based editing. Dimensions and duration match the input video.", "default": "", "rw_cat": "core"}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "size": [["None (model default)", "4k (from input)", "4K (16:9)", "4K (9:16)", "4K (1:1)"], {"default": "4K (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "duration": ["BOOLEAN", {"default": false, "rw_gates": "duration_value", "tooltip": "Enable to set duration. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "duration_value": ["INT", {"default": 5, "min": 3, "max": 15, "step": 1, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.klingai.keepOriginalSound": ["BOOLEAN", {"default": false, "tooltip": "Maintain the original sound from the reference video.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "providerSettings.klingai.sound": ["BOOLEAN", {"default": false, "tooltip": "Enable native audio generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.elements, providerSettings.klingai.multiPrompt"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "video": {"path": ["inputs", "video"], "kind": "scalar", "omit_empty": true}, "referenceVideos": {"path": ["inputs", "referenceVideos"], "kind": "feature"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "duration": {"path": ["duration"], "kind": "gate", "value_key": "duration_value"}, "duration_value": {"path": ["duration"], "kind": "skip"}, "providerSettings.klingai.keepOriginalSound": {"path": ["providerSettings", "klingai", "keepOriginalSound"], "kind": "scalar", "omit_value": false}, "providerSettings.klingai.sound": {"path": ["providerSettings", "klingai", "sound"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "4k (from input)": {"resolution": "4k"}, "4K (16:9)": {"width": 3840, "height": 2160}, "4K (9:16)": {"width": 2160, "height": 3840}, "4K (1:1)": {"width": 2880, "height": 2880}}}}}, {"key": "Runware_klingai_1_5_standard", "name": "KlingAI 1.5 Standard", "model": "klingai:2@1", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {"frameImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "duration": [[5, 10], {"default": 5, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_klingai_video_3_0_pro", "name": "Kling VIDEO 3.0 Pro", "model": "klingai:kling-video@3-pro", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {}, "optional": {"referenceImages": ["IMAGE"], "frameImages": ["IMAGE"], "referenceVideos": ["RUNWARE_REFERENCEVIDEOS"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "duration": ["INT", {"default": 5, "min": 3, "max": 15, "step": 1, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.klingai.characterOrientation": [["(default)", "image", "video"], {"tooltip": "Source for character orientation reference.", "default": "(default)", "rw_cat": "settings"}], "providerSettings.klingai.keepOriginalSound": ["BOOLEAN", {"default": false, "tooltip": "Maintain the original sound from the reference video.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "providerSettings.klingai.sound": ["BOOLEAN", {"default": false, "tooltip": "Enable native audio generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.elements, providerSettings.klingai.multiPrompt"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "referenceVideos": {"path": ["inputs", "referenceVideos"], "kind": "feature"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "providerSettings.klingai.characterOrientation": {"path": ["providerSettings", "klingai", "characterOrientation"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.klingai.keepOriginalSound": {"path": ["providerSettings", "klingai", "keepOriginalSound"], "kind": "scalar", "omit_value": false}, "providerSettings.klingai.sound": {"path": ["providerSettings", "klingai", "sound"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_klingai_lip_sync", "name": "KlingAI Lip-Sync", "model": "klingai:7@1", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {"video": ["STRING", {"tooltip": "Video input (UUID or URL).", "rw_cat": "core"}], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "rw_cat": "core"}]}, "optional": {"numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.klingai.originalAudioVolume": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Volume level of original audio from input video. 0 removes the original audio completely; higher values blend it with the new synchronized audio.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "providerSettings.klingai.soundVolume": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Volume level of generated audio.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"video": {"path": ["inputs", "video"], "kind": "scalar"}, "audio": {"path": ["inputs", "audio"], "kind": "scalar"}, "providerSettings.klingai.originalAudioVolume": {"path": ["providerSettings", "klingai", "originalAudioVolume"], "kind": "scalar"}, "providerSettings.klingai.soundVolume": {"path": ["providerSettings", "klingai", "soundVolume"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_klingai_video_o1_standard", "name": "Kling VIDEO O1 Standard", "model": "klingai:kling@o1-standard", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "frameImages": ["IMAGE"], "referenceVideos": ["RUNWARE_REFERENCEVIDEOS"], "video": ["STRING", {"tooltip": "Video input (UUID or URL). Source video for prompt-based editing. Dimensions and duration match the input video.", "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "duration": ["BOOLEAN", {"default": false, "rw_gates": "duration_value", "tooltip": "Enable to set duration. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "duration_value": ["INT", {"default": 5, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.klingai.keepOriginalSound": ["BOOLEAN", {"default": false, "tooltip": "Maintain the original sound from the reference video.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "video": {"path": ["inputs", "video"], "kind": "scalar", "omit_empty": true}, "referenceVideos": {"path": ["inputs", "referenceVideos"], "kind": "feature"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "gate", "value_key": "duration_value"}, "duration_value": {"path": ["duration"], "kind": "skip"}, "providerSettings.klingai.keepOriginalSound": {"path": ["providerSettings", "klingai", "keepOriginalSound"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_klingai_video_3_0_4k", "name": "Kling VIDEO 3.0 4K", "model": "klingai:kling-video@3-4k", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {}, "optional": {"frameImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "duration": ["INT", {"default": 5, "min": 3, "max": 15, "step": 1, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "providerSettings.klingai.sound": ["BOOLEAN", {"default": false, "tooltip": "Enable native audio generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.elements, providerSettings.klingai.multiPrompt"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "providerSettings.klingai.sound": {"path": ["providerSettings", "klingai", "sound"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_klingai_1_0_standard", "name": "KlingAI 1.0 Standard", "model": "klingai:1@1", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "duration": [[5, 10], {"default": 5, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_klingai_video_3_0_omni_standard", "name": "Kling VIDEO 3.0 Omni Standard", "model": "klingai:kling-video@o3-standard", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {}, "optional": {"referenceImages": ["IMAGE"], "frameImages": ["IMAGE"], "referenceVideos": ["RUNWARE_REFERENCEVIDEOS"], "video": ["STRING", {"tooltip": "Video input (UUID or URL). Source video for prompt-based editing. Dimensions and duration match the input video.", "default": "", "rw_cat": "core"}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "size": [["None (model default)", "720p (from input)", "720p (16:9)", "960p (1:1)", "720p (9:16)"], {"default": "720p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "duration": ["BOOLEAN", {"default": false, "rw_gates": "duration_value", "tooltip": "Enable to set duration. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "duration_value": ["INT", {"default": 5, "min": 3, "max": 15, "step": 1, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.klingai.keepOriginalSound": ["BOOLEAN", {"default": false, "tooltip": "Maintain the original sound from the reference video.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "providerSettings.klingai.sound": ["BOOLEAN", {"default": false, "tooltip": "Enable native audio generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.elements, providerSettings.klingai.multiPrompt"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "video": {"path": ["inputs", "video"], "kind": "scalar", "omit_empty": true}, "referenceVideos": {"path": ["inputs", "referenceVideos"], "kind": "feature"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "duration": {"path": ["duration"], "kind": "gate", "value_key": "duration_value"}, "duration_value": {"path": ["duration"], "kind": "skip"}, "providerSettings.klingai.keepOriginalSound": {"path": ["providerSettings", "klingai", "keepOriginalSound"], "kind": "scalar", "omit_value": false}, "providerSettings.klingai.sound": {"path": ["providerSettings", "klingai", "sound"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "720p (from input)": {"resolution": "720p"}, "720p (16:9)": {"width": 1280, "height": 720}, "960p (1:1)": {"width": 960, "height": 960}, "720p (9:16)": {"width": 720, "height": 1280}}}}}, {"key": "Runware_klingai_2_5_turbo_pro", "name": "KlingAI 2.5 Turbo Pro", "model": "klingai:6@1", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "duration": [[5, 10], {"default": 5, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_klingai_1_0_pro", "name": "KlingAI 1.0 Pro", "model": "klingai:1@2", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "duration": [[5, 10], {"default": 5, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_klingai_1_5_pro", "name": "KlingAI 1.5 Pro", "model": "klingai:2@2", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {"frameImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "duration": [[5, 10], {"default": 5, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_klingai_1_6_standard", "name": "KlingAI 1.6 Standard", "model": "klingai:3@1", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "duration": [[5, 10], {"default": 5, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_klingai_2_1_standard", "name": "KlingAI 2.1 Standard", "model": "klingai:5@1", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {"frameImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "duration": [[5, 10], {"default": 5, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_klingai_video_3_0_standard", "name": "Kling VIDEO 3.0 Standard", "model": "klingai:kling-video@3-standard", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {}, "optional": {"referenceImages": ["IMAGE"], "frameImages": ["IMAGE"], "referenceVideos": ["RUNWARE_REFERENCEVIDEOS"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "duration": ["INT", {"default": 5, "min": 3, "max": 15, "step": 1, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.klingai.characterOrientation": [["(default)", "image", "video"], {"tooltip": "Source for character orientation reference.", "default": "(default)", "rw_cat": "settings"}], "providerSettings.klingai.keepOriginalSound": ["BOOLEAN", {"default": false, "tooltip": "Maintain the original sound from the reference video.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "providerSettings.klingai.sound": ["BOOLEAN", {"default": false, "tooltip": "Enable native audio generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: inputs.elements, providerSettings.klingai.multiPrompt"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "referenceVideos": {"path": ["inputs", "referenceVideos"], "kind": "feature"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "providerSettings.klingai.characterOrientation": {"path": ["providerSettings", "klingai", "characterOrientation"], "kind": "scalar", "omit_value": "(default)"}, "providerSettings.klingai.keepOriginalSound": {"path": ["providerSettings", "klingai", "keepOriginalSound"], "kind": "scalar", "omit_value": false}, "providerSettings.klingai.sound": {"path": ["providerSettings", "klingai", "sound"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_klingai_video_3_0_turbo", "name": "Kling VIDEO 3.0 Turbo", "model": "klingai:kling-video@3.0-turbo", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output. Also accepts a multi-shot template of the form `shot , , ;` repeated for up to 6 shots, where the per-shot seconds sum to `duration` and each shot prompt is at most 512 characters.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "size": [["None (model default)", "720p (from input)", "1080p (from input)", "720p (16:9)", "720p (1:1)", "720p (9:16)", "1080p (16:9)", "1080p (1:1)", "1080p (9:16)"], {"default": "720p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "duration": ["INT", {"default": 5, "min": 3, "max": 15, "step": 1, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "duration": {"path": ["duration"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (1:1)": {"width": 960, "height": 960}, "720p (9:16)": {"width": 720, "height": 1280}, "1080p (16:9)": {"width": 1920, "height": 1080}, "1080p (1:1)": {"width": 1440, "height": 1440}, "1080p (9:16)": {"width": 1080, "height": 1920}}}}}, {"key": "Runware_klingai_image_3_0", "name": "Kling IMAGE 3.0", "model": "klingai:kling-image@3", "task_type": "imageInference", "creator": "klingai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "size": [["None (model default)", "1k (from input)", "2k (from input)", "1K (1:1)", "1K (3:2)", "1K (2:3)", "1K (4:3)", "1K (3:4)", "1K (9:16)", "1K (16:9)", "1K (21:9)", "2K (1:1)", "2K (3:2)", "2K (2:3)", "2K (4:3)", "2K (3:4)", "2K (9:16)", "2K (16:9)", "2K (21:9)"], {"default": "1K (1:1)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "1k (from input)": {"resolution": "1k"}, "2k (from input)": {"resolution": "2k"}, "1K (1:1)": {"width": 1024, "height": 1024}, "1K (3:2)": {"width": 1248, "height": 832}, "1K (2:3)": {"width": 832, "height": 1248}, "1K (4:3)": {"width": 1168, "height": 880}, "1K (3:4)": {"width": 880, "height": 1168}, "1K (9:16)": {"width": 768, "height": 1360}, "1K (16:9)": {"width": 1360, "height": 768}, "1K (21:9)": {"width": 1552, "height": 656}, "2K (1:1)": {"width": 2048, "height": 2048}, "2K (3:2)": {"width": 2496, "height": 1664}, "2K (2:3)": {"width": 1664, "height": 2496}, "2K (4:3)": {"width": 2336, "height": 1760}, "2K (3:4)": {"width": 1760, "height": 2336}, "2K (9:16)": {"width": 1536, "height": 2720}, "2K (16:9)": {"width": 2720, "height": 1536}, "2K (21:9)": {"width": 3104, "height": 1312}}}}}, {"key": "Runware_klingai_avatar_2_0_pro", "name": "KlingAI Avatar 2.0 Pro", "model": "klingai:avatar@2.0-pro", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {"image": ["IMAGE"], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "rw_cat": "core"}]}, "optional": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "audio": {"path": ["inputs", "audio"], "kind": "scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_klingai_2_1_master", "name": "KlingAI 2.1 Master", "model": "klingai:5@3", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "duration": [[5, 10], {"default": 5, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_klingai_2_1_pro", "name": "KlingAI 2.1 Pro", "model": "klingai:5@2", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {"frameImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "duration": [[5, 10], {"default": 5, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_klingai_2_5_turbo_standard", "name": "KlingAI 2.5 Turbo Standard", "model": "klingai:6@0", "task_type": "videoInference", "creator": "klingai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "duration": [[5, 10], {"default": 5, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "duration": {"path": ["duration"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_klingai_image_o1", "name": "Kling IMAGE O1", "model": "klingai:kling-image@o1", "task_type": "imageInference", "creator": "klingai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "size": [["None (model default)", "1k (from input)", "2k (from input)", "1K (1:1)", "1K (3:2)", "1K (2:3)", "1K (4:3)", "1K (3:4)", "1K (9:16)", "1K (16:9)", "1K (21:9)", "2K (1:1)", "2K (3:2)", "2K (2:3)", "2K (4:3)", "2K (3:4)", "2K (9:16)", "2K (16:9)", "2K (21:9)"], {"default": "1K (1:1)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "1k (from input)": {"resolution": "1k"}, "2k (from input)": {"resolution": "2k"}, "1K (1:1)": {"width": 1024, "height": 1024}, "1K (3:2)": {"width": 1248, "height": 832}, "1K (2:3)": {"width": 832, "height": 1248}, "1K (4:3)": {"width": 1168, "height": 880}, "1K (3:4)": {"width": 880, "height": 1168}, "1K (9:16)": {"width": 768, "height": 1360}, "1K (16:9)": {"width": 1360, "height": 768}, "1K (21:9)": {"width": 1552, "height": 656}, "2K (1:1)": {"width": 2048, "height": 2048}, "2K (3:2)": {"width": 2496, "height": 1664}, "2K (2:3)": {"width": 1664, "height": 2496}, "2K (4:3)": {"width": 2336, "height": 1760}, "2K (3:4)": {"width": 1760, "height": 2336}, "2K (9:16)": {"width": 1536, "height": 2720}, "2K (16:9)": {"width": 2720, "height": 1536}, "2K (21:9)": {"width": 3104, "height": 1312}}}}}, {"key": "Runware_baidu_ernie_image", "name": "ERNIE-Image", "model": "baidu:ernie-image@0", "task_type": "imageInference", "creator": "baidu", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "fbCache", "fbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "width": ["INT", {"default": 1024, "max": 2048, "step": 16, "tooltip": "Width of the generated media in pixels.", "rw_cat": "core"}], "height": ["INT", {"default": 1024, "max": 2048, "step": 16, "tooltip": "Height of the generated media in pixels.", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 30, "min": 15, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 4, "min": 0, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "acceleration": [["(default)", "none", "low", "medium", "high"], {"default": "(default)", "tooltip": "Optimization level.", "rw_cat": "core"}], "settings.promptEnhance.enabled": ["BOOLEAN", {"default": false, "tooltip": "Automatic enhancement and expansion of the input prompt.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "settings.promptEnhance.temperature": ["FLOAT", {"default": 1.2, "min": 0, "max": 5, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "settings.promptEnhance.topP": ["FLOAT", {"default": 0.95, "min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "acceleration": {"path": ["acceleration"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "settings.promptEnhance.enabled": {"path": ["settings", "promptEnhance", "enabled"], "kind": "scalar", "omit_value": false}, "settings.promptEnhance.temperature": {"path": ["settings", "promptEnhance", "temperature"], "kind": "scalar"}, "settings.promptEnhance.topP": {"path": ["settings", "promptEnhance", "topP"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_baidu_ernie_image_turbo", "name": "ERNIE-Image-Turbo", "model": "baidu:ernie-image@turbo", "task_type": "imageInference", "creator": "baidu", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "fbCache", "fbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "width": ["INT", {"default": 1024, "max": 2048, "step": 16, "tooltip": "Width of the generated media in pixels.", "rw_cat": "core"}], "height": ["INT", {"default": 1024, "max": 2048, "step": 16, "tooltip": "Height of the generated media in pixels.", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["INT", {"default": 8, "min": 2, "max": 10, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "acceleration": [["(default)", "none", "low", "medium", "high"], {"default": "(default)", "tooltip": "Optimization level.", "rw_cat": "core"}], "settings.promptEnhance.enabled": ["BOOLEAN", {"default": false, "tooltip": "Automatic enhancement and expansion of the input prompt.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "settings.promptEnhance.temperature": ["FLOAT", {"default": 1.2, "min": 0, "max": 5, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "settings.promptEnhance.topP": ["FLOAT", {"default": 0.95, "min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "scalar"}, "acceleration": {"path": ["acceleration"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "settings.promptEnhance.enabled": {"path": ["settings", "promptEnhance", "enabled"], "kind": "scalar", "omit_value": false}, "settings.promptEnhance.temperature": {"path": ["settings", "promptEnhance", "temperature"], "kind": "scalar"}, "settings.promptEnhance.topP": {"path": ["settings", "promptEnhance", "topP"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_moonshotai_kimi_k2_6", "name": "Kimi K2.6", "model": "moonshotai:kimi@k2.6", "task_type": "textInference", "creator": "moonshotai", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"images": ["IMAGE"], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.frequencyPenalty": ["FLOAT", {"default": 0, "min": -2, "max": 2, "step": 0.01, "tooltip": "Penalizes tokens based on their frequency in the output so far. A value of 0.0 disables the penalty.", "rw_cat": "settings"}], "settings.maxTokens": ["BOOLEAN", {"default": false, "rw_gates": "settings.maxTokens_value", "tooltip": "Enable to set settings.maxTokens. Off uses the model's default.", "rw_cat": "settings"}], "settings.maxTokens_value": ["INT", {"min": 1, "max": 1000000, "tooltip": "Maximum number of tokens to generate in the response.", "default": 1, "rw_cat": "settings"}], "settings.minP": ["FLOAT", {"default": 0, "min": 0, "max": 1, "step": 0.01, "tooltip": "Minimum probability threshold. Tokens with probability below this value are excluded from sampling.", "rw_cat": "settings"}], "settings.presencePenalty": ["FLOAT", {"default": 0, "min": -2, "max": 2, "step": 0.01, "tooltip": "Encourages the model to introduce new topics. A value of 0.0 disables the penalty.", "rw_cat": "settings"}], "settings.promptCacheKey": ["STRING", {"tooltip": "Cache key for reusing prompt cache across requests. Requests sharing the same key reuse cached prompt processing.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.repetitionPenalty": ["FLOAT", {"default": 1, "min": 0, "max": 5, "step": 0.01, "tooltip": "Penalizes tokens that have already appeared in the output. A value of 1.0 disables the penalty.", "rw_cat": "settings"}], "settings.systemPrompt": ["STRING", {"tooltip": "System-level instruction that guides the model's behavior and output style across the entire generation.", "multiline": true, "default": "", "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "settings.thinkingLevel": [["none", "low", "medium", "high", "xhigh"], {"default": "none", "tooltip": "Controls the depth of internal reasoning the model performs before generating a response.", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "settings.topK": ["INT", {"default": 0, "min": 0, "max": 999, "tooltip": "Top-K sampling parameter that limits the number of highest-probability tokens considered at each step.", "rw_cat": "settings"}], "settings.topP": ["FLOAT", {"default": 1, "min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "rw_cat": "settings"}], "outputFormat": [["TEXT", "JSON"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: settings.stopSequences, jsonSchema, tools"}]}}, "param_plan": {"outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "images": {"path": ["inputs", "images"], "kind": "image_array"}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.systemPrompt": {"path": ["settings", "systemPrompt"], "kind": "scalar", "omit_empty": true}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.topP": {"path": ["settings", "topP"], "kind": "scalar"}, "settings.frequencyPenalty": {"path": ["settings", "frequencyPenalty"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "gate", "value_key": "settings.maxTokens_value"}, "settings.maxTokens_value": {"path": ["settings", "maxTokens"], "kind": "skip"}, "settings.minP": {"path": ["settings", "minP"], "kind": "scalar"}, "settings.presencePenalty": {"path": ["settings", "presencePenalty"], "kind": "scalar"}, "settings.promptCacheKey": {"path": ["settings", "promptCacheKey"], "kind": "scalar", "omit_empty": true}, "settings.repetitionPenalty": {"path": ["settings", "repetitionPenalty"], "kind": "scalar"}, "settings.thinkingLevel": {"path": ["settings", "thinkingLevel"], "kind": "scalar"}, "settings.topK": {"path": ["settings", "topK"], "kind": "scalar"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_memories_video_age_detection", "name": "Memories Video Age Detection", "model": "memories:2@1", "task_type": "caption", "creator": "memories", "input_types": {"required": {"video": ["STRING", {"tooltip": "Video input (UUID or URL).", "rw_cat": "core"}]}, "optional": {}}, "param_plan": {"video": {"path": ["inputs", "video"], "kind": "scalar"}}}, {"key": "Runware_memories_video_captioning", "name": "Memories Video Captioning", "model": "memories:1@1", "task_type": "caption", "creator": "memories", "input_types": {"required": {"video": ["STRING", {"tooltip": "Video input (UUID or URL).", "rw_cat": "core"}]}, "optional": {}}, "param_plan": {"video": {"path": ["inputs", "video"], "kind": "scalar"}}}, {"key": "Runware_xai_tts", "name": "xAI Text-to-Speech", "model": "xai:tts@0", "task_type": "audioInference", "creator": "xai", "input_types": {"required": {"speech": ["RUNWARE_SPEECH", {"rw_socket_fields": ["language", "text", "voice"], "rw_socket_enums": {"voice": ["una", "leo", "eve", "ara", "sal", "rex"], "language": ["en", "ar-EG", "ar-SA", "ar-AE", "bn", "zh", "fr", "de", "hi", "id", "it", "ja", "ko", "pt-BR", "pt-PT", "ru", "es-MX", "es-ES", "tr", "vi"]}, "rw_cat": "inputs"}]}, "optional": {"audioSettings": ["RUNWARE_AUDIOSETTINGS"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP3", "WAV", "FLAC", "OGG"], {"default": "MP3", "tooltip": "File format for the generated audio.", "rw_cat": "output"}]}}, "param_plan": {"speech": {"path": ["speech"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "audioSettings": {"path": ["audioSettings"], "kind": "feature"}}}, {"key": "Runware_xai_grok_4_3", "name": "Grok 4.3", "model": "xai:grok@4.3", "task_type": "textInference", "creator": "xai", "input_types": {"required": {"messages": ["RUNWARE_MESSAGES", {"rw_socket_fields": ["content", "role"], "rw_socket_enums": {"role": ["user", "assistant"]}, "rw_cat": "inputs"}]}, "optional": {"seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "includeUsage": ["BOOLEAN", {"default": false, "tooltip": "Include token usage statistics in the response.", "rw_cat": "core"}], "settings.maxTokens": ["BOOLEAN", {"default": false, "rw_gates": "settings.maxTokens_value", "tooltip": "Enable to set settings.maxTokens. Off uses the model's default.", "rw_cat": "settings"}], "settings.maxTokens_value": ["INT", {"min": 1, "tooltip": "Maximum number of tokens to generate in the response.", "default": 1, "rw_cat": "settings"}], "settings.temperature": ["FLOAT", {"default": 1, "min": 0, "max": 2, "step": 0.01, "tooltip": "Controls randomness in generation. Lower values produce more deterministic outputs, higher values increase variation and creativity.", "rw_cat": "settings"}], "toolChoice": ["BOOLEAN", {"default": false, "tooltip": "Enable to set toolChoice. Off uses the model's default.", "rw_cat": "settings"}], "toolChoice.name": ["STRING", {"tooltip": "Name of the specific tool the model must call. Required when type is `tool`.", "default": "", "rw_cat": "settings"}], "toolChoice.type": [["(default)", "auto", "any", "tool", "none"], {"tooltip": "Strategy the model uses to decide when and which tools to call.", "default": "(default)", "rw_cat": "settings"}], "settings.topP": ["FLOAT", {"default": 1, "min": 0, "max": 1, "step": 0.01, "tooltip": "Nucleus sampling parameter that controls diversity by limiting the probability mass. Lower values make outputs more focused, higher values increase diversity.", "rw_cat": "settings"}], "outputFormat": [["TEXT"], {"default": "TEXT", "tooltip": "Output format for the generated text.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: tools"}]}}, "param_plan": {"seed": {"path": ["seed"], "kind": "scalar"}, "settings.temperature": {"path": ["settings", "temperature"], "kind": "scalar"}, "settings.topP": {"path": ["settings", "topP"], "kind": "scalar"}, "settings.maxTokens": {"path": ["settings", "maxTokens"], "kind": "gate", "value_key": "settings.maxTokens_value"}, "settings.maxTokens_value": {"path": ["settings", "maxTokens"], "kind": "skip"}, "messages": {"path": ["messages"], "kind": "feature"}, "toolChoice": {"path": ["toolChoice"], "kind": "group_gate"}, "toolChoice.type": {"path": ["toolChoice", "type"], "kind": "scalar", "omit_value": "(default)", "gated_by": "toolChoice"}, "toolChoice.name": {"path": ["toolChoice", "name"], "kind": "scalar", "omit_empty": true, "gated_by": "toolChoice"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "includeUsage": {"path": ["includeUsage"], "kind": "scalar", "omit_value": false}}}, {"key": "Runware_xai_grok_imagine_image_quality", "name": "Grok Imagine Image Quality", "model": "xai:grok-imagine@image-quality", "task_type": "imageInference", "creator": "xai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "size": [["None (model default)", "1K (from input)", "2K (from input)", "1K (1:1)", "1K (3:4)", "1K (4:3)", "1K (9:16)", "1K (16:9)", "1K (2:3)", "1K (3:2)", "1K (9:19.5)", "1K (19.5:9)", "1K (9:20)", "1K (20:9)", "1K (1:2)", "1K (2:1)", "2K (1:1)", "2K (3:4)", "2K (4:3)", "2K (9:16)", "2K (16:9)", "2K (2:3)", "2K (3:2)", "2K (9:19.5)", "2K (19.5:9)", "2K (9:20)", "2K (20:9)", "2K (1:2)", "2K (2:1)"], {"default": "1K (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "1K (from input)": {"resolution": "1K"}, "2K (from input)": {"resolution": "2K"}, "1K (1:1)": {"width": 1024, "height": 1024}, "1K (3:4)": {"width": 896, "height": 1280}, "1K (4:3)": {"width": 1280, "height": 896}, "1K (9:16)": {"width": 768, "height": 1408}, "1K (16:9)": {"width": 1408, "height": 768}, "1K (2:3)": {"width": 864, "height": 1296}, "1K (3:2)": {"width": 1296, "height": 864}, "1K (9:19.5)": {"width": 576, "height": 1248}, "1K (19.5:9)": {"width": 1248, "height": 576}, "1K (9:20)": {"width": 576, "height": 1280}, "1K (20:9)": {"width": 1280, "height": 576}, "1K (1:2)": {"width": 704, "height": 1408}, "1K (2:1)": {"width": 1408, "height": 704}, "2K (1:1)": {"width": 2048, "height": 2048}, "2K (3:4)": {"width": 1712, "height": 2432}, "2K (4:3)": {"width": 2432, "height": 1712}, "2K (9:16)": {"width": 1504, "height": 2752}, "2K (16:9)": {"width": 2752, "height": 1504}, "2K (2:3)": {"width": 1664, "height": 2496}, "2K (3:2)": {"width": 2496, "height": 1664}, "2K (9:19.5)": {"width": 1376, "height": 2976}, "2K (19.5:9)": {"width": 2976, "height": 1376}, "2K (9:20)": {"width": 1360, "height": 3008}, "2K (20:9)": {"width": 3008, "height": 1360}, "2K (1:2)": {"width": 1440, "height": 2880}, "2K (2:1)": {"width": 2880, "height": 1440}}}}}, {"key": "Runware_xai_grok_imagine_image", "name": "Grok Imagine Image", "model": "xai:grok-imagine@image", "task_type": "imageInference", "creator": "xai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "size": [["None (model default)", "1K (from input)", "1K (1:1)", "1K (3:4)", "1K (4:3)", "1K (9:16)", "1K (16:9)", "1K (2:3)", "1K (3:2)", "1K (9:19.5)", "1K (19.5:9)", "1K (9:20)", "1K (20:9)", "1K (1:2)", "1K (2:1)"], {"default": "1K (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "1K (from input)": {"resolution": "1K"}, "1K (1:1)": {"width": 1024, "height": 1024}, "1K (3:4)": {"width": 896, "height": 1280}, "1K (4:3)": {"width": 1280, "height": 896}, "1K (9:16)": {"width": 768, "height": 1408}, "1K (16:9)": {"width": 1408, "height": 768}, "1K (2:3)": {"width": 864, "height": 1296}, "1K (3:2)": {"width": 1296, "height": 864}, "1K (9:19.5)": {"width": 576, "height": 1248}, "1K (19.5:9)": {"width": 1248, "height": 576}, "1K (9:20)": {"width": 576, "height": 1280}, "1K (20:9)": {"width": 1280, "height": 576}, "1K (1:2)": {"width": 704, "height": 1408}, "1K (2:1)": {"width": 1408, "height": 704}}}}}, {"key": "Runware_xai_grok_imagine_video_1_5", "name": "Grok Imagine Video 1.5", "model": "xai:grok-imagine@video-1.5", "task_type": "videoInference", "creator": "xai", "input_types": {"required": {"frameImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"size": [["None (model default)", "480p (from input)", "720p (from input)", "1080p (from input)", "480p (1:1)", "480p (16:9)", "480p (9:16)", "480p (4:3)", "480p (3:4)", "480p (3:2)", "480p (2:3)", "720p (1:1)", "720p (16:9)", "720p (9:16)", "720p (4:3)", "720p (3:4)", "720p (3:2)", "720p (2:3)", "1080p (1:1)", "1080p (16:9)", "1080p (9:16)", "1080p (4:3)", "1080p (3:4)", "1080p (3:2)", "1080p (2:3)"], {"default": "480p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "duration": ["INT", {"default": 6, "min": 1, "max": 15, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "480p (from input)": {"resolution": "480p"}, "720p (from input)": {"resolution": "720p"}, "1080p (from input)": {"resolution": "1080p"}, "480p (1:1)": {"width": 480, "height": 480}, "480p (16:9)": {"width": 848, "height": 480}, "480p (9:16)": {"width": 480, "height": 848}, "480p (4:3)": {"width": 640, "height": 480}, "480p (3:4)": {"width": 480, "height": 640}, "480p (3:2)": {"width": 720, "height": 480}, "480p (2:3)": {"width": 480, "height": 720}, "720p (1:1)": {"width": 720, "height": 720}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (9:16)": {"width": 720, "height": 1280}, "720p (4:3)": {"width": 960, "height": 720}, "720p (3:4)": {"width": 720, "height": 960}, "720p (3:2)": {"width": 1088, "height": 720}, "720p (2:3)": {"width": 720, "height": 1088}, "1080p (1:1)": {"width": 1424, "height": 1424}, "1080p (16:9)": {"width": 1904, "height": 1072}, "1080p (9:16)": {"width": 1072, "height": 1904}, "1080p (4:3)": {"width": 1648, "height": 1232}, "1080p (3:4)": {"width": 1232, "height": 1648}, "1080p (3:2)": {"width": 1744, "height": 1152}, "1080p (2:3)": {"width": 1152, "height": 1744}}}}}, {"key": "Runware_xai_grok_imagine_video", "name": "Grok Imagine Video", "model": "xai:grok-imagine@video", "task_type": "videoInference", "creator": "xai", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "frameImages": ["IMAGE"], "video": ["STRING", {"tooltip": "Video input (UUID or URL).", "default": "", "rw_cat": "core"}], "size": [["None (model default)", "480p (from input)", "720p (from input)", "480p (1:1)", "480p (16:9)", "480p (9:16)", "480p (4:3)", "480p (3:4)", "480p (3:2)", "480p (2:3)", "720p (1:1)", "720p (16:9)", "720p (9:16)", "720p (4:3)", "720p (3:4)", "720p (3:2)", "720p (2:3)"], {"default": "480p (16:9)", "rw_cat": "core", "tooltip": "Output size. Only one of resolution or dimensions is sent."}], "duration": ["BOOLEAN", {"default": false, "rw_gates": "duration_value", "tooltip": "Enable to set duration. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "duration_value": ["INT", {"default": 6, "min": 1, "max": 15, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "video": {"path": ["inputs", "video"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "gate", "value_key": "duration_value"}, "duration_value": {"path": ["duration"], "kind": "skip"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}, "size": {"path": ["size"], "kind": "size_choice", "options": {"None (model default)": {"__none__": true}, "480p (from input)": {"resolution": "480p"}, "720p (from input)": {"resolution": "720p"}, "480p (1:1)": {"width": 480, "height": 480}, "480p (16:9)": {"width": 848, "height": 480}, "480p (9:16)": {"width": 480, "height": 848}, "480p (4:3)": {"width": 640, "height": 480}, "480p (3:4)": {"width": 480, "height": 640}, "480p (3:2)": {"width": 720, "height": 480}, "480p (2:3)": {"width": 480, "height": 720}, "720p (1:1)": {"width": 720, "height": 720}, "720p (16:9)": {"width": 1280, "height": 720}, "720p (9:16)": {"width": 720, "height": 1280}, "720p (4:3)": {"width": 960, "height": 720}, "720p (3:4)": {"width": 720, "height": 960}, "720p (3:2)": {"width": 1088, "height": 720}, "720p (2:3)": {"width": 720, "height": 1088}}}}}, {"key": "Runware_hyper3d_rodin_gen_2", "name": "Rodin Gen-2", "model": "hyper3d:rodin@gen-2", "task_type": "3dInference", "creator": "hyper3d", "input_types": {"required": {}, "optional": {"images": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 65535, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.hdTexture": ["BOOLEAN", {"default": false, "tooltip": "Enables high-quality texture generation.", "rw_cat": "settings"}], "settings.material": [["PBR", "Shaded", "All"], {"default": "PBR", "tooltip": "Rendering material type for the output model.", "rw_cat": "settings"}], "settings.meshMode": [["Raw", "Quad"], {"default": "Quad", "tooltip": "Mesh topology for the output model.", "rw_cat": "settings"}], "settings.polyCount": ["BOOLEAN", {"default": false, "rw_gates": "settings.polyCount_value", "tooltip": "Enable to set settings.polyCount. Off uses the model's default.", "rw_cat": "settings"}], "settings.polyCount_value": ["INT", {"min": 500, "max": 1000000, "tooltip": "Custom polygon count for the output mesh. Values of 150,000 or higher are recommended for the best detail.", "default": 500, "rw_cat": "settings"}], "settings.quality": [["high", "medium", "low", "extra-low"], {"default": "medium", "tooltip": "Preset polygon count for the output mesh.", "rw_cat": "settings"}], "settings.taPose": ["BOOLEAN", {"default": false, "tooltip": "Forces a T-pose or A-pose for humanoid models.", "rw_cat": "settings"}], "settings.useOriginalAlpha": ["BOOLEAN", {"default": false, "tooltip": "Preserves the original image transparency channel.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["GLB"], {"default": "GLB", "tooltip": "File format for the generated 3D model.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: settings.addons, settings.boundingBox"}]}}, "param_plan": {"images": {"path": ["inputs", "images"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "seed": {"path": ["seed"], "kind": "scalar"}, "settings.hdTexture": {"path": ["settings", "hdTexture"], "kind": "scalar", "omit_value": false}, "settings.material": {"path": ["settings", "material"], "kind": "scalar"}, "settings.meshMode": {"path": ["settings", "meshMode"], "kind": "scalar"}, "settings.polyCount": {"path": ["settings", "polyCount"], "kind": "gate", "value_key": "settings.polyCount_value"}, "settings.polyCount_value": {"path": ["settings", "polyCount"], "kind": "skip"}, "settings.quality": {"path": ["settings", "quality"], "kind": "scalar"}, "settings.taPose": {"path": ["settings", "taPose"], "kind": "scalar", "omit_value": false}, "settings.useOriginalAlpha": {"path": ["settings", "useOriginalAlpha"], "kind": "scalar", "omit_value": false}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}}}, {"key": "Runware_creatify_aurora_v1", "name": "Aurora v1", "model": "creatify:aurora@0", "task_type": "videoInference", "creator": "creatify", "input_types": {"required": {"image": ["IMAGE"], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "rw_cat": "core"}]}, "optional": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 1, "min": 0, "max": 10, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "audio": {"path": ["inputs", "audio"], "kind": "scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_creatify_aurora_v1_fast", "name": "Aurora v1 Fast", "model": "creatify:aurora@fast", "task_type": "videoInference", "creator": "creatify", "input_types": {"required": {"image": ["IMAGE"], "audio": ["STRING", {"tooltip": "Audio input (UUID or URL).", "rw_cat": "core"}]}, "optional": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "CFGScale": ["FLOAT", {"default": 1, "min": 0, "max": 10, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"image": {"path": ["inputs", "image"], "kind": "image_scalar"}, "audio": {"path": ["inputs", "audio"], "kind": "scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_runway_gen_4_5", "name": "Runway Gen-4.5", "model": "runway:1@2", "task_type": "videoInference", "creator": "runway", "input_types": {"required": {"width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 4294967295, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": [[5, 8, 10], {"default": 10, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.runway.contentModeration.publicFigureThreshold": [["auto", "low"], {"default": "auto", "tooltip": "Public figure filtering strictness.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.runway.contentModeration.publicFigureThreshold": {"path": ["providerSettings", "runway", "contentModeration", "publicFigureThreshold"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_runway_aleph_2_0", "name": "Runway Aleph 2.0", "model": "runway:aleph@2.0", "task_type": "videoInference", "creator": "runway", "input_types": {"required": {"video": ["STRING", {"tooltip": "Video input (UUID or URL). Source video to be edited. Duration must be between 2 and 30 seconds.", "rw_cat": "core"}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"frameImages": ["IMAGE"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "video": {"path": ["inputs", "video"], "kind": "scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_runway_gen_4_image_turbo", "name": "Runway Gen-4 Image Turbo", "model": "runway:4@2", "task_type": "imageInference", "creator": "runway", "input_types": {"required": {"referenceImages": ["IMAGE"], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"watermark": ["RUNWARE_WATERMARK"], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.runway.contentModeration.publicFigureThreshold": [["auto", "low"], {"default": "auto", "tooltip": "Public figure filtering strictness.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "providerSettings.runway.contentModeration.publicFigureThreshold": {"path": ["providerSettings", "runway", "contentModeration", "publicFigureThreshold"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}, {"key": "Runware_runway_aleph", "name": "Runway Aleph", "model": "runway:2@1", "task_type": "videoInference", "creator": "runway", "input_types": {"required": {"video": ["STRING", {"tooltip": "Video input (UUID or URL).", "rw_cat": "core"}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 4294967295, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.runway.contentModeration.publicFigureThreshold": [["auto", "low"], {"default": "auto", "tooltip": "Public figure filtering strictness.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "video": {"path": ["inputs", "video"], "kind": "scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.runway.contentModeration.publicFigureThreshold": {"path": ["providerSettings", "runway", "contentModeration", "publicFigureThreshold"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_runway_gen_4_turbo", "name": "Runway Gen-4 Turbo", "model": "runway:1@1", "task_type": "videoInference", "creator": "runway", "input_types": {"required": {"frameImages": ["IMAGE"]}, "optional": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 4294967295, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "duration": ["INT", {"default": 10, "min": 2, "max": 10, "tooltip": "Length of the generated video in seconds. The total number of frames produced is determined by duration multiplied by the model's frame rate (fps).", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 4, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.runway.contentModeration.publicFigureThreshold": [["auto", "low"], {"default": "auto", "tooltip": "Public figure filtering strictness.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "safety.mode": [["none", "fast", "full"], {"default": "none", "tooltip": "Safety checking mode for video generation.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["MP4", "WEBM", "MOV"], {"default": "MP4", "tooltip": "File format for the generated video.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"frameImages": {"path": ["inputs", "frameImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "duration": {"path": ["duration"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "providerSettings.runway.contentModeration.publicFigureThreshold": {"path": ["providerSettings", "runway", "contentModeration", "publicFigureThreshold"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "safety.mode": {"path": ["safety", "mode"], "kind": "scalar", "gated_by": "safety"}}}, {"key": "Runware_runway_gen_4_image", "name": "Runway Gen-4 Image", "model": "runway:4@1", "task_type": "imageInference", "creator": "runway", "input_types": {"required": {"positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "watermark": ["RUNWARE_WATERMARK"], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "providerSettings.runway.contentModeration.publicFigureThreshold": [["auto", "low"], {"default": "auto", "tooltip": "Public figure filtering strictness.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "providerSettings.runway.contentModeration.publicFigureThreshold": {"path": ["providerSettings", "runway", "contentModeration", "publicFigureThreshold"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}}}], "builders": [{"key": "RunwareBuild_acceleratorOptions", "name": "Runware Accelerator Options", "slot": "acceleratorOptions", "param": "acceleratorOptions", "is_array": false, "type": "RUNWARE_ACCELERATOROPTIONS", "required": [], "input_types": {"required": {}, "optional": {"cacheStartStep": ["BOOLEAN", {"default": false, "rw_gates": "cacheStartStep_value", "tooltip": "Enable to set cacheStartStep. Off uses the model's default.", "rw_cat": "Cache Steps"}], "cacheStartStep_value": ["INT", {"min": 0, "tooltip": "Absolute step number to start caching. Must be less than `cacheEndStep`.", "default": 0, "rw_cat": "Cache Steps"}], "cacheStartStepPercentage": ["BOOLEAN", {"default": false, "rw_gates": "cacheStartStepPercentage_value", "tooltip": "Enable to set cacheStartStepPercentage. Off uses the model's default.", "rw_cat": "Cache Steps"}], "cacheStartStepPercentage_value": ["INT", {"min": 0, "max": 99, "tooltip": "Percentage of steps to start caching. Alternative to `cacheStartStep`. Must be less than `cacheEndStepPercentage`.", "default": 0, "rw_cat": "Cache Steps"}], "cacheEndStep": ["BOOLEAN", {"default": false, "rw_gates": "cacheEndStep_value", "tooltip": "Enable to set cacheEndStep. Off uses the model's default.", "rw_cat": "Cache Steps"}], "cacheEndStep_value": ["INT", {"min": 1, "tooltip": "Absolute step number to end caching. Must be greater than `cacheStartStep` and less than or equal to `steps`.", "default": 1, "rw_cat": "Cache Steps"}], "cacheEndStepPercentage": ["BOOLEAN", {"default": false, "rw_gates": "cacheEndStepPercentage_value", "tooltip": "Enable to set cacheEndStepPercentage. Off uses the model's default.", "rw_cat": "Cache Steps"}], "cacheEndStepPercentage_value": ["INT", {"min": 1, "max": 100, "tooltip": "Percentage of steps to end caching. Alternative to `cacheEndStep`. Must be greater than `cacheStartStepPercentage`.", "default": 1, "rw_cat": "Cache Steps"}], "cacheMaxConsecutiveSteps": ["INT", {"default": 3, "min": 1, "max": 5, "tooltip": "Limits the maximum number of consecutive steps that can use cached computations before forcing a fresh computation.", "rw_cat": "Cache Steps"}], "teaCache": ["BOOLEAN", {"default": false, "tooltip": "TeaCache acceleration for transformer-based models. Estimates step differences to skip redundant computations.", "rw_cat": "Tea Cache"}], "teaCacheDistance": ["FLOAT", {"default": 0.5, "min": 0, "max": 1, "step": 0.01, "tooltip": "Controls the aggressiveness of the TeaCache feature. Lower values prioritize quality, higher values prioritize speed.", "rw_cat": "Tea Cache"}], "dbCache": ["BOOLEAN", {"default": false, "tooltip": "DB Cache (CacheDiT) acceleration. Caches and reuses intermediate transformer block outputs to skip redundant computations.", "rw_cat": "Db Cache"}], "dbCacheThreshold": ["FLOAT", {"default": 0.25, "min": 0, "max": 1, "step": 0.01, "tooltip": "Controls the sensitivity threshold for DB Cache. Lower values reuse cached blocks more aggressively, higher values prioritize quality.", "rw_cat": "Db Cache"}], "dbCacheSkipInterval": ["INT", {"default": 5, "min": 1, "tooltip": "Controls how many steps to skip between cache refreshes. Higher values skip more steps for faster generation at the cost of quality.", "rw_cat": "Db Cache"}], "fbCache": ["BOOLEAN", {"default": false, "tooltip": "First Block Cache (FBCache) acceleration. Reuses feature block computations across steps.", "rw_cat": "Fb Cache"}], "fbCacheThreshold": ["FLOAT", {"default": 0.25, "min": 0, "max": 1, "step": 0.01, "tooltip": "Controls the sensitivity threshold for determining when to reuse cached computations. Lower values reuse more aggressively.", "rw_cat": "Fb Cache"}], "deepCache": ["BOOLEAN", {"default": false, "tooltip": "DeepCache acceleration. Skips transformer computations in certain steps to speed up generation.", "rw_cat": "Deep Cache"}], "deepCacheInterval": ["BOOLEAN", {"default": false, "rw_gates": "deepCacheInterval_value", "tooltip": "Enable to set deepCacheInterval. Off uses the model's default.", "rw_cat": "Deep Cache"}], "deepCacheInterval_value": ["INT", {"min": 1, "tooltip": "Interval for DeepCache acceleration. A value of 2 skips every other step, 3 skips two out of three, etc.", "default": 1, "rw_cat": "Deep Cache"}], "deepCacheBranchId": ["BOOLEAN", {"default": false, "rw_gates": "deepCacheBranchId_value", "tooltip": "Enable to set deepCacheBranchId. Off uses the model's default.", "rw_cat": "Deep Cache"}], "deepCacheBranchId_value": ["INT", {"min": 0, "tooltip": "Branch ID for DeepCache acceleration. Determines which U-Net layers are skipped.", "default": 0, "rw_cat": "Deep Cache"}]}}, "param_plan": {"cacheEndStep": {"path": ["cacheEndStep"], "kind": "gate", "value_key": "cacheEndStep_value"}, "cacheEndStep_value": {"path": ["cacheEndStep"], "kind": "skip"}, "cacheEndStepPercentage": {"path": ["cacheEndStepPercentage"], "kind": "gate", "value_key": "cacheEndStepPercentage_value"}, "cacheEndStepPercentage_value": {"path": ["cacheEndStepPercentage"], "kind": "skip"}, "cacheMaxConsecutiveSteps": {"path": ["cacheMaxConsecutiveSteps"], "kind": "scalar"}, "cacheStartStep": {"path": ["cacheStartStep"], "kind": "gate", "value_key": "cacheStartStep_value"}, "cacheStartStep_value": {"path": ["cacheStartStep"], "kind": "skip"}, "cacheStartStepPercentage": {"path": ["cacheStartStepPercentage"], "kind": "gate", "value_key": "cacheStartStepPercentage_value"}, "cacheStartStepPercentage_value": {"path": ["cacheStartStepPercentage"], "kind": "skip"}, "teaCache": {"path": ["teaCache"], "kind": "scalar", "omit_value": false}, "teaCacheDistance": {"path": ["teaCacheDistance"], "kind": "scalar"}, "fbCache": {"path": ["fbCache"], "kind": "scalar", "omit_value": false}, "fbCacheThreshold": {"path": ["fbCacheThreshold"], "kind": "scalar"}, "dbCache": {"path": ["dbCache"], "kind": "scalar", "omit_value": false}, "dbCacheThreshold": {"path": ["dbCacheThreshold"], "kind": "scalar"}, "dbCacheSkipInterval": {"path": ["dbCacheSkipInterval"], "kind": "scalar"}, "deepCache": {"path": ["deepCache"], "kind": "scalar", "omit_value": false}, "deepCacheInterval": {"path": ["deepCacheInterval"], "kind": "gate", "value_key": "deepCacheInterval_value"}, "deepCacheInterval_value": {"path": ["deepCacheInterval"], "kind": "skip"}, "deepCacheBranchId": {"path": ["deepCacheBranchId"], "kind": "gate", "value_key": "deepCacheBranchId_value"}, "deepCacheBranchId_value": {"path": ["deepCacheBranchId"], "kind": "skip"}}}, {"key": "RunwareBuild_audioSettings", "name": "Runware Audio Settings", "slot": "audioSettings", "param": "audioSettings", "is_array": false, "type": "RUNWARE_AUDIOSETTINGS", "required": [], "input_types": {"required": {}, "optional": {"bitrate": ["BOOLEAN", {"default": false, "rw_gates": "bitrate_value", "tooltip": "Enable to set bitrate. Off uses the model's default."}], "bitrate_value": ["INT", {"min": 8, "tooltip": "Audio bitrate in kbps.", "default": 8}], "channels": [[1, 2], {"default": 2, "tooltip": "Number of audio channels. 1 for mono, 2 for stereo."}], "sampleRate": ["BOOLEAN", {"default": false, "rw_gates": "sampleRate_value", "tooltip": "Enable to set sampleRate. Off uses the model's default."}], "sampleRate_value": ["INT", {"tooltip": "Audio sample rate in Hz.", "default": 0}]}}, "param_plan": {"bitrate": {"path": ["bitrate"], "kind": "gate", "value_key": "bitrate_value"}, "bitrate_value": {"path": ["bitrate"], "kind": "skip"}, "channels": {"path": ["channels"], "kind": "scalar"}, "sampleRate": {"path": ["sampleRate"], "kind": "gate", "value_key": "sampleRate_value"}, "sampleRate_value": {"path": ["sampleRate"], "kind": "skip"}}}, {"key": "RunwareBuild_controlNet", "name": "Runware ControlNet", "slot": "controlNet", "param": "controlNet", "is_array": true, "type": "RUNWARE_CONTROLNET", "required": ["guideImage", "model"], "input_types": {"required": {"guideImage": ["IMAGE"], "model": [["runware:25@1", "runware:26@1", "runware:27@1", "runware:28@1", "runware:29@1", "runware:30@1", "runware:31@1", "runware:98@1"], {"tooltip": "ControlNet model identifier.", "rw_cat": "Other"}]}, "optional": {"controlMode": [["balanced", "controlnet", "prompt"], {"default": "balanced", "tooltip": "ControlNet guidance mode.", "rw_cat": "Other"}], "endStep": ["BOOLEAN", {"default": false, "rw_gates": "endStep_value", "tooltip": "Enable to set endStep. Off uses the model's default.", "rw_cat": "End Step"}], "endStep_value": ["INT", {"min": 1, "tooltip": "Absolute step number to end ControlNet influence. Must be greater than `startStep` and less than or equal to `steps`.", "default": 1, "rw_cat": "End Step"}], "endStepPercentage": ["BOOLEAN", {"default": false, "rw_gates": "endStepPercentage_value", "tooltip": "Enable to set endStepPercentage. Off uses the model's default.", "rw_cat": "End Step"}], "endStepPercentage_value": ["INT", {"min": 1, "max": 100, "tooltip": "Percentage of steps to end ControlNet influence. Must be greater than `startStepPercentage`.", "default": 1, "rw_cat": "End Step"}], "startStep": ["BOOLEAN", {"default": false, "rw_gates": "startStep_value", "tooltip": "Enable to set startStep. Off uses the model's default.", "rw_cat": "Start Step"}], "startStep_value": ["INT", {"min": 0, "tooltip": "Absolute step number to start ControlNet influence. Must be less than `endStep`.", "default": 0, "rw_cat": "Start Step"}], "startStepPercentage": ["BOOLEAN", {"default": false, "rw_gates": "startStepPercentage_value", "tooltip": "Enable to set startStepPercentage. Off uses the model's default.", "rw_cat": "Start Step"}], "startStepPercentage_value": ["INT", {"min": 0, "max": 99, "tooltip": "Percentage of steps to start ControlNet influence. Must be less than `endStepPercentage`.", "default": 0, "rw_cat": "Start Step"}], "weight": ["FLOAT", {"default": 1, "min": -4, "max": 4, "step": 0.01, "tooltip": "Strength of the ControlNet influence. A value of 0 means no influence. Higher values increase the influence, and negative values can be used to steer away from the guide image.", "rw_cat": "Other"}]}}, "param_plan": {"model": {"path": ["model"], "kind": "scalar"}, "weight": {"path": ["weight"], "kind": "scalar"}, "guideImage": {"path": ["guideImage"], "kind": "image_scalar"}, "controlMode": {"path": ["controlMode"], "kind": "scalar"}, "endStep": {"path": ["endStep"], "kind": "gate", "value_key": "endStep_value"}, "endStep_value": {"path": ["endStep"], "kind": "skip"}, "endStepPercentage": {"path": ["endStepPercentage"], "kind": "gate", "value_key": "endStepPercentage_value"}, "endStepPercentage_value": {"path": ["endStepPercentage"], "kind": "skip"}, "startStep": {"path": ["startStep"], "kind": "gate", "value_key": "startStep_value"}, "startStep_value": {"path": ["startStep"], "kind": "skip"}, "startStepPercentage": {"path": ["startStepPercentage"], "kind": "gate", "value_key": "startStepPercentage_value"}, "startStepPercentage_value": {"path": ["startStepPercentage"], "kind": "skip"}}}, {"key": "RunwareBuild_embeddings", "name": "Runware Embeddings", "slot": "embeddings", "param": "embeddings", "is_array": true, "type": "RUNWARE_EMBEDDINGS", "required": ["model"], "input_types": {"required": {"model": ["STRING", {"tooltip": "Textual Inversion (Embedding) model identifier."}]}, "optional": {"weight": ["FLOAT", {"default": 1, "min": -4, "max": 4, "step": 0.01, "tooltip": "Strength of the embedding influence."}]}}, "param_plan": {"model": {"path": ["model"], "kind": "scalar"}, "weight": {"path": ["weight"], "kind": "scalar"}}}, {"key": "RunwareBuild_importModel", "name": "Runware Import Model", "slot": "importModel", "param": "importModel", "is_array": false, "type": "RUNWARE_IMPORTMODEL", "required": ["air", "name"], "input_types": {"required": {"air": ["STRING", {"tooltip": "Artificial Intelligence Resource identifier. Format: `provider:model@version`."}], "name": ["STRING", {"tooltip": "Name of the model."}]}, "optional": {"heroImageURL": ["STRING", {"tooltip": "URL of the hero image.", "default": ""}], "private": ["BOOLEAN", {"default": true, "tooltip": "Whether the model should be private."}], "shortDescription": ["STRING", {"tooltip": "Short description of the model.", "default": ""}], "uniqueIdentifier": ["STRING", {"tooltip": "Unique identifier for the model.", "default": ""}], "version": ["STRING", {"tooltip": "Version of the model.", "default": ""}]}}, "param_plan": {"air": {"path": ["air"], "kind": "scalar"}, "heroImageURL": {"path": ["heroImageURL"], "kind": "scalar", "omit_empty": true}, "name": {"path": ["name"], "kind": "scalar"}, "private": {"path": ["private"], "kind": "scalar"}, "shortDescription": {"path": ["shortDescription"], "kind": "scalar", "omit_empty": true}, "uniqueIdentifier": {"path": ["uniqueIdentifier"], "kind": "scalar", "omit_empty": true}, "version": {"path": ["version"], "kind": "scalar", "omit_empty": true}}}, {"key": "RunwareBuild_ipAdapters", "name": "Runware IP-Adapter", "slot": "ipAdapters", "param": "ipAdapters", "is_array": true, "type": "RUNWARE_IPADAPTERS", "required": ["guideImages", "model"], "input_types": {"required": {"model": [["runware:56@1", "runware:56@2", "runware:56@3", "runware:56@4"], {"tooltip": "IP-Adapter model identifier."}], "guideImages": ["IMAGE"]}, "optional": {"weight": ["FLOAT", {"default": 1, "min": -4, "max": 4, "step": 0.01, "tooltip": "Strength of the IP-Adapter influence. A value of 0 means no influence. Higher values increase the influence, and negative values can be used to steer away from the reference."}], "weightType": [["normal", "ease_in", "ease_out", "ease_in_out", "weak_input", "weak_output", "weak_middle", "strong_middle", "style_transfer", "composition", "strong_style_transfer", "style_and_composition", "strong_style_and_composition"], {"default": "normal", "tooltip": "Shapes how influence evolves during generation."}], "weightComposition": ["BOOLEAN", {"default": false, "rw_gates": "weightComposition_value", "tooltip": "Enable to set weightComposition. Off uses the model's default."}], "weightComposition_value": ["FLOAT", {"min": 0, "max": 1, "step": 0.01, "tooltip": "Controls composition/layout influence specifically.", "default": 0.0}], "embedScaling": [["only_v", "kv", "kv_penalty_c", "k_mean_v_penalty_c"], {"default": "kv", "tooltip": "Determines which embedding components are used and their strength."}], "combineMethod": [["concat", "add", "subtract", "average", "norm_average"], {"default": "concat", "tooltip": "Controls how multiple reference images are combined."}]}}, "param_plan": {"model": {"path": ["model"], "kind": "scalar"}, "weight": {"path": ["weight"], "kind": "scalar"}, "guideImages": {"path": ["guideImages"], "kind": "image_array"}, "weightType": {"path": ["weightType"], "kind": "scalar"}, "weightComposition": {"path": ["weightComposition"], "kind": "gate", "value_key": "weightComposition_value"}, "weightComposition_value": {"path": ["weightComposition"], "kind": "skip"}, "embedScaling": {"path": ["embedScaling"], "kind": "scalar"}, "combineMethod": {"path": ["combineMethod"], "kind": "scalar"}}}, {"key": "RunwareBuild_lora", "name": "Runware LoRA", "slot": "lora", "param": "lora", "is_array": true, "type": "RUNWARE_LORA", "required": ["model"], "input_types": {"required": {"model": ["STRING", {"tooltip": "LoRA model identifier."}]}, "optional": {"weight": ["FLOAT", {"default": 1, "min": -4, "max": 4, "step": 0.01, "tooltip": "Strength of the LoRA influence. A value of 0 means no influence. Higher values increase the influence, and negative values can be used to steer away from the LoRA's style."}], "transformer": [["high", "low", "both"], {"default": "both", "tooltip": "Transformer stages to apply LoRA. Some video models use separate high-noise and low-noise processing stages, and LoRAs can be selectively applied to optimize their effectiveness."}]}}, "param_plan": {"model": {"path": ["model"], "kind": "scalar"}, "weight": {"path": ["weight"], "kind": "scalar"}, "transformer": {"path": ["transformer"], "kind": "scalar"}}}, {"key": "RunwareBuild_messages", "name": "Runware Messages", "slot": "messages", "param": "messages", "is_array": true, "type": "RUNWARE_MESSAGES", "required": ["content", "role"], "input_types": {"required": {"role": [["user", "assistant"], {"tooltip": "The role of the message author."}], "content": ["STRING", {"tooltip": "The text content of the message."}]}, "optional": {}}, "param_plan": {"role": {"path": ["role"], "kind": "scalar"}, "content": {"path": ["content"], "kind": "scalar"}}}, {"key": "RunwareBuild_outpaint", "name": "Runware Outpaint", "slot": "outpaint", "param": "outpaint", "is_array": false, "type": "RUNWARE_OUTPAINT", "required": [], "input_types": {"required": {}, "optional": {"top": ["BOOLEAN", {"default": false, "rw_gates": "top_value", "tooltip": "Enable to set top. Off uses the model's default."}], "top_value": ["INT", {"min": 0, "tooltip": "Number of pixels to extend to the top.", "default": 0}], "bottom": ["BOOLEAN", {"default": false, "rw_gates": "bottom_value", "tooltip": "Enable to set bottom. Off uses the model's default."}], "bottom_value": ["INT", {"min": 0, "tooltip": "Number of pixels to extend to the bottom.", "default": 0}], "left": ["BOOLEAN", {"default": false, "rw_gates": "left_value", "tooltip": "Enable to set left. Off uses the model's default."}], "left_value": ["INT", {"min": 0, "tooltip": "Number of pixels to extend to the left.", "default": 0}], "right": ["BOOLEAN", {"default": false, "rw_gates": "right_value", "tooltip": "Enable to set right. Off uses the model's default."}], "right_value": ["INT", {"min": 0, "tooltip": "Number of pixels to extend to the right.", "default": 0}], "blur": ["BOOLEAN", {"default": false, "rw_gates": "blur_value", "tooltip": "Enable to set blur. Off uses the model's default."}], "blur_value": ["INT", {"min": 0, "max": 32, "tooltip": "Amount of blur to apply to the mask edge.", "default": 0}]}}, "param_plan": {"top": {"path": ["top"], "kind": "gate", "value_key": "top_value"}, "top_value": {"path": ["top"], "kind": "skip"}, "bottom": {"path": ["bottom"], "kind": "gate", "value_key": "bottom_value"}, "bottom_value": {"path": ["bottom"], "kind": "skip"}, "left": {"path": ["left"], "kind": "gate", "value_key": "left_value"}, "left_value": {"path": ["left"], "kind": "skip"}, "right": {"path": ["right"], "kind": "gate", "value_key": "right_value"}, "right_value": {"path": ["right"], "kind": "skip"}, "blur": {"path": ["blur"], "kind": "gate", "value_key": "blur_value"}, "blur_value": {"path": ["blur"], "kind": "skip"}}}, {"key": "RunwareBuild_photoMaker", "name": "Runware PhotoMaker", "slot": "photoMaker", "param": "photoMaker", "is_array": false, "type": "RUNWARE_PHOTOMAKER", "required": ["images"], "input_types": {"required": {"images": ["IMAGE"]}, "optional": {"strength": ["INT", {"default": 15, "min": 15, "max": 50, "tooltip": "Controls the balance between preserving the subject's original features and the creative transformation specified in the prompt. Lower values provide stronger subject fidelity, higher values allow more creative freedom."}], "style": [["No style", "Cinematic", "Disney Character", "Digital Art", "Photographic", "Fantasy art", "Neonpunk", "Enhance", "Comic book", "Lowpoly", "Line art"], {"default": "No style", "tooltip": "Artistic style applied to the generated images."}]}}, "param_plan": {"images": {"path": ["images"], "kind": "image_array"}, "strength": {"path": ["strength"], "kind": "scalar"}, "style": {"path": ["style"], "kind": "scalar"}}}, {"key": "RunwareBuild_pulid", "name": "Runware PuLID", "slot": "pulid", "param": "pulid", "is_array": false, "type": "RUNWARE_PULID", "required": ["images"], "input_types": {"required": {"images": ["IMAGE"]}, "optional": {"CFGstartStep": ["BOOLEAN", {"default": false, "rw_gates": "CFGstartStep_value", "tooltip": "Enable to set CFGstartStep. Off uses the model's default."}], "CFGstartStep_value": ["INT", {"min": 0, "tooltip": "Absolute step number to start identity influence. Must be less than `steps`.", "default": 0}], "CFGstartStepPercentage": ["BOOLEAN", {"default": false, "rw_gates": "CFGstartStepPercentage_value", "tooltip": "Enable to set CFGstartStepPercentage. Off uses the model's default."}], "CFGstartStepPercentage_value": ["INT", {"min": 0, "max": 99, "tooltip": "Percentage of steps to start identity influence.", "default": 0}], "idWeight": ["FLOAT", {"default": 1, "min": 0, "max": 3, "step": 0.01, "tooltip": "Identity preservation strength. Higher values create closer resemblance to the reference face."}], "trueCFGScale": ["BOOLEAN", {"default": false, "rw_gates": "trueCFGScale_value", "tooltip": "Enable to set trueCFGScale. Off uses the model's default."}], "trueCFGScale_value": ["FLOAT", {"min": 0, "max": 10, "step": 0.1, "tooltip": "Guidance scale for identity embedding.", "default": 0.0}]}}, "param_plan": {"CFGstartStep": {"path": ["CFGstartStep"], "kind": "gate", "value_key": "CFGstartStep_value"}, "CFGstartStep_value": {"path": ["CFGstartStep"], "kind": "skip"}, "CFGstartStepPercentage": {"path": ["CFGstartStepPercentage"], "kind": "gate", "value_key": "CFGstartStepPercentage_value"}, "CFGstartStepPercentage_value": {"path": ["CFGstartStepPercentage"], "kind": "skip"}, "idWeight": {"path": ["idWeight"], "kind": "scalar"}, "images": {"path": ["images"], "kind": "image_array"}, "trueCFGScale": {"path": ["trueCFGScale"], "kind": "gate", "value_key": "trueCFGScale_value"}, "trueCFGScale_value": {"path": ["trueCFGScale"], "kind": "skip"}}}, {"key": "RunwareBuild_referenceImages", "name": "Runware Reference Images", "slot": "referenceImages", "param": "inputs.referenceImages", "is_array": true, "type": "RUNWARE_REFERENCEIMAGES", "required": ["image", "images", "role", "tag", "type"], "input_types": {"required": {"image": ["IMAGE"], "role": [["person", "garment"], {"tooltip": "Role of the image in the virtual try-on process."}], "type": [["grid", "image"], {"tooltip": "Reference mode for this group."}], "images": ["IMAGE"], "tag": ["STRING", {"tooltip": "Group identifier that links this reference to a mention in the prompt. Must start with @ (e.g. @actor1, @style)."}]}, "optional": {"audio": ["STRING", {"tooltip": "Audio input (UUID or URL). Voice timbre reference for lip-sync. Max 15 seconds.", "default": ""}]}}, "param_plan": {"image": {"path": ["image"], "kind": "image_scalar"}, "role": {"path": ["role"], "kind": "scalar"}, "type": {"path": ["type"], "kind": "scalar"}, "audio": {"path": ["audio"], "kind": "scalar", "omit_empty": true}, "images": {"path": ["images"], "kind": "image_array"}, "tag": {"path": ["tag"], "kind": "scalar"}}}, {"key": "RunwareBuild_referenceVideos", "name": "Runware Reference Videos", "slot": "referenceVideos", "param": "inputs.referenceVideos", "is_array": true, "type": "RUNWARE_REFERENCEVIDEOS", "required": ["tag", "type", "video"], "input_types": {"required": {"type": [["reference", "extend"], {"tooltip": "Reference mode for the video."}], "tag": ["STRING", {"tooltip": "Video reference identifier that links to a mention in the prompt. Must start with @ (e.g. @video1)."}], "video": ["STRING", {"tooltip": "Video input (UUID or URL). Max 15 seconds. Minimum 1,866,240 total pixels (e.g. 1920\u00d7972)."}]}, "optional": {}}, "param_plan": {"type": {"path": ["type"], "kind": "scalar"}, "tag": {"path": ["tag"], "kind": "scalar"}, "video": {"path": ["video"], "kind": "scalar"}}}, {"key": "RunwareBuild_referenceVoices", "name": "Runware Reference Voices", "slot": "referenceVoices", "param": "inputs.referenceVoices", "is_array": true, "type": "RUNWARE_REFERENCEVOICES", "required": ["audio", "text"], "input_types": {"required": {"audio": ["STRING", {"tooltip": "Reference audio clip for the voice to clone (UUID, URL, DataURI, or Base64). Audio duration must be between 1.0 and 90.0 seconds."}], "text": ["STRING", {"tooltip": "Transcript of the reference audio clip. Must match the spoken content of the reference audio.", "multiline": true}]}, "optional": {}}, "param_plan": {"audio": {"path": ["audio"], "kind": "scalar"}, "text": {"path": ["text"], "kind": "scalar"}}}, {"key": "RunwareBuild_refiner", "name": "Runware Refiner", "slot": "refiner", "param": "refiner", "is_array": false, "type": "RUNWARE_REFINER", "required": ["model"], "input_types": {"required": {"model": [["runware:101055@128080"], {"tooltip": "Refiner model identifier."}]}, "optional": {"startStep": ["BOOLEAN", {"default": false, "rw_gates": "startStep_value", "tooltip": "Enable to set startStep. Off uses the model's default."}], "startStep_value": ["INT", {"min": 1, "tooltip": "Absolute step number to switch from the base model to the refiner.", "default": 1}], "startStepPercentage": ["BOOLEAN", {"default": false, "rw_gates": "startStepPercentage_value", "tooltip": "Enable to set startStepPercentage. Off uses the model's default."}], "startStepPercentage_value": ["INT", {"min": 1, "max": 99, "tooltip": "Percentage of total steps at which to switch from the base model to the refiner.", "default": 1}]}}, "param_plan": {"model": {"path": ["model"], "kind": "scalar"}, "startStep": {"path": ["startStep"], "kind": "gate", "value_key": "startStep_value"}, "startStep_value": {"path": ["startStep"], "kind": "skip"}, "startStepPercentage": {"path": ["startStepPercentage"], "kind": "gate", "value_key": "startStepPercentage_value"}, "startStepPercentage_value": {"path": ["startStepPercentage"], "kind": "skip"}}}, {"key": "RunwareBuild_speech", "name": "Runware Speech", "slot": "speech", "param": "speech", "is_array": false, "type": "RUNWARE_SPEECH", "required": ["text", "voice"], "input_types": {"required": {"text": ["STRING", {"tooltip": "Text to convert to speech."}], "voice": [["una", "leo", "eve", "ara", "sal", "rex"], {"tooltip": "Voice identifier to use for speech generation."}]}, "optional": {"language": [["(default)", "en", "ar-EG", "ar-SA", "ar-AE", "bn", "zh", "fr", "de", "hi", "id", "it", "ja", "ko", "pt-BR", "pt-PT", "ru", "es-MX", "es-ES", "tr", "vi"], {"tooltip": "Language code for speech generation.", "default": "(default)"}], "speed": ["FLOAT", {"default": 1, "min": 0.5, "max": 1.5, "step": 0.01, "tooltip": "Playback speed of the generated speech."}], "volume": ["FLOAT", {"default": 1, "min": 0, "max": 1, "step": 0.1, "tooltip": "Volume level of the generated speech."}], "pitch": ["FLOAT", {"default": 0, "min": -50, "max": 50, "step": 0.1, "tooltip": "Pitch adjustment for the voice."}], "advanced_json": ["STRING", {"default": "", "multiline": true, "tooltip": "Extra JSON merged into this speech: voices"}]}}, "param_plan": {"text": {"path": ["text"], "kind": "scalar"}, "voice": {"path": ["voice"], "kind": "scalar"}, "language": {"path": ["language"], "kind": "scalar", "omit_value": "(default)"}, "speed": {"path": ["speed"], "kind": "scalar"}, "volume": {"path": ["volume"], "kind": "scalar"}, "pitch": {"path": ["pitch"], "kind": "scalar"}}}, {"key": "RunwareBuild_ultralytics", "name": "Runware Ultralytics", "slot": "ultralytics", "param": "ultralytics", "is_array": false, "type": "RUNWARE_ULTRALYTICS", "required": [], "input_types": {"required": {}, "optional": {"CFGScale": ["FLOAT", {"default": 8, "min": 0, "max": 50, "step": 0.1, "tooltip": "Face refinement guidance scale."}], "confidence": ["FLOAT", {"default": 0.9, "min": 0, "max": 1, "step": 0.01, "tooltip": "Confidence threshold for detection."}], "inpaintSize": ["INT", {"default": 1024, "min": 128, "max": 2048, "tooltip": "Image size (in pixels) to use for each inpainting region. YOLO detects faces, crops the region, and scales it to this size before running diffusion. Set so most faces land in the 2\u20134\u00d7 range of their original pixel size. Going beyond 8\u00d7 may degrade identity resemblance."}], "maskBlur": ["INT", {"default": 5, "min": 0, "max": 100, "tooltip": "Mask feathering amount. Higher values create softer transitions between the enhanced face region and surrounding areas."}], "maskPadding": ["INT", {"default": 5, "min": 0, "max": 20, "tooltip": "Padding around detected face in pixels. Expands the refinement area to include surrounding context like hair and neck."}], "negativePrompt": ["STRING", {"tooltip": "Negative prompt for detection.", "multiline": true, "default": ""}], "positivePrompt": ["STRING", {"tooltip": "Positive prompt for detection.", "multiline": true, "default": ""}], "steps": ["INT", {"default": 20, "min": 1, "max": 100, "tooltip": "Number of face refinement steps."}], "strength": ["FLOAT", {"default": 0.3, "max": 1, "step": 0.01, "tooltip": "Refinement strength. Lower values preserve more of the original, higher values allow more aggressive reconstruction."}]}}, "param_plan": {"CFGScale": {"path": ["CFGScale"], "kind": "scalar"}, "confidence": {"path": ["confidence"], "kind": "scalar"}, "inpaintSize": {"path": ["inpaintSize"], "kind": "scalar"}, "maskBlur": {"path": ["maskBlur"], "kind": "scalar"}, "maskPadding": {"path": ["maskPadding"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar", "omit_empty": true}, "steps": {"path": ["steps"], "kind": "scalar"}, "strength": {"path": ["strength"], "kind": "scalar"}}}, {"key": "RunwareBuild_watermark", "name": "Runware Watermark", "slot": "watermark", "param": "watermark", "is_array": false, "type": "RUNWARE_WATERMARK", "required": [], "input_types": {"required": {}, "optional": {"text": ["STRING", {"tooltip": "Watermark text.", "default": ""}], "image": ["IMAGE"], "displayPosition": [["(default)", "top-left", "top-center", "top-right", "center-left", "center-center", "center-right", "bottom-left", "bottom-center", "bottom-right"], {"tooltip": "Watermark position.", "default": "(default)"}], "tiled": ["BOOLEAN", {"default": false, "tooltip": "Enable tiled watermark."}], "opacity": ["BOOLEAN", {"default": false, "rw_gates": "opacity_value", "tooltip": "Enable to set opacity. Off uses the model's default."}], "opacity_value": ["FLOAT", {"min": 0.1, "max": 1, "step": 0.01, "tooltip": "Watermark opacity.", "default": 0.1}], "fontColor": ["STRING", {"tooltip": "Text color in hex format.", "default": ""}], "bgColor": ["STRING", {"tooltip": "Background color in hex format.", "default": ""}]}}, "param_plan": {"text": {"path": ["text"], "kind": "scalar", "omit_empty": true}, "image": {"path": ["image"], "kind": "image_scalar"}, "displayPosition": {"path": ["displayPosition"], "kind": "scalar", "omit_value": "(default)"}, "tiled": {"path": ["tiled"], "kind": "scalar", "omit_value": false}, "opacity": {"path": ["opacity"], "kind": "gate", "value_key": "opacity_value"}, "opacity_value": {"path": ["opacity"], "kind": "skip"}, "fontColor": {"path": ["fontColor"], "kind": "scalar", "omit_empty": true}, "bgColor": {"path": ["bgColor"], "kind": "scalar", "omit_empty": true}}}], "architectures": [{"key": "RunwareArch_exactly_illustrative", "name": "Exactly Illustrative (custom model)", "architecture": "exactly-illustrative", "default_model": "", "task_type": "imageInference", "creator": "other", "input_types": {"required": {"model": ["STRING", {"default": "", "rw_model_picker": "exactly-illustrative", "rw_cat": "core", "tooltip": "AIR of any checkpoint of this architecture. Use the search button to browse the catalog."}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 1024, "max": 2048, "step": 64, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 1024, "max": 2048, "step": 64, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"referenceImages": ["RUNWARE_REFERENCEIMAGES", {"rw_socket_fields": ["image", "strength", "type"], "rw_socket_enums": {"type": ["sketch", "reference"]}, "rw_cat": "inputs"}], "watermark": ["RUNWARE_WATERMARK"], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "settings.quality": [["low", "high"], {"default": "low", "tooltip": "Generation quality level.", "rw_cat": "settings"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "feature"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "settings.quality": {"path": ["settings", "quality"], "kind": "scalar"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "model": {"path": ["model"], "kind": "scalar"}}}, {"key": "RunwareArch_flux_1_dev", "name": "FLUX.1 [dev] (custom model)", "architecture": "flux-1-dev", "default_model": "runware:101@1", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"model": ["STRING", {"default": "runware:101@1", "rw_model_picker": "flux-1-dev", "rw_cat": "core", "tooltip": "AIR of any checkpoint of this architecture. Use the search button to browse the catalog."}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "controlNet": ["RUNWARE_CONTROLNET", {"rw_socket_models": ["runware:25@1", "runware:26@1", "runware:27@1", "runware:28@1", "runware:29@1", "runware:30@1", "runware:31@1", "runware:98@1"], "rw_socket_fields": ["controlMode", "endStep", "endStepPercentage", "guideImage", "model", "startStep", "startStepPercentage", "weight"], "rw_socket_enums": {"controlMode": ["balanced", "controlnet", "prompt"]}, "rw_cat": "inputs"}], "ipAdapters": ["RUNWARE_IPADAPTERS", {"rw_socket_models": ["runware:56@1", "runware:56@2", "runware:56@3", "runware:56@4"], "rw_socket_fields": ["guideImages", "model", "weight"], "rw_cat": "inputs"}], "pulid": ["RUNWARE_PULID"], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "trueCFGScale": ["BOOLEAN", {"default": false, "rw_gates": "trueCFGScale_value", "tooltip": "Enable to set trueCFGScale. Off uses the model's default.", "rw_cat": "core"}], "trueCFGScale_value": ["FLOAT", {"tooltip": "True Classifier-Free Guidance scale. Higher values increase prompt adherence at the cost of quality.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "promptWeighting": [["(default)", "sdEmbeds"], {"tooltip": "Syntax used for prompt weighting.", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "layerDiffuse": ["BOOLEAN", {"default": false, "tooltip": "LayerDiffuse for transparent image generation.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: hiresFix"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "promptWeighting": {"path": ["promptWeighting"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "controlNet": {"path": ["controlNet"], "kind": "feature"}, "ipAdapters": {"path": ["ipAdapters"], "kind": "feature"}, "layerDiffuse": {"path": ["layerDiffuse"], "kind": "scalar", "omit_value": false}, "pulid": {"path": ["pulid"], "kind": "feature"}, "trueCFGScale": {"path": ["trueCFGScale"], "kind": "gate", "value_key": "trueCFGScale_value"}, "trueCFGScale_value": {"path": ["trueCFGScale"], "kind": "skip"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "model": {"path": ["model"], "kind": "scalar"}}}, {"key": "RunwareArch_flux_1_kontext_dev", "name": "FLUX.1 Kontext [dev] (custom model)", "architecture": "flux-1-kontext-dev", "default_model": "runware:106@1", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"model": ["STRING", {"default": "runware:106@1", "rw_model_picker": "flux-1-kontext-dev", "rw_cat": "core", "tooltip": "AIR of any checkpoint of this architecture. Use the search button to browse the catalog."}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}]}, "optional": {"referenceImages": ["IMAGE"], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "fbCache", "fbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "width": ["INT", {"tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "trueCFGScale": ["BOOLEAN", {"default": false, "rw_gates": "trueCFGScale_value", "tooltip": "Enable to set trueCFGScale. Off uses the model's default.", "rw_cat": "core"}], "trueCFGScale_value": ["FLOAT", {"tooltip": "True Classifier-Free Guidance scale. Higher values increase prompt adherence at the cost of quality.", "default": 0.0, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"referenceImages": {"path": ["inputs", "referenceImages"], "kind": "image_array"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "trueCFGScale": {"path": ["trueCFGScale"], "kind": "gate", "value_key": "trueCFGScale_value"}, "trueCFGScale_value": {"path": ["trueCFGScale"], "kind": "skip"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "model": {"path": ["model"], "kind": "scalar"}}}, {"key": "RunwareArch_flux_1_schnell", "name": "FLUX.1 [schnell] (custom model)", "architecture": "flux-1-schnell", "default_model": "runware:100@1", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"model": ["STRING", {"default": "runware:100@1", "rw_model_picker": "flux-1-schnell", "rw_cat": "core", "tooltip": "AIR of any checkpoint of this architecture. Use the search button to browse the catalog."}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 64, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "fbCache", "fbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "trueCFGScale": ["BOOLEAN", {"default": false, "rw_gates": "trueCFGScale_value", "tooltip": "Enable to set trueCFGScale. Off uses the model's default.", "rw_cat": "core"}], "trueCFGScale_value": ["FLOAT", {"tooltip": "True Classifier-Free Guidance scale. Higher values increase prompt adherence at the cost of quality.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "promptWeighting": [["(default)", "sdEmbeds"], {"tooltip": "Syntax used for prompt weighting.", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: hiresFix"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "promptWeighting": {"path": ["promptWeighting"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "trueCFGScale": {"path": ["trueCFGScale"], "kind": "gate", "value_key": "trueCFGScale_value"}, "trueCFGScale_value": {"path": ["trueCFGScale"], "kind": "skip"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "model": {"path": ["model"], "kind": "scalar"}}}, {"key": "RunwareArch_illustrious", "name": "Illustrious XL (custom model)", "architecture": "illustrious", "default_model": "civitai:140272@1617798", "task_type": "imageInference", "creator": "civitai", "input_types": {"required": {"model": ["STRING", {"default": "civitai:140272@1617798", "rw_model_picker": "illustrious", "rw_cat": "core", "tooltip": "AIR of any checkpoint of this architecture. Use the search button to browse the catalog."}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 8, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 8, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "controlNet": ["RUNWARE_CONTROLNET", {"rw_socket_models": ["runware:20@1", "runware:3@1"], "rw_socket_fields": ["controlMode", "endStep", "endStepPercentage", "guideImage", "model", "startStep", "startStepPercentage", "weight"], "rw_socket_enums": {"controlMode": ["balanced", "controlnet", "prompt"]}, "rw_cat": "inputs"}], "ipAdapters": ["RUNWARE_IPADAPTERS", {"rw_socket_models": ["runware:55@1", "runware:55@2", "runware:55@3", "runware:55@4"], "rw_socket_fields": ["combineMethod", "embedScaling", "guideImages", "model", "weight", "weightComposition", "weightType"], "rw_socket_enums": {"weightType": ["normal", "ease_in", "ease_out", "ease_in_out", "weak_input", "weak_output", "weak_middle", "strong_middle", "style_transfer", "composition", "strong_style_transfer", "style_and_composition", "strong_style_and_composition"], "embedScaling": ["only_v", "kv", "kv_penalty_c", "k_mean_v_penalty_c"], "combineMethod": ["concat", "add", "subtract", "average", "norm_average"]}, "rw_cat": "inputs"}], "embeddings": ["RUNWARE_EMBEDDINGS", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "refiner": ["RUNWARE_REFINER", {"rw_socket_models": ["runware:101055@128080"], "rw_cat": "inputs"}], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "deepCache", "deepCacheBranchId", "deepCacheInterval", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 30, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "clipSkip": ["BOOLEAN", {"default": false, "rw_gates": "clipSkip_value", "tooltip": "Enable to set clipSkip. Off uses the model's default.", "rw_cat": "core"}], "clipSkip_value": ["INT", {"min": 0, "max": 4, "tooltip": "Number of layers to skip in the CLIP model.", "default": 0, "rw_cat": "core"}], "vae": ["STRING", {"tooltip": "VAE model identifier. Overrides the default VAE included with the base model.", "default": "", "rw_cat": "core"}], "promptWeighting": [["(default)", "compel", "sdEmbeds"], {"tooltip": "Syntax used for prompt weighting.", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: hiresFix"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "clipSkip": {"path": ["clipSkip"], "kind": "gate", "value_key": "clipSkip_value"}, "clipSkip_value": {"path": ["clipSkip"], "kind": "skip"}, "vae": {"path": ["vae"], "kind": "scalar", "omit_empty": true}, "promptWeighting": {"path": ["promptWeighting"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "controlNet": {"path": ["controlNet"], "kind": "feature"}, "ipAdapters": {"path": ["ipAdapters"], "kind": "feature"}, "refiner": {"path": ["refiner"], "kind": "feature"}, "embeddings": {"path": ["embeddings"], "kind": "feature"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "model": {"path": ["model"], "kind": "scalar"}}}, {"key": "RunwareArch_noobai", "name": "NoobAI XL (custom model)", "architecture": "noobai", "default_model": "civitai:874216@1434498", "task_type": "imageInference", "creator": "civitai", "input_types": {"required": {"model": ["STRING", {"default": "civitai:874216@1434498", "rw_model_picker": "noobai", "rw_cat": "core", "tooltip": "AIR of any checkpoint of this architecture. Use the search button to browse the catalog."}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 8, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 8, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "controlNet": ["RUNWARE_CONTROLNET", {"rw_socket_models": ["runware:20@1", "runware:3@1"], "rw_socket_fields": ["controlMode", "endStep", "endStepPercentage", "guideImage", "model", "startStep", "startStepPercentage", "weight"], "rw_socket_enums": {"controlMode": ["balanced", "controlnet", "prompt"]}, "rw_cat": "inputs"}], "ipAdapters": ["RUNWARE_IPADAPTERS", {"rw_socket_models": ["runware:55@1", "runware:55@2", "runware:55@3", "runware:55@4"], "rw_socket_fields": ["combineMethod", "embedScaling", "guideImages", "model", "weight", "weightComposition", "weightType"], "rw_socket_enums": {"weightType": ["normal", "ease_in", "ease_out", "ease_in_out", "weak_input", "weak_output", "weak_middle", "strong_middle", "style_transfer", "composition", "strong_style_transfer", "style_and_composition", "strong_style_and_composition"], "embedScaling": ["only_v", "kv", "kv_penalty_c", "k_mean_v_penalty_c"], "combineMethod": ["concat", "add", "subtract", "average", "norm_average"]}, "rw_cat": "inputs"}], "embeddings": ["RUNWARE_EMBEDDINGS", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "refiner": ["RUNWARE_REFINER", {"rw_socket_models": ["runware:101055@128080"], "rw_cat": "inputs"}], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "deepCache", "deepCacheBranchId", "deepCacheInterval", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 30, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "clipSkip": ["BOOLEAN", {"default": false, "rw_gates": "clipSkip_value", "tooltip": "Enable to set clipSkip. Off uses the model's default.", "rw_cat": "core"}], "clipSkip_value": ["INT", {"min": 0, "max": 4, "tooltip": "Number of layers to skip in the CLIP model.", "default": 0, "rw_cat": "core"}], "vae": ["STRING", {"tooltip": "VAE model identifier. Overrides the default VAE included with the base model.", "default": "", "rw_cat": "core"}], "promptWeighting": [["(default)", "compel", "sdEmbeds"], {"tooltip": "Syntax used for prompt weighting.", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: hiresFix"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "clipSkip": {"path": ["clipSkip"], "kind": "gate", "value_key": "clipSkip_value"}, "clipSkip_value": {"path": ["clipSkip"], "kind": "skip"}, "vae": {"path": ["vae"], "kind": "scalar", "omit_empty": true}, "promptWeighting": {"path": ["promptWeighting"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "controlNet": {"path": ["controlNet"], "kind": "feature"}, "ipAdapters": {"path": ["ipAdapters"], "kind": "feature"}, "refiner": {"path": ["refiner"], "kind": "feature"}, "embeddings": {"path": ["embeddings"], "kind": "feature"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "model": {"path": ["model"], "kind": "scalar"}}}, {"key": "RunwareArch_pony", "name": "Pony Diffusion XL (custom model)", "architecture": "pony", "default_model": "runware:257749@290640", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"model": ["STRING", {"default": "runware:257749@290640", "rw_model_picker": "pony", "rw_cat": "core", "tooltip": "AIR of any checkpoint of this architecture. Use the search button to browse the catalog."}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 8, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 8, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "controlNet": ["RUNWARE_CONTROLNET", {"rw_socket_models": ["runware:20@1", "runware:3@1"], "rw_socket_fields": ["controlMode", "endStep", "endStepPercentage", "guideImage", "model", "startStep", "startStepPercentage", "weight"], "rw_socket_enums": {"controlMode": ["balanced", "controlnet", "prompt"]}, "rw_cat": "inputs"}], "ipAdapters": ["RUNWARE_IPADAPTERS", {"rw_socket_models": ["runware:55@1", "runware:55@2", "runware:55@3", "runware:55@4"], "rw_socket_fields": ["combineMethod", "embedScaling", "guideImages", "model", "weight", "weightComposition", "weightType"], "rw_socket_enums": {"weightType": ["normal", "ease_in", "ease_out", "ease_in_out", "weak_input", "weak_output", "weak_middle", "strong_middle", "style_transfer", "composition", "strong_style_transfer", "style_and_composition", "strong_style_and_composition"], "embedScaling": ["only_v", "kv", "kv_penalty_c", "k_mean_v_penalty_c"], "combineMethod": ["concat", "add", "subtract", "average", "norm_average"]}, "rw_cat": "inputs"}], "embeddings": ["RUNWARE_EMBEDDINGS", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "refiner": ["RUNWARE_REFINER", {"rw_socket_models": ["runware:101055@128080"], "rw_cat": "inputs"}], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "deepCache", "deepCacheBranchId", "deepCacheInterval", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 30, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "clipSkip": ["BOOLEAN", {"default": false, "rw_gates": "clipSkip_value", "tooltip": "Enable to set clipSkip. Off uses the model's default.", "rw_cat": "core"}], "clipSkip_value": ["INT", {"min": 0, "max": 4, "tooltip": "Number of layers to skip in the CLIP model.", "default": 0, "rw_cat": "core"}], "vae": ["STRING", {"tooltip": "VAE model identifier. Overrides the default VAE included with the base model.", "default": "", "rw_cat": "core"}], "promptWeighting": [["(default)", "compel", "sdEmbeds"], {"tooltip": "Syntax used for prompt weighting.", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: hiresFix"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "clipSkip": {"path": ["clipSkip"], "kind": "gate", "value_key": "clipSkip_value"}, "clipSkip_value": {"path": ["clipSkip"], "kind": "skip"}, "vae": {"path": ["vae"], "kind": "scalar", "omit_empty": true}, "promptWeighting": {"path": ["promptWeighting"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "controlNet": {"path": ["controlNet"], "kind": "feature"}, "ipAdapters": {"path": ["ipAdapters"], "kind": "feature"}, "refiner": {"path": ["refiner"], "kind": "feature"}, "embeddings": {"path": ["embeddings"], "kind": "feature"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "model": {"path": ["model"], "kind": "scalar"}}}, {"key": "RunwareArch_sd_1_5", "name": "Stable Diffusion 1.5 (custom model)", "architecture": "sd-1-5", "default_model": "civitai:4384@128713", "task_type": "imageInference", "creator": "civitai", "input_types": {"required": {"model": ["STRING", {"default": "civitai:4384@128713", "rw_model_picker": "sd-1-5", "rw_cat": "core", "tooltip": "AIR of any checkpoint of this architecture. Use the search button to browse the catalog."}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 1024, "step": 8, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 1024, "step": 8, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "controlNet": ["RUNWARE_CONTROLNET", {"rw_socket_models": ["runware:11@1", "runware:12@1", "runware:13@1", "runware:142@0", "runware:17@1", "runware:6@1", "runware:6@2"], "rw_socket_fields": ["controlMode", "endStep", "endStepPercentage", "guideImage", "model", "startStep", "startStepPercentage", "weight"], "rw_socket_enums": {"controlMode": ["balanced", "controlnet", "prompt"]}, "rw_cat": "inputs"}], "ipAdapters": ["RUNWARE_IPADAPTERS", {"rw_socket_models": ["runware:55@10", "runware:55@5", "runware:55@6", "runware:55@7", "runware:55@8", "runware:55@9"], "rw_socket_fields": ["combineMethod", "embedScaling", "guideImages", "model", "weight", "weightComposition", "weightType"], "rw_socket_enums": {"weightType": ["normal", "ease_in", "ease_out", "ease_in_out", "weak_input", "weak_output", "weak_middle", "strong_middle", "style_transfer", "composition", "strong_style_transfer", "style_and_composition", "strong_style_and_composition"], "embedScaling": ["only_v", "kv", "kv_penalty_c", "k_mean_v_penalty_c"], "combineMethod": ["concat", "add", "subtract", "average", "norm_average"]}, "rw_cat": "inputs"}], "embeddings": ["RUNWARE_EMBEDDINGS", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "deepCache", "deepCacheBranchId", "deepCacheInterval", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 30, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "clipSkip": ["BOOLEAN", {"default": false, "rw_gates": "clipSkip_value", "tooltip": "Enable to set clipSkip. Off uses the model's default.", "rw_cat": "core"}], "clipSkip_value": ["INT", {"min": 0, "max": 4, "tooltip": "Number of layers to skip in the CLIP model.", "default": 0, "rw_cat": "core"}], "vae": ["STRING", {"tooltip": "VAE model identifier. Overrides the default VAE included with the base model.", "default": "", "rw_cat": "core"}], "promptWeighting": [["(default)", "compel", "sdEmbeds"], {"tooltip": "Syntax used for prompt weighting.", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: hiresFix"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "clipSkip": {"path": ["clipSkip"], "kind": "gate", "value_key": "clipSkip_value"}, "clipSkip_value": {"path": ["clipSkip"], "kind": "skip"}, "vae": {"path": ["vae"], "kind": "scalar", "omit_empty": true}, "promptWeighting": {"path": ["promptWeighting"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "controlNet": {"path": ["controlNet"], "kind": "feature"}, "ipAdapters": {"path": ["ipAdapters"], "kind": "feature"}, "embeddings": {"path": ["embeddings"], "kind": "feature"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "model": {"path": ["model"], "kind": "scalar"}}}, {"key": "RunwareArch_sdxl", "name": "Stable Diffusion XL (custom model)", "architecture": "sdxl", "default_model": "civitai:101055@128078", "task_type": "imageInference", "creator": "civitai", "input_types": {"required": {"model": ["STRING", {"default": "civitai:101055@128078", "rw_model_picker": "sdxl", "rw_cat": "core", "tooltip": "AIR of any checkpoint of this architecture. Use the search button to browse the catalog."}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 8, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 8, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "controlNet": ["RUNWARE_CONTROLNET", {"rw_socket_models": ["runware:20@1", "runware:3@1"], "rw_socket_fields": ["controlMode", "endStep", "endStepPercentage", "guideImage", "model", "startStep", "startStepPercentage", "weight"], "rw_socket_enums": {"controlMode": ["balanced", "controlnet", "prompt"]}, "rw_cat": "inputs"}], "ipAdapters": ["RUNWARE_IPADAPTERS", {"rw_socket_models": ["runware:55@1", "runware:55@2", "runware:55@3", "runware:55@4"], "rw_socket_fields": ["combineMethod", "embedScaling", "guideImages", "model", "weight", "weightComposition", "weightType"], "rw_socket_enums": {"weightType": ["normal", "ease_in", "ease_out", "ease_in_out", "weak_input", "weak_output", "weak_middle", "strong_middle", "style_transfer", "composition", "strong_style_transfer", "style_and_composition", "strong_style_and_composition"], "embedScaling": ["only_v", "kv", "kv_penalty_c", "k_mean_v_penalty_c"], "combineMethod": ["concat", "add", "subtract", "average", "norm_average"]}, "rw_cat": "inputs"}], "embeddings": ["RUNWARE_EMBEDDINGS", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "refiner": ["RUNWARE_REFINER", {"rw_socket_models": ["runware:101055@128080"], "rw_cat": "inputs"}], "photoMaker": ["RUNWARE_PHOTOMAKER"], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "deepCache", "deepCacheBranchId", "deepCacheInterval", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 30, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "clipSkip": ["BOOLEAN", {"default": false, "rw_gates": "clipSkip_value", "tooltip": "Enable to set clipSkip. Off uses the model's default.", "rw_cat": "core"}], "clipSkip_value": ["INT", {"min": 0, "max": 4, "tooltip": "Number of layers to skip in the CLIP model.", "default": 0, "rw_cat": "core"}], "vae": ["STRING", {"tooltip": "VAE model identifier. Overrides the default VAE included with the base model.", "default": "", "rw_cat": "core"}], "promptWeighting": [["(default)", "compel", "sdEmbeds"], {"tooltip": "Syntax used for prompt weighting.", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: hiresFix"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "clipSkip": {"path": ["clipSkip"], "kind": "gate", "value_key": "clipSkip_value"}, "clipSkip_value": {"path": ["clipSkip"], "kind": "skip"}, "vae": {"path": ["vae"], "kind": "scalar", "omit_empty": true}, "promptWeighting": {"path": ["promptWeighting"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "controlNet": {"path": ["controlNet"], "kind": "feature"}, "ipAdapters": {"path": ["ipAdapters"], "kind": "feature"}, "refiner": {"path": ["refiner"], "kind": "feature"}, "embeddings": {"path": ["embeddings"], "kind": "feature"}, "photoMaker": {"path": ["photoMaker"], "kind": "feature"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "model": {"path": ["model"], "kind": "scalar"}}}, {"key": "RunwareArch_sdxl_lightning", "name": "Stable Diffusion XL Lightning (custom model)", "architecture": "sdxl-lightning", "default_model": "civitai:350352@391971", "task_type": "imageInference", "creator": "civitai", "input_types": {"required": {"model": ["STRING", {"default": "civitai:350352@391971", "rw_model_picker": "sdxl-lightning", "rw_cat": "core", "tooltip": "AIR of any checkpoint of this architecture. Use the search button to browse the catalog."}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 8, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 8, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "controlNet": ["RUNWARE_CONTROLNET", {"rw_socket_models": ["runware:20@1", "runware:3@1"], "rw_socket_fields": ["controlMode", "endStep", "endStepPercentage", "guideImage", "model", "startStep", "startStepPercentage", "weight"], "rw_socket_enums": {"controlMode": ["balanced", "controlnet", "prompt"]}, "rw_cat": "inputs"}], "ipAdapters": ["RUNWARE_IPADAPTERS", {"rw_socket_models": ["runware:55@1", "runware:55@2", "runware:55@3", "runware:55@4"], "rw_socket_fields": ["combineMethod", "embedScaling", "guideImages", "model", "weight", "weightComposition", "weightType"], "rw_socket_enums": {"weightType": ["normal", "ease_in", "ease_out", "ease_in_out", "weak_input", "weak_output", "weak_middle", "strong_middle", "style_transfer", "composition", "strong_style_transfer", "style_and_composition", "strong_style_and_composition"], "embedScaling": ["only_v", "kv", "kv_penalty_c", "k_mean_v_penalty_c"], "combineMethod": ["concat", "add", "subtract", "average", "norm_average"]}, "rw_cat": "inputs"}], "embeddings": ["RUNWARE_EMBEDDINGS", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "refiner": ["RUNWARE_REFINER", {"rw_socket_models": ["runware:101055@128080"], "rw_cat": "inputs"}], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "deepCache", "deepCacheBranchId", "deepCacheInterval", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 30, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "clipSkip": ["BOOLEAN", {"default": false, "rw_gates": "clipSkip_value", "tooltip": "Enable to set clipSkip. Off uses the model's default.", "rw_cat": "core"}], "clipSkip_value": ["INT", {"min": 0, "max": 4, "tooltip": "Number of layers to skip in the CLIP model.", "default": 0, "rw_cat": "core"}], "vae": ["STRING", {"tooltip": "VAE model identifier. Overrides the default VAE included with the base model.", "default": "", "rw_cat": "core"}], "promptWeighting": [["(default)", "compel", "sdEmbeds"], {"tooltip": "Syntax used for prompt weighting.", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: hiresFix"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "clipSkip": {"path": ["clipSkip"], "kind": "gate", "value_key": "clipSkip_value"}, "clipSkip_value": {"path": ["clipSkip"], "kind": "skip"}, "vae": {"path": ["vae"], "kind": "scalar", "omit_empty": true}, "promptWeighting": {"path": ["promptWeighting"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "controlNet": {"path": ["controlNet"], "kind": "feature"}, "ipAdapters": {"path": ["ipAdapters"], "kind": "feature"}, "refiner": {"path": ["refiner"], "kind": "feature"}, "embeddings": {"path": ["embeddings"], "kind": "feature"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "model": {"path": ["model"], "kind": "scalar"}}}, {"key": "RunwareArch_sdxl_turbo", "name": "Stable Diffusion XL Turbo (custom model)", "architecture": "sdxl-turbo", "default_model": "civitai:215478@242846", "task_type": "imageInference", "creator": "civitai", "input_types": {"required": {"model": ["STRING", {"default": "civitai:215478@242846", "rw_model_picker": "sdxl-turbo", "rw_cat": "core", "tooltip": "AIR of any checkpoint of this architecture. Use the search button to browse the catalog."}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 8, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 8, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "controlNet": ["RUNWARE_CONTROLNET", {"rw_socket_models": ["runware:20@1", "runware:3@1"], "rw_socket_fields": ["controlMode", "endStep", "endStepPercentage", "guideImage", "model", "startStep", "startStepPercentage", "weight"], "rw_socket_enums": {"controlMode": ["balanced", "controlnet", "prompt"]}, "rw_cat": "inputs"}], "ipAdapters": ["RUNWARE_IPADAPTERS", {"rw_socket_models": ["runware:55@1", "runware:55@2", "runware:55@3", "runware:55@4"], "rw_socket_fields": ["combineMethod", "embedScaling", "guideImages", "model", "weight", "weightComposition", "weightType"], "rw_socket_enums": {"weightType": ["normal", "ease_in", "ease_out", "ease_in_out", "weak_input", "weak_output", "weak_middle", "strong_middle", "style_transfer", "composition", "strong_style_transfer", "style_and_composition", "strong_style_and_composition"], "embedScaling": ["only_v", "kv", "kv_penalty_c", "k_mean_v_penalty_c"], "combineMethod": ["concat", "add", "subtract", "average", "norm_average"]}, "rw_cat": "inputs"}], "embeddings": ["RUNWARE_EMBEDDINGS", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "refiner": ["RUNWARE_REFINER", {"rw_socket_models": ["runware:101055@128080"], "rw_cat": "inputs"}], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "deepCache", "deepCacheBranchId", "deepCacheInterval", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 30, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "clipSkip": ["BOOLEAN", {"default": false, "rw_gates": "clipSkip_value", "tooltip": "Enable to set clipSkip. Off uses the model's default.", "rw_cat": "core"}], "clipSkip_value": ["INT", {"min": 0, "max": 4, "tooltip": "Number of layers to skip in the CLIP model.", "default": 0, "rw_cat": "core"}], "vae": ["STRING", {"tooltip": "VAE model identifier. Overrides the default VAE included with the base model.", "default": "", "rw_cat": "core"}], "promptWeighting": [["(default)", "compel", "sdEmbeds"], {"tooltip": "Syntax used for prompt weighting.", "default": "(default)", "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}], "advanced_json": ["STRING", {"default": "", "multiline": true, "rw_cat": "output", "tooltip": "Optional JSON merged into the request. For: hiresFix"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "clipSkip": {"path": ["clipSkip"], "kind": "gate", "value_key": "clipSkip_value"}, "clipSkip_value": {"path": ["clipSkip"], "kind": "skip"}, "vae": {"path": ["vae"], "kind": "scalar", "omit_empty": true}, "promptWeighting": {"path": ["promptWeighting"], "kind": "scalar", "omit_value": "(default)"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "controlNet": {"path": ["controlNet"], "kind": "feature"}, "ipAdapters": {"path": ["ipAdapters"], "kind": "feature"}, "refiner": {"path": ["refiner"], "kind": "feature"}, "embeddings": {"path": ["embeddings"], "kind": "feature"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "model": {"path": ["model"], "kind": "scalar"}}}, {"key": "RunwareArch_z_image", "name": "Z Image (custom model)", "architecture": "z-image", "default_model": "runware:z-image@0", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"model": ["STRING", {"default": "runware:z-image@0", "rw_model_picker": "z-image", "rw_cat": "core", "tooltip": "AIR of any checkpoint of this architecture. Use the search button to browse the catalog."}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 16, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 16, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "fbCache", "fbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "model": {"path": ["model"], "kind": "scalar"}}}, {"key": "RunwareArch_z_image_turbo", "name": "Z Image Turbo (custom model)", "architecture": "z-image-turbo", "default_model": "runware:z-image@turbo", "task_type": "imageInference", "creator": "runware", "input_types": {"required": {"model": ["STRING", {"default": "runware:z-image@turbo", "rw_model_picker": "z-image-turbo", "rw_cat": "core", "tooltip": "AIR of any checkpoint of this architecture. Use the search button to browse the catalog."}], "positivePrompt": ["STRING", {"tooltip": "Text prompt describing elements to include in the generated output.", "multiline": true, "rw_cat": "core"}], "width": ["INT", {"min": 128, "max": 2048, "step": 16, "tooltip": "Width of the generated media in pixels.", "default": 1024, "rw_cat": "core"}], "height": ["INT", {"min": 128, "max": 2048, "step": 16, "tooltip": "Height of the generated media in pixels.", "default": 1024, "rw_cat": "core"}]}, "optional": {"seedImage": ["IMAGE"], "maskImage": ["IMAGE"], "outpaint": ["RUNWARE_OUTPAINT", {"rw_socket_fields": ["blur", "bottom", "left", "right", "top"], "rw_cat": "inputs"}], "lora": ["RUNWARE_LORA", {"rw_socket_fields": ["model", "weight"], "rw_cat": "inputs"}], "controlNet": ["RUNWARE_CONTROLNET", {"rw_socket_models": ["runware:z-image@turbo-controlnet"], "rw_socket_fields": ["controlMode", "endStep", "endStepPercentage", "guideImage", "model", "startStep", "startStepPercentage", "weight"], "rw_socket_enums": {"controlMode": ["balanced", "controlnet", "prompt"]}, "rw_cat": "inputs"}], "ultralytics": ["RUNWARE_ULTRALYTICS"], "watermark": ["RUNWARE_WATERMARK"], "acceleratorOptions": ["RUNWARE_ACCELERATOROPTIONS", {"rw_socket_fields": ["cacheEndStep", "cacheEndStepPercentage", "cacheMaxConsecutiveSteps", "cacheStartStep", "cacheStartStepPercentage", "dbCache", "dbCacheSkipInterval", "dbCacheThreshold", "fbCache", "fbCacheThreshold", "teaCache", "teaCacheDistance"], "rw_cat": "inputs"}], "negativePrompt": ["STRING", {"tooltip": "Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale \u2264 1).", "multiline": true, "default": "", "rw_cat": "core"}], "seed": ["INT", {"min": 0, "max": 9223372036854776000, "tooltip": "Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range.", "default": 0, "control_after_generate": true, "rw_cat": "core"}], "steps": ["BOOLEAN", {"default": false, "rw_gates": "steps_value", "tooltip": "Enable to set steps. Off uses the model's default.", "rw_cat": "core"}], "steps_value": ["INT", {"min": 1, "max": 50, "tooltip": "Total number of denoising steps. Higher values generally produce more detailed results but take longer.", "default": 1, "rw_cat": "core"}], "scheduler": [["(default)", "DDIM", "DDIMScheduler", "DDPMScheduler", "DEISMultistepScheduler", "Default", "DPM++", "DPM++ 2M", "DPM++ 2M Beta", "DPM++ 2M Exponential", "DPM++ 2M Karras", "DPM++ 2M SDE", "DPM++ 2M SDE Beta", "DPM++ 2M SDE Exponential", "DPM++ 2M SDE Karras", "DPM++ 2M SDE Uniform", "DPM++ 2M Uniform", "DPM++ 3M", "DPM++ 3M Beta", "DPM++ 3M Exponential", "DPM++ 3M Karras", "DPM++ 3M SDE Uniform", "DPM++ 3M Uniform", "DPM++ Beta", "DPM++ Exponential", "DPM++ Karras", "DPM++ SDE", "DPM++ SDE Beta", "DPM++ SDE Exponential", "DPM++ SDE Karras", "DPM++ Uniform", "DPM++ Uniform Beta", "DPM++ Uniform Exponential", "DPM++ Uniform Karras", "DPMSolverMultistepInverse", "DPMSolverMultistepScheduler", "DPMSolverSinglestepScheduler", "EDMDPMSolverMultistepScheduler", "EDMEulerScheduler", "Euler", "Euler a", "Euler Beta", "Euler Exponential", "Euler Karras", "EulerAncestralDiscreteScheduler", "EulerDiscreteScheduler", "FlowMatchEulerDiscreteScheduler", "Heun", "HeunDiscreteScheduler", "Heun Karras", "IPNDMScheduler", "IPNDM Uniform", "IPNDM Uniform Beta", "IPNDM Uniform Exponential", "IPNDM Uniform Karras", "KDPM2AncestralDiscreteScheduler", "KDPM2DiscreteScheduler", "LCM", "LCMScheduler", "LMS", "LMSDiscreteScheduler", "LMS Karras", "PNDMScheduler", "TCDScheduler", "UniPC", "UniPC 2M", "UniPC 2M Karras", "UniPC 2M Uniform", "UniPC 3M", "UniPC 3M Karras", "UniPC 3M Uniform", "UniPC Karras", "UniPC Uniform", "UniPC Uniform Beta", "UniPC Uniform Exponential", "UniPC Uniform Karras"], {"tooltip": "Scheduler to use for the diffusion process.", "default": "(default)", "rw_cat": "core"}], "CFGScale": ["BOOLEAN", {"default": false, "rw_gates": "CFGScale_value", "tooltip": "Enable to set CFGScale. Off uses the model's default.", "rw_cat": "core"}], "CFGScale_value": ["FLOAT", {"min": 0, "max": 20, "step": 0.01, "tooltip": "Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt.", "default": 0.0, "rw_cat": "core"}], "strength": ["BOOLEAN", {"default": false, "rw_gates": "strength_value", "tooltip": "Enable to set strength. This setting has usage rules in this model, so it is off unless you enable it.", "rw_cat": "core"}], "strength_value": ["FLOAT", {"default": 0.8, "min": 0, "max": 1, "step": 0.01, "tooltip": "Strength of the transformation. Lower values result in more influence from the original input.", "rw_cat": "core"}], "maskMargin": ["BOOLEAN", {"default": false, "rw_gates": "maskMargin_value", "tooltip": "Enable to set maskMargin. Off uses the model's default.", "rw_cat": "core"}], "maskMargin_value": ["INT", {"min": 32, "max": 128, "tooltip": "Extra context pixels around the masked region during inpainting. The model zooms into the masked area with these additional pixels for better integration.", "default": 32, "rw_cat": "core"}], "numberResults": ["INT", {"default": 1, "min": 1, "max": 20, "tooltip": "Number of results to generate. Each result uses a different seed, producing variations of the same parameters.", "rw_cat": "core"}], "safety": ["BOOLEAN", {"default": false, "tooltip": "Enable to set safety. Off uses the model's default.", "rw_cat": "settings"}], "safety.checkContent": ["BOOLEAN", {"default": false, "tooltip": "Enable or disable content safety checking.", "rw_cat": "settings"}], "ttl": ["BOOLEAN", {"default": false, "rw_gates": "ttl_value", "tooltip": "Enable to set ttl. Off uses the model's default.", "rw_cat": "output"}], "ttl_value": ["INT", {"min": 60, "tooltip": "Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`.", "default": 60, "rw_cat": "output"}], "outputFormat": [["JPG", "PNG", "WEBP"], {"default": "JPG", "tooltip": "File format for the generated image.", "rw_cat": "output"}], "outputQuality": ["INT", {"default": 95, "min": 20, "max": 99, "tooltip": "Compression quality of the output. Higher values preserve quality but increase file size.", "rw_cat": "output"}]}}, "param_plan": {"seedImage": {"path": ["inputs", "seedImage"], "kind": "image_scalar"}, "maskImage": {"path": ["inputs", "maskImage"], "kind": "image_scalar"}, "positivePrompt": {"path": ["positivePrompt"], "kind": "scalar"}, "negativePrompt": {"path": ["negativePrompt"], "kind": "scalar", "omit_empty": true}, "width": {"path": ["width"], "kind": "scalar"}, "height": {"path": ["height"], "kind": "scalar"}, "seed": {"path": ["seed"], "kind": "scalar"}, "steps": {"path": ["steps"], "kind": "gate", "value_key": "steps_value"}, "steps_value": {"path": ["steps"], "kind": "skip"}, "scheduler": {"path": ["scheduler"], "kind": "scalar", "omit_value": "(default)"}, "CFGScale": {"path": ["CFGScale"], "kind": "gate", "value_key": "CFGScale_value"}, "CFGScale_value": {"path": ["CFGScale"], "kind": "skip"}, "strength": {"path": ["strength"], "kind": "gate", "value_key": "strength_value"}, "strength_value": {"path": ["strength"], "kind": "skip"}, "maskMargin": {"path": ["maskMargin"], "kind": "gate", "value_key": "maskMargin_value"}, "maskMargin_value": {"path": ["maskMargin"], "kind": "skip"}, "acceleratorOptions": {"path": ["acceleratorOptions"], "kind": "feature"}, "outpaint": {"path": ["outpaint"], "kind": "feature"}, "lora": {"path": ["lora"], "kind": "feature"}, "controlNet": {"path": ["controlNet"], "kind": "feature"}, "ultralytics": {"path": ["ultralytics"], "kind": "feature"}, "numberResults": {"path": ["numberResults"], "kind": "scalar"}, "ttl": {"path": ["ttl"], "kind": "gate", "value_key": "ttl_value"}, "ttl_value": {"path": ["ttl"], "kind": "skip"}, "outputFormat": {"path": ["outputFormat"], "kind": "scalar"}, "outputQuality": {"path": ["outputQuality"], "kind": "scalar"}, "safety": {"path": ["safety"], "kind": "group_gate"}, "safety.checkContent": {"path": ["safety", "checkContent"], "kind": "scalar", "omit_value": false, "gated_by": "safety"}, "watermark": {"path": ["watermark"], "kind": "feature"}, "model": {"path": ["model"], "kind": "scalar"}}}]} \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..c8c3cc4 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,28 @@ +[project] +name = "runware" +version = "2.0.0" +description = "Every Runware model as a ComfyUI node: image, video, audio, 3D, and text generation in the cloud." +license = { file = "LICENSE" } +requires-python = ">=3.11" +dependencies = [ + "runware-sdk>=1.5.0", + "pillow", +] + +[project.optional-dependencies] +test = ["pytest"] + +[project.urls] +Repository = "https://github.com/Runware/ComfyUI-Runware" +Documentation = "https://runware.ai/docs" +"Bug Tracker" = "https://github.com/Runware/ComfyUI-Runware/issues" + +[tool.comfy] +PublisherId = "runware" +DisplayName = "Runware" + +[tool.pytest.ini_options] +testpaths = ["tests"] +# importlib mode imports test files by path, so the pack-root __init__.py (which +# expects the ComfyUI runtime) is never imported during collection. +addopts = "--import-mode=importlib" diff --git a/requirements.txt b/requirements.txt index ed85cfa..f54e379 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,3 @@ -python-dotenv -brotli -zstd -librosa -imageio -websockets \ No newline at end of file +runware-sdk>=1.5.0 +pillow +soundfile diff --git a/runware_nodes.py b/runware_nodes.py new file mode 100644 index 0000000..d3fcaa2 --- /dev/null +++ b/runware_nodes.py @@ -0,0 +1,864 @@ +""" +ComfyUI runtime for Runware nodes. + +One node per curated model, generated from the schema bundle (`build_node`), +every node running through the Python SDK over REST. Node logic lives once in +the base class; generated classes are thin data. Plus a generic untyped node +for models newer than the installed pack. + +Coverage: image (IMAGE tensor in/out), video/audio/3D (saved file → path), +text (STRING). Nested params (lora, controlNet, providerSettings) ride in via an +`advanced_json` input. + +torch / numpy / PIL / folder_paths come from the ComfyUI runtime; `runware` and +`pillow` from requirements.txt. API key from RUNWARE_API_KEY. +""" + +from __future__ import annotations + +import asyncio +import concurrent.futures +import base64 +import importlib.util +import io +import json +import os +import urllib.request +import uuid +from typing import Any + + +# ComfyUI capability probes (resolved once at import). Audio/video outputs use the +# richer native types when available and degrade to a saved file path otherwise. Audio +# decodes via soundfile (libsndfile, no FFmpeg) or torchaudio, whichever is installed. +_HAS_AUDIO = any(importlib.util.find_spec(m) is not None for m in ("soundfile", "torchaudio")) +_VideoFromFile: Any = None +if importlib.util.find_spec("comfy_api") is not None: + # `comfy_api.input` is a back-compat shim that no longer re-exports VideoFromFile; the class + # lives in `comfy_api.latest` on current ComfyUI. Try both so video keeps its native VIDEO type + # across versions instead of silently degrading to a file path. + for _mod in ("comfy_api.latest", "comfy_api.input"): + try: + _VideoFromFile = importlib.import_module(_mod).VideoFromFile # type: ignore[attr-defined] + break + except Exception: # noqa: BLE001 + _VideoFromFile = None +_HAS_VIDEO = _VideoFromFile is not None + + +# ----------------------------------------------------------------------- client identity + + +def _package_version() -> str: + """Version from the shipped pyproject.toml (no tomllib import needed).""" + pyproject = os.path.join(os.path.dirname(os.path.abspath(__file__)), "pyproject.toml") + try: + with open(pyproject, encoding="utf-8") as fh: + for line in fh: + stripped = line.strip() + if stripped.startswith("version") and "=" in stripped: + return stripped.split("=", 1)[1].strip().strip("'\"") + except OSError: + pass + return "0.0.0" + + +# Passed to the SDK as its User-Agent prefix so Runware can attribute ComfyUI +# traffic: `runware-comfyui/ runware-python/ (python/…) schemas/…`. +USER_AGENT_PREFIX = f"runware-comfyui/{_package_version()}" + + +# ----------------------------------------------------------------------- async bridge + + +def run_blocking(coro: Any) -> Any: + """Drive an async coroutine from sync node code, even inside ComfyUI's loop.""" + try: + asyncio.get_running_loop() + except RuntimeError: + return asyncio.run(coro) + with concurrent.futures.ThreadPoolExecutor(max_workers=1) as pool: + return pool.submit(asyncio.run, coro).result() + + +_UI_API_KEY: str | None = None # set from the ComfyUI Settings panel via /runware/set_key + + +def resolve_api_key() -> str | None: + """RUNWARE_API_KEY env var, else the ComfyUI Settings key, else `runware auth login`.""" + key = os.environ.get("RUNWARE_API_KEY") + if key: + return key.strip() + if _UI_API_KEY: + return _UI_API_KEY + try: + with open(os.path.expanduser("~/.runware/config.yaml")) as fh: + for line in fh: + lower = line.strip().lower() + if ":" in line and any(lower.startswith(k) for k in ("api_key", "apikey", "key", "token")): + return line.split(":", 1)[1].strip().strip("'\"") + except OSError: + pass + return None + + +async def run_request(request: dict[str, Any]) -> list[dict[str, Any]]: + from runware import Runware # noqa: PLC0415 + + api_key = resolve_api_key() + if not api_key: + raise RuntimeError("No Runware API key. Set RUNWARE_API_KEY or run `runware auth login`.") + async with Runware(api_key=api_key, transport="rest", user_agent_prefix=USER_AGENT_PREFIX) as client: + return await client.run(request) + + +def _clean_error(exc: BaseException) -> str: + """A short, readable one-liner for a failed request, hiding the SDK/asyncio stack. Surfaces + the Runware error's parameter / code / HTTP status when present so the message is actionable.""" + msg = str(getattr(exc, "message", None) or exc).strip() or exc.__class__.__name__ + tail: list[str] = [] + param = getattr(exc, "parameter", None) + code = getattr(exc, "code", None) + status = getattr(exc, "status_code", None) + if param: + tail.append(f"parameter '{param}'") + if code and str(code).lower() not in msg.lower(): + tail.append(f"code {code}") + if status: + tail.append(f"HTTP {status}") + return "Runware: " + msg + (f" [{', '.join(tail)}]" if tail else "") + + +def run_request_blocking(request: dict[str, Any]) -> list[dict[str, Any]]: + """Run a request synchronously, but on failure raise a clean single-line error instead of the + deep SDK/asyncio traceback ComfyUI would otherwise dump. Set RUNWARE_DEBUG for the full stack.""" + try: + return run_blocking(run_request(request)) + except Exception as exc: # noqa: BLE001 + if os.environ.get("RUNWARE_DEBUG"): + import traceback # noqa: PLC0415 + traceback.print_exc() + raise RuntimeError(_clean_error(exc)) from None + + +# ---------------------------------------------------------------------------- imaging + + +def _imaging() -> tuple[Any, Any, Any]: + import numpy as np # noqa: PLC0415 + import torch # noqa: PLC0415 + from PIL import Image # noqa: PLC0415 + return torch, np, Image + + +def tensor_to_data_uris(image: Any) -> list[str]: + """ComfyUI IMAGE tensor [B,H,W,C] float 0-1 → list of PNG data URIs.""" + _, np, Image = _imaging() + arr = (image.clamp(0, 1).cpu().numpy() * 255.0).round().astype("uint8") + uris: list[str] = [] + for frame in arr: + buf = io.BytesIO() + Image.fromarray(frame).save(buf, format="PNG") + uris.append("data:image/png;base64," + base64.b64encode(buf.getvalue()).decode()) + return uris + + +def urls_to_image(urls: list[str]) -> Any: + torch, np, Image = _imaging() + if not urls: + return torch.zeros((1, 512, 512, 3)) + frames = [] + for url in urls: + data = urllib.request.urlopen(url).read() # noqa: S310 + pil = Image.open(io.BytesIO(data)).convert("RGB") + frames.append(np.asarray(pil).astype("float32") / 255.0) + return torch.from_numpy(np.stack(frames)) + + +def mask_to_data_uri(mask: Any) -> str: + """ComfyUI MASK [B,H,W] (or [H,W]) float 0-1 → grayscale PNG data URI.""" + _, np, Image = _imaging() + arr = mask.clamp(0, 1).cpu().numpy() + if arr.ndim == 3: + arr = arr[0] + arr = (arr * 255.0).round().astype("uint8") + buf = io.BytesIO() + Image.fromarray(arr, mode="L").save(buf, format="PNG") + return "data:image/png;base64," + base64.b64encode(buf.getvalue()).decode() + + +# ------------------------------------------------------------------------- file saving + + +def _output_dir() -> str: + try: + import folder_paths # noqa: PLC0415 (provided by ComfyUI) + return folder_paths.get_output_directory() + except Exception: # noqa: BLE001 + import tempfile # noqa: PLC0415 + return tempfile.gettempdir() + + +def _download(url: str, suffix: str) -> str: + path = os.path.join(_output_dir(), f"runware_{uuid.uuid4().hex[:8]}{suffix}") + with open(path, "wb") as fh: + fh.write(urllib.request.urlopen(url).read()) # noqa: S310 + return path + + +def _media_url(result: dict[str, Any]) -> str | None: + for key in ("videoURL", "audioURL", "imageURL", "URL", "url"): + if result.get(key): + return result[key] + outs = result.get("outputs") + if isinstance(outs, dict): + files = outs.get("files") + if isinstance(files, list) and files and isinstance(files[0], dict): + return files[0].get("url") + return None + + +def _audio_output(url: str) -> Any: + """Decode a returned audio file into a ComfyUI AUDIO dict {waveform, sample_rate}. + Prefers soundfile (libsndfile, no FFmpeg dependency) and falls back to torchaudio.""" + import torch # noqa: PLC0415 + path = _download(url, _SUFFIX.get("audioInference", ".mp3")) + try: # soundfile: self-contained libsndfile, decodes WAV/FLAC/OGG (and MP3 on libsndfile >= 1.1) + import numpy as np # noqa: PLC0415 + import soundfile as sf # noqa: PLC0415 + data, sample_rate = sf.read(path, dtype="float32", always_2d=True) # (frames, channels) + return {"waveform": torch.from_numpy(np.ascontiguousarray(data.T)).unsqueeze(0), + "sample_rate": int(sample_rate)} + except Exception: # noqa: BLE001 + pass + try: + import torchaudio # noqa: PLC0415 + waveform, sample_rate = torchaudio.load(path) + return {"waveform": waveform.unsqueeze(0), "sample_rate": int(sample_rate)} + except Exception as exc: # noqa: BLE001 + print(f"[Runware] audio decode failed ({exc}); install `soundfile`. File saved at {path}") + return {"waveform": torch.zeros(1, 2, 1), "sample_rate": 44100} + + +def _video_output(url: str) -> Any: + """Wrap a returned video file as a ComfyUI VIDEO object, or fall back to its path.""" + path = _download(url, _SUFFIX.get("videoInference", ".mp4")) + if _VideoFromFile is not None: + try: + return _VideoFromFile(path) + except Exception as exc: # noqa: BLE001 + print(f"[Runware] video wrap failed ({exc}); file saved at {path}") + return path + + +def _set_path(obj: dict[str, Any], path: list[str], value: Any) -> None: + cur = obj + for key in path[:-1]: + cur = cur.setdefault(key, {}) + cur[path[-1]] = value + + +def _total_cost(results: list[dict[str, Any]]) -> float: + """Sum the API cost across results (present when includeCost was requested).""" + try: + return sum(float(r.get("cost") or 0) for r in results if isinstance(r, dict)) + except (TypeError, ValueError): + return 0.0 + + +def _socket_fields_from_inputs(input_types: dict[str, Any]) -> dict[str, set[str]]: + """Per array-feature socket, the item fields this model accepts, read from the `rw_socket_fields` + the generator placed on the socket in INPUT_TYPES.""" + out: dict[str, set[str]] = {} + for scope in ("required", "optional"): + for name, spec in (input_types.get(scope) or {}).items(): + if isinstance(spec, (list, tuple)) and len(spec) == 2 and isinstance(spec[1], dict): + fields = spec[1].get("rw_socket_fields") + if fields: + out[name] = set(fields) + return out + + +def _strip_unsupported_fields(request: dict[str, Any], socket_fields: dict[str, set[str]]) -> None: + """Drop fields a model does not declare from its feature values. A shared builder is the union + of every model's fields, so it can produce more than a given model accepts: array features + (ControlNet/IP-Adapter/LoRA) strip per item, single-object features (Speech) strip the object.""" + for slot, allowed in socket_fields.items(): + value = request.get(slot) + if isinstance(value, list): + request[slot] = [ + {k: v for k, v in item.items() if k in allowed} if isinstance(item, dict) else item + for item in value + ] + elif isinstance(value, dict): + request[slot] = {k: v for k, v in value.items() if k in allowed} + + +def _run_info(results: list[dict[str, Any]]) -> str: + """A short on-node summary of a run: total cost and whether the safety check flagged + anything. Each field appears only when the response carried it (cost needs includeCost; + NSFWContent is present only when the model ran a content check).""" + parts: list[str] = [] + cost = _total_cost(results) + if cost: + parts.append("$" + f"{cost:.6f}".rstrip("0").rstrip(".")) + flags = [r.get("NSFWContent") for r in results if isinstance(r, dict) and "NSFWContent" in r] + if flags: + parts.append("NSFW: " + ("yes" if any(flags) else "no")) + return " · ".join(parts) # middot separates cost from the NSFW flag + + +_SIZE_TRIAD = ("width", "height", "resolution") + + +def _apply_param_plan(target: dict[str, Any], kwargs: dict[str, Any], plan: dict[str, dict[str, Any]]) -> None: + """Map widget inputs onto a request/item dict per the generated param plan.""" + size_choices: list[tuple[Any, dict[str, Any]]] = [] + for name, value in kwargs.items(): + if value is None: + continue + p = plan.get(name, {"path": [name], "kind": "scalar"}) + path, kind = p["path"], p["kind"] + if p.get("gated_by") and not kwargs.get(p["gated_by"]): + continue # its group gate (e.g. `safety`) is off → leave the field to the model + if kind in ("skip", "group_gate"): # a gate's value widget, or a group toggle: never sent + continue + if kind == "size_choice": # applied last: authoritative over the size triad + size_choices.append((value, p)) + continue + if kind == "scalar": + if p.get("omit_empty") and isinstance(value, str) and not value.strip(): + continue # empty optional string → let the model default + if "omit_value" in p and value == p["omit_value"]: + continue # the "(default)" sentinel → omit + _set_path(target, path, value) + elif kind == "gate": # a reveal toggle: send the paired value only when on + if value: + paired = kwargs.get(p["value_key"]) + if paired is not None: + _set_path(target, path, paired) + elif kind == "bool_tri": # (default) / enabled / disabled + if value == "enabled": + _set_path(target, path, True) + elif value == "disabled": + _set_path(target, path, False) + elif kind == "feature": # a builder's typed output (a list or object), placed as-is + _set_path(target, path, value) + elif kind == "media_string": + if isinstance(value, str) and value.strip(): + _set_path(target, path, value.strip()) + elif kind == "media_array": + if isinstance(value, str) and value.strip(): + _set_path(target, path, [line.strip() for line in value.splitlines() if line.strip()]) + elif kind == "image_scalar": + _set_path(target, path, tensor_to_data_uris(value)[0]) + elif kind == "mask_scalar": + _set_path(target, path, mask_to_data_uri(value)) + elif kind == "image_array": + _set_path(target, path, tensor_to_data_uris(value)) + elif kind == "image_objects": + type_value = p.get("type") + _set_path(target, path, [ + {"image": u, **({"type": type_value} if type_value else {})} + for u in tensor_to_data_uris(value) + ]) + + # A `size` dropdown folds the mutually-exclusive resolution/width/height into one + # choice. Apply it after everything else and let it own the whole triad: a concrete + # size clears the others so we never send a conflicting pair. An empty choice ("use + # width and height") leaves the width/height widgets that were set above untouched. + for value, p in size_choices: + chosen = (p.get("options") or {}).get(value) + if not isinstance(chosen, dict): + continue + concrete = {k: v for k, v in chosen.items() if not k.startswith("__")} + if chosen.get("__none__") or concrete: # explicit "None", or a concrete size: own the triad + for k in _SIZE_TRIAD: + target.pop(k, None) + target.update(concrete) + # an empty choice ("Custom") leaves the width/height widgets set above untouched + + +# --------------------------------------------------------------------------- base node + + +# Output classification by taskType (the `inference` list spans more than the 5 +# modalities: it also carries image-producing operations and caption/vectorize). +_IMAGE_TASKS = {"imageInference", "upscale", "removeBackground", "imageMasking", "controlNetPreprocess"} +_TEXT_TASKS = {"textInference", "caption", "promptEnhance"} +_AUDIO_TASKS = {"audioInference"} +_VIDEO_TASKS = {"videoInference"} +_SUFFIX = {"videoInference": ".mp4", "audioInference": ".mp3", "3dInference": ".glb", "vectorize": ".svg"} +_LABEL = { + "imageInference": "Image", "upscale": "Image", "removeBackground": "Image", + "imageMasking": "Image", "controlNetPreprocess": "Image", + "videoInference": "Video", "audioInference": "Audio", "3dInference": "3D", + "textInference": "Text", "caption": "Text", "promptEnhance": "Text", + "vectorize": "Vector", "training": "Training", +} +_FILE_RET = (("STRING",), ("file_path",)) +_RET = { + "image": (("IMAGE",), ("image",)), + "text": (("STRING",), ("text",)), + "audio": (("AUDIO",), ("audio",)) if _HAS_AUDIO else _FILE_RET, + "video": (("VIDEO",), ("video",)) if _HAS_VIDEO else _FILE_RET, + "file": _FILE_RET, +} + + +def _output_kind(task_type: str) -> str: + if task_type in _IMAGE_TASKS: + return "image" + if task_type in _TEXT_TASKS: + return "text" + if task_type in _AUDIO_TASKS: + return "audio" + if task_type in _VIDEO_TASKS: + return "video" + return "file" + + +class _RunwareNode: + MODEL = "" + TASK_TYPE = "" + PARAM_PLAN: dict[str, dict[str, Any]] = {} + _INPUT_TYPES: dict[str, Any] = {} + _SOCKET_FIELDS: dict[str, set[str]] = {} # per array-feature socket, item fields this model accepts + + RETURN_TYPES = ("IMAGE",) + RETURN_NAMES = ("image",) + FUNCTION = "execute" + CATEGORY = "Runware" + + @classmethod + def INPUT_TYPES(cls) -> dict[str, Any]: + return cls._INPUT_TYPES + + def execute(self, **kwargs: Any) -> Any: + request: dict[str, Any] = {"model": self.MODEL, "taskType": self.TASK_TYPE, "includeCost": True} + advanced = kwargs.pop("advanced_json", "") or "" + + # Widgets, media, images, and connected feature sockets all flow through the plan. + # Params governed by a validation rule are off-by-default toggles in the node, so a + # default request never breaks a rule and nothing is dropped silently. + _apply_param_plan(request, kwargs, self.PARAM_PLAN) + + # A ControlNet/IP-Adapter builder is shared across models, so it can carry item fields + # this model does not accept (architectures expand the base object). Drop those, so a + # builder wired into a model that only has the base fields sends a request it accepts. + _strip_unsupported_fields(request, self._SOCKET_FIELDS) + + # Raw advanced JSON is the user's escape hatch and wins on conflict. + if advanced.strip(): + try: + data = json.loads(advanced) + if isinstance(data, dict): + request.update(data) + except json.JSONDecodeError: + pass + + results = run_request_blocking(request) + if os.environ.get("RUNWARE_DEBUG"): + keys = sorted({k for r in results if isinstance(r, dict) for k in r}) + nsfw = [r.get("NSFWContent") for r in results if isinstance(r, dict)] + print(f"[Runware] {self.TASK_TYPE} sent safety={request.get('safety')} | " + f"result keys={keys} | NSFWContent={nsfw}") + outputs = self._outputs(results) + info = _run_info(results) # cost + NSFW flag, shown on the node + if info: + print(f"[Runware] {self.TASK_TYPE}: {info}") + return {"ui": {"runware_info": [info]}, "result": outputs} + keys = sorted({k for r in results if isinstance(r, dict) for k in r}) + print(f"[Runware] {self.TASK_TYPE}: no cost/NSFW in response; result keys = {keys}") + return outputs + + def _outputs(self, results: list[dict[str, Any]]) -> tuple[Any]: + results = [r for r in results if isinstance(r, dict)] + kind = _output_kind(self.TASK_TYPE) + if kind == "image": + return (urls_to_image([r["imageURL"] for r in results if r.get("imageURL")]),) + if kind == "text": + return ("\n".join(r.get("text", "") for r in results if r.get("text")),) + if kind == "audio" and _HAS_AUDIO: + for r in results: + url = _media_url(r) + if url: + return (_audio_output(url),) + if kind == "video" and _HAS_VIDEO: + for r in results: + url = _media_url(r) + if url: + return (_video_output(url),) + for r in results: # 3d / vector / other, and audio/video without the native type + url = _media_url(r) + if url: + return (_download(url, _SUFFIX.get(self.TASK_TYPE, ".bin")),) + return ("",) + + async def _run(self, request: dict[str, Any]) -> list[dict[str, Any]]: # kept for symmetry + return await run_request(request) + + +# ----------------------------------------------------------------------- generic node + + +class RunwareCustom: + # Generic escape hatch: any model + taskType, any modality. It makes no assumption about what the + # model takes or returns; it sends a raw request and hands back the raw response as JSON. Feed + # media in as UUIDs/URLs in the JSON (see Runware Upload Image), and pull results out of the JSON + # with Runware Get, then wire those to a loader / Preview / Save node. + RETURN_TYPES = ("STRING",) + RETURN_NAMES = ("result_json",) + FUNCTION = "execute" + CATEGORY = "Runware/Custom" + + @classmethod + def INPUT_TYPES(cls) -> dict[str, Any]: + return { + "required": { + "model": ("STRING", {"default": "runware:100@1", "tooltip": "Model AIR"}), + "taskType": ("STRING", {"default": "imageInference"}), + }, + "optional": { + "request_json": ("STRING", {"multiline": True, "default": "{}", + "tooltip": "The full request body as JSON, merged over model/taskType. " + "Put any media inputs here as UUIDs/URLs (see Runware Upload Image)."}), + }, + } + + def execute(self, model: str, taskType: str, request_json: str = "{}") -> Any: + request: dict[str, Any] = {"model": model, "taskType": taskType, "includeCost": True} + try: + data = json.loads(request_json or "{}") + if isinstance(data, dict): + request.update(data) + except json.JSONDecodeError: + pass + + results = run_request_blocking(request) + results = [r for r in results if isinstance(r, dict)] + outputs = (json.dumps(results),) + info = _run_info(results) + return {"ui": {"runware_info": [info]}, "result": outputs} if info else outputs + + +# ----------------------------------------------------------- generated param builders + + +class _RunwareBuilder: + """Builds one feature (LoRA, ControlNet, PuLID, ...) and outputs its own typed + value: a list for stackable features (chained), an object for single ones. + Generated from the feature's schema; wired into the model node's typed socket.""" + + SLOT = "" # the feature's socket name; for arrays, also the chain input + IS_ARRAY = False + REQUIRED: list[str] = [] # fields the feature can't be built without + PARAM_PLAN: dict[str, dict[str, Any]] = {} + _INPUT_TYPES: dict[str, Any] = {} + + RETURN_TYPES = ("RUNWARE_PARAMS",) + RETURN_NAMES = ("params",) + FUNCTION = "build" + CATEGORY = "Runware/Params" + + @classmethod + def INPUT_TYPES(cls) -> dict[str, Any]: + return cls._INPUT_TYPES + + def build(self, **kwargs: Any) -> tuple[Any]: + chain = kwargs.pop(self.SLOT, None) if self.IS_ARRAY else None + advanced = kwargs.pop("advanced_json", "") or "" + item: dict[str, Any] = {} + _apply_param_plan(item, kwargs, self.PARAM_PLAN) + if advanced.strip(): + try: + data = json.loads(advanced) + if isinstance(data, dict): + item.update(data) + except json.JSONDecodeError: + pass + # An unfilled required field (unconnected image, empty model, ...) would make the + # API reject the whole request. Drop the incomplete feature instead of sending it. + complete = all(item.get(f) not in (None, "", [], {}) for f in self.REQUIRED) + if self.IS_ARRAY: + items = list(chain) if isinstance(chain, list) else [] + if complete: + items.append(item) + return (items or None,) + return (item if complete else None,) + + +# ----------------------------------------------------------------------- upload utility + + +async def run_upload(image_uri: str) -> str: + from runware import Runware # noqa: PLC0415 + + api_key = resolve_api_key() + if not api_key: + raise RuntimeError("No Runware API key. Set RUNWARE_API_KEY or run `runware auth login`.") + async with Runware(api_key=api_key, transport="rest", user_agent_prefix=USER_AGENT_PREFIX) as client: + for r in await client.image_upload({"image": image_uri}): + if isinstance(r, dict) and r.get("imageUUID"): + return str(r["imageUUID"]) + return "" + + +class RunwareUploadImage: + """Upload an image once -> reusable UUID (for media inputs or the custom node).""" + + RETURN_TYPES = ("STRING",) + RETURN_NAMES = ("image_uuid",) + FUNCTION = "execute" + CATEGORY = "Runware/Params" + + @classmethod + def INPUT_TYPES(cls) -> dict[str, Any]: + return {"required": {"image": ("IMAGE",)}} + + def execute(self, image: Any) -> tuple[str]: + return (run_blocking(run_upload(tensor_to_data_uris(image)[0])),) + + +class RunwareLoadImage: + """Download an image URL (or a Runware result URL) into an IMAGE tensor.""" + + RETURN_TYPES = ("IMAGE",) + RETURN_NAMES = ("image",) + FUNCTION = "execute" + CATEGORY = "Runware/Params" + + @classmethod + def INPUT_TYPES(cls) -> dict[str, Any]: + return {"required": {"url": ("STRING", {"default": "", "tooltip": "Image URL"})}} + + def execute(self, url: str) -> tuple[Any]: + url = (url or "").strip() + return (urls_to_image([url] if url else []),) + + +def _first_url(data: Any) -> str | None: + """First URL/data-URI string found anywhere in a decoded response (depth-first).""" + if isinstance(data, str): + return data if data.startswith(("http://", "https://", "data:")) else None + if isinstance(data, dict): + data = list(data.values()) + if isinstance(data, list): + for v in data: + found = _first_url(v) + if found: + return found + return None + + +def _json_get(data: Any, path: str) -> Any: + """Walk a dot-path into decoded JSON; numeric segments index into lists. An empty path returns + the first URL found (the common single-output case).""" + segs = [p for p in (path or "").split(".") if p] + if not segs: + return _first_url(data) + cur = data + for seg in segs: + if isinstance(cur, list): + try: + cur = cur[int(seg)] + except (ValueError, IndexError): + return None + elif isinstance(cur, dict): + cur = cur.get(seg) + else: + return None + return cur + + +class RunwareGet: + """Pull a field out of a Runware result_json by dot-path, e.g. `0.imageURL`, `0.videoURL`, or + `0.outputs.files.0.url` (the leading index picks the task in the result list; numeric segments + index lists). Leave path empty to grab the first URL found. Output is a STRING you feed to a + loader such as Runware Load Image (URL), or to a Save/Preview node.""" + + RETURN_TYPES = ("STRING",) + RETURN_NAMES = ("value",) + FUNCTION = "execute" + CATEGORY = "Runware/Params" + + @classmethod + def INPUT_TYPES(cls) -> dict[str, Any]: + return { + "required": {"result_json": ("STRING", {"forceInput": True})}, + "optional": { + "path": ("STRING", {"default": "", "tooltip": "Dot-path into the response, e.g. " + "0.imageURL or 0.outputs.files.0.url. Empty = first URL found."}), + }, + } + + def execute(self, result_json: str, path: str = "") -> tuple[str]: + try: + data = json.loads(result_json or "null") + except json.JSONDecodeError: + return ("",) + value = _json_get(data, path) + if value is None: + return ("",) + return (value if isinstance(value, str) else json.dumps(value),) + + +# ----------------------------------------------------------------------------- factory + + +_SPECS_PATH = os.path.join(os.path.dirname(__file__), "nodes.json") + + +_EXTRA_NODES = { + "RunwareCustom": (RunwareCustom, "Runware (custom)"), + "RunwareGet": (RunwareGet, "Runware Get"), + "RunwareUploadImage": (RunwareUploadImage, "Runware Upload Image"), + "RunwareLoadImage": (RunwareLoadImage, "Runware Load Image (URL)"), +} + + +def _build() -> tuple[dict[str, Any], dict[str, str]]: + classes: dict[str, Any] = {k: v[0] for k, v in _EXTRA_NODES.items()} + names: dict[str, str] = {k: v[1] for k, v in _EXTRA_NODES.items()} + + with open(_SPECS_PATH) as fh: + data = json.load(fh) + + for spec in data["models"]: + task_type = spec["task_type"] + rtypes, rnames = _RET[_output_kind(task_type)] + key = spec["key"] + classes[key] = type(key, (_RunwareNode,), { + "MODEL": spec["model"], + "TASK_TYPE": task_type, + "PARAM_PLAN": spec["param_plan"], + "_INPUT_TYPES": spec["input_types"], + "_SOCKET_FIELDS": _socket_fields_from_inputs(spec["input_types"]), + "RETURN_TYPES": rtypes, + "RETURN_NAMES": rnames, + "CATEGORY": f"Runware/{_LABEL.get(task_type, 'Other')}/{spec['creator']}", + }) + names[key] = spec["name"] + + for spec in data.get("architectures", []): + task_type = spec["task_type"] + rtypes, rnames = _RET[_output_kind(task_type)] + key = spec["key"] + classes[key] = type(key, (_RunwareNode,), { + "MODEL": spec.get("default_model", ""), # the model widget overrides this per run + "TASK_TYPE": task_type, + "PARAM_PLAN": spec["param_plan"], + "_INPUT_TYPES": spec["input_types"], + "_SOCKET_FIELDS": _socket_fields_from_inputs(spec["input_types"]), + "RETURN_TYPES": rtypes, + "RETURN_NAMES": rnames, + "CATEGORY": "Runware/Custom models", + }) + names[key] = spec["name"] + + for b in data.get("builders", []): + input_types = b["input_types"] + slot, typ = b["slot"], b["type"] + if b["is_array"]: # stackable features chain through a same-typed input + input_types.setdefault("optional", {})[slot] = (typ,) + key = b["key"] + classes[key] = type(key, (_RunwareBuilder,), { + "SLOT": slot, + "IS_ARRAY": b["is_array"], + "REQUIRED": b.get("required", []), + "PARAM_PLAN": b["param_plan"], + "_INPUT_TYPES": input_types, + "RETURN_TYPES": (typ,), + "RETURN_NAMES": (slot,), + }) + names[key] = b["name"] + + # Two different models can share a display name (e.g. Vidu Q1 ships as both a video and an image + # model). They register fine under distinct keys, but the identical label is confusing on search, + # so disambiguate a collision by the node's modality: "Vidu Q1 (Video)" / "Vidu Q1 (Image)". + by_label: dict[str, list[str]] = {} + for key, label in names.items(): + by_label.setdefault(label, []).append(key) + for label, keys in by_label.items(): + if len(keys) < 2: + continue + for key in keys: + mod = _LABEL.get(getattr(classes[key], "TASK_TYPE", "")) + if mod: + names[key] = f"{label} ({mod})" + + return classes, names + + +NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS = _build() + + +# ------------------------------------------------------------- frontend search route + + +async def search_models(params: dict[str, Any]) -> list[dict[str, str]]: + """Run a catalog model search, flattened to [{air, name}] for the picker.""" + from runware import Runware # noqa: PLC0415 + + api_key = resolve_api_key() + if not api_key: + raise RuntimeError("No Runware API key. Set RUNWARE_API_KEY or run `runware auth login`.") + async with Runware(api_key=api_key, transport="rest", user_agent_prefix=USER_AGENT_PREFIX) as client: + results = await client.model_search(params) + models: list[dict[str, str]] = [] + for r in results: + if not isinstance(r, dict): + continue + for m in r.get("results") or []: + if isinstance(m, dict): + air = m.get("air") or m.get("model") or m.get("id") + if air: + models.append({"air": str(air), "name": str(m.get("name") or air)}) + return models + + +_ROUTES_REGISTERED = False + + +def _register_routes() -> None: + """Register the /runware/model_search HTTP route (no-op outside ComfyUI).""" + global _ROUTES_REGISTERED + if _ROUTES_REGISTERED: + return + try: + from server import PromptServer # noqa: PLC0415 + from aiohttp import web # noqa: PLC0415 + except Exception: # noqa: BLE001 + return + + @PromptServer.instance.routes.post("/runware/model_search") # type: ignore[misc] + async def _model_search_route(request: Any) -> Any: + try: + body = await request.json() + except Exception: # noqa: BLE001 + body = {} + params: dict[str, Any] = {"search": str(body.get("search") or ""), "limit": int(body.get("limit") or 40)} + for key in ("category", "type", "conditioning", "architecture"): + if body.get(key): + params[key] = body[key] + try: + models = await search_models(params) + except Exception as exc: # noqa: BLE001 + return web.json_response({"error": str(exc)}, status=500) + return web.json_response({"models": models}) + + @PromptServer.instance.routes.post("/runware/set_key") # type: ignore[misc] + async def _set_key_route(request: Any) -> Any: + global _UI_API_KEY + try: + body = await request.json() + except Exception: # noqa: BLE001 + body = {} + key = str(body.get("key") or "").strip() + _UI_API_KEY = key or None + return web.json_response({"ok": True}) + + _ROUTES_REGISTERED = True + + +_register_routes() diff --git a/web/runware.js b/web/runware.js new file mode 100644 index 0000000..2a9a419 --- /dev/null +++ b/web/runware.js @@ -0,0 +1,644 @@ +import { app } from "../../scripts/app.js"; + +// ----------------------------------------------------------------- API key setting + +function pushKey(value) { + fetch("/runware/set_key", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ key: value || "" }), + }).catch(() => {}); +} + +app.registerExtension({ + name: "Runware.Settings", + settings: [ + { + id: "Runware.APIKey", + name: "Runware API key", + type: "text", + defaultValue: "", + tooltip: "Used by all Runware nodes. The RUNWARE_API_KEY environment variable takes precedence if set.", + onChange: (value) => pushKey(value), + }, + ], + async setup() { + let value = ""; + try { + value = + app.extensionManager?.setting?.get?.("Runware.APIKey") ?? + app.ui?.settings?.getSettingValue?.("Runware.APIKey", "") ?? + ""; + } catch (_e) { + value = ""; + } + if (value) pushKey(value); + }, +}); + +// ----------------------------------------------------------------- model picker + +// Builder nodes whose `model` widget gets a catalog search, with the filter that scopes +// each one. The catalog's `category` is single-valued, so a slot that spans more than one +// (LoRA lives under both `lora` and `lycoris`) lists them in `categories`. +// +// ControlNet and IP-Adapter are intentionally absent: their compatible models depend on the +// base model's architecture, which a standalone builder node can't know, so a catalog name +// search would just surface incompatible models. Those fields stay a plain editable AIR. +const PICKER = { + RunwareBuild_lora: { categories: ["lora", "lycoris"] }, + RunwareBuild_embeddings: { category: "embeddings" }, + RunwareBuild_refiner: { category: "checkpoint", type: "refiner" }, +}; + +async function searchOne(params) { + const resp = await fetch("/runware/model_search", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(params), + }); + if (!resp.ok) { + const err = await resp.json().catch(() => ({})); + throw new Error(err.error || `search failed (${resp.status})`); + } + return (await resp.json()).models || []; +} + +// One catalog search, or several when the slot spans multiple categories: the per-category +// searches run in parallel and interleave into a single deduped list so each is represented. +async function searchModels(filter, search) { + const { categories, ...rest } = filter || {}; + const base = { ...rest, search, limit: 40 }; + if (!Array.isArray(categories) || !categories.length) return searchOne(base); + + const batches = await Promise.all(categories.map((c) => searchOne({ ...base, category: c }))); + const seen = new Set(), merged = []; + for (let i = 0; batches.some((b) => i < b.length); i++) { + for (const b of batches) { + const m = b[i]; + if (m && !seen.has(m.air)) { seen.add(m.air); merged.push(m); } + } + } + return merged; +} + +let _rwPickerStyled = false; +function rwInjectPickerCSS() { + if (_rwPickerStyled) return; + _rwPickerStyled = true; + const style = document.createElement("style"); + style.textContent = ` + .rw-search { position:fixed; z-index:2147483000; display:flex; flex-direction:column; + width:340px; max-width:90vw; background:var(--comfy-menu-bg,#2b2b2b); + border:1px solid var(--border-color,#4e4e4e); border-radius:10px; + box-shadow:0 10px 30px rgba(0,0,0,.5); overflow:hidden; } + .rw-search-input { box-sizing:border-box; width:100%; height:30px; padding:0 9px; + background:var(--comfy-input-bg,#222); color:var(--input-text,#ddd); + border:none; border-bottom:1px solid var(--border-color,#4e4e4e); font-size:13px; outline:none; } + .rw-search-input::placeholder { color:#777; } + .rw-search-list { max-height:280px; overflow-y:auto; padding:4px; font-size:12px; } + .rw-search-row { display:flex; flex-direction:column; gap:1px; padding:6px 8px; + border-radius:6px; cursor:pointer; } + .rw-search-row.active { background:var(--p-primary-color,#3a6df0); } + .rw-search-row.active .rw-air { color:#dfe7ff; } + .rw-name { color:var(--input-text,#eee); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } + .rw-air { color:#8b8b8b; font-family:monospace; font-size:11px; + white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } + .rw-search-note { padding:9px 10px; color:#9a9a9a; }`; + document.head.appendChild(style); +} + +// Open a floating catalog search anchored near the click. The panel holds its OWN input, so +// the focused element lives inside it: with `data-capture-wheel` that is the one arrangement +// ComfyUI honours to let the results list scroll natively instead of zooming the canvas. +function rwOpenSearch(node, modelWidget, filter, event) { + rwInjectPickerCSS(); + if (document._rwSearchClose) document._rwSearchClose(); + + const panel = document.createElement("div"); + panel.className = "rw-search"; + panel.setAttribute("data-capture-wheel", "true"); + + const input = document.createElement("input"); + input.type = "text"; + input.className = "rw-search-input"; + input.placeholder = "Search Runware models…"; + input.autocomplete = "off"; + input.spellcheck = false; + input.value = modelWidget.value || ""; + + const list = document.createElement("div"); + list.className = "rw-search-list"; + panel.append(input, list); + document.body.appendChild(panel); + + // anchor at the click, then nudge back inside the viewport + const px = event?.clientX ?? window.innerWidth / 2; + const py = event?.clientY ?? window.innerHeight / 2; + panel.style.left = `${Math.min(px, window.innerWidth - 350)}px`; + panel.style.top = `${Math.min(py, window.innerHeight - 320)}px`; + + let items = [], active = -1, seq = 0, debounce = null; + const paint = () => [...list.children].forEach((c, i) => c.classList.toggle("active", i === active)); + const scrollActive = () => { const el = list.children[active]; if (el?.scrollIntoView) el.scrollIntoView({ block: "nearest" }); }; + + function close() { + document.removeEventListener("pointerdown", onDocPointer, true); + document.removeEventListener("keydown", onKey, true); + panel.remove(); + if (document._rwSearchClose === close) document._rwSearchClose = null; + } + document._rwSearchClose = close; + + function note(text) { + list.replaceChildren(); + const d = document.createElement("div"); + d.className = "rw-search-note"; + d.textContent = text; + list.appendChild(d); + } + function pick(m) { + modelWidget.value = m.air; + if (modelWidget.callback) modelWidget.callback(m.air); + node.setDirtyCanvas(true, true); + close(); + } + function render() { + list.replaceChildren(); + items.forEach((m, i) => { + const row = document.createElement("div"); + row.className = "rw-search-row" + (i === active ? " active" : ""); + const name = document.createElement("span"); + name.className = "rw-name"; + name.textContent = m.name; + const air = document.createElement("span"); + air.className = "rw-air"; + air.textContent = m.air; + row.append(name, air); + row.addEventListener("pointerdown", (e) => { e.preventDefault(); pick(m); }); + row.addEventListener("mouseenter", () => { active = i; paint(); }); + list.appendChild(row); + }); + } + async function query() { + const term = input.value.trim(); + const my = ++seq; + note("Searching…"); + try { + const models = await searchModels(filter, term); + if (my !== seq) return; // a newer query superseded this one + items = models; + active = models.length ? 0 : -1; + if (!models.length) return note(`No models found${term ? ` for "${term}"` : ""}.`); + render(); + } catch (err) { + if (my !== seq) return; + note(`Search error: ${err.message}`); + } + } + + const onKey = (e) => { + if (e.key === "ArrowDown") { active = Math.min(active + 1, items.length - 1); paint(); scrollActive(); e.preventDefault(); } + else if (e.key === "ArrowUp") { active = Math.max(active - 1, 0); paint(); scrollActive(); e.preventDefault(); } + else if (e.key === "Enter") { if (items[active]) { pick(items[active]); e.preventDefault(); } } + else if (e.key === "Escape") { close(); e.preventDefault(); } + }; + // close only on a click outside the panel, so clicking the list or its scrollbar keeps it open + const onDocPointer = (e) => { if (!panel.contains(e.target)) close(); }; + + input.addEventListener("input", () => { clearTimeout(debounce); debounce = setTimeout(query, 250); }); + document.addEventListener("keydown", onKey, true); + document.addEventListener("pointerdown", onDocPointer, true); + input.focus(); + query(); +} + +// Give a node's `model` widget a catalog search: the field stays editable (paste an AIR +// directly), and a button right beneath it opens the search panel scoped to this node. +function rwAttachModelSearch(node, filter) { + const modelWidget = node.widgets?.find((w) => w.name === "model"); + if (!modelWidget || node._rwSearchBtn) return; + node._rwSearchBtn = true; + + const btn = node.addWidget("button", "🔍 search catalog", null, (_v, _canvas, n, _pos, event) => { + rwOpenSearch(n || node, modelWidget, filter, event); + }); + btn.serialize = false; + + // move the button to sit immediately under the model field, not at the node's bottom + const bi = node.widgets.indexOf(btn); + if (bi !== -1) node.widgets.splice(bi, 1); + const mi = node.widgets.indexOf(modelWidget); + node.widgets.splice(mi + 1, 0, btn); +} + +app.registerExtension({ + name: "Runware.ModelPicker", + beforeRegisterNodeDef(nodeType, nodeData) { + // Architecture nodes carry their search scope on the `model` widget (the arch id), + // read from the node definition since ComfyUI drops custom widget options at runtime. + const defs = { ...(nodeData.input?.required || {}), ...(nodeData.input?.optional || {}) }; + const opts = Array.isArray(defs.model) ? defs.model[1] : null; + if (opts && opts.rw_model_picker) { + nodeType.prototype._rwPickerFilter = { category: "checkpoint", architecture: opts.rw_model_picker }; + } + }, + nodeCreated(node) { + const filter = PICKER[node.comfyClass || node.type] || node._rwPickerFilter; + if (!filter) return; + rwAttachModelSearch(node, filter); + }, +}); + +// ----------------------------------------------------------------- socket model scope + +// ControlNet/IP-Adapter models are model-specific: each base model (or architecture) pins the +// set it accepts, carried on its socket as `rw_socket_models`. Those builders are stackable, so +// only the last one touches the model node directly; the rest chain into another builder. So we +// walk a builder's output forward through the chain to the terminal model/architecture node, and +// scope the builder's `model` field to that node's list (a dropdown), or leave it a free text +// field when nothing downstream constrains it. + +// Builders whose fields (and per-field dropdowns) can vary by the wired model. Array builders +// (ControlNet/IP-Adapter add advanced params per architecture; LoRA's `transformer` is video-only) +// are stackable and get field-scoping; ControlNet/IP-Adapter also carry a scoped `model` list. The +// Speech builder is a single-object union: its fields differ per model and its `voice`/`language` +// dropdowns are model-specific, so it also carries per-field enum lists on the socket. +const RW_SOCKET_BUILDER = { + RunwareBuild_controlNet: "controlNet", RunwareBuild_ipAdapters: "ipAdapters", + RunwareBuild_lora: "lora", RunwareBuild_embeddings: "embeddings", + RunwareBuild_speech: "speech", + RunwareBuild_referenceImages: "referenceImages", RunwareBuild_referenceVideos: "referenceVideos", + RunwareBuild_referenceVoices: "referenceVoices", + RunwareBuild_acceleratorOptions: "acceleratorOptions", RunwareBuild_outpaint: "outpaint", +}; +const RW_SOCKET_SLOTS = ["controlNet", "ipAdapters", "lora", "embeddings", "speech", + "referenceImages", "referenceVideos", "referenceVoices", "acceleratorOptions", "outpaint"]; + +// Builders whose per-field dropdowns are model-specific: Speech `voice`/`language`, and reference- +// group `role`/`type` (try-on roles vs SkyReels grid/image differ per model). When wired, each +// supported field's widget becomes the host's list, a free text field when the host takes an open +// value, or is hidden by rwSync when unsupported. (Widget hiding only — IMAGE input sockets like a +// reference group's `image`/`images` are not hidden, so both can still show; the model node strips +// whichever it doesn't accept from the request.) +const RW_ENUM_SCOPED_BUILDERS = new Set([ + "RunwareBuild_speech", + "RunwareBuild_referenceImages", "RunwareBuild_referenceVideos", "RunwareBuild_referenceVoices", +]); + +function rwGraphNodes(graph) { + return (graph && (graph._nodes || graph.nodes)) || []; +} + +// Follow the builder's `slot` output through any same-kind builders to the model/architecture +// node it ultimately feeds; return that host's {models, fields} for the slot (its allowed model +// list and the item fields it accepts), or null when nothing downstream constrains it. +function rwTerminalHost(builder, slot) { + const graph = builder.graph; + if (!graph) return null; + let node = builder; + const seen = new Set(); + while (node && !seen.has(node.id)) { + seen.add(node.id); + const out = node.outputs?.find((o) => o.name === slot); + const links = out && out.links; + if (!links || !links.length) return null; + const link = graph.links?.[links[0]]; + if (!link) return null; + const target = graph.getNodeById(link.target_id); + if (!target) return null; + const models = target._rwSocketModels?.[slot]; + const fields = target._rwSocketFields?.[slot]; + const enums = target._rwSocketEnums?.[slot]; + if (Array.isArray(models) || Array.isArray(fields) || (enums && typeof enums === "object")) { + return { models: models ?? null, fields: fields ?? null, enums: enums ?? null }; + } + if (RW_SOCKET_BUILDER[target.comfyClass || target.type] === slot) { node = target; continue; } + return null; // reached a host that does not pin this slot, or a dead end + } + return null; +} + +// Swap a named widget between a scoped dropdown and a free text field, preserving the current +// value. `keepOffList` keeps a value that isn't in the new list selectable (so loading never drops +// a saved free-form AIR) — correct for a builder's `model` field. Speech's `voice`/`language` pass +// it false: a value from another model is never valid here, so the stale one is dropped instead of +// leaking into the new model's list as an extra option. +function rwSetComboWidget(node, name, values, keepOffList = true) { + const idx = node.widgets ? node.widgets.findIndex((w) => w.name === name) : -1; + if (idx < 0) return; + const old = node.widgets[idx]; + const cur = old.value == null ? "" : String(old.value); + const move = (w) => { + const at = node.widgets.indexOf(w); + if (at !== -1) node.widgets.splice(at, 1); + node.widgets.splice(idx, 1, w); + node.setDirtyCanvas(true, true); + }; + if (Array.isArray(values) && values.length) { + const vals = keepOffList && cur && !values.includes(cur) ? [cur, ...values] : values.slice(); + if (old.type === "combo" && String(old.options?.values) === String(vals)) return; // unchanged + move(node.addWidget("combo", name, vals.includes(cur) ? cur : vals[0], () => {}, { values: vals })); + } else if (old.type === "combo") { + move(node.addWidget("text", name, cur, () => {})); + } +} + +const rwSetModelWidget = (node, values) => rwSetComboWidget(node, "model", values); + +function rwRescopeSockets(graph) { + for (const node of rwGraphNodes(graph)) { + const slot = RW_SOCKET_BUILDER[node.comfyClass || node.type]; + if (!slot) continue; + try { + const host = rwTerminalHost(node, slot); + rwSetModelWidget(node, host?.models ?? null); + // the fields the wired host accepts drive widget visibility; rwSync (below) reads + // this and hides the rest, so it never fights the gate/size visibility it also owns + const hostFields = Array.isArray(host?.fields) ? new Set(host.fields) : null; + // object-feature builders (Speech): each supported field's dropdown becomes the host's + // list, or a free text field when the host supports it without one (rwSetComboWidget is a + // no-op on non-combo widgets like text/speed). Gated so array builders are untouched. + if (RW_ENUM_SCOPED_BUILDERS.has(node.comfyClass || node.type) && hostFields) { + const hostEnums = host?.enums || {}; + for (const f of hostFields) rwSetComboWidget(node, f, hostEnums[f] || null, false); + } + node._rwHostFields = hostFields; + rwSync(node); + } catch (e) { console.error("[Runware] socket scope", e); } + } +} + +app.registerExtension({ + name: "Runware.SocketModelScope", + beforeRegisterNodeDef(nodeType, nodeData) { + const name = nodeData?.name || ""; + const isBuilder = name in RW_SOCKET_BUILDER; + const isHost = name.startsWith("Runware_") || name.startsWith("RunwareArch_"); + if (!isBuilder && !isHost) return; + + // Host nodes (models + architectures) publish their allowed lists off the socket options, + // read from the definition since ComfyUI drops custom options off the live input. + if (isHost) { + const defs = { ...(nodeData.input?.required || {}), ...(nodeData.input?.optional || {}) }; + const models = {}, fields = {}, enums = {}; + for (const slot of RW_SOCKET_SLOTS) { + const opts = Array.isArray(defs[slot]) ? defs[slot][1] : null; + if (opts && Array.isArray(opts.rw_socket_models)) models[slot] = opts.rw_socket_models; + if (opts && Array.isArray(opts.rw_socket_fields)) fields[slot] = opts.rw_socket_fields; + if (opts && opts.rw_socket_enums && typeof opts.rw_socket_enums === "object") enums[slot] = opts.rw_socket_enums; + } + if (Object.keys(models).length) nodeType.prototype._rwSocketModels = models; + if (Object.keys(fields).length) nodeType.prototype._rwSocketFields = fields; + if (Object.keys(enums).length) nodeType.prototype._rwSocketEnums = enums; + } + + // Any connection anywhere in a chain can change a builder's terminal, and upstream + // builders never get their own event, so re-scope the whole graph's socket builders. + const prev = nodeType.prototype.onConnectionsChange; + nodeType.prototype.onConnectionsChange = function () { + const r = prev?.apply(this, arguments); + try { rwRescopeSockets(this.graph); } catch (e) { /* graph not ready */ } + return r; + }; + }, +}); + +// ----------------------------------------------------------------- run info badge + +// After a run, model / architecture / custom nodes report a short line (cost + whether the +// safety check flagged the result) in the execution message. Paint it along the title bar, +// so it stays visible even when the node body is filled with widgets or a preview. +app.registerExtension({ + name: "Runware.RunInfo", + beforeRegisterNodeDef(nodeType, nodeData) { + const name = nodeData?.name || ""; + if (!(name.startsWith("Runware_") || name.startsWith("RunwareArch_") || name === "RunwareCustom")) return; + + const onExecuted = nodeType.prototype.onExecuted; + nodeType.prototype.onExecuted = function (message) { + onExecuted?.apply(this, arguments); + const info = message?.runware_info?.[0]; + if (info) { + this._rwInfo = info; + this.setDirtyCanvas(true, true); + } + }; + + const onDraw = nodeType.prototype.onDrawForeground; + nodeType.prototype.onDrawForeground = function (ctx) { + onDraw?.apply(this, arguments); + if (this.flags?.collapsed || !this._rwInfo) return; + const th = LiteGraph.NODE_TITLE_HEIGHT; + ctx.save(); + ctx.font = "600 11px sans-serif"; + ctx.fillStyle = "#7ec98f"; // soft green, reads on the dark title bar + ctx.textAlign = "right"; + ctx.textBaseline = "middle"; + ctx.fillText(this._rwInfo, this.size[0] - 10, -th * 0.5); + ctx.restore(); + }; + }, +}); + +// ----------------------------------------------------------------- node layout + +// Pure UI polish over the Python plan: draw section headers between widget groups, +// and turn no-default numeric params into reveal toggles (a "set X" checkbox that +// shows its value field only when on). The request itself is built server-side from +// the widget values, so generation is correct even if any of this is skipped. + +const RW_HIDDEN = "rw_hidden"; + +// The